Prechádzať zdrojové kódy

变更方案,批量签字

MaiXinRong 1 rok pred
rodič
commit
a53d5c57d3

+ 1 - 0
app/const/rpt_archive.js

@@ -34,6 +34,7 @@ const BusinessStageId = (function(businessType) {
     for (const bt of businessType) {
         result[bt.type] = bt.stageId;
     }
+    return result;
 })(BusinessType);
 
 module.exports = {

+ 15 - 0
app/controller/report_controller.js

@@ -36,6 +36,7 @@ const NORMAL_SIGN_STR = 'normal_sign';
 const COMPANY_SIGN_STR = 'company_stamp';
 const PRIVATE_SIGN_STR = 'private_stamp';
 const sourceTypeConst = require('../const/source_type');
+const rptBusiness = require('../const/rpt_archive');
 
 module.exports = app => {
     class ReportController extends app.BaseController {
@@ -352,6 +353,7 @@ module.exports = app => {
                     source_type: 1,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
                     advanceConst,
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
@@ -511,6 +513,7 @@ module.exports = app => {
                     source_type: 101,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
                 };
                 /*
                 //*/
@@ -661,6 +664,7 @@ module.exports = app => {
                     source_type: 200,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
 
@@ -730,6 +734,16 @@ module.exports = app => {
                         break;
                     }
                 }
+
+                let otherChangeList = [];
+                switch (stage_id) {
+                    case rptBusiness.BusinessStageId.change_plan:
+                        otherChangeList = await ctx.service.changePlan.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                    case rptBusiness.BusinessStageId.change_project:
+                        otherChangeList = await ctx.service.changeProject.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                    case rptBusiness.BusinessStageId.change_apply:
+                        otherChangeList = await ctx.service.changeApply.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                }
                 let archiveList = [];
                 const archives = await ctx.service.rptArchive.getArchiveByBzId(pid, stage_id, bglObj.BUSINESS_ID);
                 if (archives.length > 0) {
@@ -851,6 +865,7 @@ module.exports = app => {
                     source_type,
                     bglObj: JSON.stringify(bglObj),
                     changes: JSON.stringify(changes),
+                    otherChangeList: JSON.stringify(otherChangeList),
                     bizId: bglObj.BUSINESS_ID,
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');

+ 22 - 0
app/controller/signature_controller.js

@@ -49,6 +49,7 @@ module.exports = app => {
             // console.log(params);
             const bzId = params.business_id;
             const srcKey = sourceTypeConst.sourceTypeKey[params.source_type];
+            console.log(params.rel_content);
             const rst = await ctx.service.roleRptRel.updateRoleRelationship(params.id, params.tender_id, params.rpt_id, params.stage_id, bzId, srcKey, params.rel_content);
             const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_id, params.stage_id, bzId);
             // const roleRel = params.rel_content;
@@ -113,6 +114,27 @@ module.exports = app => {
             ctx.status = 201;
         }
 
+        // 多个XX(变更方案,变更申请...)更新签名角色关联
+        async updateMultiOtherRoleRelationship(ctx) {
+            const params = JSON.parse(ctx.request.body.params);
+            const conParams = params.selected;
+            const roleRel = params.rel_content;
+            const bzId = params.business_id;
+            const srcKey = sourceTypeConst.sourceTypeKey[params.source_type];
+            console.log('before:');
+            console.log(params.rel_content);
+            await ctx.service.roleRptRel.updateRoleRelationship(params.id, params.tender_id, params.rpt_id, params.stage_id, bzId, srcKey, params.rel_content); // 传过来的数据是额外变更令的,还需要单独处理当前的
+            // update完默认当前的变更令后要清理审核日期(其他变更令的审核日期肯定会有出入的)
+            params.rel_content.forEach(role_rel => {
+                role_rel.sign_date = null;
+            });
+            console.log('after:');
+            console.log(params.rel_content);
+            const rst = await ctx.service.roleRptRel.updateMultiOtherRoleRelationship(conParams, srcKey, roleRel);
+            ctx.body = { data: rst };
+            ctx.status = 201;
+        }
+
         /**
          * 更新最近使用签名
          *

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

@@ -1632,54 +1632,54 @@ $(document).ready(() => {
                     }
                 }
             },
-            // 'remainCurPos': {
-            //     name: '填剩余量(计量单元)',
-            //     disabled: function (key, opt) {
-            //         const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
-            //         return readOnly || !node || node.lock;
-            //     },
-            //     callback: function (key, opt) {
-            //         const sheet = spSpread.getActiveSheet();
-            //         const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
-            //
-            //         const data = { updateType: 'update', updateData: [] };
-            //         const posterity = stageTree.getPosterity(node);
-            //         posterity.unshift(node);
-            //         for (const p of posterity) {
-            //             if (p.children && p.children.length > 0) continue;
-            //             if (!p.b_code) continue;
-            //             const posRange = stagePos.ledgerPos[itemsPre + p.id] || [];
-            //             if (posRange.length === 0) continue;
-            //
-            //             for (const pr of posRange) {
-            //                 const qty = ZhCalc.sub(pr.quantity, pr.pre_contract_qty);
-            //                 const differ = ZhCalc.sub(pr.quantity, pr.end_contract_qty);
-            //                 if (differ) data.updateData.push({ pid: pr.id, contract_qty: qty, contract_expr: '' });
-            //             }
-            //         }
-            //         if (data.updateData.length === 0) {
-            //             toastr.warning('所选节点及子项已全部计量');
-            //             return;
-            //         }
-            //
-            //         if (updateStage.length > 0) {
-            //             if (updateStage.length > 1000) {
-            //                 toastr.warning('提交的数据太大,仅提交1000条数据');
-            //                 updateStage.length = 1000;
-            //             }
-            //             postData(window.location.pathname + '/update', {pos: data}, 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);
-            //             });
-            //         }
-            //     }
-            // },
+            'remainCurPos': {
+                name: '填剩余量(计量单元)',
+                disabled: function (key, opt) {
+                    const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
+                    return readOnly || !node || node.lock;
+                },
+                callback: function (key, opt) {
+                    const sheet = spSpread.getActiveSheet();
+                    const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
+
+                    const data = { updateType: 'update', updateData: [] };
+                    const posterity = stageTree.getPosterity(node);
+                    posterity.unshift(node);
+                    for (const p of posterity) {
+                        if (p.children && p.children.length > 0) continue;
+                        if (!p.b_code) continue;
+                        const posRange = stagePos.ledgerPos[itemsPre + p.id] || [];
+                        if (posRange.length === 0) continue;
+
+                        for (const pr of posRange) {
+                            const qty = ZhCalc.sub(pr.quantity, pr.pre_contract_qty);
+                            const differ = ZhCalc.sub(pr.quantity, pr.end_contract_qty);
+                            if (differ) data.updateData.push({ lid: pr.lid, pid: pr.id, contract_qty: qty, contract_expr: '' });
+                        }
+                    }
+                    if (data.updateData.length === 0) {
+                        toastr.warning('所选节点及子项已全部计量');
+                        return;
+                    }
+
+                    if (updateStage.length > 0) {
+                        if (updateStage.length > 1000) {
+                            toastr.warning('提交的数据太大,仅提交1000条数据');
+                            updateStage.length = 1000;
+                        }
+                        postData(window.location.pathname + '/update', {pos: data}, 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);
+                        });
+                    }
+                }
+            },
             'remainXmjQty': {
                 name: '填项目节数量',
                 callback: function(key, opt) {

+ 26 - 0
app/public/report/js/rpt_signature.js

@@ -547,6 +547,32 @@ let rptSignatureHelper = {
         );
     },
 
+    setupAfterSelectMultiOther: async function (selectedOther, signatureDivId) {
+        // 多变更令选择
+        await this._commonRefreshAfterSelectSignature(signatureDivId);
+        const params = this._getCommonParams();
+        params.stg_id = STAGE_ID;
+        params.select = selectedOther;
+        const new_ROLE_REL_LIST = JSON.parse(JSON.stringify(ROLE_REL_LIST));
+        new_ROLE_REL_LIST.forEach(nrole => {
+            nrole.sign_pic = null;
+        });
+        params.rel_content = new_ROLE_REL_LIST;
+        rptSignatureHelper.originalRoleRelList = JSON.parse(JSON.stringify(ROLE_REL_LIST));
+        CommonAjax.postXsrfEx("/tender/report_api/updateMultiOtherRoleRelationship", params, 10000, true, getCookie('csrfToken_j'),
+            function(result){
+                $.bootstrapLoading.end();
+                if (result.data && result.data.insertId > 0) {
+                    CURRENT_ROLE_REL_ID = result.data.insertId;
+                }
+            }, function(err){
+                $.bootstrapLoading.end();
+            }, function(ex){
+                $.bootstrapLoading.end();
+            }
+        );
+    },
+
 
     setupAfterSelectMultiTenders: async function (selectedTenders, signatureDivId) {
         // 跨标段选择,有不少要注意的交互:

+ 1 - 0
app/router.js

@@ -502,6 +502,7 @@ module.exports = app => {
     app.post('/tender/report_api/updateRoleRelationship', sessionAuth, 'signatureController.updateRoleRel');
     app.post('/tender/report_api/updateMultiRoleRelationship', sessionAuth, 'signatureController.updateCrossTendersRoleRelationship');
     app.post('/tender/report_api/updateMultiChangesRoleRelationship', sessionAuth, 'signatureController.updateMultiChangesRoleRelationship');
+    app.post('/tender/report_api/updateMultiOtherRoleRelationship', sessionAuth, 'signatureController.updateMultiOtherRoleRelationship');
     app.post('/tender/report_api/getMultiRoleRelationships', sessionAuth, 'signatureController.getMultiRoleRptRels');
     app.post('/tender/report_api/createRoleRelationship', sessionAuth, 'signatureController.createRoleRel');
     app.post('/tender/report_api/updateCustNode', sessionAuth, 'reportController.updateCustNode');

+ 22 - 0
app/service/role_rpt_rel.js

@@ -229,6 +229,28 @@ module.exports = app => {
             return true;
         }
 
+        async updateMultiOtherRoleRelationship(orgParams, srcKey, newRelArr) {
+            this.transaction = await this.db.beginTransaction();
+            try {
+                for (let idx = 0; idx < orgParams.length; idx++) {
+                    const param = orgParams[idx];
+                    // 变更令的参数结构有些不一样
+                    // [tenderId, '-300', changeCid, reportId];
+                    const tenderId = param[0];
+                    const sid = param[1];
+                    const businessId = param[2];
+                    const rptId = param[3];
+                    const data = { tender_id: tenderId, sid, business_id: businessId, rpt_id: rptId };
+                    await this.transaction.delete(this.tableName, data);
+                    await this.createRoleRelationship(tenderId, rptId, sid, businessId, srcKey, newRelArr);
+                }
+                this.transaction.commit();
+            } catch (ex) {
+                await this.transaction.rollback();
+            }
+            return true;
+        }
+
         async updateMultiRoleRelationship(orgParams, bzId, srcKey, newRelArr) {
             for (let idx = 0; idx < orgParams.length; idx++) {
                 const param = orgParams[idx];

+ 1 - 0
app/view/report/index.ejs

@@ -525,6 +525,7 @@
     const SP_ID = '<%- sp_id %>';
     let SOURCE_TYPE = <%- source_type %>;
     const ALL_CHANGES = <%- changes %>;
+    const ALL_OTHER = <%- otherChangeList %>;
     const BGL_OBJ = <%- bglObj %>;
     const ADVANCE_LIST = <%- advanceList %>;
     const ADVANCE_AUDIT_LISt = <%- advanceAuditList %>;

+ 32 - 6
app/view/report/rpt_all_popup.ejs

@@ -209,6 +209,9 @@
                 <% if (stg_id === -300) { %>
                     <button type="button" id="btn_cross_tender" class="btn btn-sm btn-link float-left" data-dismiss="modal" data-toggle="modal" data-target="#batch-eSignature" id="batch-setupChangeSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv', true); buildChangeTree();">批量设置其他变更令</button>
                 <% } %>
+                <% if (stg_id === -301) { %>
+                <button type="button" id="btn_cross_tender" class="btn btn-sm btn-link float-left" data-dismiss="modal" data-toggle="modal" data-target="#batch-eSignature" id="batch-setupChangePlanSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv', true); buildOtherTree(ALL_OTHER);">批量设置其他变更方案</button>
+                <% } %>
                 <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="rptSignatureHelper.removeSelectSignature()">取消</button>
                 <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectSignature('eSignatureBodyDiv')" class="btn btn-primary btn-sm" data-dismiss="modal">确定</a>
             </div>
@@ -236,18 +239,22 @@
                         <div class="modal-height-500 ml-2" id="batch-eSignatureBodyDiv" style="overflow-y:auto;"></div>
                     </div>
                 </div>
-                <% if (stg_id !== -300) { %>
-                    <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作。</div>
-                <% } else { %>
+                <% if (stg_id === -300) { %>
                     <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作;<b>已选签名的审核时间只对当前变更令有效</b></div>
+                <% } else if (stg_id === -301) { %>
+                    <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作;<b>已选签名的审核时间只对当前变更方案有效</b></div>
+                <% } else { %>
+                    <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作。</div>
                 <% } %>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <% if (stg_id !== -300) { %>
-                    <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiTenders(SELECTED_TENDERS, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
-                <% } else { %>
+                <% if (stg_id === -300) { %>
                     <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiChanges(SELECTED_CHANGES, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
+                <% } else if (stg_id === -301) { %>
+                    <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiOther(SELECTED_OTHER, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
+                <% } else { %>
+                    <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiTenders(SELECTED_TENDERS, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
                 <% } %>
             </div>
         </div>
@@ -1004,6 +1011,25 @@
         $('[data-toggle="tooltip"]').tooltip();
     }
 
+    let SELECTED_OTHER = [];
+    function buildOtherTree(source, keyField = 'id') {
+        let tbDom = $("#batch_tenders_individual");
+        tbDom.empty();
+        let domStrs = [];
+        SELECTED_OTHER = [];
+        domStrs.push('<thead><tr><th width="30%">变更方案编号</th><th>变更方案名称</th><th width="10%">选择</th></tr></thead>');
+        domStrs.push('<tbody>');
+        const report_id = zTreeOprObj.currentNode.refId;
+        for (const s of source) {
+            if (s[keyField] !== BUSINESS_ID && s.status === 3) {
+                domStrs.push(`<tr><td>${s.code}</td><td>${s.name}</td><td><input type="checkbox" onclick="amendChange(this, SELECTED_OTHER, TENDER_ID, '${s[keyField]}', ${report_id})"></td></tr>`);
+            }
+        }
+        domStrs.push('</tbody>');
+        tbDom.append(domStrs.join(''));
+        $('[data-toggle="tooltip"]').tooltip();
+    }
+
     function searchAccount() {
         if (event.keyCode == 13) {
             rptSignatureHelper.buildSelectableAccount(this);