neimeng_2019.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. /**
  2. * Created by CSL on 2019/09/23. 内蒙计算程序、基数 等覆盖。
  3. */
  4. let isNM2019 = true;
  5. function overwriteRationCalcBases() {
  6. if (typeof rationCalcBases == 'undefined') return;
  7. for (let key in rationCalcBases) delete rationCalcBases[key];
  8. rationCalcBases['人工费'] = function (node, isTender) {
  9. return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
  10. };
  11. rationCalcBases['材料费'] = function (node, isTender) {
  12. return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
  13. };
  14. rationCalcBases['施工机械使用费'] = function (node, isTender) {
  15. return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
  16. };
  17. rationCalcBases['施工机械人工费'] = function (node, isTender) {
  18. return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
  19. };
  20. rationCalcBases['设备购置费'] = function (node, isTender) {
  21. return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
  22. };
  23. rationCalcBases['定额人工费'] = function (node, isTender) {
  24. return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
  25. };
  26. rationCalcBases['定额材料费'] = function (node, isTender) {
  27. return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
  28. };
  29. rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
  30. return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
  31. };
  32. rationCalcBases['定额商品砼费'] = function (node, isTender) {
  33. return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
  34. };
  35. rationCalcBases['定额设备费'] = function (node, isTender) {
  36. return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
  37. };
  38. rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
  39. return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
  40. };
  41. rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
  42. return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
  43. };
  44. };
  45. (function overwriteFeeTypes() {
  46. if (typeof cpFeeTypes == 'undefined') return;
  47. cpFeeTypes = [
  48. { type: 'marketLabour', name: '人工费' },
  49. { type: 'marketMaterial', name: '材料费' },
  50. { type: 'marketMachine', name: '施工机械使用费' },
  51. { type: 'marketMachineLabour', name: '施工机械人工费' },
  52. { type: 'marketEquipment', name: '设备购置费' },
  53. { type: 'marketDirect', name: '直接费' },
  54. { type: 'labour', name: '定额人工费' },
  55. { type: 'material', name: '定额材料费' },
  56. { type: 'machine', name: '定额施工机械使用费' },
  57. { type: 'equipment', name: '定额设备购置费' },
  58. { type: 'direct', name: '定额直接费' },
  59. { type: 'measure', name: '措施费' },
  60. { type: 'manage', name: '企业管理费' },
  61. { type: 'force', name: '规费' },
  62. { type: 'profit', name: '利润' },
  63. { type: 'tax', name: '税金' },
  64. { type: 'common', name: '建安费' },
  65. { type: 'rationCommon', name: '定额建安费' },
  66. { type: 'safeProduce', name: '安全生产费' }
  67. ];
  68. })();
  69. // 清单基数
  70. const progression = ['养护单位项目管理费', '信息化费', '工程监理费', '设计文件审查费', '前期工作费'];
  71. const deficiency = { '设计文件审查费': 3000 };
  72. if (typeof baseFigureMap !== 'undefined') {
  73. const { fixedFlag } = commonConstants;
  74. const budgetMap = {
  75. // 清单固定类别是“建筑安装工程费”的以外部分可显示
  76. '定额建筑安装工程费(定额设备购置费按40%计)': {
  77. base: 'DEJZAZGCFSBSS',
  78. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  79. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  80. pick: false,
  81. },
  82. // 清单固定类别是“建筑安装工程费”的以外部分可显示
  83. '建筑安装工程费(不含设备费)': {
  84. base: 'JZAZGCFBHSB',
  85. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  86. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  87. pick: false,
  88. },
  89. // 清单固定类别是“建筑安装工程费”的以外部分可显示
  90. '建筑安装工程费': {
  91. base: 'JZAZGCF',
  92. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  93. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  94. pick: false,
  95. },
  96. // “建筑安装工程费”、“土地使用及拆迁补偿费”以外部分可显示
  97. '土地使用及拆迁补偿费': {
  98. base: 'TDSYJCQBCF',
  99. fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
  100. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
  101. pick: false,
  102. },
  103. // “建筑安装工程费”、“土地使用及拆迁补偿费”、“养护工程其他费用”以外部分可显示
  104. '养护工程其他费用': {
  105. base: 'YHGCQTFY',
  106. fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
  107. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
  108. pick: false,
  109. },
  110. // “建筑安装工程费”、“土地使用及拆迁补偿费”、“养护工程其他费用”以外部分可显示
  111. '预备费': {
  112. base: 'YBF',
  113. fixedFlag: fixedFlag.BUDGET_FEE,
  114. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.BUDGET_FEE],
  115. pick: false,
  116. },
  117. // 仅在清单固定类别是“养护单位项目管理费”的清单显示
  118. '养护单位项目管理费': {
  119. isProgressive: true,
  120. base: 'YHDWXMGLF',
  121. fixedFlag: null,
  122. filter: [fixedFlag.MAINTENANCE_MANAGENENT_FEE],
  123. pick: true,
  124. },
  125. // 仅在清单固定类别是“信息化费”的清单显示
  126. '信息化费': {
  127. isProgressive: true,
  128. base: 'XXHF',
  129. fixedFlag: null,
  130. filter: [fixedFlag.INFORMATIZATION_FEE],
  131. pick: true,
  132. },
  133. // 仅在清单固定类别是“工程监理费”的清单显示
  134. '工程监理费': {
  135. isProgressive: true,
  136. base: 'GCJLF',
  137. fixedFlag: null,
  138. filter: [fixedFlag.ENGINEERING_SUP_FEE],
  139. pick: true,
  140. },
  141. // 仅在清单固定类别是“设计文件审查费”的清单显示
  142. '设计文件审查费': {
  143. isProgressive: true,
  144. deficiency: 3000,
  145. base: 'SJWJSCF',
  146. fixedFlag: null,
  147. filter: [fixedFlag.DOCUMENT_REVIEW_FEE],
  148. pick: true,
  149. },
  150. '前期工作费': {
  151. isProgressive: true,
  152. base: 'QQGZF',
  153. fixedFlag: null,
  154. filter: [fixedFlag.PRELIMINARY_WORK],
  155. pick: true,
  156. },
  157. '价差预备费': {
  158. base: 'JCYBF',
  159. fixedFlag: null,
  160. filter: [fixedFlag.SPREAD_BUDGET_FEE],
  161. pick: true,
  162. },
  163. };
  164. const boqMap = {
  165. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  166. '各章清单合计': {
  167. base: 'GZQDHJ',
  168. fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
  169. filter: [fixedFlag.ONE_SEVEN_BILLS],
  170. pick: false
  171. },
  172. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  173. '专项暂定合计': {
  174. base: 'ZXZDHJ',
  175. fixedFlag: null,
  176. filter: [fixedFlag.ONE_SEVEN_BILLS],
  177. pick: false
  178. },
  179. /*
  180. * 清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
  181. * 因此{100章以外合计}不设置关联的清单固定行
  182. * */
  183. //仅允许用于固定类别为“100章清单”引用
  184. '100章以外清单合计': {
  185. base: 'YBZYHQDHJ',
  186. fixedFlag: null,
  187. filter: [fixedFlag.ONE_HUNDRED_BILLS],
  188. pick: true
  189. }
  190. };
  191. baseFigureMap.budget = budgetMap;
  192. baseFigureMap.boq = boqMap;
  193. }
  194. // 清单基数
  195. if (typeof baseFigureTemplate !== 'undefined') {
  196. const { fixedFlag } = commonConstants;
  197. baseFigureTemplate.budget = {
  198. // 定额建筑安装工程费(定额设备购置费按40%计):取清单固定类别是“建筑安装工程”的定额建安费,其中定额设备购置费按40%计算
  199. DEJZAZGCFSBSS(tender) {
  200. const feeField = 'rationCommon';
  201. const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
  202. //建安费扣除定额设备购置费
  203. const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, feeField, false);
  204. //定额设备购置费
  205. const equipmentAcFee = cbTools.getBaseFee(deductFlags[0], tender, feeField);
  206. return (afterDeductFee + equipmentAcFee * 0.4).toDecimal(decimalObj.bills.totalPrice);
  207. },
  208. // 建筑安装工程费(不含设备费):取清单固定类别是“建筑安装工程”的金额,但要扣除清单固定类别是“设备购置费”的金额
  209. JZAZGCFBHSB(tender) {
  210. //建安费扣除设备费
  211. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
  212. },
  213. // 建筑安装工程费:取清单固定类别是“建筑安装工程”的金额
  214. JZAZGCF(tender) {
  215. return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
  216. },
  217. // 土地使用及拆迁补偿费:取清单固定类别是“土地使用及拆迁补偿费”的金额
  218. TDSYJCQBCF(tender) {
  219. return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
  220. },
  221. // 养护工程其他费用:取清单固定类别是“养护工程其他费用”的金额
  222. YHGCQTFY(tender) {
  223. return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
  224. },
  225. // 预备费:取清单固定类别是“预备费”的金额
  226. YBF(tender) {
  227. return cbTools.getBaseFee(fixedFlag.BUDGET_FEE, tender, 'common');
  228. },
  229. // 养护单位项目管理费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  230. YHDWXMGLF(tender) {
  231. const baseFee = this['DEJZAZGCFSBSS'](tender);
  232. if (!tender) {
  233. calcBase.baseProgressiveFee = baseFee;
  234. }
  235. return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  236. },
  237. // 信息化费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)”
  238. XXHF(tender) {
  239. const baseFee = this['DEJZAZGCFSBSS'](tender);
  240. if (!tender) {
  241. calcBase.baseProgressiveFee = baseFee;
  242. }
  243. return calculateUtil.getProgressiveFee(baseFee, '信息化费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  244. },
  245. // 工程监理费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  246. GCJLF(tender) {
  247. const baseFee = this['DEJZAZGCFSBSS'](tender);
  248. if (!tender) {
  249. calcBase.baseProgressiveFee = baseFee;
  250. }
  251. return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  252. },
  253. // 设计文件审查费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)”;设计文件审查费不足3000元的,按3000元计算
  254. SJWJSCF(tender) {
  255. const baseFee = this['DEJZAZGCFSBSS'](tender);
  256. if (!tender) {
  257. calcBase.baseProgressiveFee = baseFee;
  258. }
  259. return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  260. },
  261. // 前期工作费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  262. QQGZF(tender) {
  263. const baseFee = this['DEJZAZGCFSBSS'](tender);
  264. if (!tender) {
  265. calcBase.baseProgressiveFee = baseFee;
  266. }
  267. return calculateUtil.getProgressiveFee(baseFee, '前期工作费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  268. },
  269. // 价差预备费
  270. JCYBF(tender) {
  271. //建筑安装工程费作为基数
  272. const installFee = this['JZAZGCF'](tender);
  273. //年造价增涨
  274. const costGrowthRate = calcBase.project.property.costGrowthRate ?
  275. calcBase.project.property.costGrowthRate : 0;
  276. //增涨计费年限
  277. const growthPeriod = projectObj.project.property.growthPeriod ?
  278. calcBase.project.property.growthPeriod : 0;
  279. //= P * [(1+i)^(n-1) -1]
  280. return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
  281. },
  282. };
  283. baseFigureTemplate.boq = {
  284. //{各章清单合计}
  285. // 取清单固定类别是“第100章至700章清单”的金额
  286. 'GZQDHJ': function (tender) {
  287. return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
  288. },
  289. //{专项暂定合计}
  290. // 汇总专项暂定列有值的清单的金额
  291. 'ZXZDHJ': function (tender) {
  292. let rst = 0,
  293. feeField = 'common',
  294. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  295. let billsData = calcBase.project.Bills.datas,
  296. filterData = billsData.filter(function (data) {
  297. return data.specialProvisional;
  298. });
  299. for (let data of filterData) {
  300. if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
  301. cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
  302. continue;
  303. }
  304. rst += data.feesIndex[feeField][subFeeField];
  305. }
  306. return rst.toDecimal(decimalObj.bills.totalPrice);
  307. },
  308. //{100章以外清单合计}
  309. // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
  310. // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
  311. 'YBZYHQDHJ': function (tender) {
  312. let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
  313. if (!oneToSeven) {
  314. return 0;
  315. }
  316. //100-700章固定节点的所有子节点
  317. let allChildren = [];
  318. function getChildren(nodes) {
  319. allChildren = allChildren.concat(nodes);
  320. for (let node of nodes) {
  321. if (node.children.length > 0) {
  322. getChildren(node.children);
  323. }
  324. }
  325. }
  326. getChildren(oneToSeven.children);
  327. //扣除的节点:100章的节点[100-200)
  328. let deductNodes = allChildren.filter(cbTools.withingOneHundred);
  329. //计算金额
  330. let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
  331. return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  332. }
  333. };
  334. }
  335. if (typeof materialCalcObj !== 'undefined' && materialCalcObj.rationSetting) {
  336. let h = _.find(materialCalcObj.rationSetting.header, { "dataCode": "feeType" });
  337. if (h) h.visible = true;
  338. let mt = _.find(materialCalcObj.freightSetting.header, { "dataCode": "materialType" });
  339. if (mt) mt.visible = true;
  340. }
  341. //内蒙施工进出场(km)费率值修改特殊处理
  342. if (typeof feeRateObject !== 'undefined') {
  343. feeRateObject.feeRateSpecialHandle = function (subRate, value) {
  344. let result = {};
  345. if (subRate.name == "施工进出场(km)" && value && value < 5) {//输入的数值(公里数)< 5时,该项费用不计取。
  346. result.valueKey = "0";
  347. result.value = scMathUtil.roundForObj(value, getDecimal("feeRate"));//设置显示的节点值
  348. }
  349. return result;
  350. }
  351. }
  352. if (typeof module !== 'undefined') {
  353. module.exports = {
  354. progression,
  355. deficiency
  356. };
  357. }