Browse Source

计量台账,检查错误功能

MaiXinRong 4 years ago
parent
commit
950a1db283

+ 1 - 1
app/controller/tender_controller.js

@@ -85,7 +85,7 @@ module.exports = app => {
 
                     if (t.ledger_status === auditConst.ledger.status.checked) {
                         t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, true);
-                        if (t.lastStage.status === auditConst.stage.status.uncheck &&
+                        if (t.lastStage && t.lastStage.status === auditConst.stage.status.uncheck &&
                             t.lastStage.user_id !== this.ctx.session.sessionUser.accountId) {
                             t.lastStage = await this.ctx.service.stage.getLastestStage(t.id);
                         }

+ 20 - 1
app/public/js/ledger.js

@@ -2947,8 +2947,27 @@ $(document).ready(function() {
     LedgerChecker({
         ledgerTree: ledgerTree,
         ledgerPos: pos,
-        decimal: tenderInfo.decimal,
         checkList: checkList,
+        decimal: tenderInfo.decimal,
+        checkOption: {
+            sibling: { enable: 1 },
+            empty_code: { enable: 1 },
+            calc: {
+                enable: 1,
+                fields: ['sgfh_qty', 'qtcl_qty', 'sjcl_qty', 'quantity'],
+            },
+            zero: { enable: 1 },
+            tp: {
+                enable: 1,
+                fields: [
+                    {qty: 'sgfh_qty', tp: 'sgfh_tp'},
+                    {qty: 'sjcl_qty', tp: 'sjcl_tp'},
+                    {qty: 'qtcl_qty', tp: 'qtcl_tp'},
+                    {qty: 'quantity', tp: 'total_price'},
+                    {qty: 'deal_qty', tp: 'deal_tp'},
+                ],
+            },
+        }
     });
 });
 

+ 20 - 1
app/public/js/revise.js

@@ -2527,8 +2527,27 @@ $(document).ready(() => {
     LedgerChecker({
         ledgerTree: billsTree,
         ledgerPos: pos,
-        decimal: decimal,
         checkList: checkList,
+        decimal: decimal,
+        checkOption: {
+            sibling: { enable: 1 },
+            empty_code: { enable: 1 },
+            calc: {
+                enable: 1,
+                fields: ['sgfh_qty', 'qtcl_qty', 'sjcl_qty', 'quantity'],
+            },
+            zero: { enable: 1 },
+            tp: {
+                enable: 1,
+                fields: [
+                    {qty: 'sgfh_qty', tp: 'sgfh_tp'},
+                    {qty: 'sjcl_qty', tp: 'sjcl_tp'},
+                    {qty: 'qtcl_qty', tp: 'qtcl_tp'},
+                    {qty: 'quantity', tp: 'total_price'},
+                    {qty: 'deal_qty', tp: 'deal_tp'},
+                ],
+            },
+        }
     });
 
     $('[name=revise-start]').submit(function (e) {

+ 52 - 0
app/public/js/stage.js

@@ -593,6 +593,22 @@ $(document).ready(() => {
         },
     });
 
+    const checkList = $.ledger_checkList({
+        id: 'check-list',
+        tabSelector: '#check-list-tab',
+        selector: '#check-list',
+        relaSpread: slSpread,
+        storeKey: 'stage-check-' + window.location.pathname.split('/')[2] + '-' + window.location.pathname.split('/')[4],
+        checkType: ledgerCheckType,
+        afterLocated:  function () {
+            stagePosSpreadObj.loadCurPosData();
+        },
+        afterShow: function () {
+            slSpread.refresh();
+            if (spSpread) spSpread.refresh();
+        },
+    });
+
     const stageTreeSpreadObj = {
         loadExprToInput(sheet) {
             const sel = sheet.getSelections()[0];
@@ -1577,6 +1593,7 @@ $(document).ready(() => {
         stageIm.init(stage, imType, tenderInfo.decimal);
         stageIm.loadData(result.ledgerData, result.posData, result.detailData, result.changeData);
         errorList.loadHisErrorData();
+        checkList.loadHisCheckData();
     }, null, true);
     spSpread.bind(spreadNS.Events.EditEnded, stagePosSpreadObj.editEnded);
     spSpread.bind(spreadNS.Events.ClipboardPasting, stagePosSpreadObj.clipboardPasting);
@@ -1714,6 +1731,9 @@ $(document).ready(() => {
             if (errorList && errorList.spread) {
                 errorList.spread.refresh();
             }
+            if (checkList) {
+                checkList.spread.refresh();
+            }
         }
     });
 
@@ -1896,6 +1916,9 @@ $(document).ready(() => {
             if (errorList && errorList.spread) {
                 errorList.spread.refresh();
             }
+            if (checkList) {
+                checkList.spread.refresh();
+            }
             window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
         }
     });
@@ -3043,6 +3066,9 @@ $(document).ready(() => {
             if (tab.attr('content') === '#error-list') {
                 errorList.spread.refresh();
             }
+            if (tab.attr('content') === '#check-list') {
+                checkList.spread.refresh();
+            }
         } else {
             tab.removeClass('active');
             tabPanel.removeClass('active');
@@ -3331,6 +3357,32 @@ $(document).ready(() => {
         });
     })('a[name=showLevel]', slSpread.getActiveSheet());
 
+    LedgerChecker({
+        ledgerTree: stageTree,
+        ledgerPos: stagePos,
+        checkList: checkList,
+        decimal: tenderInfo.decimal,
+        checkOption: {
+            sibling: { enable: 0 },
+            empty_code: { enable: 0 },
+            calc: {
+                enable: 1,
+                fields: ['contract_qty', 'qc_qty'],
+            },
+            zero: { enable: 0 },
+            tp: {
+                enable: 1,
+                fields: [
+                    {qty: 'contract_qty', tp: 'contract_tp'},
+                    {qty: 'qc_qty', tp: 'qc_tp'},
+                ],
+                filter: function (node) {
+                    return node.is_tp;
+                }
+            },
+        }
+    });
+
     const dataChecker = DataChecker({
         checkUrl: window.location.pathname + '/check',
         completeData: function (data) {

+ 52 - 37
app/view/shares/ledger_check_modal.ejs

@@ -60,20 +60,34 @@
     };
     const LedgerChecker = function (setting) {
         const ledger = setting.ledgerTree, ledgerPos = setting.ledgerPos, decimal = setting.decimal;
+        const checkOption = setting.checkOption;
+
+        const showCheckPart = function (obj, show) {
+            if (show) {
+                obj.show();
+            } else {
+                obj.hide();
+            }
+        }
 
         const initWaitingModal = function () {
             $('.card', '#ledger-check-modal').removeClass('border-success');
             $('[name=check-status]', '#ledger-check-modal').removeClass('text-success').addClass('text-muted').html('待检查');
+            showCheckPart($('#check-sibling'), checkOption.sibling.enable);
+            showCheckPart($('#check-empty-code'), checkOption.empty_code.enable);
+            showCheckPart($('#check-calc'), checkOption.calc.enable);
+            showCheckPart($('#check-zero'), checkOption.zero.enable);
+            showCheckPart($('#check-tp'), checkOption.tp.enable);
             $('#ledger-check-begin').show();
             $('#ledger-check-waiting').hide();
             $('#ledger-check-hint').removeClass('text-warning').addClass('text-success').html('检查完成,现在您可以查看结果。').hide();
             $('#ledger-check-show').hide();
         }
 
-        const doSomeCheck = function (selector, checkFun) {
+        const doSomeCheck = function (selector, checkFun, option) {
             const checkStatus = $('[name=check-status]', selector);
             checkStatus.html('<i class="fa fa-spinner fa-spin"></i>');
-            const result = checkFun(ledger);
+            const result = checkFun(ledger, option);
             checkStatus.removeClass('text-muted').addClass('text-success').html('<i class="fa fa-check"></i>');
             $(selector).addClass('border-success');
             return result;
@@ -110,7 +124,7 @@
                 }
                 return error;
             },
-            checkCalc: function (ledgerTree) {
+            checkCalc: function (ledgerTree, option) {
                 const error = [];
                 for (const node of ledgerTree.nodes) {
                     if (node.children && node.children.length > 0) continue;
@@ -118,19 +132,15 @@
                     const nodePos = ledgerPos.getLedgerPos(node.id);
                     if (!nodePos || nodePos.length === 0) continue;
 
-                    const checkData = {
-                        sgfh_qty: node.sgfh_qty || 0, qtcl_qty: node.qtcl_qty || 0, sjcl_qty: node.sjcl_qty || 0,
-                        quantity: node.quantity || 0
-                    };
-                    const calcData = {
-                        sgfh_qty: 0, qtcl_qty: 0, sjcl_qty: 0,
-                        quantity: 0
-                    };
+                    const checkData = {}, calcData = {};
+                    for (const f of option.fields) {
+                        checkData[f] = node[f] || 0;
+                        calcData[f] = 0;
+                    }
                     for (const np of nodePos) {
-                        calcData.sgfh_qty = ZhCalc.add(calcData.sgfh_qty, np.sgfh_qty) || 0;
-                        calcData.qtcl_qty = ZhCalc.add(calcData.qtcl_qty, np.qtcl_qty) || 0;
-                        calcData.sjcl_qty = ZhCalc.add(calcData.sjcl_qty, np.sjcl_qty) || 0;
-                        calcData.quantity = ZhCalc.add(calcData.quantity, np.quantity) || 0;
+                        for (const f of option.fields) {
+                            calcData[f] = ZhCalc.add(calcData[f], np[f]) || 0;
+                        }
                     }
                     if (!_.isMatch(checkData, calcData)) error.push(node);
                 }
@@ -148,22 +158,17 @@
                 }
                 return error;
             },
-            checkTp: function (ledgerTree) {
+            checkTp: function (ledgerTree, option) {
                 const error = [];
                 for (const node of ledgerTree.nodes) {
                     if (node.children && node.children.length > 0) continue;
+                    if (option.filter && option.filter(node)) continue;
 
-                    const checkData = {
-                        sgfh_tp: node.sgfh_tp || 0, qtcl_tp: node.qtcl_tp || 0, sjcl_tp: node.sjcl_tp || 0,
-                        total_price: node.total_price || 0, deal_tp: node.deal_tp || 0,
-                    };
-                    const calcData = {
-                        sgfh_tp: ZhCalc.mul(node.unit_price, node.sgfh_qty, decimal.tp) || 0,
-                        qtcl_tp: ZhCalc.mul(node.unit_price, node.qtcl_qty, decimal.tp) || 0,
-                        sjcl_tp: ZhCalc.mul(node.unit_price, node.sjcl_qty, decimal.tp) || 0,
-                        total_price: ZhCalc.mul(node.unit_price, node.quantity, decimal.tp) || 0,
-                        deal_tp: ZhCalc.mul(node.unit_price, node.deal_qty, decimal.tp) || 0,
-                    };
+                    const checkData = {}, calcData = {};
+                    for (const f of option.fields) {
+                        checkData[f.tp] = node[f.tp] || 0;
+                        calcData[f.tp] = ZhCalc.mul(node.unit_price, node[f.qty], decimal.tp) || 0;
+                    }
                     if (!_.isMatch(checkData, calcData)) error.push(node);
                 }
                 return error;
@@ -190,16 +195,26 @@
                 check_time: new Date(),
                 warning_data: [],
             }
-            const sibling = doSomeCheck('#check-sibling', ledgerCheckUtil.checkSibling) || [];
-            assignWarningData(sibling, ledgerCheckType.sibling.value, checkData.warning_data);
-            const empty_code = doSomeCheck('#check-empty-code', ledgerCheckUtil.checkCodeEmpty) || [];
-            assignWarningData(empty_code, ledgerCheckType.empty_code.value, checkData.warning_data);
-            const calc = doSomeCheck('#check-calc', ledgerCheckUtil.checkCalc) || [];
-            assignWarningData(calc, ledgerCheckType.calc.value, checkData.warning_data);
-            const zero = doSomeCheck('#check-zero', ledgerCheckUtil.checkZero) || [];
-            assignWarningData(zero, ledgerCheckType.zero.value, checkData.warning_data);
-            const tp = doSomeCheck('#check-tp', ledgerCheckUtil.checkTp) || [];
-            assignWarningData(tp, ledgerCheckType.tp.value, checkData.warning_data);
+            if (checkOption.sibling.enable) {
+                const sibling = doSomeCheck('#check-sibling', ledgerCheckUtil.checkSibling, checkOption.sibling) || [];
+                assignWarningData(sibling, ledgerCheckType.sibling.value, checkData.warning_data);
+            }
+            if (checkOption.empty_code.enable) {
+                const empty_code = doSomeCheck('#check-empty-code', ledgerCheckUtil.checkCodeEmpty, checkOption.empty_code) || [];
+                assignWarningData(empty_code, ledgerCheckType.empty_code.value, checkData.warning_data);
+            }
+            if (checkOption.calc.enable) {
+                const calc = doSomeCheck('#check-calc', ledgerCheckUtil.checkCalc, checkOption.calc) || [];
+                assignWarningData(calc, ledgerCheckType.calc.value, checkData.warning_data);
+            }
+            if (checkOption.zero.enable) {
+                const zero = doSomeCheck('#check-zero', ledgerCheckUtil.checkZero, checkOption.zero) || [];
+                assignWarningData(zero, ledgerCheckType.zero.value, checkData.warning_data);
+            }
+            if (checkOption.tp.enable) {
+                const tp = doSomeCheck('#check-tp', ledgerCheckUtil.checkTp, checkOption.tp) || [];
+                assignWarningData(tp, ledgerCheckType.tp.value, checkData.warning_data);
+            }
 
             $('#ledger-check-waiting').hide();
             setting.checkList.clearCheckData();

+ 7 - 0
app/view/stage/index.ejs

@@ -34,6 +34,7 @@
                 </div>
                 <div class="d-inline-block ml-3">
                     <a id="exportExcel" class="btn btn-primary btn-sm" href="javascript: void(0)">导出计量台账Excel</a>
+                    <a class="btn btn-sm btn-primary" href="#ledger-check-modal" data-toggle="modal" data-target="#ledger-check-modal">数据检查</a>
                 </div>
             </div>
             <div class="ml-auto">
@@ -532,6 +533,8 @@
                     </div>
                     <div id="error-list" class="tab-pane">
                     </div>
+                    <div id="check-list" class="tab-pane">
+                    </div>
                 </div>
             </div>
         </div>
@@ -554,6 +557,9 @@
                     <a class="nav-link" content="#checked-change" href="javascript: void(0);">变更令</a>
                 </li>
                 <li class="nav-item">
+                    <a class="nav-link" content="#check-list" id="check-list-tab" href="javascript: void(0);" style="display: none;">检查错误</a>
+                </li>
+                <li class="nav-item">
                     <a class="nav-link" content="#error-list" id="error-list-tab" href="javascript: void(0);" style="display: none;">错误列表</a>
                 </li>
             </ul>
@@ -564,6 +570,7 @@
         <img src="/public/images/icon-ok.png" id="icon-ok" />
     </div>
 </div>
+<script src="/public/js/moment/moment.min.js"></script>
 <script>
     String.prototype.replaceAll = function (FindText, RepText) {
         regExp = new RegExp(FindText, 'g');

+ 1 - 0
app/view/stage/modal.ejs

@@ -392,3 +392,4 @@
 </div>
 <% include ./audit_modal.ejs %>
 <% include ../shares/merge_peg_modal.ejs %>
+<% include ../shares/ledger_check_modal.ejs %>