exportStdInterface_gd18.js 50 KB

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