exportStdInterface_gd18.js 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Zhong
  6. * @date 2019/6/24
  7. * @version
  8. */
  9. /*
  10. * 广东建设工程政府投资项目造价数据标准3.0
  11. * */
  12. const XMLStandard = (function () {
  13. // 广东18的导出文件中,需要把建设项目和单位工程文件分开
  14. // 数据类别,辨别提取的数据,哪份是以建设项目为根元素,哪份以单位工程为根元素
  15. const DATA_TYPE = {
  16. 'project': 1,
  17. 'tender': 2
  18. };
  19. // 建设性质
  20. const CONSTRUCTION_TYPE = {
  21. '新建': '1',
  22. '扩建': '2',
  23. '改建': '3',
  24. '修缮': '4',
  25. '修复': '5',
  26. '维护保养': '6',
  27. '其他': '9'
  28. };
  29. // 文件类型
  30. const FILE_KIND = {
  31. '1': '6', // 投标
  32. '2': '4', // 招标
  33. '3': '5' // 控制价
  34. };
  35. // 计价模式
  36. const VALUATION_MODEL = {
  37. 'bill': '1', // 清单计价
  38. 'ration': '2', // 定额计价
  39. };
  40. // 地区类别
  41. const AREA_KIND = {
  42. '一类地区': '1',
  43. '二类地区': '2',
  44. '三类地区': '3',
  45. '四类地区': '4'
  46. };
  47. // 专业类别
  48. const SPECIALTY = {
  49. '房屋建筑与装饰': '1',
  50. '仿古建筑': '2',
  51. '安装': '3',
  52. '市政': '4',
  53. '园林绿化': '5',
  54. '矿山': '6',
  55. '构筑物': '7',
  56. '城市轨道交通': '8',
  57. '爆破': '9',
  58. '装饰装修': '10',
  59. '市政交通设施': '11',
  60. '市政养护': '12',
  61. '修缮': '13',
  62. '环卫': '14',
  63. '古建筑': '15',
  64. '节能': '16',
  65. '抗震加固': '17',
  66. '绿色建筑': '18',
  67. '工业建筑': '19',
  68. '地下管廊': '20',
  69. '装配式建筑': '21',
  70. '营造林': '22',
  71. '修复': '23',
  72. '其他': '99',
  73. };
  74. // 章节类型
  75. const CHAPTER_KIND = {
  76. '章': '1',
  77. '节': '2',
  78. '细目': '3',
  79. '其他': '4'
  80. };
  81. // 汇总类型
  82. const SUMMARY_KIND = {
  83. 'summary': '1',
  84. 'notSummary': '2'
  85. };
  86. // 清单子目类型
  87. const BILL_KIND = {
  88. '分部分项': '1',
  89. '模板及支架': '2',
  90. '脚手架': '3',
  91. '现场围挡': '4',
  92. '防尘降噪绿色施工防护': '5',
  93. '其他': '6',
  94. };
  95. // 取费类型
  96. const CALC_KIND = {
  97. '地上工程': '1',
  98. '地下明(盖)挖工程': '2',
  99. '地下暗挖工程': '3',
  100. '盾构工程': '4',
  101. '轨道工程': '5',
  102. '通信工程': '6',
  103. '信号工程': '7',
  104. '供电工程': '8',
  105. '智能与控制系统工程': '9',
  106. '机电工程': '10',
  107. '其他': '15',
  108. };
  109. // 费用归属
  110. const COST_KIND = {
  111. '建筑工程费': '1',
  112. '安装工程费': '2',
  113. '其他': '3'
  114. };
  115. // 计算方式
  116. const CALC_TYPE = {
  117. 'quantityMulTotalUnitPrice': '1', // 工程量×综合单价
  118. 'formulaAddFeeRate': '2', // 计算基数×费率
  119. 'quantityMulUnitPrice': '3' // 工程量×单价
  120. };
  121. // 降效类型 建筑装饰工程定额超高降效费用计算标记
  122. const EFFICIENCY_KIND = {
  123. 'baseReduction': '1', // 降效基础定额
  124. 'notReduction': '2', // 非降效定额
  125. 'marketPriceReduction': '3', // 按市场价计算降效费用定额
  126. 'rationPriceReduction': '4' // 按定额价计算降效费用定额
  127. };
  128. // 子目增加费类型 安装工程定额子目增加费的费用计算标记
  129. const INC_FEE_KIND = {
  130. 'subBase': '1', // 子目增加费基础定额
  131. 'notSubBase': '2', // 非子目增加费定额
  132. 'subCalc': '3' // 子目增加费用计算定额
  133. };
  134. // 通用设置和工具
  135. let _base = XML_EXPORT_BASE,
  136. _config = _base.CONFIG,
  137. _type = _config.TYPE,
  138. _util = _base.UTIL,
  139. _cache = _base.CACHE;
  140. /*
  141. * 提取数据入口
  142. * @param {String}userID 用户ID
  143. * {Number}exportKind 导出类型(投标1、招标2、控制价3
  144. * {Object}projectData 项目数据(项目自身的数据、建设、单项、单位的数据(projects表的数据),不包含详细的清单定额等数据)
  145. * @return {Array} [{data: Object, exportKind: Number, fileName: String}]
  146. * */
  147. async function entry(userID, exportKind, projectData) {
  148. // 建设项目
  149. function ConstructionProject(src) {
  150. let attrs = [
  151. // 项目编号
  152. {name: 'Number', value: '', required: true},
  153. // 项目名称
  154. {name: 'Name', value: src.name, required: true},
  155. // 工程类别
  156. {name: 'ProjectCategory', value: _util.getValueByKey(src.basicInformation, 'projectCategory'), required: true},
  157. // 工程类型 todo add key
  158. {name: 'ProjectType', value: _util.getValueByKey(src.basicInformation, 'projectType'), required: true},
  159. // 建设性质 todo add key
  160. {name: 'ConstructionType', value: _util.getValueByKey(src.basicInformation, 'constructionType'), type: _type.INT},
  161. // 文件类型
  162. {name: 'FileKind', value: src.fileKind, type: _type.INT, required: true},
  163. // 计价模式
  164. {name: 'ValuationModel', value: VALUATION_MODEL.bill, type: _type.INT, required: true},
  165. // 计税模式
  166. {name: 'TaxModel', value: src.taxType, type: _type.INT, required: true},
  167. // 地区类别 todo add key
  168. {name: 'AreaKind', value: AREA_KIND[_util.getValueByKey(src.basicInformation, 'areaKind')], type: _type.INT, required: true},
  169. // 工程地点
  170. {name: 'ProjectSite', value: _util.getValueByKey(src.basicInformation, 'projAddress')},
  171. // 建设单位
  172. {name: 'BuildUnit', value: _util.getValueByKey(src.basicInformation, 'constructionUnit'), required: true},
  173. // 建设单位法定代表人或其授权人 todo
  174. {name: 'BulidAuthorizer', value: _util.getValueByKey(src.basicInformation, 'todo')},
  175. // 数据交换标准名称
  176. {name: 'StandardName', value: '建设工程政府投资项目造价数据标准', required: true},
  177. // 数据交换标准编号
  178. {name: 'StandardNumber', value: 'DBJ/T XX-XX-2018', required: true},
  179. // 建设(编制)范围 todo
  180. {name: 'RangeOfCompilation', value: ''},
  181. // 建设规模
  182. {name: 'Scale', value: _util.getValueByKey(src.basicInformation, 'projectScale'), type: _type.DECIMAL, required: true},
  183. // 建设规模单位 todo add key
  184. {name: 'Unit', value: _util.getValueByKey(src.basicInformation, 'unit'), required: true},
  185. // 技术经济指标(元)
  186. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  187. // 总说明
  188. {name: 'Explains', value: _util.getValueByKey(src.basicInformation, 'todo')}
  189. ];
  190. _base.Element.call(this, 'ConstructionProject', attrs);
  191. }
  192. // 系统信息
  193. function SystemInfo(src) {
  194. let attrs = [
  195. // 编制软件信息
  196. {name: 'ID1', value: src.ID1},
  197. // 编制机器硬件信息,不输出
  198. {name: 'ID2', value: ''},
  199. // 文件生成时间
  200. {name: 'MakeDate', value: src.generatedTime, type: _type.DATE_TIME, required: true}
  201. ];
  202. _base.Element.call(this, 'SystemInfo', attrs);
  203. }
  204. // 工程信息
  205. function ConstructionInfo() {
  206. _base.Element.call(this, 'ConstructionInfo', []);
  207. }
  208. // 费用精度
  209. function Option() {
  210. let attrs = [
  211. // 工料机消耗量、含量、用量类小数精度
  212. {name: 'ResPrecision', value: 4, type: _type.INT, required: true},
  213. // 工程量、数量类小数精度
  214. {name: 'QuantityPrecision', value: 3, type: _type.INT, required: true},
  215. // 金额、合价、费用类小数精度
  216. {name: 'CostPrecision', value: 2, type: _type.INT, required: true},
  217. // 费率、指数、比例(%)类小数精度
  218. {name: 'RatePrecision', value: 3, type: _type.INT, required: true}
  219. ];
  220. _base.Element.call(this, 'Option', attrs);
  221. }
  222. // 估(概、预、结)算信息
  223. function ProjectInfo(src) {
  224. let attrs = [
  225. // 设计单位
  226. {name: 'Designer', value: _util.getValueByKey(src.basicInformation, 'designer')},
  227. // 承包单位
  228. {name: 'Contractor', value: _util.getValueByKey(src.basicInformation, 'Contractor')},
  229. // 编制单位
  230. {name: 'CompileCompany', value: _util.getValueByKey(src.basicInformation, 'CompileCompany'), required: true},
  231. // 编制单位法定代表人或其授权人
  232. {name: 'Authorizer', value: _util.getValueByKey(src.basicInformation, 'Authorizer')},
  233. // 编制人
  234. {name: 'Compiler', value: _util.getValueByKey(src.basicInformation, 'Compiler')},
  235. // 编制人资格证书编号
  236. {name: 'CompilerCertNo', value: _util.getValueByKey(src.basicInformation, 'CompilerCertNo')},
  237. // 编制时间
  238. {name: 'CompileDate', value: _util.getValueByKey(src.basicInformation, 'CompileDate'), required: true},
  239. // 审核人
  240. {name: 'Examiner', value: _util.getValueByKey(src.basicInformation, 'Examiner')},
  241. // 审核人资格证书编号
  242. {name: 'ExaminerCertNo', value: _util.getValueByKey(src.basicInformation, 'ExaminerCertNo')},
  243. // 审核时间
  244. {name: 'ExamineDate', value: _util.getValueByKey(src.basicInformation, 'ExamineDate')},
  245. // 审定人
  246. {name: 'Approver', value: _util.getValueByKey(src.basicInformation, 'Approver')},
  247. // 审定人资格证书编号
  248. {name: 'ApproverCertNo', value: _util.getValueByKey(src.basicInformation, 'ApproverCertNo')},
  249. // 审定时间
  250. {name: 'ApproverDate', value: _util.getValueByKey(src.basicInformation, 'ApproverDate')},
  251. // 工程总价(元)
  252. {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL, required: true}
  253. ];
  254. _base.Element.call(this, 'ProjectInfo', attrs);
  255. }
  256. // 招标信息
  257. function TendereeInfo(info) {
  258. let attrs = [
  259. // 招标人
  260. {name: 'TendereeName', value: _util.getValueByKey(info, 'TendereeName'), required: true},
  261. // 招标单位法定代表人或其授权人
  262. {name: 'TenderAuthorizer', value: _util.getValueByKey(info, 'TenderAuthorizer')},
  263. // 招标单位编制人
  264. {name: 'TenderCompiler', value: _util.getValueByKey(info, 'TenderCompiler')},
  265. // 招标单位编制人资格证书编号
  266. {name: 'TenderCompilerCertNo', value: _util.getValueByKey(info, 'TenderCompilerCertNo')},
  267. // 招标单位编制时间
  268. {name: 'TenderCompileDate', value: _util.getValueByKey(info, 'TenderCompileDate')},
  269. // 招标单位审核人
  270. {name: 'TenderExaminer', value: _util.getValueByKey(info, 'TenderExaminer')},
  271. // 招标单位审核人资格证书编号
  272. {name: 'TenderExaminerCertNo', value: _util.getValueByKey(info, 'TenderExaminerCertNo')},
  273. // 招标单位审核时间
  274. {name: 'TenderExamineDate', value: _util.getValueByKey(info, 'TenderExamineDate')},
  275. // 招标单位审定人
  276. {name: 'TenderApprover', value: _util.getValueByKey(info, 'TenderApprover')},
  277. // 招标单位审定人资格证书编号
  278. {name: 'TenderApproverCertNo', value: _util.getValueByKey(info, 'TenderApproverCertNo')},
  279. // 招标单位审定时间
  280. {name: 'TenderApproveDate', value: _util.getValueByKey(info, 'TenderApproveDate')},
  281. // 招标代理 不得为空,如无招标代理,则应填写“无”。
  282. {name: 'Proxy', value: _util.getValueByKey(info, 'Proxy'), required: true},
  283. // 招标代理资质证书编号
  284. {name: 'ProxyCertNo', value: _util.getValueByKey(info, 'ProxyCertNo')},
  285. // 招标代理法定代表人或其授权人
  286. {name: 'ProxyAuthorizer', value: _util.getValueByKey(info, 'ProxyAuthorizer')},
  287. // 招标代理编制人员
  288. {name: 'ProxyCompiler', value: _util.getValueByKey(info, 'ProxyCompiler')},
  289. // 招标代理编制人员资格证书编号
  290. {name: 'ProxyCompilerCertNo', value: _util.getValueByKey(info, 'ProxyCompilerCertNo')},
  291. // 招标代理编制时间
  292. {name: 'ProxyCompileDate', value: _util.getValueByKey(info, 'ProxyCompileDate')},
  293. // 招标代理审核人
  294. {name: 'ProxyExaminer', value: _util.getValueByKey(info, 'ProxyExaminer')},
  295. // 招标代理审核人资格证书编号
  296. {name: 'ProxyExaminerCertNo', value: _util.getValueByKey(info, 'ProxyExaminerCertNo')},
  297. // 招标代理审核时间
  298. {name: 'ProxyExamineDate', value: _util.getValueByKey(info, 'ProxyExamineDate')},
  299. // 招标代理审定人
  300. {name: 'ProxyApprover', value: _util.getValueByKey(info, 'ProxyApprover')},
  301. // 招标代理审定人资格证书编号
  302. {name: 'ProxyApproverCertNo', value: _util.getValueByKey(info, 'ProxyApproverCertNo')},
  303. // 招标代理审定时间
  304. {name: 'ProxyApproveDate', value: _util.getValueByKey(info, 'ProxyApproveDate')},
  305. // 造价咨询 、Consultant(造价咨询):不得为空,如无则应填写“无”。
  306. {name: 'Consultant', value: _util.getValueByKey(info, 'Consultant'), required: true},
  307. // 造价咨询资质证书编号
  308. {name: 'ConsultantCertNo', value: _util.getValueByKey(info, 'ConsultantCertNo')},
  309. // 造价咨询法定代表人或其授权人
  310. {name: 'ConsultantAuthorizer', value: _util.getValueByKey(info, 'ConsultantAuthorizer')},
  311. // 造价咨询编制人
  312. {name: 'ConsultantCompiler', value: _util.getValueByKey(info, 'ConsultantCompiler')},
  313. // 造价咨询编制人资格证书
  314. {name: 'ConsultantCompilerCertNo', value: _util.getValueByKey(info, 'ConsultantCompilerCertNo')},
  315. // 造价咨询编制时间
  316. {name: 'ConsultantCompileDate', value: _util.getValueByKey(info, 'ConsultantCompileDate')},
  317. // 造价咨询审核人
  318. {name: 'ConsultantExaminer', value: _util.getValueByKey(info, 'ConsultantExaminer')},
  319. // 造价咨询审核人资格证书编号
  320. {name: 'ConsultantExaminerCertNo', value: _util.getValueByKey(info, 'ConsultantExaminerCertNo')},
  321. // 造价咨询审核时间
  322. {name: 'ConsultantExamineDate', value: _util.getValueByKey(info, 'ConsultantExamineDate')},
  323. // 造价咨询审定人
  324. {name: 'ConsultantApprover', value: _util.getValueByKey(info, 'ConsultantApprover')},
  325. // 造价咨询审定人资格证书编号
  326. {name: 'ConsultantApproverCertNo', value: _util.getValueByKey(info, 'ConsultantApproverCertNo')},
  327. // 造价咨询审定时间
  328. {name: 'ConsultantApproveDate', value: _util.getValueByKey(info, 'ConsultantApproveDate')},
  329. // 招标控制价(元)
  330. {name: 'TenderSumLimit', value: 'todo', type: _type.DECIMAL, required: true}
  331. ];
  332. _base.Element.call(this, 'TendereeInfo', attrs);
  333. }
  334. // 投标信息
  335. function BidderInfo(src) {
  336. let attrs = [
  337. // 投标人
  338. {name: 'BidName', value: _util.getValueByKey(src.basicInformation, 'bidName'), required: true},
  339. // 投标单位法定代表人或其授权人
  340. {name: 'BidAuthorizer', value: _util.getValueByKey(src.basicInformation, 'bidAuthorizer')},
  341. // 投标总价(元)
  342. {name: 'BidAuthorizer', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL, required: true},
  343. // 投标单位编制人
  344. {name: 'BidCompiler', value: _util.getValueByKey(src.basicInformation, 'bidCompiler')},
  345. // 投标单位编制人资格证书编号
  346. {name: 'BidCompilerCertNo', value: _util.getValueByKey(src.basicInformation, 'BidCompilerCertNo')},
  347. // 投标单位编制时间
  348. {name: 'BidCompileDate', value: _util.getValueByKey(src.basicInformation, 'bidCompileDate')},
  349. // 投标单位审核人
  350. {name: 'BidExaminer', value: _util.getValueByKey(src.basicInformation, 'bidExaminer')},
  351. // 投标单位审核人资格证书编号
  352. {name: 'BidExaminerCertNo', value: _util.getValueByKey(src.basicInformation, 'bidExaminerCertNo')},
  353. // 投标单位审核时间
  354. {name: 'BidExamineDate', value: _util.getValueByKey(src.basicInformation, 'bidExamineDate')},
  355. // 投标单位审定人
  356. {name: 'BidApprover', value: _util.getValueByKey(src.basicInformation, 'bidApprover')},
  357. // 投标单位审定人资格证书
  358. {name: 'BidApproverCertNo', value: _util.getValueByKey(src.basicInformation, 'bidApproverCertNo')},
  359. // 投标单位审定时间
  360. {name: 'BidApproveDate', value: _util.getValueByKey(src.basicInformation, 'BidApproveDate')}
  361. ];
  362. _base.Element.call(this, 'BidderInfo', attrs);
  363. }
  364. // 费用汇总
  365. function SummaryOfCost(summaryInfo) {
  366. let attrs = [
  367. // 工程造价(元)
  368. {name: 'Total', value: summaryInfo.engineeringCost, type: _type.DECIMAL},
  369. // 建筑工程费
  370. {name: 'Construction', value: 'todo', type: _type.DECIMAL},
  371. // 安装工程费
  372. {name: 'Installation', value: 'todo', type: _type.DECIMAL},
  373. // 分部分项工程费
  374. {name: 'DivisionalAndElementalWorks', value: summaryInfo.subEngineering, type: _type.DECIMAL},
  375. // 措施项目费
  376. {name: 'Preliminaries', value: summaryInfo.measure, type: _type.DECIMAL},
  377. // 安全文明施工费
  378. {name: 'CostForHSE', value: summaryInfo.safetyConstruction, type: _type.DECIMAL},
  379. // 其他措施费
  380. {name: 'OtherPreliminaries', value: 'todo', type: _type.DECIMAL},
  381. // 其他项目费
  382. {name: 'SundryCosts', value: summaryInfo.other, type: _type.DECIMAL},
  383. // 暂列金额
  384. {name: 'ProvisionalSums', value: summaryInfo.provisional, type: _type.DECIMAL},
  385. // 暂估价材料
  386. {name: 'ProvisionalMaterial', value: summaryInfo.materialProvisional, type: _type.DECIMAL},
  387. // 专业工程暂估价
  388. {name: 'SpecialtyProvisionalPrice', value: summaryInfo.engineeringEstimate, type: _type.DECIMAL},
  389. // 计日工费用
  390. {name: 'DayWorkRate', value: summaryInfo.daywork, type: _type.DECIMAL},
  391. // 总承包服务费
  392. {name: 'MainContractorAttendance', value: summaryInfo.turnKeyContract, type: _type.DECIMAL},
  393. // 索赔费用
  394. {name: 'ClaimForLossAndExpenses', value: 'todo', type: _type.DECIMAL},
  395. // 现场签证费用
  396. {name: 'SiteInstruction', value: 'todo', type: _type.DECIMAL},
  397. // 规费
  398. {name: 'StatutoryFees', value: summaryInfo.charge, type: _type.DECIMAL},
  399. // 税金
  400. {name: 'Tax', value: summaryInfo.tax, type: _type.DECIMAL},
  401. // 人工费
  402. {name: 'Labor', value: 'todo', type: _type.DECIMAL},
  403. // 材料费
  404. {name: 'Material', value: 'todo', type: _type.DECIMAL},
  405. // 主材设备费
  406. {name: 'MainMaterialEquipment', value: 'todo', type: _type.DECIMAL},
  407. // 主材费
  408. {name: 'MainMaterial', value: 'todo', type: _type.DECIMAL},
  409. // 机械费
  410. {name: 'Machine', value: 'todo', type: _type.DECIMAL},
  411. // 管理费
  412. {name: 'Overhead', value: 'todo', type: _type.DECIMAL},
  413. // 利润
  414. {name: 'Profit', value: 'todo', type: _type.DECIMAL},
  415. // 设备费
  416. {name: 'Equipment', value: 'todo', type: _type.DECIMAL},
  417. // 其中:引进部分(美元)
  418. {name: 'ForeignCurrency', value: 'todo', type: _type.DECIMAL},
  419. // 折合人民币
  420. {name: 'ConvertedIntoRMB', value: 'todo', type: _type.DECIMAL}
  421. ];
  422. _base.Element.call(this, 'SummaryOfCost', attrs);
  423. }
  424. // 建筑安装工程费
  425. function ProjectInstallationWorkCost(src) {
  426. let attrs = [
  427. // 工程编号
  428. {name: 'Number', value: ''},
  429. // 工程名称
  430. {name: 'Name', value: src.name, required: true},
  431. // 金额 (元)
  432. {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL},
  433. // 其中:引进部分(美元)
  434. {name: 'ForeignCurrency', value: 'todo', type: _type.DECIMAL},
  435. // 折合人民币
  436. {name: 'ConvertedIntoRMB', value: 'todo', type: _type.DECIMAL},
  437. // 建设规模
  438. {name: 'Scale', value: _util.getValueByKey(src.basicInformation, 'projectScale'), type: _type.DECIMAL, required: true},
  439. // 建设规模单位 todo add key
  440. {name: 'Unit', value: _util.getValueByKey(src.basicInformation, 'unit'), required: true},
  441. // 技术经济指标(元)
  442. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  443. // 占总比例(%)
  444. {name: 'Ratios', value: '100', type: _type.DECIMAL},
  445. // 费用代号
  446. {name: 'Code', value: 'todo'},
  447. // 备注
  448. {name: 'Remark', value: src.remark}
  449. ];
  450. _base.Element.call(this, 'ProjectInstallationWorkCost', attrs);
  451. }
  452. // 单项工程
  453. function SectionWorks(src) {
  454. let attrs = [
  455. // 工程编号
  456. {name: 'Number', value: ''},
  457. // 工程名称
  458. {name: 'Name', value: src.name, required: true},
  459. // 标段
  460. {name: 'Segment', value: src.segment},
  461. // 金额
  462. {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL},
  463. // 建设规模
  464. {name: 'Scale', value: 'todo', type: _type.DECIMAL, required: true},
  465. // 建设规模单位
  466. {name: 'Unit', value: 'todo', required: true},
  467. // 技术经济指标
  468. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  469. // 占总投资比例(%)
  470. {name: 'Ratios', value: src.summaryInfo.rate, type: _type.DECIMAL},
  471. // 费用代号
  472. {name: 'Code', value: 'todo', type: _type.DECIMAL},
  473. // 备注
  474. {name: 'Remark', value: 'todo'}
  475. ];
  476. _base.Element.call(this, 'SectionWorks', attrs);
  477. }
  478. // 单位工程
  479. function UnitWorks(src) {
  480. let attrs = [
  481. // 工程编号
  482. {name: 'Number', value: '', required: true},
  483. // 工程名称
  484. {name: 'Name', value: src.name, required: true},
  485. // 标段
  486. {name: 'Segment', value: src.segment},
  487. // 工程类别
  488. {name: 'ProjectCategory', value: 'todo', required: true},
  489. // 工程类型
  490. {name: 'ProjectType', value: 'todo', required: true},
  491. // 计价模式
  492. {name: 'ValuationModel', value: VALUATION_MODEL.bill, type: _type.INT, required: true},
  493. // 计税模式
  494. {name: 'TaxModel', value: src.taxType, type: _type.INT, required: true},
  495. // 地区类别
  496. {name: 'AreaKind', value: 'todo', type: _type.INT, required: true},
  497. // 金额
  498. {name: 'Total', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL},
  499. // 专业类别
  500. {name: 'Specialty', value: src.summaryInfo.engineeringCost, type: _type.INT},
  501. // 工程用途
  502. {name: 'Purposes', value: 'todo'},
  503. //建设(编制)范围
  504. {name: 'RangeOfCompilation', value: 'todo'},
  505. // 建设规模
  506. {name: 'Scale', value: 'todo', type: _type.DECIMAL, required: true},
  507. // 建设规模单位
  508. {name: 'Unit', value: 'todo', required: true},
  509. // 技术经济指标(元)
  510. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  511. // 占总投资比例(%)
  512. {name: 'Ratios', value: src.summaryInfo.rate, type: _type.DECIMAL},
  513. // 费用代号
  514. {name: 'Code', value: 'todo'},
  515. // 清单数据库,没有则填写 “无”
  516. {name: 'BillDataBase', value: 'todo', required: true},
  517. // 定额数据库,没有则填写 “无”
  518. {name: 'NormDataBase', value: 'todo', required: true},
  519. // 人工材料设备价格文件,没有则填写 “无”
  520. {name: 'ResInfoPricingFile', value: 'todo', required: true},
  521. // 执行费率文件
  522. {name: 'AppliedRateFile', value: 'todo'},
  523. // 其他计价依据文件
  524. {name: 'OtherRelatedFile', value: 'todo'},
  525. // 总说明
  526. {name: 'Explains', value: 'todo'},
  527. // 导出XML文件名,工程编号+工程名称.xml
  528. {name: 'FileName', value: 'todo'},
  529. // 备注
  530. {name: 'Remark', value: 'todo'},
  531. ];
  532. _base.Element.call(this, 'UnitWorks', attrs);
  533. }
  534. // 工程特征信息 AttrInfo, 补充信息AddiInfo
  535. function Info(eleName) {
  536. _base.Element.call(this, eleName, []);
  537. }
  538. // 工程特征信息明细 AttrInfoItem, 补充信息明细AddiInfoItem
  539. function InfoItem(eleName, src) {
  540. let attrs = [
  541. {name: 'Name', value: src.name, required: true},
  542. {name: 'Value', value: src.value},
  543. {name: 'Code', value: src.code},
  544. {name: 'Remark', value: src.remark}
  545. ];
  546. _base.Element.call(this, eleName, attrs);
  547. }
  548. // 单位工程费用汇总
  549. function UnitWorksSummary() {
  550. _base.Element.call(this, 'UnitWorksSummary', []);
  551. }
  552. // 单位工程费用汇总标题
  553. function UnitWorksSummaryGroup(src) {
  554. let attrs = [
  555. // 费用编号
  556. {name: 'Number', value: src.code},
  557. // 费用名称
  558. {name: 'Name', value: src.name, required: true},
  559. // 单位
  560. {name: 'Unit', value: src.unit},
  561. // 工程量
  562. {name: 'Quantity', value: src.quantity, type: _type.DECIMAL},
  563. // 金额
  564. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  565. // 技术经济指标(元)
  566. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  567. // 占比(%)
  568. {name: 'Ratios', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL},
  569. //章节类型
  570. {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true},
  571. // 费用代号
  572. {name: 'Code', value: 'todo', type: _type.INT, required: true},
  573. // 汇总类型
  574. {name: 'Kind', value: 'todo', type: _type.INT, required: true},
  575. // 备注
  576. {name: 'Remark', value: src.remark}
  577. ];
  578. _base.Element.call(this, 'UnitWorksSummaryGroup', attrs);
  579. }
  580. // 单位工程费汇总明细
  581. function UnitWorksSummaryItem(src) {
  582. let attrs = [
  583. {name: 'Number', value: src.code},
  584. {name: 'Name', value: src.name, required: true},
  585. {name: 'Unit', value: src.unit},
  586. {name: 'Quantity', value: src.quantity, type: _type.DECIMAL},
  587. // 计算基数:可由费用代号、数字、四则运算符号、小括号组成
  588. {name: 'QtyFormula', value: src.calcBase, type: _type.DECIMAL},
  589. // 费率
  590. {name: 'Rate', value: src.feeRate, type: _type.DECIMAL},
  591. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  592. // 技术经济指标(元)
  593. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  594. // 占比(%)
  595. {name: 'Ratios', value: src.summaryInfo.engineeringCost, type: _type.DECIMAL},
  596. //章节类型
  597. {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true},
  598. // 费用代号
  599. {name: 'Code', value: 'todo', type: _type.INT, required: true},
  600. // 汇总类型
  601. {name: 'Kind', value: 'todo', type: _type.INT, required: true},
  602. // 备注
  603. {name: 'Remark', value: src.remark}
  604. ];
  605. _base.Element.call(this, 'UnitWorksSummaryItem', attrs);
  606. }
  607. // 分部分项工程
  608. function DivisionalAndElementalWorks() {
  609. _base.Element.call(this, 'DivisionalAndElementalWorks', []);
  610. }
  611. // 合计费用
  612. function SummaryOfBasicCost() {
  613. // 省略了一些
  614. let attrs = [
  615. {name: 'Labor', value: 'todo', type: _type.DECIMAL},
  616. {name: 'Material', value: 'todo', type: _type.DECIMAL},
  617. {name: 'Material', value: 'todo', type: _type.DECIMAL},
  618. {name: 'MainMaterial', value: 'todo', type: _type.DECIMAL},
  619. {name: 'Equipment', value: 'todo', type: _type.DECIMAL},
  620. {name: 'MainMaterialEquipment', value: 'todo', type: _type.DECIMAL},
  621. {name: 'Machine', value: 'todo', type: _type.DECIMAL},
  622. // 管理费
  623. {name: 'Overhead', value: 'todo', type: _type.DECIMAL},
  624. // 规费
  625. {name: 'StatutoryFees', value: 'todo', type: _type.DECIMAL},
  626. // 税金
  627. {name: 'Tax', value: 'todo', type: _type.DECIMAL},
  628. // 利润
  629. {name: 'Profit', value: 'todo', type: _type.DECIMAL},
  630. // 暂估价
  631. {name: 'Appraisal', value: 'todo', type: _type.DECIMAL}
  632. ];
  633. _base.Element.call(this, 'SummaryOfBasicCost', attrs);
  634. }
  635. // 分部工程
  636. function DivisionalWorks(src) {
  637. let attrs = [
  638. // 编码
  639. {name: 'Number', value: src.code},
  640. {name: 'Name', value: src.name, required: true},
  641. // 特征
  642. {name: 'Attr', value: 'todo'},
  643. {name: 'Unit', value: src.unit},
  644. {name: 'Quantity', value: src.quantity, type: _type.DECIMAL},
  645. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  646. {name: 'TechnicalAndEconomicIndex', value: 'todo', type: _type.DECIMAL},
  647. {name: 'ChapterKind', value: 'todo', type: _type.INT, required: true},
  648. {name: 'Code', value: 'todo', type: _type.INT},
  649. {name: 'Remark', value: src.remark}
  650. ];
  651. _base.Element.call(this, 'DivisionalWorks', attrs);
  652. }
  653. // 清单项目
  654. function WorkElement(src) {
  655. let attrs = [
  656. // 项目编码
  657. {name: 'Number', value: src.code, required: true},
  658. // 项目名称
  659. {name: 'Name', value: src.name, required: true},
  660. // 项目特征
  661. {name: 'Attr', value: 'todo'},
  662. // 工作内容
  663. {name: 'WorkContent', value: 'todo'},
  664. // 计量单位
  665. {name: 'Unit', value: src.unit, required: true},
  666. // 工程量
  667. {name: 'Quantity', value: src.quantity, type: _type.DECIMAL},
  668. // 计算基数
  669. {name: 'QtyFormula', value: src.calcBase, type: _type.DECIMAL},
  670. // 单价(元)
  671. {name: 'Price', value: _util.getFee(src.fees, 'common.unitFee'), type: _type.DECIMAL},
  672. // 设备单价(元)指清单项目所采用设备的综合单价
  673. {name: 'EquipmentPrice', value: 'todo', type: _type.DECIMAL},
  674. // 最低限价(元)
  675. {name: 'PriceLow', value: 'todo', type: _type.DECIMAL},
  676. // 最高限价(元)
  677. {name: 'PriceHigh', value: src.maxPrice, type: _type.DECIMAL},
  678. // 费率(%)
  679. {name: 'Rate', value: src.feeRate, type: _type.DECIMAL},
  680. // 合价(元)
  681. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  682. // 主要清单
  683. {name: 'Total', value: !!src.mainBills, type: _type.BOOL},
  684. // 子目类型
  685. {name: 'Kind', value: 'todo', type: _type.INT, required: true},
  686. // 取费类型
  687. {name: 'CalculationKind', value: 'todo', type: _type.INT, required: true},
  688. // 费用归属
  689. {name: 'CostKind', value: 'todo', type: _type.INT, required: true},
  690. // 计算方式
  691. {name: 'CalcType', value: 'todo', type: _type.INT, required: true},
  692. // 专业类型
  693. {name: 'Specialty', value: 'todo', type: _type.INT},
  694. // 清单标识
  695. {name: 'ListingIdentity', value: 'todo'},
  696. // 费用代号
  697. {name: 'Code', value: 'todo'},
  698. {name: 'Remark', value: src.remark}
  699. ];
  700. _base.Element.call(this, 'WorkElement', attrs);
  701. }
  702. // 工程量计算表
  703. function ExpressElement(src) {
  704. let attrs = [
  705. // 序号
  706. {name: 'OrderNumber', value: 'todo', required: true},
  707. // 工程量计算式
  708. {name: 'Express', value: 'todo', required: true},
  709. // 工程量
  710. {name: 'Quantity', value: 'todo', required: true},
  711. // 汇总类型
  712. {name: 'Kind', value: 'todo', type: _type.INT, required: true},
  713. {name: 'Remark', value: src.remark}
  714. ];
  715. _base.Element.call(this, 'ExpressElement', attrs);
  716. }
  717. // 工序内容
  718. function WorkContent(src) {
  719. let attrs = [
  720. {name: 'Name', value: src.name, required: true},
  721. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  722. {name: 'Remark', value: src.remark}
  723. ];
  724. _base.Element.call(this, 'WorkContent', attrs);
  725. }
  726. // 定额子目
  727. function Norm(src) {
  728. let attrs = [
  729. // 定额编码
  730. {name: 'Number', value: src.code, required: true},
  731. {name: 'Name', value: src.name, required: true},
  732. {name: 'Unit', value: src.unit, required: true},
  733. {name: 'Quantity', value: src.quantity, type: _type.DECIMAL},
  734. // 单价
  735. {name: 'Price', value: _util.getFee(src.fees, 'common.unitFee'), type: _type.DECIMAL},
  736. // 设备单价
  737. {name: 'EquipmentPrice', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL},
  738. // 合价
  739. {name: 'Total', value: _util.getFee(src.fees, 'common.totalFee'), type: _type.DECIMAL},
  740. // 设备合价
  741. {name: 'EquipmentTotal', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL},
  742. // 其中:引进部分(美元)
  743. {name: 'ForeignCurrency', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL},
  744. // 折合人民币(元)
  745. {name: 'ConvertedIntoRMB', value: _util.getFee(src.fees, 'todo'), type: _type.DECIMAL},
  746. // 是否定额
  747. {name: 'IsNorm', value: _util.getFee(src.fees, 'todo'), type: _type.Bool, required: true},
  748. // 子目类型
  749. {name: 'Kind', value: 'todo', type: _type.INT, required: true},
  750. // 取费类型
  751. {name: 'CalculationKind', value: 'todo', type: _type.INT, required: true},
  752. // 费用归属
  753. {name: 'CostKind', value: 'todo', type: _type.INT, required: true},
  754. // 降效类型
  755. {name: 'EfficiencyKind', value: 'todo', type: _type.INT},
  756. // 子目增加费类型
  757. {name: 'IncFeeKind', value: 'todo', type: _type.INT},
  758. // 换算说明
  759. {name: 'Conversion', value: 'todo'},
  760. // 专业类别
  761. {name: 'Specialty', value: 'todo', type: _type.INT},
  762. //定额标识
  763. {name: 'NormIdentity', value: 'todo'},
  764. // 册 定额书没有分册填写0,有分册的按册号填写
  765. {name: 'Volume', value: 'todo', type: _type.INT},
  766. // 章
  767. {name: 'Chapter', value: 'todo', type: _type.INT},
  768. {name: 'Remark', value: src.remark}
  769. ];
  770. _base.Element.call(this, 'Norm', attrs);
  771. }
  772. /*
  773. * 加载数据,分两种数据类型
  774. * 1.建设项目
  775. * 2.建设项目下单位工程
  776. * @param {Object}项目数据
  777. * @return {Array}
  778. * */
  779. async function loadData(projectData) {
  780. // 提取出的数据
  781. let extractData = [];
  782. // 建设项目部分
  783. let constructionProject = await loadProject(projectData);
  784. extractData.push({
  785. data: constructionProject,
  786. dataType: DATA_TYPE.project,
  787. exportKind,
  788. fileName: 'Project.xml'
  789. });
  790. // 单位工程部分
  791. // 提取出单位工程级别的项目数据
  792. let tenderData = projectData.children.reduce((acc, cur) => {
  793. if (Array.isArray(cur.children)) {
  794. acc.push(...cur.children)
  795. }
  796. return acc;
  797. }, []);
  798. // 获取单位工程详细结构
  799. let isPlainTender = false;
  800. let tenders = await loadTender(projectData.summaryInfo, tenderData, isPlainTender);
  801. tenders.forEach(tender => {
  802. // 单位工程文件名为@_单位工程编码_单位工程名称.xml
  803. // 因为单位工程编码后续用户可能会改变,这里暂时将fileName设置成单位工程名称.xml
  804. let name = tender.attrs.find(attr => attr.name === 'Name');
  805. extractData.push({
  806. data: tender,
  807. dataType: DATA_TYPE.tender,
  808. exportKind,
  809. fileName: `${name}.xml`
  810. })
  811. });
  812. return extractData;
  813. }
  814. /*
  815. * 加载建设项目
  816. * @param {Object}项目数据
  817. * @return {Array}
  818. * */
  819. async function loadProject(projectData) {
  820. let basicInformation = projectData.property.basicInformation,
  821. summaryInfo = projectData.summaryInfo[projectData.ID];
  822. // 建设项目
  823. let constructionProject = new ConstructionProject({
  824. name: projectData.data,
  825. basicInformation
  826. });
  827. // 系统信息
  828. let systemInfo = new SystemInfo({
  829. // 软件相关信息进行base64编码
  830. ID1: Base64.encode(projectData.softInfo),
  831. generatedTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss')
  832. });
  833. // 工程信息
  834. let constructionInfo = loadConstructionInfo(projectData);
  835. // 费用汇总
  836. let summaryCost = new SummaryOfCost(summaryInfo);
  837. // 建筑安装工程费
  838. let projectInstall = new ProjectInstallationWorkCost({
  839. name: projectData.name,
  840. basicInformation,
  841. summaryInfo
  842. });
  843. // 单项工程
  844. let sectionalWorks = await loadEngineering(summaryInfo, projectData.children);
  845. projectInstall.children.push(...sectionalWorks);
  846. constructionProject.children.push(
  847. systemInfo,
  848. constructionInfo,
  849. summaryCost,
  850. projectInstall
  851. );
  852. return constructionProject;
  853. }
  854. // 加载工程信息相关元素
  855. function loadConstructionInfo(projectData) {
  856. let basicInformation = projectData.property.basicInformation,
  857. summaryInfo = projectData.summaryInfo[projectData.ID];
  858. // 工程信息
  859. let constructionInfo = new ConstructionInfo();
  860. // 费用精度
  861. let option = new Option();
  862. // 估(概、预、结)算信息
  863. let projectInfo = new ProjectInfo({
  864. basicInformation: basicInformation,
  865. summaryInfo: summaryInfo
  866. });
  867. let exportInfo;
  868. if (exportKind === _config.EXPORT_KIND.Bid) {
  869. // 招标信息
  870. exportInfo = new TendereeInfo({
  871. basicInformation: basicInformation
  872. });
  873. } else if (exportKind === _config.EXPORT_KIND.Tender) {
  874. // 投标信息
  875. exportInfo = new BidderInfo({
  876. basicInformation: basicInformation,
  877. summaryInfo: summaryInfo
  878. });
  879. }
  880. constructionInfo.push(option, projectInfo, exportInfo);
  881. return constructionInfo;
  882. }
  883. /*
  884. * 加载所有单项工程元素
  885. * @param {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射)
  886. * {Array}engineeringData 所有单项工程项目数据
  887. * @return {Array}
  888. * */
  889. async function loadEngineering(summaryInfoMap, engineeringData) {
  890. let isPlainTender = true;
  891. let engineeringTasks = engineeringData.map(async engData => {
  892. let summaryInfo = summaryInfoMap[engData.ID];
  893. // 单项工程
  894. let sectionalWork = new SectionWorks({
  895. name: engData.name,
  896. summaryInfo
  897. });
  898. // 费用汇总
  899. let summaryCost = new SummaryOfCost(summaryInfo);
  900. // 简单结构的单位工程
  901. let tenders = await loadTender(summaryInfoMap, engData.children, isPlainTender);
  902. sectionalWork.push(summaryCost, ...tenders);
  903. return sectionalWork;
  904. });
  905. return await Promise.all(engineeringTasks);
  906. }
  907. /*
  908. * 加载所有单位工程元素
  909. * @param {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射)
  910. * {Array}tenderData 所有单项工程项目数据
  911. * {Boolean}isPlain 是否简单结构(简单结构只含有UnitWorks,其下不含子元素)
  912. * @return {Array}
  913. * */
  914. async function loadTender(summaryInfoMap, tenderData, isPlain) {
  915. let tenderTasks = tenderData.map(async tData => {
  916. let summaryInfo = summaryInfoMap[tData.ID];
  917. // 单位工程
  918. let unitWork = new UnitWorks({
  919. name: tData.name,
  920. summaryInfo: summaryInfo
  921. });
  922. // 简单结构,不需要继续添加子元素
  923. if (isPlain) {
  924. return unitWork;
  925. }
  926. // 不是简单结构,继续添加各种子元素
  927. // 工程特征信息
  928. let attrInfo = loadAttrInfo(tData.property.projectFeature);
  929. // 费用汇总
  930. let summaryOfCost = new SummaryOfCost(summaryInfo);
  931. // 获取单位工程详细数据
  932. let tenderDetail = await _util.getTenderDetail(tData.ID, userID);
  933. // 单位工程费用汇总
  934. });
  935. return await Promise.all(tenderTasks);
  936. }
  937. // 加载工程特征信息
  938. // attrList 单位工程的工程特征,来自property.projectFeature
  939. function loadAttrInfo(attrList) {
  940. let attrInfo = new Info('AttrInfo');
  941. attrInfo.children = attrList.map(attr =>
  942. new InfoItem('AttrInfoItem', {
  943. name: attr.dispName,
  944. code: attr.code,
  945. value: attr.value
  946. })
  947. );
  948. return attrInfo;
  949. }
  950. // 加载单位工程费用汇总
  951. // tenderDetail 单位工程详细数据
  952. function loadUnitWorksSummary(tenderDetail) {
  953. let unitWorksSummary = new UnitWorksSummary();
  954. return unitWorksSummary;
  955. }
  956. // 加载分部分项工程
  957. function loadDivisionWorks(tenderDetail) {
  958. let division = new DivisionalAndElementalWorks();
  959. }
  960. }
  961. /*
  962. * 重置工程编号,广东18 3.0的接口,导出时的文件会用到这个编号
  963. * 因此重置工程编号后,还需要重置文件名数据
  964. * @param {Array}codes 工程编号
  965. * {Array}extractData 提取的数据
  966. * @return {void}
  967. * */
  968. function resetContentCode(codes, extractData) {
  969. // 提取到的数据分两种类型:
  970. // 1.根元素为建设项目:需要修改建设项目下的单位工程元素的编码和文件名
  971. // 2.根元素为单位工程:需要修改单位工程的编码和文件名
  972. // 获取建设项目数据下的单位工程元素
  973. let ExtractProjects = extractData.filter(data => data.dataType === DATA_TYPE.project);
  974. let tenders1 = ExtractProjects.map(extractP => {
  975. // 建设项目元素下建筑安装工程费元素
  976. let projectInstallations = _util.getElementFromSrc(extractP.data, 'ProjectInstallationWorkCost');
  977. // 建筑安装工程费元素下单项工程元素
  978. let sectionalWorks = projectInstallations.reduce((acc, cur) => {
  979. let sections = _util.getElementFromSrc(cur, 'SectionalWorks');
  980. acc.push(...sections);
  981. }, []);
  982. // 单项工程元素下单位工程元素
  983. return sectionalWorks.reduce((acc, cur) => {
  984. let tenders = _util.getElementFromSrc(cur, 'UnitWorks');
  985. acc.push(...tenders);
  986. }, []);
  987. });
  988. // 重置编号
  989. let idx = 0;
  990. for (let tender of tenders1) {
  991. let codeItem = tender.attrs.find(attr => attr.name === '编号');
  992. codeItem.value = codes[idx++];
  993. }
  994. }
  995. })();