Bläddra i källkod

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/YangHuCost

zhangweicheng 4 år sedan
förälder
incheckning
fcced1c1cd
2 ändrade filer med 81 tillägg och 64 borttagningar
  1. 22 3
      web/building_saas/main/js/models/calc_base.js
  2. 59 61
      web/over_write/js/quanguo_2018.js

+ 22 - 3
web/building_saas/main/js/models/calc_base.js

@@ -548,6 +548,23 @@ let cbTools = {
     fee += (baseFee - withinData.min) * withinData.feeRate * 0.01;
     return fee.toDecimal(decimalObj.bills.totalPrice);
   },
+  // 获取设备购置费
+  getEquipmentFee(fixedNode, tender, feeField = 'common') {
+    const allSubNodes = [];
+    projectObj.project.mainTree.getAllSubNode(fixedNode, allSubNodes);
+    const equipmentNodes = allSubNodes.filter(node => node.data.type === rationType.gljRation && node.data.subType === gljType.EQUIPMENT);
+    const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+    let totalEquipmentFee = 0;
+    for (const node of equipmentNodes) {
+      const data = node.data;
+      if (this.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
+      this.isUnDef(data.feesIndex[feeField]) || this.isUnDef(data.feesIndex[feeField][subFeeField])) {
+        continue;
+      }
+      totalEquipmentFee = (totalEquipmentFee + data.feesIndex[feeField][subFeeField]).toDecimal(decimalObj.process);
+    }
+    return totalEquipmentFee;
+  },
   //获取清单100章下的节点(只需要找最底层的,排除了底层,父项金额即排除了子项)
   //@param {Object}node(判断的节点,最底层清单节点)
   //@return {Boolean}
@@ -982,7 +999,7 @@ let cbAnalyzer = {
   },
   //输入合法性
   inputLegal: function (exp) {
-    let ilegalRex = /[^0-9,\u4e00-\u9fa5,\+,\-,\/,\*,\(,\),.,{,},F,%]/g;
+    let ilegalRex = /[^0-9,\u4e00-\u9fa5,\+,\-,\/,\*,\(,\),.,{,},F,%]/g;
     return !ilegalRex.test(exp);
   },
   //基数合法性、存在性
@@ -1178,7 +1195,7 @@ let cbParser = {
   },
   //获取表达式中的中文式
   getCN: function (expr) {
-    let cnRex = /\d*[\u4e00-\u9fa5]{1,}\({0,}[\u4e00-\u9fa5]{0,}\d*%*[\u4e00-\u9fa5]{0,}\){0,}[\u4e00-\u9fa5]{0,}/g;
+    let cnRex = /\d*[\u4e00-\u9fa5]{1,}\({0,}[\u4e00-\u9fa5]{0,}\*?\d*%*、?[\u4e00-\u9fa5]{0,}\){0,}[\u4e00-\u9fa5]{0,}/g;
     return _.filter(expr.match(cnRex), function (data) {
       return data
     });
@@ -1214,7 +1231,8 @@ let cbParser = {
   },
   //表达式中的百分数转换成小数
   percentToNum: function (exp) {
-    let rex = /[\+,\-,\*,\/]{1}\d+(\.\d+)?%[\u4e00-\u9fa5]{0}/g;
+    // let rex = /[\+,\-,\*,\/]{1}\d+(\.\d+)?%[\u4e00-\u9fa5]{0}\'{0}\){0}/g;
+    let rex = /[\+,\-,\*,\/]{1}\d+(\.\d+)?%(?![\u4e00-\u9fa5]|\))/g;
     let percents = exp.match(rex);
     let numRex = /\d+(\.\d+)?/g;
     if (cbTools.isDef(percents)) {
@@ -1297,6 +1315,7 @@ let cbParser = {
       exps[i].compileExp = '$CBC.base(\'' + exps[i].orgExp + '\')';
       let regStr = exps[i].orgExp.replace(/\(/g, '\\\(');
       regStr = regStr.replace(/\)/g, '\\\)');
+      regStr = regStr.replace(/\*/g, '\\\*');
       v = v.replace(new RegExp(regStr, 'g'), exps[i].compileExp);
     }
     //去{}

+ 59 - 61
web/over_write/js/quanguo_2018.js

@@ -172,8 +172,15 @@ if (typeof baseFigureMap !== 'undefined') {
     '定额建筑安装工程费': {
       base: 'DEJZAZGCF',
       fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
-      filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
-      pick: false
+      filter: [/* fixedFlag.CONSTRUCTION_INSTALL_FEE */],
+      pick: true
+    },
+    // 显示:仅清单固定类别是“安全生产费”行可显示
+    '建筑安装工程费(不含安全生产费)': {
+      base: 'JZAZGCFBHSC',
+      fixedFlag: null, // 防止触发循环计算
+      filter: [fixedFlag.SAFE_COST],
+      pick: true
     },
     // 显示:仅清单固定类别是“工程建设其他费”部分可显示
     '建筑安装工程费(不含设备费)': {
@@ -189,11 +196,11 @@ if (typeof baseFigureMap !== 'undefined') {
       filter: [fixedFlag.MAINTENANCE_EXPENSES],
       pick: true
     },
-    // 显示:仅清单固定类别是“工程建设其他费”、“专项费用”部分可显示
+    // 显示:仅清单固定类别是“工程建设其他费”可显示
     '定额建筑安装工程费(不含定额设备购置费、专项费用)': {
       base: 'DEJZAZGCFBHSBZX',
       fixedFlag: null,
-      filter: [fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.SPECIAL_COST],
+      filter: [/* fixedFlag.MAINTENANCE_EXPENSES */],
       pick: true,
     },
     // 显示:仅清单固定类别是“施工场地建设费”的可显示
@@ -296,116 +303,107 @@ if (typeof baseFigureTemplate !== 'undefined') {
     DEJZAZGCF(tender) {
       return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'rationCommon');
     },
-    // 建设安装工程费(不含设备费) 算法:取固定类别是“建筑安装工程费”的金额。扣除设备的金额。(全国造价云版中,没有固定的设备购置行,需要扣除所有类别是“设备”的金额,仅指设备行,不包括定额工料机的设备)
+    // 建筑安装工程费(不含安全生产费) 算法:取固定类别是“建筑安装工程费”的“建安费”,扣除固定类别是“安全生产费”的“建安费”
+    JZAZGCFBHSC(tender) {
+      let baseFee = this['JZAZGCF'](tender);
+      const safeFee = cbTools.getBaseFee(fixedFlag.SAFE_COST, tender, 'common');
+      return (baseFee - safeFee).toDecimal(decimalObj.bills.totalPrice);
+    },
+    // 建设安装工程费(不含设备费) 算法:取固定类别是“建筑安装工程费”的建安费。扣除设备的定额设备费。(全国造价云版中,没有固定的设备购置行,需要扣除所有类别是“设备”的金额,仅指设备行,不包括定额工料机的设备)
     JZAZGCFBHSB(tender) {
       let baseFee = this['JZAZGCF'](tender);
       const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
-      const allSubNodes = [];
-      projectObj.project.mainTree.getAllSubNode(fixedNode, allSubNodes);
-      const equipmentNodes = allSubNodes.filter(node => node.data.type === rationType.gljRation && node.data.subType === gljType.EQUIPMENT);
-      const feeField = 'common';
-      const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-      let totalEquipmentFee = 0;
-      for (const node of equipmentNodes) {
-        const data = node.data;
-        if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
-          cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
-          continue;
-        }
-        totalEquipmentFee = (totalEquipmentFee + data.feesIndex[feeField][subFeeField]).toDecimal(decimalObj.process);
-      }
-      baseFee = (baseFee - totalEquipmentFee).toDecimal(decimalObj.process);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender);
+      baseFee = (baseFee - equipmentFee).toDecimal(decimalObj.process);
       return baseFee.toDecimal(decimalObj.bills.totalPrice);
     },
-    // 定额建筑安装工程费(含定额设备购置费*40%) 取固定类别是“建筑安装工程费”的金额,扣除定额设备购置费*60%的金额
+    // 定额建筑安装工程费(含定额设备购置费*40%) 取固定类别是“建筑安装工程费”的定额建安费,扣除定额设备购置费*60%的定额设备费。
     DEJZAZGCFSBSS(tender) {
-      let baseFee = this['JZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
       const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
-      const allSubNodes = [];
-      projectObj.project.mainTree.getAllSubNode(fixedNode, allSubNodes);
-      const equipmentNodes = allSubNodes.filter(node => node.data.type === rationType.gljRation && node.data.subType === gljType.EQUIPMENT);
-      const feeField = 'common';
-      const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-      let totalEquipmentFee = 0;
-      for (const node of equipmentNodes) {
-        const data = node.data;
-        if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
-          cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
-          continue;
-        }
-        totalEquipmentFee = (totalEquipmentFee + data.feesIndex[feeField][subFeeField]).toDecimal(decimalObj.process);
-      }
-      baseFee = (baseFee - totalEquipmentFee * 0.6).toDecimal(decimalObj.process);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       return baseFee.toDecimal(decimalObj.bills.totalPrice);
     },
-    // 定额建筑安装工程费(不含定额设备购置费、专项费用) 算法:取固定类别是“建筑安装工程费”的金额,扣除定额设备购置费和专项费用的金额
+    // 定额建筑安装工程费(不含定额设备购置费、专项费用) 算法:取固定类别是“建筑安装工程费”的定额建安费,扣除定额设备购置费和专项费用的建安费
     DEJZAZGCFBHSBZX(tender) {
-      let baseFee = this['JZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
       const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
-      const allSubNodes = [];
-      projectObj.project.mainTree.getAllSubNode(fixedNode, allSubNodes);
-      const equipmentNodes = allSubNodes.filter(node => node.data.type === rationType.gljRation && node.data.subType === gljType.EQUIPMENT);
-      const feeField = 'common';
-      const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-      let diffFee = 0;
-      for (const node of equipmentNodes) {
-        const data = node.data;
-        if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
-          cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
-          continue;
-        }
-        diffFee = (diffFee + data.feesIndex[feeField][subFeeField]).toDecimal(decimalObj.process);
-      }
-      const specialFee = cbTools.getBaseFee(fixedFlag.SPECIAL_COST, tender, 'common');
-      diffFee = (diffFee + specialFee).toDecimal(decimalObj.process);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      const specialFee = cbTools.getBaseFee(fixedFlag.SPECIAL_COST, tender, 'rationCommon');
+      const diffFee = (equipmentFee + specialFee).toDecimal(decimalObj.process);
       baseFee = (baseFee - diffFee).toDecimal(decimalObj.process);
       return baseFee.toDecimal(decimalObj.bills.totalPrice);
     },
     // 施工场地建设费 算法:按“定额建筑安装工程费”扣除专项费为基数,以累进办法计算
+    // 【变更】:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除固定类别是“专项费用”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算
     SGCDJSF(tender) {
       let baseFee = this['DEJZAZGCF'](tender);
-      const specialFee = cbTools.getBaseFee(fixedFlag.SPECIAL_COST, tender, 'common');
+      const specialFee = cbTools.getBaseFee(fixedFlag.SPECIAL_COST, tender, 'rationCommon');
       baseFee = (baseFee - specialFee).toDecimal(decimalObj.process);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }
       return calculateUtil.getProgressiveFee(baseFee, '施工场地建设费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
     },
     // 建设单位(业主)管理费 算法:按“定额建筑安装工程费”总和为基数,以累进办法计算
+    // 【变更】:算法:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算。
     JSDWYZGLF(tender) {
-      const baseFee = this['DEJZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }
       return calculateUtil.getProgressiveFee(baseFee, '建设单位(业主)管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
     },
     // 建设项目信息化费 算法:按“定额建筑安装工程费”总和为基数,以累进办法计算
+    // 【变更】:算法:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算。
     JSXMXXHF(tender) {
-      const baseFee = this['DEJZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }
       return calculateUtil.getProgressiveFee(baseFee, '建设项目信息化费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
     },
     // 工程监理费 算法:按“定额建筑安装工程费”总和为基数,以累进办法计算
+    // 【变更】:算法:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算。 
     GCJLF(tender) {
-      const baseFee = this['DEJZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }
       return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
     },
     // 设计文件审查费 算法:按“定额建筑安装工程费”总和为基数,以累进办法计算
+    // 【变更】:算法:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算。
     SJWJSCF(tender) {
-      const baseFee = this['DEJZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }
       return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
     },
     // 前期工作费 算法:按“定额建筑安装工程费”总和为基数,以累进办法计算
+    // 变更:【算法】:按【固定类别是“建筑安装工程费”的“定额建安费”,扣除“设备”的“定额设备费”*60%】为基数,以累进办法计算。
     QQGZF(tender) {
-      const baseFee = this['DEJZAZGCF'](tender);
+      let baseFee = this['DEJZAZGCF'](tender);
+      const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
+      const equipmentFee = cbTools.getEquipmentFee(fixedNode, tender, 'equipment');
+      baseFee = (baseFee - equipmentFee * 0.6).toDecimal(decimalObj.process);
       if (!tender) {
         calcBase.baseProgressiveFee = baseFee;
       }