Jelajahi Sumber

计算优化

zhangweicheng 6 tahun lalu
induk
melakukan
02c47c90b0

+ 44 - 8
web/building_saas/main/js/models/calc_program.js

@@ -108,7 +108,7 @@ let calcTools = {
         delete treeNode.data.gljList;
         if (this.isRationCategory(treeNode)) {
             if (treeNode.data.type != rationType.volumePrice) {
-                treeNode.data.gljList = projectObj.project.ration_glj.getGljArrByRation(treeNode.data);
+                treeNode.data.gljList = projectObj.project.calcProgram.getGljArrByRation(treeNode.data);
             }
         }
         else if (this.isBill(treeNode)){
@@ -1404,6 +1404,8 @@ class CalcProgram {
         let me = this;
         me.project = project;
         me.datas = [];
+        me.rationMap = null;//定额 - 工料机映射临时变量
+        me.pgljMap = null;
         project.registerModule(ModuleNames.calc_program, me);
     };
 
@@ -1626,6 +1628,8 @@ class CalcProgram {
         };
 
         let me = this;
+        //设置定额工料机映射表
+        me.setRationMap();
         me.setUpdateDataToNode(treeNode);                                       // 先更新要计算的节点信息
         if(!treeNode.temData) treeNode.temData = _.cloneDeep(treeNode.data);    // 有可能会有多次计算,只有第一次才保存原始数据,用来对于更新。
 
@@ -1876,6 +1880,8 @@ class CalcProgram {
                 delete node.temData;
                 node.updateData = {};
             };
+            me.rationMap = null;
+            me.pgljMap = null;
             if(callback){
                 callback(data);
             };
@@ -1973,7 +1979,7 @@ class CalcProgram {
                 rationNodes.push(node)
             else
                 billNodes.push(node);
-        };
+        }
 
         // 多条定额同属一条叶子清单时,避免叶子清单重复计算
         for (let ration of rationNodes) {
@@ -1981,14 +1987,14 @@ class CalcProgram {
             let leafBill = ration.parent;
             if (leafBill && leafBills.indexOf(leafBill) < 0)
                 leafBills.push(leafBill);
-        };
+        }
 
         billNodes.merge(leafBills);
 
         for (let bill of billNodes){
             let changeBills = me.calculate(bill, true, false, tender);
             allChangedNodes.merge(changeBills);
-        };
+        }
 
         me.calcFormulaNodes(allChangedNodes, tender);
         me.saveNodes(allChangedNodes, callback);
@@ -2012,10 +2018,10 @@ class CalcProgram {
                     while (curNode){
                         me.innerCalc(curNode, changedArr, tender);
                         curNode = curNode.parent;
-                    };
-                };
-            };
-        };
+                    }
+                }
+            }
+        }
     };
 
     // 计算叶子清单下的所有子结点、自身、所有父结点、公式引用结点(即跟该叶子清单相关的所有结点)。最后打包存储。
@@ -2126,6 +2132,36 @@ class CalcProgram {
 
 
     };
+
+    setRationMap(){
+        if(this.rationMap == null){
+            this.rationMap = {};
+            for(let glj of projectObj.project.ration_glj.datas){
+                if(this.rationMap[glj.rationID]){
+                    this.rationMap[glj.rationID].push(glj)
+                }else {
+                    this.rationMap[glj.rationID] = [glj];
+                }
+            }
+        }
+        if(this.pgljMap == null ){
+            this.pgljMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList, 'id');
+        }
+    };
+    getGljArrByRation(ration){
+        if (ration.type == rationType.gljRation){
+            let glj = JSON.parse(JSON.stringify(ration));
+            glj.type = glj.subType;
+            glj.quantity = 1;
+            glj.totalQuantity = parseFloatPlus(ration.quantity);
+            return [glj];
+        } else{
+            if(!this.rationMap) return [];
+            let result = this.rationMap[ration.ID];
+            result = gljOprObj.combineWithProjectGlj(result,false,ration,this.pgljMap);
+            return result;
+        }
+    }
 };
 
 // export default analyzer;

+ 1 - 22
web/building_saas/main/js/models/ration_glj.js

@@ -40,27 +40,6 @@ let ration_glj = {
             this.datas = datas;
         };
 
-        ration_glj.prototype.getGljArrByRation = function (ration) {
-            if (ration.type == rationType.gljRation){
-                let glj = JSON.parse(JSON.stringify(ration));
-                glj.type = glj.subType;
-                glj.quantity = 1;
-                glj.totalQuantity = parseFloatPlus(ration.quantity);
-                return [glj];
-            }
-            else{
-                let result = this.datas.filter(function (data) {
-                    if(data.rationID === ration.ID){
-                        gljOprObj.getTotalQuantity(data, ration);
-                        return true;
-                    }
-                    return false;
-                })
-                result = gljOprObj.combineWithProjectGlj(result);
-                return result;
-            }
-        };
-
         ration_glj.prototype.getGLJListByRationID = function (rationID) {
             return  _.filter(this.datas, {'rationID': rationID})
         };
@@ -94,7 +73,7 @@ let ration_glj = {
                     glj.adjustPrice = glj.marketUnitFee;
                     result.push(glj);
                 } else{
-                    let rationGljs = this.getGljArrByRation(ration);
+                    let rationGljs = projectObj.project.calcProgram.getGljArrByRation(ration);
                     for (let glj of rationGljs) {
                         let sameGlj = findGlj(glj, result);
                         if (!sameGlj) {

+ 5 - 4
web/building_saas/main/js/views/glj_view.js

@@ -702,27 +702,28 @@ var gljOprObj = {
         }
         this.sheetData = newList;
     },
-    combineWithProjectGlj: function (ration_gljs,needRatio=true) {
+    combineWithProjectGlj: function (ration_gljs,needRatio=true,ration,p_gljMap) {
         let projectGLJData = projectObj.project.projectGLJ.datas;
         let projectGljs = projectGLJData.gljList;
         let mixRatioMap = projectGLJData.mixRatioMap;
         if (ration_gljs && ration_gljs.length > 0 && projectGljs && projectGljs.length > 0) {
-
+            let pgljMap = p_gljMap?p_gljMap:_.indexBy(projectGljs, 'id');
             for (let i = 0; i < ration_gljs.length; i++) {
-                let glj = _.find(projectGljs, {'id': ration_gljs[i].projectGLJID});
+                let glj = pgljMap[ration_gljs[i].projectGLJID];
                 if (glj) {
                     if(projectObj.project.projectGLJ.isEstimateType(ration_gljs[i].type )){
                         ration_gljs[i].isEstimate = glj.is_evaluate;
                     }
                     ration_gljs[i].shortName =projectObj.project.projectGLJ.getShortNameByID(ration_gljs[i].type);
                     ration_gljs[i].isAdd = glj.unit_price.is_add;
-                    ration_gljs[i]=this.setGLJPrice(ration_gljs[i],glj);//设置工料机价格
+                    ration_gljs[i]=this.setGLJPrice(ration_gljs[i],glj,false);//设置工料机价格
                     delete ration_gljs[i].subList; //置空,再设置
                     let connect_index = this.getIndex(glj, gljKeyArray);
                     if (needRatio==true&&mixRatioMap.hasOwnProperty(connect_index)) {
                         let mixRatios = this.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);
                         ration_gljs[i].subList = mixRatios;
                     }
+                    if(ration) gljOprObj.getTotalQuantity(ration_gljs[i], ration);
                 }
             }
         }