| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008 |
- 'use strict';
- /**
- *
- *
- * @author Zhong
- * @date 2019/6/24
- * @version
- */
- /*
- * 广东建设工程政府投资项目造价数据标准3.0
- * */
- const XMLStandard = (function () {
- // 广东18的导出文件中,需要把建设项目和单位工程文件分开
- // 数据类别,辨别提取的数据,哪份是以建设项目为根元素,哪份以单位工程为根元素
- const DATA_TYPE = {
- 'project': 1,
- 'tender': 2
- };
- // 建设性质
- const CONSTRUCTION_TYPE = {
- '新建': '1',
- '扩建': '2',
- '改建': '3',
- '修缮': '4',
- '修复': '5',
- '维护保养': '6',
- '其他': '9'
- };
- // 文件类型
- const FILE_KIND = {
- '1': '6', // 投标
- '2': '4', // 招标
- '3': '5' // 控制价
- };
- // 计价模式
- const VALUATION_MODEL = {
- 'bill': '1', // 清单计价
- 'ration': '2', // 定额计价
- };
- // 地区类别
- const AREA_KIND = {
- '一类地区': '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 CHAPTER_KIND = {
- '章': '1',
- '节': '2',
- '细目': '3',
- '其他': '4'
- };
- // 汇总类型
- const SUMMARY_KIND = {
- 'summary': '1',
- 'notSummary': '2'
- };
- // 清单子目类型
- const BILL_KIND = {
- '分部分项': '1',
- '模板及支架': '2',
- '脚手架': '3',
- '现场围挡': '4',
- '防尘降噪绿色施工防护': '5',
- '其他': '6',
- };
- // 取费类型
- const CALC_KIND = {
- '地上工程': '1',
- '地下明(盖)挖工程': '2',
- '地下暗挖工程': '3',
- '盾构工程': '4',
- '轨道工程': '5',
- '通信工程': '6',
- '信号工程': '7',
- '供电工程': '8',
- '智能与控制系统工程': '9',
- '机电工程': '10',
- '其他': '15',
- };
- // 费用归属
- const COST_KIND = {
- '建筑工程费': '1',
- '安装工程费': '2',
- '其他': '3'
- };
- // 计算方式
- const CALC_TYPE = {
- 'quantityMulTotalUnitPrice': '1', // 工程量×综合单价
- 'formulaAddFeeRate': '2', // 计算基数×费率
- 'quantityMulUnitPrice': '3' // 工程量×单价
- };
- // 降效类型 建筑装饰工程定额超高降效费用计算标记
- const EFFICIENCY_KIND = {
- 'baseReduction': '1', // 降效基础定额
- 'notReduction': '2', // 非降效定额
- 'marketPriceReduction': '3', // 按市场价计算降效费用定额
- 'rationPriceReduction': '4' // 按定额价计算降效费用定额
- };
- // 子目增加费类型 安装工程定额子目增加费的费用计算标记
- const INC_FEE_KIND = {
- 'subBase': '1', // 子目增加费基础定额
- 'notSubBase': '2', // 非子目增加费定额
- 'subCalc': '3' // 子目增加费用计算定额
- };
- // 通用设置和工具
- let _base = XML_EXPORT_BASE,
- _config = _base.CONFIG,
- _type = _config.TYPE,
- _util = _base.UTIL,
- _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) {
- // 建设项目
- function ConstructionProject(src) {
- let attrs = [
- // 项目编号
- {name: 'Number', value: '', required: true},
- // 项目名称
- {name: 'Name', value: src.name, required: true},
- // 工程类别
- {name: 'ProjectCategory', value: _util.getValueByKey(src.basicInformation, 'projectCategory'), required: true},
- // 工程类型 todo add key
- {name: 'ProjectType', value: _util.getValueByKey(src.basicInformation, 'projectType'), required: true},
- // 建设性质 todo add key
- {name: 'ConstructionType', value: _util.getValueByKey(src.basicInformation, 'constructionType'), type: _type.INT},
- // 文件类型
- {name: 'FileKind', value: src.fileKind, type: _type.INT, required: true},
- // 计价模式
- {name: 'ValuationModel', value: VALUATION_MODEL.bill, type: _type.INT, required: true},
- // 计税模式
- {name: 'TaxModel', value: src.taxType, type: _type.INT, required: true},
- // 地区类别 todo add key
- {name: 'AreaKind', value: AREA_KIND[_util.getValueByKey(src.basicInformation, 'areaKind')], type: _type.INT, required: true},
- // 工程地点
- {name: 'ProjectSite', value: _util.getValueByKey(src.basicInformation, 'projAddress')},
- // 建设单位
- {name: 'BuildUnit', 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', 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: 'Explains', value: _util.getValueByKey(src.basicInformation, 'todo')}
- ];
- _base.Element.call(this, 'ConstructionProject', attrs);
- }
- // 系统信息
- function SystemInfo(src) {
- let attrs = [
- // 编制软件信息
- {name: 'ID1', value: src.ID1},
- // 编制机器硬件信息,不输出
- {name: 'ID2', value: ''},
- // 文件生成时间
- {name: 'MakeDate', value: src.generatedTime, type: _type.DATE_TIME, required: true}
- ];
- _base.Element.call(this, 'SystemInfo', attrs);
- }
- // 工程信息
- function ConstructionInfo() {
- _base.Element.call(this, 'ConstructionInfo', []);
- }
- // 费用精度
- function Option() {
- let 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) {
- let attrs = [
- // 设计单位
- {name: 'Designer', value: _util.getValueByKey(src.basicInformation, 'designer')},
- // 承包单位
- {name: 'Contractor', value: _util.getValueByKey(src.basicInformation, 'Contractor')},
- // 编制单位
- {name: 'CompileCompany', value: _util.getValueByKey(src.basicInformation, 'CompileCompany'), required: true},
- // 编制单位法定代表人或其授权人
- {name: 'Authorizer', value: _util.getValueByKey(src.basicInformation, 'Authorizer')},
- // 编制人
- {name: 'Compiler', value: _util.getValueByKey(src.basicInformation, 'Compiler')},
- // 编制人资格证书编号
- {name: 'CompilerCertNo', value: _util.getValueByKey(src.basicInformation, 'CompilerCertNo')},
- // 编制时间
- {name: 'CompileDate', value: _util.getValueByKey(src.basicInformation, 'CompileDate'), required: true},
- // 审核人
- {name: 'Examiner', value: _util.getValueByKey(src.basicInformation, 'Examiner')},
- // 审核人资格证书编号
- {name: 'ExaminerCertNo', value: _util.getValueByKey(src.basicInformation, 'ExaminerCertNo')},
- // 审核时间
- {name: 'ExamineDate', value: _util.getValueByKey(src.basicInformation, 'ExamineDate')},
- // 审定人
- {name: 'Approver', value: _util.getValueByKey(src.basicInformation, 'Approver')},
- // 审定人资格证书编号
- {name: 'ApproverCertNo', value: _util.getValueByKey(src.basicInformation, 'ApproverCertNo')},
- // 审定时间
- {name: 'ApproverDate', value: _util.getValueByKey(src.basicInformation, 'ApproverDate')},
- // 工程总价(元)
- {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL, required: true}
- ];
- _base.Element.call(this, 'ProjectInfo', attrs);
- }
- // 招标信息
- function TendereeInfo(info) {
- let attrs = [
- // 招标人
- {name: 'TendereeName', value: _util.getValueByKey(info, 'TendereeName'), required: true},
- // 招标单位法定代表人或其授权人
- {name: 'TenderAuthorizer', value: _util.getValueByKey(info, 'TenderAuthorizer')},
- // 招标单位编制人
- {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', 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', 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', value: 'todo', type: _type.DECIMAL, required: true}
- ];
- _base.Element.call(this, 'TendereeInfo', attrs);
- }
- // 投标信息
- function BidderInfo(src) {
- let attrs = [
- // 投标人
- {name: 'BidName', value: _util.getValueByKey(src.basicInformation, 'bidName'), required: true},
- // 投标单位法定代表人或其授权人
- {name: 'BidAuthorizer', value: _util.getValueByKey(src.basicInformation, 'bidAuthorizer')},
- // 投标总价(元)
- {name: 'BidAuthorizer', 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) {
- let attrs = [
- // 工程造价(元)
- {name: 'Total', value: summaryInfo.engineeringCost, type: _type.DECIMAL},
- // 建筑工程费
- {name: 'Construction', value: 'todo', type: _type.DECIMAL},
- // 安装工程费
- {name: 'Installation', value: 'todo', 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: 'todo', type: _type.DECIMAL},
- // 折合人民币
- {name: 'ConvertedIntoRMB', value: 'todo', type: _type.DECIMAL}
- ];
- _base.Element.call(this, 'SummaryOfCost', attrs);
- }
- // 建筑安装工程费
- function ProjectInstallationWorkCost(src) {
- let 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) {
- let 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) {
- let 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) {
- let 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) {
- let 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) {
- let 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() {
- // 省略了一些
- let 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) {
- let 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) {
- let 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) {
- let 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) {
- let attrs = [
- {name: 'Name', value: src.name, required: true},
- {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
- {name: 'Remark', value: src.remark}
- ];
- _base.Element.call(this, 'WorkContent', attrs);
- }
- // 定额子目
- function Norm(src) {
- let 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) {
- // 提取出的数据
- let extractData = [];
- // 建设项目部分
- let constructionProject = await loadProject(projectData);
- extractData.push({
- data: constructionProject,
- dataType: DATA_TYPE.project,
- exportKind,
- fileName: 'Project.xml'
- });
- // 单位工程部分
- // 提取出单位工程级别的项目数据
- let tenderData = projectData.children.reduce((acc, cur) => {
- if (Array.isArray(cur.children)) {
- acc.push(...cur.children)
- }
- return acc;
- }, []);
- // 获取单位工程详细结构
- let isPlainTender = false;
- let tenders = await loadTender(projectData.summaryInfo, tenderData, isPlainTender);
- tenders.forEach(tender => {
- // 单位工程文件名为@_单位工程编码_单位工程名称.xml
- // 因为单位工程编码后续用户可能会改变,这里暂时将fileName设置成单位工程名称.xml
- let 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) {
- let basicInformation = projectData.property.basicInformation,
- summaryInfo = projectData.summaryInfo[projectData.ID];
- // 建设项目
- let constructionProject = new ConstructionProject({
- name: projectData.data,
- basicInformation
- });
- // 系统信息
- let systemInfo = new SystemInfo({
- // 软件相关信息进行base64编码
- ID1: Base64.encode(projectData.softInfo),
- generatedTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss')
- });
- // 工程信息
- let constructionInfo = loadConstructionInfo(projectData);
- // 费用汇总
- let summaryCost = new SummaryOfCost(summaryInfo);
- // 建筑安装工程费
- let projectInstall = new ProjectInstallationWorkCost({
- name: projectData.name,
- basicInformation,
- summaryInfo
- });
- // 单项工程
- let sectionalWorks = await loadEngineering(summaryInfo, projectData.children);
- projectInstall.children.push(...sectionalWorks);
- constructionProject.children.push(
- systemInfo,
- constructionInfo,
- summaryCost,
- projectInstall
- );
- return constructionProject;
- }
- // 加载工程信息相关元素
- function loadConstructionInfo(projectData) {
- let basicInformation = projectData.property.basicInformation,
- summaryInfo = projectData.summaryInfo[projectData.ID];
- // 工程信息
- let constructionInfo = new ConstructionInfo();
- // 费用精度
- let option = new Option();
- // 估(概、预、结)算信息
- let 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) {
- let isPlainTender = true;
- let engineeringTasks = engineeringData.map(async engData => {
- let summaryInfo = summaryInfoMap[engData.ID];
- // 单项工程
- let sectionalWork = new SectionWorks({
- name: engData.name,
- summaryInfo
- });
- // 费用汇总
- let summaryCost = new SummaryOfCost(summaryInfo);
- // 简单结构的单位工程
- let 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) {
- let tenderTasks = tenderData.map(async tData => {
- let summaryInfo = summaryInfoMap[tData.ID];
- // 单位工程
- let unitWork = new UnitWorks({
- name: tData.name,
- summaryInfo: summaryInfo
- });
- // 简单结构,不需要继续添加子元素
- if (isPlain) {
- return unitWork;
- }
- // 不是简单结构,继续添加各种子元素
- // 工程特征信息
- let attrInfo = loadAttrInfo(tData.property.projectFeature);
- // 费用汇总
- let summaryOfCost = new SummaryOfCost(summaryInfo);
- // 获取单位工程详细数据
- let tenderDetail = await _util.getTenderDetail(tData.ID, userID);
- // 单位工程费用汇总
- });
- return await Promise.all(tenderTasks);
- }
- // 加载工程特征信息
- // attrList 单位工程的工程特征,来自property.projectFeature
- function loadAttrInfo(attrList) {
- let 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) {
- let unitWorksSummary = new UnitWorksSummary();
- return unitWorksSummary;
- }
- // 加载分部分项工程
- function loadDivisionWorks(tenderDetail) {
- let division = new DivisionalAndElementalWorks();
- }
- }
- /*
- * 重置工程编号,广东18 3.0的接口,导出时的文件会用到这个编号
- * 因此重置工程编号后,还需要重置文件名数据
- * @param {Array}codes 工程编号
- * {Array}extractData 提取的数据
- * @return {void}
- * */
- function resetContentCode(codes, extractData) {
- // 提取到的数据分两种类型:
- // 1.根元素为建设项目:需要修改建设项目下的单位工程元素的编码和文件名
- // 2.根元素为单位工程:需要修改单位工程的编码和文件名
- // 获取建设项目数据下的单位工程元素
- let ExtractProjects = extractData.filter(data => data.dataType === DATA_TYPE.project);
- let tenders1 = ExtractProjects.map(extractP => {
- // 建设项目元素下建筑安装工程费元素
- let projectInstallations = _util.getElementFromSrc(extractP.data, 'ProjectInstallationWorkCost');
- // 建筑安装工程费元素下单项工程元素
- let sectionalWorks = projectInstallations.reduce((acc, cur) => {
- let sections = _util.getElementFromSrc(cur, 'SectionalWorks');
- acc.push(...sections);
- }, []);
- // 单项工程元素下单位工程元素
- return sectionalWorks.reduce((acc, cur) => {
- let tenders = _util.getElementFromSrc(cur, 'UnitWorks');
- acc.push(...tenders);
- }, []);
- });
- // 重置编号
- let idx = 0;
- for (let tender of tenders1) {
- let codeItem = tender.attrs.find(attr => attr.name === '编号');
- codeItem.value = codes[idx++];
- }
- }
- })();
|