Prechádzať zdrojové kódy

1.清单基数部分算法精简单
2.湖南农村养护2020清单基数

vian 5 rokov pred
rodič
commit
3c7ec70286

+ 45 - 32
web/building_saas/main/js/models/calc_base.js

@@ -2,7 +2,6 @@
  * Created by Zhong on 2017/11/28.
  */
 
-
 let cbTools = {
     isDef: function (v) {
         return v !== undefined && v !== null;
@@ -384,6 +383,11 @@ let cbTools = {
              if (node.data.calcBase.hasSubStr(sID)) return true;
         };
     },
+    // 获取直接关联清单节点的基数金额
+    getBaseFee: function (flag, tender, feeField) {
+        const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return this.getBillsFee(flag, feeField, subFeeField);
+    },
     //获取清单节点的金额
     //@param {Number}fixedFlag(清单固定行类别) {String}feeField(外层金额字段: common) {String}subFeeField(子金额字段: totalFee)
     //@return {Number}
@@ -418,10 +422,17 @@ let cbTools = {
             ? bills.feesIndex[feeField][subFeeField]
             : 0;
     },
-    //获取扣除固定项后的金额,扣除其节点后重新汇总
-    //@param {Number}fixedFlag(基数取值固定行类别) {Array}deductFlags(扣除的固定类别组) {String}fullFeeField(完整的取费字段: 'rationCommon.totalFee')
-    //@return {Number}
-    getFeeWithDeduction: function (fixedFlag, deductFlags, fullFeeField) {
+    /**
+     * 获取扣除固定项后的金额,扣除其节点后重新汇总
+     * @param {Number} fixedFlag - 基数取值固定行类别
+     * @param {Array} deductFlags - 扣除的固定类别组
+     * @param {Boolean} tender - 是否调价
+     * @param {String} feeField - 价格字段
+     * @param {Boolean = true} isRound - 是否取舍
+     * @return {Number}
+     */
+    getFeeWithDeduction: function (fixedFlag, deductFlags, tender, feeField, isRound = true) {
+        const fullFeeField = tender ? `${feeField}.tenderTotalFee` : `${feeField}.totalFee`;
         let baseNode = this.findNodeByFlag(fixedFlag);
         if (!baseNode) {
             return 0;
@@ -434,8 +445,24 @@ let cbTools = {
                 deductNodes.push(node);
             }
         }
-        return projectObj.project.calcProgram.getTotalFee([baseNode], deductNodes, fullFeeField);
+        const fee = projectObj.project.calcProgram.getTotalFee([baseNode], deductNodes, fullFeeField);
+        return isRound ? fee.toDecimal(decimalObj.bills.totalPrice) : fee;
     },
+    /* getFeeWithDeduction: function (fixedFlag, deductFlags, fullFeeField) {
+        let baseNode = this.findNodeByFlag(fixedFlag);
+        if (!baseNode) {
+            return 0;
+        }
+        //要扣除的节点
+        let deductNodes = [];
+        for (let deFlag of deductFlags) {
+            let node = this.findNodeByFlag(deFlag);
+            if (node) {
+                deductNodes.push(node);
+            }
+        }
+        return projectObj.project.calcProgram.getTotalFee([baseNode], deductNodes, fullFeeField);
+    }, */
     //获取累进办法计算的金额
     //@param {Number}baseFee(相关基数金额) {String}name(使用累进计算的基数名称)
     //@return {Number}
@@ -537,65 +564,51 @@ let baseFigureTemplate = {
         //{定额建筑安装工程费(不含定额设备购置费及专项费用)}
         //取清单固定类别是“建筑安装工程”的定额建安费,但要扣除清单固定类别是“设备购置费”、及“专项费用”的定额建安费
         'DEJZAZGCFBHSBZX': function (tender) {
-            let fullFeeField = tender ? 'rationCommon.tenderTotalFee' : 'rationCommon.totalFee',
-                deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.SPECIAL_COST];
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.SPECIAL_COST];
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, 'rationCommon');
         },
         //{定额建筑安装工程(其中定额设备购置费按 40%计)} (定额建筑安装工程设备四十)
         //扣除设备购置费,再加上设备购置费的40%,扣除汇总算法不四舍五入,相当于汇总当中定额设备购置费就按照了40%计
         'DEJZAZGCSBSS': function (tender) {
-            let feeField = 'rationCommon',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee',
-                deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
+            const feeField = 'rationCommon';
+            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
             //建安费扣除定额设备购置费
-            let afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, `${feeField}.${subFeeField}`);
+            const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, feeField, false);
             //定额设备购置费
-            let equipmentAcFee = cbTools.getBillsFee(deductFlags[0], feeField, subFeeField);
+            let equipmentAcFee = cbTools.getBaseFee(deductFlags[0], tender, feeField);
             return (afterDeductFee + equipmentAcFee * 0.4).toDecimal(decimalObj.bills.totalPrice);
         },
         //{建筑安装工程费(不含安全生产费)}
         // 取清单固定类别是“建筑安装工程”的金额,但要扣除清单固定类别是“安全生产费”的金额
         'JZAZGCFBHSC': function (tender) {
-            let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee',
-                deductFlags = [fixedFlag.SAFE_COST];
             //建安费扣除安全生产费
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, 'common');
         },
         //{建筑安装工程费(不含设备费)}
         // 取清单固定类别是“建筑安装工程”的金额,但要扣除清单固定类别是“设备购置费”的金额
         'JZAZGCFBHSB': function (tender) {
-            let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee',
-                deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
             //建安费扣除设备费
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
         },
         //{建筑安装工程费}
         // 取清单固定类别是“建筑安装工程”的金额
         'JZAZGCF': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
         },
         //{土地使用及拆迁补偿费}
         // 取清单固定类别是“土地使用及拆迁补偿费”的金额
         'TDSYJCQBCF': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.LAND_USED_DEMOLITION, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
         },
         //{养护工程其他费}
         // 取清单固定类别是“养护工程其他费”的金额
         'YHGCQTF': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
         },
         //{预备费}
         // 取清单固定类别是“预备费”的金额
         'YBF': function(tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.BUDGET_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.BUDGET_FEE, tender, 'common');
         },
         //{施工场地建设费}
         //使用累进办法计算,基数为{定额建筑安装工程费(不含定额设备购置费及专项费用)}

+ 320 - 0
web/over_write/hunan_2020.js

@@ -0,0 +1,320 @@
+// 清单基数
+const progression = ['施工场地建设费', '养护单位项目管理费', '养护单位项目管理费(未单独设置项目部)', '工程监理费', '工程监理费(未实行社会监理)', '设计文件审查费', '工程设计费'];
+const deficiency = {};
+if (typeof baseFigureMap !== 'undefined') {
+    const { fixedFlag } = commonConstants;
+    const budgetMap = {
+        // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
+        '养护工程费': {
+            base: 'YHGCF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
+            pick: false,
+        },
+        // 显示:仅清单固定类别是“安全生产费”的可显示
+        '养护工程费(不含安全生产费)': {
+            base: 'YHGCFBHSC',
+            fixedFlag: null,
+            filter: [fixedFlag.SAFE_COST],
+            pick: true
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示
+        '养护工程费(不含设备费)': {
+            base: 'YHGCFBHSB',
+            fixedFlag: null,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true
+        },
+        // 显示:除清单固定类别是“建筑安装工程费”的以外部分可显示
+        '定额养护工程费': {
+            base: 'DEYHGCF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
+            pick: false
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”、“施工场地建设费”的可显示
+        '定额养护工程费(不含专项费用)': {
+            base: 'DEYHGCFBHZXFY',
+            fixedFlag: null,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.CONSTRUCTION_PLANT_COST],
+            pick: true,
+        },
+        // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”的以外部分可显示
+        '土地使用及拆迁补偿费': {
+            base: 'TDSYJCQBCF',
+            fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
+            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
+            pick: false,
+        },
+        // 显示:除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”、“工程建设其他费用”的以外部分可显示。
+        '工程建设其他费用': {
+            base: 'GCJSQTFY',
+            fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
+            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
+            pick: false,
+        },
+        // 显示:仅清单固定类别是“施工场地建设费”的可显示。
+        '施工场地建设费': {
+            isProgressive: true,
+            base: 'SGCDJSF',
+            fixedFlag: null,
+            filter: [fixedFlag.CONSTRUCTION_PLANT_COST],
+            pick: true,
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+        '养护单位项目管理费': {
+            isProgressive: true,
+            base: 'YHDWXMGLF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+        '养护单位项目管理费(未单独设置项目部)': {
+            isProgressive: true,
+            base: 'YHDWXMGLFWSXMB',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+        '工程监理费': {
+            isProgressive: true,
+            base: 'GCJLF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:仅清单固定类别是“养护工程其他费用”部分可显示。
+        '工程监理费(未实行社会监理)': {
+            isProgressive: true,
+            base: 'GCJLFWSXSHJL',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:只有清单固定类别是“养护工程其他费用”部分可显示。
+        '设计文件审查费': {
+            isProgressive: true,
+            base: 'SJWJSCF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:只有清单固定类别是“养护工程其他费用”部分可显示。
+        '工程设计费': {
+            isProgressive: true,
+            base: 'GCSJF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.MAINTENANCE_EXPENSES],
+            pick: true,
+        },
+        // 显示:仅“价差预备费”可显示
+        '价差预备费': {
+            base: 'JCYBF',
+            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            filter: [fixedFlag.SPREAD_BUDGET_FEE],
+            pick: true,
+        },
+    };
+    const boqMap = {
+        //仅允许用于固定类别是“第100章至700章清单”以外的清单
+        '各章清单合计': {
+            base: 'GZQDHJ',
+            fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
+            filter: [fixedFlag.ONE_SEVEN_BILLS],
+            pick: false
+        },
+        //仅允许用于固定类别是“第100章至700章清单”以外的清单
+        '专项暂定合计': {
+            base: 'ZXZDHJ',
+            fixedFlag: null,
+            filter: [fixedFlag.ONE_SEVEN_BILLS],
+            pick: false
+        },
+        /*
+        *  清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
+        *  因此{100章以外合计}不设置关联的清单固定行
+        * */
+        //仅允许用于固定类别为“100章清单”引用
+        '100章以外清单合计': {
+            base: 'YBZYHQDHJ',
+            fixedFlag: null,
+            filter: [fixedFlag.ONE_HUNDRED_BILLS],
+            pick: true
+        }
+    };
+    baseFigureMap.budget = budgetMap;
+    baseFigureMap.boq = boqMap;
+}
+
+if (typeof baseFigureTemplate !== 'undefined') {
+    const { fixedFlag } = commonConstants;
+    baseFigureTemplate.budget = {
+        // 养护工程费 算法:取清单固定类别是“建筑安装工程费”的金额。
+        YHGCF(tender) {
+            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
+        },
+        // 养护工程费(不含安全生产费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除“安全生产费”的金额。
+        YHGCFBHSC(tender) {
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, 'common');
+        },
+        // 养护工程费(不含设备费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除设备的金额。
+        YHGCFBHSB(tender) {
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
+        },
+        // 定额养护工程费 取清单固定类别是“建筑安装工程费”的定额建安费。
+        DEYHGCF(tender) {
+            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'rationCommon');
+        },
+        // 定额养护工程费(不含专项费用) 算法:取清单固定类别是“建筑安装工程费”的“定额建安费”,扣除“专项费用”的“定额建安费”。
+        DEYHGCFBHZXFY(tender) {
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SPECIAL_COST], tender, 'rationCommon');
+        },
+        // 土地使用及拆迁补偿费 算法:取清单固定类别是“土地使用及拆迁补偿费”的金额。
+        TDSYJCQBCF(tender) {
+            return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
+        },
+        // 工程建设其他费用 算法:取清单固定类别是“养护工程其他费用”的金额。
+        GCJSQTFY(tender) {
+            return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
+        },
+        // 施工场地建设费 算法:以{定额养护工程费(不含专项费用)}为基数,采用累进办法计算。
+        SGCDJSF(tender) {
+            const baseFee = this['DEYHGCFBHZXFY'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '施工场地建设费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 养护单位项目管理费 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        YHDWXMGLF(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 养护单位项目管理费(未单独设置项目部) 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        YHDWXMGLFWSXMB(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费(未单独设置项目部)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 工程监理费 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        GCJLF(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 工程监理费(未实行社会监理) 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        GCJLFWSXSHJL(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '工程监理费(未实行社会监理)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 设计文件审查费 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        SJWJSCF(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        // 工程设计费 算法:以{定额养护工程费}为基数,采用累进办法计算。
+        GCSJF(tender) {
+            const baseFee = this['DEYHGCF'](tender);
+            if (!tender) {
+                calcBase.baseProgressiveFee = baseFee;
+            }
+            return calculateUtil.getProgressiveFee(baseFee, '工程设计费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
+        },
+        /*  价差预备费 算法:以建筑安装工程费为基数,按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
+            价差预备费 P * [(1+i)^(n-1) -1]
+            P——建筑安装工程费总额(元);
+            i——年工程造价增涨率(%);
+            n——设计文件编制年至养护项目开工年+养护项目建设期限(年)。
+        */
+        JCYBF(tender) {
+            //建筑安装工程费作为基数
+            const installFee = this['JZAZGCF'](tender);
+            //年造价增涨
+            const costGrowthRate = calcBase.project.property.costGrowthRate
+                ? calcBase.project.property.costGrowthRate
+                : 0;
+            //增涨计费年限
+            const growthPeriod = projectObj.project.property.growthPeriod
+                ? calcBase.project.property.growthPeriod
+                : 0;
+            //= P * [(1+i)^(n-1) -1]
+            return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
+        }
+
+    };
+
+    baseFigureTemplate.boq = {
+        //{各章清单合计}
+        // 取清单固定类别是“第100章至700章清单”的金额
+        'GZQDHJ': function (tender) {
+            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
+        },
+        //{专项暂定合计}
+        // 汇总专项暂定列有值的清单的金额
+        'ZXZDHJ': function (tender) {
+            let rst = 0,
+                feeField = 'common',
+                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+            let billsData = calcBase.project.Bills.datas,
+                filterData = billsData.filter(function (data) {
+                    return data.specialProvisional;
+                });
+            for (let data of filterData) {
+                if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
+                    cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
+                    continue;
+                }
+                rst += data.feesIndex[feeField][subFeeField];
+            }
+            return rst.toDecimal(decimalObj.bills.totalPrice);
+        },
+        //{100章以外清单合计}
+        // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
+        // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
+        'YBZYHQDHJ': function (tender) {
+            let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
+            if (!oneToSeven) {
+                return 0;
+            }
+            //100-700章固定节点的所有子节点
+            let allChildren = [];
+            function getChildren(nodes) {
+                allChildren = allChildren.concat(nodes);
+                for (let node of nodes) {
+                    if (node.children.length > 0) {
+                        getChildren(node.children);
+                    }
+                }
+            }
+            getChildren(oneToSeven.children);
+            //扣除的节点:100章的节点[100-200)
+            let deductNodes = allChildren.filter(cbTools.withingOneHundred);
+            //计算金额
+            let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
+            return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+        }
+    };
+}
+
+// CommonJS module
+if (typeof module !== 'undefined' && !module.nodeType) { // 防止module是前端的一个html标签
+    module.exports = {
+        progression,
+        deficiency
+    };
+}

+ 12 - 29
web/over_write/js/anhui_2019.js

@@ -96,7 +96,7 @@ if (typeof baseFigureMap !== 'undefined') {
         // 显示:仅清单固定类别是“安全生产费”的可显示。
         '建筑安装工程费(不含设备费)': {
             base: 'JZAZGCFBHSB',
-            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            fixedFlag: null,
             filter: [fixedFlag.SAFE_COST],
             pick: true
         },
@@ -110,7 +110,7 @@ if (typeof baseFigureMap !== 'undefined') {
         // 显示:仅清单固定类别是“施工场地建设费”的可显示。
         '定额建筑安装工程费(不含定额设备购置费及专项管理费)': {
             base: 'DEJZAZGCFBHSBZXGLF',
-            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
+            fixedFlag: null,
             filter: [fixedFlag.CONSTRUCTION_PLANT_COST],
             pick: true,
         },
@@ -230,53 +230,38 @@ if (typeof baseFigureTemplate !== 'undefined') {
     baseFigureTemplate.budget = {
         // 建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的金额。
         JZAZGCF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
         },
         // 建筑安装工程费(不含安全生产费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除“安全生产费”的金额。
         JZAZGCFBHSC(tender) {
-            const fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
-            const deductFlags = [fixedFlag.SAFE_COST];
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, 'common');
         },
         // 建筑安装工程费(不含设备费) 算法:取清单固定类别是“建筑安装工程费”的金额,扣除设备的金额。
         JZAZGCFBHSB(tender) {
-            const fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
-            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
         },
         // 定额建筑安装工程费 算法:取清单固定类别是“建筑安装工程费”的定额建安费。
         DEJZAZGCF(tender) {
-            const feeField = 'rationCommon';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'rationCommon');
         },
         // 定额建筑安装工程费(不含定额设备购置费及专项管理费) 算法:取清单固定类别是“建筑安装工程费”的“定额建安费”,扣除设备的“定额设备费”,扣除“专项费用”的“定额建安费”。
         DEJZAZGCFBHSBZXGLF(tender) {
-            const fullFeeField = tender ? 'rationCommon.tenderTotalFee' : 'rationCommon.totalFee';
-            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.SAFE_COST];
+            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.SPECIAL_COST];
             //建安费扣除设备费
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, 'rationCommon');
         },
         // 定额建筑安装工程费(不含专项管理费) 算法:取清单固定类别是“建筑安装工程费”的“定额建安费”,扣除“专项费用”的“定额建安费”。
         DEJZAZGCFBHZXGLF(tender) {
-            const fullFeeField = tender ? 'rationCommon.tenderTotalFee' : 'rationCommon.totalFee';
-            const deductFlags = [fixedFlag.SAFE_COST];
             //建安费扣除设备费
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SPECIAL_COST], tender, 'rationCommon');
         },
         // 土地使用及拆迁补偿费 算法:取清单固定类别是“土地使用及拆迁补偿费”的金额。
         TDSYJCQBCF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.LAND_USED_DEMOLITION, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
         },
         // 工程建设其他费用 算法:取清单固定类别是“养护工程其他费用”的金额。
         GCJSQTFY(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
         },
         // 施工场地建设费 算法:以{定额建筑安装工程费(不含定额设备购置费及专项管理费) }为基数,采用累进办法计算。
         SGCDJSF(tender) {
@@ -353,9 +338,7 @@ if (typeof baseFigureTemplate !== 'undefined') {
         //{各章清单合计}
         // 取清单固定类别是“第100章至700章清单”的金额
         'GZQDHJ': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
         },
         //{专项暂定合计}
         // 汇总专项暂定列有值的清单的金额

+ 8 - 21
web/over_write/js/neimeng_2019.js

@@ -206,44 +206,33 @@ if (typeof baseFigureTemplate !== 'undefined') {
         // 定额建筑安装工程费(定额设备购置费按40%计):取清单固定类别是“建筑安装工程”的定额建安费,其中定额设备购置费按40%计算
         DEJZAZGCFSBSS(tender) {
             const feeField = 'rationCommon';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
             const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
             //建安费扣除定额设备购置费
-            const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, `${feeField}.${subFeeField}`);
+            const afterDeductFee = cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, tender, feeField, false);
             //定额设备购置费
-            const equipmentAcFee = cbTools.getBillsFee(deductFlags[0], feeField, subFeeField);
+            const equipmentAcFee = cbTools.getBaseFee(deductFlags[0], tender, feeField);
             return (afterDeductFee + equipmentAcFee * 0.4).toDecimal(decimalObj.bills.totalPrice);
         },
         // 建筑安装工程费(不含设备费):取清单固定类别是“建筑安装工程”的金额,但要扣除清单固定类别是“设备购置费”的金额
         JZAZGCFBHSB(tender) {
-            const fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
-            const deductFlags = [fixedFlag.EQUIPMENT_ACQUISITION_FEE];
             //建安费扣除设备费
-            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, deductFlags, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
+            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.EQUIPMENT_ACQUISITION_FEE], tender, 'common');
         },
         // 建筑安装工程费:取清单固定类别是“建筑安装工程”的金额
         JZAZGCF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
         },
         // 土地使用及拆迁补偿费:取清单固定类别是“土地使用及拆迁补偿费”的金额
         TDSYJCQBCF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.LAND_USED_DEMOLITION, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
         },
         // 养护工程其他费用:取清单固定类别是“养护工程其他费用”的金额
         YHGCQTFY(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
         },
         // 预备费:取清单固定类别是“预备费”的金额
         YBF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(fixedFlag.BUDGET_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(fixedFlag.BUDGET_FEE, tender, 'common');
         },
         // 养护单位项目管理费:以累进办法计算,计算基数为“定额建筑安装工程费(定额设备购置费按40%计)
         YHDWXMGLF(tender) {
@@ -304,9 +293,7 @@ if (typeof baseFigureTemplate !== 'undefined') {
         //{各章清单合计}
         // 取清单固定类别是“第100章至700章清单”的金额
         'GZQDHJ': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
         },
         //{专项暂定合计}
         // 汇总专项暂定列有值的清单的金额

+ 5 - 15
web/over_write/js/zhejiang_2005.js

@@ -126,21 +126,15 @@ if (typeof baseFigureTemplate !== 'undefined') {
     baseFigureTemplate.budget = {
         // 公路养护工程费:取清单固定类别是“建筑安装工程费”的金额
         GLYHGCF(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
         },
         // 设备购置费用:取清单固定类别是“设备购置费”的金额
         SBGZFY(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.EQUIPMENT_ACQUISITION_FEE, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.EQUIPMENT_ACQUISITION_FEE, tender, 'common');
         },
         // 公路养护工程其他费用:取清单固定类别是“养护工程其他费用”的金额。
         GLYHGCQTFY(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
         },
         // 养护工程管理经费:取清单固定类别是“建筑安装工程费”金额为基数,采用累进办法计算
         YHGCGLJF(tender) {
@@ -152,9 +146,7 @@ if (typeof baseFigureTemplate !== 'undefined') {
         },
         // 一二三部分合计:取清单固定类别是“一二三部分合计”的金额
         YESBFHJ(tender) {
-            const feeField = 'common';
-            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.ONE_TO_THREE_TOTAL, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_TO_THREE_TOTAL, tender, 'common');
         },
         // 工程造价增涨预留费:以{公路养护工程费}为基数,= P * [(1+i)^(n-1) -1]
         // P:公路养护工程费总额(元)
@@ -178,9 +170,7 @@ if (typeof baseFigureTemplate !== 'undefined') {
         //{各章清单合计}
         // 取清单固定类别是“第100章至700章清单”的金额
         'GZQDHJ': function (tender) {
-            let feeField = 'common',
-                subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
-            return cbTools.getBillsFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, feeField, subFeeField);
+            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
         },
         //{专项暂定合计}
         // 汇总专项暂定列有值的清单的金额