From 21d3f0379c30320031a109a618f76d63b1262471 Mon Sep 17 00:00:00 2001 From: ForeverSmiYng Date: Sat, 7 Mar 2026 16:25:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AF=BC=E5=87=BA=E6=88=90?= =?UTF-8?q?=E6=9E=9C=E6=8A=A5=E8=A1=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/template20260226001test010.xlsx | Bin 0 -> 30725 bytes public/基础参数及报表导出功能.js | 1846 ++++++++++++++++++++++++ public/标准文件转代码Data.xlsx | Bin 0 -> 43654 bytes public/造价咨询服务计费报表模板.xlsx | Bin 0 -> 42648 bytes src/sql.ts | 583 ++++++-- 5 files changed, 2344 insertions(+), 85 deletions(-) create mode 100644 public/template20260226001test010.xlsx create mode 100644 public/基础参数及报表导出功能.js create mode 100644 public/标准文件转代码Data.xlsx create mode 100644 public/造价咨询服务计费报表模板.xlsx diff --git a/public/template20260226001test010.xlsx b/public/template20260226001test010.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eb34e3d998eb048a84112bb5b27c0e7a5e77fbe0 GIT binary patch literal 30725 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条', basicParam: '价格信息数量', required: TRUE, unit: '元/条', conversion: 1, maxPrice: null, minPrice: null, defPrice: 100, desc: '' }, +}; + +let expertList = { + 0: { ref: 'C9-1-1', name: '技术员及其他', maxPrice: 800, minPrice: 600, defPrice: 700, manageCoe: 2.3 }, + 1: { ref: 'C9-1-2', name: '助理工程师', maxPrice: 1000, minPrice: 800, defPrice: 900, manageCoe: 2.3 }, + 2: { ref: 'C9-1-3', name: '中级工程师或二级造价工程师', maxPrice: 1500, minPrice: 1000, defPrice: 1250, manageCoe: 2.2 }, + 3: { ref: 'C9-1-4', name: '高级工程师或一级造价工程师', maxPrice: 1800, minPrice: 1500, defPrice: 1650, manageCoe: 2.1 }, + 4: { ref: 'C9-1-5', name: '正高级工程师或资深专家', maxPrice: 2500, minPrice: 2000, defPrice: 2250, manageCoe: 2 }, + 5: { ref: 'C9-2-1', name: '二级造价工程师且具备中级工程师资格', maxPrice: 1500, minPrice: 1200, defPrice: 1350, manageCoe: 2.2 }, + 6: { ref: 'C9-3-1', name: '一级造价工程师且具备中级工程师资格', maxPrice: 1800, minPrice: 1500, defPrice: 1650, manageCoe: 2.1 }, + 7: { ref: 'C9-3-2', name: '一级造价工程师且具备高级工程师资格', maxPrice: 2000, minPrice: 1800, defPrice: 1900, manageCoe: 2.05 }, +}; + +let costScaleCal = [ + { ref: 'C1-1', staLine: 0, endLine: 100, basic: { staPrice: 0, rate: 0.01 }, optional: { staPrice: 0, rate: 0.002 } }, + { ref: 'C1-2', staLine: 100, endLine: 300, basic: { staPrice: 10000, rate: 0.008 }, optional: { staPrice: 2000, rate: 0.0016 } }, + { ref: 'C1-3', staLine: 300, endLine: 500, basic: { staPrice: 26000, rate: 0.005 }, optional: { staPrice: 5200, rate: 0.001 } }, + { ref: 'C1-4', staLine: 500, endLine: 1000, basic: { staPrice: 36000, rate: 0.004 }, optional: { staPrice: 7200, rate: 0.0008 } }, + { ref: 'C1-5', staLine: 1000, endLine: 5000, basic: { staPrice: 56000, rate: 0.003 }, optional: { staPrice: 11200, rate: 0.0006 } }, + { ref: 'C1-6', staLine: 5000, endLine: 10000, basic: { staPrice: 176000, rate: 0.002 }, optional: { staPrice: 35200, rate: 0.0004 } }, + { ref: 'C1-7', staLine: 10000, endLine: 30000, basic: { staPrice: 276000, rate: 0.0016 }, optional: { staPrice: 55200, rate: 0.00032 } }, + { ref: 'C1-8', staLine: 30000, endLine: 50000, basic: { staPrice: 596000, rate: 0.0013 }, optional: { staPrice: 119200, rate: 0.00026 } }, + { ref: 'C1-9', staLine: 50000, endLine: 100000, basic: { staPrice: 856000, rate: 0.001 }, optional: { staPrice: 171200, rate: 0.0002 } }, + { ref: 'C1-10', staLine: 100000, endLine: 150000, basic: { staPrice: 1356000, rate: 0.0009 }, optional: { staPrice: 271200, rate: 0.00018 } }, + { ref: 'C1-11', staLine: 150000, endLine: 200000, basic: { staPrice: 1806000, rate: 0.0008 }, optional: { staPrice: 361200, rate: 0.00016 } }, + { ref: 'C1-12', staLine: 200000, endLine: 300000, basic: { staPrice: 2206000, rate: 0.0007 }, optional: { staPrice: 441200, rate: 0.00014 } }, + { ref: 'C1-13', staLine: 300000, endLine: 400000, basic: { staPrice: 2906000, rate: 0.0006 }, optional: { staPrice: 581200, rate: 0.00012 } }, + { ref: 'C1-14', staLine: 400000, endLine: 600000, basic: { staPrice: 3506000, rate: 0.0005 }, optional: { staPrice: 701200, rate: 0.0001 } }, + { ref: 'C1-15', staLine: 600000, endLine: 800000, basic: { staPrice: 4506000, rate: 0.0004 }, optional: { staPrice: 901200, rate: 0.00008 } }, + { ref: 'C1-16', staLine: 800000, endLine: 1000000, basic: { staPrice: 5306000, rate: 0.0003 }, optional: { staPrice: 1061200, rate: 0.00006 } }, + { ref: 'C1-17', staLine: 1000000, endLine: null, basic: { staPrice: 5906000, rate: 0.00025 }, optional: { staPrice: 1181200, rate: 0.00005 } }, +]; + +let areaScaleCal = [ + { ref: 'C2-1', staLine: 0, endLine: 50, basic: { staPrice: 0, rate: 200 }, optional: { staPrice: 0, rate: 40 } }, + { ref: 'C2-2', staLine: 50, endLine: 100, basic: { staPrice: 10000, rate: 160 }, optional: { staPrice: 2000, rate: 32 } }, + { ref: 'C2-3', staLine: 100, endLine: 500, basic: { staPrice: 18000, rate: 120 }, optional: { staPrice: 3600, rate: 24 } }, + { ref: 'C2-4', staLine: 500, endLine: 1000, basic: { staPrice: 66000, rate: 80 }, optional: { staPrice: 13200, rate: 16 } }, + { ref: 'C2-5', staLine: 1000, endLine: 5000, basic: { staPrice: 106000, rate: 60 }, optional: { staPrice: 21200, rate: 12 } }, + { ref: 'C2-6', staLine: 5000, endLine: null, basic: { staPrice: 346000, rate: 20 }, optional: { staPrice: 69200, rate: 4 } }, +]; + +function getBasicFeeFromScale(scaleValue, scaleType) { + let sv = Number(scaleValue); + if (isNaN(sv)) return null; + if (sv <= 0) return null; + let targetRange; + let res; + switch (scaleType) { + case 'cost': + targetRange = costScaleCal.find(f => f.staLine < sv && (sv <= f.endLine || f.endLine === null)); + res = { + basic: Math.round((targetRange.basic.staPrice + (sv - targetRange.staLine) * 10000 * targetRange.basic.rate) * 100) / 100, + optional: Math.round((targetRange.optional.staPrice + (sv - targetRange.staLine) * 10000 * targetRange.optional.rate) * 100) / 100, + basicFormula: targetRange.basic.staPrice ? `${numberFormatter(targetRange.basic.staPrice, 0)}+(${numberFormatter(sv * 10000, 0)}-${numberFormatter(targetRange.staLine * 10000, 0)})×${Math.round(targetRange.basic.rate * 1000 * 100) / 100}‰` : `${numberFormatter(sv * 10000, 0)}×${Math.round(targetRange.basic.rate * 1000 * 100) / 100}‰`, + optionalFormula: targetRange.optional.staPrice ? `${numberFormatter(targetRange.optional.staPrice, 0)}+(${numberFormatter(sv * 10000, 0)}-${numberFormatter(targetRange.staLine * 10000, 0)})×${Math.round(targetRange.optional.rate * 1000 * 100) / 100}‰` : `${numberFormatter(sv * 10000, 0)}×${Math.round(targetRange.optional.rate * 1000 * 100) / 100}‰`, + }; + break; + case 'area': + targetRange = areaScaleCal.find(f => f.staLine < sv && (sv <= f.endLine || f.endLine === null)); + res = { + basic: Math.round((targetRange.basic.staPrice + (sv - targetRange.staLine) * targetRange.basic.rate) * 100) / 100, + optional: Math.round((targetRange.optional.staPrice + (sv - targetRange.staLine) * targetRange.optional.rate) * 100) / 100, + basicFormula: targetRange.basic.staPrice ? `${numberFormatter(targetRange.basic.staPrice, 0)}+(${numberFormatter(sv, 0)}-${numberFormatter(targetRange.staLine, 0)})×${targetRange.basic.rate}` : `${numberFormatter(sv, 0)}×${targetRange.basic.rate}`, + optionalFormula: targetRange.optional.staPrice ? `${numberFormatter(targetRange.optional.staPrice, 0)}+(${numberFormatter(sv, 0)}-${numberFormatter(targetRange.staLine, 0)})×${targetRange.optional.rate}` : `${numberFormatter(sv, 0)}×${targetRange.optional.rate}`, + }; + break; + } + return res; +} + +let data1 = { + name: 'test001', + writer: '张三',// 编制人 + reviewer: '李四',// 复核人 + date: '2021-09-24',// 编制日期 + industry: 0,// 0为公路工程,1为铁路工程,2为水运工程 + fee: 10000, + scaleCost: 100000,// scale的cost的合计数 + scale: [// 规模信息 + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + serviceCoes: [// 项目咨询分类系数 + { + serviceid: 0, + coe: 1.1, + remark: '',// 用户输入的说明 + }, + { + serviceid: 1, + coe: 1.2, + remark: '',// 用户输入的说明 + }, + ], + majorCoes: [// 项目工程专业系数 + { + majorid: 0, + coe: 1.1, + remark: '',// 用户输入的说明 + }, + { + majorid: 1, + coe: 1.2, + remark: '',// 用户输入的说明 + }, + ], + contracts: [// 合同段信息 + { + name: 'A合同段', + serviceFee: 100000, + addtionalFee: 0, + reserveFee: 0, + fee: 10000, + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + serviceCoes: [// 合同段咨询分类系数 + { + serviceid: 0, + coe: 1.1, + remark: '',// 用户输入的说明 + }, + { + serviceid: 1, + coe: 1.2, + remark: '',// 用户输入的说明 + }, + ], + majorCoes: [// 合同段工程专业系数 + { + majorid: 0, + coe: 1.1, + remark: '',// 用户输入的说明 + }, + { + majorid: 1, + coe: 1.2, + remark: '',// 用户输入的说明 + }, + ], + services: [ + { + id: 0, + fee: 100000, + process: 0,// 工作环节,0为编制,1为审核 + method1: { // 投资规模法 + cost: 100000, + basicFee: 200, + basicFee_basic: 200, + basicFee_optional: 0, + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + basicFormula: '856,000+(1,000,000,000-500,000,000)×1‰', + basicFee_basic: 200, + optionalFormula: '171,200+(1,000,000,000-500,000,000)×0.2‰', + basicFee_optional: 0, + serviceCoe: 1.1, + majorCoe: 1.2, + processCoe: 1,// 工作环节系数(编审系数) + proportion: 0.5,// 工作占比 + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + method2: { // 用地规模法 + area: 1200, + basicFee: 200, + basicFee_basic: 200, + basicFee_optional: 0, + fee: 250000, + det: [ + { + major: 0, + area: 1200, + basicFee: 200, + basicFormula: '106,000+(1,200-1,000)×60', + basicFee_basic: 200, + optionalFormula: '21,200+(1,200-1,000)×12', + basicFee_optional: 0, + serviceCoe: 1.1, + majorCoe: 1.2, + processCoe: 1,// 工作环节系数(编审系数) + proportion: 0.5,// 工作占比 + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + method3: { // 工作量法 + basicFee: 200, + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + method4: { // 工时法 + person_num: 10, + work_day: 10, + fee: 250000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + }, + ], + addtional: [// 附加工作费 + { + type: 0,// 0为费率计取,1为工时法,2为数量单价 + coe: 0.03, + fee: 10000, + }, + { + type: 1,// 0为费率计取,1为工时法,2为数量单价 + fee: 10000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + { + type: 2,// 0为费率计取,1为工时法,2为数量单价 + fee: 10000, + det: [ + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + } + ], + reserve: [// 预留费 + { + type: 0,// 0为费率计取,1为工时法,2为数量单价 + coe: 0.03, + fee: 10000, + }, + { + type: 1,// 0为费率计取,1为工时法,2为数量单价 + fee: 10000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + { + type: 2,// 0为费率计取,1为工时法,2为数量单价 + fee: 10000, + det: [ + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + } + ], + }, + ], +}; +let data2 = { + name: 'test001', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + contracts: [ + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + }, + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method3: { // 工作量法 + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + ], + }, + }, + ], + }, + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + }, + ], + }, + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + }, + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method3: { // 工作量法 + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + ], + }, + }, + ], + }, + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + }, + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method3: { // 工作量法 + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + ], + }, + }, + ], + }, + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + }, + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method3: { // 工作量法 + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + ], + }, + }, + ], + }, + { + name: 'A合同段', + scale: [ + { + major: 0, + cost: 100000, + area: 200, + }, + { + major: 1, + cost: 100000, + area: 200, + }, + ], + services: [ + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + }, + { + id: 0, + method1: { // 投资规模法 + fee: 250000, + det: [ + { + major: 0, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + cost: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method2: { // 用地规模法 + fee: 250000, + det: [ + { + major: 0, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + { + major: 1, + area: 100000, + basicFee: 200, + serviceCoe: 1.1, + majorCoe: 1.2, + fee: 100000, + desc: '', + }, + ], + }, + method3: { // 工作量法 + fee: 250000, + det: [ + { + task: 0, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + { + task: 1, + price: 100000, + amount: 10, + basicFee: 200, + serviceCoe: 1.1, + fee: 100000, + desc: '', + }, + ], + }, + }, + ], + }, + ], +}; + +async function exportFile(fileName, data) { + if (window.showSaveFilePicker) { + const handle = await window.showSaveFilePicker({ + suggestedName: fileName, + types: [{ + description: "Excel 文件", + accept: { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [".xlsx"] } + }] + }); + // ecCom.WeaLoadingGlobal.start({ + // tip: "下载中,结束前请勿打开文件...", + // }); + try { + const workbook = await generateTemplate(data); + const buffer = await workbook.xlsx.writeBuffer(); + const writable = await handle.createWritable(); + await writable.write(buffer); + await writable.close(); + // ecCom.WeaLoadingGlobal.destroy(); + // antd.notification['success']({ + // message: '下载成功!', + // }); + } catch (err) { + console.log('err:' + err); + // ecCom.WeaLoadingGlobal.destroy(); + // antd.notification['error']({ + // message: '下载失败!', + // }); + } + } else { + const workbook = await generateTemplate(data); + const buffer = await workbook.xlsx.writeBuffer(); + const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + const url1 = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url1; + a.download = `${fileName}.xlsx`; + a.click(); + URL.revokeObjectURL(url1); + } +} + +async function generateTemplate(data) { + // 获取模板 + let templateExcel = 'template20260226001test010'; + let templateUrl = `/myExcelTemplate/${templateExcel}.xlsx`; + let buf = await (await fetch(templateUrl)).arrayBuffer(); + let workbook = new ExcelJS.Workbook(); + await workbook.xlsx.load(buf); + + // 生成表格 + let fm_sheet = workbook.getWorksheet('封面'); + let ml_sheet = workbook.getWorksheet('目录'); + let yz01_sheet = workbook.getWorksheet('预总01表'); + let f01_sheet = workbook.getWorksheet('辅01表'); + + let now = new Date(); + let year = now.getFullYear(); + let month = now.getMonth() + 1; + let day = now.getDate(); + + fm_sheet.getRow(2).getCell(1).value = data.name; + fm_sheet.getRow(11).getCell(4).value = `${year} 年 ${month} 月 ${day} 日`; + + let yz01Mod = (data.contracts.length + 1) % 4; + let yz01Num = (data.contracts.length + 1 - yz01Mod) / 4; + switch (yz01Mod) { + case 0: + yz01_sheet.spliceColumns(8, 15); + break; + case 1: + yz01_sheet.spliceColumns(8, 11); + break; + case 2: + yz01_sheet.spliceColumns(19, 4); + yz01_sheet.spliceColumns(8, 6); + break; + case 3: + yz01_sheet.spliceColumns(14, 9); + break; + } + if (yz01Num == 0) { + yz01_sheet.spliceColumns(1, 7); + } else { + if (yz01Num > 1) { + for (let i = 0; i < yz01Num - 1; i++) { + insertAndCopyColumn(7 * (i + 1) + 1, [1, 2, 3, 4, 5, 6, 7], yz01_sheet); + } + } + } + + 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 = 13; + let ml_number = 1; + let allServices = []; + data.contracts.forEach((ci, index) => { + ci.method1 = []; + ci.method2 = []; + ci.method3 = []; + ci.method4 = []; + ci.services.forEach(si => { + if (si.method1) { + ci.method1.push(si.id); + } + if (si.method2) { + ci.method2.push(si.id); + } + if (si.method3) ci.method3.push(si.id); + if (si.method4) ci.method4.push(si.id); + }); + + let ml_sourceRows = [ml_sheet.getRow(6)]; + let sheet_1 = copyWorksheet(workbook, '预i-1表', `预${index + 1}-1表`); + sheet_1.headerFooter.oddHeader = sheet_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-1 表/g, `预 ${index + 1}-1 表`).replace(/第i合同/g, ci.name); + sheet_1.getRow(1).getCell(4).value = sheet_1.getRow(1).getCell(4).value.replace(/第i合同/g, ci.name); + let sheet_2; + let sheet_2_1; + let sheet_2_2; + let sheet_3; + let sheet_4; + let sheet_4_1; + if (ci.method1.length || ci.method2.length) { + ml_sourceRows.push(ml_sheet.getRow(7)); + sheet_2 = copyWorksheet(workbook, '预i-2表', `预${index + 1}-2表`); + sheet_2.headerFooter.oddHeader = sheet_2.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2 表/g, `预 ${index + 1}-2 表`).replace(/第i合同/g, ci.name); + if (ci.method1.length) { + ml_sourceRows.push(ml_sheet.getRow(8)); + sheet_2_1 = copyWorksheet(workbook, '预i-2-1表', `预${index + 1}-2-1表`); + sheet_2_1.headerFooter.oddHeader = sheet_2_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2-1 表/g, `预 ${index + 1}-2-1 表`).replace(/第i合同/g, ci.name); + } + if (ci.method2.length) { + ml_sourceRows.push(ml_sheet.getRow(9)); + sheet_2_2 = copyWorksheet(workbook, '预i-2-2表', `预${index + 1}-2-2表`); + sheet_2_2.headerFooter.oddHeader = sheet_2_2.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-2-2 表/g, `预 ${index + 1}-2-2 表`).replace(/第i合同/g, ci.name); + } + } + if (ci.method3.length) { + ml_sourceRows.push(ml_sheet.getRow(10)); + sheet_3 = copyWorksheet(workbook, '预i-3表', `预${index + 1}-3表`); + sheet_3.headerFooter.oddHeader = sheet_3.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-3 表/g, `预 ${index + 1}-3 表`).replace(/第i合同/g, ci.name); + } + if (ci.method4.length) { + ml_sourceRows.push(ml_sheet.getRow(11)); + ml_sourceRows.push(ml_sheet.getRow(12)); + sheet_4 = copyWorksheet(workbook, '预i-4表', `预${index + 1}-4表`); + sheet_4.headerFooter.oddHeader = sheet_4.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-4 表/g, `预 ${index + 1}-4 表`).replace(/第i合同/g, ci.name); + sheet_4_1 = copyWorksheet(workbook, '预i-4-1表', `预${index + 1}-4-1表`); + sheet_4_1.headerFooter.oddHeader = sheet_4_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-4-1 表/g, `预 ${index + 1}-4-1 表`).replace(/第i合同/g, ci.name); + let sumObj = ci.method4.reduce((a, b) => { + const m4 = ci.services.find(f => f.id == b).method4; + return { person_num: a.person_num + m4.person_num, work_day: a.work_day + m4.work_day, fee: a.fee + m4.fee }; + }, { person_num: 0, work_day: 0, fee: 0 }); + sheet_4.getRow(3).getCell(4).value = sumObj.person_num; + sheet_4.getRow(3).getCell(5).value = sumObj.work_day; + sheet_4.getRow(3).getCell(6).value = sumObj.fee; + sheet_4_1.getRow(4).getCell(4).value = '/'; + sheet_4_1.getRow(4).getCell(5).value = '/'; + sheet_4_1.getRow(4).getCell(6).value = '/'; + sheet_4_1.getRow(4).getCell(7).value = sumObj.person_num; + sheet_4_1.getRow(4).getCell(8).value = sumObj.work_day; + sheet_4_1.getRow(4).getCell(9).value = sumObj.fee + } + + cusInsertRowFunc(ml_slotRow, ml_sourceRows, ml_sheet, () => ml_slotRow++, (targetCell, sourceCell, colNumber) => { + if (colNumber == 1) { + targetCell.value = ml_number++; + } else if (colNumber == 2) { + targetCell.value = sourceCell.value.replaceAll('第i合同', ci.name); + } else if (colNumber == 3) { + targetCell.value = sourceCell.value.replaceAll('i', index + 1); + } else { + targetCell.value = sourceCell.value; + } + }); + + let num_2 = 1; + let num_2_1 = 1; + let num_2_2 = 1; + let num_3 = 1; + let num_4 = 1; + let num_4_1 = 1; + ci.services.forEach((sobj, sindex) => { + let allServicesX = allServices.find(s => s.id == sobj.id); + if (allServicesX) { + allServicesX.contracts[index] = sobj.fee; + } else { + allServices.push({ + id: sobj.id, + contracts: { + [index]: sobj.fee, + }, + }); + } + let serviceX = serviceList[sobj.id]; + cusInsertRowFunc(4 + sindex, [sheet_1.getRow(3)], sheet_1, (targetRow) => { + targetRow.getCell(1).value = sindex + 1; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = sobj.method1 ? sobj.method1.fee : ''; + targetRow.getCell(5).value = sobj.method2 ? sobj.method2.fee : ''; + targetRow.getCell(6).value = sobj.method3 ? sobj.method3.fee : ''; + targetRow.getCell(7).value = sobj.method4 ? sobj.method4.fee : ''; + targetRow.getCell(8).value = sobj.fee; + }); + if (sobj.method1 || sobj.method2) { + 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 => { + return { + major: m, + mth1: det1.includes(m) ? sobj.method1.det[det1.indexOf(m)] : null, + mth2: det2.includes(m) ? sobj.method2.det[det2.indexOf(m)] : null, + }; + }); + + cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => { + targetRow.getCell(1).value = num_2++; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = '/'; + targetRow.getCell(5).value = '/'; + if (sobj.method1) { + targetRow.getCell(6).value = sobj.method1.basicFee; + targetRow.getCell(7).value = sobj.method1.fee; + 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.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = sobj.method1.cost; + targetRow.getCell(5).value = '/'; + targetRow.getCell(6).value = sobj.method1.basicFee_basic; + targetRow.getCell(7).value = '/'; + targetRow.getCell(8).value = sobj.method1.basicFee_optional; + targetRow.getCell(9).value = sobj.method1.basicFee; + }); + } + if (sobj.method2) { + targetRow.getCell(8).value = sobj.method2.basicFee; + targetRow.getCell(9).value = sobj.method2.fee; + cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { + targetRow.getCell(1).value = num_2_2++; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = sobj.method2.area; + targetRow.getCell(5).value = '/'; + targetRow.getCell(6).value = sobj.method2.basicFee_basic; + targetRow.getCell(7).value = '/'; + targetRow.getCell(8).value = sobj.method2.basicFee_optional; + targetRow.getCell(9).value = sobj.method2.basicFee; + }); + } + }); + allDet.forEach((m, mindex) => { + let majorX = majorList[m.major]; + cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => { + targetRow.getCell(1).value = num_2++; + targetRow.getCell(2).value = serviceX.ref + '-' + (mindex + 1); + targetRow.getCell(3).value = majorX.name; + if (m.mth1) { + targetRow.getCell(4).value = m.mth1.serviceCoe; + targetRow.getCell(5).value = m.mth1.majorCoe; + targetRow.getCell(6).value = m.mth1.basicFee; + targetRow.getCell(7).value = m.mth1.fee; + targetRow.getCell(8).value = 0; + targetRow.getCell(9).value = 0; + 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.ref + '-' + (mindex + 1); + targetRow.getCell(3).value = majorX.name; + targetRow.getCell(4).value = m.mth1.cost; + targetRow.getCell(5).value = m.mth1.basicFormula; + targetRow.getCell(6).value = m.mth1.basicFee_basic; + targetRow.getCell(7).value = m.mth1.optionalFormula; + targetRow.getCell(8).value = m.mth1.basicFee_optional; + targetRow.getCell(9).value = m.mth1.basicFee; + }); + } else { + targetRow.getCell(4).value = m.mth2.serviceCoe; + targetRow.getCell(5).value = m.mth2.majorCoe; + targetRow.getCell(6).value = 0; + targetRow.getCell(7).value = 0; + targetRow.getCell(8).value = m.mth2.basicFee; + targetRow.getCell(9).value = m.mth2.fee; + cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { + targetRow.getCell(1).value = num_2_2++; + targetRow.getCell(2).value = serviceX.ref + '-' + (mindex + 1); + targetRow.getCell(3).value = majorX.name; + targetRow.getCell(4).value = m.mth2.area; + targetRow.getCell(5).value = m.mth2.basicFormula; + targetRow.getCell(6).value = m.mth2.basicFee_basic; + targetRow.getCell(7).value = m.mth2.optionalFormula; + targetRow.getCell(8).value = m.mth2.basicFee_optional; + targetRow.getCell(9).value = m.mth2.basicFee; + }); + } + }); + }); + } + if (sobj.method3) { + cusInsertRowFunc(3 + num_3, [sheet_3.getRow(3)], sheet_3, (targetRow) => { + targetRow.getCell(1).value = num_3++; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = '/'; + targetRow.getCell(5).value = '/'; + targetRow.getCell(6).value = '/'; + targetRow.getCell(7).value = sobj.method3.basicFee; + targetRow.getCell(8).value = '/'; + targetRow.getCell(9).value = sobj.method3.fee; + }); + sobj.method3.det.forEach((tobj, tindex) => { + const taskX = taskList[tobj.task]; + cusInsertRowFunc(3 + num_3, [sheet_3.getRow(3)], sheet_3, (targetRow) => { + targetRow.getCell(1).value = num_3++; + targetRow.getCell(2).value = taskX.ref; + targetRow.getCell(3).value = taskX.name + (taskX.desc ? `(${taskX.desc})` : ''); + targetRow.getCell(4).value = taskX.basicParam; + targetRow.getCell(5).value = tobj.price; + targetRow.getCell(6).value = tobj.amount; + targetRow.getCell(7).value = tobj.basicFee; + targetRow.getCell(8).value = tobj.serviceCoe; + targetRow.getCell(9).value = tobj.fee; + }); + }); + } + if (sobj.method4) { + cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => { + targetRow.getCell(1).value = num_4++; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = sobj.method4.person_num; + targetRow.getCell(5).value = sobj.method4.work_day; + targetRow.getCell(6).value = sobj.method4.fee; + }); + cusInsertRowFunc(5 + num_4_1, [sheet_4_1.getRow(5)], sheet_4_1, (targetRow) => { + targetRow.getCell(1).value = num_4_1++; + targetRow.getCell(2).value = serviceX.ref; + targetRow.getCell(3).value = serviceX.name; + targetRow.getCell(4).value = '/'; + targetRow.getCell(5).value = '/'; + targetRow.getCell(6).value = '/'; + targetRow.getCell(7).value = sobj.method4.person_num; + targetRow.getCell(8).value = sobj.method4.work_day; + targetRow.getCell(9).value = sobj.method4.fee; + }); + sobj.method4.det.forEach((eobj, eindex) => { + const expertX = expertList[eobj.expert]; + cusInsertRowFunc(5 + num_4_1, [sheet_4_1.getRow(5)], sheet_4_1, (targetRow) => { + targetRow.getCell(1).value = num_4_1++; + targetRow.getCell(2).value = expertX.ref; + targetRow.getCell(3).value = expertX.name; + targetRow.getCell(4).value = `${expertX.minPrice}~${expertX.maxPrice}`; + targetRow.getCell(5).value = `${Math.round(expertX.minPrice * expertX.manageCoe)}~${Math.round(expertX.maxPrice * expertX.manageCoe)}`; + targetRow.getCell(6).value = eobj.price; + targetRow.getCell(7).value = eobj.person_num; + targetRow.getCell(8).value = eobj.work_day; + targetRow.getCell(9).value = eobj.fee; + targetRow.getCell(10).value = eobj.desc; + }); + }); + } + }); + }); + + allServices.sort((a, b) => a.id - b.id); + allServices.forEach((s, sindex) => { + const serviceX = serviceList[s.id]; + cusInsertRowFunc(3 + sindex, [yz01_sheet.getRow(2)], yz01_sheet, (targetRow) => { + let siSum = 0; + for (let i = 0; i < yz01Num; i++) { + targetRow.getCell(i * 7 + 1).value = sindex + 1; + targetRow.getCell(i * 7 + 2).value = serviceX.ref; + targetRow.getCell(i * 7 + 3).value = serviceX.name; + targetRow.getCell(i * 7 + 4).value = s.contracts[i * 4]; + targetRow.getCell(i * 7 + 5).value = s.contracts[i * 4 + 1]; + targetRow.getCell(i * 7 + 6).value = s.contracts[i * 4 + 2]; + siSum = siSum + (Number(s.contracts[i * 4]) || 0 + Number(s.contracts[i * 4 + 1]) || 0 + Number(s.contracts[i * 4 + 2]) || 0); + if (i == yz01Num - 1 && yz01Mod == 0) { + targetRow.getCell(i * 7 + 7).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(i * 7 + 7).value = s.contracts[i * 4 + 3]; + siSum = siSum + (Number(s.contracts[i * 4 + 3]) || 0); + } + } + if (yz01Mod) { + targetRow.getCell(yz01Num * 7 + 1).value = sindex + 1; + targetRow.getCell(yz01Num * 7 + 2).value = serviceX.ref; + targetRow.getCell(yz01Num * 7 + 3).value = serviceX.name; + if (yz01Mod == 1) { + targetRow.getCell(yz01Num * 7 + 4).value = numberFormatter(siSum, 2); + } else if (yz01Mod == 2) { + targetRow.getCell(yz01Num * 7 + 4).value = s.contracts[yz01Num * 4]; + siSum = siSum + (Number(s.contracts[yz01Num * 4]) || 0); + targetRow.getCell(yz01Num * 7 + 5).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(yz01Num * 7 + 4).value = s.contracts[yz01Num * 4]; + targetRow.getCell(yz01Num * 7 + 5).value = s.contracts[yz01Num * 4 + 1]; + siSum = siSum + (Number(s.contracts[yz01Num * 4]) || 0 + Number(s.contracts[yz01Num * 4 + 1]) || 0); + targetRow.getCell(yz01Num * 7 + 6).value = numberFormatter(siSum, 2); + } + } + }); + }); + + ml_sheet.spliceRows(6, 6); + ml_sheet.spliceRows(6, 1); + + // 合并说明 + if (yz01Num) { + for (let i = 0; i < yz01Num; i++) { + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4].name}预算\n(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 1].name}预算\n(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 2].name}预算\n(元)`; + if (i == yz01Num - 1 && yz01Mod == 0) { + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `预算小计\n(元)`; + } else { + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 3].name}预算\n(元)`; + } + yz01_sheet.mergeCells(6, i * 7 + 2, 6, i * 7 + 7); + } + } + if (yz01Mod) { + for (let i = 0; i < yz01Mod; i++) { + if (i == yz01Mod - 1) { + yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `预算小计\n(元)`; + } else { + yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `${data.contracts[yz01Num * 4 + i].name}预算\n(元)`; + } + } + yz01_sheet.mergeCells(6, yz01Num * 7 + 2, 6, yz01Num * 7 + 3 + yz01Mod); + } + ml_sheet.mergeCells(ml_slotRow - 7, 1, ml_slotRow - 7, 4); + + workbook.removeWorksheet('预i-1表'); + workbook.removeWorksheet('预i-2表'); + workbook.removeWorksheet('预i-2-1表'); + workbook.removeWorksheet('预i-2-2表'); + workbook.removeWorksheet('预i-3表'); + workbook.removeWorksheet('预i-4表'); + workbook.removeWorksheet('预i-4-1表'); + workbook.getWorksheet('辅01表').orderNo = ml_number + 2 + 10; + workbook.getWorksheet('辅02表').orderNo = ml_number + 3 + 10; + workbook.getWorksheet('辅03表').orderNo = ml_number + 4 + 10; + + workbook._worksheets.forEach(sheet => { + if (sheet) { + if (sheet.headerFooter.oddHeader) sheet.headerFooter.oddHeader = sheet.headerFooter.oddHeader.replace(/&([CLR])&/g, '&$1&"宋体"&'); + if (sheet.headerFooter.oddFooter) sheet.headerFooter.oddFooter = sheet.headerFooter.oddFooter.replace(/&([CLR])&/g, '&$1&"宋体"&'); + } + }); + + window.workbook = workbook; + + return workbook; +} + +function cusInsertRowFunc(insertRowNum, sourceRows, worksheet, RowFun, cellFun) { + // 插入行 + let newRows = []; + for (let i = 0; i < sourceRows.length; i++) { + newRows.push([]); + } + worksheet.insertRows(insertRowNum, newRows); + + for (let i = 0; i < sourceRows.length; i++) { + const sourceRow = sourceRows[i]; + const targetRowNum = insertRowNum + i; + const targetRow = worksheet.getRow(targetRowNum); + targetRow.height = undefined; + sourceRow.eachCell({ includeEmpty: true }, (cell, colNumber) => { + const targetCell = targetRow.getCell(colNumber); + // targetCell.value = cell.value; // 复制内容 + // 复制样式 + if (cell.style) { + targetCell.style = { ...cell.style }; + } + + if (cellFun) { + cellFun(targetCell, cell, colNumber, targetRow, sourceRow); + } + }); + if (RowFun) { + RowFun(targetRow, sourceRow, i); + } + } +} + +function copyWorksheet(workbook, sourceName, targetName) { + const source = workbook.getWorksheet(sourceName); + if (!source) throw new Error("Source sheet not found"); + + const target = workbook.addWorksheet(targetName, { + properties: { ...source.properties }, + pageSetup: { ...source.pageSetup }, + views: source.views ? JSON.parse(JSON.stringify(source.views)) : [], + }); + + /* 复制页眉页脚(关键补充) */ + if (source.headerFooter) { + target.headerFooter = JSON.parse( + JSON.stringify(source.headerFooter) + ); + } + + /* 复制合并单元格 */ + Object.keys(source._merges).forEach(range => { + let rangeModel = source._merges[range].model; + target.mergeCells(rangeModel.top, rangeModel.left, rangeModel.bottom, rangeModel.right); + }); + + /* 复制列(宽度、样式) */ + source.columns.forEach((col, i) => { + const targetCol = target.getColumn(i + 1); + targetCol.width = col.width; + targetCol.style = JSON.parse(JSON.stringify(col.style || {})); + }); + + /* 复制行 & 单元格 */ + source.eachRow({ includeEmpty: true }, (row, rowNumber) => { + const targetRow = target.getRow(rowNumber); + targetRow.height = undefined; + + row.eachCell({ includeEmpty: true }, (cell, colNumber) => { + const targetCell = targetRow.getCell(colNumber); + + // value(富文本/公式安全) + targetCell.value = cloneCellValue(cell.value); + + // style(必须深拷贝) + targetCell.style = JSON.parse(JSON.stringify(cell.style || {})); + }); + }); + + return target; +} + +function insertAndCopyColumn(insertAt, cols, ws) { + let insertAti = insertAt; + cols.forEach((col, index) => { + // 在 insertAti 位置插入空列 + ws.spliceColumns(insertAti, 0, []); + + // 插入后,col 可能需要偏移 + const srcColIndex = col >= insertAti ? col + 1 + index : col; + + // 复制列 + copyColumn(insertAti, srcColIndex, ws); + + insertAti++; + }); +} + +function copyColumn(toCol, fromCol, ws) { + const srcCol = ws.getColumn(fromCol); + const dstCol = ws.getColumn(toCol); + + // 列级属性 + dstCol.width = srcCol.width; + dstCol.hidden = srcCol.hidden; + dstCol.style = JSON.parse(JSON.stringify(srcCol.style || {})); + + // 单元格 + srcCol.eachCell({ includeEmpty: true }, (cell, rowNumber) => { + const dstCell = ws.getRow(rowNumber).getCell(toCol); + dstCell.value = cloneCellValue(cell.value); + dstCell.style = JSON.parse(JSON.stringify(cell.style || {})); + }); +} + +function cloneCellValue(value) { + if (value == null) return value; + + if (typeof value === "object") { + return JSON.parse(JSON.stringify(value)); + } + return value; +} + +function numberFormatter(num, decimalNum) { + if (num == null || String(num).trim().length == 0) return null; + let varArr = String(num).split("."); + let big = Number(varArr[0]).toLocaleString(); + if (decimalNum > 0) { + let decimal = varArr.length > 1 ? varArr[1] + '000000' : '000000'; + decimal = decimal.slice(0, decimalNum); + return big + '.' + decimal; + } else { + return big; + } +} \ No newline at end of file diff --git a/public/标准文件转代码Data.xlsx b/public/标准文件转代码Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bc46a46b8408b6f8bbedc2b248355923fb9f5bbd GIT binary patch literal 43654 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 LfK>yspK<>K;1$zW literal 0 HcmV?d00001 diff --git a/public/造价咨询服务计费报表模板.xlsx b/public/造价咨询服务计费报表模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ae61d988a3f59403db2d94e95f86d78cdc2a5931 GIT binary patch literal 42648 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 qR+g)p0XJE0rggq%F_XEK { } export const industryTypeList = [ - {id:'0', name: '公路工程', type: 'isRoad' }, - {id:'1', name: '铁路工程', type: 'isRailway' }, - {id:'2', name: '水运工程', type: 'isWaterway' } + { id: '0', name: '公路工程', type: 'isRoad' }, + { id: '1', name: '铁路工程', type: 'isRailway' }, + { id: '2', name: '水运工程', type: 'isWaterway' } ] as const -export const majorList = { - 0: { code: 'E1', name: '交通运输工程通用专业',hideInIndustrySelector: true, maxCoe: null, minCoe: null, defCoe: null, desc: '', isRoad: true, isRailway: true, isWaterway: true, order: 1, hasCost: false, hasArea: false }, +export const majorList = { + 0: { code: 'E1', name: '交通运输工程通用专业', hideInIndustrySelector: true, maxCoe: null, minCoe: null, defCoe: null, desc: '', isRoad: true, isRailway: true, isWaterway: true, order: 1, hasCost: false, hasArea: false }, 1: { code: 'E1-1', name: '征地(用海)补偿', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于交通建设项目征地(用海)补偿的施工图预算、招标工程量清单及清单预算(或最高投标限价)、清理概算(仅限铁路工程)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: true, isWaterway: true, order: 2, hasCost: true, hasArea: true }, 2: { code: 'E1-2', name: '拆迁补偿', maxCoe: null, minCoe: null, defCoe: 2.5, desc: '适用于交通建设项目拆迁补偿的施工图预算、招标工程量清单及清单预算(或最高投标限价)、清理概算(仅限铁路工程)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: true, isWaterway: true, order: 3, hasCost: true, hasArea: true }, 3: { code: 'E1-3', name: '迁改工程', maxCoe: null, minCoe: null, defCoe: 2, desc: '适用于交通建设项目迁改工程的施工图预算、招标工程量清单及清单预算(或最高投标限价)、清理概算(仅限铁路工程)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: true, isWaterway: true, order: 4, hasCost: true, hasArea: false }, 4: { code: 'E1-4', name: '工程建设其他费', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于交通建设项目的工程建设其他费的施工图预算、招标工程量清单及清单预算(或最高投标限价)、清理概算(仅限铁路工程)和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: true, isWaterway: true, order: 5, hasCost: true, hasArea: false }, 5: { code: 'E1-5', name: '预备费', maxCoe: null, minCoe: null, defCoe: 1, desc: '', isRoad: true, isRailway: true, isWaterway: true, order: 6, hasCost: true, hasArea: false }, 6: { code: 'E1-6', name: '建设期贷款利息', maxCoe: null, minCoe: null, defCoe: 1, desc: '', isRoad: true, isRailway: true, isWaterway: true, order: 7, hasCost: true, hasArea: false }, - 7: { code: 'E2', name: '公路工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于公路工程的全过程造价咨询、分阶段造价咨询、投资估算、初步设计概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: true, isRailway: false, isWaterway: false, order: 8, hasCost: false, hasArea: false ,industryId:'0' }, + 7: { code: 'E2', name: '公路工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于公路工程的全过程造价咨询、分阶段造价咨询、投资估算、初步设计概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: true, isRailway: false, isWaterway: false, order: 8, hasCost: false, hasArea: false, industryId: '0' }, 8: { code: 'E2-1', name: '临时工程', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于临时工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 9, hasCost: true, hasArea: false }, 9: { code: 'E2-2', name: '路基工程', maxCoe: null, minCoe: null, defCoe: 1.2, desc: '适用于路基工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 10, hasCost: true, hasArea: false }, 10: { code: 'E2-3', name: '路面工程', maxCoe: null, minCoe: null, defCoe: 0.8, desc: '适用于路面工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 11, hasCost: true, hasArea: false }, @@ -36,7 +36,7 @@ export const majorList = { 15: { code: 'E2-8', name: '交通安全设施工程', maxCoe: null, minCoe: null, defCoe: 1.2, desc: '适用于交通安全设施工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 16, hasCost: true, hasArea: false }, 16: { code: 'E2-9', name: '绿化及环境保护工程', maxCoe: null, minCoe: null, defCoe: 1.2, desc: '适用于绿化工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 17, hasCost: true, hasArea: false }, 17: { code: 'E2-10', name: '房建工程', maxCoe: null, minCoe: null, defCoe: 2.5, desc: '适用于房建工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: true, isRailway: false, isWaterway: false, order: 18, hasCost: true, hasArea: false }, - 18: { code: 'E3', name: '铁路工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于铁路工程的投资估算、初步设计概算、清理概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: false, isRailway: true, isWaterway: false, order: 19, hasCost: false, hasArea: false ,industryId:'1' }, + 18: { code: 'E3', name: '铁路工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于铁路工程的投资估算、初步设计概算、清理概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: false, isRailway: true, isWaterway: false, order: 19, hasCost: false, hasArea: false, industryId: '1' }, 19: { code: 'E3-1', name: '大型临时设施和过渡工程', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于大型临时设施和过渡工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 20, hasCost: true, hasArea: false }, 20: { code: 'E3-2', name: '路基工程', maxCoe: null, minCoe: null, defCoe: 1.2, desc: '适用于路基工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 21, hasCost: true, hasArea: false }, 21: { code: 'E3-3', name: '桥涵工程', maxCoe: null, minCoe: null, defCoe: 0.9, desc: '适用于桥涵工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 22, hasCost: true, hasArea: false }, @@ -46,7 +46,7 @@ export const majorList = { 25: { code: 'E3-7', name: '电力及电力牵引供电工程', maxCoe: null, minCoe: null, defCoe: 1.5, desc: '适用于电力及电力牵引供电工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 26, hasCost: true, hasArea: false }, 26: { code: 'E3-8', name: '房建工程(房屋建筑及附属工程)', maxCoe: null, minCoe: null, defCoe: 2.5, desc: '适用于房屋建筑及附属工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 27, hasCost: true, hasArea: false }, 27: { code: 'E3-9', name: '装饰装修工程', maxCoe: null, minCoe: null, defCoe: 2.7, desc: '适用于装饰装修工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: true, isWaterway: false, order: 28, hasCost: true, hasArea: false }, - 28: { code: 'E4', name: '水运工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于水运工程的投资估算、初步设计概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: false, isRailway: false, isWaterway: true, order: 29, hasCost: false, hasArea: false ,industryId:'2' }, + 28: { code: 'E4', name: '水运工程专业', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于水运工程的投资估算、初步设计概算、竣工决算和调整估算、调整概算(含征地拆迁和工程建设其他费)', isRoad: false, isRailway: false, isWaterway: true, order: 29, hasCost: false, hasArea: false, industryId: '2' }, 29: { code: 'E4-1', name: '临时工程', maxCoe: null, minCoe: null, defCoe: 1.1, desc: '适用于临时工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算、竣工决算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: false, isWaterway: true, order: 30, hasCost: true, hasArea: false }, 30: { code: 'E4-2', name: '土建工程', maxCoe: null, minCoe: null, defCoe: 1, desc: '适用于土建工程专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算、竣工决算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: false, isWaterway: true, order: 31, hasCost: true, hasArea: false }, 31: { code: 'E4-3', name: '机电与金属结构工程', maxCoe: null, minCoe: null, defCoe: 1.5, desc: '适用于机电与金属结构专业的施工图预算、招标工程量清单及清单预算(或最高投标限价)、合同(工程)结算和造价鉴定、计算工程量、工程变更费用咨询、工程成本测(核)算', isRoad: false, isRailway: false, isWaterway: true, order: 32, hasCost: true, hasArea: false }, @@ -198,7 +198,7 @@ type BasicFeeFromScaleResult = { const industryTypeById = new Map( industryTypeList.flatMap(item => { return [[String(item.id).trim(), item.type]] - + }) ) /** @@ -244,7 +244,7 @@ const isPlainObject = (value: unknown): value is Record => Boolean(value) && typeof value === 'object' && !Array.isArray(value) const hasCodeLike = (value: Record) => - typeof value.code === 'string' + typeof value.code === 'string' const isDictLeafNode = (value: unknown): value is Record => isPlainObject(value) && hasCodeLike(value) && typeof value.name === 'string' @@ -287,7 +287,7 @@ const sortDictEntries = ( const orderDiff = getItemSortValue(a.item, a.rawId) - getItemSortValue(b.item, b.rawId) if (orderDiff !== 0) return orderDiff - const codeA = String(a.item?.code || a.id) + const codeA = String(a.item?.code || a.id) const codeB = String(b.item?.code || b.id) return codeA.localeCompare(codeB) }) @@ -548,10 +548,186 @@ export async function exportFile(fileName: string, data: any): Promise { // 按模板生成最终工作簿:填充封面、目录、各分表及汇总数据。 async function generateTemplate(data) { + // const downTextTmp = { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: '常规' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: '下标' }] }; + + data.contracts[0].addtional = {// 附加工作费 + ref: { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: 'C' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: 'C' }] }, + name: '附加工作', + fee: 10000, + det: [ + { + id: 0, + ref: { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: 'C' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: 'F' }] }, + name: '人员驻场服务及其他附加工作', + fee: 10000, + m4: { + person_num: 10, + work_day: 3, + fee: 10000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + m5: { + fee: 10000, + det: [ + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + }, + { + id: 1, + ref: { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: 'C' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: 'X' }] }, + name: '咨询服务协调工作', + fee: 10000, + m0: { + coe: 0.03, + fee: 10000, + }, + m4: { + person_num: 10, + work_day: 3, + fee: 10000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + m5: { + fee: 10000, + det: [ + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + }, + ] + }; + data.contracts[0].reserve = {// 预备费 + ref: { richText: [{ font: { charset: 134, color: { theme: 1 }, italic: true, name: '宋体', size: 10 }, text: 'Y' }, { font: { charset: 134, color: { theme: 1 }, italic: true, name: 'Calibri', size: 10, vertAlign: 'subscript' }, text: 'B' }] }, + name: '预备费', + fee: 10000, + m0: { + coe: 0.03, + fee: 10000, + }, + m4: { + person_num: 10, + work_day: 3, + fee: 10000, + det: [ + { + expert: 0, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + expert: 1, + price: 100000, + person_num: 10, + work_day: 3, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + }, + m5: { + fee: 10000, + det: [ + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + { + name: '×××项', + unit: '项', + amount: 10, + price: 100000, + fee: 100000, + remark: '',// 用户输入的说明 + }, + ], + } + }; + data.contracts[1].addtional = null; + data.contracts[1].reserve = null; + data.contracts[2].addtional = null; + data.contracts[2].reserve = null; + data.contracts[3].addtional = null; + data.contracts[3].reserve = null; + data.contracts[4].addtional = null; + data.contracts[4].reserve = null; + // data.contracts[5].addtional = null; + // data.contracts[5].reserve = null; try { // 获取模板 let templateExcel = 'template20260226001test010'; - let templateUrl = `https://oa.zwgczx.com/myExcelTemplate/${templateExcel}.xlsx`; + let templateUrl = `./public/${templateExcel}.xlsx`; let buf = await (await fetch(templateUrl)).arrayBuffer(); let workbook = new ExcelJS.Workbook(); await workbook.xlsx.load(buf); @@ -562,14 +738,20 @@ async function generateTemplate(data) { let yz01_sheet = workbook.getWorksheet('预总01表'); let f01_sheet = workbook.getWorksheet('辅01表'); - let now = new Date(); - let year = now.getFullYear(); - let month = now.getMonth() + 1; - let day = now.getDate(); - + // 更新封面 fm_sheet.getRow(2).getCell(1).value = data.name; - fm_sheet.getRow(11).getCell(4).value = `${year} 年 ${month} 月 ${day} 日`; + fm_sheet.getRow(8).getCell(4).value = data.writer; + fm_sheet.getRow(9).getCell(4).value = data.reviewer; + fm_sheet.getRow(10).getCell(4).value = data.company; + if (data.date) { + const dateArr = data.date.split('-'); + let year = dateArr[0]; + let month = Number(dateArr[1]); + let day = Number(dateArr[2]); + fm_sheet.getRow(11).getCell(4).value = `${year} 年 ${month} 月 ${day} 日`; + } + // 更新预总01表的列数 let yz01Mod = (data.contracts.length + 1) % 4; let yz01Num = (data.contracts.length + 1 - yz01Mod) / 4; switch (yz01Mod) { @@ -597,6 +779,7 @@ async function generateTemplate(data) { } } + // 更新辅01表的列数 let f01Mod = (data.contracts.length) % 3; let f01Num = (data.contracts.length - f01Mod) / 3; switch (f01Mod) { @@ -644,14 +827,18 @@ async function generateTemplate(data) { } } - let ml_slotRow = 13; + // 按合同段更新目录及相关表 + let ml_slotRow = 14; let ml_number = 1; let allServices = []; + let allAddtional = {}; + let allReserve = {}; data.contracts.forEach((ci, index) => { ci.method1 = []; ci.method2 = []; ci.method3 = []; ci.method4 = []; + // 按计价方式汇总服务数据对象 ci.services.forEach(si => { if (si.method1) { ci.method1.push(si.id); @@ -662,7 +849,22 @@ async function generateTemplate(data) { if (si.method3) ci.method3.push(si.id); if (si.method4) ci.method4.push(si.id); }); + const addtionalM4 = []; + const addtionalM5 = []; + if (ci.addtional) { + allAddtional[index] = ci.addtional; + ci.addtional.det.forEach(f => { + if (f.m4) addtionalM4.push(f); + if (f.m5) addtionalM5.push(f); + }); + } + if (addtionalM5.length) ci.method5 = { addtional: addtionalM5 }; + if (ci.reserve) allReserve[index] = ci.reserve; + const reserveM4 = ci.reserve?.m4; + const reserveM5 = ci.reserve?.m5; + if (reserveM5) ci.method5 = ci.method5 ? Object.assign({ reserve: reserveM5 }, ci.method5) : { reserve: reserveM5 }; + // 创建sheet let ml_sourceRows = [ml_sheet.getRow(6)]; let sheet_1 = copyWorksheet(workbook, '预i-1表', `预${index + 1}-1表`); sheet_1.headerFooter.oddHeader = sheet_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-1 表/g, `预 ${index + 1}-1 表`).replace(/第i合同/g, ci.name); @@ -673,6 +875,7 @@ async function generateTemplate(data) { let sheet_3; let sheet_4; let sheet_4_1; + let sheet_5; if (ci.method1.length || ci.method2.length) { ml_sourceRows.push(ml_sheet.getRow(7)); sheet_2 = copyWorksheet(workbook, '预i-2表', `预${index + 1}-2表`); @@ -693,19 +896,21 @@ async function generateTemplate(data) { sheet_3 = copyWorksheet(workbook, '预i-3表', `预${index + 1}-3表`); sheet_3.headerFooter.oddHeader = sheet_3.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-3 表/g, `预 ${index + 1}-3 表`).replace(/第i合同/g, ci.name); } - if (ci.method4.length) { + if (ci.method4.length || addtionalM4.length || reserveM4) { ml_sourceRows.push(ml_sheet.getRow(11)); ml_sourceRows.push(ml_sheet.getRow(12)); sheet_4 = copyWorksheet(workbook, '预i-4表', `预${index + 1}-4表`); sheet_4.headerFooter.oddHeader = sheet_4.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-4 表/g, `预 ${index + 1}-4 表`).replace(/第i合同/g, ci.name); sheet_4_1 = copyWorksheet(workbook, '预i-4-1表', `预${index + 1}-4-1表`); sheet_4_1.headerFooter.oddHeader = sheet_4_1.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-4-1 表/g, `预 ${index + 1}-4-1 表`).replace(/第i合同/g, ci.name); - let sumObj = ci.method4.reduce((a, b) => { - const m4 = ci.services.find(f => f.id == b)?.method4; + // 更新i-4和i-4-1表的小计行 + let sumArr = ci.method4.map(m => ci.services.find(f => f.id == m)?.method4).concat(addtionalM4.map(m => m.m4)); + if (reserveM4) sumArr.push(reserveM4); + let sumObj = sumArr.reduce((a, b) => { return { - person_num: addNumbers(a.person_num, toFiniteNumber(m4?.person_num)), - work_day: addNumbers(a.work_day, toFiniteNumber(m4?.work_day)), - fee: addNumbers(a.fee, toFiniteNumber(m4?.fee)) + person_num: addNumbers(a.person_num, toFiniteNumber(b?.person_num)), + work_day: addNumbers(a.work_day, toFiniteNumber(b?.work_day)), + fee: addNumbers(a.fee, toFiniteNumber(b?.fee)) }; }, { person_num: 0, work_day: 0, fee: 0 }); sheet_4.getRow(3).getCell(4).value = sumObj.person_num; @@ -718,7 +923,16 @@ async function generateTemplate(data) { sheet_4_1.getRow(4).getCell(8).value = sumObj.work_day; sheet_4_1.getRow(4).getCell(9).value = sumObj.fee } + if (ci.method5) { + 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(4).value = '/'; + sheet_5.getRow(3).getCell(5).value = '/'; + sheet_5.getRow(3).getCell(6).value = (ci.method5.addtional?.reduce((a, b) => a + b.m5.fee, 0) || 0) + (ci.method5.reserve?.fee || 0); + } + // 更新目录的第三部分 cusInsertRowFunc(ml_slotRow, ml_sourceRows, ml_sheet, () => ml_slotRow++, (targetCell, sourceCell, colNumber) => { if (colNumber == 1) { targetCell.value = ml_number++; @@ -731,12 +945,19 @@ async function generateTemplate(data) { } }); + // 根据服务更新相关表 let num_2 = 1; let num_2_1 = 1; let num_2_2 = 1; let num_3 = 1; let num_4 = 1; let num_4_1 = 1; + let num_5 = 1; + let m1Sum = 0; + let m2Sum = 0; + let m3Sum = 0; + let m4Sum = 0; + let serviceSum = 0; ci.services.forEach((sobj, sindex) => { let allServicesX = allServices.find(s => s.id == sobj.id); if (allServicesX) { @@ -749,31 +970,34 @@ async function generateTemplate(data) { }, }); } - let serviceX = getServiceDictItemById(sobj.id) || { code: '', name: '' }; + let serviceX = serviceList[sobj.id]; cusInsertRowFunc(4 + sindex, [sheet_1.getRow(3)], sheet_1, (targetRow) => { targetRow.getCell(1).value = sindex + 1; targetRow.getCell(2).value = serviceX.code; targetRow.getCell(3).value = serviceX.name; - targetRow.getCell(4).value = sobj.method1 ? sobj.method1.fee : ''; - targetRow.getCell(5).value = sobj.method2 ? sobj.method2.fee : ''; - targetRow.getCell(6).value = sobj.method3 ? sobj.method3.fee : ''; - targetRow.getCell(7).value = sobj.method4 ? sobj.method4.fee : ''; + if (sobj.method1) { + targetRow.getCell(4).value = sobj.method1.fee; + m1Sum += sobj.method1.fee; + } + if (sobj.method2) { + targetRow.getCell(5).value = sobj.method2.fee; + m2Sum += sobj.method2.fee; + } + if (sobj.method3) { + targetRow.getCell(6).value = sobj.method3.fee; + m3Sum += sobj.method3.fee; + } + if (sobj.method4) { + targetRow.getCell(7).value = sobj.method4.fee; + m4Sum += sobj.method4.fee; + } targetRow.getCell(8).value = sobj.fee; + serviceSum += sobj.fee; }); if (sobj.method1 || sobj.method2) { let det1 = sobj.method1 ? sobj.method1.det.map(m => m.major) : []; let det2 = sobj.method2 ? sobj.method2.det.map(m => m.major) : []; - const majorOrderMap = new Map(getMajorDictEntries().map((entry, idx) => [entry.id, idx])); - let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => { - const aId = String(a); - const bId = String(b); - const ao = majorOrderMap.get(aId) ?? majorOrderMap.get(getMajorIdAliasMap().get(aId) || ''); - const bo = majorOrderMap.get(bId) ?? majorOrderMap.get(getMajorIdAliasMap().get(bId) || ''); - if (ao != null && bo != null) return ao - bo; - if (ao != null) return -1; - if (bo != null) return 1; - return aId.localeCompare(bId); - }).map(m => { + let allDet = [...(new Set([...det1, ...det2]))].sort((a, b) => a - b).map(m => { return { major: m, mth1: det1.includes(m) ? sobj.method1.det[det1.indexOf(m)] : null, @@ -787,9 +1011,11 @@ async function generateTemplate(data) { targetRow.getCell(3).value = serviceX.name; targetRow.getCell(4).value = '/'; targetRow.getCell(5).value = '/'; + targetRow.getCell(6).value = '/'; + targetRow.getCell(7).value = '/'; if (sobj.method1) { - targetRow.getCell(6).value = sobj.method1.basicFee; - targetRow.getCell(7).value = sobj.method1.fee; + targetRow.getCell(8).value = sobj.method1.basicFee; + targetRow.getCell(9).value = sobj.method1.fee; 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; @@ -803,8 +1029,8 @@ async function generateTemplate(data) { }); } if (sobj.method2) { - targetRow.getCell(8).value = sobj.method2.basicFee; - targetRow.getCell(9).value = sobj.method2.fee; + targetRow.getCell(10).value = sobj.method2.basicFee; + targetRow.getCell(11).value = sobj.method2.fee; cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { targetRow.getCell(1).value = num_2_2++; targetRow.getCell(2).value = serviceX.code; @@ -819,7 +1045,7 @@ async function generateTemplate(data) { } }); allDet.forEach((m, mindex) => { - let majorX = getMajorDictItemById(m.major) || { name: '' }; + let majorX = majorList[m.major]; cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => { targetRow.getCell(1).value = num_2++; targetRow.getCell(2).value = serviceX.code + '-' + (mindex + 1); @@ -827,10 +1053,12 @@ async function generateTemplate(data) { if (m.mth1) { targetRow.getCell(4).value = m.mth1.serviceCoe; targetRow.getCell(5).value = m.mth1.majorCoe; - targetRow.getCell(6).value = m.mth1.basicFee; - targetRow.getCell(7).value = m.mth1.fee; - targetRow.getCell(8).value = 0; - targetRow.getCell(9).value = 0; + targetRow.getCell(6).value = m.mth1.processCoe; + targetRow.getCell(7).value = m.mth1.proportion; + targetRow.getCell(8).value = m.mth1.basicFee; + targetRow.getCell(9).value = m.mth1.fee; + targetRow.getCell(10).value = 0; + targetRow.getCell(11).value = 0; 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); @@ -845,10 +1073,12 @@ async function generateTemplate(data) { } else { targetRow.getCell(4).value = m.mth2.serviceCoe; targetRow.getCell(5).value = m.mth2.majorCoe; - targetRow.getCell(6).value = 0; - targetRow.getCell(7).value = 0; - targetRow.getCell(8).value = m.mth2.basicFee; - targetRow.getCell(9).value = m.mth2.fee; + targetRow.getCell(6).value = m.mth2.processCoe; + targetRow.getCell(7).value = m.mth2.proportion; + targetRow.getCell(8).value = 0; + targetRow.getCell(9).value = 0; + targetRow.getCell(10).value = m.mth2.basicFee; + targetRow.getCell(11).value = m.mth2.fee; cusInsertRowFunc(4 + num_2_2, [sheet_2_2.getRow(4)], sheet_2_2, (targetRow) => { targetRow.getCell(1).value = num_2_2++; targetRow.getCell(2).value = serviceX.code + '-' + (mindex + 1); @@ -928,19 +1158,64 @@ async function generateTemplate(data) { }); } }); + let endRows = 1; + 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 = numberFormatter(m1Sum, 2); + targetRow.getCell(5).value = numberFormatter(m2Sum, 2); + targetRow.getCell(6).value = numberFormatter(m3Sum, 2); + targetRow.getCell(7).value = numberFormatter(m4Sum, 2); + targetRow.getCell(8).value = numberFormatter(serviceSum, 2); + }); + if (ci.addtional) { + 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 = ci.addtional.ref; + targetRow.getCell(3).value = ci.addtional.name; + targetRow.getCell(4).value = ''; + targetRow.getCell(5).value = ''; + targetRow.getCell(6).value = ''; + targetRow.getCell(7).value = ''; + targetRow.getCell(8).value = ci.addtional.fee; + }); + ci.addtional.det.forEach((addobj, addindex) => { + 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 = addobj.ref; + targetRow.getCell(3).value = addobj.name; + let tmpArr = []; + if (addobj.m0) tmpArr.push(`按上述小计的${addobj.m0.coe}计得${addobj.m0.fee}元`); + if (addobj.m4) tmpArr.push(`按工时法计得${addobj.m4.fee}元`); + if (addobj.m5) tmpArr.push(`按数量单价计得${addobj.m5.fee}元`); + targetRow.getCell(4).value = tmpArr.join(';'); + targetRow.getCell(8).value = addobj.fee; + }); + }); + } + + sheet_1.spliceRows(3, 1); + sheet_1.getRow(ci.services.length + endRows + 3).getCell(1).value = ci.services.length + endRows + 1; + sheet_1.getRow(ci.services.length + endRows + 3).getCell(8).value = ci.fee; + sheet_1.mergeCells(2 + ci.services.length + endRows + 2, 2, 2 + ci.services.length + endRows + 2, 8); + sheet_1.getRow(2 + ci.services.length + endRows + 2).height = 100; + sheet_1.getRow(2 + ci.services.length + endRows + 2).getCell(2).border.right = { style: 'thin' }; + for (let i = 1; i <= endRows; i++) { + sheet_1.mergeCells(ci.services.length + 3 + i, 4, ci.services.length + 3 + i, 7); + 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; + } + } }); - const serviceOrderMap = new Map(getServiceDictEntries().map((entry, index) => [entry.id, index])); - allServices.sort((a, b) => { - const ao = serviceOrderMap.get(String(a.id)); - const bo = serviceOrderMap.get(String(b.id)); - if (ao != null && bo != null) return ao - bo; - if (ao != null) return -1; - if (bo != null) return 1; - return String(a.id).localeCompare(String(b.id)); - }); + allServices.sort((a, b) => a.id - b.id); allServices.forEach((s, sindex) => { - const serviceX = getServiceDictItemById(s.id) || { code: '', name: '' }; + const serviceX = serviceList[s.id]; cusInsertRowFunc(3 + sindex, [yz01_sheet.getRow(2)], yz01_sheet, (targetRow) => { let siSum = 0; for (let i = 0; i < yz01Num; i++) { @@ -986,35 +1261,174 @@ async function generateTemplate(data) { } }); }); + let endRows = 0; + if (Object.keys(allAddtional).length) { + endRows++; + let firstNum = Object.keys(allAddtional)[0]; + cusInsertRowFunc(3 + allServices.length, [yz01_sheet.getRow(2)], yz01_sheet, (targetRow) => { + let siSum = 0; + for (let i = 0; i < yz01Num; i++) { + targetRow.getCell(i * 7 + 1).value = allServices.length + 1; + targetRow.getCell(i * 7 + 2).value = allAddtional[firstNum].ref; + targetRow.getCell(i * 7 + 3).value = allAddtional[firstNum].name; + targetRow.getCell(i * 7 + 4).value = allAddtional[i * 4]?.fee; + targetRow.getCell(i * 7 + 5).value = allAddtional[i * 4 + 1]?.fee; + targetRow.getCell(i * 7 + 6).value = allAddtional[i * 4 + 2]?.fee; + siSum = addNumbers( + siSum, + toFiniteNumber(allAddtional[i * 4]?.fee), + toFiniteNumber(allAddtional[i * 4 + 1]?.fee), + toFiniteNumber(allAddtional[i * 4 + 2]?.fee) + ); + if (i == yz01Num - 1 && yz01Mod == 0) { + targetRow.getCell(i * 7 + 7).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(i * 7 + 7).value = allAddtional[i * 4 + 3]?.fee; + siSum = addNumbers(siSum, toFiniteNumber(allAddtional[i * 4 + 3]?.fee)); + } + } + if (yz01Mod) { + targetRow.getCell(yz01Num * 7 + 1).value = allServices.length + 1; + targetRow.getCell(yz01Num * 7 + 2).value = allAddtional[firstNum].ref; + targetRow.getCell(yz01Num * 7 + 3).value = allAddtional[firstNum].name; + if (yz01Mod == 1) { + targetRow.getCell(yz01Num * 7 + 4).value = numberFormatter(siSum, 2); + } else if (yz01Mod == 2) { + targetRow.getCell(yz01Num * 7 + 4).value = allAddtional[yz01Num * 4]?.fee; + siSum = addNumbers(siSum, toFiniteNumber(allAddtional[yz01Num * 4]?.fee)); + targetRow.getCell(yz01Num * 7 + 5).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(yz01Num * 7 + 4).value = allAddtional[yz01Num * 4]?.fee; + targetRow.getCell(yz01Num * 7 + 5).value = allAddtional[yz01Num * 4 + 1]?.fee; + siSum = addNumbers( + siSum, + toFiniteNumber(allAddtional[yz01Num * 4]?.fee), + toFiniteNumber(allAddtional[yz01Num * 4 + 1]?.fee) + ); + targetRow.getCell(yz01Num * 7 + 6).value = numberFormatter(siSum, 2); + } + } + }); + } + if (Object.keys(allReserve).length) { + endRows++; + let firstNum = Object.keys(allReserve)[0]; + cusInsertRowFunc(3 + allServices.length + endRows - 1, [yz01_sheet.getRow(2)], yz01_sheet, (targetRow) => { + let siSum = 0; + for (let i = 0; i < yz01Num; i++) { + targetRow.getCell(i * 7 + 1).value = allServices.length + endRows; + targetRow.getCell(i * 7 + 2).value = allReserve[firstNum].ref; + targetRow.getCell(i * 7 + 3).value = allReserve[firstNum].name; + targetRow.getCell(i * 7 + 4).value = allReserve[i * 4]?.fee; + targetRow.getCell(i * 7 + 5).value = allReserve[i * 4 + 1]?.fee; + targetRow.getCell(i * 7 + 6).value = allReserve[i * 4 + 2]?.fee; + siSum = addNumbers( + siSum, + toFiniteNumber(allReserve[i * 4]?.fee), + toFiniteNumber(allReserve[i * 4 + 1]?.fee), + toFiniteNumber(allReserve[i * 4 + 2]?.fee) + ); + if (i == yz01Num - 1 && yz01Mod == 0) { + targetRow.getCell(i * 7 + 7).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(i * 7 + 7).value = allReserve[i * 4 + 3]?.fee; + siSum = addNumbers(siSum, toFiniteNumber(allReserve[i * 4 + 3]?.fee)); + } + } + if (yz01Mod) { + targetRow.getCell(yz01Num * 7 + 1).value = allServices.length + endRows; + targetRow.getCell(yz01Num * 7 + 2).value = allReserve[firstNum].ref; + targetRow.getCell(yz01Num * 7 + 3).value = allReserve[firstNum].name; + if (yz01Mod == 1) { + targetRow.getCell(yz01Num * 7 + 4).value = numberFormatter(siSum, 2); + } else if (yz01Mod == 2) { + targetRow.getCell(yz01Num * 7 + 4).value = allReserve[yz01Num * 4]?.fee; + siSum = addNumbers(siSum, toFiniteNumber(allReserve[yz01Num * 4]?.fee)); + targetRow.getCell(yz01Num * 7 + 5).value = numberFormatter(siSum, 2); + } else { + targetRow.getCell(yz01Num * 7 + 4).value = allReserve[yz01Num * 4]?.fee; + targetRow.getCell(yz01Num * 7 + 5).value = allReserve[yz01Num * 4 + 1]?.fee; + siSum = addNumbers( + siSum, + toFiniteNumber(allReserve[yz01Num * 4]?.fee), + toFiniteNumber(allReserve[yz01Num * 4 + 1]?.fee) + ); + targetRow.getCell(yz01Num * 7 + 6).value = numberFormatter(siSum, 2); + } + } + }); + } + const yz01SumRow = yz01_sheet.getRow(allServices.length + endRows + 3); + for (let i = 0; i < yz01Num; i++) { + yz01SumRow.getCell(i * 7 + 1).value = allServices.length + endRows + 1; + yz01SumRow.getCell(i * 7 + 4).value = data.contracts[i * 4]?.fee; + yz01SumRow.getCell(i * 7 + 5).value = data.contracts[i * 4 + 1]?.fee; + yz01SumRow.getCell(i * 7 + 6).value = data.contracts[i * 4 + 2]?.fee; + if (i == yz01Num - 1 && yz01Mod == 0) { + yz01SumRow.getCell(i * 7 + 7).value = numberFormatter(data.fee, 2); + } else { + yz01SumRow.getCell(i * 7 + 7).value = data.contracts[i * 4 + 3]?.fee; + } + } + if (yz01Mod) { + yz01SumRow.getCell(yz01Num * 7 + 1).value = allServices.length + endRows + 1; + if (yz01Mod == 1) { + yz01SumRow.getCell(yz01Num * 7 + 4).value = numberFormatter(data.fee, 2); + } else if (yz01Mod == 2) { + yz01SumRow.getCell(yz01Num * 7 + 4).value = data.contracts[yz01Num * 4]?.fee; + yz01SumRow.getCell(yz01Num * 7 + 5).value = numberFormatter(data.fee, 2); + } else { + yz01SumRow.getCell(yz01Num * 7 + 4).value = data.contracts[yz01Num * 4]?.fee; + yz01SumRow.getCell(yz01Num * 7 + 5).value = data.contracts[yz01Num * 4 + 1]?.fee; + yz01SumRow.getCell(yz01Num * 7 + 6).value = numberFormatter(data.fee, 2); + } + } - ml_sheet.spliceRows(6, 6); + ml_sheet.spliceRows(6, 7); ml_sheet.spliceRows(6, 1); + yz01_sheet.spliceRows(2, 1); // 合并说明 + let yz01_lastCol; if (yz01Num) { for (let i = 0; i < yz01Num; i++) { - yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4].name}预算\n(元)`; - yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 1].name}预算\n(元)`; - yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 2].name}预算\n(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4].name}预算(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4 + 1).value = `${data.contracts[i * 4 + 1].name}预算(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4 + 2).value = `${data.contracts[i * 4 + 2].name}预算(元)`; if (i == yz01Num - 1 && yz01Mod == 0) { - yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `预算小计\n(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4 + 3).value = `预算小计(元)`; + yz01_lastCol = i * 7 + 4; } else { - yz01_sheet.getRow(1).getCell(i * 7 + 4).value = `${data.contracts[i * 4 + 3].name}预算\n(元)`; + yz01_sheet.getRow(1).getCell(i * 7 + 4 + 3).value = `${data.contracts[i * 4 + 3].name}预算(元)`; } - yz01_sheet.mergeCells(6, i * 7 + 2, 6, i * 7 + 7); + yz01_sheet.mergeCells(allServices.length + endRows + 3, i * 7 + 2, allServices.length + endRows + 3, i * 7 + 7); + yz01_sheet.getRow(allServices.length + endRows + 3).getCell(i * 7 + 2).border.right = { style: 'thin' }; } } if (yz01Mod) { for (let i = 0; i < yz01Mod; i++) { if (i == yz01Mod - 1) { - yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `预算小计\n(元)`; + yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `预算小计(元)`; + yz01_lastCol = yz01Num * 7 + 4 + i; } else { - yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `${data.contracts[yz01Num * 4 + i].name}预算\n(元)`; + yz01_sheet.getRow(1).getCell(yz01Num * 7 + 4 + i).value = `${data.contracts[yz01Num * 4 + i].name}预算(元)`; } } - yz01_sheet.mergeCells(6, yz01Num * 7 + 2, 6, yz01Num * 7 + 3 + yz01Mod); + yz01_sheet.mergeCells(allServices.length + endRows + 3, yz01Num * 7 + 2, allServices.length + endRows + 3, yz01Num * 7 + 3 + yz01Mod); + yz01_sheet.getRow(allServices.length + endRows + 3).getCell(yz01Num * 7 + 2).border.right = { style: 'thin' }; } - ml_sheet.mergeCells(ml_slotRow - 7, 1, ml_slotRow - 7, 4); + yz01_sheet.getRow(allServices.length + endRows + 3).height = 100; + // for (let i = 1; i <= allServices.length + endRows + 3; i++) { + // yz01_sheet.getRow(i).getCell(yz01_lastCol + 1).value = ' '; + // if (yz01_sheet.getRow(i).getCell(yz01_lastCol + 1).style.font) { + // yz01_sheet.getRow(i).getCell(yz01_lastCol + 1).style.font.size = i == 1 ? 22 : 20; + // } else { + // yz01_sheet.getRow(i).getCell(yz01_lastCol + 1).style = { font: { size: i == 1 ? 22 : 20 } }; + // // } + // // } + // yz01_sheet.pageSetup.printArea = `A1:${yz01_sheet.getRow(allServices.length + endRows + 3).getCell(yz01_lastCol)._address}`; + + ml_sheet.mergeCells(ml_slotRow - 8, 1, ml_slotRow - 8, 4); workbook.removeWorksheet('预i-1表'); workbook.removeWorksheet('预i-2表'); @@ -1023,9 +1437,10 @@ async function generateTemplate(data) { workbook.removeWorksheet('预i-3表'); workbook.removeWorksheet('预i-4表'); workbook.removeWorksheet('预i-4-1表'); - workbook.getWorksheet('辅01表').orderNo = ml_number + 2 + 10; - workbook.getWorksheet('辅02表').orderNo = ml_number + 3 + 10; - workbook.getWorksheet('辅03表').orderNo = ml_number + 4 + 10; + workbook.removeWorksheet('预i-5表'); + workbook.getWorksheet('辅01表').orderNo = ml_number + 2 + 11; + workbook.getWorksheet('辅02表').orderNo = ml_number + 3 + 11; + workbook.getWorksheet('辅03表').orderNo = ml_number + 4 + 11; workbook._worksheets.forEach(sheet => { if (sheet) { @@ -1063,7 +1478,7 @@ function cusInsertRowFunc(insertRowNum, sourceRows, worksheet, RowFun, cellFun) // targetCell.value = cell.value; // 复制内容 // 复制样式 if (cell.style) { - targetCell.style = { ...cell.style }; + targetCell.style = JSON.parse(JSON.stringify(cell.style)); } if (cellFun) { @@ -1082,16 +1497,14 @@ function copyWorksheet(workbook, sourceName, targetName) { if (!source) throw new Error("Source sheet not found"); const target = workbook.addWorksheet(targetName, { - properties: { ...source.properties }, - pageSetup: { ...source.pageSetup }, - views: source.views ? JSON.parse(JSON.stringify(source.views)) : [], + properties: JSON.parse(JSON.stringify(source.properties || {})), + pageSetup: JSON.parse(JSON.stringify(source.pageSetup || {})), + views: source.views ? JSON.parse(JSON.stringify(source.views || {})) : [], }); /* 复制页眉页脚(关键补充) */ if (source.headerFooter) { - target.headerFooter = JSON.parse( - JSON.stringify(source.headerFooter) - ); + target.headerFooter = JSON.parse(JSON.stringify(source.headerFooter)); } /* 复制合并单元格 */