This commit is contained in:
wintsa 2026-03-19 17:28:56 +08:00
parent c04ed4acb1
commit 8e5cb49da5

View File

@ -39,6 +39,25 @@ const normalizeTaskTexts = (tasks: unknown): string[] => {
});
return result;
}
const normalizeServiceTaskGroups = (tasks: unknown): Array<{ serviceid?: number; process?: number; text: string[] }> => {
if (!Array.isArray(tasks)) return [];
const groups: Array<{ serviceid?: number; process?: number; text: string[] }> = [];
tasks.forEach(item => {
if (!item || typeof item !== 'object') return;
const taskItem = item as { serviceid?: unknown; process?: unknown; text?: unknown };
const text = normalizeTaskTexts(Array.isArray(taskItem.text) ? taskItem.text : [taskItem.text]);
if (!text.length) return;
const serviceid = Number(taskItem.serviceid);
const process = Number(taskItem.process);
groups.push({
serviceid: Number.isFinite(serviceid) ? serviceid : undefined,
process: Number.isFinite(process) ? process : undefined,
text
});
});
return groups;
}
export type WorkType = '基本工作' | '可选工作' | '日常顾问' | '专项顾问' | '附加工作' | '自定义'
export const TYPE_LABEL_MAP: Record<number, WorkType> = {
@ -853,9 +872,14 @@ async function generateTemplate(data) {
await workbook.xlsx.load(buf);
// 生成表格
let fm_sheet = workbook.getWorksheet('封面');
let ml_sheet = workbook.getWorksheet('目录');
let yz01_sheet = workbook.getWorksheet('预总01表');
const mustGetWorksheet = (name: string) => {
const sheet = workbook.getWorksheet(name);
if (!sheet) throw new Error(`模板缺少工作表: ${name}`);
return sheet;
};
let fm_sheet = mustGetWorksheet('封面');
let ml_sheet = mustGetWorksheet('目录');
let yz01_sheet = mustGetWorksheet('预总01表');
yz01_sheet.headerFooter.oddHeader = yz01_sheet.headerFooter.oddHeader.replace(/×××/g, data.name);
// 更新封面
@ -1882,7 +1906,7 @@ async function generateTemplate(data) {
// 编辑辅01/02/03表内容
// 辅01表
if (Object.keys(allMajors).length) {
let f01_sheet = workbook.getWorksheet('辅01表');
let f01_sheet = mustGetWorksheet('辅01表');
let f01Mod = (data.contracts.length + 1) % 3;
let f01Num = (data.contracts.length + 1 - f01Mod) / 3;
switch (f01Mod) {
@ -2004,7 +2028,7 @@ async function generateTemplate(data) {
// 辅02/03表
if (data.serviceCoes?.length) {
let f02_sheet = workbook.getWorksheet('辅02表');
let f02_sheet = mustGetWorksheet('辅02表');
let num_f02 = 1;
data.serviceCoes.sort((a, b) => serviceList[a.serviceid].order - serviceList[b.serviceid].order).forEach(scoei => {
let serviceCoeX = serviceList[scoei.serviceid];
@ -2023,7 +2047,7 @@ async function generateTemplate(data) {
workbook.removeWorksheet('辅02表');
}
if (data.majorCoes?.length) {
let f03_sheet = workbook.getWorksheet('辅03表');
let f03_sheet = mustGetWorksheet('辅03表');
let num_f03 = 1;
data.majorCoes.sort((a, b) => (a < 0 ? a : majorList[a.majorid].order) - (b < 0 ? b : majorList[b.majorid].order)).forEach(mcoei => {
let majorCoeX = majorList[mcoei.majorid];
@ -2058,7 +2082,7 @@ async function generateTemplate(data) {
const titleHeiDet = { fir: 11.25, els: 22.5 };
const textHeiDet = { fir: 6.75, els: 13.5 };
const descSheet = workbook.getWorksheet('编制说明');
const descSheet = mustGetWorksheet('编制说明');
let descRowNum = 1;
let titleArr = paragraphLineBreakFor1112(data.name, ctx, 0);
descSheet.getRow(descRowNum).getCell(1).value = titleArr[0];
@ -2403,25 +2427,42 @@ async function generateTemplate(data) {
});
}
ci.services.forEach((si, sindex) => {
let siTextArr = paragraphLineBreakFor1112(` ${ciTastNum}${si.process == null ? '' : (si.process == 1 ? '审核' : '编制')}${serviceList[si.id].name},具体工作内容包括:`, ctx);
siTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
if (si.tasks?.length) {
si.tasks.forEach((sti, stindex) => {
let stiTextArr = paragraphLineBreakFor1112(` ${stindex + 1}${sti}`, ctx);
stiTextArr.forEach(ti => {
let flag = false;
const taskGroups = normalizeServiceTaskGroups(si.tasks);
if (taskGroups.length) {
taskGroups.forEach(tsi => {
flag = true;
let sx = tsi.serviceid == null
? { id: si.id, process: si.process }
: { id: tsi.serviceid, process: tsi.process };
let tsiTextArr = paragraphLineBreakFor1112(` ${ciTastNum}${sx.process == null ? '完成' : (sx.process == 1 ? '审核' : '编制')}${serviceList[sx.id].name},具体工作内容包括:`, ctx);
tsiTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
tsi.text.forEach((sti, stindex) => {
let stiTextArr = paragraphLineBreakFor1112(` ${stindex + 1}${sti}`, ctx);
stiTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
});
});
});
});
} else {
}
if (!flag) {
let siTextArr = paragraphLineBreakFor1112(` ${ciTastNum}${si.process == null ? '完成' : (si.process == 1 ? '审核' : '编制')}${serviceList[si.id].name},具体工作内容包括:`, ctx);
siTextArr.forEach(ti => {
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ti;
ciTastNum++;
});
});
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
descRowNum3++;
targetRow.getCell(1).value = ' 1×××××。';