Bladeren bron

树结构公式计算,定稿

MaiXinRong 1 jaar geleden
bovenliggende
commit
25e92db4cf

+ 2 - 2
app/controller/stage_controller.js

@@ -218,8 +218,8 @@ module.exports = app => {
             this.ledgerColumn = [
                 'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
                 'code', 'b_code', 'name', 'unit', 'unit_price',
-                'quantity', 'total_price', 'memo', 'drawing_code', 'node_type'];
-            if (tender.data.measure_type === measureType.gcl.value) this.ledgerColumn.push('deal_qty', 'deal_tp');
+                'quantity', 'total_price', 'deal_qty', 'deal_tp', 'memo', 'drawing_code', 'node_type'];
+            // if (tender.data.measure_type === measureType.gcl.value) this.ledgerColumn.push('deal_qty', 'deal_tp');
             if (tender.info.display.ledger.dgnQty) this.ledgerColumn.push('dgn_qty1', 'dgn_qty2');
 
             this.ledgerExtraColumn = ['is_tp'];

+ 27 - 4
app/public/js/shares/tree_expr_calc.js

@@ -18,6 +18,7 @@ const TreeExprCalc = (function(){
         valueChar: '$',
 
         calcCache: {},
+        error: { loop: '', deep: '' },
 
         // 计算必须项
         tree: null,
@@ -28,6 +29,7 @@ const TreeExprCalc = (function(){
         exprCacheKey: [],
         exprFieldsIndex: {},
         exprCacheFields: [],
+        errorMsg: true,
     };
     const getCalcField = function(value) {
         return calcRela.exprFieldsIndex[value];
@@ -43,6 +45,7 @@ const TreeExprCalc = (function(){
             calcRela.exprCacheKey = setting.exprCacheKey;
             calcRela.exprCacheFields = calcRela.exprCacheKey.map(x => { return getCalcField(x); });
         }
+        calcRela.errorMsg = setting.errorMsg || true;
     };
     const checkExprValid = function(expr, invalidOrders = []) {
         if (!expr) return [true, ''];
@@ -239,8 +242,8 @@ const TreeExprCalc = (function(){
                 }
                 calcExprId = sortIds;
             }
-            if (calcSort > 100) calcRela.warningMsg = '公式计算引用过深,请检查公式';
-            if (calcSort === 'max') calcRela.errorMsg = '公式计算存在循环引用,请检查公式';
+            if (calcSort > 100 && !calcRela.error.deep) calcRela.error.deep = x.id;
+            if (calcSort === 'max' && !calcRela.error.loop) calcRela.error.loop = x.id;
             x.calcSort = calcSort;
         });
         exprList.sort((x, y) => {
@@ -251,8 +254,25 @@ const TreeExprCalc = (function(){
     };
     const _initCache = function() {
         calcRela.calcCache = {};
-        calcRela.warningMsg = '';
-        calcRela.errorMsg = '';
+        calcRela.error.deep = '';
+        calcRela.error.loop = '';
+    };
+    const checkError = function() {
+        if (!calcRela.errorMsg) return;
+        if (calcRela.error.loop) {
+            const nodeIndex = calcRela.tree.nodes.findIndex(x => { return x.id === calcRela.error.loop; });
+            const node = calcRela.tree.nodes[nodeIndex];
+            const hintCode = (node.code || '') + (node.b_code || '');
+            toastr.warning(`第${nodeIndex + 1}行 ${hintCode} 公式存在循环计算,请检查`);
+            return;
+        }
+        if (calcRela.error.deep) {
+            const nodeIndex = calcRela.tree.nodes.findIndex(x => { return x.id === calcRela.error.deep; });
+            const node = calcRela.tree.nodes[nodeIndex];
+            const hintCode = (node.code || '') + (node.b_code || '');
+            toastr.warning(`第${nodeIndex + 1}行 ${hintCode} 公式引用层次过深,请检查`);
+            return;
+        }
     };
     const calcAllExpr = function(exprList) {
         _initCache();
@@ -261,7 +281,10 @@ const TreeExprCalc = (function(){
             [expr.formula, expr.value] = calcExpr(expr.expr);
             addCache(expr);
         }
+        checkError();
+        const result = JSON.parse(JSON.stringify(calcRela.error));
         _initCache();
+        return result;
     };
     const expr2ExprStr = function(expr) {
         if (!expr) return '';

+ 2 - 66
app/public/js/stage.js

@@ -1673,73 +1673,9 @@ $(document).ready(() => {
                     return !node || !!node.b_code;
                 }
             },
-            'remainByExpr': {
-                name: '计算本期合同计量',
-                callback: function(key, opt) {
-                    const sheet = spSpread.getActiveSheet();
-                    const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
-
-                    const [formula, value] = TreeExprCalc.calcExpr(node.calc_expr);
-                    const updateData = {lid: node.id, contract_expr: formula};
-                    if (node.is_tp) {
-                        updateData.contract_tp = value;
-                    } else {
-                        updateData.contract_qty = value;
-                    }
-
-                    postData(window.location.pathname + '/update', {bills: { stage: [updateData] }}, function (result) {
-                        const nodes = stageTree.loadPostStageData(result);
-                        stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
-                        if (detail) {
-                            detail.loadStageLedgerUpdateData(result, nodes);
-                        } else {
-                            stageIm.loadUpdateLedgerData(result, nodes);
-                        }
-                        stageTreeSpreadObj.loadExprToInput(sheet);
-                    });
-                },
-                visible: function(key, opt) {
-                    return !readOnly;
-                },
-                disabled: function (key, opt) {
-                    const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
-                    return !node || !node.calc_expr;
-                }
-            },
-            'remainByExprAll3': {
-                name: '计算本期合同计量(全部公式项-缓存)',
-                callback: function(key, opt) {
-                    const sheet = spSpread.getActiveSheet();
-                    TreeExprCalc.setCalcType(TreeExprCalc.calcType.cache);
-
-                    const calcExpr = stageTree.nodes.filter(x => {
-                        return !!x.calc_expr;
-                    }).map(x => { return { id: x.id, expr: x.calc_expr, unit_price: x.unit_price, calcField: x.is_tp ? 'tp' : 'qty' }});
-                    TreeExprCalc.calcAllExpr(calcExpr);
-                    const updateData = calcExpr.map(x => {
-                        const data = { lid: x.id, contract_expr: x.formula };
-                        const field = x.calcField === 'qty' ? 'contract_qty' : 'contract_tp';
-                        data[field] = x.value;
-                        return data;
-                    });
-
-                    postData(window.location.pathname + '/update', {bills: { stage: updateData }}, function (result) {
-                        const nodes = stageTree.loadPostStageData(result);
-                        stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
-                        if (detail) {
-                            detail.loadStageLedgerUpdateData(result, nodes);
-                        } else {
-                            stageIm.loadUpdateLedgerData(result, nodes);
-                        }
-                        stageTreeSpreadObj.loadExprToInput(sheet);
-                    });
-                },
-                visible: function(key, opt) {
-                    return !readOnly;
-                },
-            },
             'remainByExprAll4': {
-                name: '计算本期合同计量(全部公式项-排序&缓存)',
+                name: '计算本期合同计量',
+                icon: 'fa-forward',
                 callback: function(key, opt) {
                     const sheet = spSpread.getActiveSheet();
                     TreeExprCalc.setCalcType(TreeExprCalc.calcType.sortCache);

+ 1 - 1
app/view/ledger/explode.ejs

@@ -330,7 +330,7 @@
 <script src="/public/js/moment/moment.min.js"></script>
 <script type="text/javascript">
     const readOnly = <%- ctx.tender.ledgerReadOnly %>;
-    const contractExpr = <%- ctx.session.sessionProject.page_show.openContractExpr %>;
+    const contractExpr = <%- ctx.session.sessionProject.page_show.openContractExpr && tender.ledger_status === auditConst.status.checked %>;
     const tender = JSON.parse('<%- JSON.stringify(tender) %>');
     const tenderInfo = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
     const thousandth = <%- ctx.tender.info.display.thousandth %>;

+ 7 - 7
app/view/ledger/explode_modal.ejs

@@ -439,13 +439,13 @@
                                 <h6>可用计算值</h6>
                                 <div style="width: 200px;" >
                                     <table class="table table-bordered mb-1">
-                                        <tr><th class="text-left">引用行<span id="select-row"></span></th></tr>
-                                        <tr><td class="text-center" name="sr" exprValue="tzje">台账金额</td></tr>
-                                        <tr><td class="text-center" name="sr" exprValue="qyje">签约金额</td></tr>
-                                        <tr><td class="text-center" name="sr" exprValue="bqhtje">本期合同金额</td></tr>
-                                        <tr><th class="text-left">设置行<span id="target-row"></span></th></tr>
-                                        <tr><td class="text-center" name="tr" exprValue="tzje">台账</td></tr>
-                                        <tr><td class="text-center" name="tr" exprValue="qyje">签约</td></tr>
+                                        <tr><th class="text-left" colspan="2">引用行<span id="select-row"></span></th></tr>
+                                        <tr><td class="text-center" colspan="2" name="sr" exprValue="tzje">台账金额</td></tr>
+                                        <tr><td class="text-center" colspan="2" name="sr" exprValue="qyje">签约金额</td></tr>
+                                        <tr><td class="text-center" colspan="2" name="sr" exprValue="bqhtje">本期合同金额</td></tr>
+                                        <tr><th class="text-left" colspan="2">设置行<span id="target-row"></span></th></tr>
+                                        <tr><td class="text-center" name="tr" exprValue="tzsl">台账数量</td><td class="text-center" name="tr" exprValue="tzje">台账金额</td></tr>
+                                        <tr><td class="text-center" name="tr" exprValue="qysl">签约数量</td><td class="text-center" name="tr" exprValue="qyje">签约金额</td></tr>
                                     </table>
                                 </div>
                                 <div class="text-danger mb-3">点击添加对应行值到公式框</div>