更新成果导出功能
This commit is contained in:
parent
8bf3d5e773
commit
4e343cccf1
Binary file not shown.
Binary file not shown.
344
src/sql.ts
344
src/sql.ts
@ -580,8 +580,14 @@ export async function exportFile(fileName: string, data: any): Promise<void> {
|
|||||||
|
|
||||||
// 按模板生成最终工作簿:填充封面、目录、各分表及汇总数据。
|
// 按模板生成最终工作簿:填充封面、目录、各分表及汇总数据。
|
||||||
async function generateTemplate(data) {
|
async function generateTemplate(data) {
|
||||||
|
data.contracts[0].services[0].tasks = ['依据本项目在招标阶段确认的设计图纸工程量,结合工程量清单计量支付规则,对设计工程量进行复核,包括构件工程量、明细表工程量和汇总表工程量,同时与相关方核对工程量', '依据核对后确认的设计图纸数量,细化与合并招标工程量清单或合同工程量清单,建立各维度清单间的数据链接,与相关单位完成核对与确认', '依据确定的招标工程量清单或合同工程量清单,拆解与合并相应的清单费用,与相关单位完成核对与确认', '现场勘查与测量现场实施工程量'];
|
||||||
// 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: '下标' }] };
|
// 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: '下标' }] };
|
||||||
console.log(data)
|
console.log(data)
|
||||||
|
// 编制说明 → 工作内容的前后默认项
|
||||||
|
let prefixIDs = [6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27];
|
||||||
|
let suffixIDs = [6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27];
|
||||||
|
const prefixTexts = ['收集并整理各阶段及各项造价咨询所需的基础资料,审核基础资料的完整性和合理性', '编制造价咨询服务总体及各分项的服务计划、服务大纲及工作方案', '了解建设工程项目所在地的建设条件'];
|
||||||
|
const suffixTexts = ['协助委托人完成咨询服务相应造价文件的报审、报备、报批、检查与审计涉及的解释与回复、修改与调整等工作', '完成本合同造价档案的收集、整理和归档'];
|
||||||
try {
|
try {
|
||||||
// 获取模板
|
// 获取模板
|
||||||
let templateExcel = 'template20260226001test010';
|
let templateExcel = 'template20260226001test010';
|
||||||
@ -645,10 +651,15 @@ async function generateTemplate(data) {
|
|||||||
let allReserve = {};
|
let allReserve = {};
|
||||||
let allMajors = {};
|
let allMajors = {};
|
||||||
let allServiceMajors = new Set();
|
let allServiceMajors = new Set();
|
||||||
|
let allMethods = new Set();
|
||||||
|
let allReserveMethods = { 0: { coe: [], cid: [], coeSet: new Set() }, 4: [], 5: [] };
|
||||||
|
let contractFeeSummary = [];
|
||||||
data.scale?.forEach(sci => {
|
data.scale?.forEach(sci => {
|
||||||
allMajors[sci.major] = { [data.contracts.length]: sci };
|
allMajors[sci.major] = { [data.contracts.length]: sci };
|
||||||
});
|
});
|
||||||
data.contracts.forEach((ci, index) => {
|
data.contracts.forEach((ci, index) => {
|
||||||
|
contractFeeSummary.push(`${ci.name} ${Number(ci.fee).toLocaleString()}元`);
|
||||||
|
ci.allServiceMajors = new Set();
|
||||||
// 记录allMajors
|
// 记录allMajors
|
||||||
ci.scale?.forEach(sci => {
|
ci.scale?.forEach(sci => {
|
||||||
if (allMajors[sci.major]) {
|
if (allMajors[sci.major]) {
|
||||||
@ -657,19 +668,16 @@ async function generateTemplate(data) {
|
|||||||
allMajors[sci.major] = { [index]: sci };
|
allMajors[sci.major] = { [index]: sci };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ci.method1 = [];
|
ci.method1 = [];
|
||||||
ci.method2 = [];
|
ci.method2 = [];
|
||||||
ci.method3 = [];
|
ci.method3 = [];
|
||||||
ci.method4 = [];
|
ci.method4 = [];
|
||||||
// 按计价方式汇总服务数据对象
|
// 按计价方式汇总服务数据对象
|
||||||
ci.services.forEach(si => {
|
ci.services.forEach(si => {
|
||||||
if (si.method1) {
|
if (prefixIDs.includes(si.id)) ci.hasPreTexts = true;
|
||||||
ci.method1.push(si.id);
|
if (suffixIDs.includes(si.id)) ci.hasSufTexts = true;
|
||||||
}
|
if (si.method1) ci.method1.push(si.id);
|
||||||
if (si.method2) {
|
if (si.method2) ci.method2.push(si.id);
|
||||||
ci.method2.push(si.id);
|
|
||||||
}
|
|
||||||
if (si.method3) ci.method3.push(si.id);
|
if (si.method3) ci.method3.push(si.id);
|
||||||
if (si.method4) ci.method4.push(si.id);
|
if (si.method4) ci.method4.push(si.id);
|
||||||
});
|
});
|
||||||
@ -705,22 +713,26 @@ async function generateTemplate(data) {
|
|||||||
sheet_2 = copyWorksheet(workbook, '预i-2表', `预${index + 1}-2表`);
|
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);
|
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) {
|
if (ci.method1.length) {
|
||||||
|
allMethods.add(1);
|
||||||
ml_sourceRows.push(ml_sheet.getRow(8));
|
ml_sourceRows.push(ml_sheet.getRow(8));
|
||||||
sheet_2_1 = copyWorksheet(workbook, '预i-2-1表', `预${index + 1}-2-1表`);
|
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);
|
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) {
|
if (ci.method2.length) {
|
||||||
|
allMethods.add(2);
|
||||||
ml_sourceRows.push(ml_sheet.getRow(9));
|
ml_sourceRows.push(ml_sheet.getRow(9));
|
||||||
sheet_2_2 = copyWorksheet(workbook, '预i-2-2表', `预${index + 1}-2-2表`);
|
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);
|
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) {
|
if (ci.method3.length) {
|
||||||
|
allMethods.add(3);
|
||||||
ml_sourceRows.push(ml_sheet.getRow(10));
|
ml_sourceRows.push(ml_sheet.getRow(10));
|
||||||
sheet_3 = copyWorksheet(workbook, '预i-3表', `预${index + 1}-3表`);
|
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);
|
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 || addtionalM4.length || reserveM4) {
|
if (ci.method4.length || addtionalM4.length || reserveM4) {
|
||||||
|
allMethods.add(4);
|
||||||
ml_sourceRows.push(ml_sheet.getRow(11));
|
ml_sourceRows.push(ml_sheet.getRow(11));
|
||||||
ml_sourceRows.push(ml_sheet.getRow(12));
|
ml_sourceRows.push(ml_sheet.getRow(12));
|
||||||
sheet_4 = copyWorksheet(workbook, '预i-4表', `预${index + 1}-4表`);
|
sheet_4 = copyWorksheet(workbook, '预i-4表', `预${index + 1}-4表`);
|
||||||
@ -748,6 +760,7 @@ async function generateTemplate(data) {
|
|||||||
sheet_4_1.getRow(3).getCell(9).value = numberFormatter(sumObj.fee, 2);
|
sheet_4_1.getRow(3).getCell(9).value = numberFormatter(sumObj.fee, 2);
|
||||||
}
|
}
|
||||||
if (ci.method5) {
|
if (ci.method5) {
|
||||||
|
allMethods.add(5);
|
||||||
ml_sourceRows.push(ml_sheet.getRow(13));
|
ml_sourceRows.push(ml_sheet.getRow(13));
|
||||||
sheet_5 = copyWorksheet(workbook, '预i-5表', `预${index + 1}-5表`);
|
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.headerFooter.oddHeader = sheet_5.headerFooter.oddHeader.replace(/×××/g, ci.name).replace(/预 i-5 表/g, `预 ${index + 1}-5 表`).replace(/第i合同/g, ci.name);
|
||||||
@ -787,7 +800,8 @@ async function generateTemplate(data) {
|
|||||||
let m2Sum = 0;
|
let m2Sum = 0;
|
||||||
let m3Sum = 0;
|
let m3Sum = 0;
|
||||||
let m4Sum = 0;
|
let m4Sum = 0;
|
||||||
let serviceSum = 0;
|
let serviceSum1 = 0;
|
||||||
|
let serviceSum2 = 0;
|
||||||
ci.services.forEach((sobj, sindex) => {
|
ci.services.forEach((sobj, sindex) => {
|
||||||
let allServicesX = allServices.find(s => s.id == sobj.id);
|
let allServicesX = allServices.find(s => s.id == sobj.id);
|
||||||
if (allServicesX) {
|
if (allServicesX) {
|
||||||
@ -822,7 +836,9 @@ async function generateTemplate(data) {
|
|||||||
m4Sum = addNumbers(m4Sum, toFiniteNumber(sobj.method4.fee));
|
m4Sum = addNumbers(m4Sum, toFiniteNumber(sobj.method4.fee));
|
||||||
}
|
}
|
||||||
targetRow.getCell(8).value = numberFormatter(sobj.fee, 2);
|
targetRow.getCell(8).value = numberFormatter(sobj.fee, 2);
|
||||||
serviceSum = addNumbers(serviceSum, toFiniteNumber(sobj.fee));
|
targetRow.getCell(9).value = numberFormatter(sobj.finalFee, 2);
|
||||||
|
serviceSum1 = addNumbers(serviceSum1, toFiniteNumber(sobj.fee));
|
||||||
|
serviceSum2 = addNumbers(serviceSum2, toFiniteNumber(sobj.finalFee));
|
||||||
});
|
});
|
||||||
if (sobj.method1 || sobj.method2) {
|
if (sobj.method1 || sobj.method2) {
|
||||||
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
|
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
|
||||||
@ -1001,6 +1017,7 @@ async function generateTemplate(data) {
|
|||||||
});
|
});
|
||||||
allDet.forEach((m, mindex) => {
|
allDet.forEach((m, mindex) => {
|
||||||
allServiceMajors.add(m.major);
|
allServiceMajors.add(m.major);
|
||||||
|
ci.allServiceMajors.add(m.major);
|
||||||
let majorX = majorList[m.major];
|
let majorX = majorList[m.major];
|
||||||
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
|
cusInsertRowFunc(4 + num_2, [sheet_2.getRow(4)], sheet_2, (targetRow) => {
|
||||||
targetRow.getCell(1).value = num_2++;
|
targetRow.getCell(1).value = num_2++;
|
||||||
@ -1125,7 +1142,8 @@ async function generateTemplate(data) {
|
|||||||
targetRow.getCell(5).value = numberFormatter(m2Sum, 2);
|
targetRow.getCell(5).value = numberFormatter(m2Sum, 2);
|
||||||
targetRow.getCell(6).value = numberFormatter(m3Sum, 2);
|
targetRow.getCell(6).value = numberFormatter(m3Sum, 2);
|
||||||
targetRow.getCell(7).value = numberFormatter(m4Sum, 2);
|
targetRow.getCell(7).value = numberFormatter(m4Sum, 2);
|
||||||
targetRow.getCell(8).value = numberFormatter(serviceSum, 2);
|
targetRow.getCell(8).value = numberFormatter(serviceSum1, 2);
|
||||||
|
targetRow.getCell(9).value = numberFormatter(serviceSum2, 2);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (ci.addtional) {
|
if (ci.addtional) {
|
||||||
@ -1139,6 +1157,7 @@ async function generateTemplate(data) {
|
|||||||
targetRow.getCell(6).value = '';
|
targetRow.getCell(6).value = '';
|
||||||
targetRow.getCell(7).value = '';
|
targetRow.getCell(7).value = '';
|
||||||
targetRow.getCell(8).value = '';
|
targetRow.getCell(8).value = '';
|
||||||
|
targetRow.getCell(9).value = '';
|
||||||
});
|
});
|
||||||
ci.addtional.det.forEach((addobj, addindex) => {
|
ci.addtional.det.forEach((addobj, addindex) => {
|
||||||
endRows++;
|
endRows++;
|
||||||
@ -1147,11 +1166,14 @@ async function generateTemplate(data) {
|
|||||||
targetRow.getCell(2).value = addobj.code;
|
targetRow.getCell(2).value = addobj.code;
|
||||||
targetRow.getCell(3).value = addobj.name;
|
targetRow.getCell(3).value = addobj.name;
|
||||||
let tmpArr = [];
|
let tmpArr = [];
|
||||||
if (addobj.m0) tmpArr.push(`按基本、可选工作小计的${addobj.m0.coe}计得${addobj.m0.fee}元`);
|
if (addobj.m0) {
|
||||||
|
tmpArr.push(`按基本工作和可选工作确认预算之和的${addobj.m0.coe}计得${addobj.m0.fee}元`);
|
||||||
|
allMethods.add(0);
|
||||||
|
}
|
||||||
if (addobj.m4) tmpArr.push(`按工时法计得${addobj.m4.fee}元`);
|
if (addobj.m4) tmpArr.push(`按工时法计得${addobj.m4.fee}元`);
|
||||||
if (addobj.m5) tmpArr.push(`按数量单价计得${addobj.m5.fee}元`);
|
if (addobj.m5) tmpArr.push(`按数量单价计得${addobj.m5.fee}元`);
|
||||||
targetRow.getCell(4).value = tmpArr.join(';');
|
targetRow.getCell(4).value = tmpArr.join(';');
|
||||||
targetRow.getCell(8).value = numberFormatter(addobj.fee, 2);
|
targetRow.getCell(9).value = numberFormatter(addobj.fee, 2);
|
||||||
if (addobj.m4) {
|
if (addobj.m4) {
|
||||||
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
|
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
|
||||||
targetRow.getCell(1).value = num_4++;
|
targetRow.getCell(1).value = num_4++;
|
||||||
@ -1225,7 +1247,8 @@ async function generateTemplate(data) {
|
|||||||
targetRow.getCell(5).value = '';
|
targetRow.getCell(5).value = '';
|
||||||
targetRow.getCell(6).value = '';
|
targetRow.getCell(6).value = '';
|
||||||
targetRow.getCell(7).value = '';
|
targetRow.getCell(7).value = '';
|
||||||
targetRow.getCell(8).value = numberFormatter(ci.addtional.fee, 2);
|
targetRow.getCell(8).value = '';
|
||||||
|
targetRow.getCell(9).value = numberFormatter(ci.addtional.fee, 2);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (ci.reserve) {
|
if (ci.reserve) {
|
||||||
@ -1235,11 +1258,23 @@ async function generateTemplate(data) {
|
|||||||
targetRow.getCell(2).value = ci.reserve.code;
|
targetRow.getCell(2).value = ci.reserve.code;
|
||||||
targetRow.getCell(3).value = ci.reserve.name;
|
targetRow.getCell(3).value = ci.reserve.name;
|
||||||
let tmpArr = [];
|
let tmpArr = [];
|
||||||
if (ci.reserve.m0) tmpArr.push(`按基本、可选工作小计与附加工作小计之和的${ci.reserve.m0.coe}计得${ci.reserve.m0.fee}元`);
|
if (ci.reserve.m0) {
|
||||||
if (ci.reserve.m4) tmpArr.push(`按工时法计得${ci.reserve.m4.fee}元`);
|
tmpArr.push(`按基本工作、可选工作与附加工作确认预算之和的${ci.reserve.m0.coe}%计得${ci.reserve.m0.fee}元`);
|
||||||
if (ci.reserve.m5) tmpArr.push(`按数量单价计得${ci.reserve.m5.fee}元`);
|
allMethods.add(0);
|
||||||
|
allReserveMethods[0].cid.push(index);
|
||||||
|
allReserveMethods[0].coe.push(ci.reserve.m0.coe);
|
||||||
|
allReserveMethods[0].coeSet.add(ci.reserve.m0.coe);
|
||||||
|
}
|
||||||
|
if (ci.reserve.m4) {
|
||||||
|
tmpArr.push(`按工时法计得${ci.reserve.m4.fee}元`);
|
||||||
|
allReserveMethods[4].push(index);
|
||||||
|
}
|
||||||
|
if (ci.reserve.m5) {
|
||||||
|
tmpArr.push(`按数量单价计得${ci.reserve.m5.fee}元`);
|
||||||
|
allReserveMethods[5].push(index);
|
||||||
|
}
|
||||||
targetRow.getCell(4).value = tmpArr.join(';');
|
targetRow.getCell(4).value = tmpArr.join(';');
|
||||||
targetRow.getCell(8).value = numberFormatter(ci.reserve.fee, 2);
|
targetRow.getCell(9).value = numberFormatter(ci.reserve.fee, 2);
|
||||||
});
|
});
|
||||||
if (ci.reserve.m4) {
|
if (ci.reserve.m4) {
|
||||||
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
|
cusInsertRowFunc(4 + num_4, [sheet_4.getRow(4)], sheet_4, (targetRow) => {
|
||||||
@ -1307,8 +1342,8 @@ async function generateTemplate(data) {
|
|||||||
|
|
||||||
sheet_1.spliceRows(3, 1);
|
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(1).value = ci.services.length + endRows + 1;
|
||||||
sheet_1.getRow(ci.services.length + endRows + 3).getCell(8).value = numberFormatter(ci.fee, 2);
|
sheet_1.getRow(ci.services.length + endRows + 3).getCell(9).value = numberFormatter(ci.fee, 2);
|
||||||
sheet_1.mergeCells(2 + ci.services.length + endRows + 2, 2, 2 + ci.services.length + endRows + 2, 8);
|
sheet_1.mergeCells(2 + ci.services.length + endRows + 2, 2, 2 + ci.services.length + endRows + 2, 9);
|
||||||
sheet_1.getRow(2 + ci.services.length + endRows + 2).height = 100;
|
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' };
|
sheet_1.getRow(2 + ci.services.length + endRows + 2).getCell(2).border.right = { style: 'thin' };
|
||||||
|
|
||||||
@ -1353,7 +1388,7 @@ async function generateTemplate(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 1; i <= endRows; i++) {
|
for (let i = 1; i <= endRows; i++) {
|
||||||
sheet_1.mergeCells(ci.services.length + 3 + i, 4, ci.services.length + 3 + i, 7);
|
sheet_1.mergeCells(ci.services.length + 3 + i, 4, ci.services.length + 3 + i, 8);
|
||||||
if (sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment) {
|
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.horizontal = 'center';
|
||||||
sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.wrapText = true;
|
sheet_1.getRow(ci.services.length + 3 + i).getCell(4).style.alignment.wrapText = true;
|
||||||
@ -1759,8 +1794,6 @@ async function generateTemplate(data) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
window.workbook = workbook;
|
|
||||||
|
|
||||||
// 更新编制说明
|
// 更新编制说明
|
||||||
const canvas = document.createElement("canvas");
|
const canvas = document.createElement("canvas");
|
||||||
const ctx = canvas.getContext("2d");
|
const ctx = canvas.getContext("2d");
|
||||||
@ -1782,7 +1815,22 @@ async function generateTemplate(data) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
descRowNum += 3;
|
descRowNum += 2;
|
||||||
|
if (data.overview?.length) {
|
||||||
|
let overviewArr = paragraphLineBreakFor1112(' (一)' + data.overview + (/。$/.test(data.overview) ? '' : '。'), ctx);
|
||||||
|
descSheet.getRow(descRowNum).getCell(1).value = overviewArr[0];
|
||||||
|
descRowNum++;
|
||||||
|
if (overviewArr.length > 1) {
|
||||||
|
for (let i = 1; i < overviewArr.length; i++) {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = overviewArr[i];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
descRowNum++;
|
||||||
|
}
|
||||||
if (data.scale?.length) {
|
if (data.scale?.length) {
|
||||||
let engCosts = data.scale.filter(f => f.major > 6 && majorList[f.major].hasCost);
|
let engCosts = data.scale.filter(f => f.major > 6 && majorList[f.major].hasCost);
|
||||||
if (engCosts.length) {
|
if (engCosts.length) {
|
||||||
@ -1864,7 +1912,7 @@ async function generateTemplate(data) {
|
|||||||
} else {
|
} else {
|
||||||
let majorTexts = [];
|
let majorTexts = [];
|
||||||
let hasOther = false;
|
let hasOther = false;
|
||||||
allServiceMajors.forEach(mid => {
|
[...allServiceMajors].sort((a, b) => majorList[a].order - majorList[b].order).forEach(mid => {
|
||||||
if (mid > 6) {
|
if (mid > 6) {
|
||||||
majorTexts.push(majorList[mid].name);
|
majorTexts.push(majorList[mid].name);
|
||||||
} else {
|
} else {
|
||||||
@ -1886,8 +1934,227 @@ async function generateTemplate(data) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
descSheet.getRow(descRowNum).getCell(1).value = descSheet.getRow(descRowNum).getCell(1).value + '×××××。';
|
descSheet.getRow(descRowNum).getCell(1).value = descSheet.getRow(descRowNum).getCell(1).value + '×××××。';
|
||||||
|
descRowNum++;
|
||||||
}
|
}
|
||||||
|
if (data.contracts.length == 1) {
|
||||||
|
// 合同段划分
|
||||||
|
descSheet.spliceRows(descRowNum, 1);
|
||||||
|
// 咨询服务类型
|
||||||
|
let serviceText = ' (二)咨询服务类型:' + data.contracts[0].services.slice(0, -1).map(si => serviceList[si.id].name).join('、') + (data.contracts[0].services.length > 1 ? '和' : '') + serviceList[data.contracts[0].services.slice(-1)[0].id].name + '。';
|
||||||
|
let serviceTextArr = paragraphLineBreakFor1112(serviceText, ctx);
|
||||||
|
serviceTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// 工作内容及要求
|
||||||
|
descRowNum++;
|
||||||
|
} else {
|
||||||
|
descSheet.getRow(descRowNum).getCell(1).value = descSheet.getRow(descRowNum).getCell(1).value.replace(/×××/g, data.contracts.length);
|
||||||
|
let descRowNum1 = descRowNum + 1;
|
||||||
|
let descRowNum2 = descRowNum + 2;
|
||||||
|
let descRowNum3 = descRowNum + 2;
|
||||||
|
data.contracts.forEach((ci, cindex) => {
|
||||||
|
descRowNum3 = descRowNum3 - descRowNum2;
|
||||||
|
descRowNum2 = descRowNum2 - descRowNum1 - 1;
|
||||||
|
// 合同段划分
|
||||||
|
let ciMajorText = ` ${cindex + 1}.${ci.name}:`;
|
||||||
|
if (ci.allServiceMajors.size > 0) {
|
||||||
|
if (ci.allServiceMajors.has(7) || ci.allServiceMajors.has(18) || ci.allServiceMajors.has(28)) {
|
||||||
|
ciMajorText = ciMajorText + '全部工程及费用。';
|
||||||
|
} else {
|
||||||
|
let ciMajorTexts = [];
|
||||||
|
let hasOther = false;
|
||||||
|
[...ci.allServiceMajors].sort((a, b) => majorList[a].order - majorList[b].order).forEach(mid => {
|
||||||
|
if (mid > 6) {
|
||||||
|
ciMajorTexts.push(majorList[mid].name);
|
||||||
|
} else {
|
||||||
|
hasOther = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ciMajorText = ciMajorText + ciMajorTexts.join('、') + (hasOther ? '及其他专项工程。' : '。');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ciMajorText = ciMajorText + '×××××。';
|
||||||
|
}
|
||||||
|
let majorTextArr = paragraphLineBreakFor1112(ciMajorText, ctx);
|
||||||
|
majorTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum1, [descSheet.getRow(descRowNum1 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum1++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// 咨询服务类型
|
||||||
|
descRowNum2 = descRowNum1 + descRowNum2 + 1;
|
||||||
|
let ciServiceText = ` ${cindex + 1}.${ci.name}:` + ci.services.slice(0, -1).map(si => serviceList[si.id].name).join('、') + (ci.services.length > 1 ? '和' : '') + serviceList[ci.services.slice(-1)[0].id].name + '。';
|
||||||
|
let ciServiceTextArr = paragraphLineBreakFor1112(ciServiceText, ctx);
|
||||||
|
ciServiceTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum2, [descSheet.getRow(descRowNum2 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum2++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// 工作内容及要求
|
||||||
|
descRowNum3 = descRowNum2 + descRowNum3;
|
||||||
|
let ciTastNum = 1;
|
||||||
|
let ciTaskTitle = ` (${ArabicToChinese(cindex + 4)})${ci.name}工作内容及要求`;
|
||||||
|
let ciTaskTitleArr = paragraphLineBreakFor1112(ciTaskTitle, ctx);
|
||||||
|
ciTaskTitleArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ` 1.工作内容包括:`;
|
||||||
|
});
|
||||||
|
if (ci.hasPreTexts) {
|
||||||
|
prefixTexts.forEach(ti => {
|
||||||
|
let texts = paragraphLineBreakFor1112(` (${ciTastNum})${ti}。`, ctx);
|
||||||
|
texts.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
ciTastNum++;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
ci.services.forEach((si, sindex) => {
|
||||||
|
let siTextArr = paragraphLineBreakFor1112(` (${ciTastNum})${si.process == 1 ? '审核' : '编制'}${serviceList[si.id].name},具体工作内容包括:`, ctx);
|
||||||
|
siTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
ciTastNum++;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
si.tasks?.forEach((sti, stindex) => {
|
||||||
|
let stiTextArr = paragraphLineBreakFor1112(` ${stindex + 1})${sti}。`, ctx);
|
||||||
|
stiTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (ci.addtional && ci.addtional.det.length) {
|
||||||
|
ci.addtional.det.forEach(ai => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ` (${ciTastNum})${ai.id == 1 ? '负责协调工作,具体工作内容包括:' : '其他附加工作,具体工作内容包括:'}`;
|
||||||
|
ciTastNum++;
|
||||||
|
});
|
||||||
|
ai.tasks?.forEach((ati, atindex) => {
|
||||||
|
let atiTextArr = paragraphLineBreakFor1112(` ${atindex + 1})${ati}。`, ctx);
|
||||||
|
atiTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (ci.hasSufTexts) {
|
||||||
|
suffixTexts.forEach(ti => {
|
||||||
|
let texts = paragraphLineBreakFor1112(` (${ciTastNum})${ti}。`, ctx);
|
||||||
|
texts.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
ciTastNum++;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ` 2.质量标准:${ci.quality || '×××'}${/。$/.test(ci.quality) ? '' : '。'}`;
|
||||||
|
});
|
||||||
|
cusInsertRowFunc(descRowNum3, [descSheet.getRow(descRowNum3 - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum3++;
|
||||||
|
targetRow.getCell(1).value = ` 3.服务工期:${ci.duration || '×××'}${/。$/.test(ci.duration) ? '' : '。'}`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
descRowNum = descRowNum3;
|
||||||
|
}
|
||||||
|
descSheet.spliceRows(descRowNum, 1);
|
||||||
|
descRowNum += 3;
|
||||||
|
const methodNames = ['费率计取', '投资规模法', '用地规模法', '工作量法', '工时法', '数量单价'];
|
||||||
|
let allMethodsArr = [...allMethods].map(mid => methodNames[mid]);
|
||||||
|
let allMethodsTextArr = paragraphLineBreakFor1112(' 3.预算编制采用方法:' + allMethodsArr.slice(0, -1).join('、') + (allMethodsArr.length > 1 ? '和' : '') + allMethodsArr.slice(-1) + '。', ctx);
|
||||||
|
allMethodsTextArr.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (allReserveMethods[0].cid.length || allReserveMethods[4].length || allReserveMethods[5].length) {
|
||||||
|
if (allReserveMethods[0].coeSet.size == 1 && allReserveMethods[4].length == 0 && allReserveMethods[5].length == 0) {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = ` 4.预备费:本预算按${allReserveMethods[0].coe[0]}%费率计列预备费。`;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let rmta = [];
|
||||||
|
data.contracts.forEach((ci, cindex) => {
|
||||||
|
let ciTextArr = [];
|
||||||
|
if (allReserveMethods[0].cid.includes(cindex)) ciTextArr.push(`${ci.reserve.m0.coe}%费率`);
|
||||||
|
if (allReserveMethods[4].includes(cindex)) ciTextArr.push('工时法');
|
||||||
|
if (allReserveMethods[5].includes(cindex)) ciTextArr.push('数量单价');
|
||||||
|
if (ciTextArr.length) {
|
||||||
|
rmta.push(`${ci.name}按${ciTextArr.join('、')}计列`)
|
||||||
|
} else {
|
||||||
|
rmta.push(`${ci.name}不计列`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let rmtaa = paragraphLineBreakFor1112(` 4.预备费:${rmta.join(';')}。`, ctx);
|
||||||
|
rmtaa.forEach(ti => {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = ti;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = ' 4.预备费:本预算不计列预备费。';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
descRowNum++;
|
||||||
|
let contractFeeSummaryArr = paragraphLineBreakFor1112(` 本项目造价咨询服务总预算为${Number(data.fee).toLocaleString()}元。其中,${contractFeeSummary.join(',')}。计算过程详见相关计算表格。`, ctx);
|
||||||
|
descSheet.getRow(descRowNum).getCell(1).value = contractFeeSummaryArr[0];
|
||||||
|
descRowNum++;
|
||||||
|
if (contractFeeSummaryArr.length > 1) {
|
||||||
|
for (let i = 1; i < contractFeeSummaryArr.length; i++) {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = contractFeeSummaryArr[i];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data.desc) {
|
||||||
|
descRowNum++;
|
||||||
|
let otherDesc = paragraphLineBreakFor1112(` ${data.desc}${/。$/.test(ci.duration) ? '' : '。'}`, ctx);
|
||||||
|
descSheet.getRow(descRowNum).getCell(1).value = otherDesc[0];
|
||||||
|
descRowNum++;
|
||||||
|
if (otherDesc.length > 1) {
|
||||||
|
for (let i = 1; i < otherDesc.length; i++) {
|
||||||
|
cusInsertRowFunc(descRowNum, [descSheet.getRow(descRowNum - 1)], descSheet, (targetRow) => {
|
||||||
|
descRowNum++;
|
||||||
|
targetRow.getCell(1).value = otherDesc[i];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
descSheet.spliceRows(descRowNum, 2);
|
||||||
|
}
|
||||||
|
window.workbook = workbook;
|
||||||
return workbook;
|
return workbook;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
@ -2096,4 +2363,31 @@ function cloneCellValue(value) {
|
|||||||
return JSON.parse(JSON.stringify(value));
|
return JSON.parse(JSON.stringify(value));
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ArabicToChinese(Arabic_numerals) {
|
||||||
|
let strI = String(Arabic_numerals);
|
||||||
|
let mixNumerals = "";
|
||||||
|
let positionArr = ["", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万", "十", "百", "千", "亿"];
|
||||||
|
for (let j = 1; j <= strI.length; j++) {
|
||||||
|
let poistion = (strI.slice(-j)[0] == 0 && positionArr[j - 1] !== "万" && positionArr[j - 1] !== "亿") ? "" : positionArr[j - 1];
|
||||||
|
let strIJ = (strI.slice(-j)[0] == 0 && (positionArr[j - 1] == "万" || positionArr[j - 1] == "亿")) ? "" : strI.slice(-j)[0];
|
||||||
|
mixNumerals = strIJ + poistion + mixNumerals;
|
||||||
|
}
|
||||||
|
for (let j = Math.floor((strI.length - 1) / 4); j >= 1; j--) {
|
||||||
|
if (j % 2 !== 0) {
|
||||||
|
let regExp1 = new RegExp(`000+${positionArr[j * 4]}`, "g");
|
||||||
|
mixNumerals = mixNumerals.replaceAll(regExp1, "");
|
||||||
|
}
|
||||||
|
let regExp2 = new RegExp(`0+${positionArr[j * 4]}`, "g");
|
||||||
|
mixNumerals = mixNumerals.replaceAll(regExp2, `${positionArr[j * 4]}0`);
|
||||||
|
}
|
||||||
|
mixNumerals = mixNumerals.replaceAll(/00+/g, "0");
|
||||||
|
mixNumerals = mixNumerals.replace(/^1十/, "十");
|
||||||
|
mixNumerals = mixNumerals.replace(/0+$/, "");
|
||||||
|
mixNumerals = mixNumerals.replace(/[0-9]/g, match => {
|
||||||
|
const chineseNumerals = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
|
||||||
|
return chineseNumerals[parseInt(match)];
|
||||||
|
});
|
||||||
|
return mixNumerals;
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user