chenshilong пре 7 година
родитељ
комит
c702e6062c

+ 47 - 18
web/building_saas/main/js/models/calc_program.js

@@ -641,7 +641,8 @@ let calcTools = {
             contain: treeNode.data.contain,
             quantityEXP: treeNode.data.quantityEXP,
             summaryFees: treeNode.data.summaryFees,
-            name:treeNode.data.name
+            name:treeNode.data.name,
+            rationQuantityCoe: treeNode.data.rationQuantityCoe
         };
 
         // 定额大类
@@ -1079,11 +1080,11 @@ let analyzer = {
         });
         for (var i = 0; i < atIDArr.length; i++) {
             let patt = new RegExp(atIDArr[i]);
-            let val = `$CE.at(${IDArr[i]}, false)`;
+            let val = `$CE.at(${IDArr[i]},false)`;
             rst = rst.replace(patt, val);
         };
         rst = rst.replace(/\[/g, "$CE.base('");
-        rst = rst.replace(/\]/g, "', false)");
+        rst = rst.replace(/\]/g, "',false)");
         rst = rst.replace(/L/g, labourCoe);
         return rst;
     },
@@ -1470,7 +1471,7 @@ class CalcProgram {
     };
 
     // 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。
-    innerCalc(treeNode, changedArr, isTender = false){
+    innerCalc(treeNode, changedArr, tender){
         let me = this;
         // 仅用作树节点显示的工料机不能参与计算。
         if (treeNode.sourceType === ModuleNames.ration_glj) return;
@@ -1685,6 +1686,7 @@ class CalcProgram {
 
                 calcTools.initFees(treeNode);
 
+                if (tender == tenderTypes.ttCalc) calcTools.calcNodeTenderQty(treeNode);
                 for (let idx of template.compiledSeq) {
                     let calcItem = template.calcItems[idx];
                     $CE.tempCalcItem = calcItem;
@@ -1696,8 +1698,7 @@ class CalcProgram {
                     calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
                     calcItem.totalFee = (calcItem.unitFee * calcTools.uiNodeQty(treeNode)).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 
-                    if (isTender) {
-                        calcTools.calcNodeTenderQty(treeNode);
+                    if (tender == tenderTypes.ttCalc) {
                         let tExpr = analyzer.getCompiledTenderExpr(calcItem.compiledExpr);
                         calcItem.tenderUnitFee = (eval(tExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
                         calcItem.tenderTotalFee = (calcItem.tenderUnitFee * treeNode.data.tenderQuantity).toDecimal(decimalObj.decimal('totalPrice', treeNode));
@@ -1708,6 +1709,10 @@ class CalcProgram {
                         calcTools.checkFeeField(treeNode, calcItem);
                     };
                 };
+
+                if (tender == tenderTypes.ttReverseRation)
+                    this.calcTenderReverse(treeNode);
+
                 deleteUselessFees(treeNode, fnArr);
             };
         };
@@ -1719,22 +1724,22 @@ class CalcProgram {
     };
 
     // 计算本节点、所有父节点(默认,可选)、公式引用节点(默认,可选)。
-    calculate(treeNode, calcParents = true, calcFormulas = true, isTender = false){
+    calculate(treeNode, calcParents = true, calcFormulas = true, tender){
         let me = this;
         let changedNodes = [];
-        me.innerCalc(treeNode, changedNodes, isTender);
+        me.innerCalc(treeNode, changedNodes, tender);
         if (treeNode.changed) {
             // 计算父结点
             if (calcParents){
                 let curNode = treeNode.parent;
                 while (curNode){
-                    me.innerCalc(curNode, changedNodes, isTender);
+                    me.innerCalc(curNode, changedNodes, tender);
                     curNode = curNode.parent;
                 };
             };
             // 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点)
             if (calcFormulas) {
-                me.calcFormulaNodes(changedNodes, isTender);
+                me.calcFormulaNodes(changedNodes, tender);
             };
         };
 
@@ -1747,7 +1752,7 @@ class CalcProgram {
         calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到)  不要用
         缺陷:calcAllType.catRations 参数情况不会计算父结点。(calcAllType.catBills 可以,因为清单的父结点也是清单会计算)
     */
-    calcAllNodes(calcType = calcAllType.catAll, isTender){
+    calcAllNodes(calcType = calcAllType.catAll, tender){
         let me = this;
         let changedNodes = [];
         function calcNodes(nodes) {
@@ -1759,17 +1764,17 @@ class CalcProgram {
                 if (calcType == calcAllType.catAll || calcType == node.sourceType) {
                     node.calcType = calcTools.getCalcType(node);
                     if (node.calcType != treeNodeCalcType.ctCalcBaseValue)
-                        me.innerCalc(node, changedNodes, isTender);
+                        me.innerCalc(node, changedNodes, tender);
                 };
             }
         };
         calcNodes(me.project.mainTree.roots);
-        me.calcFormulaNodes(changedNodes, isTender);
+        me.calcFormulaNodes(changedNodes, tender);
         return changedNodes;
     };
 
     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedArr中)
-    calcFormulaNodes(changedArr, isTender){
+    calcFormulaNodes(changedArr, tender){
         let me = this;
         let formulaNodes = cbTools.getFormulaNodes(true);
         if (formulaNodes.length == 0) return;
@@ -1778,13 +1783,13 @@ class CalcProgram {
             projectObj.project.calcBase.calculate(formulaNode, true);
             if (projectObj.project.calcBase.success){
                 // 计算公式结点
-                me.innerCalc(formulaNode, changedArr, isTender);
+                me.innerCalc(formulaNode, changedArr, tender);
 
                 // 计算父结点
                 if (formulaNode.changed){
                     let curNode = formulaNode.parent;
                     while (curNode){
-                        me.innerCalc(curNode, changedArr, isTender);
+                        me.innerCalc(curNode, changedArr, tender);
                         curNode = curNode.parent;
                     };
                 };
@@ -1875,8 +1880,9 @@ class CalcProgram {
         this.calcNodesAndSave(billNodes, callback);
     };
 
-    calcAllNodesAndSave(calcType = calcAllType.catAll, callback, isTender){
-        let changedNodes = this.calcAllNodes(calcType, isTender);
+    // tender: null:不调价(普通计算)。 1: 正向调价   2:反向调价-调子目    3: 反向调价-调工料机
+    calcAllNodesAndSave(calcType = calcAllType.catAll, callback, tender){
+        let changedNodes = this.calcAllNodes(calcType, tender);
         this.saveNodes(changedNodes, callback);
     };
 
@@ -1925,6 +1931,29 @@ class CalcProgram {
         };
         projectObj.project.property.tenderSetting.gljPriceTenderCoe = 1;
     };
+
+    // 反向调价
+    calcTenderReverse(treeNode){
+        treeNode.data.feesIndex.common.tenderUnitFee = treeNode.data.feesIndex.common.unitFee;
+
+        if (treeNode.data.targetTotalFee){
+
+        }
+        else{
+            if (treeNode.data.targetUnitFee){
+                treeNode.data.targetTotalFee = treeNode.data.targetUnitFee * treeNode.data.quantity;
+            }
+            else{
+                return;
+            }
+        };
+
+        treeNode.data.rationQuantityCoe = treeNode.data.targetTotalFee / treeNode.data.feesIndex.common.totalFee;
+        treeNode.data.tenderQuantity = treeNode.data.quantity * treeNode.data.rationQuantityCoe;
+        treeNode.data.feesIndex.common.tenderTotalFee = treeNode.data.tenderQuantity * treeNode.data.feesIndex.common.tenderUnitFee;
+
+        treeNode.changed = true;
+    };
 };
 
 // export default analyzer;

+ 7 - 0
web/building_saas/main/js/models/main_consts.js

@@ -114,6 +114,13 @@ const treeNodeCalcType = {
     ctNull: 6
     // ctCommonUnitFee: 6       // 树结点的手工输入综合单价的方式已废弃,现综合单价只读,引入市场单价。
 };
+
+const tenderTypes = {
+  ttCalc: 1,                // 正向调价
+  ttReverseRation: 2,       // 反向调价-调子目
+  ttReverseGLJ: 3          // 反向调价-调工料机
+};
+
 const calcAllType = {
     catAll: 'all',
     catBills: 'bills',

+ 6 - 8
web/building_saas/main/js/views/tender_price_view.js

@@ -375,14 +375,12 @@ $(function () {
     });
 
     $('#tenderPrice').on('click', function () {
-        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, null, true);
-        tender_obj.showTenderData();
+        let callback = function () {tender_obj.showTenderData()};
+        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttCalc);
     });
 
-    // $('#cleanTender').on('click', function () {
-    //     projectObj.project.calcProgram.clearTenders();
-    //     tender_obj.initPageContent();
-    //     tender_obj.showTenderData();
-    // });
-
+    $('#tenderRationQuantity').on('click', function () {
+        let callback = function () {tender_obj.showTenderData()};
+        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, callback, tenderTypes.ttReverseRation);
+    });
 });