浏览代码

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

Tony Kang 10 月之前
父节点
当前提交
3ef7272ae9

+ 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 = {

+ 25 - 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,8 @@ module.exports = app => {
                     source_type: 1,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
+                    otherHintName: '',
                     advanceConst,
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
@@ -511,6 +514,8 @@ module.exports = app => {
                     source_type: 101,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
+                    otherHintName: '',
                 };
                 /*
                 //*/
@@ -661,6 +666,8 @@ module.exports = app => {
                     source_type: 200,
                     bglObj: 'null',
                     changes: 'null',
+                    otherChangeList: 'null',
+                    otherHintName: '',
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
 
@@ -730,6 +737,22 @@ module.exports = app => {
                         break;
                     }
                 }
+
+                let otherChangeList = [], otherHintName = '';
+                switch (stage_id) {
+                    case rptBusiness.BusinessStageId.change_plan:
+                        otherChangeList = await ctx.service.changePlan.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                        otherHintName = '变更方案';
+                        break;
+                    case rptBusiness.BusinessStageId.change_project:
+                        otherChangeList = await ctx.service.changeProject.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                        otherHintName = '变更立项';
+                        break;
+                    case rptBusiness.BusinessStageId.change_apply:
+                        otherChangeList = await ctx.service.changeApply.getListByStatus(tenderId, 0, 0, 0, 0, state);
+                        otherHintName = '变更申请';
+                        break;
+                }
                 let archiveList = [];
                 const archives = await ctx.service.rptArchive.getArchiveByBzId(pid, stage_id, bglObj.BUSINESS_ID);
                 if (archives.length > 0) {
@@ -851,6 +874,8 @@ module.exports = app => {
                     source_type,
                     bglObj: JSON.stringify(bglObj),
                     changes: JSON.stringify(changes),
+                    otherChangeList: JSON.stringify(otherChangeList),
+                    otherHintName,
                     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;
+        }
+
         /**
          * 更新最近使用签名
          *

+ 4 - 3
app/controller/tender_controller.js

@@ -943,8 +943,9 @@ module.exports = app => {
                 return { groupName: item.name, groupList };
             });
             // 获取固定审批流 or 固定终审
-            for (const sp of shenpiConst.sp_lc) {
-                sp.status = ctx.tender.info.shenpi ? ctx.tender.info.shenpi[sp.code] : shenpiConst.sp_status.sqspr;
+            const spConst = ctx.helper._.cloneDeep(shenpiConst);
+            for (const sp of spConst.sp_lc) {
+                sp.status = ctx.tender.info.shenpi ? ctx.tender.info.shenpi[sp.code] : spConst.sp_status.sqspr;
                 if (sp.status === shenpiConst.sp_status.gdspl) {
                     sp.groupList = await ctx.service.shenpiGroup.getGroupList(ctx.tender.id, sp.type) || [];
                     if (sp.groupList && sp.groupList.length > 0) {
@@ -975,7 +976,7 @@ module.exports = app => {
             const cooperationNum = await ctx.service.ledgerCooperation.count({ tid: ctx.tender.id, status: 1 });
 
             const renderData = {
-                shenpi: shenpiConst,
+                shenpi: spConst,
                 accountList,
                 accountGroup: accountGroupList,
                 tenders,

+ 1 - 2
app/public/js/shenpi.js

@@ -1135,16 +1135,15 @@ $(document).ready(function () {
         }
         console.log(prop);
         postData('/tender/' + cur_tenderid + '/shenpi/audit/save', prop, function (data) {
-            console.log(data);
             sp_lc[sp_type[code]].auditGroupList = data.group.auditGroupList || [];
             if (groupId) {
                 const index = sp_lc[sp_type[code]].groupList.findIndex(x => { return x.id === parseInt(groupId); });
                 sp_lc[sp_type[code]].groupList[index] = data.group;
             } else {
+                if (!sp_lc[sp_type[code]].groupList) sp_lc[sp_type[code]].groupList = [];
                 for (const g of sp_lc[sp_type[code]].groupList) {
                     g.is_select = 0;
                 }
-                if (!sp_lc[sp_type[code]].groupList) sp_lc[sp_type[code]].groupList = [];
                 sp_lc[sp_type[code]].groupList.push(data.group);
             }
             // 配置页面

+ 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');

+ 29 - 0
app/service/role_rpt_rel.js

@@ -133,6 +133,17 @@ module.exports = app => {
             return rst;
         }
 
+        async createRoleRela(transaction, data, content) {
+            const insertData = JSON.parse(JSON.stringify(data));
+            insertData.business_type = rptArchiveConst.getBusinessType(sid);
+            insertData.rel_content = JSON.stringify(content);
+            if (transaction) {
+                await transaction.insert(this.tableName, insertData);
+            } else {
+                await this.db.insert(this.tableName, insertData);
+            }
+        }
+
         async createRoleRelationshipFromOtherBz(tender_id, sid, currentBzId, preBzId, cleanSignDate = true) {
             // 此方法适合变更令相关业务
             if (preBzId && currentBzId) {
@@ -229,6 +240,24 @@ module.exports = app => {
             return true;
         }
 
+        async updateMultiOtherRoleRelationship(orgParams, newRelArr) {
+            const conn = await this.db.beginTransaction();
+            try {
+                for (let idx = 0; idx < orgParams.length; idx++) {
+                    const param = orgParams[idx];
+                    // 变更令的参数结构有些不一样
+                    // [tenderId, '-300', changeCid, reportId];
+                    const data = { tender_id: param[0], sid: param[1], business_id: param[2], rpt_id: param[3] };
+                    await conn.delete(this.tableName, data);
+                    await this.createRoleRela(conn, data, newRelArr);
+                }
+                await conn.commit();
+            } catch (ex) {
+                await conn.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 %>;

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

@@ -209,6 +209,12 @@
                 <% 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 ([-301, -302, -303].indexOf(stg_id) >= 0) { %>
+                    <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"
+                            onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv', true); buildOtherTree(ALL_OTHER);">
+                        批量设置其他<%- otherHintName %>
+                    </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 +242,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 ([-301, -302, -303].indexOf(stg_id) >= 0) { %>
+                    <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作;<b>已选签名的审核时间只对当前<%- otherHintName %>有效</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 ([-301, -302, -303].indexOf(stg_id) >= 0) { %>
+                    <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 +1014,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);

+ 2 - 0
app/view/tender/shenpi.ejs

@@ -23,11 +23,13 @@
                                     <div class="form-group">
                                         <div class="form-group form-check">
                                             <% for (const st in shenpi.sp_status_list) { %>
+                                            <% if (shenpi.sp_status_list[st]) { %>
                                                 <div class="custom-control custom-checkbox custom-control-inline">
                                                     <input type="radio" class="custom-control-input" data-code="<%- sp.code %>" value="<%- shenpi.sp_status_list[st].status %>" name="<%- sp.code %>" id="<%- sp.code %>_<%- shenpi.sp_status_list[st].status %>" <%if (sp.status === shenpi.sp_status_list[st].status) { %>checked<% } %>>
                                                     <label class="custom-control-label" for="<%- sp.code %>_<%- shenpi.sp_status_list[st].status %>"><%- shenpi.sp_status_list[st].name %></label>
                                                 </div>
                                             <% } %>
+                                            <% } %>
                                         </div>
                                     </div>
                                     <% if (!shenpi.sp_status_list[sp.status]) console.log(sp) %>