Files
mnote/luckysheet-crdt-master/server/src/WebSocket/luckysheet/database/shc.ts
T

83 lines
3.0 KiB
TypeScript

import { CRDTDataType, SHA } from "../../../Interface/WebSocket";
import { WorkerSheetModelType } from "../../../Sequelize/Models/WorkerSheet";
import { BorderInfoService } from "../../../Service/Border";
import { CellDataService } from "../../../Service/CellData";
import { MergeService } from "../../../Service/Merge";
import { WorkerSheetService } from "../../../Service/WorkerSheet";
import { isEmpty } from "../../../Utils";
import { logger } from "../../../Utils/Logger";
// 复制sheet - 复制了sheet 后,应该从被复制 sheet 的 index 直接复制数据即可,不需要saveParam
export async function shc(data: string, gridKey: string) {
// {"t":"shc","i":"Sheet_0NHdie3o0ba5_1734351308939","v":{"copyindex":"12f8254d-3914-4f79-9886-9f9aec173048","name":"Sheet(副本)"}}
// 至于复制的sheet该放在什么位置上,会同步触发 shr 事件,调整sheet的位置
logger.info("[CRDT DATA]:", data);
const { t, i, v } = <CRDTDataType<SHA>>JSON.parse(data);
if (t !== "shc") return logger.error("t is not shc.");
if (isEmpty(i)) return logger.error("i is empty.");
const copy_sheet_info: WorkerSheetModelType = {
worker_sheet_id: i,
name: v.name,
gridKey,
};
await WorkerSheetService.createSheet(copy_sheet_info);
// 真实实现复制 sheet 数据
await copySheetData(v.copyindex!, i);
}
/**
* 工具函数 - 复制 Sheet 时,需要同步被复制 sheet 的所有数据 borders、celldatas、charts、hidneandlens、images、merges
* @param copyIndex 被复制的 sheet index
* @param newSheetIndex 新 sheet index
*/
async function copySheetData(copyIndex: string, newSheetIndex: string) {
// ==> copyIndex 25a110fd-8e06-4318-a2d2-c42606b266ee
// ==> newSheetIndex Sheet_5330eTr735lz_1743664108612
// 处理思路:先 查询当前被复制 sheet 的所有数据,然后批量插入到新 sheet 中
// borders
const copySheetBorder = await BorderInfoService.findAllBorder(copyIndex);
if (copySheetBorder?.length) {
for (let i = 0; i < copySheetBorder.length; i++) {
const item = copySheetBorder[i].dataValues;
delete item.config_border_id;
// 批量插入到新 sheet 中
await BorderInfoService.createConfigBorder({
...item,
worker_sheet_id: newSheetIndex,
});
}
}
// celldatas
const copySheetCellData = await CellDataService.getCellData(copyIndex);
if (copySheetCellData?.length) {
for (let i = 0; i < copySheetCellData.length; i++) {
const item = copySheetCellData[i].dataValues;
delete item.cell_data_id;
// 批量插入到新 sheet 中
await CellDataService.createCellData({
...item,
worker_sheet_id: newSheetIndex,
});
}
}
// charts hidneandlens images 暂不处理 原理类似哈
// merges
const copySheetMerge = await MergeService.findAllMerge(copyIndex);
if (copySheetMerge?.length) {
for (let i = 0; i < copySheetMerge.length; i++) {
const item = copySheetMerge[i].dataValues;
delete item.config_merge_id;
// 批量插入到新 sheet 中
await MergeService.createMerge({
...item,
worker_sheet_id: newSheetIndex,
});
}
}
}