henan2022.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. if (typeof feeRateObject !== "undefined") {
  2. feeRateObject.feeRateSpecialHandle = function (subRate, value) {
  3. let result = {};
  4. if (subRate.name == "综合里程(km)" && value && value < 3) {
  5. //综合里程3km以内按3km算
  6. result.valueKey = "3";
  7. result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
  8. }
  9. if (subRate.name == "工地转移(km)" && value && value < 50) {
  10. //工地转移50km以内按50km算
  11. result.valueKey = "50";
  12. result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
  13. }
  14. if (subRate.name == "施工进出场(km)" && value && value < 5) {
  15. //施工进出场5km以内按5km算
  16. result.valueKey = "5";
  17. result.value = scMathUtil.roundForObj(value, getDecimal("feeRate")); //设置显示的节点值
  18. }
  19. return result;
  20. };
  21. }
  22. // 清单基数
  23. const littleFixNames = ["小修", "养护检查预算", "日常养护预算"];
  24. const progression = ["养护单位(业主)管理费", "工程监理费", "设计文件审查费"];
  25. const deficiency = { 养护工程监理费: 10000, 设计文件审查费: 10000 };
  26. if (typeof baseFigureMap !== "undefined") {
  27. const { fixedFlag } = commonConstants;
  28. const budgetMap = {
  29. // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示。
  30. 建筑安装工程费: {
  31. base: "JZAZGCF",
  32. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  33. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  34. pick: false,
  35. },
  36. // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
  37. "建筑安装工程费(不含设备费)": {
  38. base: "JZAZGCFBHSB",
  39. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  40. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  41. pick: false,
  42. },
  43. // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
  44. 定额建筑安装工程费: {
  45. base: "DEJZAZGCF",
  46. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  47. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  48. pick: false,
  49. },
  50. // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
  51. "养护单位(业主)管理费": {
  52. isProgressive: true,
  53. base: "YHDWYZGLF",
  54. fixedFlag: null,
  55. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  56. pick: true,
  57. },
  58. 信息化费: {
  59. base: "YHXMXXHF",
  60. fixedFlag: null,
  61. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  62. pick: true,
  63. },
  64. 工程监理费: {
  65. isProgressive: true,
  66. base: "YHGCJLF",
  67. fixedFlag: null,
  68. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  69. pick: true,
  70. engineeringList: littleFixNames,
  71. },
  72. 设计文件审查费: {
  73. isProgressive: true,
  74. base: "SJWJSCF",
  75. fixedFlag: null,
  76. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  77. pick: true,
  78. engineeringList: ["大修", "中修"],
  79. },
  80. 施工场地建设费: {
  81. isProgressive: true,
  82. base: "SGCDJSF",
  83. fixedFlag: null,
  84. filter: [fixedFlag.CONSTRUCTION_PLANT_COST],
  85. pick: true,
  86. },
  87. // 显示:除清单固定类别是“一二三四部分合计”的以外部分可显示。
  88. 一二三四部分合计: {
  89. base: "YESSBFHJ",
  90. fixedFlag: fixedFlag.ONE_TO_FOUR_TOTAL,
  91. filter: [fixedFlag.ONE_TO_FOUR_TOTAL],
  92. pick: false,
  93. },
  94. // 显示:仅“价差预备费”可显示
  95. 价差预备费: {
  96. base: "JCYBF",
  97. fixedFlag: null,
  98. filter: [fixedFlag.SPREAD_BUDGET_FEE],
  99. pick: true,
  100. },
  101. };
  102. const boqMap = {
  103. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  104. 专项暂定合计: {
  105. base: "ZXZDHJ",
  106. fixedFlag: null,
  107. filter: [fixedFlag.ONE_SEVEN_BILLS],
  108. pick: false,
  109. },
  110. /*
  111. * 清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
  112. * 因此{100章以外合计}不设置关联的清单固定行
  113. * */
  114. //仅允许用于固定类别为“100章清单”引用
  115. "100章以外清单合计": {
  116. base: "YBZYHQDHJ",
  117. fixedFlag: null,
  118. filter: [fixedFlag.ONE_HUNDRED_BILLS],
  119. pick: true,
  120. },
  121. };
  122. baseFigureMap.budget = budgetMap;
  123. baseFigureMap.boq = boqMap;
  124. }
  125. // 是否是小修
  126. const isLittleFix = (engName) => {
  127. return littleFixNames.some((name) => new RegExp(name).test(engName));
  128. };
  129. if (typeof baseFigureTemplate !== "undefined") {
  130. const { fixedFlag } = commonConstants;
  131. baseFigureTemplate.budget = {
  132. // 建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的建安费。
  133. JZAZGCF(tender) {
  134. return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, "common");
  135. },
  136. // 建筑安装工程费(不含设备费)算法:取清单固定类别是“建筑安装工程费”的金额 - {设备费}。
  137. JZAZGCFBHSB(tender) {
  138. const engName = projectObj.project.property.engineeringName;
  139. if (isLittleFix(engName)) {
  140. // 小修的没有设备购置固定行
  141. const baseFee = cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, "common");
  142. const fixedNode = projectObj.project.mainTree.roots.find((node) => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
  143. const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, "common");
  144. return (baseFee - equipmentFee).toDecimal(decimalObj.bills.totalPrice);
  145. } else {
  146. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, "common");
  147. }
  148. },
  149. JZAZGCFBHAQSCF(tender) {
  150. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, "common");
  151. },
  152. // 定额建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的定额建安费(其中定额设备费按40%计算)。
  153. DEJZAZGCF(tender) {
  154. const engName = projectObj.project.property.engineeringName;
  155. const feeField = "rationCommon";
  156. if (isLittleFix(engName)) {
  157. // 小修的没有设备购置固定行
  158. const baseFee = cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, feeField);
  159. const fixedNode = projectObj.project.mainTree.roots.find((node) => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
  160. const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, "equipment");
  161. return (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.bills.totalPrice);
  162. } else {
  163. const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
  164. //建安费扣除定额设备购置费
  165. const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, feeField, false);
  166. //定额设备购置费
  167. const equipmentAcFee = cbTools.getBaseFee(deductFlags[0], tender, "equipment");
  168. const equipmentAcTaxFee = cbTools.getBaseFee(deductFlags[0], tender, "tax");
  169. return (afterDeductFee + equipmentAcFee * 0.4 + equipmentAcTaxFee).toDecimal(decimalObj.bills.totalPrice);
  170. }
  171. },
  172. DEJZAZGCFBHZXF(tender) {
  173. // 定额建筑安装工程费(不含专项费用)
  174. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SPECIAL_COST], tender, "rationCommon", true);
  175. },
  176. // 设备费 算法:取清单固定类别是“设备购置”的建安费
  177. SBF(tender) {
  178. return cbTools.getBaseFee(fixedFlag.EQUIPMENT_ACQUISITION_FEE, tender, "common");
  179. },
  180. // 设备费 算法:取清单固定类别是“设备购置”的定额建安费
  181. DESBF(tender) {
  182. return cbTools.getBaseFee(fixedFlag.EQUIPMENT_ACQUISITION_FEE, tender, "rationCommon");
  183. },
  184. // 养护工程费 算法:取清单固定类别是“养护工程费”的金额。
  185. YHGCF(tender) {
  186. return cbTools.getBaseFee(fixedFlag.MAINTENANCE_FEE, tender, "common");
  187. },
  188. // 定额养护工程费 算法:取清单固定类别是“养护工程费”的定额建安费(其中定额设备费按40%计算)。
  189. DEYHGCF(tender) {
  190. const engName = projectObj.project.property.engineeringName;
  191. const feeField = "rationCommon";
  192. if (isLittleFix(engName)) {
  193. // 小修的没有设备购置固定行
  194. const baseFee = cbTools.getBaseFee(fixedFlag.MAINTENANCE_FEE, tender, feeField);
  195. const fixedNode = projectObj.project.mainTree.items.find((node) => node.getFlag() === fixedFlag.MAINTENANCE_FEE);
  196. const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, "equipment");
  197. return (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.bills.totalPrice);
  198. } else {
  199. const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
  200. //建安费扣除定额设备购置费
  201. const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.MAINTENANCE_FEE, deductFlags, tender, feeField, false);
  202. //定额设备购置费
  203. const equipmentAcFee = cbTools.getBaseFee(deductFlags[0], tender, "equipment");
  204. const equipmentAcTaxFee = cbTools.getBaseFee(deductFlags[0], tender, "tax");
  205. return (afterDeductFee + equipmentAcFee * 0.4 + equipmentAcTaxFee).toDecimal(decimalObj.bills.totalPrice);
  206. }
  207. },
  208. // 养护单位(业主)管理费 算法:以{定额建筑安装工程费}为基数,采用累进办法计算。。
  209. YHDWYZGLF(tender) {
  210. const baseFee = this["DEJZAZGCF"](tender);
  211. if (!tender) {
  212. calcBase.baseProgressiveFee = baseFee;
  213. }
  214. return calculateUtil.getProgressiveFee(
  215. baseFee,
  216. "养护单位(业主)管理费",
  217. projectObj.project.property.progressiveInterval,
  218. decimalObj.bills.totalPrice,
  219. deficiency
  220. );
  221. },
  222. // 养护单位(业主)管理费(未单独设置) 算法:以{定额建筑安装工程费}为基数,采用累进办法计算。
  223. YHDWYZGLFWDDSZ(tender) {
  224. const baseFee = this["DEJZAZGCF"](tender);
  225. if (!tender) {
  226. calcBase.baseProgressiveFee = baseFee;
  227. }
  228. return calculateUtil.getProgressiveFee(
  229. baseFee,
  230. "养护单位(业主)管理费(未单独设置)",
  231. projectObj.project.property.progressiveInterval,
  232. decimalObj.bills.totalPrice,
  233. deficiency
  234. );
  235. },
  236. // 养护工程监理费 算法:以{定额建筑安装工程费}为基数,采用累进办法计算
  237. YHGCJLF(tender) {
  238. const baseFee = this["DEJZAZGCF"](tender);
  239. if (!tender) {
  240. calcBase.baseProgressiveFee = baseFee;
  241. }
  242. return calculateUtil.getProgressiveFee(
  243. baseFee,
  244. "养护工程监理费",
  245. projectObj.project.property.progressiveInterval,
  246. decimalObj.bills.totalPrice,
  247. deficiency
  248. );
  249. },
  250. // 养护工程监理费(路线工程) 算法:以{定额建筑安装工程费}为基数,采用累进办法计算
  251. YHGCJLFLXGC(tender) {
  252. const baseFee = this["DEJZAZGCF"](tender);
  253. if (!tender) {
  254. calcBase.baseProgressiveFee = baseFee;
  255. }
  256. return calculateUtil.getProgressiveFee(
  257. baseFee,
  258. "养护工程监理费(路线工程)",
  259. projectObj.project.property.progressiveInterval,
  260. decimalObj.bills.totalPrice,
  261. deficiency
  262. );
  263. },
  264. // 养护工程监理费(桥梁及隧道工程) 算法:以{定额建筑安装工程费}为基数,采用累进办法计算
  265. YHGCJLFQLJSDGC(tender) {
  266. const baseFee = this["DEJZAZGCF"](tender);
  267. if (!tender) {
  268. calcBase.baseProgressiveFee = baseFee;
  269. }
  270. return calculateUtil.getProgressiveFee(
  271. baseFee,
  272. "养护工程监理费(桥梁及隧道工程)",
  273. projectObj.project.property.progressiveInterval,
  274. decimalObj.bills.totalPrice,
  275. deficiency
  276. );
  277. },
  278. // 设计文件审查费 算法:以{定额建筑安装工程费}为基数,采用累进办法计算。
  279. SJWJSCF(tender) {
  280. const baseFee = this["DEJZAZGCF"](tender);
  281. if (!tender) {
  282. calcBase.baseProgressiveFee = baseFee;
  283. }
  284. return calculateUtil.getProgressiveFee(
  285. baseFee,
  286. "设计文件审查费",
  287. projectObj.project.property.progressiveInterval,
  288. decimalObj.bills.totalPrice,
  289. deficiency
  290. );
  291. },
  292. // 养护项目信息化费 (大中修):取清单固定类别是“建筑安装工程费”的定额建安费(其中定额设备费按40%计算)*0.32%计算。不足10000取10000
  293. // 养护项目信息化费 (小修):算法:取清单固定类别是“建筑安装工程费”的定额建安费(其中定额设备费按40%计算)*0.2%计算。信息化管理费不足5000元时按5000元计取。
  294. YHXMXXHF(tender) {
  295. const engName = projectObj.project.property.engineeringName;
  296. const baseFee = this["DEJZAZGCF"](tender);
  297. if (isLittleFix(engName)) {
  298. const fee = (baseFee * 0.002).toDecimal(decimalObj.bills.totalPrice);
  299. return fee > 0 && fee < 5000 ? 5000 : fee;
  300. } else {
  301. const fee = (baseFee * 0.0032).toDecimal(decimalObj.bills.totalPrice);
  302. return fee > 0 && fee < 10000 ? 10000 : fee;
  303. }
  304. },
  305. // 养护工程设计费(路线工程) 算法:以{定额建筑安装工程费}为基数,采用累进办法计算
  306. YHGCSJFLXGC(tender) {
  307. const baseFee = this["DEJZAZGCF"](tender);
  308. if (!tender) {
  309. calcBase.baseProgressiveFee = baseFee;
  310. }
  311. return calculateUtil.getProgressiveFee(
  312. baseFee,
  313. "养护工程设计费(路线工程)",
  314. projectObj.project.property.progressiveInterval,
  315. decimalObj.bills.totalPrice,
  316. deficiency
  317. );
  318. },
  319. // 养护工程设计费(独立桥梁、隧道工程) 算法:以{定额建筑安装工程费}为基数,采用累进办法计算
  320. YHGCSJFQLSDGC(tender) {
  321. const baseFee = this["DEJZAZGCF"](tender);
  322. if (!tender) {
  323. calcBase.baseProgressiveFee = baseFee;
  324. }
  325. return calculateUtil.getProgressiveFee(
  326. baseFee,
  327. "养护工程设计费(独立桥梁、隧道工程)",
  328. projectObj.project.property.progressiveInterval,
  329. decimalObj.bills.totalPrice,
  330. deficiency
  331. );
  332. },
  333. // 施工场地建设费 算法:以{定额养护工程费}为基数,采用累进办法计算
  334. SGCDJSF(tender) {
  335. const baseFee = this["DEJZAZGCFBHZXF"](tender);
  336. // 小修保养类别,施工场地建设费的计算基数定额建筑安装工程费超过30000000元时,不进行累进计算,直接按500000元计取。
  337. const engName = projectObj.project.property.engineeringName;
  338. if (isLittleFix(engName) && baseFee > 30000000) {
  339. return 500000;
  340. }
  341. if (!tender) {
  342. calcBase.baseProgressiveFee = baseFee;
  343. }
  344. return calculateUtil.getProgressiveFee(
  345. baseFee,
  346. "施工场地建设费",
  347. projectObj.project.property.progressiveInterval,
  348. decimalObj.bills.totalPrice,
  349. deficiency
  350. );
  351. },
  352. // 一二三四部分合计 算法:取清单固定类别是“一二三四部分合计”的金额
  353. YESSBFHJ(tender) {
  354. return cbTools.getBaseFee(fixedFlag.ONE_TO_FOUR_TOTAL, tender, "common");
  355. },
  356. /* 价差预备费 算法:以建筑安装工程费为基数,按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
  357. 价差预备费 P * [(1+i)^(n-1) -1]
  358. P——建筑安装工程费总额(元);
  359. i——年工程造价增涨率(%);
  360. n——设计文件编制年至养护项目开工年+养护项目建设期限(年)。
  361. */
  362. JCYBF(tender) {
  363. //建筑安装工程费作为基数
  364. const installFee = this["JZAZGCF"](tender);
  365. //年造价增涨
  366. const costGrowthRate = calcBase.project.property.costGrowthRate ? calcBase.project.property.costGrowthRate : 0;
  367. //增涨计费年限
  368. const growthPeriod = projectObj.project.property.growthPeriod ? calcBase.project.property.growthPeriod : 0;
  369. //= P * [(1+i)^(n-1) -1]
  370. return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
  371. },
  372. };
  373. baseFigureTemplate.boq = {
  374. //{专项暂定合计}
  375. // 第100章至700章清单行的暂估合价
  376. ZXZDHJ: function (tender) {
  377. return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, "estimate");
  378. },
  379. //{100章以外清单合计}
  380. // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
  381. // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
  382. YBZYHQDHJ: function (tender) {
  383. let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
  384. if (!oneToSeven) {
  385. return 0;
  386. }
  387. //100-700章固定节点的所有子节点
  388. let allChildren = [];
  389. function getChildren(nodes) {
  390. allChildren = allChildren.concat(nodes);
  391. for (let node of nodes) {
  392. if (node.children.length > 0) {
  393. getChildren(node.children);
  394. }
  395. }
  396. }
  397. getChildren(oneToSeven.children);
  398. //扣除的节点:100章的节点[100-200)
  399. let deductNodes = allChildren.filter(cbTools.withingOneHundred);
  400. //计算金额
  401. let fullFeeField = tender ? "common.tenderTotalFee" : "common.totalFee";
  402. return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  403. },
  404. };
  405. }
  406. if (typeof module !== "undefined") {
  407. // 甘肃养护,项目属性-小数位数,费率小数位数默认为2。
  408. const defaultDecimal = {
  409. bills: { unitPrice: 2, totalPrice: 0 },
  410. ration: { quantity: 3, unitPrice: 2, totalPrice: 0 },
  411. glj: { quantity: 3, unitPriceHasMix: 2, unitPrice: 2 },
  412. feeRate: 4,
  413. quantity_detail: 4,
  414. material: 5, //三材系数
  415. process: 6,
  416. marketPriceProcess: 2,
  417. temProcess: 6,
  418. };
  419. module.exports = {
  420. progression,
  421. deficiency,
  422. defaultDecimal,
  423. };
  424. }
  425. // 不显示但可的基数
  426. const invisibleBases = ["设备费", "定额设备费"];
  427. if (typeof projectObj !== "undefined") {
  428. projectObj.isInsertEquipmentVisable = function (selected) {
  429. if (projectObj.project.property.valuationType !== "ration") {
  430. //属于预算项目的情况下,在固定清单可见
  431. const engName = projectObj.project.property.engineeringName;
  432. //属于的固定清单
  433. const belongFlag = cbTools.getBelongFlag(selected);
  434. if (isLittleFix(engName)) {
  435. if (belongFlag && belongFlag === fixedFlag.MAINTENANCE_FEE) {
  436. return true;
  437. }
  438. } else {
  439. if (belongFlag && belongFlag === fixedFlag.EQUIPMENT_ACQUISITION_FEE) {
  440. return true;
  441. }
  442. }
  443. return false;
  444. }
  445. return true;
  446. };
  447. }