Bläddra i källkod

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

Tony Kang 11 månader sedan
förälder
incheckning
8b92e05b36

+ 1 - 1
app/lib/wechat.js

@@ -72,7 +72,7 @@ class WX {
                     case wxConst.template.change:
                         templateId = wxConst.templateId.change;
                         url = data.wap_url ? origin_url + '/wx/url2wap?project=' + data.code + '&url=' + sck + data.wap_url : '';
-                        remark = data.status === wxConst.status.check ? (data.type && _.indexOf(['apply', 'project'], data.type) !== -1 ? '微信暂无法在线审批' : '微信可快速审批,如需进行详细审批') :
+                        remark = data.status === wxConst.status.check ? '微信可快速审批,如需进行详细审批' :
                             (data.status === wxConst.status.success ? '审批已通过,查看审批结果' :
                                 (data.status === wxConst.status.back ? '审批被退回,查看退回结果' : '审批已终止,查看终止结果'));
                         msgData = {

+ 1 - 0
app/public/js/change_revise.js

@@ -49,6 +49,7 @@ const checkOption = {
         ],
     },
     same_code: { enable: 1 },
+    same_bills: { enable: 1 },
 };
 
 $(document).ready(() => {

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

@@ -56,6 +56,7 @@ const checkOption = {
         ],
     },
     same_code: { enable: 1 },
+    same_bills: { enable: 1 },
 };
 
 $(document).ready(function() {

+ 28 - 0
app/public/js/ledger_check.js

@@ -19,6 +19,7 @@ const ledgerCheckType = {
     tp: {value: 5, text: '清单金额≠数量×单价', fun: 'checkTp', },
     over: {value: 6, text: '超计', fun: 'checkOver', },
     same_code: {value: 7, text: '重复项目节', fun: 'checkSameCode', },
+    same_bills: {value: 14, text: '重复清单(同部位)', fun: 'checkSameBwBills', },
     limit3f: {
         fun: 'check3fLimit', items: [
             { value: 8, text: '违规计量(工序报验)', key: 'gxbyOver', type: 'gxby', },
@@ -183,6 +184,33 @@ const ledgerCheckUtil = {
         }
         return error;
     },
+    checkSameBwBills: function(ledgerTree, ledgerPos, decimal, option) {
+        const error = [];
+        for (const node of ledgerTree.nodes) {
+            if (!node.children || node.children.length === 0) continue;
+
+            const gatherGcl = [];
+            for (const child of node.children) {
+                if (!child.b_code) continue;
+
+                let gcl = gatherGcl.find(g => {
+                    return g.b_code === child.b_code &&
+                        (g.name || child.name ? g.name === child.name : true) &&
+                        (g.unit || child.unit ? g.unit === child.unit : true) &&
+                        checkZero(ZhCalc.sub(g.unit_price, child.unit_price));
+                });
+                if (!gcl) {
+                    gcl = { source: [], b_code: child.b_code || '', name: child.name || '', unit: child.unit || '', unit_price: child.unit_price || 0 }
+                    gatherGcl.push(gcl);
+                }
+                gcl.source.push(child);
+            }
+            gatherGcl.forEach(g => {
+                if (g.source.length > 1) error.push(...g.source);
+            })
+        }
+        return error;
+    },
     check3fLimit: function (ledgerTree, ledgerPos, decimal, option) {
         const error = {};
         for (const i of ledgerCheckType.limit3f.items) {

+ 2 - 0
app/public/js/revise.js

@@ -48,6 +48,8 @@ const checkOption = {
             {qty: 'deal_qty', tp: 'deal_tp'},
         ],
     },
+    same_code: { enable: 1 },
+    same_bills: { enable: 1 },
 };
 
 $(document).ready(() => {

+ 9 - 0
app/service/report.js

@@ -180,6 +180,10 @@ module.exports = app => {
                             runnableRst.push(service.reportMemory.getStageJgcl(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_stage_yjcl':
+                            runnableRst.push(service.reportMemory.getStageYjcl(params.tender_id, params.stage_id, memFieldKeys[filter]));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_stage_bonus':
                             runnableRst.push(service.reportMemory.getStageBonus(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
@@ -216,6 +220,11 @@ module.exports = app => {
                                 customDefine.gather_select, customSelect ? customSelect.gather_select : null));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_gather_stage_yjcl':
+                            runnableRst.push(service.rptGatherMemory.getGatherStageYjcl(memFieldKeys[filter],
+                                customDefine.gather_select, customSelect ? customSelect.gather_select : null));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_gather_stage_bonus':
                             runnableRst.push(service.rptGatherMemory.getGatherStageBonus(memFieldKeys[filter],
                                 customDefine.gather_select, customSelect ? customSelect.gather_select : null));

+ 16 - 0
app/service/report_memory.js

@@ -1285,6 +1285,22 @@ module.exports = app => {
             }
         }
 
+        async getStageYjcl(tid, sid, fields) {
+            try {
+                await this.ctx.service.tender.checkTender(tid);
+                await this.ctx.service.stage.checkStage(sid);
+
+                const data = await this.ctx.service.stageYjcl.getStageData(this.ctx.stage);
+                for (const d of data) {
+                    d.end_qty = this.ctx.helper.add(d.pre_qty, qty);
+                    d.end_tp = this.ctx.helper.add(d.pre_tp, tp);
+                }
+                return data;
+            } catch (err) {
+                return [];
+            }
+        }
+
         async getStageBonus(tid, sid, fields) {
             try {
                 await this.ctx.service.tender.checkTender(tid);

+ 56 - 0
app/service/rpt_gather_memory.js

@@ -1591,6 +1591,62 @@ module.exports = app => {
             return this.resultStageJgcl;
         }
 
+        async _gatherStageYjcl(tender, stage) {
+            const data = await this.ctx.service.stageYjcl.getStageData(stage);
+            for (const d of data) {
+                d.end_qty = this.ctx.helper.add(d.pre_qty, qty);
+                d.end_tp = this.ctx.helper.add(d.pre_tp, tp);
+            }
+            this.resultStageJgcl.push(...data);
+        }
+        async _gatherMonthStageYjcl(sTender, month) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            const stages = await this._getValidStages(tender.id);
+            const stage = this.ctx.helper._.find(stages, {s_time: month});
+            await this._gatherStageYjcl(tender, stage);
+        }
+        async _gatherOrderStageYjcl(sTender, order) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            const stages = await this._getValidStages(tender.id);
+            const stage = this.ctx.helper._.find(stages, {order: order});
+            await this._gatherStageYjcl(tender, stage);
+        }
+        async _gatherFinalStageYjcl(sTender) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            const stages = await this._getValidStages(tender.id);
+            await this._gatherStageYjcl(tender, stages[0]);
+        }
+        async _gatherCheckedFinalStageYjcl(sTender) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            const stages = await this._getCheckedStages(tender.id);
+            await this._gatherStageYjcl(tender, stages[0]);
+        }
+        async getGatherStageYjcl(memFieldKeys, gsDefine, gsCustom) {
+            if (!gsDefine || !gsDefine.enable) return [];
+            if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
+
+            this.resultStageYjcl = [];
+            const gsSetting = JSON.parse(gsDefine.setting);
+            for (const tender of gsCustom.tenders) {
+                switch (gsSetting.type) {
+                    case 'month':
+                        await this._gatherMonthStageYjcl(tender, gsCustom.month);
+                        break;
+                    case 'final':
+                        await this._gatherFinalStageYjcl(tender);
+                        break;
+                    case 'checked-final':
+                        await this._gatherCheckedFinalStageYjcl(tender);
+                        break;
+                    case 'stage':
+                        await this._gatherOrderStageYjcl(tender, gsCustom.stage);
+                        break;
+                }
+            }
+
+            return this.resultStageYjcl;
+        }
+
         async _gatherStageBonus(tender, stage) {
             const data = await this.ctx.service.stageBonus.getEndStageData(tender.id, stage.order);
             for (const d of data) {

+ 8 - 0
app/view/change/apply_information_modal.ejs

@@ -545,6 +545,14 @@
                                                                             <div class="col-12 py-1 bg-light">
                                                                                 <textarea class="form-control form-control-sm" name="opinion">同意</textarea>
                                                                             </div>
+                                                                            <% if (group.is_final) { %>
+                                                                                <!--终审填写批复编号-->
+                                                                                <div class="col-12 form-group mt-3">
+                                                                                    <label>变更通知书<b class="text-danger">*&nbsp;</b></label>
+                                                                                    <input class="form-control form-control-sm" value="BGTZ-<%- change.code %>" name="notice_code" type="text">
+                                                                                    <input value="<%- auditor.aid %>" name="notice_uid" type="hidden">
+                                                                                </div>
+                                                                            <% } %>
                                                                         <% } %>
                                                                     </div>
                                                                 <% } %>

+ 14 - 0
app/view/wap/shenpi_change_apply.ejs

@@ -201,6 +201,14 @@
                     <textarea class="form-control" rows="8" name="opinion">同意</textarea>
                 </div>
             </div>
+            <% if (isfinal) { %>
+                <!--终审填写批复编号-->
+                <div class="form-group mt-3">
+                    <label>变更通知书</label>
+                    <input class="form-control" value="BGTZ-<%= change.code %>" name="notice_code" type="text">
+                    <input value="<%- ctx.session.sessionUser.accountId %>" name="notice_uid" type="hidden">
+                </div>
+            <% } %>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
@@ -260,6 +268,12 @@
     function auditCheck(i) {
         const opinion = $('textarea[name="opinion"]').eq(i).val().replace(/\r\n/g, '<br/>').replace(/\n/g, '<br/>').replace(/\s/g, ' ');
         $('textarea[name="opinion"]').eq(i).val(opinion);
+        if ($('input[name="notice_code"]').val() !== undefined) {
+            if (_.trim($('input[name="notice_code"]').val()) === '') {
+                toastr.error('请输入变更通知书');
+                return false;
+            }
+        }
         return true;
     }
 </script>