feat: integrate luckysheet inline and fullscreen

This commit is contained in:
liaibo
2025-11-23 17:22:35 +08:00
parent c8e479aeab
commit 994dd4e67c
529 changed files with 403413 additions and 201 deletions
@@ -0,0 +1,66 @@
import { BorderInfoModel, BorderInfoModelType } from "../Sequelize/Models/BorderInfo";
import { logger } from "../Utils/Logger";
/**
* 查找是否存在边框
* @param info
* @returns
*/
async function hasConfigBorder(info: BorderInfoModelType) {
try {
return await BorderInfoModel.findOne({
where: info,
});
} catch (error) {
logger.error(error);
}
}
/**
* 创建新的边框记录
* @param info
* @returns
*/
async function createConfigBorder(info: BorderInfoModelType) {
try {
return await BorderInfoModel.create(info);
} catch (error) {
logger.error(error);
}
}
/**
* 更新边框记录
* @param info
* @returns
*/
async function updateConfigBorder(info: BorderInfoModelType) {
try {
return await BorderInfoModel.update(info, {
where: { config_border_id: info.config_border_id },
});
} catch (error) {
logger.error(error);
}
}
/**
* 初始化查询全部 borderInfo
* @param worker_sheet_id
* @returns
*/
async function findAllBorder(worker_sheet_id: string) {
try {
// 边框属性需要根据创建记录升序排序,先创建的在第一条,返回时,才不会覆盖后面的记录
return await BorderInfoModel.findAll({ where: { worker_sheet_id }, order: [["createdAt", "ASC"]] });
} catch (error) {
logger.error(error);
}
}
export const BorderInfoService = {
findAllBorder,
hasConfigBorder,
createConfigBorder,
updateConfigBorder,
};
@@ -0,0 +1,66 @@
import { CalcChainModel, CalcChainModelType } from "../Sequelize/Models/CalcChain";
import { logger } from "../Utils/Logger";
/**
* 查找是否已经存在记录
*/
async function findOne(worker_sheet_id: string, r: number, c: number) {
try {
return await CalcChainModel.findOne({
where: { worker_sheet_id, r, c },
});
} catch (error) {
logger.error(error);
}
}
// 更新
async function update(calcchain_id: string, func: string) {
try {
return await CalcChainModel.update(
{ func },
{
where: { calcchain_id },
}
);
} catch (error) {
logger.error(error);
return null;
}
}
// ** 创建
async function create(info: CalcChainModelType) {
try {
return await CalcChainModel.create(info);
} catch (error) {
logger.error(error);
}
}
// 删除
async function deleteCalcChain(worker_sheet_id: string, r: number, c: number) {
try {
return await CalcChainModel.destroy({
where: { worker_sheet_id, r, c },
});
} catch (error) {
logger.error(error);
}
}
// 查询全部
async function findAll(worker_sheet_id: string) {
try {
return await CalcChainModel.findAll({ where: { worker_sheet_id } });
} catch (error) {
logger.error(error);
}
}
export const CalcChainService = {
findOne,
update,
create,
findAll,
deleteCalcChain,
};
@@ -0,0 +1,151 @@
import { logger } from "../Utils/Logger";
import { CellDataModel, CellDataModelType } from "../Sequelize/Models/CellData";
/**
* 通过 sheetid 查找当前数据表的单元格数据
*/
async function getCellData(worker_sheet_id: string) {
try {
return await CellDataModel.findAll({ where: { worker_sheet_id } });
} catch (error) {
logger.error(error);
return null;
}
}
/**
* 根据传入的 sheetid rc 判断是否存在记录
*/
async function hasCellData(worker_sheet_id: string, r: number, c: number) {
try {
return await CellDataModel.findOne({
where: { worker_sheet_id, r, c },
});
} catch (error) {
logger.error(error);
}
}
async function updateCellData(info: CellDataModelType) {
try {
return await CellDataModel.update(info, {
where: { cell_data_id: info.cell_data_id },
});
} catch (error) {
logger.error(error);
return null;
}
}
async function createCellData(info: CellDataModelType) {
try {
return await CellDataModel.create(info);
} catch (error) {
logger.error(error);
return null;
}
}
async function deleteCellDataRC(worker_sheet_id: string, index: number, rc: "r" | "c") {
try {
return await CellDataModel.destroy({
where: { worker_sheet_id, [rc]: index },
});
} catch (error) {
logger.error(error);
return null;
}
}
async function deleteCellData(worker_sheet_id: string, r: number, c: number) {
try {
return await CellDataModel.destroy({
where: { worker_sheet_id, r, c },
});
} catch (error) {
logger.error(error);
return null;
}
}
/**
* 删除行列
*/
async function updateCellDataRC(payload: { worker_sheet_id: string; index: number; len: number; update_type: "r" | "c" }) {
// {"t":"drc","i":"2b62e1f2-7f7f-4889-b34d-007fe7277364","v":{"index":0,"len":1},"rc":"r"}
const { worker_sheet_id, index, len, update_type } = payload;
try {
// 1. 查询所有的 celldata 的 数据
const cellData = await CellDataModel.findAll({
where: { worker_sheet_id },
});
// 2. 更新 r = r + len
if (cellData.length) {
for (let i = 0; i < cellData.length; i++) {
// 只有比 index 大的值,才进行处理
if (cellData[i][update_type] > index) {
cellData[i][update_type] = cellData[i][update_type] - len;
await cellData[i].save();
}
}
}
} catch (error) {
logger.error(error);
return null;
}
}
/**
* 增加行列
*/
async function addCellDataRC(payload: { worker_sheet_id: string; index: number; len: number; update_type: "r" | "c" }) {
const { worker_sheet_id, index, len, update_type } = payload;
// 在上面加一列跟在下面加一列的区别:就是标记的这一行是否也跟着变化
try {
// 遍历查询
const cellData = await CellDataModel.findAll({
where: { worker_sheet_id },
});
// {"t":"arc","i":"2b62e1f2...","v":{"index":8,"len":1,"direction":"lefttop","data":[]},"rc":"r"}
if (!cellData.length) return null;
// 不然执行增加操作
// 如果rc的值是r新增行, 如果rc的值为c则新增列, 例如 rc=r,index=4,len=5,则代表从第4行开始增加5行
// 然后把r大于4的单元格的整体的r值+5
for (let i = 0; i < cellData.length; i++) {
if (cellData[i][update_type] >= index) {
cellData[i][update_type] = cellData[i][update_type] + len;
await cellData[i].save();
}
}
} catch (error) {
logger.error(error);
return null;
}
}
/**
* 存储函数链操作
*/
async function createFC(worker_sheet_id: string, r: number, c: number, calcChain: string) {
try {
await CellDataModel.update({ calcChain }, { where: { worker_sheet_id, r, c } });
} catch (error) {
logger.error(error);
}
}
export const CellDataService = {
getCellData,
hasCellData,
updateCellData,
createCellData,
deleteCellData,
updateCellDataRC,
deleteCellDataRC,
addCellDataRC,
createFC,
};
@@ -0,0 +1,55 @@
import { logger } from "../Utils/Logger";
import { ChartModel, ChartModelType } from "../Sequelize/Models/Chart";
/**
* 创建图表
*/
async function createChart(data: ChartModelType) {
try {
return await ChartModel.create(data);
} catch (error) {
logger.error(error);
}
}
/**
* 更新图表
* @param data xy wh option
* @returns
*/
async function updateChart(data: ChartModelType) {
try {
return await ChartModel.update(data, {
where: { chart_id: data.chart_id },
});
} catch (error) {
logger.error(error);
}
}
// 删除图表
async function deleteChart(chart_id: string) {
try {
return await ChartModel.destroy({ where: { chart_id } });
} catch (error) {
logger.error(error);
}
}
// findAllChart
async function findAllChart(worker_sheet_id: string) {
try {
return await ChartModel.findAll({
where: { worker_sheet_id },
});
} catch (error) {
logger.error(error);
}
}
export const ChartService = {
createChart,
updateChart,
deleteChart,
findAllChart,
};
@@ -0,0 +1,70 @@
import { HiddenAndLenModelType, HiddenAndLenModel } from "../Sequelize/Models/HiddenAndLen";
import { logger } from "../Utils/Logger";
/**
* 创建隐藏记录
* HidenAndLen 表结构设定为 存储单条记录,因此,在创建之前,需要先查询是否已经存在 gridkey and config_type and config_index 的记录,
* 如果存在的话,需要先进行删除
* @param data
* @returns
*/
async function create(data: HiddenAndLenModelType) {
try {
// 查询是否存在记录
const exist = await HiddenAndLenModel.findOne({
where: {
worker_sheet_id: data.worker_sheet_id,
config_type: data.config_type,
config_index: data.config_index,
},
});
if (exist)
await HiddenAndLenModel.destroy({
where: { config_id: exist.config_id },
});
return await HiddenAndLenModel.create(data);
} catch (error) {
logger.error(error);
}
}
// 查询 worker_sheet_id 下所有隐藏记录 - 用于初始化时查询
async function findConfig(worker_sheet_id: string) {
try {
return await HiddenAndLenModel.findAll({
where: { worker_sheet_id },
});
} catch (error) {
logger.error(error);
}
}
// 删除 hidden 记录
async function deleteHidden(worker_sheet_id: string, config_type: string, config_index?: string) {
try {
return await HiddenAndLenModel.destroy({
where: Object.assign({}, { worker_sheet_id, config_type }, config_index ? { config_index } : {}),
});
} catch (error) {
logger.error(error);
}
}
// 删除列
async function deleteRC(worker_sheet_id: string, config_index: string) {
try {
return await HiddenAndLenModel.destroy({
where: { worker_sheet_id, config_index },
});
} catch (error) {
logger.error(error);
}
}
export const HiddenAndLenService = {
create,
findConfig,
deleteHidden,
deleteRC,
};
@@ -0,0 +1,36 @@
import { logger } from '../Utils/Logger';
import { ImageModel, ImageModelType } from '../Sequelize/Models/Image';
/**
* 先删除当前 sheet 的所有图片
*/
async function deleteImage(worker_sheet_id: string) {
try {
return await ImageModel.destroy({ where: { worker_sheet_id } });
} catch (error) {
logger.error(error);
}
}
/**
* 创建 image 记录
*/
async function createImage(data: ImageModelType) {
try {
return await ImageModel.create(data);
} catch (error) {
logger.error(error);
}
}
/**
* 查询当前 workersheetid 的图片
*/
async function findAllImage(worker_sheet_id: string) {
try {
return await ImageModel.findAll({ where: { worker_sheet_id } });
} catch (error) {
logger.error(error);
}
}
export const ImageService = { deleteImage, createImage, findAllImage };
@@ -0,0 +1,57 @@
/**
* 表格合并单元格处理逻辑:
* 设置一个合并单元格,需要处理两个地方,一是单元格对象中设置mc属性,二是在config中设置merge
* "r": 0, //主单元格的行号
* "c": 0, //主单元格的列号
* "rs": 2, //合并单元格占的行数
* "cs": 2 //合并单元格占的列数
*
* 业务上的处理逻辑是:先查询 merges 这个表,如果有字段值,则反馈生成 celldata mc 属性字段
*
* 如果是创建新的合并单元格,需要判断 r c 是否存在,存在则更新 rs cs,不存在则插入
*/
import { logger } from "../Utils/Logger";
import { MergeModel, MergeModelType } from "../Sequelize/Models/Merge";
async function deleteMerge(worker_sheet_id: string) {
try {
return await MergeModel.destroy({
where: {
worker_sheet_id,
},
});
} catch (error) {
logger.error(error);
return null;
}
}
// 新增记录
async function createMerge(info: MergeModelType) {
try {
return await MergeModel.create(info);
} catch (error) {
logger.error(error);
return null;
}
}
// 查询全部
async function findAllMerge(worker_sheet_id: string) {
try {
return await MergeModel.findAll({
where: { worker_sheet_id },
order: [["createdAt", "ASC"]],
});
} catch (error) {
logger.error(error);
return null;
}
}
export const MergeService = {
deleteMerge,
createMerge,
findAllMerge,
};
@@ -0,0 +1,100 @@
/**
* Worker Books Service
*/
import { logger } from "../Utils/Logger";
import {
WorkerBookModel,
WorkerBookModelType,
} from "../Sequelize/Models/WorkerBook";
import {
WorkerSheetModel,
WorkerSheetModelType,
} from "../Sequelize/Models/WorkerSheet";
import { FindOptions } from "sequelize";
/**
* 新增 workerBooks 记录
* @param info WorkerBookModelType
* @returns
*/
async function create(info: WorkerBookModelType) {
try {
// 1. 先查询用户传递的 gridKey 是否存在记录
const exist = await findOne(info.gridKey);
if (exist) return { code: 1, msg: "该 gridKey 已经存在" };
// 2. 创建一个 worker books
const book = await WorkerBookModel.create(info);
// 3. 为当前 worker book 创建一个 worker sheet 因为一个 Ecxel 文档中至少需要一个 sheet
const sheetInfo: WorkerSheetModelType = {
gridKey: info.gridKey,
name: "Sheet1",
order: 0,
status: 1,
};
const sheet = await WorkerSheetModel.create(sheetInfo);
return {
code: 0,
msg: "工作簿创建成功,已同步创建 worker sheet 记录.",
book,
sheet,
};
} catch (error) {
logger.error(error);
return null;
}
}
/**
* 更新 workerBooks 记录
*/
async function update(info: WorkerBookModelType) {
try {
return await WorkerBookModel.update(info, {
where: { gridKey: info.gridKey },
});
} catch (error) {
logger.error(error);
}
}
/**
* 删除 workerBooks 记录 - 注意:该表有外键关联,如果删除记录可能会导致其他业务表有问题,因此,提供 stage 参数,标记记录是否可用
*/
async function del() {}
/**
* 查询 workerBooks 记录
*/
async function findOne(
gridKey: string,
options?: FindOptions<WorkerBookModelType>
) {
try {
return await WorkerBookModel.findOne({ where: { gridKey }, ...options });
} catch (error) {
console.error(error);
}
}
/**
* 查询 workerBooks 记录列表
*/
async function findAll() {
try {
return await WorkerBookModel.findAll();
} catch (error) {
console.error(error);
}
}
export const WorkerBookService = {
create,
update,
delete: del,
findOne,
findAll,
};
@@ -0,0 +1,49 @@
import { logger } from "../Utils/Logger";
import {
WorkerSheetModel,
WorkerSheetModelType,
} from "../Sequelize/Models/WorkerSheet";
/**
* 更新相关配置
*/
async function update(data: WorkerSheetModelType) {
try {
return await WorkerSheetModel.update(data, {
where: { worker_sheet_id: data.worker_sheet_id },
});
} catch (error) {
logger.error(error);
}
}
/**
* 通过 gridkey 查找记录
*/
async function findAllByGridKey(gridKey: string) {
try {
return await WorkerSheetModel.findAll({
// 要查找当前没有被删除的表
where: { gridKey, deleteFlag: false },
});
} catch (error) {
logger.error(error);
}
}
/**
* 新建 sheet
*/
async function createSheet(data: WorkerSheetModelType) {
try {
return await WorkerSheetModel.create(data);
} catch (error) {
logger.error(error);
}
}
export const WorkerSheetService = {
findAllByGridKey,
update,
createSheet,
};