| 
															
																@@ -510,20 +510,23 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         project.registerModule(ModuleNames.calc_program, me); 
															 | 
															
															 | 
															
																         project.registerModule(ModuleNames.calc_program, me); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     }; 
															 | 
															
															 | 
															
																     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 兼容Project框架方法 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     getSourceType () { 
															 | 
															
															 | 
															
																     getSourceType () { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         return ModuleNames.calc_program; 
															 | 
															
															 | 
															
																         return ModuleNames.calc_program; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    };    // 兼容Project框架方法 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 兼容Project框架方法 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     loadData (datas) { 
															 | 
															
															 | 
															
																     loadData (datas) { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         this.datas = datas; 
															 | 
															
															 | 
															
																         this.datas = datas; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         this.compileAllTemps(); 
															 | 
															
															 | 
															
																         this.compileAllTemps(); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    };   // 兼容Project框架方法 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 兼容Project框架方法 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     doAfterUpdate (err, data) { 
															 | 
															
															 | 
															
																     doAfterUpdate (err, data) { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         if(!err){ 
															 | 
															
															 | 
															
																         if(!err){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             $.bootstrapLoading.end(); 
															 | 
															
															 | 
															
																             $.bootstrapLoading.end(); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         } 
															 | 
															
															 | 
															
																         } 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    };  // 兼容Project框架方法 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																     // 经测试,全部编译一次耗时0.003~0.004秒。耗时基本忽略不计。 
															 | 
															
															 | 
															
																     // 经测试,全部编译一次耗时0.003~0.004秒。耗时基本忽略不计。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     compileAllTemps(){ 
															 | 
															
															 | 
															
																     compileAllTemps(){ 
															 | 
														
													
												
											
												
													
														
															 | 
															
																@@ -697,8 +700,56 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         }; 
															 | 
															
															 | 
															
																         }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     }; 
															 | 
															
															 | 
															
																     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-  // 仅内部调用。注意:外部不能直接使用,因为这里传入的树节点必须有一定的初始化。 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    innerCalc(treeNode){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 存储、刷新零散的多个结点。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    saveNodes(treeNodes){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        if (treeNodes.length < 1) return; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        let me = this; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        me.project.beginUpdate(''); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        for (let node of treeNodes){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            if (node.changed){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                let data = { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    ID: node.data.ID, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    projectID: me.project.ID(), 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    /*  subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。              */ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    subType: node.data.subType, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    quantity: node.data.quantity, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    calcBase: node.data.calcBase, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    calcBaseValue: node.data.calcBaseValue, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    programID: node.data.programID, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    marketUnitFee: node.data.marketUnitFee, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    marketTotalFee: node.data.marketTotalFee, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    fees: node.data.fees, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    isFromDetail:node.data.isFromDetail, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    feeRate: node.data.feeRate, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    feeRateID: node.data.feeRateID, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    contain:node.data.contain, 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    quantityEXP:node.data.quantityEXP 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                if(node.sourceType==ModuleNames.ration && node.data.type==rationType.gljRation){//定额类型的工料机做特殊处理 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    data.code=node.data.code; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    data.projectGLJID = node.data.projectGLJID; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    delete data.marketUnitFee; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                } 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                let newData = {'updateType': 'ut_update', 'updateData': data}; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                me.project.push(node.sourceType, [newData]); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            } 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        me.project.endUpdate(); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        for (let node of treeNodes){delete node.changed}; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        projectObj.mainController.refreshTreeNode(treeNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            calcProgramObj.showData(me.project.mainTree.selected, false); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    innerCalc(treeNode, changedArr){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let me = this; 
															 | 
															
															 | 
															
																         let me = this; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         // 仅用作树节点显示的工料机不能参与计算。 
															 | 
															
															 | 
															
																         // 仅用作树节点显示的工料机不能参与计算。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         if (treeNode.sourceType === me.project.ration_glj.getSourceType()) return; 
															 | 
															
															 | 
															
																         if (treeNode.sourceType === me.project.ration_glj.getSourceType()) return; 
															 | 
														
													
												
											
												
													
														
															 | 
															
																@@ -923,126 +974,34 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 }; 
															 | 
															
															 | 
															
																                 }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             } 
															 | 
															
															 | 
															
																             } 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         }; 
															 | 
															
															 | 
															
																         }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    /*// 计算公式结点(叶子清单的计算基数计算)。仅内部调用。注意:外部不能直接使用,因为这里传入的树节点必须有一定的初始化。 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    innerCalcFormula(treeNode){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.calcType = treeNodeTools.getCalcType(treeNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (treeNode.calcType != treeNodeCalcType.ctCalcBaseValue) return; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let me = this; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        delete treeNode.data.gljList; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (treeNode.data.programID) treeNode.data.programID = null; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let f = treeNode.data.feeRate ? treeNode.data.feeRate : 100; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (!treeNode.data.quantity) treeNode.data.quantity = 1; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let q = treeNode.data.quantity; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let b = treeNode.data.calcBaseValue ? treeNode.data.calcBaseValue : 0; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let uf = (b * f * q / 100).toDecimal(decimalObj.bills.unitPrice); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let tuf = uf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let ttf = tf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        delete treeNode.data.fees;    // 直接删掉再新增,不用一个个费判断更新,效率更高。 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        delete treeNode.data.feesIndex; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNodeTools.initFeeField(treeNode, 'common'); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.data.feesIndex.common.unitFee = uf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.data.feesIndex.common.totalFee = tf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.data.feesIndex.common.tenderUnitFee = tuf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.data.feesIndex.common.tenderTotalFee = ttf; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.changed = true; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        treeNode.data.calcTemplate = {"calcItems": []}; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    };*/ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    // 计算本节点(默认同时递归计算所有父节点,可选) 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 计算本节点、所有父节点(默认,可选)、公式引用节点。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     calculate(treeNode, calcParents = true){ 
															 | 
															
															 | 
															
																     calculate(treeNode, calcParents = true){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let me = this; 
															 | 
															
															 | 
															
																         let me = this; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let changedNodes = []; 
															 | 
															
															 | 
															
																         let changedNodes = []; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        me.innerCalc(treeNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+        me.innerCalc(treeNode, changedNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																         if (treeNode.changed) { 
															 | 
															
															 | 
															
																         if (treeNode.changed) { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (!changedNodes.includes(treeNode)) changedNodes.push(treeNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             // 计算父结点 
															 | 
															
															 | 
															
																             // 计算父结点 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             if (calcParents){ 
															 | 
															
															 | 
															
																             if (calcParents){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 let curNode = treeNode.parent; 
															 | 
															
															 | 
															
																                 let curNode = treeNode.parent; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 while (curNode){ 
															 | 
															
															 | 
															
																                 while (curNode){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    me.innerCalc(curNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    if (curNode.changed && !changedNodes.includes(curNode)) changedNodes.push(curNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                    me.innerCalc(curNode, changedNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                     curNode = curNode.parent; 
															 | 
															
															 | 
															
																                     curNode = curNode.parent; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 }; 
															 | 
															
															 | 
															
																                 }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             }; 
															 | 
															
															 | 
															
																             }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            // 父结点算完,再算所有的公式结点(必须先算完父结点,再算公式结点) 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            // 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点) 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             me.calcFormulaNodes(changedNodes); 
															 | 
															
															 | 
															
																             me.calcFormulaNodes(changedNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         }; 
															 | 
															
															 | 
															
																         }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																         return changedNodes; 
															 | 
															
															 | 
															
																         return changedNodes; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     }; 
															 | 
															
															 | 
															
																     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    // 存储、刷新本节点(默认存储刷新所有父节点,可选) 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    saveNode(treeNode, saveParents = true) { 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (!treeNode.changed) return; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let me = this; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let nodesArr = []; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let curNode = treeNode; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        while (curNode) { 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (curNode.changed){nodesArr.push(curNode)}; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (saveParents) curNode = curNode.parent 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            else break; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        me.saveNodes(nodesArr); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    // 存储、刷新零散的多个树结点 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    saveNodes(treeNodes){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (treeNodes.length < 1) return; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        let me = this; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        me.project.beginUpdate(''); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        for (let node of treeNodes){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (node.changed){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                let data = { 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    ID: node.data.ID, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    projectID: me.project.ID(), 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    /*  subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。              */ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    subType: node.data.subType, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    quantity: node.data.quantity, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    calcBase: node.data.calcBase, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    calcBaseValue: node.data.calcBaseValue, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    programID: node.data.programID, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    marketUnitFee: node.data.marketUnitFee, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    marketTotalFee: node.data.marketTotalFee, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    fees: node.data.fees, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    isFromDetail:node.data.isFromDetail, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    feeRate: node.data.feeRate, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    feeRateID: node.data.feeRateID, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    contain:node.data.contain, 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    quantityEXP:node.data.quantityEXP 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                if(node.sourceType==ModuleNames.ration && node.data.type==rationType.gljRation){//定额类型的工料机做特殊处理 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    data.code=node.data.code; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    data.projectGLJID = node.data.projectGLJID; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                    delete data.marketUnitFee; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                } 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                let newData = {'updateType': 'ut_update', 'updateData': data}; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                me.project.push(node.sourceType, [newData]); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            } 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        me.project.endUpdate(); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        for (let node of treeNodes){delete node.changed}; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        projectObj.mainController.refreshTreeNode(treeNodes); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) { 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            calcProgramObj.showData(me.project.mainTree.selected, false); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-        }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																- 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。 
															 | 
															
															 | 
															
																     /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     参数取值如下: 
															 | 
															
															 | 
															
																     参数取值如下: 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     calcAllType.catAll       计算所有树结点 (不指定参数时的默认值) 
															 | 
															
															 | 
															
																     calcAllType.catAll       计算所有树结点 (不指定参数时的默认值) 
															 | 
														
													
												
											
												
													
														
															 | 
															
																@@ -1071,7 +1030,7 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     }; 
															 | 
															
															 | 
															
																     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedNodesArr中) 
															 | 
															
															 | 
															
																     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedNodesArr中) 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    calcFormulaNodes(changedNodesArr){ 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    calcFormulaNodes(changedArr){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let me = this; 
															 | 
															
															 | 
															
																         let me = this; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let formulaNodes = treeNodeTools.getFormulaNodes(); 
															 | 
															
															 | 
															
																         let formulaNodes = treeNodeTools.getFormulaNodes(); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         if (formulaNodes.length == 0) return; 
															 | 
															
															 | 
															
																         if (formulaNodes.length == 0) return; 
															 | 
														
													
												
											
												
													
														
															 | 
															
																@@ -1080,15 +1039,13 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             projectObj.project.calcBase.calculate(formulaNode, true); 
															 | 
															
															 | 
															
																             projectObj.project.calcBase.calculate(formulaNode, true); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             if (projectObj.project.calcBase.success){ 
															 | 
															
															 | 
															
																             if (projectObj.project.calcBase.success){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 // 计算公式结点 
															 | 
															
															 | 
															
																                 // 计算公式结点 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                me.innerCalc(formulaNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                if (formulaNode.changed && !changedNodesArr.includes(formulaNode)) changedNodesArr.push(formulaNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                me.innerCalc(formulaNode, changedArr); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 // 计算父结点 
															 | 
															
															 | 
															
																                 // 计算父结点 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 if (formulaNode.changed){ 
															 | 
															
															 | 
															
																                 if (formulaNode.changed){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                     let curNode = formulaNode.parent; 
															 | 
															
															 | 
															
																                     let curNode = formulaNode.parent; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                     while (curNode){ 
															 | 
															
															 | 
															
																                     while (curNode){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                        me.innerCalc(curNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                        if (curNode.changed && !changedNodesArr.includes(curNode)) changedNodesArr.push(curNode); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+                        me.innerCalc(curNode, changedArr); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                         curNode = curNode.parent; 
															 | 
															
															 | 
															
																                         curNode = curNode.parent; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                     }; 
															 | 
															
															 | 
															
																                     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																                 }; 
															 | 
															
															 | 
															
																                 }; 
															 | 
														
													
												
											
												
													
														
															 | 
															
																@@ -1122,26 +1079,21 @@ class CalcProgram { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     calcRationsAndSave(rationNodes){ 
															 | 
															
															 | 
															
																     calcRationsAndSave(rationNodes){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let me = this, leafBills = [], changedNodes = []; 
															 | 
															
															 | 
															
																         let me = this, leafBills = [], changedNodes = []; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         for (let node of rationNodes) { 
															 | 
															
															 | 
															
																         for (let node of rationNodes) { 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            me.calculate(node, false); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (node.changed) changedNodes.push(node); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            me.innerCalc(node, changedNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             let leafBill = node.parent; 
															 | 
															
															 | 
															
																             let leafBill = node.parent; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            if (leafBill && leafBills.indexOf(leafBill) < 0) leafBills.push(leafBill);      // 多条定额同属一条叶子清单时,避免叶子清单重复计算 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            // 多条定额同属一条叶子清单时,避免叶子清单重复计算 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+            if (leafBill && leafBills.indexOf(leafBill) < 0) leafBills.push(leafBill); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         }; 
															 | 
															
															 | 
															
																         }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																         for (let node of leafBills){ 
															 | 
															
															 | 
															
																         for (let node of leafBills){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																             me.calculate(node); 
															 | 
															
															 | 
															
																             me.calculate(node); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            let cur = node; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            while (cur) { 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                if (cur.changed && changedNodes.indexOf(cur) < 0) changedNodes.push(cur); 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-                cur = cur.parent; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-            }; 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         }; 
															 | 
															
															 | 
															
																         }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																         me.saveNodes(changedNodes); 
															 | 
															
															 | 
															
																         me.saveNodes(changedNodes); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     }; 
															 | 
															
															 | 
															
																     }; 
															 | 
														
													
												
													
														
															| 
															 | 
															
																  
															 | 
															
															 | 
															
																  
															 | 
														
													
												
													
														
															| 
															 | 
															
																     // 计算并保存指定的一个树节点。修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。 
															 | 
															
															 | 
															
																     // 计算并保存指定的一个树节点。修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																-    // 这个方法实际上封装了calculate()和saveNodes()两个方法,方便外部调用,少写一点代码。 
															 | 
															
															 | 
															
																 
															 | 
														
													
												
													
														
															| 
															 | 
															
																 
															 | 
															
															 | 
															
																+    // 这个方法实际上封装了calculate()和saveNodes()两个方法,主要目的是为了外部调用方便,少写一点累赘代码。 
															 | 
														
													
												
													
														
															| 
															 | 
															
																     calcAndSave(treeNode){ 
															 | 
															
															 | 
															
																     calcAndSave(treeNode){ 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         let changedNodes = this.calculate(treeNode); 
															 | 
															
															 | 
															
																         let changedNodes = this.calculate(treeNode); 
															 | 
														
													
												
													
														
															| 
															 | 
															
																         this.saveNodes(changedNodes); 
															 | 
															
															 | 
															
																         this.saveNodes(changedNodes); 
															 |