exportStdInterface_gd18.js 50 KB

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