Explorar o código

wip: 概算汇总,计算相关

vian %!s(int64=4) %!d(string=hai) anos
pai
achega
f99ba60d79

+ 46 - 2
web/building_saas/budget-summary/js/budgetSummarySheet.js

@@ -78,6 +78,27 @@ const budgetSummaryObj = (() => {
     await ajaxPost('/bills/bulkOperation', { bulkData });
   };
 
+  // 计算节点
+  const calcNodes = async (sheet, nodes) => {
+    try {
+      $.bootstrapLoading.start();
+      debugger;
+      const changedNodes = projectObj.project.calcProgram.calcNodes(nodes, false);
+      const dataArr = [];
+      for (const node of changedNodes) {
+        if (node.changed) {
+          const data = calcTools.cutNodeForSave(node);
+          dataArr.push(data);
+        }
+      }
+      console.log(dataArr);
+    } catch (err) {
+      alert(err);
+    } finally {
+      $.bootstrapLoading.end();
+    }
+  }
+
   // 编辑相关
   const edit = async (sheet, changedCells) => {
     if (!changedCells.length) {
@@ -92,7 +113,8 @@ const budgetSummaryObj = (() => {
     if (!isValid) {
       recover(sheet, changedCells);
     }
-    console.log(changedCells);
+    let needCalc = false;
+    const nodes = [];
     try {
       $.bootstrapLoading.start();
       const IDMap = {};
@@ -102,9 +124,24 @@ const budgetSummaryObj = (() => {
         if (!node) {
           return;
         }
+        if (!nodes.find(n => n.data.ID !== node.data.ID)) {
+          nodes.push(node);
+        }
         const field = getFieldByCol(col);
+        const value = sheet.getValue(row, col) || '';
+        if (field === 'calcBase') {
+          debugger;
+          node.data.userCalcBase = value;
+          projectObj.project.calcBase.calculate(node, null, false);
+          if (!projectObj.project.calcBase.success) {
+            throw projectObj.project.calcBase.errMsg;
+          }
+        }
         const data = (IDMap[node.data.ID] || (IDMap[node.data.ID] = {}));
-        data[field] = sheet.getValue(row, col);
+        data[field] = value;
+        if (['quantity', 'feesIndex.common.unitFee', 'calcBase', 'feeRate'].includes(field)) {
+          needCalc = true;
+        }
       });
       Object
         .entries(IDMap)
@@ -116,7 +153,12 @@ const budgetSummaryObj = (() => {
         const node = tree.findNode(item.data.ID);
         Object.assign(node.data, item.data);
       });
+      // 重算节点
+      /* if (needCalc && nodes.length) {
+        await calcNodes(sheet, nodes);
+      } */
     } catch (err) {
+      recover(sheet, changedCells);
       alert(err);
     } finally {
       $.bootstrapLoading.end();
@@ -685,7 +727,9 @@ const budgetSummaryObj = (() => {
   // 对外暴露
   return {
     getTree: () => tree,
+    getSheet: () => spread.getSheet(0),
     calcSetting,
+    edit,
   };
 
 })();

+ 13 - 5
web/building_saas/main/js/models/calc_base.js

@@ -1491,10 +1491,16 @@ let cbAnalyzer = {
         if (!this.arithmeticLegal(exp)) {
             throw '表达式含有无效字符';
         }
-        if (!this.baseLegal(cbTools.getFigure(node), exp)) {
-            throw '清单基数不合法';
+        if (node.tree === projectObj.project.mainTree) {
+            if (!this.baseLegal(cbTools.getFigure(node), exp)) {
+                throw '清单基数不合法';
+            }
+        } else if (node.tree === budgetSummaryObj.getTree()) {
+            if (!this.baseLegal(cbTools.getValidFigures(node), exp)) {
+                throw '清单基数不合法';
+            }
         }
-        if (!this.fLegal(calcBase.project.mainTree.items, exp)) {
+        if (!this.fLegal(node.tree.items, exp)) {
             throw '行引用不合法';
         }
         //转换成ID引用
@@ -1828,7 +1834,7 @@ let calcBase = {
     getBaseBill: function (node) {
         return cbTools.getBaseBill(node);
     },
-    calculate: function (node, reCalc = null) {
+    calculate: function (node, reCalc = null, alert = true) {
         let me = calcBase,
             $CBA = cbAnalyzer,
             $CBP = cbParser,
@@ -1876,7 +1882,9 @@ let calcBase = {
             if (node) {
                 err = `第${node.serialNo() + 1}行${err}`;
             }
-            alert(err);
+            if (alert) {
+                alert(err);
+            }
         }
     }
 };

+ 12 - 1
web/building_saas/main/js/views/calc_base_view.js

@@ -120,7 +120,7 @@ let calcBaseView = {
                 return;
             }
             let baseFigure = '';
-            if (me.curType == me.type.bills)
+            if (me.curType == me.type.bills || me.curType === 'budget')
                 baseFigure = `{${v}}`
             else if (me.curType == me.type.ration)
                 baseFigure = `[${v}]`;
@@ -329,6 +329,17 @@ let calcBaseView = {
                     //$('#qd-jsjs').modal('hide');
                     $('#calcBaseFeeRate').modal('hide');
                 }
+            } else if (me.curType === 'budget') {
+                const budgetSheet = budgetSummaryObj.getSheet();
+                const budgetTree = budgetSummaryObj.getTree();
+                const row = budgetTree.selected.serialNo();
+                const col = budgetSummaryTreeSetting.cols.findIndex(item => item.data.field === 'calcBase')
+                const changedCells = [{ row, col }];
+                budgetSheet.setValue(row, col, me.getInputExpr());
+                budgetSummaryObj.edit(budgetSheet, changedCells);
+                if (projectObj.project.calcBase.success || selected.data.calcBase === me.getInputExpr()) {
+                    $('#calcBaseFeeRate').modal('hide');
+                }
             }
             else if (me.curType === me.type.ration) {
                 let expr = me.inputExpr.val();