Bläddra i källkod

1. 导入计价文件相关
2. 公式计算相关
3. 部分合同支付代码

MaiXinRong 7 månader sedan
förälder
incheckning
3cf2ff58cb

+ 9 - 4
app/controller/pay_controller.js

@@ -118,14 +118,15 @@ module.exports = app => {
                         responseData.data = await this.ctx.service.phasePayDetail.addDetailNode(ctx.phasePay, data.postData.id, data.postData.count || 1);
                         break;
                     case 'delete':
-                        await this.ctx.service.phasePayDetail.delete(ctx.phasePay.id, data.postData.id, data.postData.count || 1);
+                        await this.ctx.service.phasePayDetail.deleteDetailNode(ctx.phasePay, data.postData.id, data.postData.count || 1);
                         await this.ctx.service.phasePayDetail.calculateSave(ctx.phasePay);
                         responseData.data.reload = await this.ctx.service.phasePayDetail.getDetailData(ctx.phasePay);
+                        break;
                     case 'up-move':
-                        responseData.data = await this.ctx.service.phasePayDetail.upMoveNode(ctx.phasePay.id, data.postData.id, data.postData.count || 1);
+                        responseData.data = await this.ctx.service.phasePayDetail.upMoveDetailNode(ctx.phasePay, data.postData.id, data.postData.count || 1);
                         break;
                     case 'down-move':
-                        responseData.data = await this.ctx.service.phasePayDetail.downMoveNode(ctx.phasePay.id, data.postData.id, data.postData.count || 1);
+                        responseData.data = await this.ctx.service.phasePayDetail.downMoveDetailNode(ctx.phasePay, data.postData.id, data.postData.count || 1);
                         break;
                     case 'update':
                         await this.ctx.service.phasePayDetail.updateCalc(ctx.phasePay, data.postData);
@@ -134,13 +135,17 @@ module.exports = app => {
                     case 'calc':
                         await this.ctx.service.phasePayDetail.calculateSave(ctx.phasePay);
                         responseData.data.reload = await this.ctx.service.phasePayDetail.getDetailData(ctx.phasePay);
+                        break;
                     case 'refreshBase':
-                        await this.ctx.service.phasePay.refreshCalcBase()
+                        await this.ctx.service.phasePay.refreshCalcBase();
+                        responseData.data.reload = await this.ctx.service.phasePayDetail.getDetailData(ctx.phasePay);
+                        break;
                     default:
                         throw '未知操作';
                 }
                 ctx.body = responseData;
             } catch (err) {
+                console.log(err);
                 this.log(err);
                 ctx.body = this.ajaxErrorBody(err, '数据错误');
             }

+ 1 - 2
app/lib/ybp_tree.js

@@ -41,7 +41,7 @@ class YbpTree {
 
         if (!recursive) return;
         for (const c of children) {
-            this.sortChildren(c.children);
+            this.sortChildren(c.children, recursive);
         }
     }
     sort() {
@@ -69,7 +69,6 @@ class YbpTree {
                 if (!parent) {
                     parent = datas.find(x => { return x[setting.id] === d[setting.pid]; });
                     if (!parent) {
-                        // console.log(d[setting.pid]);
                         return null;
                     }
                     parent = _loadData(parent);

+ 9 - 9
app/public/js/change_revise.js

@@ -751,7 +751,7 @@ $(document).ready(() => {
                             }
                         } else {
                             try {
-                                data[col.field] = math.evaluate(transExpr(text));
+                                data[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                                 if (exprInfo) {
                                     data[exprInfo.expr] = newValue;
                                 }
@@ -887,7 +887,7 @@ $(document).ready(() => {
                             data[colSetting.field] = num;
                         } else {
                             try {
-                                data[colSetting.field] = math.evaluate(transExpr(value));
+                                data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     data[exprInfo.expr] = value;
@@ -988,7 +988,7 @@ $(document).ready(() => {
                                 data[colSetting.field] = num;
                             } else {
                                 try {
-                                    data[colSetting.field] = math.evaluate(transExpr(value));
+                                    data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 } catch (err) {
                                     toastMessageUniq(hint.invalidExpr);
                                     continue;
@@ -1267,7 +1267,7 @@ $(document).ready(() => {
                     }
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) {
                             data[exprInfo.expr] = newValue;
                         }
@@ -1942,7 +1942,7 @@ $(document).ready(() => {
                         }
                     } else {
                         try {
-                            data.postData[col.field] = math.evaluate(transExpr(newText));
+                            data.postData[col.field] = ZhCalc.mathCalcExpr(transExpr(newText));
                             if (exprInfo) {
                                 data.postData[exprInfo.expr] = newText;
                             }
@@ -1958,7 +1958,7 @@ $(document).ready(() => {
 
                     if (newText) {
                         try {
-                            data.postData[exprInfo.qty] = math.evaluate(transExpr(newText));
+                            data.postData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(newText));
                             data.postData[exprInfo.expr] = newText;
                         } catch(err) {
                             toastr.error('输入的表达式非法');
@@ -2169,7 +2169,7 @@ $(document).ready(() => {
                             posData[colSetting.field] = num;
                         } else {
                             try {
-                                posData[colSetting.field] = math.evaluate(transExpr(posData[colSetting.field]));
+                                posData[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(posData[colSetting.field]));
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
@@ -2187,7 +2187,7 @@ $(document).ready(() => {
                             const exprInfo = getExprInfo(colSetting.field, true);
                             posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
                             if (posData[exprInfo.expr] || !posData[exprInfo.qty]) {
-                                posData[exprInfo.qty] = math.evaluate(transExpr(posData[exprInfo.expr]));
+                                posData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(posData[exprInfo.expr]));
                             }
                             bPaste = true;
                         } catch (err) {
@@ -2264,7 +2264,7 @@ $(document).ready(() => {
                     if (exprInfo) data[exprInfo.expr] = '';
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) data[exprInfo.expr] = newValue;
                     } catch (err) {
                         toastr.error('输入的表达式非法');

+ 14 - 12
app/public/js/ledger.js

@@ -6,6 +6,7 @@
  * @version
  */
 
+
 const ckBillsSpread = window.location.pathname + '-billsSelect';
 function checkTzMeasureType () {
     return tender.measure_type === measureType.tz.value;
@@ -590,7 +591,7 @@ $(document).ready(function() {
                             data[col.field] = num;
                         } else {
                             try {
-                                data[col.field] = math.evaluate(transExpr(newValue));
+                                data[col.field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                                 if (exprInfo) {
                                     data[exprInfo.expr] = newValue;
                                 }
@@ -666,7 +667,7 @@ $(document).ready(function() {
                                     bPaste = true;
                                 } else {
                                     try {
-                                        data[colSetting.field] = math.evaluate(transExpr(value));
+                                        data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                         bPaste = true;
                                     } catch(err) {
                                         delete data[colSetting.field];
@@ -772,7 +773,7 @@ $(document).ready(function() {
                             bPaste = true;
                         } else {
                             try {
-                                data[colSetting.field] = math.evaluate(transExpr(value));
+                                data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     data[exprInfo.expr] = value;
@@ -1223,7 +1224,7 @@ $(document).ready(function() {
                     }
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) {
                             data[exprInfo.expr] = newValue;
                         }
@@ -2035,7 +2036,7 @@ $(document).ready(function() {
                         }
                     } else {
                         try {
-                            data.updateData[col.field] = math.evaluate(transExpr(newText));
+                            data.updateData[col.field] = ZhCalc.mathCalcExpr(transExpr(newText));
                             if (exprInfo) {
                                 data.updateData[exprInfo.expr] = newText;
                             }
@@ -2051,7 +2052,7 @@ $(document).ready(function() {
 
                     if (newText) {
                         try {
-                            data.updateData[exprInfo.qty] = math.evaluate(transExpr(newText));
+                            data.updateData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(newText));
                             data.updateData[exprInfo.expr] = newText;
                         } catch(err) {
                             toastr.error('输入的表达式非法');
@@ -2243,7 +2244,7 @@ $(document).ready(function() {
                                 bPaste = true;
                             } else {
                                 try {
-                                    posData[colSetting.field] = math.evaluate(transExpr(posData[colSetting.field]));
+                                    posData[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(posData[colSetting.field]));
                                     const exprInfo = getExprInfo(colSetting.field);
                                     if (exprInfo) {
                                         posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
@@ -2260,7 +2261,7 @@ $(document).ready(function() {
                                 const exprInfo = getExprInfo(colSetting.field, true);
                                 posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
                                 if (posData[exprInfo.expr] || !posData[exprInfo.qty]) {
-                                    posData[exprInfo.qty] = math.evaluate(transExpr(posData[exprInfo.expr]));
+                                    posData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(posData[exprInfo.expr]));
                                 }
                                 bPaste = true;
                             } catch (err) {
@@ -2338,7 +2339,7 @@ $(document).ready(function() {
                     }
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) {
                             data[exprInfo.expr] = newValue;
                         }
@@ -2572,7 +2573,7 @@ $(document).ready(function() {
                 } else if (col.field === 'expr') {
                     try {
                         updateData.expr = newText;
-                        updateData.quantity = math.evaluate(transExpr(newText));
+                        updateData.quantity = ZhCalc.mathCalcExpr(transExpr(newText));
                     } catch(err) {
                         toastr.error('输入的计算式非法');
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -2598,7 +2599,7 @@ $(document).ready(function() {
                 } else if (col.field === 'expr') {
                     try {
                         addData.expr = newText;
-                        addData.quantity = math.evaluate(transExpr(newText));
+                        addData.quantity = ZhCalc.mathCalcExpr(transExpr(newText));
                     } catch(err) {
                         toastr.error('输入的计算式非法');
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -2689,7 +2690,7 @@ $(document).ready(function() {
                     if (col.field === 'expr') {
                         try {
                             targetData.expr = trimInvalidChar(value);
-                            targetData.quantity = math.evaluate(transExpr(targetData.expr));
+                            targetData.quantity = ZhCalc.mathCalcExpr(transExpr(targetData.expr));
                         } catch(err) {
                             toastMessageUniq(hint.expr);
                             targetData.expr = '';
@@ -5002,6 +5003,7 @@ $(document).ready(function() {
                     return true;
                 },
                 callback: async function (subjects) {
+                    // console.log(await dsk.loadBills(subjects[0].compilationId, subjects[0].subjectId));
                     postData('ledger/dsk', {subjects}, function (result) {
                         ledgerTree.loadDatas(result.bills);
                         treeCalc.calculateAll(ledgerTree);

+ 2 - 2
app/public/js/payment_safe.js

@@ -345,7 +345,7 @@ $(document).ready(function() {
                         data[col.field] = num;
                     } else {
                         try {
-                            data[col.field] = math.evaluate(transExpr(text));
+                            data[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                         } catch(err) {
                             toastr.error('输入的表达式非法');
                             SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -474,7 +474,7 @@ $(document).ready(function() {
                             data[colSetting.field] = num;
                         } else {
                             try {
-                                data[colSetting.field] = math.evaluate(transExpr(value));
+                                data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 bPaste = true;
                             } catch (err) {
                                 toastMessageUniq(hint.invalidExpr);

+ 11 - 6
app/public/js/phase_pay_detail.js

@@ -1,5 +1,9 @@
 'use strict';
 
+math.config({
+    number: 'BigNumber',
+});
+
 $(document).ready(() => {
     const payUtils = {
         tips: {
@@ -141,7 +145,7 @@ $(document).ready(() => {
                     }
                 }
                 try {
-                    const value = math.evaluate(formula);
+                    const value = parseFloat(math.evaluate(formula));
                     return value;
                 } catch(err) {
                     return 0;
@@ -202,7 +206,7 @@ $(document).ready(() => {
                 const delValid = !payUtils.check.isFixed(select) && !payUtils.check.isStarted(select);
                 setObjEnable($('a[name=base-opr][type=del]'), !readOnly && select && delValid);
                 setObjEnable($('a[name=base-opr][type=up-move]'), !readOnly && select && !payUtils.check.isFixed(select) && preNode);
-                setObjEnable($('a[name=base-opr][type=down-move]'), !readOnly && select && !payUtils.check.isFixed(select) && !this.payTree.isLastSibling(select));
+                setObjEnable($('a[name=base-opr][type=down-move]'), !readOnly && select && !payUtils.check.isFixed(select) && !payTree.isLastSibling(select));
             },
             loadExprToInput: function() {
                 const sel = sheet.getSelections()[0];
@@ -367,16 +371,17 @@ $(document).ready(() => {
                 payEvent.loadExprToInput();
             },
             baseOpr: function(type) {
+                const self = this;
                 const node = SpreadJsObj.getSelectObject(sheet);
 
-                if (type === 'del') {
-                    postData('update', {postType: 'del', postData: { id: node.tree_id }}, function(result) {
+                if (type === 'delete') {
+                    postData('update', { postType: 'delete', postData: { id: node.tree_id }}, function(result) {
                         payEvent.reloadPays(result.reload);
                     });
                 } else {
                     postData('update', { postType: type, postData: { id: node.tree_id }}, function (result) {
                         const refreshData = payTree.loadPostData(result);
-                        payEvent.refreshTree(sheet, refreshData);
+                        payEvent.refreshTree(refreshData);
                         const sel = sheet.getSelections()[0];
                         if (sel) {
                             if (['up-move', 'down-move'].indexOf(type) > -1) {
@@ -387,7 +392,7 @@ $(document).ready(() => {
                                 SpreadJsObj.reloadRowsBackColor(sheet, [sel.row, payTree.getNodeIndex(refreshData.create[0])]);
                             }
                         }
-                        self.refreshOperationValid(sheet);
+                        self.refreshActn(sheet);
                     });
                 }
             },

+ 9 - 9
app/public/js/revise.js

@@ -585,7 +585,7 @@ $(document).ready(() => {
                             }
                         } else {
                             try {
-                                data[col.field] = math.evaluate(transExpr(text));
+                                data[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                                 if (exprInfo) {
                                     data[exprInfo.expr] = newValue;
                                 }
@@ -711,7 +711,7 @@ $(document).ready(() => {
                             data[colSetting.field] = num;
                         } else {
                             try {
-                                data[colSetting.field] = math.evaluate(transExpr(value));
+                                data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     data[exprInfo.expr] = value;
@@ -800,7 +800,7 @@ $(document).ready(() => {
                                 data[colSetting.field] = num;
                             } else {
                                 try {
-                                    data[colSetting.field] = math.evaluate(transExpr(value));
+                                    data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 } catch (err) {
                                     toastMessageUniq(hint.invalidExpr);
                                     continue;
@@ -1098,7 +1098,7 @@ $(document).ready(() => {
                     }
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) {
                             data[exprInfo.expr] = newValue;
                         }
@@ -1748,7 +1748,7 @@ $(document).ready(() => {
                     }
                 } else {
                     try {
-                        data.postData[col.field] = math.evaluate(transExpr(newText));
+                        data.postData[col.field] = ZhCalc.mathCalcExpr(transExpr(newText));
                         if (exprInfo) {
                             data.postData[exprInfo.expr] = newText;
                         }
@@ -1764,7 +1764,7 @@ $(document).ready(() => {
 
                 if (newText) {
                     try {
-                        data.postData[exprInfo.qty] = math.evaluate(transExpr(newText));
+                        data.postData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(newText));
                         data.postData[exprInfo.expr] = newText;
                     } catch(err) {
                         toastr.error('输入的表达式非法');
@@ -1963,7 +1963,7 @@ $(document).ready(() => {
                             posData[colSetting.field] = num;
                         } else {
                             try {
-                                posData[colSetting.field] = math.evaluate(transExpr(posData[colSetting.field]));
+                                posData[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(posData[colSetting.field]));
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
@@ -1978,7 +1978,7 @@ $(document).ready(() => {
                             const exprInfo = getExprInfo(colSetting.field, true);
                             posData[exprInfo.expr] = trimInvalidChar(info.sheet.getText(curRow, curCol));
                             if (posData[exprInfo.expr] || !posData[exprInfo.qty]) {
-                                posData[exprInfo.qty] = math.evaluate(transExpr(posData[exprInfo.expr]));
+                                posData[exprInfo.qty] = ZhCalc.mathCalcExpr(transExpr(posData[exprInfo.expr]));
                             }
                             bPaste = true;
                         } catch (err) {
@@ -2053,7 +2053,7 @@ $(document).ready(() => {
                     if (exprInfo) data[exprInfo.expr] = '';
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) data[exprInfo.expr] = newValue;
                     } catch (err) {
                         toastr.error('输入的表达式非法');

+ 0 - 2
app/public/js/shares/dsk.js

@@ -89,7 +89,6 @@ const dsk = (function () {
                     if (!parent) {
                         parent = datas.find(x => { return x[setting.id] === d[setting.pid]; });
                         if (!parent) {
-                            // console.log(d[setting.pid]);
                             return null;
                         }
                         parent = _loadData(parent);
@@ -189,7 +188,6 @@ const dsk = (function () {
             if (!compilation.subjectTree) {
                 for (const p of compilation.project) {
                     if (p.type === projectTypeKey.project) p.subjects = await loadProjectTree(compilation.ID, p.ID, false);
-                    console.log(p.subjects);
                 }
                 this.analysisSubjectTree(compilation);
             }

+ 1 - 1
app/public/js/shares/tree_expr_calc.js

@@ -195,7 +195,7 @@ const TreeExprCalc = (function(){
             }
         }
         if (formula.indexOf('%') >= 0) formula = formula.replace(new RegExp('%', 'gm'), '/100');
-        return [formula, math.evaluate(formula)];
+        return [formula, ZhCalc.mathCalcExpr(formula)];
     };
     const addCache = function(expr) {
         const cache = { id: expr.id };

+ 2 - 2
app/public/js/sp_progress.js

@@ -366,7 +366,7 @@ $(document).ready(() => {
                         data[col.field] = num;
                     } else {
                         try {
-                            data[col.field] = math.evaluate(transExpr(text));
+                            data[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                         } catch(err) {
                             toastr.error('输入的表达式非法');
                             SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -480,7 +480,7 @@ $(document).ready(() => {
                             data[colSetting.field] = num;
                         } else {
                             try {
-                                data[colSetting.field] = math.evaluate(transExpr(value));
+                                data[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(value));
                                 bPaste = true;
                             } catch (err) {
                                 toastMessageUniq(hint.invalidExpr);

+ 11 - 11
app/public/js/stage.js

@@ -431,7 +431,7 @@ $(document).ready(() => {
                             node[col.field] = num;
                         } else {
                             try {
-                                node[col.field] = math.evaluate(transExpr(info.editingText));
+                                node[col.field] = ZhCalc.mathCalcExpr(transExpr(info.editingText));
                             } catch(err) {
                                 toastr.error('输入的表达式非法');
                                 SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -458,7 +458,7 @@ $(document).ready(() => {
                                 sortData[curRow][col.field] = num;
                             } else {
                                 try {
-                                    sortData[curRow][col.field] = math.evaluate(transExpr(info.sheet.getText(curRow, curCol)));
+                                    sortData[curRow][col.field] = ZhCalc.mathCalcExpr(transExpr(info.sheet.getText(curRow, curCol)));
                                 } catch(err) {
                                     // toastr.error('输入的表达式非法');
                                 }
@@ -583,7 +583,7 @@ $(document).ready(() => {
         _calculateAmount() {
             for (const c of this.changes) {
                 c.bamount = _.toNumber(c.b_amount);
-                const qtyDecimal = this.findDecimal(c.unit);
+                const qtyDecimal = this.findDecimal(c.b_unit);
                 c.limitAmount = ZhCalc.mul(c.bamount, ZhCalc.div(c.delimit, 100, 2), qtyDecimal);
                 c.vamount = ZhCalc.sub(ZhCalc.sub(c.limitAmount, c.used_amount), c.stage_used_amount);
                 const uc = _.find(this.useChanges, {cid: c.cid, cbid: c.cbid, no_value: this.callData.noValue});
@@ -975,7 +975,7 @@ $(document).ready(() => {
                         newValue = num;
                     } else {
                         try {
-                            newValue = math.evaluate(transExpr(newValue));
+                            newValue = ZhCalc.mathCalcExpr(transExpr(newValue));
                         } catch(err) {
                             toastr.error('输入的表达式非法');
                             SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -1189,7 +1189,7 @@ $(document).ready(() => {
                                 filterDgn = false;
                             } else {
                                 try {
-                                    dgnData[col.field] = math.evaluate(transExpr(text));
+                                    dgnData[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                                     filterDgn = false;
                                 } catch(err) {
                                     toastMessageUniq(pasteHint.invalidExpr);
@@ -1209,7 +1209,7 @@ $(document).ready(() => {
                                         filter = false;
                                     } else {
                                         try {
-                                            data[col.field] = math.evaluate(transExpr(text));
+                                            data[col.field] = ZhCalc.mathCalcExpr(transExpr(text));
                                             if (exprInfo) data[exprInfo.expr] = text;
                                             filter = false;
                                         } catch(err) {
@@ -1500,7 +1500,7 @@ $(document).ready(() => {
                 newValue = num;
             } else {
                 try {
-                    newValue = math.evaluate(transExpr(newValue));
+                    newValue = ZhCalc.mathCalcExpr(transExpr(newValue));
                 } catch(err) {
                     toastr.error('输入的表达式非法');
                     return;
@@ -2080,7 +2080,7 @@ $(document).ready(() => {
                             }
                         } else {
                             try {
-                                data.updateData[col.field] = math.evaluate(transExpr(newText));
+                                data.updateData[col.field] = ZhCalc.mathCalcExpr(transExpr(newText));
                                 if (exprInfo) {
                                     data.updateData[exprInfo.expr] = newText;
                                 }
@@ -2205,7 +2205,7 @@ $(document).ready(() => {
                                         }
                                     } else {
                                         try {
-                                            newData[colSetting.field] = math.evaluate(transExpr(newValue));
+                                            newData[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                                             if (exprInfo) {
                                                 newData[exprInfo.expr] = newValue;
                                             }
@@ -2254,7 +2254,7 @@ $(document).ready(() => {
                                         if (exprInfo) newData[exprInfo.expr] = '';
                                     } else {
                                         try {
-                                            newData[colSetting.field] = math.evaluate(transExpr(newValue));
+                                            newData[colSetting.field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                                             const exprInfo = getExprInfo(colSetting.field);
                                             if (exprInfo) newData[exprInfo.expr] = newValue;
                                         } catch(err) {
@@ -2488,7 +2488,7 @@ $(document).ready(() => {
                     if (exprInfo) data[exprInfo.expr] = '';
                 } else {
                     try {
-                        data[field] = math.evaluate(transExpr(newValue));
+                        data[field] = ZhCalc.mathCalcExpr(transExpr(newValue));
                         if (exprInfo) data[exprInfo.expr] = newValue;
                     } catch (err) {
                         toastr.error('输入的表达式非法');

+ 1 - 1
app/public/js/stage_pay.js

@@ -102,7 +102,7 @@ $(document).ready(() => {
                     }
                 }
                 try {
-                    const value = math.evaluate(formula);
+                    const value = ZhCalc.mathCalcExpr(formula);
                     return value;
                 } catch(err) {
                     return 0;

+ 22 - 2
app/public/js/zh_calc.js

@@ -6,7 +6,11 @@
  * @date
  * @version
  */
-;const zhBaseCalc = (function () {
+
+;math.config({
+    number: 'BigNumber',
+});
+const zhBaseCalc = (function () {
     const zeroPrecision = 12, mulPrecision = 12, divPrecision = 12;
 
     function digitLength (num) {
@@ -68,6 +72,7 @@
  */
 const ZhCalc = (function () {
     Decimal.set({precision: 50, defaults: true});
+    const percentReg = /((\d+)|((\d+)(\.\d+)))%/g;
     /**
      * 加法 num1 + num2
      * @param num1
@@ -281,5 +286,20 @@ const ZhCalc = (function () {
         },
     };
 
-    return {add, sum, sub, mul, div, round, isNonZero: zhBaseCalc.isNonZero, calcExpr: ExprCalc}
+    function mathCalcExpr(expr) {
+        return parseFloat(math.evaluate(expr));
+    }
+    function tansExpr(expr) {
+        let formula = $.trim(expr).replace('\t', '').replace('=', '');
+        const percent = formula.match(percentReg);
+        if (percent) {
+            for (const p of percent) {
+                const v = math.eval(p.replace(new RegExp('%', 'gm'), '/100'));
+                formula = formula.replace(p, v);
+            }
+        }
+        return formula;
+    }
+
+    return {add, sum, sub, mul, div, round, isNonZero: zhBaseCalc.isNonZero, calcExpr: ExprCalc, mathCalcExpr}
 })();

+ 75 - 26
app/service/phase_pay_detail.js

@@ -33,6 +33,7 @@ const math = require('mathjs');
 math.config({
     number: 'BigNumber',
 });
+const validField = ['name', 'is_pause', 'is_gather', 'start_tp', 'start_expr', 'range_tp', 'range_expr', 'tp', 'expr', 'postil', 'dl_type', 'dl_value'];
 
 class PayCalculator {
     constructor (ctx, phasePay) {
@@ -315,7 +316,7 @@ class PhasePayDetail extends TreeService {
      */
     constructor(ctx, setting) {
         super(ctx, {
-            mid: 'phase_id',
+            mid: 'master_id',
             kid: 'tree_id',
             pid: 'tree_pid',
             order: 'tree_order',
@@ -328,6 +329,12 @@ class PhasePayDetail extends TreeService {
         this.tableName = 'phase_pay_detail';
     }
 
+    getMasterKey(phasePay) {
+        return phasePay.curTimes
+            ? `${phasePay.id}-${phasePay.curTimes}-${phasePay.curOrder}`
+            : `${phasePay.id}-${phasePay.audit_times}-${phasePay.audit_max_sort}`;
+    }
+
     async initPhaseDataEmpty(conn, phasePay) {
         const user_id = this.ctx.session.sessionUser.accountId;
         const insertData = [];
@@ -342,24 +349,23 @@ class PhasePayDetail extends TreeService {
 
     async initPhaseDataByPre(conn, phasePay, prePhase) {
         const preData = await this.getAllDataByCondition({
-            where: { phase_id: prePhase.id, audit_times: prePhase.audit_times, audit_order: audit_max_order },
+            where: { phase_id: prePhase.id, audit_times: prePhase.audit_times, audit_sort: audit_max_sort },
         });
         for (const pd of preData) {
             delete pd.id;
             pd.audit_times = 1;
-            pd.audit_order = 0;
+            pd.audit_sort = 0;
         }
         await conn.insert(this.tableName, preData);
     }
 
-    async initPhaseDataByAudit(conn, phasePay, newTimes, newOrder) {
-        const preData = await this.getAllDataByCondition({
-            where: { phase_id: prePhase.id, audit_times: phasePay.curTimes, audit_order: phasePay.curOrder },
-        });
+    async initPhaseDataByAudit(conn, phasePay, newTimes, newSort) {
+        const preData = await this.getDetailData(phasePay);
         for (const pd of preData) {
             delete pd.id;
+            pd.master_id = `${phasePay.id}-${newTimes}-${newSort}`;
             pd.audit_times = newTimes;
-            pd.audit_order = newOrder;
+            pd.audit_sort = newSort;
         }
         await conn.insert(this.tableName, preData);
     }
@@ -375,11 +381,7 @@ class PhasePayDetail extends TreeService {
     }
 
     async getDetailData(phasePay) {
-        if (phasePay.curTimes) {
-            return await this.getAllDataByCondition({ where: { phase_id: phasePay.id, audit_times: phasePay.curTimes, audit_sort: phasePay.curOrder } });
-        } else {
-            return await this.getAllDataByCondition({ where: { phase_id: phasePay.id, audit_times: phasePay.audit_times, audit_sort: phasePay.audit_max_order } });
-        }
+        return await this.getAllDataByCondition({ where: { master_id: this.getMasterKey(phasePay)} });
     }
     calculate(phasePay, details) {
         const payTree = new Ledger.baseTree(this.ctx, {
@@ -417,6 +419,9 @@ class PhasePayDetail extends TreeService {
         data.phase_id = phasePay.id;
         data.create_user_id = this.ctx.session.sessionUser.accountId;
         data.update_user_id = this.ctx.session.sessionUser.accountId;
+        data.audit_times = phasePay.audit_times;
+        data.audit_sort = phasePay.audit_max_sort;
+        data.master_id = this.getMasterKey(phasePay);
         if (parent) {
             data.is_minus = parent.is_minus;
         }
@@ -426,10 +431,11 @@ class PhasePayDetail extends TreeService {
         if (select.payType === payType.bqsf || select.payType === payType.bqyf) throw '不可新增子项';
         if (select.tree_level >= 2) throw '不可新增子项';
 
-        const children = await this.getChildrenByParentId(phasePay.id, select[this.setting.kid]);
-        const maxId = await this._getMaxLid(phasePay.id);
+        const masterId = this.getMasterKey(phasePay);
+        const children = await this.getChildrenByParentId(masterId, select[this.setting.kid]);
+        const maxId = await this._getMaxLid(masterId);
         const insertData = [];
-        for (let i = 0; i < count; i++) {
+        for (let i = 1; i <= count ; i++) {
             const data = {
                 tree_id: maxId + i, tree_pid: select.tree_id, tree_order: children.length + 1 + i,
                 tree_level: select.tree_level + 1, tree_is_leaf: 1
@@ -450,21 +456,22 @@ class PhasePayDetail extends TreeService {
             conn.rollback();
             throw err;
         }
-        this._cacheMaxLid(phasePay.id, maxId + 1);
+        this._cacheMaxLid(masterId, maxId + 1);
 
         // 查询应返回的结果
         const resultData = {};
-        resultData.create = await this.getNextsData(phasePay.id, data[0].tree_id, children.length);
-        if (children.length === 0) resultData.update = await this.getDataByKid(phasePay.id, select.tree_id);
+        resultData.create = await this.getNextsData(masterId, select.tree_id, children.length);
+        if (children.length === 0) resultData.update = await this.getDataByKid(masterId, select.tree_id);
         return resultData;
     }
 
     async addNext(phasePay, select, count = 1) {
+        const masterId = this.getMasterKey(phasePay);
         this.transaction = await this.db.beginTransaction();
         try {
-            if (select) await this._updateChildrenOrder(phasePay.id, select[this.setting.pid], select[this.setting.order] + 1, count);
+            if (select) await this._updateChildrenOrder(masterId, select[this.setting.pid], select[this.setting.order] + 1, count);
             const newDatas = [];
-            const maxId = await this._getMaxLid(phasePay.id);
+            const maxId = await this._getMaxLid(masterId);
             for (let i = 1; i < count + 1; i++) {
                 const newData = {};
                 newData[this.setting.kid] = maxId + i;
@@ -479,7 +486,7 @@ class PhasePayDetail extends TreeService {
                 newDatas.push(newData);
             }
             const insertResult = await this.transaction.insert(this.tableName, newDatas);
-            this._cacheMaxLid(phasePay.id, maxId + count);
+            this._cacheMaxLid(masterId, maxId + count);
 
             if (insertResult.affectedRows !== count) throw '新增节点数据错误';
             await this.transaction.commit();
@@ -491,11 +498,11 @@ class PhasePayDetail extends TreeService {
         }
 
         if (select) {
-            const createData = await this.getChildBetween(phasePay.id, select[this.setting.pid], select[this.setting.order], select[this.setting.order] + count + 1);
-            const updateData = await this.getNextsData(phasePay.id, select[this.setting.pid], select[this.setting.order] + count);
+            const createData = await this.getChildBetween(masterId, select[this.setting.pid], select[this.setting.order], select[this.setting.order] + count + 1);
+            const updateData = await this.getNextsData(masterId, select[this.setting.pid], select[this.setting.order] + count);
             return {create: createData, update: updateData};
         } else {
-            const createData = await this.getChildBetween(phasePay.id, -1, 0, count + 1);
+            const createData = await this.getChildBetween(masterId, -1, 0, count + 1);
             return {create: createData};
         }
     }
@@ -503,7 +510,7 @@ class PhasePayDetail extends TreeService {
     async addDetailNode(phasePay, targetId, count = 1) {
         if (!phasePay) return null;
 
-        const select = targetId ? await this.getDataByKid(phasePay.id, targetId) : null;
+        const select = targetId ? await this.getDataByKid(this.getMasterKey(phasePay), targetId) : null;
         if (targetId && !select) throw '新增节点数据错误';
 
         if (select[this.setting.level] === 1) {
@@ -512,6 +519,48 @@ class PhasePayDetail extends TreeService {
             return await this.addNext(phasePay, select, count);
         }
     }
+
+    async upMoveDetailNode(phasePay, targetId, count = 1) {
+        const masterId = this.getMasterKey(phasePay);
+        await this.upMoveNode(masterId, targetId, count);
+    }
+
+    async downMoveDetailNode(phasePay, targetId, count = 1) {
+        const masterId = this.getMasterKey(phasePay);
+        await this.downMoveNode(masterId, targetId, count);
+    }
+
+    async deleteDetailNode(phasePay, targetId, count = 1) {
+        const masterId = this.getMasterKey(phasePay);
+        await this.delete(masterId, targetId, count);
+    }
+
+    _filterValidField(id, data) {
+        const ud = { id };
+        for (const prop in data) {
+            if (validField.indexOf(prop) >= 0) ud[prop] = data[prop]
+        }
+        return ud;
+    }
+
+    async updateDetail(phasePay, data) {
+        const masterId = this.getMasterKey(phasePay);
+        if (Array.isArray(data)) {
+            const orgData = this.getDataByCondition({ where: { id: data.map(d => { return d.id; }) } });
+            const updateDatas = [];
+            for (const d of data) {
+                const node = orgData.find(x => { return x.id === d.id; });
+                if (!node || masterId !== node[this.setting.mid]) throw '提交数据错误';
+                updateDatas.push(this._filterValidField(node.id, d));
+            }
+            await this.db.updateRows(this.tableName, updateDatas);
+        } else {
+            const node = await this.getDataById(data.id);
+            if (!node || masterId !== node[this.setting.mid]) throw '提交数据错误';
+            const updateData = this._filterValidField(node.id, data);
+            await this.db.update(this.tableName, updateData);
+        }
+    }
 }
 
 module.exports = PhasePayDetail;

+ 2 - 0
app/view/ledger/explode.ejs

@@ -42,9 +42,11 @@
                 <div class="d-inline-block ml-3">
                     <a id="exportLedger" class="btn btn-primary btn-sm" href="javascript: void(0)">导出台账Excel</a>
                 </div>
+                <% if (tender.ledger_status === auditConst.status.uncheck ) { %>
                 <div class="d-inline-block ml-1">
                     <a href="#import-dsk" data-toggle="modal" data-target="#import-dsk" class="btn btn-sm btn-primary">导入计价文件</a>
                 </div>
+                <% } %>
                 <% if (syncLedgerUrl) { %>
                 <div class="d-inline-block ml-1">
                     <a id="sync-ledger" class="btn btn-primary btn-sm" href="javascript: void(0)">同步台账</a>

+ 1 - 1
app/view/phase_pay/detail.ejs

@@ -6,7 +6,7 @@
             <div>
                 <div class="d-inline-block">
                     <a href="javascript: void(0)" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加" name="base-opr" type="add"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                    <a href="javascript: void(0)" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除" name="base-opr" type="del"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                    <a href="javascript: void(0)" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除" name="base-opr" type="delete"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript: void(0)" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移" name="base-opr" type="down-move"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                     <a href="javascript: void(0)" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移" name="base-opr" type="up-move"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                 </div>

+ 1 - 0
config/web.js

@@ -426,6 +426,7 @@ const JsFiles = {
                 files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/math.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
+                    '/public/js/zh_calc.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/shares/cs_tools.js',

+ 22 - 0
sql/index.sql

@@ -0,0 +1,22 @@
+
+-- 执行如下sql,执行时间为1.159s,最大扫描行3.01M,但是仅返回1条数据
+-- SELECT count(*) AS count FROM `zh_change_apply` AS a WHERE a.status=? AND a.tid=? AND (a.uid=? OR a.id IN (SELECT b.caid FROM `zh_change_apply_audit` AS b WHERE b.aid=? AND a.times=b.times GROUP BY b.caid))
+-- SELECT SUM(cast(a.total_price AS decimal(?,?))) AS total_price FROM `zh_change_apply` AS a WHERE a.tid=? AND (a.uid=? OR (a.status!=? AND a.id IN (SELECT b.caid FROM `zh_change_apply_audit` AS b WHERE b.aid=? AND a.times=b.times GROUP BY b.caid)) OR a.status=?)
+-- SELECT a.*,p.name AS account_name FROM `zh_change_apply` AS a LEFT JOIN `zh_project_account` AS p ON a.notice_uid=p.id WHERE a.tid=? AND (a.uid=? OR (a.status!=? AND a.id IN (SELECT b.caid FROM `zh_change_apply_audit` AS b WHERE b.aid=? AND a.times=b.times GROUP BY b.caid)) OR a.status=?) ORDER BY a.in_time DESC LIMIT ?,?
+-- 优化方案如下:
+-- 1. 所有类似sql,都去掉a.times=b.times,这个判断实际上没有任何必要,去掉后,执行时间为169ms
+-- 2. 所有类似的audit表,均添加如下索引,预计速度提升55倍(基于阿里云分析)
+ALTER TABLE `zh_change_apply_audit` ADD INDEX `idx_aid_caid` (`aid`, `caid`);
+ALTER TABLE `zh_change_audit` ADD INDEX `idx_uid_cid` (`uid`, `cid`);
+ALTER TABLE `zh_change_project_audit` ADD INDEX `idx_aid_cpid` (`aid`, `cpid`);
+ALTER TABLE `zh_change_plan_audit` ADD INDEX `idx_aid_cpid` (`aid`, `cpid`);
+ALTER TABLE `zh_financial_pay_audit` ADD INDEX `idx_aid_fpid` (`aid`, `fpid`);
+
+-- 执行如下sql,执行时间为1.55s,最大扫描行294.76K
+-- UPDATE `zh_change_audit_list` SET  `bwmx` = CASE  WHEN  `mx_id` = '138dc057-0773-44c6-bad2-160686cf107b' THEN 'K37+808.4~K37+868.4右线S-Ⅳd'  ELSE `bwmx` END  WHERE `mx_id` IN ('138dc057-0773-44c6-bad2-160686cf107b')
+-- updateDataByRevisePos方法下生成执行
+-- 优化方案,新增mx_id索引,预计性能提升9116倍
+ALTER TABLE `calculation`.`zh_change_audit_list` ADD INDEX `idx_mxid` (`mx_id`);
+
+ALTER TABLE `calculation`.`zh_stage_rela_pos_final` ADD INDEX `idx_relatid_sid` (`rela_tid`, `sid`);
+ALTER TABLE `calculation`.`zh_stage_rela_bills_final` ADD INDEX `idx_relatid_sid` (`rela_tid`, `sid`);