neimeng_2019.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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 = {};
  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. for (const name in budgetMap) {
  192. const item = budgetMap[name];
  193. if (item.isProgressive) {
  194. progression.push(item.progressiveName || name);
  195. }
  196. if (item.deficiency) {
  197. deficiency[item.progressiveName || name] = item.deficiency;
  198. }
  199. }
  200. baseFigureMap.budget = budgetMap;
  201. baseFigureMap.boq = boqMap;
  202. }
  203. // 清单基数
  204. if (typeof baseFigureTemplate !== 'undefined') {
  205. const { fixedFlag } = commonConstants;
  206. baseFigureTemplate.budget = {
  207. // 定额建筑安装工程费(定额设备购置费按40%计):取清单固定类别是“建筑安装工程”的定额建安费,其中定额设备购置费按40%计算
  208. DEJZAZGCFSBSS(tender) {
  209. const feeField = 'rationCommon';
  210. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  211. const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
  212. //建安费扣除定额设备购置费
  213. const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, `${feeField}.${subFeeField}`);
  214. //定额设备购置费
  215. const equipmentAcFee = cbTools.getBillsFee(deductFlags[0], feeField, subFeeField);
  216. return (afterDeductFee + equipmentAcFee * 0.4).toDecimal(decimalObj.bills.totalPrice);
  217. },
  218. // 建筑安装工程费(不含设备费):取清单固定类别是“建筑安装工程”的金额,但要扣除清单固定类别是“设备购置费”的金额
  219. JZAZGCFBHSB(tender) {
  220. const fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
  221. const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
  222. //建安费扣除设备费
  223. return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  224. },
  225. // 建筑安装工程费:取清单固定类别是“建筑安装工程”的金额
  226. JZAZGCF(tender) {
  227. const feeField = 'common';
  228. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  229. return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
  230. },
  231. // 土地使用及拆迁补偿费:取清单固定类别是“土地使用及拆迁补偿费”的金额
  232. TDSYJCQBCF(tender) {
  233. const feeField = 'common';
  234. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  235. return cbTools.getBillsFee(fixedFlag.LAND_USED_DEMOLITION, feeField, subFeeField);
  236. },
  237. // 养护工程其他费用:取清单固定类别是“养护工程其他费用”的金额
  238. YHGCQTFY(tender) {
  239. const feeField = 'common';
  240. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  241. return cbTools.getBillsFee(fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
  242. },
  243. // 预备费:取清单固定类别是“预备费”的金额
  244. YBF(tender) {
  245. const feeField = 'common';
  246. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  247. return cbTools.getBillsFee(fixedFlag.BUDGET_FEE, feeField, subFeeField);
  248. },
  249. // 养护单位项目管理费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  250. YHDWXMGLF(tender) {
  251. const baseFee = this['DEJZAZGCFSBSS'](tender);
  252. if (!tender) {
  253. calcBase.baseProgressiveFee = baseFee;
  254. }
  255. return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  256. },
  257. // 信息化费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)”
  258. XXHF(tender) {
  259. const baseFee = this['DEJZAZGCFSBSS'](tender);
  260. if (!tender) {
  261. calcBase.baseProgressiveFee = baseFee;
  262. }
  263. return calculateUtil.getProgressiveFee(baseFee, '信息化费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  264. },
  265. // 工程监理费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  266. GCJLF(tender) {
  267. const baseFee = this['DEJZAZGCFSBSS'](tender);
  268. if (!tender) {
  269. calcBase.baseProgressiveFee = baseFee;
  270. }
  271. return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  272. },
  273. // 设计文件审查费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)”;设计文件审查费不足3000元的,按3000元计算
  274. SJWJSCF(tender) {
  275. const baseFee = this['DEJZAZGCFSBSS'](tender);
  276. if (!tender) {
  277. calcBase.baseProgressiveFee = baseFee;
  278. }
  279. return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  280. },
  281. // 前期工作费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
  282. QQGZF(tender) {
  283. const baseFee = this['DEJZAZGCFSBSS'](tender);
  284. if (!tender) {
  285. calcBase.baseProgressiveFee = baseFee;
  286. }
  287. return calculateUtil.getProgressiveFee(baseFee, '前期工作费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  288. },
  289. // 价差预备费
  290. JCYBF(tender) {
  291. //建筑安装工程费作为基数
  292. const installFee = this['JZAZGCF'](tender);
  293. //年造价增涨
  294. const costGrowthRate = calcBase.project.property.costGrowthRate ?
  295. calcBase.project.property.costGrowthRate : 0;
  296. //增涨计费年限
  297. const growthPeriod = projectObj.project.property.growthPeriod ?
  298. calcBase.project.property.growthPeriod : 0;
  299. //= P * [(1+i)^(n-1) -1]
  300. return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
  301. },
  302. };
  303. baseFigureTemplate.boq = {
  304. //{各章清单合计}
  305. // 取清单固定类别是“第100章至700章清单”的金额
  306. 'GZQDHJ': function (tender) {
  307. let feeField = 'common',
  308. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  309. return cbTools.getBillsFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, feeField, subFeeField);
  310. },
  311. //{专项暂定合计}
  312. // 汇总专项暂定列有值的清单的金额
  313. 'ZXZDHJ': function (tender) {
  314. let rst = 0,
  315. feeField = 'common',
  316. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  317. let billsData = calcBase.project.Bills.datas,
  318. filterData = billsData.filter(function (data) {
  319. return data.specialProvisional;
  320. });
  321. for (let data of filterData) {
  322. if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
  323. cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
  324. continue;
  325. }
  326. rst += data.feesIndex[feeField][subFeeField];
  327. }
  328. return rst.toDecimal(decimalObj.bills.totalPrice);
  329. },
  330. //{100章以外清单合计}
  331. // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
  332. // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
  333. 'YBZYHQDHJ': function (tender) {
  334. let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
  335. if (!oneToSeven) {
  336. return 0;
  337. }
  338. //100-700章固定节点的所有子节点
  339. let allChildren = [];
  340. function getChildren(nodes) {
  341. allChildren = allChildren.concat(nodes);
  342. for (let node of nodes) {
  343. if (node.children.length > 0) {
  344. getChildren(node.children);
  345. }
  346. }
  347. }
  348. getChildren(oneToSeven.children);
  349. //扣除的节点:100章的节点[100-200)
  350. let deductNodes = allChildren.filter(cbTools.withingOneHundred);
  351. //计算金额
  352. let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
  353. return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  354. }
  355. };
  356. }
  357. if (typeof materialCalcObj !== 'undefined' && materialCalcObj.rationSetting) {
  358. let h = _.find(materialCalcObj.rationSetting.header, { "dataCode": "feeType" });
  359. if (h) h.visible = true;
  360. let mt = _.find(materialCalcObj.freightSetting.header, { "dataCode": "materialType" });
  361. if (mt) mt.visible = true;
  362. }
  363. //内蒙施工进出场(km)费率值修改特殊处理
  364. if (typeof feeRateObject !== 'undefined') {
  365. feeRateObject.feeRateSpecialHandle = function (subRate, value) {
  366. let result = {};
  367. if (subRate.name == "施工进出场(km)" && value && value < 5) {//输入的数值(公里数)< 5时,该项费用不计取。
  368. result.valueKey = "0";
  369. result.value = scMathUtil.roundForObj(value, getDecimal("feeRate"));//设置显示的节点值
  370. }
  371. return result;
  372. }
  373. }
  374. if (typeof module !== 'undefined') {
  375. module.exports = {
  376. progression,
  377. deficiency
  378. };
  379. }