From 1910f1556469b96e6dd1c9975d5faf9a7367d71f Mon Sep 17 00:00:00 2001 From: ForeverSmiYng Date: Tue, 10 Mar 2026 11:21:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=88=90=E6=9E=9C=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sql.ts | 272 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 204 insertions(+), 68 deletions(-) diff --git a/src/sql.ts b/src/sql.ts index 9ada522..9bb3267 100644 --- a/src/sql.ts +++ b/src/sql.ts @@ -728,6 +728,7 @@ async function generateTemplate(data) { data.contracts[4].reserve = null; // data.contracts[5].addtional = null; // data.contracts[5].reserve = null; + console.log(data) try { // 获取模板 let templateExcel = 'template20260226001test010'; @@ -740,9 +741,6 @@ async function generateTemplate(data) { let fm_sheet = workbook.getWorksheet('封面'); let ml_sheet = workbook.getWorksheet('目录'); let yz01_sheet = workbook.getWorksheet('预总01表'); - let f01_sheet = workbook.getWorksheet('辅01表'); - let f02_sheet = workbook.getWorksheet('辅02表'); - let f03_sheet = workbook.getWorksheet('辅03表'); yz01_sheet.headerFooter.oddHeader = yz01_sheet.headerFooter.oddHeader.replace(/×××/g, data.name); // 更新封面 @@ -786,61 +784,26 @@ async function generateTemplate(data) { } } - // 更新辅01表的列数 - let f01Mod = (data.contracts.length) % 3; - let f01Num = (data.contracts.length - f01Mod) / 3; - switch (f01Mod) { - case 0: - f01_sheet.spliceColumns(11, 14); - break; - case 1: - f01_sheet.spliceColumns(11, 8); - break; - case 2: - f01_sheet.spliceColumns(19, 6); - break; - } - if (f01Num == 0) { - f01_sheet.spliceColumns(1, 10); - } else { - if (f01Num > 1) { - for (let i = 0; i < f01Num - 1; i++) { - insertAndCopyColumn(10 * (i + 1) + 1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], f01_sheet); - } - } - for (let i = 0; i < f01Num; i++) { - f01_sheet.mergeCells(1, i * 10 + 1, 2, i * 10 + 1); - f01_sheet.mergeCells(1, i * 10 + 2, 2, i * 10 + 2); - f01_sheet.mergeCells(1, i * 10 + 3, 2, i * 10 + 3); - f01_sheet.mergeCells(1, i * 10 + 10, 2, i * 10 + 10); - f01_sheet.mergeCells(1, i * 10 + 4, 1, i * 10 + 5); - f01_sheet.getRow(1).getCell(i * 10 + 4).value = data.contracts[i * 3].name; - f01_sheet.mergeCells(1, i * 10 + 6, 1, i * 10 + 7); - f01_sheet.getRow(1).getCell(i * 10 + 6).value = data.contracts[i * 3 + 1].name; - f01_sheet.mergeCells(1, i * 10 + 8, 1, i * 10 + 9); - f01_sheet.getRow(1).getCell(i * 10 + 8).value = data.contracts[i * 3 + 2].name; - } - } - if (f01Mod > 0) { - f01_sheet.mergeCells(1, f01Num * 10 + 1, 2, f01Num * 10 + 1); - f01_sheet.mergeCells(1, f01Num * 10 + 2, 2, f01Num * 10 + 2); - f01_sheet.mergeCells(1, f01Num * 10 + 3, 2, f01Num * 10 + 3); - f01_sheet.mergeCells(1, f01Num * 10 + 2 * f01Mod + 4, 2, f01Num * 10 + 2 * f01Mod + 4); - f01_sheet.mergeCells(1, f01Num * 10 + 4, 1, f01Num * 10 + 5); - f01_sheet.getRow(1).getCell(f01Num * 10 + 4).value = data.contracts[f01Num * 3].name; - if (f01Mod == 2) { - f01_sheet.mergeCells(1, f01Num * 10 + 6, 1, f01Num * 10 + 7); - f01_sheet.getRow(1).getCell(f01Num * 10 + 6).value = data.contracts[f01Num * 3 + 1].name; - } - } - // 按合同段更新目录及相关表 let ml_slotRow = 14; let ml_number = 1; let allServices = []; let allAddtional = {}; let allReserve = {}; + let allMajors = {}; + data.scale?.forEach(sci => { + allMajors[sci.major] = { [data.contracts.length]: sci }; + }); data.contracts.forEach((ci, index) => { + // 记录allMajors + ci.scale?.forEach(sci => { + if (allMajors[sci.major]) { + allMajors[sci.major][index] = sci; + } else { + allMajors[sci.major] = { [index]: sci }; + } + }); + ci.method1 = []; ci.method2 = []; ci.method3 = []; @@ -934,6 +897,7 @@ async function generateTemplate(data) { ml_sourceRows.push(ml_sheet.getRow(13)); sheet_5 = copyWorksheet(workbook, '预i-5表', `预${index + 1}-5表`); sheet_5.headerFooter.oddHeader = sheet_5.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-5 表/g, `预 ${index + 1}-5 表`).replace(/第i合同/g, ci.name); + sheet_5.getRow(3).getCell(3).value = '/'; sheet_5.getRow(3).getCell(4).value = '/'; sheet_5.getRow(3).getCell(5).value = '/'; sheet_5.getRow(3).getCell(6).value = numberFormatter((ci.method5.addtional?.reduce((a, b) => a + b.m5.fee, 0) || 0) + (ci.method5.reserve?.fee || 0), 2); @@ -1105,7 +1069,7 @@ async function generateTemplate(data) { }); let det1 = m1PI.map(m => m.major); let det2 = m2PI.map(m => m.major); - let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => a - b).map(m => { + let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => majorList[a].order - majorList[b].order).map(m => { let d1index = det1.indexOf(m); let d2index = det2.indexOf(m); return { @@ -1127,8 +1091,8 @@ async function generateTemplate(data) { targetRow.getCell(7).value = numberFormatter(m.mth1.proportion, 2); targetRow.getCell(8).value = numberFormatter(m.mth1.basicFee, 2); targetRow.getCell(9).value = numberFormatter(m.mth1.fee, 2); - targetRow.getCell(10).value = ''; - targetRow.getCell(11).value = ''; + targetRow.getCell(10).value = '/'; + targetRow.getCell(11).value = '/'; cusInsertRowFunc(4 + num_2_1, [sheet_2_1.getRow(4)], sheet_2_1, (targetRow) => { targetRow.getCell(1).value = num_2_1++; targetRow.getCell(2).value = serviceX.code + '-' + pi + '-' + (mindex + 1); @@ -1145,8 +1109,8 @@ async function generateTemplate(data) { targetRow.getCell(5).value = numberFormatter(m.mth2.majorCoe, 3); targetRow.getCell(6).value = numberFormatter(m.mth2.processCoe, 3); targetRow.getCell(7).value = numberFormatter(m.mth2.proportion, 2); - targetRow.getCell(8).value = ''; - targetRow.getCell(9).value = ''; + targetRow.getCell(8).value = '/'; + targetRow.getCell(9).value = '/'; targetRow.getCell(10).value = numberFormatter(m.mth2.basicFee, 2); targetRow.getCell(11).value = numberFormatter(m.mth2.fee, 2); cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { @@ -1167,7 +1131,7 @@ async function generateTemplate(data) { } else { let det1 = sobj.method1 ? sobj.method1.det.map(m => m.major) : []; let det2 = sobj.method2 ? sobj.method2.det.map(m => m.major) : []; - let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => a - b).map(m => { + let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => majorList[a].order - majorList[b].order).map(m => { let d1index = det1.indexOf(m); let d2index = det2.indexOf(m); return { @@ -1189,8 +1153,8 @@ async function generateTemplate(data) { targetRow.getCell(7).value = numberFormatter(m.mth1.proportion, 2); targetRow.getCell(8).value = numberFormatter(m.mth1.basicFee, 2); targetRow.getCell(9).value = numberFormatter(m.mth1.fee, 2); - targetRow.getCell(10).value = ''; - targetRow.getCell(11).value = ''; + targetRow.getCell(10).value = '/'; + targetRow.getCell(11).value = '/'; cusInsertRowFunc(4 + num_2_1, [sheet_2_1.getRow(4)], sheet_2_1, (targetRow) => { targetRow.getCell(1).value = num_2_1++; targetRow.getCell(2).value = serviceX.code + '-' + (mindex + 1); @@ -1207,8 +1171,8 @@ async function generateTemplate(data) { targetRow.getCell(5).value = numberFormatter(m.mth2.majorCoe, 3); targetRow.getCell(6).value = numberFormatter(m.mth2.processCoe, 3); targetRow.getCell(7).value = numberFormatter(m.mth2.proportion, 2); - targetRow.getCell(8).value = ''; - targetRow.getCell(9).value = ''; + targetRow.getCell(8).value = '/'; + targetRow.getCell(9).value = '/'; targetRow.getCell(10).value = numberFormatter(m.mth2.basicFee, 2); targetRow.getCell(11).value = numberFormatter(m.mth2.fee, 2); cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { @@ -1295,7 +1259,7 @@ async function generateTemplate(data) { cusInsertRowFunc(ci.services.length + 3 + endRows, [sheet_1.getRow(3)], sheet_1, (targetRow) => { targetRow.getCell(1).value = ci.services.length + endRows; targetRow.getCell(2).value = ''; - targetRow.getCell(3).value = '小计'; + targetRow.getCell(3).value = '基本、可选工作小计'; targetRow.getCell(4).value = numberFormatter(m1Sum, 2); targetRow.getCell(5).value = numberFormatter(m2Sum, 2); targetRow.getCell(6).value = numberFormatter(m3Sum, 2); @@ -1312,7 +1276,7 @@ async function generateTemplate(data) { targetRow.getCell(5).value = ''; targetRow.getCell(6).value = ''; targetRow.getCell(7).value = ''; - targetRow.getCell(8).value = numberFormatter(ci.addtional.fee, 2); + targetRow.getCell(8).value = ''; }); ci.addtional.det.forEach((addobj, addindex) => { endRows++; @@ -1390,6 +1354,17 @@ async function generateTemplate(data) { } }); }); + endRows++; + cusInsertRowFunc(ci.services.length + 3 + endRows, [sheet_1.getRow(3)], sheet_1, (targetRow) => { + targetRow.getCell(1).value = ci.services.length + endRows; + targetRow.getCell(2).value = ''; + targetRow.getCell(3).value = '附加工作小计'; + targetRow.getCell(4).value = ''; + targetRow.getCell(5).value = ''; + targetRow.getCell(6).value = ''; + targetRow.getCell(7).value = ''; + targetRow.getCell(8).value = numberFormatter(ci.addtional.fee, 2); + }); } if (ci.reserve) { endRows++; @@ -1520,12 +1495,12 @@ async function generateTemplate(data) { if (sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment) { sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.horizontal = 'center'; sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.wrapText = true; - if (i != 1 && i != endRows) sheet_1.getRow(ci.services.length + 3 + i).getCell(9).style.font.size = 22; + if (i != 1 && i != endRows && sheet_1.getRow(ci.services.length + 3 + i).getCell(2).value) sheet_1.getRow(ci.services.length + 3 + i).getCell(9).style.font.size = 22; } } }); - allServices.sort((a, b) => a.id - b.id); + allServices.sort((a, b) => serviceList[a.id].order - serviceList[b.id].order); allServices.forEach((s, sindex) => { const serviceX = serviceList[s.id]; cusInsertRowFunc(3 + sindex, [yz01_sheet.getRow(2)], yz01_sheet, (targetRow) => { @@ -1750,10 +1725,171 @@ async function generateTemplate(data) { workbook.removeWorksheet('预i-4表'); workbook.removeWorksheet('预i-4-1表'); workbook.removeWorksheet('预i-5表'); - f01_sheet.orderNo = ml_number + 2 + 11; - f02_sheet.orderNo = ml_number + 3 + 11; - f03_sheet.orderNo = ml_number + 4 + 11; + // 编辑辅01/02/03表内容 + // 辅01表 + if (Object.keys(allMajors).length) { + let f01_sheet = workbook.getWorksheet('辅01表'); + let f01Mod = (data.contracts.length + 1) % 3; + let f01Num = (data.contracts.length + 1 - f01Mod) / 3; + switch (f01Mod) { + case 0: + f01_sheet.spliceColumns(11, 14); + break; + case 1: + f01_sheet.spliceColumns(11, 8); + break; + case 2: + f01_sheet.spliceColumns(19, 6); + break; + } + if (f01Num == 0) { + f01_sheet.spliceColumns(1, 10); + } else { + if (f01Num > 1) { + for (let i = 0; i < f01Num - 1; i++) { + insertAndCopyColumn(10 * (i + 1) + 1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], f01_sheet); + } + } + for (let i = 0; i < f01Num; i++) { + f01_sheet.mergeCells(1, i * 10 + 1, 2, i * 10 + 1); + f01_sheet.mergeCells(1, i * 10 + 2, 2, i * 10 + 2); + f01_sheet.mergeCells(1, i * 10 + 3, 2, i * 10 + 3); + f01_sheet.mergeCells(1, i * 10 + 10, 2, i * 10 + 10); + f01_sheet.mergeCells(1, i * 10 + 4, 1, i * 10 + 5); + f01_sheet.getRow(1).getCell(i * 10 + 4).value = data.contracts[i * 3].name; + f01_sheet.mergeCells(1, i * 10 + 6, 1, i * 10 + 7); + f01_sheet.getRow(1).getCell(i * 10 + 6).value = data.contracts[i * 3 + 1].name; + f01_sheet.mergeCells(1, i * 10 + 8, 1, i * 10 + 9); + if (f01Mod == 0 && i == f01Num - 1) { + f01_sheet.getRow(1).getCell(i * 10 + 8).value = '项目小计'; + } else { + f01_sheet.getRow(1).getCell(i * 10 + 8).value = data.contracts[i * 3 + 2].name; + } + } + } + if (f01Mod > 0) { + f01_sheet.mergeCells(1, f01Num * 10 + 1, 2, f01Num * 10 + 1); + f01_sheet.mergeCells(1, f01Num * 10 + 2, 2, f01Num * 10 + 2); + f01_sheet.mergeCells(1, f01Num * 10 + 3, 2, f01Num * 10 + 3); + f01_sheet.mergeCells(1, f01Num * 10 + 2 * f01Mod + 4, 2, f01Num * 10 + 2 * f01Mod + 4); + f01_sheet.mergeCells(1, f01Num * 10 + 4, 1, f01Num * 10 + 5); + f01_sheet.getRow(1).getCell(f01Num * 10 + 4).value = f01Mod == 1 ? '项目小计' : data.contracts[f01Num * 3].name; + if (f01Mod == 2) { + f01_sheet.mergeCells(1, f01Num * 10 + 6, 1, f01Num * 10 + 7); + f01_sheet.getRow(1).getCell(f01Num * 10 + 6).value = '项目小计'; + } + } + let num_f01 = 1; + Object.keys(allMajors).sort((a, b) => majorList[a].order - majorList[b].order).forEach(majorid => { + let scaleX = allMajors[majorid]; + let code; + let name; + let hasCost; + let hasArea; + if (majorid == -1) { + code = ''; + name = '总投资'; + hasCost = true; + hasArea = false; + } else { + code = majorList[majorid].code; + name = majorList[majorid].name; + hasCost = majorList[majorid].hasCost; + hasArea = majorList[majorid].hasArea; + } + cusInsertRowFunc(3 + num_f01, [f01_sheet.getRow(3)], f01_sheet, (targetRow) => { + let rowNum = num_f01++; + for (let i = 0; i < f01Num; i++) { + targetRow.getCell(i * 10 + 1).value = rowNum; + targetRow.getCell(i * 10 + 2).value = code; + targetRow.getCell(i * 10 + 3).value = name; + if (hasCost) { + targetRow.getCell(i * 10 + 4).value = numberFormatter(scaleX[i * 3]?.cost, 2); + targetRow.getCell(i * 10 + 6).value = numberFormatter(scaleX[i * 3 + 1]?.cost, 2); + targetRow.getCell(i * 10 + 8).value = numberFormatter(scaleX[i * 3 + 2]?.cost, 2); + } else { + targetRow.getCell(i * 10 + 4).value = '/'; + targetRow.getCell(i * 10 + 6).value = '/'; + targetRow.getCell(i * 10 + 8).value = '/'; + } + if (hasArea) { + targetRow.getCell(i * 10 + 5).value = numberFormatter(scaleX[i * 3]?.area, 3); + targetRow.getCell(i * 10 + 7).value = numberFormatter(scaleX[i * 3 + 1]?.area, 3); + targetRow.getCell(i * 10 + 9).value = numberFormatter(scaleX[i * 3 + 2]?.area, 3); + } else { + targetRow.getCell(i * 10 + 5).value = '/'; + targetRow.getCell(i * 10 + 7).value = '/'; + targetRow.getCell(i * 10 + 9).value = '/'; + } + } + if (f01Mod > 0) { + targetRow.getCell(f01Num * 10 + 1).value = rowNum; + targetRow.getCell(f01Num * 10 + 2).value = code; + targetRow.getCell(f01Num * 10 + 3).value = name; + for (let i = 0; i < f01Mod; i++) { + if (hasCost) { + targetRow.getCell(f01Num * 10 + 4 + i * 2).value = numberFormatter(scaleX[f01Num * 3 + i]?.cost, 2); + } else { + targetRow.getCell(f01Num * 10 + 4 + i * 2).value = '/'; + } + if (hasArea) { + targetRow.getCell(f01Num * 10 + 5 + i * 2).value = numberFormatter(scaleX[f01Num * 3 + i]?.area, 3); + } else { + targetRow.getCell(f01Num * 10 + 5 + i * 2).value = '/'; + } + } + } + }); + }); + f01_sheet.spliceRows(3, 1); + // f01_sheet.getRow(2).height = 27; + f01_sheet.orderNo = ml_number + 2 + 11; + } else { + workbook.removeWorksheet('辅01表'); + } + + // 辅02/03表 + if (data.serviceCoes?.length) { + let f02_sheet = workbook.getWorksheet('辅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]; + cusInsertRowFunc(2 + num_f02, [f02_sheet.getRow(2)], f02_sheet, (targetRow) => { + targetRow.getCell(1).value = num_f02++; + targetRow.getCell(2).value = serviceCoeX.code; + targetRow.getCell(3).value = serviceCoeX.name; + targetRow.getCell(4).value = numberFormatter(serviceCoeX.defCoe, 3); + targetRow.getCell(5).value = numberFormatter(scoei.coe, 3); + targetRow.getCell(6).value = scoei.remark; + }); + }); + f02_sheet.spliceRows(2, 1); + f02_sheet.orderNo = ml_number + 3 + 11; + } else { + workbook.removeWorksheet('辅02表'); + } + if (data.majorCoes?.length) { + let f03_sheet = workbook.getWorksheet('辅03表'); + let num_f03 = 1; + data.majorCoes.sort((a, b) => majorList[a.majorid].order - majorList[b.majorid].order).forEach(mcoei => { + let majorCoeX = majorList[mcoei.majorid]; + cusInsertRowFunc(2 + num_f03, [f03_sheet.getRow(2)], f03_sheet, (targetRow) => { + targetRow.getCell(1).value = num_f03++; + targetRow.getCell(2).value = majorCoeX.code; + targetRow.getCell(3).value = majorCoeX.name; + targetRow.getCell(4).value = numberFormatter(majorCoeX.defCoe, 3); + targetRow.getCell(5).value = numberFormatter(mcoei.coe, 3); + targetRow.getCell(6).value = mcoei.remark; + }); + }); + f03_sheet.spliceRows(2, 1); + f03_sheet.orderNo = ml_number + 4 + 11; + } else { + workbook.removeWorksheet('辅03表'); + } + + // 统一设置页眉页脚字体 workbook._worksheets.forEach(sheet => { if (sheet) { if (sheet.headerFooter.oddHeader) sheet.headerFooter.oddHeader = sheet.headerFooter.oddHeader.replace(/&([CLR])&/g, '&$1&"宋体"&');