diff --git a/src/sql.ts b/src/sql.ts index 700c742..d7e79b9 100644 --- a/src/sql.ts +++ b/src/sql.ts @@ -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 = { @@ -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)×××××。';