浏览代码

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

laiguoran 4 年之前
父节点
当前提交
4e8bf55876

+ 14 - 2
app/controller/ledger_controller.js

@@ -449,9 +449,21 @@ module.exports = app => {
                 const ledgerData = await ctx.service.ledger.getData(ctx.tender.id);
                 const posData = this.ctx.tender.data.measure_type === measureType.tz.value
                     ? await ctx.service.pos.getPosData({ tid: ctx.tender.id }) : [];
-                const data = ctx.helper.checkBillsWithPos(ledgerData, posData,
+                const qtyData = ctx.helper.checkBillsWithPos(ledgerData, posData,
                     ['sgfh_qty', 'qtcl_qty', 'sjcl_qty', 'quantity']);
-                ctx.body = { err: 0, msg: '', data };
+                qtyData.error.forEach(x => { x.errorType = 'qty'; });
+                const tpData = ctx.helper.checkBillsTp(ledgerData, [
+                    {qty: 'sgfh_qty', tp: 'sgfh_tp'}, {qty: 'qtcl_qty', tp: 'qtcl_tp'},
+                    {qty: 'sjcl_qty', tp: 'sjcl_tp'}, {qty: 'quantity', tp: 'total_price'}
+                ], this.ctx.tender.info.decimal);
+                tpData.error.forEach(x => { x.errorType = 'tp'; });
+                ctx.body = { err: 0, msg: '', data: {
+                    error: [...qtyData.error, ...tpData.error],
+                    source: {
+                        bills: [...qtyData.source.bills, ...tpData.source.bills],
+                        pos: [...qtyData.source.pos, ...tpData.source.pos],
+                    },
+                }};
             } catch (err) {
                 this.log(err);
                 ctx.body = this.ajaxErrorBody(err, '检查数据错误');

+ 14 - 2
app/controller/revise_controller.js

@@ -459,9 +459,21 @@ module.exports = app => {
                     ? JSON.parse(await fs.readFileSync(posFile, 'utf8'))
                     : await ctx.service.revisePos.getData(ctx.tender.id);
 
-                const data = ctx.helper.checkBillsWithPos(reviseBills, revisePos,
+                const qtyData = ctx.helper.checkBillsWithPos(reviseBills, revisePos,
                     ['sgfh_qty', 'qtcl_qty', 'sjcl_qty', 'quantity']);
-                ctx.body = { err: 0, msg: '', data };
+                qtyData.error.forEach(x => { x.errorType = 'qty'; });
+                const tpData = ctx.helper.checkBillsTp(reviseBills, [
+                    {qty: 'sgfh_qty', tp: 'sgfh_tp'}, {qty: 'qtcl_qty', tp: 'qtcl_tp'},
+                    {qty: 'sjcl_qty', tp: 'sjcl_tp'}, {qty: 'quantity', tp: 'total_price'}
+                ], this.ctx.tender.info.decimal);
+                tpData.error.forEach(x => { x.errorType = 'tp'; });
+                ctx.body = { err: 0, msg: '', data: {
+                        error: [...qtyData.error, ...tpData.error],
+                        source: {
+                            bills: [...qtyData.source.bills, ...tpData.source.bills],
+                            pos: [...qtyData.source.pos, ...tpData.source.pos],
+                        },
+                    }};
             } catch (err) {
                 this.log(err);
                 ctx.body = this.ajaxErrorBody(err, '检查数据错误');

+ 14 - 2
app/controller/stage_controller.js

@@ -334,8 +334,20 @@ module.exports = app => {
             try {
                 const ledgerData = await this._getStageLedgerData(ctx);
                 const posData = await this._getStagePosData(ctx);
-                const data = ctx.helper.checkBillsWithPos(ledgerData, posData, ['contract_qty', 'qc_qty']);
-                ctx.body = { err: 0, msg: '', data };
+
+                const qtyData = ctx.helper.checkBillsWithPos(ledgerData, posData, ['contract_qty', 'qc_qty']);
+                qtyData.error.forEach(x => { x.errorType = 'qty'; });
+                const tpData = ctx.helper.checkBillsTp(ledgerData, [
+                    {qty: 'contract_qty', tp: 'contract_tp'}, {qty: 'qc_qty', tp: 'qc_tp'}
+                ], this.ctx.tender.info.decimal);
+                tpData.error.forEach(x => { x.errorType = 'tp'; });
+                ctx.body = { err: 0, msg: '', data: {
+                        error: [...qtyData.error, ...tpData.error],
+                        source: {
+                            bills: [...qtyData.source.bills, ...tpData.source.bills],
+                            pos: [...qtyData.source.pos, ...tpData.source.pos],
+                        },
+                    }};
             } catch (err) {
                 this.log(err);
                 ctx.body = this.ajaxErrorBody(err, '检查数据错误');

+ 27 - 0
app/extend/helper.js

@@ -1176,6 +1176,33 @@ module.exports = {
         return result;
     },
 
+    checkBillsTp(bills, field, decimal) {
+        const result = {
+            error: [],
+            source: {
+                bills: [],
+                pos: [],
+            },
+        };
+        for (const b of bills) {
+            const checkData = {}, calcData = {};
+            for (const f of field) {
+                checkData[f.tp] = b[f.tp] || 0;
+                calcData[f.tp] = this.mul(b.unit_price, b[f.qty], decimal.tp) || 0;
+            }
+            if (!_.isMatch(checkData, calcData)) {
+                result.error.push({
+                    ledger_id: b.ledger_id,
+                    b_code: b.b_code,
+                    name: b.name,
+                    error: { checkData, calcData },
+                });
+                result.source.bills.push(b);
+            }
+        }
+        return result;
+    },
+
     check18MainCode(code) {
         return /^([0-9]([0-9][0-9])*)?(GD[0-9]{3}([0-9][0-9])*)?$/.test(code);
     },

+ 13 - 3
app/public/js/shares/cs_tools.js

@@ -57,9 +57,19 @@ const showSideTools = function (show) {
         if (!setting.spreadSetting) {
             setting.spreadSetting = {
                 cols: [
-                    {title: '行号', field: 'serialNo', width: 80, formatter: '@'},
-                    {title: '清单编号', field: 'b_code', width: 150, formatter: '@'},
-                    {title: '清单名称', field: 'name', width: 230, formatter: '@'},
+                    {title: '行号', field: 'serialNo', width: 50, formatter: '@'},
+                    {
+                        title: '错误类型', field: 'errorType', width: 60, formatter: '@',
+                        getValue: function (x) {
+                            switch (x.errorType) {
+                                case 'qty': return '数量';
+                                case 'tp': return '金额';
+                                default: return '';
+                            }
+                        }
+                    },
+                    {title: '清单编号', field: 'b_code', width: 135, formatter: '@'},
+                    {title: '清单名称', field: 'name', width: 215, formatter: '@'},
                 ],
                 emptyRows: 0,
                 headRows: 1,

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

@@ -41,10 +41,12 @@
                 </div>
                 <div class="d-inline-block ml-3">
                     <a id="exportLedger" 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">
+                <% if (tender.ledger_status !== auditConst.status.checked) { %>
+                    <a class="btn btn-sm btn-primary mr-1" href="#ledger-check-modal" data-toggle="modal" data-target="#ledger-check-modal">数据检查</a>
+                <% } %>
                 <% if (tender.ledger_status === auditConst.status.checkNo) { %>
                     <a href="#sp-list" data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm pull-right text-dark sp-list-btn">审批退回</a>
                 <% } else if (tender.ledger_status === auditConst.status.checking) { %>

+ 10 - 10
app/view/revise/info.ejs

@@ -41,30 +41,30 @@
                         <input type="text" class="form-control form-control-sm m-0" id="bills-expr" readonly="">
                     </div>
                 </div>
-                <div class="d-inline-block ml-3">
-                    <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">
+                <% if (revise.status !== audit.status.checked) { %>
+                    <a class="btn btn-sm btn-primary mr-1" href="#ledger-check-modal" data-toggle="modal" data-target="#ledger-check-modal">数据检查</a>
+                <% } %>
                 <% if (revise.status === audit.status.uncheck && revise.uid === ctx.session.sessionUser.accountId) { %>
-                <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" class="btn btn-primary btn-sm pull-right mr-1">上报审批</a>
+                <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" class="btn btn-primary btn-sm mr-1">上报审批</a>
                 <% } %>
                 <% if (revise.status === audit.status.checkNo) { %>
-                <a href="#sp-list" data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm pull-right mr-1 sp-list-btn">审批退回</a>
+                <a href="#sp-list" data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm mr-1 sp-list-btn">审批退回</a>
                     <% if (revise.uid === ctx.session.sessionUser.accountId) { %>
-                    <a href="#sp-list" data-type="show" data-toggle="modal" data-target="#sp-list" class="btn btn-primary btn-sm pull-right mr-1 sp-list-btn">重新上报</a>
+                    <a href="#sp-list" data-type="show" data-toggle="modal" data-target="#sp-list" class="btn btn-primary btn-sm mr-1 sp-list-btn">重新上报</a>
                     <% } %>
                 <% } %>
                 <% if (revise.status === audit.status.checking) { %>
-                <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm pull-right text-dark mr-1">审批中</a>
+                <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm text-dark mr-1">审批中</a>
                     <% if (curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
-                    <a href="#sp-done" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm pull-right mr-1">审批通过</a>
-                    <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm pull-right mr-1">审批退回</a>
+                    <a href="#sp-done" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm mr-1">审批通过</a>
+                    <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm mr-1">审批退回</a>
                     <% } %>
                 <% } %>
                 <% if (revise.status === audit.status.checked) { %>
-                <a href="#sp-list" data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm pull-right mr-1 sp-list-btn">审批完成</a>
+                <a href="#sp-list" data-type="hide" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm mr-1 sp-list-btn">审批完成</a>
                 <% } %>
             </div>
         </div>

+ 40 - 31
app/view/tender/detail_modal.ejs

@@ -27,7 +27,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">建设项目名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="项目A" id="build-name" maxlength="100">
+                                            <input type="text" class="form-control" value="项目A" id="build-name" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-12 mb-2">
@@ -35,7 +35,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text" style="width:90px">合同编号</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="deal-code" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="deal-code" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-12">
@@ -43,7 +43,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text" style="width:90px">合同名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="deal-name" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="deal-name" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                 </div>
@@ -58,7 +58,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">单位名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="build-company" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="build-company" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0">
@@ -66,7 +66,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">法人代表</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="build-corporation" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="build-corporation" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -87,7 +87,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">单位名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="contract1-company" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="contract1-company" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0">
@@ -95,7 +95,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">法人代表</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="contract1-corporation" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="contract1-corporation" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -116,7 +116,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">单位名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="contract2-company" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="contract2-company" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0">
@@ -124,7 +124,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">法人代表</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="contract2-corporation" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="contract2-corporation" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -145,7 +145,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">单位名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="supervision1-company" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="supervision1-company" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0">
@@ -153,7 +153,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">法人代表</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="supervision1-corporation" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="supervision1-corporation" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -174,7 +174,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">单位名称</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="supervision2-company" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="supervision2-company" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0">
@@ -182,7 +182,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">法人代表</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="supervision2-corporation" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="supervision2-corporation" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -219,7 +219,7 @@
                                                 <span class="input-group-text" style="width:90px">长度(KM)</span>
                                             </div>
                                             <input type="text" class="form-control" value="" id="length" min="0" max="10000"
-                                                   oninput="limitDealParamLength(this)" onchange="checkNumberValid(this)">
+                                                   oninput="limitDealParamLength(this);limitReturn(this);" onchange="checkNumberValid(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0 mb-2">
@@ -227,7 +227,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text">起始桩号</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="start-peg" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="start-peg" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -235,7 +235,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text" style="width:90px">终止桩号</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="end-peg" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="end-peg" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0 mb-2">
@@ -243,7 +243,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text" style="width:66px">车道数</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="lane-count" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="lane-count" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6">
@@ -251,7 +251,7 @@
                                             <div class="input-group-prepend">
                                                 <span class="input-group-text" style="width:90px">合同工期</span>
                                             </div>
-                                            <input type="text" class="form-control" value="" id="deal-period" maxlength="100">
+                                            <input type="text" class="form-control" value="" id="deal-period" maxlength="100" oninput="limitReturn(this)">
                                         </div>
                                     </div>
                                     <div class="col-6 pr-0 mb-2">
@@ -588,19 +588,19 @@
                 <div class="sjs-option-height">
                     <table class="table table-bordered">
                         <tr><th colspan="2" class="text-center">工程款账户</th></tr>
-                        <tr><td>开户名称</td><td><input type="text" id="project-name" class="form-control form-control-sm"></td></tr>
-                        <tr><td>开户银行</td><td><input type="text" id="project-bank" class="form-control form-control-sm"></td></tr>
-                        <tr><td>开户账号</td><td><input type="text" id="project-account" class="form-control form-control-sm"></td></tr>
-                        <tr><td>分账划拨比例(%)</td><td><input type="text" id="project-rate" class="form-control form-control-sm"></td></tr>
-                        <tr><td>联系人</td><td><input type="text" id="project-contact" class="form-control form-control-sm"></td></tr>
-                        <tr><td>联系电话</td><td><input type="text" id="project-phone" class="form-control form-control-sm"></td></tr>
+                        <tr><td>开户名称</td><td><input type="text" id="project-name" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>开户银行</td><td><input type="text" id="project-bank" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>开户账号</td><td><input type="text" id="project-account" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>分账划拨比例(%)</td><td><input type="text" id="project-rate" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>联系人</td><td><input type="text" id="project-contact" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>联系电话</td><td><input type="text" id="project-phone" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
                         <tr><th colspan="2" class="text-center">农民工工资专用账户</th></tr>
-                        <tr><td>开户名称</td><td><input type="text" id="worker-name" class="form-control form-control-sm"></td></tr>
-                        <tr><td>开户银行</td><td><input type="text" id="worker-bank" class="form-control form-control-sm"></td></tr>
-                        <tr><td>开户账号</td><td><input type="text" id="worker-account" class="form-control form-control-sm"></td></tr>
-                        <tr><td>分账划拨比例(%)</td><td><input type="text" id="worker-rate" class="form-control form-control-sm"></td></tr>
-                        <tr><td>联系人</td><td><input type="text" id="worker-contact" class="form-control form-control-sm"></td></tr>
-                        <tr><td>联系电话</td><td><input type="text" id="worker-phone" class="form-control form-control-sm"></td></tr>
+                        <tr><td>开户名称</td><td><input type="text" id="worker-name" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>开户银行</td><td><input type="text" id="worker-bank" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>开户账号</td><td><input type="text" id="worker-account" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>分账划拨比例(%)</td><td><input type="text" id="worker-rate" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>联系人</td><td><input type="text" id="worker-contact" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
+                        <tr><td>联系电话</td><td><input type="text" id="worker-phone" class="form-control form-control-sm" oninput="limitReturn(this)"></td></tr>
                     </table>
                 </div>
             </div>
@@ -647,6 +647,11 @@
         limitReg(obj, /\.{2,}/g); // 过滤第二个.
         limitInputMinMax(obj);
     }
+
+    function limitReturn(obj) {
+        limitReg(obj, /\s/g);
+    }
+
     function checkNumberValid(obj) {
         const value = _.toNumber(obj.value);
         obj.value = value ? value : '';
@@ -1190,6 +1195,7 @@
             for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
                 const cell = sheet.getCell(iRow, 1);
                 const defaultStype = sheet.getDefaultStyle();
+                cell.text(cell.text().replace(/\s/g, ''))
                 if (cell.text().length > 50) {
                     cell.backColor('#f8d7da');
                     hint = '章节名称的长度超出范围,请重新输入';
@@ -1207,6 +1213,9 @@
         spread.bind(spreadNS.Events.EditEnding, function (e, info) {
             checkSheetData(info.sheet);
         });
+        spread.bind(spreadNS.Events.EditEnded, function (e, info) {
+            checkSheetData(info.sheet);
+        });
         spread.bind(spreadNS.Events.ClipboardPasted, function (e, info) {
             checkSheetData(info.sheet);
         });
@@ -1230,7 +1239,7 @@
                 const data = {};
                 for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
                     const col = spreadSetting.cols[iCol];
-                    data[col.field] = sheet.getText(iRow, iCol);
+                    data[col.field] = sheet.getText(iRow, iCol).replace(/\s/g, '');
                     if (col.field === 'name') {
                         if (data.name.length > 50) {
                             return null;