'use strict'; /** * * * @author Zhong * @date 2019/6/24 * @version */ /* * 广东建设工程政府投资项目造价数据标准3.0 * */ const XMLStandard = (function () { // 广东18的导出文件中,需要把建设项目和单位工程文件分开 // 数据类别,辨别提取的数据,哪份是以建设项目为根元素,哪份以单位工程为根元素 const DATA_TYPE = { 'project': 1, 'tender': 2, }; // 建设性质 const ConstructionType = { '新建': '1', '扩建': '2', '改建': '3', '修缮': '4', '修复': '5', '维护保养': '6', '其他': '9', }; // 造价类型 const CostType = { '投资估算': '1', '设计概算': '2', '施工图预算': '3', '招标工程量清单': '4', '招标控制价(最高投标限价)': '5', '投标报价': '6', '签约合同价': '7', '竣工结算价': '8', }; // 文件类型 const FileKind = { '1': '6', // 投标 '2': '4', // 招标 '3': '5', // 控制价 }; // 计价模式 const ValuationModel = { 'bill': '1', // 清单计价 'ration': '2', // 定额计价 }; // 地区类别 const AreaKind = { '一类地区': '1', '二类地区': '2', '三类地区': '3', '四类地区': '4', }; // 专业类别 const Specialty = { '房屋建筑与装饰': '1', '仿古建筑': '2', '安装': '3', '市政': '4', '园林绿化': '5', '矿山': '6', '构筑物': '7', '城市轨道交通': '8', '爆破': '9', '装饰装修': '10', '市政交通设施': '11', '市政养护': '12', '修缮': '13', '环卫': '14', '古建筑': '15', '节能': '16', '抗震加固': '17', '绿色建筑': '18', '工业建筑': '19', '地下管廊': '20', '装配式建筑': '21', '营造林': '22', '修复': '23', '其他': '99', }; // 章节类型 const ChapterKind = { '章': '1', '节': '2', '细目': '3', '其他': '4', }; // 汇总类型 const SummrayKind = { 'summary': '1', 'notSummary': '2', }; // 清单子目类型 const BillsKind = { '分部分项': '1', '模板及支架': '2', '脚手架': '3', '现场围挡': '4', '防尘降噪绿色施工防护': '5', '其他': '6', }; // 取费类型 const CalcKind = { '地上工程': '1', '地下明(盖)挖工程': '2', '地下暗挖工程': '3', '盾构工程': '4', '轨道工程': '5', '通信工程': '6', '信号工程': '7', '供电工程': '8', '智能与控制系统工程': '9', '机电工程': '10', '其他': '15', }; // 费用归属 const CostKind = { '建筑工程费': '1', '安装工程费': '2', '其他': '3', }; // 计算方式 const CalcType = { 'quantityMulTotalUnitPrice': '1', // 工程量×综合单价 'formulaAddFeeRate': '2', // 计算基数×费率 'quantityMulUnitPrice': '3', // 工程量×单价 }; // 降效类型 建筑装饰工程定额超高降效费用计算标记 const EfficiencyKind = { 'baseReduction': '1', // 降效基础定额 'notReduction': '2', // 非降效定额 'marketPriceReduction': '3', // 按市场价计算降效费用定额 'rationPriceReduction': '4', // 按定额价计算降效费用定额 }; // 子目增加费类型 安装工程定额子目增加费的费用计算标记 const IncFeeKind = { 'subBase': '1', // 子目增加费基础定额 'notSubBase': '2', // 非子目增加费定额 'subCalc': '3', // 子目增加费用计算定额 }; // 工料机类型 const GLJKind = { }; // 供料方式 const Provider ={ } // 通用设置和工具 const _base = XML_EXPORT_BASE; const _config = _base.CONFIG; const _type = _config.TYPE; const _util = _base.UTIL; const _cache = _base.CACHE; /* * 提取数据入口 * @param {String}userID 用户ID * {Number}exportKind 导出类型(投标1、招标2、控制价3 * {Object}projectData 项目数据(项目自身的数据、建设、单项、单位的数据(projects表的数据),不包含详细的清单定额等数据) * @return {Array} [{data: Object, exportKind: Number, fileName: String}] * */ async function entry(userID, exportKind, projectData) { // name为导出的xml节点属性名称 dName为可能需要显示给用户属性时使用的名称,比如自检提示的时候用,这里只有required为true时需要设置dName // 建设项目 function ConstructionProject(src) { const attrs = [ // 项目编号 {name: 'Number', dName: '项目编号', value: '', required: true}, // 项目名称 {name: 'Name', dName: '项目名称', value: src.name, required: true}, // 工程类别 {name: 'ProjectCategory', dName: '工程类别', value: _util.getValueByKey(src.basicInformation, 'projectCategory'), required: true}, // 工程类型 {name: 'ProjectType', dName: '工程类型', value: src.projectType, required: true}, // 建设性质 {name: 'ConstructionType', value: ConstructionType[_util.getValueByKey(src.basicInformation, 'projectCategory')], type: _type.INT, enumeration: Object.keys(ConstructionType) }, // 文件类型 todo {name: 'FileKind', dName: '造价类型', value: CostType[_util.getValueByKey(src.basicInformation, 'costType')], type: _type.INT, required: true, enumeration: Object.keys(CostType)}, // 计价模式 {name: 'ValuationModel', dName: '计价模式', value: ValuationModel.bill, type: _type.INT, required: true}, // 计税模式 {name: 'TaxModel', dName: '计税模式', value: src.taxType, type: _type.INT, required: true}, // 地区类别 todo {name: 'AreaKind', dName: '地区类别', value: AreaKind[_util.getValueByKey(src.basicInformation, 'areaKind')], type: _type.INT, required: true, enumeration: Object.keys(AreaKind)}, // 工程地点 {name: 'ProjectSite', value: _util.getValueByKey(src.basicInformation, '"projLocation"')}, // 建设单位 {name: 'BuildUnit', dName: '建设单位', value: _util.getValueByKey(src.basicInformation, 'constructionUnit'), required: true}, // 建设单位法定代表人或其授权人 todo {name: 'BulidAuthorizer', value: _util.getValueByKey(src.basicInformation, 'todo')}, // 数据交换标准名称 {name: 'StandardName', value: '建设工程政府投资项目造价数据标准', required: true}, // 数据交换标准编号 {name: 'StandardNumber', value: 'DBJ/T XX-XX-2018', required: true}, // 建设(编制)范围 todo {name: 'RangeOfCompilation', value: ''}, // 建设规模 {name: 'Scale', dName: '工程规模', value: _util.getValueByKey(src.basicInformation, 'projectScale'), type: _type.DECIMAL, required: true}, // 建设规模单位 todo add key {name: 'Unit', dName: '建设规模单位', value: _util.getValueByKey(src.basicInformation, 'unit'), required: true}, // 技术经济指标(元) todo {name: 'TechnicalAndEconomicIndex', value: '0', type: _type.DECIMAL}, // 总说明 {name: 'Explains', value: _util.getValueByKey(src.basicInformation, 'todo')} ]; _base.Element.call(this, 'ConstructionProject', attrs); } // 系统信息 function SystemInfo(src) { const attrs = [ // 编制软件信息 {name: 'ID1', value: src.softInfo}, // 编制机器硬件信息,不输出 {name: 'ID2', value: _util.generateHardwareId()}, // 文件生成时间 {name: 'MakeDate', dName: '文件生成时间', value: src.generatedTime, type: _type.DATE_TIME, required: true} ]; _base.Element.call(this, 'SystemInfo', attrs); } // 工程信息 function ConstructionInfo() { _base.Element.call(this, 'ConstructionInfo', []); } // 费用精度 function Option() { const attrs = [ // 工料机消耗量、含量、用量类小数精度 {name: 'ResPrecision', value: 4, type: _type.INT, required: true}, // 工程量、数量类小数精度 {name: 'QuantityPrecision', value: 3, type: _type.INT, required: true}, // 金额、合价、费用类小数精度 {name: 'CostPrecision', value: 2, type: _type.INT, required: true}, // 费率、指数、比例(%)类小数精度 {name: 'RatePrecision', value: 3, type: _type.INT, required: true} ]; _base.Element.call(this, 'Option', attrs); } // 估(概、预、结)算信息 function ProjectInfo(src) { const attrs = [ // 设计单位 {name: 'Designer', value: _util.getValueByKey(src.basicInformation, 'designUnit')}, // 承包单位 {name: 'Contractor', value: _util.getValueByKey(src.basicInformation, 'buildingUnit')}, // 编制单位 {name: 'CompileCompany', dName: '编制单位', value: _util.getValueByKey(src.basicInformation, 'establishUnit') || '无', required: true}, // 编制单位法定代表人或其授权人 todo {name: 'Authorizer', value: _util.getValueByKey(src.basicInformation, 'Authorizer')}, // 编制人 {name: 'Compiler', value: _util.getValueByKey(src.basicInformation, 'establishUnitAuthor')}, // 编制人资格证书编号 todo {name: 'CompilerCertNo', value: _util.getValueByKey(src.basicInformation, 'CompilerCertNo')}, // 编制时间 {name: 'CompileDate', dName: '编制时间', value: _util.getValueByKey(src.basicInformation, 'establishDate'), required: true}, // 审核人 {name: 'Examiner', value: _util.getValueByKey(src.basicInformation, 'auditUnitAuditor')}, // 审核人资格证书编号 todo {name: 'ExaminerCertNo', value: _util.getValueByKey(src.basicInformation, 'ExaminerCertNo')}, // 审核时间 {name: 'ExamineDate', value: _util.getValueByKey(src.basicInformation, 'auditDate')}, // 审定人 todo {name: 'Approver', value: _util.getValueByKey(src.basicInformation, 'Approver')}, // 审定人资格证书编号 todo {name: 'ApproverCertNo', value: _util.getValueByKey(src.basicInformation, 'ApproverCertNo')}, // 审定时间 todo {name: 'ApproverDate', value: _util.getValueByKey(src.basicInformation, 'ApproverDate')}, // 工程总价(元) {name: 'Total', dName: '工程总价', value: src.summaryInfo.engineeringCost || '0', type: _type.DECIMAL, required: true} ]; _base.Element.call(this, 'ProjectInfo', attrs); } // 招标信息 工程量清单、招标控制价时输出 function TendereeInfo(info) { const attrs = [ // 招标人 {name: 'TendereeName', dName: '招标人', value: _util.getValueByKey(info, 'bidInviter'), required: true}, // 招标单位法定代表人或其授权人 {name: 'TenderAuthorizer', value: _util.getValueByKey(info, 'tenderRepresentative')}, // 招标单位编制人 {name: 'TenderCompiler', value: _util.getValueByKey(info, 'TenderCompiler')}, // 招标单位编制人资格证书编号 {name: 'TenderCompilerCertNo', value: _util.getValueByKey(info, 'TenderCompilerCertNo')}, // 招标单位编制时间 {name: 'TenderCompileDate', value: _util.getValueByKey(info, 'TenderCompileDate')}, // 招标单位审核人 {name: 'TenderExaminer', value: _util.getValueByKey(info, 'TenderExaminer')}, // 招标单位审核人资格证书编号 {name: 'TenderExaminerCertNo', value: _util.getValueByKey(info, 'TenderExaminerCertNo')}, // 招标单位审核时间 {name: 'TenderExamineDate', value: _util.getValueByKey(info, 'TenderExamineDate')}, // 招标单位审定人 {name: 'TenderApprover', value: _util.getValueByKey(info, 'TenderApprover')}, // 招标单位审定人资格证书编号 {name: 'TenderApproverCertNo', value: _util.getValueByKey(info, 'TenderApproverCertNo')}, // 招标单位审定时间 {name: 'TenderApproveDate', value: _util.getValueByKey(info, 'TenderApproveDate')}, // 招标代理 不得为空,如无招标代理,则应填写“无”。 {name: 'Proxy', dName: '招标代理', value: _util.getValueByKey(info, 'Proxy'), required: true}, // 招标代理资质证书编号 {name: 'ProxyCertNo', value: _util.getValueByKey(info, 'ProxyCertNo')}, // 招标代理法定代表人或其授权人 {name: 'ProxyAuthorizer', value: _util.getValueByKey(info, 'ProxyAuthorizer')}, // 招标代理编制人员 {name: 'ProxyCompiler', value: _util.getValueByKey(info, 'ProxyCompiler')}, // 招标代理编制人员资格证书编号 {name: 'ProxyCompilerCertNo', value: _util.getValueByKey(info, 'ProxyCompilerCertNo')}, // 招标代理编制时间 {name: 'ProxyCompileDate', value: _util.getValueByKey(info, 'ProxyCompileDate')}, // 招标代理审核人 {name: 'ProxyExaminer', value: _util.getValueByKey(info, 'ProxyExaminer')}, // 招标代理审核人资格证书编号 {name: 'ProxyExaminerCertNo', value: _util.getValueByKey(info, 'ProxyExaminerCertNo')}, // 招标代理审核时间 {name: 'ProxyExamineDate', value: _util.getValueByKey(info, 'ProxyExamineDate')}, // 招标代理审定人 {name: 'ProxyApprover', value: _util.getValueByKey(info, 'ProxyApprover')}, // 招标代理审定人资格证书编号 {name: 'ProxyApproverCertNo', value: _util.getValueByKey(info, 'ProxyApproverCertNo')}, // 招标代理审定时间 {name: 'ProxyApproveDate', value: _util.getValueByKey(info, 'ProxyApproveDate')}, // 造价咨询 、Consultant(造价咨询):不得为空,如无则应填写“无”。 {name: 'Consultant', dName: '造价咨询', value: _util.getValueByKey(info, 'Consultant'), required: true}, // 造价咨询资质证书编号 {name: 'ConsultantCertNo', value: _util.getValueByKey(info, 'ConsultantCertNo')}, // 造价咨询法定代表人或其授权人 {name: 'ConsultantAuthorizer', value: _util.getValueByKey(info, 'ConsultantAuthorizer')}, // 造价咨询编制人 {name: 'ConsultantCompiler', value: _util.getValueByKey(info, 'ConsultantCompiler')}, // 造价咨询编制人资格证书 {name: 'ConsultantCompilerCertNo', value: _util.getValueByKey(info, 'ConsultantCompilerCertNo')}, // 造价咨询编制时间 {name: 'ConsultantCompileDate', value: _util.getValueByKey(info, 'ConsultantCompileDate')}, // 造价咨询审核人 {name: 'ConsultantExaminer', value: _util.getValueByKey(info, 'ConsultantExaminer')}, // 造价咨询审核人资格证书编号 {name: 'ConsultantExaminerCertNo', value: _util.getValueByKey(info, 'ConsultantExaminerCertNo')}, // 造价咨询审核时间 {name: 'ConsultantExamineDate', value: _util.getValueByKey(info, 'ConsultantExamineDate')}, // 造价咨询审定人 {name: 'ConsultantApprover', value: _util.getValueByKey(info, 'ConsultantApprover')}, // 造价咨询审定人资格证书编号 {name: 'ConsultantApproverCertNo', value: _util.getValueByKey(info, 'ConsultantApproverCertNo')}, // 造价咨询审定时间 {name: 'ConsultantApproveDate', value: _util.getValueByKey(info, 'ConsultantApproveDate')}, // 招标控制价(元) {name: 'TenderSumLimit', dName: '招标控制价', value: 'todo', type: _type.DECIMAL, required: true} ]; _base.Element.call(this, 'TendereeInfo', attrs); } // 投标信息 function BidderInfo(src) { const attrs = [ // 投标人 {name: 'BidName', dName: '投标人', value: _util.getValueByKey(src.basicInformation, 'bidName'), required: true}, // 投标单位法定代表人或其授权人 {name: 'BidAuthorizer', value: _util.getValueByKey(src.basicInformation, 'bidAuthorizer')}, // 投标总价(元) {name: 'BidAuthorizer', dName: '投标总价', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL, required: true}, // 投标单位编制人 {name: 'BidCompiler', value: _util.getValueByKey(src.basicInformation, 'bidCompiler')}, // 投标单位编制人资格证书编号 {name: 'BidCompilerCertNo', value: _util.getValueByKey(src.basicInformation, 'BidCompilerCertNo')}, // 投标单位编制时间 {name: 'BidCompileDate', value: _util.getValueByKey(src.basicInformation, 'bidCompileDate')}, // 投标单位审核人 {name: 'BidExaminer', value: _util.getValueByKey(src.basicInformation, 'bidExaminer')}, // 投标单位审核人资格证书编号 {name: 'BidExaminerCertNo', value: _util.getValueByKey(src.basicInformation, 'bidExaminerCertNo')}, // 投标单位审核时间 {name: 'BidExamineDate', value: _util.getValueByKey(src.basicInformation, 'bidExamineDate')}, // 投标单位审定人 {name: 'BidApprover', value: _util.getValueByKey(src.basicInformation, 'bidApprover')}, // 投标单位审定人资格证书 {name: 'BidApproverCertNo', value: _util.getValueByKey(src.basicInformation, 'bidApproverCertNo')}, // 投标单位审定时间 {name: 'BidApproveDate', value: _util.getValueByKey(src.basicInformation, 'BidApproveDate')} ]; _base.Element.call(this, 'BidderInfo', attrs); } // 费用汇总 function SummaryOfCost(summaryInfo) { const attrs = [ // 工程造价(元) {name: 'Total', value: summaryInfo.engineeringCost, type: _type.DECIMAL}, // 建筑工程费 {name: 'Construction', value: '0', type: _type.DECIMAL}, // 安装工程费 {name: 'Installation', value: '0', type: _type.DECIMAL}, // 分部分项工程费 {name: 'DivisionalAndElementalWorks', value: summaryInfo.subEngineering, type: _type.DECIMAL}, // 措施项目费 {name: 'Preliminaries', value: summaryInfo.measure, type: _type.DECIMAL}, // 安全文明施工费 {name: 'CostForHSE', value: summaryInfo.safetyConstruction, type: _type.DECIMAL}, // 其他措施费 {name: 'OtherPreliminaries', value: 'todo', type: _type.DECIMAL}, // 其他项目费 {name: 'SundryCosts', value: summaryInfo.other, type: _type.DECIMAL}, // 暂列金额 {name: 'ProvisionalSums', value: summaryInfo.provisional, type: _type.DECIMAL}, // 暂估价材料 {name: 'ProvisionalMaterial', value: summaryInfo.materialProvisional, type: _type.DECIMAL}, // 专业工程暂估价 {name: 'SpecialtyProvisionalPrice', value: summaryInfo.engineeringEstimate, type: _type.DECIMAL}, // 计日工费用 {name: 'DayWorkRate', value: summaryInfo.daywork, type: _type.DECIMAL}, // 总承包服务费 {name: 'MainContractorAttendance', value: summaryInfo.turnKeyContract, type: _type.DECIMAL}, // 索赔费用 {name: 'ClaimForLossAndExpenses', value: 'todo', type: _type.DECIMAL}, // 现场签证费用 {name: 'SiteInstruction', value: 'todo', type: _type.DECIMAL}, // 规费 {name: 'StatutoryFees', value: summaryInfo.charge, type: _type.DECIMAL}, // 税金 {name: 'Tax', value: summaryInfo.tax, type: _type.DECIMAL}, // 人工费 {name: 'Labor', value: 'todo', type: _type.DECIMAL}, // 材料费 {name: 'Material', value: 'todo', type: _type.DECIMAL}, // 主材设备费 {name: 'MainMaterialEquipment', value: 'todo', type: _type.DECIMAL}, // 主材费 {name: 'MainMaterial', value: 'todo', type: _type.DECIMAL}, // 机械费 {name: 'Machine', value: 'todo', type: _type.DECIMAL}, // 管理费 {name: 'Overhead', value: 'todo', type: _type.DECIMAL}, // 利润 {name: 'Profit', value: 'todo', type: _type.DECIMAL}, // 设备费 {name: 'Equipment', value: 'todo', type: _type.DECIMAL}, // 其中:引进部分(美元) //{name: 'ForeignCurrency', value: '0', type: _type.DECIMAL}, // 折合人民币 //{name: 'ConvertedIntoRMB', value: '0', type: _type.DECIMAL} ]; _base.Element.call(this, 'SummaryOfCost', attrs); } // 建筑安装工程费 function ProjectInstallationWorkCost(src) { const attrs = [ // 工程编号 {name: 'Number', value: ''}, // 工程名称 {name: 'Name', value: src.name, required: true}, // 金额 (元) {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL}, // 其中:引进部分(美元) {name: 'ForeignCurrency', value: 'todo', type: _type.DECIMAL}, // 折合人民币 {name: 'ConvertedIntoRMB', value: 'todo', type: _type.DECIMAL}, // 建设规模 {name: 'Scale', value: _util.getValueByKey(src.basicInformation, 'projectScale'), type: _type.DECIMAL, required: true}, // 建设规模单位 todo add key {name: 'Unit', value: _util.getValueByKey(src.basicInformation, 'unit'), required: true}, // 技术经济指标(元) {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, // 占总比例(%) {name: 'Ratios', value: '100', type: _type.DECIMAL}, // 费用代号 {name: 'Code', value: 'todo'}, // 备注 {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'ProjectInstallationWorkCost', attrs); } // 单项工程 function SectionWorks(src) { const attrs = [ // 工程编号 {name: 'Number', value: ''}, // 工程名称 {name: 'Name', value: src.name, required: true}, // 标段 {name: 'Segment', value: src.segment}, // 金额 {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL}, // 建设规模 {name: 'Scale', value: 'todo', type: _type.DECIMAL, required: true}, // 建设规模单位 {name: 'Unit', value: 'todo', required: true}, // 技术经济指标 {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, // 占总投资比例(%) {name: 'Ratios', value: src.summaryInfo.rate, type: _type.DECIMAL}, // 费用代号 {name: 'Code', value: 'todo', type: _type.DECIMAL}, // 备注 {name: 'Remark', value: 'todo'} ]; _base.Element.call(this, 'SectionWorks', attrs); } // 单位工程 function UnitWorks(src) { const attrs = [ // 工程编号 {name: 'Number', value: '', required: true}, // 工程名称 {name: 'Name', value: src.name, required: true}, // 标段 {name: 'Segment', value: src.segment}, // 工程类别 {name: 'ProjectCategory', value: 'todo', required: true}, // 工程类型 {name: 'ProjectType', value: 'todo', required: true}, // 计价模式 {name: 'ValuationModel', value: VALUATION_MODEL.bill, type: _type.INT, required: true}, // 计税模式 {name: 'TaxModel', value: src.taxType, type: _type.INT, required: true}, // 地区类别 {name: 'AreaKind', value: 'todo', type: _type.INT, required: true}, // 金额 {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL}, // 专业类别 {name: 'Specialty', value: src.summaryInfo.engineeringCost, type: _type.INT}, // 工程用途 {name: 'Purposes', value: 'todo'}, //建设(编制)范围 {name: 'RangeOfCompilation', value: 'todo'}, // 建设规模 {name: 'Scale', value: 'todo', type: _type.DECIMAL, required: true}, // 建设规模单位 {name: 'Unit', value: 'todo', required: true}, // 技术经济指标(元) {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, // 占总投资比例(%) {name: 'Ratios', value: src.summaryInfo.rate, type: _type.DECIMAL}, // 费用代号 {name: 'Code', value: 'todo'}, // 清单数据库,没有则填写 “无” {name: 'BillDataBase', value: 'todo', required: true}, // 定额数据库,没有则填写 “无” {name: 'NormDataBase', value: 'todo', required: true}, // 人工材料设备价格文件,没有则填写 “无” {name: 'ResInfoPricingFile', value: 'todo', required: true}, // 执行费率文件 {name: 'AppliedRateFile', value: 'todo'}, // 其他计价依据文件 {name: 'OtherRelatedFile', value: 'todo'}, // 总说明 {name: 'Explains', value: 'todo'}, // 导出XML文件名,工程编号+工程名称.xml {name: 'FileName', value: 'todo'}, // 备注 {name: 'Remark', value: 'todo'}, ]; _base.Element.call(this, 'UnitWorks', attrs); } // 工程特征信息 AttrInfo, 补充信息AddiInfo function Info(eleName) { _base.Element.call(this, eleName, []); } // 工程特征信息明细 AttrInfoItem, 补充信息明细AddiInfoItem function InfoItem(eleName, src) { const attrs = [ {name: 'Name', value: src.name, required: true}, {name: 'Value', value: src.value}, {name: 'Code', value: src.code}, {name: 'Remark', value: src.remark} ]; _base.Element.call(this, eleName, attrs); } // 单位工程费用汇总 function UnitWorksSummary() { _base.Element.call(this, 'UnitWorksSummary', []); } // 单位工程费用汇总标题 function UnitWorksSummaryGroup(src) { const attrs = [ // 费用编号 {name: 'Number', value: src.code}, // 费用名称 {name: 'Name', value: src.name, required: true}, // 单位 {name: 'Unit', value: src.unit}, // 工程量 {name: 'Quantity', value: src.quantity, type: _type.DECIMAL}, // 金额 {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, // 技术经济指标(元) {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, // 占比(%) {name: 'Ratios', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL}, //章节类型 {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true}, // 费用代号 {name: 'Code', value: 'todo', type: _type.INT, required: true}, // 汇总类型 {name: 'Kind', value: 'todo', type: _type.INT, required: true}, // 备注 {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'UnitWorksSummaryGroup', attrs); } // 单位工程费汇总明细 function UnitWorksSummaryItem(src) { const attrs = [ {name: 'Number', value: src.code}, {name: 'Name', value: src.name, required: true}, {name: 'Unit', value: src.unit}, {name: 'Quantity', value: src.quantity, type: _type.DECIMAL}, // 计算基数:可由费用代号、数字、四则运算符号、小括号组成 {name: 'QtyFormula', value: src.calcBase, type: _type.DECIMAL}, // 费率 {name: 'Rate', value: src.feeRate, type: _type.DECIMAL}, {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, // 技术经济指标(元) {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, // 占比(%) {name: 'Ratios', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL}, //章节类型 {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true}, // 费用代号 {name: 'Code', value: 'todo', type: _type.INT, required: true}, // 汇总类型 {name: 'Kind', value: 'todo', type: _type.INT, required: true}, // 备注 {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'UnitWorksSummaryItem', attrs); } // 分部分项工程 function DivisionalAndElementalWorks() { _base.Element.call(this, 'DivisionalAndElementalWorks', []); } // 合计费用 function SummaryOfBasicCost() { // 省略了一些 const attrs = [ {name: 'Labor', value: 'todo', type: _type.DECIMAL}, {name: 'Material', value: 'todo', type: _type.DECIMAL}, {name: 'Material', value: 'todo', type: _type.DECIMAL}, {name: 'MainMaterial', value: 'todo', type: _type.DECIMAL}, {name: 'Equipment', value: 'todo', type: _type.DECIMAL}, {name: 'MainMaterialEquipment', value: 'todo', type: _type.DECIMAL}, {name: 'Machine', value: 'todo', type: _type.DECIMAL}, // 管理费 {name: 'Overhead', value: 'todo', type: _type.DECIMAL}, // 规费 {name: 'StatutoryFees', value: 'todo', type: _type.DECIMAL}, // 税金 {name: 'Tax', value: 'todo', type: _type.DECIMAL}, // 利润 {name: 'Profit', value: 'todo', type: _type.DECIMAL}, // 暂估价 {name: 'Appraisal', value: 'todo', type: _type.DECIMAL} ]; _base.Element.call(this, 'SummaryOfBasicCost', attrs); } // 分部工程 function DivisionalWorks(src) { const attrs = [ // 编码 {name: 'Number', value: src.code}, {name: 'Name', value: src.name, required: true}, // 特征 {name: 'Attr', value: 'todo'}, {name: 'Unit', value: src.unit}, {name: 'Quantity', value: src.quantity, type: _type.DECIMAL}, {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL}, {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true}, {name: 'Code', value: 'todo', type: _type.INT}, {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'DivisionalWorks', attrs); } // 清单项目 function WorkElement(src) { const attrs = [ // 项目编码 {name: 'Number', value: src.code, required: true}, // 项目名称 {name: 'Name', value: src.name, required: true}, // 项目特征 {name: 'Attr', value: 'todo'}, // 工作内容 {name: 'WorkContent', value: 'todo'}, // 计量单位 {name: 'Unit', value: src.unit, required: true}, // 工程量 {name: 'Quantity', value: src.quantity, type: _type.DECIMAL}, // 计算基数 {name: 'QtyFormula', value: src.calcBase, type: _type.DECIMAL}, // 单价(元) {name: 'Price', value: _util.getFee(src.fees, 'common.unitFee'), type: _type.DECIMAL}, // 设备单价(元)指清单项目所采用设备的综合单价 {name: 'EquipmentPrice', value: 'todo', type: _type.DECIMAL}, // 最低限价(元) {name: 'PriceLow', value: 'todo', type: _type.DECIMAL}, // 最高限价(元) {name: 'PriceHigh', value: src.maxPrice, type: _type.DECIMAL}, // 费率(%) {name: 'Rate', value: src.feeRate, type: _type.DECIMAL}, // 合价(元) {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, // 主要清单 {name: 'Total', value: !!src.mainBills, type: _type.BOOL}, // 子目类型 {name: 'Kind', value: 'todo', type: _type.INT, required: true}, // 取费类型 {name: 'CalculationKind', value: 'todo', type: _type.INT, required: true}, // 费用归属 {name: 'CostKind', value: 'todo', type: _type.INT, required: true}, // 计算方式 {name: 'CalcType', value: 'todo', type: _type.INT, required: true}, // 专业类型 {name: 'Specialty', value: 'todo', type: _type.INT}, // 清单标识 {name: 'ListingIdentity', value: 'todo'}, // 费用代号 {name: 'Code', value: 'todo'}, {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'WorkElement', attrs); } // 工程量计算表 function ExpressElement(src) { const attrs = [ // 序号 {name: 'OrderNumber', value: 'todo', required: true}, // 工程量计算式 {name: 'Express', value: 'todo', required: true}, // 工程量 {name: 'Quantity', value: 'todo', required: true}, // 汇总类型 {name: 'Kind', value: 'todo', type: _type.INT, required: true}, {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'ExpressElement', attrs); } // 工序内容 function WorkContent(src) { const attrs = [ {name: 'Name', value: src.name, required: true}, {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, {name: 'Remark', value: ''} ]; _base.Element.call(this, 'WorkContent', attrs); } // 定额子目 function Norm(src) { const attrs = [ // 定额编码 {name: 'Number', value: src.code, required: true}, {name: 'Name', value: src.name, required: true}, {name: 'Unit', value: src.unit, required: true}, {name: 'Quantity', value: src.quantity, type: _type.DECIMAL}, // 单价 {name: 'Price', value: _util.getFee(src.fees, 'common.unitFee'), type: _type.DECIMAL}, // 设备单价 {name: 'EquipmentPrice', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL}, // 合价 {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL}, // 设备合价 {name: 'EquipmentTotal', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL}, // 其中:引进部分(美元) {name: 'ForeignCurrency', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL}, // 折合人民币(元) {name: 'ConvertedIntoRMB', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL}, // 是否定额 {name: 'IsNorm', value: _util.getFee(src.fees, 'todo'), type: _type.Bool, required: true}, // 子目类型 {name: 'Kind', value: 'todo', type: _type.INT, required: true}, // 取费类型 {name: 'CalculationKind', value: 'todo', type: _type.INT, required: true}, // 费用归属 {name: 'CostKind', value: 'todo', type: _type.INT, required: true}, // 降效类型 {name: 'EfficiencyKind', value: 'todo', type: _type.INT}, // 子目增加费类型 {name: 'IncFeeKind', value: 'todo', type: _type.INT}, // 换算说明 {name: 'Conversion', value: 'todo'}, // 专业类别 {name: 'Specialty', value: 'todo', type: _type.INT}, //定额标识 {name: 'NormIdentity', value: 'todo'}, // 册 定额书没有分册填写0,有分册的按册号填写 {name: 'Volume', value: 'todo', type: _type.INT}, // 章 {name: 'Chapter', value: 'todo', type: _type.INT}, {name: 'Remark', value: src.remark} ]; _base.Element.call(this, 'Norm', attrs); } /* * 加载数据,分两种数据类型 * 1.建设项目 * 2.建设项目下单位工程 * @param {Object}项目数据 * @return {Array} * */ async function loadData(projectData) { // 提取出的数据 const extractData = []; // 建设项目部分 const constructionProject = await loadProject(projectData); extractData.push({ data: constructionProject, dataType: DATA_TYPE.project, exportKind, fileName: 'Project.xml' }); // 单位工程部分 // 提取出单位工程级别的项目数据 const tenderData = projectData.children.reduce((acc, cur) => { if (Array.isArray(cur.children)) { acc.push(...cur.children) } return acc; }, []); // 获取单位工程详细结构 const isPlainTender = false; const tenders = await loadTender(projectData.summaryInfo, tenderData, isPlainTender); tenders.forEach(tender => { // 单位工程文件名为@_单位工程编码_单位工程名称.xml // 因为单位工程编码后续用户可能会改变,这里暂时将fileName设置成单位工程名称.xml const name = tender.attrs.find(attr => attr.name === 'Name'); extractData.push({ data: tender, dataType: DATA_TYPE.tender, exportKind, fileName: `${name}.xml` }) }); return extractData; } /* * 加载建设项目 * @param {Object}项目数据 * @return {Array} * */ async function loadProject(projectData) { const basicInformation = projectData.property.basicInformation; const summaryInfo = projectData.summaryInfo[projectData.ID]; // 建设项目 const constructionProject = new ConstructionProject({ name: projectData.data, basicInformation }); // 系统信息 const systemInfo = new SystemInfo({ // 软件相关信息进行base64编码 ID1: Base64.encode(projectData.softInfo), generatedTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss') }); // 工程信息 const constructionInfo = loadConstructionInfo(projectData); // 费用汇总 const summaryCost = new SummaryOfCost(summaryInfo); // 建筑安装工程费 const projectInstall = new ProjectInstallationWorkCost({ name: projectData.name, basicInformation, summaryInfo }); // 单项工程 const sectionalWorks = await loadEngineering(summaryInfo, projectData.children); projectInstall.children.push(...sectionalWorks); constructionProject.children.push( systemInfo, constructionInfo, summaryCost, projectInstall ); return constructionProject; } // 加载工程信息相关元素 function loadConstructionInfo(projectData) { const basicInformation = projectData.property.basicInformation; const summaryInfo = projectData.summaryInfo[projectData.ID]; // 工程信息 const constructionInfo = new ConstructionInfo(); // 费用精度 const option = new Option(); // 估(概、预、结)算信息 const projectInfo = new ProjectInfo({ basicInformation: basicInformation, summaryInfo: summaryInfo }); let exportInfo; if (exportKind === _config.EXPORT_KIND.Bid) { // 招标信息 exportInfo = new TendereeInfo({ basicInformation: basicInformation }); } else if (exportKind === _config.EXPORT_KIND.Tender) { // 投标信息 exportInfo = new BidderInfo({ basicInformation: basicInformation, summaryInfo: summaryInfo }); } constructionInfo.push(option, projectInfo, exportInfo); return constructionInfo; } /* * 加载所有单项工程元素 * @param {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射) * {Array}engineeringData 所有单项工程项目数据 * @return {Array} * */ async function loadEngineering(summaryInfoMap, engineeringData) { const isPlainTender = true; const engineeringTasks = engineeringData.map(async engData => { const summaryInfo = summaryInfoMap[engData.ID]; // 单项工程 const sectionalWork = new SectionWorks({ name: engData.name, summaryInfo }); // 费用汇总 const summaryCost = new SummaryOfCost(summaryInfo); // 简单结构的单位工程 const tenders = await loadTender(summaryInfoMap, engData.children, isPlainTender); sectionalWork.push(summaryCost, ...tenders); return sectionalWork; }); return await Promise.all(engineeringTasks); } /* * 加载所有单位工程元素 * @param {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射) * {Array}tenderData 所有单项工程项目数据 * {Boolean}isPlain 是否简单结构(简单结构只含有UnitWorks,其下不含子元素) * @return {Array} * */ async function loadTender(summaryInfoMap, tenderData, isPlain) { const tenderTasks = tenderData.map(async tData => { const summaryInfo = summaryInfoMap[tData.ID]; // 单位工程 const unitWork = new UnitWorks({ name: tData.name, summaryInfo: summaryInfo }); // 简单结构,不需要继续添加子元素 if (isPlain) { return unitWork; } // 不是简单结构,继续添加各种子元素 // 工程特征信息 const attrInfo = loadAttrInfo(tData.property.projectFeature); // 费用汇总 const summaryOfCost = new SummaryOfCost(summaryInfo); // 获取单位工程详细数据 const tenderDetail = await _util.getTenderDetail(tData.ID, userID); // 单位工程费用汇总 }); return await Promise.all(tenderTasks); } // 加载工程特征信息 // attrList 单位工程的工程特征,来自property.projectFeature function loadAttrInfo(attrList) { const attrInfo = new Info('AttrInfo'); attrInfo.children = attrList.map(attr => new InfoItem('AttrInfoItem', { name: attr.dispName, code: attr.code, value: attr.value }) ); return attrInfo; } // 加载单位工程费用汇总 // tenderDetail 单位工程详细数据 function loadUnitWorksSummary(tenderDetail) { const unitWorksSummary = new UnitWorksSummary(); return unitWorksSummary; } // 加载分部分项工程 function loadDivisionWorks(tenderDetail) { const division = new DivisionalAndElementalWorks(); } } /* * 重置工程编号,广东18 3.0的接口,导出时的文件会用到这个编号 * 因此重置工程编号后,还需要重置文件名数据 * @param {Array}codes 工程编号 * {Array}extractData 提取的数据 * @return {void} * */ function resetContentCode(codes, extractData) { // 提取到的数据分两种类型: // 1.根元素为建设项目:需要修改建设项目下的单位工程元素的编码和文件名 // 2.根元素为单位工程:需要修改单位工程的编码和文件名 // 获取建设项目数据下的单位工程元素 const ExtractProjects = extractData.filter(data => data.dataType === DATA_TYPE.project); const tenders = ExtractProjects.map(extractP => { // 建设项目元素下建筑安装工程费元素 const projectInstallations = _util.getElementFromSrc(extractP.data, 'ProjectInstallationWorkCost'); // 建筑安装工程费元素下单项工程元素 const sectionalWorks = projectInstallations.reduce((acc, cur) => { const sections = _util.getElementFromSrc(cur, 'SectionalWorks'); acc.push(...sections); }, []); // 单项工程元素下单位工程元素 return sectionalWorks.reduce((acc, cur) => { const tenders = _util.getElementFromSrc(cur, 'UnitWorks'); acc.push(...tenders); }, []); }); // 重置编号 let idx = 0; for (let tender of tenders) { let codeItem = tender.attrs.find(attr => attr.name === '编号'); codeItem.value = codes[idx++]; } } })();