Przeglądaj źródła

父清单计算:汇总子清单的费用类别。

Chenshilong 7 lat temu
rodzic
commit
b3164fcae0

+ 120 - 17
web/building_saas/main/js/models/calc_program.js

@@ -63,26 +63,36 @@ class CalcProgram {
         this.calc.calculate(treeNode);
         this.calc.calculate(treeNode);
 
 
         // 存储、刷新本结点、所有父结点
         // 存储、刷新本结点、所有父结点
-        if (this.calc.changed){
-            if (treeNode.parent) {
-                projectObj.converseCalculateBills(treeNode.parent);
-            };
-
-            let data = {ID: treeNode.data.ID, projectID: projectObj.project.ID(), fees: treeNode.data.fees};
-            let newDta = {'updateType': 'ut_update', 'updateData': data};
-            let newDataArr = [];
-            newDataArr.push(newDta);
-            projectObj.project.pushNow('', treeNode.sourceType, newDataArr);
-            projectObj.mainController.refreshTreeNode([treeNode]);
-
+        if (this.calc.changed) {
+            me.saveAndCalcParents(treeNode);
             this.calc.changed = false;
             this.calc.changed = false;
         };
         };
     };
     };
 
 
-    gatherCalcItems(treeNode){
+    saveAndCalcParents(treeNode) {
+        if (treeNode.parent) {
+            projectObj.converseCalculateBills(treeNode.parent);
+        };
+
+        let data = {ID: treeNode.data.ID, projectID: projectObj.project.ID(), fees: treeNode.data.fees};
+        let newDta = {'updateType': 'ut_update', 'updateData': data};
+        let newDataArr = [];
+        newDataArr.push(newDta);
+        projectObj.project.pushNow('', treeNode.sourceType, newDataArr);
+        projectObj.mainController.refreshTreeNode([treeNode]);
+    };
+
+    gatherRationFeeTypes(treeNode){
         let me = this;
         let me = this;
+        let changed = false;
         let rst = [];
         let rst = [];
         if (treeNode.sourceType === this.project.Bills.getSourceType()) {
         if (treeNode.sourceType === this.project.Bills.getSourceType()) {
+            if (!treeNode.data.fees) {
+                treeNode.data.fees = [];
+                treeNode.data.feesIndex = {};
+                changed = true;
+            };
+
             let rations = this.project.Ration.getRationsByNode(treeNode);
             let rations = this.project.Ration.getRationsByNode(treeNode);
             for (let ft of feeType) {
             for (let ft of feeType) {
                 let ftObj = {};
                 let ftObj = {};
@@ -97,12 +107,105 @@ class CalcProgram {
                         ttf = (ttf + parseFloat(ration.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
                         ttf = (ttf + parseFloat(ration.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
                     };
                     };
                 };
                 };
-                ftObj.unitFee = uf;
-                ftObj.totalFee = tf;
-                ftObj.tenderUnitFee = tuf;
-                ftObj.tenderTotalFee = ttf;
+                ftObj.unitFee = uf.toDecimal(me.digit);
+                ftObj.totalFee = tf.toDecimal(me.digit);
+                ftObj.tenderUnitFee = tuf.toDecimal(me.digit);
+                ftObj.tenderTotalFee = ttf.toDecimal(me.digit);
+
+                if (!treeNode.data.feesIndex[ftObj.type]){
+                    let fee = {
+                        'fieldName': ftObj.type,
+                        'unitFee': ftObj.unitFee,
+                        'totalFee': ftObj.totalFee,
+                        'tenderUnitFee': 0,
+                        'tenderTotalFee': 0
+                    };
+                    treeNode.data.fees.push(fee);
+                    treeNode.data.feesIndex[ftObj.type] = fee;
+                    changed = true;
+                }
+                else{
+                    if (treeNode.data.feesIndex[ftObj.type].unitFee != ftObj.unitFee){
+                        treeNode.data.feesIndex[ftObj.type].unitFee = ftObj.unitFee;
+                        changed = true;
+                    };
+
+                    if (treeNode.data.feesIndex[ftObj.type].totalFee != ftObj.totalFee){
+                        treeNode.data.feesIndex[ftObj.type].totalFee = ftObj.totalFee;
+                        changed = true;
+                    };
+                };
+
+                rst.push(ftObj);
+            };
+
+            if (changed) {
+                me.saveAndCalcParents(treeNode);
+                changed = false;
+            };
+        };
+        return rst;
+    };
+
+    gatherBillFeeTypes(treeNode){
+        let me = this;
+        let changed = false;
+        let rst = [];
+        if (treeNode.sourceType === this.project.Bills.getSourceType()) {
+            if (!treeNode.data.fees) {
+                treeNode.data.fees = [];
+                treeNode.data.feesIndex = {};
+                changed = true;
+            };
+
+            for (let ft of feeType) {
+                let ftObj = {};
+                ftObj.type = ft.type;
+                ftObj.name = ft.name;
+                let uf = 0, tf = 0, tuf = 0, ttf = 0;
+                for (let node of treeNode.children) {
+                    if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
+                        uf = (uf + parseFloat(node.data.feesIndex[ft.type].unitFee)).toDecimal(me.digitDefault);
+                        tf = (tf + parseFloat(node.data.feesIndex[ft.type].totalFee)).toDecimal(me.digitDefault);
+                        tuf = (tuf + parseFloat(node.data.feesIndex[ft.type].tenderUnitFee)).toDecimal(me.digitDefault);
+                        ttf = (ttf + parseFloat(node.data.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
+                    };
+                };
+                ftObj.unitFee = uf.toDecimal(me.digit);
+                ftObj.totalFee = tf.toDecimal(me.digit);
+                ftObj.tenderUnitFee = tuf.toDecimal(me.digit);
+                ftObj.tenderTotalFee = ttf.toDecimal(me.digit);
+
+                if (!treeNode.data.feesIndex[ftObj.type]){
+                    let fee = {
+                        'fieldName': ftObj.type,
+                        'unitFee': ftObj.unitFee,
+                        'totalFee': ftObj.totalFee,
+                        'tenderUnitFee': 0,
+                        'tenderTotalFee': 0
+                    };
+                    treeNode.data.fees.push(fee);
+                    treeNode.data.feesIndex[ftObj.type] = fee;
+                    changed = true;
+                }
+                else{
+                    if (treeNode.data.feesIndex[ftObj.type].unitFee != ftObj.unitFee){
+                        treeNode.data.feesIndex[ftObj.type].unitFee = ftObj.unitFee;
+                        changed = true;
+                    };
+
+                    if (treeNode.data.feesIndex[ftObj.type].totalFee != ftObj.totalFee){
+                        treeNode.data.feesIndex[ftObj.type].totalFee = ftObj.totalFee;
+                        changed = true;
+                    };
+                };
 
 
                 rst.push(ftObj);
                 rst.push(ftObj);
+
+                if (changed) {
+                    me.saveAndCalcParents(treeNode);
+                    changed = false;
+                };
             };
             };
         };
         };
         return rst;
         return rst;

+ 32 - 12
web/building_saas/main/js/views/calc_program_view.js

@@ -234,24 +234,44 @@ let calcProgramObj = {
         let isLeafBill = isBill && treeNode.source.children && treeNode.source.children.length === 0;
         let isLeafBill = isBill && treeNode.source.children && treeNode.source.children.length === 0;
         let isBillPriceCalc = projectObj.project.projSetting.billsCalcMode === billsPrice;
         let isBillPriceCalc = projectObj.project.projSetting.billsCalcMode === billsPrice;
 
 
-        if (isRation || (isLeafBill && isBillPriceCalc)) {
+        if (isRation) {                 // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。
             projectObj.project.calcProgram.calculate(treeNode);
             projectObj.project.calcProgram.calculate(treeNode);
             me.datas = me.treeNode.data.calcTemplate.calcItems;
             me.datas = me.treeNode.data.calcTemplate.calcItems;
-            sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
-            sheetCommonObj.showData(me.sheet, me.setting, me.datas);
         }
         }
-        else if (isBill) {
-            if (isBillPriceCalc){    // 清单单价计算模式下的父级清单:汇总定额的计算程序的费用类别
-                let gatherCalcItems = projectObj.project.calcProgram.gatherCalcItems(treeNode);
+        else if (isLeafBill) {
+            let childrenType = '';
+            if (treeNode.children && treeNode.children.length > 0){
+                if (treeNode.children[0].sourceType == projectObj.project.Ration.getSourceType()){
+                    childrenType = 'ration';
+                } else if (treeNode.children[0].sourceType == projectObj.project.VolumePrice.getSourceType()){
+                    childrenType = 'volumePrice';
+                };
+            }else{
+                childrenType = 'formula';
+            };
 
 
-                sheetCommonObj.initSheet(me.sheet, me.setting, gatherCalcItems.length);
-                sheetCommonObj.showData(me.sheet, me.setting, gatherCalcItems);
-            }
-            else{
-                SheetDataHelper.loadSheetHeader(calcProgramSetting, me.sheet);
-                SheetDataHelper.loadSheetData(calcProgramSetting, me.sheet, baseCalcField);
+            if (childrenType == 'ration'){
+                if (isBillPriceCalc){   // 清单单价计算模式下的叶子清单:取自己的计算程序ID,找到自己的计算程序计算。
+                    projectObj.project.calcProgram.calculate(treeNode);
+                    me.datas = me.treeNode.data.calcTemplate.calcItems;
+                }else{                  // 前三种计算模式下的叶子清单:汇总定额的计算程序的费用类别
+                    me.datas = projectObj.project.calcProgram.gatherRationFeeTypes(treeNode);
+                };
+            }else if (childrenType == 'volumePrice'){
+                me.datas = [];
+            }else if (childrenType == 'formula'){
+                me.datas = [];
             };
             };
         }
         }
+        else if (isBill){    // 父清单:汇总子清单的费用类别
+            me.datas = projectObj.project.calcProgram.gatherBillFeeTypes(treeNode);
+        };
+
+        sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
+        sheetCommonObj.showData(me.sheet, me.setting, me.datas);
+
+        // SheetDataHelper.loadSheetHeader(calcProgramSetting, me.sheet);
+        // SheetDataHelper.loadSheetData(calcProgramSetting, me.sheet, baseCalcField);
     },
     },
 
 
     clearData: function (){
     clearData: function (){