|
|
@@ -39,14 +39,11 @@ INTERFACE_EXPORT = (() => {
|
|
|
const isBidSubmission = exportKind === BID_SUBMISSION; // 是否是投标
|
|
|
const isControl = exportKind === CONTROL; // 是否是控制价
|
|
|
|
|
|
- // 节点定义--------------------------------
|
|
|
- const subArea = areaKey.split('@')[1];
|
|
|
-
|
|
|
- function CreateNode(nodeName) {
|
|
|
- Element.call(this, nodeName);
|
|
|
+// 节点定义------------------------------------------------------------------------------------------------------------
|
|
|
+ function CreateNode(nodeName, attrArr = []) {
|
|
|
+ Element.call(this, nodeName, attrArr);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
function GongCXX(information) {
|
|
|
const attrs = [
|
|
|
{ name: '项目编号', value: getValueByKey(information, 'projNum') },
|
|
|
@@ -67,7 +64,6 @@ INTERFACE_EXPORT = (() => {
|
|
|
];
|
|
|
Element.call(this, '工程信息', attrs);
|
|
|
}
|
|
|
-
|
|
|
function ZhaoBiaoXx(information) {
|
|
|
const attrs = [
|
|
|
{ name: '招标人', value: getValueByKey(information, 'tendereeName') },
|
|
|
@@ -141,614 +137,65 @@ INTERFACE_EXPORT = (() => {
|
|
|
Element.call(this, '投标信息', attrs);
|
|
|
}
|
|
|
|
|
|
- // 单位工程信息
|
|
|
- function Dwgcxx(tenderName, feature) {
|
|
|
- const attrs = [
|
|
|
- { name: 'Dwgcbh', value: getValueByKey(feature, 'unitProjNo'), minLen: 1, whiteSpace: WHITE_SPACE.COLLAPSE }, // 单位工程编号
|
|
|
- { name: 'Dwgcmc', value: tenderName }, // 单位工程名称
|
|
|
- ];
|
|
|
- Element.call(this, 'Dwgcxx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 取费信息(费率信息)
|
|
|
- function Qfxx() {
|
|
|
- Element.call(this, 'Qfxx');
|
|
|
- }
|
|
|
-
|
|
|
- // 计价费率表
|
|
|
- function JjFlb() {
|
|
|
- Element.call(this, 'JjFlb');
|
|
|
- }
|
|
|
-
|
|
|
- // 计价费率表明细,造价书费率页面左侧最底层数据
|
|
|
- function JjFlbMx(rootItem, item) {
|
|
|
- // 费率明细名称-编码映射表
|
|
|
- const FeeRateCodeMap = {
|
|
|
- '冬季施工增加费': 'DJF',
|
|
|
- '雨季施工增加费': 'YJF',
|
|
|
- '夜间施工增加费': 'YEF',
|
|
|
- '工地转移费': 'ZYF',
|
|
|
- '高原地区施工增加费': 'GYF',
|
|
|
- '风沙地区施工增加费': 'FSF',
|
|
|
- '沿海地区施工增加费': 'YHF',
|
|
|
- '行车干扰施工增加费': 'XCF',
|
|
|
- '施工辅助费': 'SFF',
|
|
|
- '养老保险费': 'YLF',
|
|
|
- '失业保险费': 'SYF',
|
|
|
- '医疗保险费': 'YBF',
|
|
|
- '住房公积金': 'ZFF',
|
|
|
- '工伤保险费': 'GSF',
|
|
|
- '基本费用': 'JBF',
|
|
|
- '主副食运费补贴': 'YFF',
|
|
|
- '职工探亲补贴': 'TQF',
|
|
|
- '职工取暖补贴': 'QNF',
|
|
|
- '财务费用': 'CWF',
|
|
|
- '利润': 'LR',
|
|
|
- '税金': 'SJ',
|
|
|
- };
|
|
|
- // 费率工程名称-取费类别映射表
|
|
|
- const FeeRateTypeMap = {
|
|
|
- '土方': 1,
|
|
|
- '石方': 3,
|
|
|
- '运输': 2,
|
|
|
- '路面': 4,
|
|
|
- '隧道': 11,
|
|
|
- '构造物Ⅰ': 5,
|
|
|
- '构造物Ⅰ(不计冬)': 16,
|
|
|
- '构造物Ⅱ': 6,
|
|
|
- '构造物Ⅲ(桥梁)': 9,
|
|
|
- '构造物Ⅲ(除桥以外不计雨夜)': 8,
|
|
|
- '技术复杂大桥': 10,
|
|
|
- '钢材及钢结构(桥梁)': 12,
|
|
|
- '钢材及钢结构(除桥以外不计夜)': 13,
|
|
|
- '费率为0': 17,
|
|
|
- '路面(不计雨)': 4,
|
|
|
- '构造物Ⅰ(不计雨)': 16,
|
|
|
- '构造物Ⅲ(除桥以外)': 8,
|
|
|
- '钢材及钢结构(除桥以外)': 13,
|
|
|
- '设备': 15,
|
|
|
- '量价': 14,
|
|
|
- };
|
|
|
- const rate = isEmptyVal(item.rate) ? '100' : item.rate; // 为空时输出=100,为0时输出=0
|
|
|
- /* if (!FeeRateTypeMap[rootItem.name]) {
|
|
|
- debugger;
|
|
|
- } */
|
|
|
- const attrs = [
|
|
|
- { name: 'Bm', value: FeeRateCodeMap[item.name] }, // 编码
|
|
|
- { name: 'Name', value: item.name }, // 名称
|
|
|
- { name: 'Fl', value: rate, type: TYPE.DECIMAL }, // 费率
|
|
|
- { name: 'Qflb', value: FeeRateTypeMap[rootItem.name], type: TYPE.INT }, // 取费类别
|
|
|
- ];
|
|
|
- Element.call(this, 'JjFlbMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 计价费率项
|
|
|
- function JjFlx() {
|
|
|
- Element.call(this, 'JjFlx');
|
|
|
- }
|
|
|
-
|
|
|
- // 计价费率项明细,造价书费率页面右侧最顶层数据
|
|
|
- function JjFlxMx(item) {
|
|
|
- // 编码取名称拼音首字母
|
|
|
- const allHanName = getHan(item.name || '');
|
|
|
- const code = pinyinUtil.getFirstLetter(allHanName).toLowerCase();
|
|
|
- let value;
|
|
|
- if (isDef(item.value)) {
|
|
|
- value = item.value;
|
|
|
- } else {
|
|
|
- const selected = item.optionList.find(item => item.selected);
|
|
|
- value = selected.name;
|
|
|
- }
|
|
|
- const attrs = [
|
|
|
- { name: 'Bm', value: code }, // 编码
|
|
|
- { name: 'Mc', value: item.name }, // 名称
|
|
|
- { name: 'ShuZhi', value: value }, // 数值
|
|
|
- ];
|
|
|
- Element.call(this, 'JjFlxMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 清单项目
|
|
|
- function QdXm() {
|
|
|
- Element.call(this, 'QdXm');
|
|
|
- }
|
|
|
- // 标题类别:1=100~700清单合计,2=暂估价合计,3=清单不包含暂估价合计,4=计日工,5=暂列金额(不含计日工总额)),6=投标报价,0=其他
|
|
|
- const BillsTitleType = {
|
|
|
- [fixedFlag.ONE_SEVEN_BILLS]: '1',
|
|
|
- [fixedFlag.PROVISIONAL_TOTAL]: '2',
|
|
|
- [fixedFlag.BILLS_TOTAL_WT_PROV]: '3',
|
|
|
- [fixedFlag.DAYWORK_LABOR]: '4',
|
|
|
- [fixedFlag.PROVISIONAL]: '5',
|
|
|
- [fixedFlag.TOTAL_COST]: '6',
|
|
|
- };
|
|
|
- // 清单标题 造价书的第一层数据。
|
|
|
- function QdBt(node) {
|
|
|
- const row = node.row();
|
|
|
- const fee = isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee')
|
|
|
- const attrs = [
|
|
|
- { name: 'Xh', value: row, type: TYPE.INT }, // 序号
|
|
|
- { name: 'Bm', value: node.data.code }, // 编码
|
|
|
- { name: 'Name', value: node.data.name }, // 名称
|
|
|
- { name: 'Je', value: fee, type: TYPE.DECIMAL }, // 金额
|
|
|
- { name: 'Code', value: `F${row}` }, // 行引用
|
|
|
- { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
|
|
|
- { name: 'Lb', value: BillsTitleType[node.getFlag()], type: TYPE.INT }, // 类别
|
|
|
- { name: 'Bz', value: node.data.remark }, // 备注
|
|
|
- ];
|
|
|
- Element.call(this, 'QdBt', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 清单明细 (只有100-700章清单标题输出)
|
|
|
- function QdMx(node) {
|
|
|
- const row = node.row();
|
|
|
- const attrs = [
|
|
|
- { name: 'Xh', value: row, type: TYPE.INT }, // 序号
|
|
|
- { name: 'Qdbm', value: node.data.code, minLen: 1 }, // 编码
|
|
|
- { name: 'Name', value: node.data.name }, // 名称
|
|
|
- { name: 'Dw', value: node.data.unit }, // 单位
|
|
|
- { name: 'Sl', value: node.data.quantity, type: TYPE.DECIMAL }, // 工程量
|
|
|
- { name: 'Sl2', value: '0', type: TYPE.DECIMAL }, // 工程量2
|
|
|
- { name: 'Rgf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'marketLabour.tenderTotalFee'), type: TYPE.DECIMAL }, // 人工费
|
|
|
- { name: 'Clf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'marketMaterial.tenderTotalFee'), type: TYPE.DECIMAL }, // 材料费
|
|
|
- { name: 'Jxf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'marketMachine.tenderTotalFee'), type: TYPE.DECIMAL }, // 机械费
|
|
|
- { name: 'Sbf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'marketEquipment.tenderTotalFee'), type: TYPE.DECIMAL }, // 设备费
|
|
|
- { name: 'Csf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL }, // 措施费
|
|
|
- { name: 'Glf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'manage.tenderTotalFee'), type: TYPE.DECIMAL }, // 企业管理费
|
|
|
- { name: 'Gf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'force.tenderTotalFee'), type: TYPE.DECIMAL }, // 规费
|
|
|
- { name: 'Lr', value: isBidInvitation ? '0' : getFee(node.data.fees, 'profit.tenderTotalFee'), type: TYPE.DECIMAL }, // 利润
|
|
|
- { name: 'Sj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'tax.tenderTotalFee'), type: TYPE.DECIMAL }, // 税金
|
|
|
- { name: 'Zhdj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderUnitFee'), type: TYPE.DECIMAL }, // 单价
|
|
|
- { name: 'Zhhj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee'), type: TYPE.DECIMAL }, // 合价
|
|
|
- { name: 'Zgj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'estimate.tenderTotalFee'), type: TYPE.DECIMAL }, // 暂估价
|
|
|
- { name: 'Iszg', value: node.data.specialProvisional === '专业工程', type: TYPE.BOOL }, // 是否暂定 如果专项暂定列选择了“专业工程”,则输出true,否则是false。
|
|
|
- { name: 'Djfx', value: !!node.data.unitPriceAnalysis, type: TYPE.BOOL }, // 单价分析
|
|
|
- { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
|
|
|
- { name: 'Bl', value: '' }, // 变量
|
|
|
- { name: 'Bz', value: node.data.remark }, // 备注
|
|
|
- ];
|
|
|
- Element.call(this, 'QdMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 定额组价
|
|
|
- function Qdxdezj() {
|
|
|
- Element.call(this, 'Qdxdezj');
|
|
|
- }
|
|
|
-
|
|
|
- // 定额租价明细 招标文件不输出
|
|
|
- function QdxdezjMx(ration) {
|
|
|
- const typeMap = {
|
|
|
- [RationType.RATION]: '1',
|
|
|
- [RationType.VOLUME_PRICE + GljType.LABOUR]: '2',
|
|
|
- [RationType.VOLUME_PRICE + GljType.GENERAL_MATERIAL]: '3',
|
|
|
- [RationType.VOLUME_PRICE + GljType.GENERAL_MACHINE]: '4',
|
|
|
- [RationType.VOLUME_PRICE + GljType.EQUIPMENT]: '2',
|
|
|
- };
|
|
|
- const typeKey = (ration.type || '') + (ration.subType || '');
|
|
|
- const type = typeMap[typeKey];
|
|
|
- const attrs = [
|
|
|
- { name: 'Debm', value: ration.code }, // 编码
|
|
|
- { name: 'Mc', value: ration.name }, // 名称
|
|
|
- { name: 'Dw', value: ration.unit }, // 单位
|
|
|
- { name: 'Sl', value: ration.tenderQuantity }, // 工程量
|
|
|
- { name: 'Dj', value: getFee(ration.fees, 'common.tenderUnitFee'), type: TYPE.DECIMAL }, // 单价
|
|
|
- { name: 'Hj', value: getFee(ration.fees, 'common.tenderTotalFee'), type: TYPE.DECIMAL }, // 合价
|
|
|
- { name: 'Rgf', value: getFee(ration.fees, 'marketLabour.tenderTotalFee'), type: TYPE.DECIMAL }, // 人工费
|
|
|
- { name: 'Clf', value: getFee(ration.fees, 'marketMaterial.tenderTotalFee'), type: TYPE.DECIMAL }, // 材料费
|
|
|
- { name: 'Jxf', value: getFee(ration.fees, 'marketMachine.tenderTotalFee'), type: TYPE.DECIMAL }, // 机械费
|
|
|
- { name: 'Sbf', value: getFee(ration.fees, 'marketEquipment.tenderTotalFee'), type: TYPE.DECIMAL }, // 设备费
|
|
|
- { name: 'Csf', value: getFee(ration.fees, 'measure.tenderTotalFee'), type: TYPE.DECIMAL }, // 措施费
|
|
|
- { name: 'Glf', value: getFee(ration.fees, 'manage.tenderTotalFee'), type: TYPE.DECIMAL }, // 企业管理费
|
|
|
- { name: 'Gf', value: getFee(ration.fees, 'force.tenderTotalFee'), type: TYPE.DECIMAL }, // 规费
|
|
|
- { name: 'Lr', value: getFee(ration.fees, 'profit.tenderTotalFee'), type: TYPE.DECIMAL }, // 利润
|
|
|
- { name: 'Sj', value: getFee(ration.fees, 'tax.tenderTotalFee'), type: TYPE.DECIMAL }, // 税金
|
|
|
- { name: 'Delb', value: type, type: TYPE.INT }, // 取定额/量价/设备的类别。(1=普通定额,2=人工,3=材料,4=机械,5=设备)
|
|
|
- { name: 'Iszd', value: 'false', type: TYPE.BOOL }, // 暂时,全部取fals
|
|
|
+ // 生成标段工程
|
|
|
+ function CreateGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, Num){
|
|
|
+ let attrs0 = [
|
|
|
+ { name: '序号', value: Num },
|
|
|
+ { name: '标段名称', value: tenderData.name },
|
|
|
+ { name: '金额', value: projectData.summaryInfo[tenderData.ID].totalCost }
|
|
|
];
|
|
|
- Element.call(this, 'QdxdezjMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 定额人材机含量
|
|
|
- function Qdxdercjhl() {
|
|
|
- Element.call(this, 'Qdxdercjhl');
|
|
|
- }
|
|
|
-
|
|
|
- // 定额人材机含量明细
|
|
|
- function QdxdercjhlMx(rcjID, quantity) {
|
|
|
- const attrs = [
|
|
|
- { name: 'RcjId', value: rcjID }, // 人材机资源ID
|
|
|
- { name: 'Sl', value: quantity, type: TYPE.DECIMAL }, // 消耗量
|
|
|
- ]
|
|
|
- Element.call(this, 'QdxdercjhlMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 清单人材机含量
|
|
|
- function Qdxrcjhl() {
|
|
|
- Element.call(this, 'Qdxrcjhl');
|
|
|
- }
|
|
|
|
|
|
- // 清单人材机含量明细
|
|
|
- function QdxrcjhlMx(item) {
|
|
|
- const attrs = [
|
|
|
- { name: 'RcjId', value: item.rcjID }, // 人材机资源ID
|
|
|
- { name: 'Rcjhl', value: item.contain, type: TYPE.DECIMAL }, // 含量:取叶子清单下所有的人材机的含量,=各定额下的人材机总消耗量之和,再除以清单工程量
|
|
|
- { name: 'Rcjhj', value: item.totalPrice, type: TYPE.DECIMAL }, // 合价:人材机含量*人材机预算价
|
|
|
- { name: 'Zgjbz', value: item.isEvaluate, type: TYPE.BOOL }, // 是否暂估,根据资源ID,读取工料机汇总界面对应的“是否暂估”
|
|
|
- { name: 'Zcbz', value: 'false', type: TYPE.BOOL }, // 主材标记,公路上无此概念,默认输出=fales
|
|
|
- { name: 'Zyclbz', value: item.isMainMaterial, type: TYPE.BOOL }, // 根据资源ID,读取工料机汇总界面对应的“主要材料”
|
|
|
- ]
|
|
|
- Element.call(this, 'QdxrcjhlMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 计日工
|
|
|
- function Jrg() {
|
|
|
- Element.call(this, 'Jrg');
|
|
|
- }
|
|
|
-
|
|
|
- // 计日工标题
|
|
|
- function JrgBt(node) {
|
|
|
- const typeMap = {
|
|
|
- [fixedFlag.LABOUR_SERVICE]: '1',
|
|
|
- [fixedFlag.MATERIAL]: '2',
|
|
|
- [fixedFlag.CONSTRUCTION_MACHINE]: '3',
|
|
|
- };
|
|
|
- const attrs = [
|
|
|
- { name: 'Name', value: node.data.name }, // 名称
|
|
|
- { name: 'Je', value: isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee'), type: TYPE.DECIMAL }, // 金额
|
|
|
- { name: 'Lb', value: typeMap[node.getFlag()], type: TYPE.INT }, // 类别:1=劳务;2=材料;3=施工机械
|
|
|
- { name: 'Bz', value: node.data.remark }, // 备注
|
|
|
- ];
|
|
|
- Element.call(this, 'JrgBt', attrs);
|
|
|
- }
|
|
|
+ const attrs1 = [{ name: '唯一标识-Guid', value: tenderData._id }]; // 公路标段工程
|
|
|
+ const gongLBDGC = new CreateNode('公路标段工程', attrs0.concat(attrs1));
|
|
|
+ gongLGCSJ.children.push(gongLBDGC);
|
|
|
+ const gongCLQDB = new CreateNode('工程量清单表');
|
|
|
+ const jiRGXXB = new CreateNode('计日工信息表');
|
|
|
+ const ZaoJHZB = new CreateNode('造价汇总表');
|
|
|
+ const RenCJHZ = new CreateNode('人材机汇总');
|
|
|
+ gongLBDGC.children = [gongCLQDB, jiRGXXB, ZaoJHZB, RenCJHZ];
|
|
|
|
|
|
- // 计日工明细
|
|
|
- function JrgMx(node) {
|
|
|
- const attrs = [
|
|
|
- { name: 'Bh', value: node.data.code }, // 编码
|
|
|
- { name: 'Name', value: node.data.name }, // 名称
|
|
|
- { name: 'Dw', value: node.data.unit }, // 单位
|
|
|
- { name: 'Sl', value: node.data.quantity }, // 工程量
|
|
|
- { name: 'Dj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee'), type: TYPE.DECIMAL }, // 单价
|
|
|
- { name: 'Hj', value: isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderUnitFee'), type: TYPE.DECIMAL }, // 合价
|
|
|
- ];
|
|
|
- Element.call(this, 'JrgMx', attrs);
|
|
|
+ const attrs2 = [{ name: '备注', value: '' }];
|
|
|
+ const gongLGCHZMX = new CreateNode('公路工程汇总明细', attrs0.concat(attrs2));
|
|
|
+ gongLGCHZ.children.push(gongLGCHZMX);
|
|
|
}
|
|
|
|
|
|
- // 暂估材料表、评标材料表
|
|
|
- function gljRefRoot(eleName) {
|
|
|
- Element.call(this, eleName);
|
|
|
- }
|
|
|
-
|
|
|
- // 暂估材料表、评标材料表明细
|
|
|
- function gljRefElement(eleName, glj) {
|
|
|
- const attrs = [
|
|
|
- { name: 'Xh', value: glj.seq }, // 序号
|
|
|
- { name: 'RcjId', value: projectGLJIDToRcjID[glj.projectGLJID] }, // 资源ID
|
|
|
- { name: 'Bm', value: glj.code }, // 编码
|
|
|
- { name: 'Mc', value: glj.name }, // 名称
|
|
|
- { name: 'Ggxh', value: glj.specs }, // 规格型号
|
|
|
- { name: 'Dw', value: glj.unit }, // 单位
|
|
|
- { name: 'Sl', value: BID_INVITATION ? '0' : glj.quantity, type: TYPE.DECIMAL }, // 工程量
|
|
|
- { name: 'Dj', value: glj.marketPrice, type: TYPE.DECIMAL }, // 暂定价、单价
|
|
|
- { name: 'Hj', value: BID_INVITATION ? '0' : glj.totalPrice, type: TYPE.DECIMAL }, // 合价
|
|
|
- { name: 'Bz', value: glj.remark }, // 备注
|
|
|
- ];
|
|
|
- Element.call(this, eleName, attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 人材机汇总
|
|
|
- function Rcjhz() {
|
|
|
- Element.call(this, 'Rcjhz');
|
|
|
- }
|
|
|
-
|
|
|
- // 人材机汇总明细
|
|
|
- function RcjhzMx(glj) {
|
|
|
- const rootTypeReg = /\d/;
|
|
|
- let rootType = rootTypeReg.exec(glj.type)[0];
|
|
|
- if (!['1', '2', '3'].includes(rootType)) {
|
|
|
- rootType = '2';
|
|
|
- }
|
|
|
- const attrs = [
|
|
|
- { name: 'RcjId', value: projectGLJIDToRcjID[glj.id] }, // 资源ID
|
|
|
- { name: 'RcjBm', value: glj.code }, // 编码
|
|
|
- { name: 'Name', value: glj.name }, // 名称
|
|
|
- { name: 'Ggxh', value: glj.specs }, // 规格型号
|
|
|
- { name: 'Dw', value: glj.unit }, // 单位
|
|
|
- { name: 'Dj', value: glj.priceInfo.tenderPrice, type: TYPE.DECIMAL }, // 预算价,调后
|
|
|
- { name: 'Sl', value: glj.tenderQuantity, type: TYPE.DECIMAL }, // 总消耗量
|
|
|
- { name: 'Hj', value: glj.totalPrice, type: TYPE.DECIMAL }, // 合价,人材料总消耗量*预算价
|
|
|
- { name: 'Cd', value: '' }, // 产地
|
|
|
- { name: 'Gycs', value: '' }, // 厂商
|
|
|
- { name: 'Rcjlb', value: rootType, type: TYPE.INT }, // 人材机类型 1=人工;2=材料;3=机械
|
|
|
- { name: 'Jgbz', value: 'false', type: TYPE.BOOL }, // 供材方
|
|
|
- { name: 'Zyclbz', value: !!glj.is_main_material, type: TYPE.BOOL }, // 主要材料
|
|
|
- { name: 'Zgjbz', value: !!glj.is_evaluate, type: TYPE.BOOL }, // 是否暂估
|
|
|
- { name: 'Zcbz', value: 'false', type: TYPE.BOOL }, // 主材标记
|
|
|
- ];
|
|
|
- Element.call(this, 'RcjhzMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 配比组成
|
|
|
- function PbZc() {
|
|
|
- Element.call(this, 'PbZc');
|
|
|
- }
|
|
|
-
|
|
|
- // 配比明细
|
|
|
- function PbZcMx(ratio) {
|
|
|
- const attrs = [
|
|
|
- { name: 'RcjId', value: projectGLJIDToRcjID[ratio.projectGLJID] }, // 组成物对应人材机汇总的资源ID
|
|
|
- { name: 'Sl', value: ratio.consumption, type: TYPE.DECIMAL }, // 组成物消耗量
|
|
|
- ];
|
|
|
- Element.call(this, 'PbZcMx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 校验信息
|
|
|
- function Jyxx(cpuID, diskID, macID, toMD5Value) {
|
|
|
- const attrs = [
|
|
|
- { name: 'SoftName', value: '纵横创新软件有限公司' }, // 公司名
|
|
|
- { name: 'SoftNum', value: md5(toMD5Value) }, // 校验数据
|
|
|
- { name: 'MacAdress', value: macID }, // mac地址
|
|
|
- { name: 'DogNum', value: userID }, // 加密锁号,取用户ID
|
|
|
- { name: 'ComputerName', value: USER_NAME }, // 计算机名,取用户名称
|
|
|
- { name: 'HDDSerial', value: diskID }, // 硬盘序列号
|
|
|
- { name: 'CPUSerial', value: cpuID }, // CPU序列号
|
|
|
- ];
|
|
|
- Element.call(this, 'Jyxx', attrs);
|
|
|
- }
|
|
|
-
|
|
|
- // 组装数据 --------------------------------------
|
|
|
-
|
|
|
- // 组装建设项目数据
|
|
|
- function setupConstruction(constructionData) {
|
|
|
- const information = constructionData.property && constructionData.property.basicInformation || [];
|
|
|
- const summaryInfo = constructionData.summaryInfo[constructionData.ID];
|
|
|
+ // 组装主体框架数据
|
|
|
+ function setupConstruction() {
|
|
|
+ const information = projectData.property && projectData.property.basicInformation || [];
|
|
|
+ const summaryInfo = projectData.summaryInfo[projectData.ID];
|
|
|
|
|
|
const chiZGLGC = new CreateNode('池州公路工程');
|
|
|
-
|
|
|
- chiZGLGC.children.push(new GongCXX(information));
|
|
|
-
|
|
|
+ const gongCXX = new GongCXX(information); // 工程信息
|
|
|
const zhaoTBXX = new CreateNode('招投标信息');
|
|
|
- chiZGLGC.children.push(zhaoTBXX);
|
|
|
-
|
|
|
const gongLGCSJ = new CreateNode('公路工程数据');
|
|
|
- chiZGLGC.children.push(gongLGCSJ);
|
|
|
+ chiZGLGC.children = [gongCXX, zhaoTBXX, gongLGCSJ];
|
|
|
|
|
|
- if (isBidInvitation) {
|
|
|
+ if (isBidInvitation)
|
|
|
zhaoTBXX.children.push(new ZhaoBiaoXx(information));
|
|
|
- } else if (isControl) {
|
|
|
+ else if (isControl)
|
|
|
zhaoTBXX.children.push(new ZhaoBiaoKzXx(information, summaryInfo.totalCost));
|
|
|
- } else {
|
|
|
+ else
|
|
|
zhaoTBXX.children.push(new TouBiaoXx(information, summaryInfo.totalCost));
|
|
|
- };
|
|
|
-
|
|
|
- // 将单位工程工程特征中,单项工程编号、名称相同的,插入到建设项目和分段(单位工程)的中间层。
|
|
|
- const midLayerMap = {}; // 单项工程key(code@name)与单项工程节点映射
|
|
|
- debugger;
|
|
|
- for (const tenderData of constructionData.children) {
|
|
|
- const gongLBDGC = new CreateNode('公路标段工程');
|
|
|
- gongLGCSJ.children.push(gongLBDGC);
|
|
|
- const attrs = [
|
|
|
- { name: '序号', value: getValueByKey(information, '') },
|
|
|
- { name: '标段名称', value: getValueByKey(information, '') },
|
|
|
- { name: '金额', value: getValueByKey(information, '') },
|
|
|
- { name: '唯一标识-Guid', value: getValueByKey(information, 'xxxxxxxxxxxxxxxxxx') }
|
|
|
- ];
|
|
|
|
|
|
- const feature = tenderData.property && tenderData.property.projectFeature || [];
|
|
|
- const midLayerCode = getValueByKey(feature, 'singleProjNo');
|
|
|
- const midLayerName = getValueByKey(feature, 'singleProjName');
|
|
|
- // const midLayerKey = `${midLayerCode}@${midLayerName}`;
|
|
|
- // if (!midLayerMap[midLayerKey]) {
|
|
|
- // chiZGLGC.children.push(midLayerMap[midLayerKey] = new Dxgcxx(midLayerCode, midLayerName));
|
|
|
- // }
|
|
|
- // midLayerMap[midLayerKey].children.push(setupTender(tenderData, feature));
|
|
|
- }
|
|
|
const gongLGCHZ = new CreateNode('公路工程汇总');
|
|
|
gongLGCSJ.children.push(gongLGCHZ);
|
|
|
- // 校验信息
|
|
|
- const [cpuID, diskID, macID] = generateHardwareId().split(';');
|
|
|
+
|
|
|
+ let n = 0;
|
|
|
+ for (const tenderData of projectData.children) {
|
|
|
+ n++;
|
|
|
+ CreateGLBDGC(tenderData, gongLGCSJ, gongLGCHZ, n);
|
|
|
+ }
|
|
|
+ gongLGCSJ.children.push(gongLGCSJ.children.shift());
|
|
|
+
|
|
|
const suffix = INTERFACE_CONFIG[areaKey]['fileSuffix'][exportKind];
|
|
|
- // 需要md5的值:MD5(“WHGLZTB”+项目名称+机器码+加密锁锁号)机器码取mac地址,加密锁锁号取用户账号id
|
|
|
- const toMD5Suffix = suffix.split('.')[1];
|
|
|
- const toMD5Value = `${toMD5Suffix}${constructionData.name}${macID}${userID}`;
|
|
|
- // chiZGLGC.children.push(new Jyxx(cpuID, diskID, macID, suffix, toMD5Value));
|
|
|
return [{
|
|
|
data: chiZGLGC,
|
|
|
exportKind,
|
|
|
- fileName: `${constructionData.name}${suffix}`
|
|
|
+ fileName: `${projectData.name}${suffix}`
|
|
|
}];
|
|
|
}
|
|
|
|
|
|
- // getData接口数据
|
|
|
- let curDetail;
|
|
|
-
|
|
|
- // 需要先设置项目人材机的关联ID(从1开始),因为定额人材机等一些节点需要用到这个关联ID
|
|
|
- const projectGLJIDToRcjID = {}; // 项目人材机ID与新生成的整形ID映射
|
|
|
- const projectGLJMap = {}; // 项目人材机与项目人材机数据映射
|
|
|
-
|
|
|
- // 组装单位工程数据
|
|
|
- function setupTender(tenderData, feature) {
|
|
|
- curDetail = tenderDetailMap[tenderData.ID];
|
|
|
- curDetail.projectGLJ.datas.gljList.forEach((glj, index) => {
|
|
|
- projectGLJIDToRcjID[glj.id] = index + 1;
|
|
|
- projectGLJMap[glj.id] = glj;
|
|
|
- });
|
|
|
- const dwgcxx = new Dwgcxx(tenderData.name, feature);
|
|
|
- dwgcxx.children.push(
|
|
|
- setupFeeRate(curDetail.FeeRate),
|
|
|
- setupBills(curDetail.mainTree),
|
|
|
- ...setupGLJList(curDetail)
|
|
|
- );
|
|
|
- return dwgcxx;
|
|
|
- }
|
|
|
-
|
|
|
- // 组装费率数据
|
|
|
- function setupFeeRate(feeRateDetail) {
|
|
|
- const qfxx = new Qfxx();
|
|
|
- const jjflb = new JjFlb();
|
|
|
- // 费率界面左侧底层数据
|
|
|
- let curRootItem;
|
|
|
- feeRateDetail.datas.rates.forEach(item => {
|
|
|
- if (!item.ParentID) {
|
|
|
- curRootItem = item;
|
|
|
- } else if (!item.sum) { // 最底层
|
|
|
- jjflb.children.push(new JjFlbMx(curRootItem, item));
|
|
|
- }
|
|
|
- });
|
|
|
- // 费率界面右侧顶层数据
|
|
|
- const jjflx = new JjFlx();
|
|
|
- const flxmxData = feeRateDetail
|
|
|
- .getAllSubRates()
|
|
|
- .filter(item => !item.isSub)
|
|
|
- .map(item => new JjFlxMx(item));
|
|
|
- jjflx.children.push(...flxmxData);
|
|
|
-
|
|
|
- qfxx.children.push(jjflb, jjflx);
|
|
|
- return qfxx;
|
|
|
- }
|
|
|
-
|
|
|
- // 组装清单数据
|
|
|
- function setupBills(mainTree) {
|
|
|
- const qdxm = new QdXm();
|
|
|
- const qdbtData = mainTree.roots.map(node => new QdBt(node));
|
|
|
- qdxm.children.push(...qdbtData);
|
|
|
-
|
|
|
- mainTree.roots.forEach(node => {
|
|
|
- const flag = node.getFlag();
|
|
|
- const qdbt = new QdBt(node);
|
|
|
- if (flag === fixedFlag.ONE_SEVEN_BILLS) { // 100章到700章清单需要输出详细数据
|
|
|
- qdbt.children.push(...setupSubBills(node.children));
|
|
|
- } else if (flag === fixedFlag.DAYWORK_LABOR) {
|
|
|
- qdbt.children.push(setupDaywork(node.children));
|
|
|
- }
|
|
|
- qdxm.children.push(qdbt);
|
|
|
- });
|
|
|
-
|
|
|
- function setupSubBills(nodes) {
|
|
|
- const rst = [];
|
|
|
- nodes.forEach(node => {
|
|
|
- const qdmx = new QdMx(node);
|
|
|
- rst.push(qdmx);
|
|
|
- const subIsRations = node.children.length && !node.source.children.length;
|
|
|
- if (subIsRations) {
|
|
|
- qdmx.children.push(...setupRations(node.children));
|
|
|
- qdmx.children.push(...setupBillsContain(node.data));
|
|
|
- } else {
|
|
|
- qdmx.children.push(...setupSubBills(node.children));
|
|
|
- }
|
|
|
- });
|
|
|
- return rst;
|
|
|
- }
|
|
|
-
|
|
|
- function setupDaywork(nodes) {
|
|
|
- const dayworkRoot = new Jrg();
|
|
|
- const dayworkBT = nodes.map(node => {
|
|
|
- const bt = new JrgBt(node);
|
|
|
- const dayworkMX = node.children.map(child => new JrgMx(child));
|
|
|
- bt.children.push(...dayworkMX);
|
|
|
- return bt;
|
|
|
- });
|
|
|
- dayworkRoot.children.push(...dayworkBT);
|
|
|
- return dayworkRoot;
|
|
|
- }
|
|
|
-
|
|
|
- return qdxm;
|
|
|
- }
|
|
|
-
|
|
|
- // 组装定额、定额人材机数据
|
|
|
- function setupRations(rationNodes) {
|
|
|
- // 招标文件不输出
|
|
|
- if (isBidInvitation) {
|
|
|
- return [];
|
|
|
- }
|
|
|
- const rationRoot = new Qdxdezj();
|
|
|
- const rationEles = rationNodes.map(node => {
|
|
|
- const rationEle = new QdxdezjMx(node.data);
|
|
|
- /* // 定额人材机
|
|
|
- let rationGLJList = curDetail.ration_glj.datas.filter(glj => glj.rationID === node.data.ID);
|
|
|
- rationGLJList = gljUtil.sortRationGLJ(rationGLJList); */
|
|
|
- const rationGLJRoot = new Qdxdercjhl();
|
|
|
- const rationGLJEles = node.data.rationGLJList.map(glj => new QdxdercjhlMx(projectGLJIDToRcjID[glj.projectGLJID], glj.tenderQuantity));
|
|
|
- rationGLJRoot.children.push(...rationGLJEles);
|
|
|
- rationEle.children.push(rationGLJRoot);
|
|
|
- return rationEle;
|
|
|
- });
|
|
|
- rationRoot.children.push(...rationEles);
|
|
|
- return [rationRoot];
|
|
|
- }
|
|
|
-
|
|
|
- // 组装清单人材机含量数据
|
|
|
- function setupBillsContain(bills) {
|
|
|
- if (isBidInvitation) {
|
|
|
- return [];
|
|
|
- }
|
|
|
- // 读取清单下的人材机,先将各定额下的人材机汇总,相同的合并(相同的项目人材机ID)
|
|
|
- const gljList = curDetail.ration_glj.datas.filter(glj => glj.billsItemID === bills.ID);
|
|
|
- if (!gljList) {
|
|
|
- return [];
|
|
|
- }
|
|
|
- const map = {};
|
|
|
- gljList.forEach(glj => {
|
|
|
- if (!map[glj.projectGLJID]) {
|
|
|
- const projectGLJ = projectGLJMap[glj.projectGLJID];
|
|
|
- map[glj.projectGLJID] = {
|
|
|
- rcjID: projectGLJIDToRcjID[glj.projectGLJID],
|
|
|
- totalQuantity: glj.tenderQuantity,
|
|
|
- price: glj.tenderPrice,
|
|
|
- isEvaluate: !!projectGLJ.is_evaluate,
|
|
|
- isMainMaterial: !!projectGLJ.is_main_material
|
|
|
- };
|
|
|
- } else {
|
|
|
- map[glj.projectGLJID].totalQuantity = scMathUtil.roundTo(map[glj.projectGLJID].totalQuantity + glj.tenderQuantity, -6);
|
|
|
- }
|
|
|
- });
|
|
|
- const containItems = Object
|
|
|
- .values(map)
|
|
|
- .map(glj => {
|
|
|
- const contain = glj.totalQuantity / (bills.quantity || 1);
|
|
|
- return {
|
|
|
- rcjID: glj.rcjID,
|
|
|
- contain: scMathUtil.roundTo(contain, -6), // 固定取6位
|
|
|
- totalPrice: scMathUtil.roundTo(contain * glj.price, -2), // 固定取2位
|
|
|
- isEvaluate: glj.isEvaluate,
|
|
|
- isMainMaterial: glj.isMainMaterial
|
|
|
- };
|
|
|
- });
|
|
|
- const root = new Qdxrcjhl();
|
|
|
- root.children.push(...containItems.map(item => new QdxrcjhlMx(item)));
|
|
|
- return [root]
|
|
|
- }
|
|
|
-
|
|
|
- // 组装人材机汇总相关表数据
|
|
|
- function setupGLJList(tenderDetail) {
|
|
|
- // 暂估材料
|
|
|
- const zgcl = new gljRefRoot('ZgCl');
|
|
|
- zgcl.children = tenderDetail.evaluateMaterialData.map(glj => new gljRefElement('ZgClMx', glj));
|
|
|
-
|
|
|
- // 评标材料
|
|
|
- const jpcl = new gljRefRoot('JpCl');
|
|
|
- jpcl.children = tenderDetail.bidMaterialData.map(glj => new gljRefElement('JpClMx', glj));
|
|
|
- if (isBidInvitation) {
|
|
|
- return [zgcl, jpcl];
|
|
|
- }
|
|
|
- // 人材机汇总 (招标不导出)
|
|
|
- const rcjhz = new Rcjhz();
|
|
|
- rcjhz.children = tenderDetail.projectGLJ.datas.gljList.map(pGLJ => {
|
|
|
- const gljElement = new RcjhzMx(pGLJ);
|
|
|
- // 组成物
|
|
|
- const connectKey = gljUtil.getIndex(pGLJ, gljKeyArray);
|
|
|
- const ratioData = tenderDetail.projectGLJ.datas.mixRatioMap[connectKey];
|
|
|
- if (ratioData && ratioData.length) {
|
|
|
- const pbzc = new PbZc();
|
|
|
- pbzc.children = ratioData.map(ratio => new PbZcMx(ratio));
|
|
|
- gljElement.children.push(pbzc);
|
|
|
- }
|
|
|
- return gljElement;
|
|
|
- });
|
|
|
- return [zgcl, jpcl, rcjhz];
|
|
|
- }
|
|
|
-
|
|
|
- return setupConstruction(projectData);
|
|
|
-
|
|
|
-
|
|
|
+ return setupConstruction();
|
|
|
}
|
|
|
|
|
|
return {
|