hunan_2020.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. // 清单基数
  2. const progression = ['施工场地建设费', '养护单位项目管理费', '养护单位项目管理费(未单独设置项目部)', '工程监理费', '工程监理费(未实行社会监理)', '设计文件审查费', '工程设计费'];
  3. const deficiency = {};
  4. if (typeof baseFigureMap !== 'undefined') {
  5. const { fixedFlag } = commonConstants;
  6. const budgetMap = {
  7. // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
  8. '养护工程费': {
  9. base: 'YHGCF',
  10. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  11. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  12. pick: false,
  13. },
  14. // 显示:仅清单固定类别是“安全生产费”的可显示
  15. '养护工程费(不含安全生产费)': {
  16. base: 'YHGCFBHSC',
  17. fixedFlag: null,
  18. filter: [fixedFlag.SAFE_COST],
  19. pick: true
  20. },
  21. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示
  22. '养护工程费(不含设备费)': {
  23. base: 'YHGCFBHSB',
  24. fixedFlag: null,
  25. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  26. pick: true
  27. },
  28. // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
  29. '定额养护工程费': {
  30. base: 'DEYHGCF',
  31. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  32. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  33. pick: false
  34. },
  35. // 显示:仅清单固定类别是“养护工程其他费用”、“施工场地建设费”的可显示
  36. '定额养护工程费(不含专项费用)': {
  37. base: 'DEYHGCFBHZXFY',
  38. fixedFlag: null,
  39. filter: [fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.CONSTRUCTION_PLANT_COST],
  40. pick: true,
  41. },
  42. // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”的以外部分可显示
  43. '土地使用及拆迁补偿费': {
  44. base: 'TDSYJCQBCF',
  45. fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
  46. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
  47. pick: false,
  48. },
  49. // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”、“工程建设其他费用”的以外部分可显示。
  50. '工程建设其他费用': {
  51. base: 'GCJSQTFY',
  52. fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
  53. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
  54. pick: false,
  55. },
  56. // 显示:仅清单固定类别是“施工场地建设费”的可显示。
  57. '施工场地建设费': {
  58. isProgressive: true,
  59. base: 'SGCDJSF',
  60. fixedFlag: null,
  61. filter: [fixedFlag.CONSTRUCTION_PLANT_COST],
  62. pick: true,
  63. },
  64. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
  65. '养护单位项目管理费': {
  66. isProgressive: true,
  67. base: 'YHDWXMGLF',
  68. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  69. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  70. pick: true,
  71. },
  72. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
  73. '养护单位项目管理费(未单独设置项目部)': {
  74. isProgressive: true,
  75. base: 'YHDWXMGLFWSXMB',
  76. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  77. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  78. pick: true,
  79. },
  80. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
  81. '工程监理费': {
  82. isProgressive: true,
  83. base: 'GCJLF',
  84. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  85. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  86. pick: true,
  87. },
  88. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
  89. '工程监理费(未实行社会监理)': {
  90. isProgressive: true,
  91. base: 'GCJLFWSXSHJL',
  92. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  93. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  94. pick: true,
  95. },
  96. // 显示:只有清单固定类别是“养护工程其他费用”部分可显示。
  97. '设计文件审查费': {
  98. isProgressive: true,
  99. base: 'SJWJSCF',
  100. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  101. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  102. pick: true,
  103. },
  104. // 显示:只有清单固定类别是“养护工程其他费用”部分可显示。
  105. '工程设计费': {
  106. isProgressive: true,
  107. base: 'GCSJF',
  108. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  109. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  110. pick: true,
  111. },
  112. // 显示:仅“价差预备费”可显示
  113. '价差预备费': {
  114. base: 'JCYBF',
  115. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  116. filter: [fixedFlag.SPREAD_BUDGET_FEE],
  117. pick: true,
  118. },
  119. };
  120. const boqMap = {
  121. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  122. '各章清单合计': {
  123. base: 'GZQDHJ',
  124. fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
  125. filter: [fixedFlag.ONE_SEVEN_BILLS],
  126. pick: false
  127. },
  128. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  129. '专项暂定合计': {
  130. base: 'ZXZDHJ',
  131. fixedFlag: null,
  132. filter: [fixedFlag.ONE_SEVEN_BILLS],
  133. pick: false
  134. },
  135. /*
  136. * 清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
  137. * 因此{100章以外合计}不设置关联的清单固定行
  138. * */
  139. //仅允许用于固定类别为“100章清单”引用
  140. '100章以外清单合计': {
  141. base: 'YBZYHQDHJ',
  142. fixedFlag: null,
  143. filter: [fixedFlag.ONE_HUNDRED_BILLS],
  144. pick: true
  145. }
  146. };
  147. baseFigureMap.budget = budgetMap;
  148. baseFigureMap.boq = boqMap;
  149. }
  150. if (typeof baseFigureTemplate !== 'undefined') {
  151. const { fixedFlag } = commonConstants;
  152. baseFigureTemplate.budget = {
  153. // 养护工程费 算法:取清单固定类别是“建筑安装工程费”的金额。
  154. YHGCF(tender) {
  155. return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
  156. },
  157. // 养护工程费(不含安全生产费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除“安全生产费”的金额。
  158. YHGCFBHSC(tender) {
  159. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, 'common');
  160. },
  161. // 养护工程费(不含设备费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除设备的金额。
  162. YHGCFBHSB(tender) {
  163. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
  164. },
  165. // 定额养护工程费 取清单固定类别是“建筑安装工程费”的定额建安费。
  166. DEYHGCF(tender) {
  167. return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'rationCommon');
  168. },
  169. // 定额养护工程费(不含专项费用) 算法:取清单固定类别是“建筑安装工程费”的“定额建安费”,扣除“专项费用”的“定额建安费”。
  170. DEYHGCFBHZXFY(tender) {
  171. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SPECIAL_COST], tender, 'rationCommon');
  172. },
  173. // 土地使用及拆迁补偿费 算法:取清单固定类别是“土地使用及拆迁补偿费”的金额。
  174. TDSYJCQBCF(tender) {
  175. return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
  176. },
  177. // 工程建设其他费用 算法:取清单固定类别是“养护工程其他费用”的金额。
  178. GCJSQTFY(tender) {
  179. return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
  180. },
  181. // 施工场地建设费 算法:以{定额养护工程费(不含专项费用)}为基数,采用累进办法计算。
  182. SGCDJSF(tender) {
  183. const baseFee = this['DEYHGCFBHZXFY'](tender);
  184. if (!tender) {
  185. calcBase.baseProgressiveFee = baseFee;
  186. }
  187. return calculateUtil.getProgressiveFee(baseFee, '施工场地建设费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  188. },
  189. // 养护单位项目管理费 算法:以{定额养护工程费}为基数,采用累进办法计算。
  190. YHDWXMGLF(tender) {
  191. const baseFee = this['DEYHGCF'](tender);
  192. if (!tender) {
  193. calcBase.baseProgressiveFee = baseFee;
  194. }
  195. return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  196. },
  197. // 养护单位项目管理费(未单独设置项目部) 算法:以{定额养护工程费}为基数,采用累进办法计算。
  198. YHDWXMGLFWSXMB(tender) {
  199. const baseFee = this['DEYHGCF'](tender);
  200. if (!tender) {
  201. calcBase.baseProgressiveFee = baseFee;
  202. }
  203. return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费(未单独设置项目部)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  204. },
  205. // 工程监理费 算法:以{定额养护工程费}为基数,采用累进办法计算。
  206. GCJLF(tender) {
  207. const baseFee = this['DEYHGCF'](tender);
  208. if (!tender) {
  209. calcBase.baseProgressiveFee = baseFee;
  210. }
  211. return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  212. },
  213. // 工程监理费(未实行社会监理) 算法:以{定额养护工程费}为基数,采用累进办法计算。
  214. GCJLFWSXSHJL(tender) {
  215. const baseFee = this['DEYHGCF'](tender);
  216. if (!tender) {
  217. calcBase.baseProgressiveFee = baseFee;
  218. }
  219. return calculateUtil.getProgressiveFee(baseFee, '工程监理费(未实行社会监理)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  220. },
  221. // 设计文件审查费 算法:以{定额养护工程费}为基数,采用累进办法计算。
  222. SJWJSCF(tender) {
  223. const baseFee = this['DEYHGCF'](tender);
  224. if (!tender) {
  225. calcBase.baseProgressiveFee = baseFee;
  226. }
  227. return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  228. },
  229. // 工程设计费 算法:以{定额养护工程费}为基数,采用累进办法计算。
  230. GCSJF(tender) {
  231. const baseFee = this['DEYHGCF'](tender);
  232. if (!tender) {
  233. calcBase.baseProgressiveFee = baseFee;
  234. }
  235. return calculateUtil.getProgressiveFee(baseFee, '工程设计费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  236. },
  237. /* 价差预备费 算法:以建筑安装工程费为基数,按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
  238. 价差预备费 P * [(1+i)^(n-1) -1]
  239. P——建筑安装工程费总额(元);
  240. i——年工程造价增涨率(%);
  241. n——设计文件编制年至养护项目开工年+养护项目建设期限(年)。
  242. */
  243. JCYBF(tender) {
  244. //建筑安装工程费作为基数
  245. const installFee = this['JZAZGCF'](tender);
  246. //年造价增涨
  247. const costGrowthRate = calcBase.project.property.costGrowthRate
  248. ? calcBase.project.property.costGrowthRate
  249. : 0;
  250. //增涨计费年限
  251. const growthPeriod = projectObj.project.property.growthPeriod
  252. ? calcBase.project.property.growthPeriod
  253. : 0;
  254. //= P * [(1+i)^(n-1) -1]
  255. return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
  256. }
  257. };
  258. baseFigureTemplate.boq = {
  259. //{各章清单合计}
  260. // 取清单固定类别是“第100章至700章清单”的金额
  261. 'GZQDHJ': function (tender) {
  262. return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
  263. },
  264. //{专项暂定合计}
  265. // 汇总专项暂定列有值的清单的金额
  266. 'ZXZDHJ': function (tender) {
  267. let rst = 0,
  268. feeField = 'common',
  269. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  270. let billsData = calcBase.project.Bills.datas,
  271. filterData = billsData.filter(function (data) {
  272. return data.specialProvisional;
  273. });
  274. for (let data of filterData) {
  275. if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
  276. cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
  277. continue;
  278. }
  279. rst += data.feesIndex[feeField][subFeeField];
  280. }
  281. return rst.toDecimal(decimalObj.bills.totalPrice);
  282. },
  283. //{100章以外清单合计}
  284. // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
  285. // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
  286. 'YBZYHQDHJ': function (tender) {
  287. let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
  288. if (!oneToSeven) {
  289. return 0;
  290. }
  291. //100-700章固定节点的所有子节点
  292. let allChildren = [];
  293. function getChildren(nodes) {
  294. allChildren = allChildren.concat(nodes);
  295. for (let node of nodes) {
  296. if (node.children.length > 0) {
  297. getChildren(node.children);
  298. }
  299. }
  300. }
  301. getChildren(oneToSeven.children);
  302. //扣除的节点:100章的节点[100-200)
  303. let deductNodes = allChildren.filter(cbTools.withingOneHundred);
  304. //计算金额
  305. let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
  306. return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  307. }
  308. };
  309. }
  310. // CommonJS module
  311. if (typeof module !== 'undefined' && !module.nodeType) { // 防止module是前端的一个html标签
  312. module.exports = {
  313. progression,
  314. deficiency
  315. };
  316. }