Forráskód Böngészése

变更修订功能

laiguoran 4 éve
szülő
commit
fe31a08dc7

+ 9 - 1
app/const/audit.js

@@ -230,6 +230,7 @@ const status = {
     // checkNo: 4,     // 审批终止
     back: 5, // 重新上报
     backnew: 6, // 退回
+    revise: 9, // 修订变更
 };
 const statusButton = [];
 statusButton[status.uncheck] = '上报';
@@ -238,6 +239,7 @@ statusButton[status.checked] = '';
 // statusButton[status.checkNo] = '';
 statusButton[status.back] = '重新上报';
 statusButton[status.backnew] = '审批';
+statusButton[status.revise] = '修订';
 
 const statusButtonClass = [];
 statusButtonClass[status.uncheck] = 'btn-primary';
@@ -246,6 +248,7 @@ statusButtonClass[status.checked] = '';
 // statusButtonClass[status.checkNo] = '';
 statusButtonClass[status.back] = 'btn-warning';
 statusButtonClass[status.backnew] = 'btn-success';
+statusButtonClass[status.revise] = 'btn-warning';
 
 const statusString = [];
 statusString[status.uncheck] = '未上报';
@@ -254,6 +257,7 @@ statusString[status.checked] = '审批通过';
 // statusString[status.checkNo] = '终止';
 statusString[status.back] = '审批退回';
 statusString[status.backnew] = '审批退回';
+statusString[status.revise] = '修订中';
 
 const statusClass = [];
 statusClass[status.uncheck] = '';
@@ -262,18 +266,20 @@ statusClass[status.checked] = 'text-success';
 // statusClass[status.checkNo] = 'text-danger';
 statusClass[status.back] = 'text-warning';
 statusClass[status.backnew] = 'text-warning';
+statusClass[status.revise] = 'text-warning';
 
 /* ------------------------------------------------------- */
 
 // 变更令审批人状态
 const auditStatus = {
     uncheck: 1, // 待审批
-    checking: 2, // 审批中或者原报人待上报
+    checking: 2, // 审批中或者原报人待上报或者原报上报修订中
     checked: 3, // 审批通过或者原报人上报完成
     // checkNo: 4,     // 审批终止
     back: 5, // 退回到原报人重新上报
     backnew: 6, // 退回到上一个审批人
     checkAgain: 7, // 重新审批
+    revise: 9, // 修订变更
 };
 
 const auditStatusString = [];
@@ -284,6 +290,7 @@ auditStatusString[auditStatus.checked] = '审批通过';
 auditStatusString[auditStatus.back] = '退回';
 auditStatusString[auditStatus.backnew] = '审批退回';
 auditStatusString[auditStatus.checkAgain] = '重新审批';
+auditStatusString[auditStatus.revise] = '待修订';
 
 const auditStatusClass = [];
 auditStatusClass[auditStatus.uncheck] = '';
@@ -293,6 +300,7 @@ auditStatusClass[auditStatus.checked] = 'text-success';
 auditStatusClass[auditStatus.back] = 'text-warning';
 auditStatusClass[auditStatus.backnew] = 'text-warning';
 auditStatusClass[auditStatus.checkAgain] = 'text-warning';
+auditStatusClass[auditStatus.revise] = '';
 
 /* ------------------------------------------------------- */
 

+ 68 - 5
app/controller/change_controller.js

@@ -72,6 +72,11 @@ module.exports = app => {
                             const checkingAudit = await ctx.service.changeAudit.getLastUser(c.cid, c.times, status);
                             auditStatus = checkingAudit.uid === ctx.session.sessionUser.accountId ? 1 : 0;
                             break;
+                        case 9:
+                            auditStatus = 9;
+                            const changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, c.cid);
+                            c.stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.used_qty); }));
+                            break;
                         default:
                             break;
                     }
@@ -299,7 +304,7 @@ module.exports = app => {
                     shenpiConst,
                 };
                 // 根据auditStatus状态获取的不同的数据
-                if (auditStatus === 1 || auditStatus === 2) {
+                if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) {
                     renderData.changeUnits = changeConst.units;
                     renderData.precision = ctx.tender.info.precision;
                     // renderData.accountGroup = accountGroup;
@@ -314,7 +319,7 @@ module.exports = app => {
                         return { groupName: item, groupList };
                     });
                     // 重新上报获取审批流程
-                    if (auditStatus === 2) {
+                    if (auditStatus === 2 || auditStatus === 9) {
                         const auditList2 = await ctx.service.changeAudit.getListByBack(change.cid, change.times);
                         // 展示页右侧审批流程列表
                         const auditList3 = [];
@@ -568,7 +573,7 @@ module.exports = app => {
                     precision: ctx.tender.info.precision,
                 };
                 // 根据auditStatus状态获取的不同的数据
-                if (auditStatus === 1 || auditStatus === 2) {
+                if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) {
                     renderData.changeUnits = changeConst.units;
                     // renderData.accountGroup = accountGroup;
                     // 获取所有项目参与者
@@ -582,7 +587,7 @@ module.exports = app => {
                         return { groupName: item, groupList };
                     });
                     // 重新上报获取审批流程
-                    if (auditStatus === 2) {
+                    if (auditStatus === 2 || auditStatus === 9) {
                         const auditList2 = await ctx.service.changeAudit.getListByBack(change.cid, change.times);
                         // 展示页右侧审批流程列表
                         const auditList3 = [];
@@ -705,6 +710,7 @@ module.exports = app => {
 
                 // 获取是否已存在调用变更令
                 const changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, change.cid);
+                renderData.changeUsedData = changeUsedData;
                 renderData.stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.used_qty); }));
                 await this.layout('change/information.ejs', renderData, 'change/information_modal.ejs');
             } catch (err) {
@@ -747,7 +753,8 @@ module.exports = app => {
                     case 'ledger_list':
                         await ctx.service.changeAuditList.saveLedgerListDatas(data.updateData);
                         // 取所有工料表
-                        responseData.data = await ctx.service.changeAuditList.getList(ctx.change.cid);
+                        responseData.data = { changeList: await ctx.service.changeAuditList.getList(ctx.change.cid),
+                            usedList: await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, ctx.change.cid) };
                         break;
                     case 'remove_list':
                         await ctx.service.changeAuditList.removeLedgerListDatas(data.updateData);
@@ -1291,6 +1298,62 @@ module.exports = app => {
         }
 
         /**
+         * 变更令修订重新上报
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkRevise(ctx) {
+            try {
+                const changeData = await ctx.service.change.getDataByCondition({ cid: ctx.request.body.cid });
+                if (!changeData) {
+                    throw '变更令数据错误';
+                }
+                if (changeData.status !== audit.flow.status.checked || ctx.session.sessionUser.accountId !== changeData.uid) {
+                    throw '您无权进行该操作';
+                }
+                if (ctx.session.sessionUser.loginStatus === 0) {
+                    const code = ctx.request.body.code;
+                    const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                    if (!pa.auth_mobile) {
+                        throw '未绑定手机号';
+                    }
+                    const cacheKey = 'smsCode:' + ctx.session.sessionUser.accountId;
+                    const cacheCode = await app.redis.get(cacheKey);
+                    // console.log(cacheCode);
+                    if (cacheCode === null || code === undefined || cacheCode !== (code + pa.auth_mobile)) {
+                        throw '验证码不正确!';
+                    }
+                }
+
+                // 获取是否已存在调用变更令
+                // const changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, changeData.cid);
+                // const stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.used_qty); }));
+                // if (stageChangeNum !== 0) {
+                //     throw '该变更令已被调用,无法重新审批';
+                // }
+                // 重新审批
+                const result = await ctx.service.change.checkRevise(changeData.cid);
+                if (!result) {
+                    throw '修订发起失败';
+                }
+                // ctx.redirect('/tender/' + changeData.tid + '/change/' + changeData.cid + '/info');
+                ctx.body = {
+                    err: 0,
+                    url: ctx.request.header.referer,
+                    msg: '',
+                };
+            } catch (err) {
+                console.log(err);
+                // ctx.redirect(ctx.request.header.referer);
+                ctx.body = {
+                    err: 1,
+                    // url: ctx.request.header.referer,
+                    msg: err,
+                };
+            }
+        }
+
+        /**
          * 获取变更清单
          * @param ctx
          * @return {Promise<void>}

+ 1 - 1
app/middleware/change_check.js

@@ -44,7 +44,7 @@ module.exports = options => {
                 if (change.curAuditor) {
                     change.readOnly = change.curAuditor.uid !== accountId;
                 } else {
-                    change.readOnly = change.status !== status.uncheck && change.status !== status.back;
+                    change.readOnly = change.status !== status.uncheck && change.status !== status.back && change.status !== status.revise;
                 }
             } else if (this.tender.isTourist) {
                 change.readOnly = true;

+ 16 - 9
app/public/js/change_information_set.js

@@ -143,7 +143,7 @@ $(document).ready(() => {
                 return ZhCalc.round(data.camount, findDecimal(data.unit));
             },
             del_list: function (data) {
-                return '移除';
+                return !_.find(changeUsedData, { id: data.id }) ? '移除' : '';
             }
         },
         readOnly: {
@@ -197,7 +197,7 @@ $(document).ready(() => {
         del: function () {
             const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
             const index = changeList.indexOf(select);
-            if (index > -1) {
+            if (index > -1 && !_.find(changeUsedData, { id: select.id })) {
                 postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) {
                     changeList.splice(index, 1);
                     changeSpreadSheet.deleteRows(index, 1);
@@ -226,7 +226,7 @@ $(document).ready(() => {
             const sel = info.sheet.getSelections()[0];
             const col = info.sheet.zh_setting.cols[sel.col];
             const data = SpreadJsObj.getSelectObject(info.sheet);
-            if (col && col.field === 'del_list') {
+            if (col && col.field === 'del_list' && !_.find(changeUsedData, { id: data.id })) {
                 changeSpreadObj.del();
             }
             changeSpreadObj.resetXmjSpread(data);
@@ -560,14 +560,14 @@ $(document).ready(() => {
                     name: '删除',
                     icon: 'fa-remove',
                     callback: function (key, opt) {
-                        changeSpreadObj.del(changeSpreadSheet);
+                        // changeSpreadObj.del(changeSpreadSheet);
                     },
                     disabled: function (key, opt) {
                         const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
                         const sel = changeSpreadSheet.getSelections()[0];
                         changeSpreadObj.resetXmjSpread(select);
                         console.log(select, sel);
-                        if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
+                        if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1 && !_.find(changeUsedData, { id: select.id })) {
                             return false;
                         } else {
                             return true;
@@ -595,7 +595,9 @@ $(document).ready(() => {
                 gcl = gclGatherData[$(this).data('gcl')];
             }
             codeHtml = '';
+            console.log(changeUsedData);
             for (const leaf of gcl.leafXmjs) {
+                console.log(leaf);
                 const quantity = leaf.quantity !== undefined && leaf.quantity !== null ? leaf.quantity : 0;
                 const gcl_id = leaf.gcl_id ? leaf.gcl_id : '';
                 const bwmx = leaf.bwmx !== undefined ? leaf.bwmx : '';
@@ -605,6 +607,9 @@ $(document).ready(() => {
                     + '!_!' + (leaf.gcl_id ? leaf.gcl_id : '0') + '!_!' +
                     (bwmx !== '' ? bwmx : leaf.jldy ? leaf.jldy : '') + '*;*' + quantity) !== -1 && isCheck ?
                     'checked' : '';
+                const isUsed = _.find(changeUsedData, { gcl_id: leaf.gcl_id, bwmx: leaf.bwmx });
+                console.log(isUsed);
+                const isDisabled = isUsed ? 'disabled ' : '';
                 codeHtml += '<tr quantity="' + quantity + '" gcl_id="' + gcl_id + '"><td>' + leaf.code + '</td>' +
                     '<td>' + (leaf.jldy ? leaf.jldy: '') + '</td>' +
                     '<td>' + (leaf.dwgc ? leaf.dwgc : '') + '</td>' +
@@ -612,7 +617,7 @@ $(document).ready(() => {
                     '<td>' + (leaf.fxgc ? leaf.fxgc : '') + '</td>' +
                     '<td>' + bwmx + '</td>' +
                     '<td class="text-right">' + (ZhCalc.round(quantity, findDecimal(gcl.unit)) ? ZhCalc.round(quantity, findDecimal(gcl.unit)) : 0) + '</td>' +
-                    '<td class="text-center"><input type="checkbox"' + isChecked +
+                    '<td class="text-center"><input type="checkbox" ' + isDisabled + isChecked +
                     '></td></tr>';
             }
         } else if (!isDeal && isCheck) {
@@ -686,7 +691,8 @@ $(document).ready(() => {
         const newLedgerList = remakeChangeSpread();
         // 更新至服务器
         postData(window.location.pathname + '/save', { type:'ledger_list', updateData: newLedgerList }, function (result) {
-            changeList = result;
+            changeList = result.changeList;
+            changeUsedData = result.usedList;
             SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
             changeSpreadObj.makeSjsFooter();
             const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
@@ -898,7 +904,7 @@ function tableDataRemake(changeListData) {
                     let pushbwmx = '0*;*0';
                     if (listinfo.leafXmjs !== undefined) {
                         const leafInfo = listinfo.leafXmjs.find(function (item) {
-                            return (item.bwmx === undefined || item.bwmx === clinfo.bwmx) && item.code === clinfo.xmj_code && (item.quantity !== null ? item.quantity === parseFloat(clinfo.oamount) : 0 === parseFloat(clinfo.oamount));
+                            return (item.bwmx === undefined || item.bwmx === clinfo.bwmx) && item.gcl_id === clinfo.gcl_id && item.code === clinfo.xmj_code && (item.quantity !== null ? item.quantity === parseFloat(clinfo.oamount) : 0 === parseFloat(clinfo.oamount));
                         });
                         if (leafInfo) {
                             pushbwmx = leafInfo.code + '!_!' + (leafInfo.jldy !== undefined ? leafInfo.jldy : '') + '!_!' +
@@ -928,8 +934,9 @@ function tableDataRemake(changeListData) {
                     $('#table-list-select tr[data-lid="'+ clinfo.lid +'"]').addClass('table-success');
                     let pushbwmx = '0*;*0';
                     if (listinfo.leafXmjs !== undefined) {
+                        console.log(listinfo.leafXmjs, clinfo);
                         const leafInfo = listinfo.leafXmjs.find(function (item) {
-                            return (item.bwmx === undefined || item.bwmx === clinfo.bwmx || item.jldy === clinfo.bwmx) && item.code === clinfo.xmj_code && (item.quantity !== null ? item.quantity === parseFloat(clinfo.oamount) : 0 === parseFloat(clinfo.oamount));
+                            return (item.bwmx === undefined || item.bwmx === clinfo.bwmx || item.jldy === clinfo.bwmx) && item.gcl_id === clinfo.gcl_id && item.code === clinfo.xmj_code && (item.quantity !== null ? item.quantity === parseFloat(clinfo.oamount) : 0 === parseFloat(clinfo.oamount));
                         });
                         if (leafInfo) {
                             pushbwmx = leafInfo.code + '!_!' + (leafInfo.jldy !== undefined ? leafInfo.jldy : '') + '!_!' +

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

@@ -203,7 +203,8 @@ $(document).ready(() => {
                 if (response.err === 0) {
                     codeSuccess(btn);
                     $("input[name='code']").removeAttr('readonly');
-                    $("#re-shenpi-btn").removeAttr('disabled');
+                    // $("#re-shenpi-btn").removeAttr('disabled');
+                    $("#re-shenpi-btn2").removeAttr('disabled');
                 } else {
                     toast(response.msg, 'error');
                 }

+ 1 - 0
app/router.js

@@ -347,6 +347,7 @@ module.exports = app => {
 
     app.post('/tender/:id/change/approval', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.approval');
     app.post('/tender/:id/change/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.checkAgain');
+    app.post('/tender/:id/change/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.checkRevise');
 
     app.post('/tender/:id/change/:cid/check/codeRepeat', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.checkCodeRepeat');
     app.post('/tender/:id/change/:cid/info/copy', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.copyChange');

+ 92 - 4
app/service/change.js

@@ -253,17 +253,18 @@ module.exports = app => {
                         sql = 'SELECT a.* FROM ?? as a WHERE cid in(SELECT b.cid FROM ?? as b WHERE tid = ? AND uid = ? AND status = ?) ORDER BY in_time DESC';
                         sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName, tenderId, this.ctx.session.sessionUser.accountId, audit.flow.auditStatus.checking];
                         break;
-                    case 5: // 待上报(所有的)PS:取未上报和退回的变更令
+                    case 5: // 待上报(所有的)PS:取未上报,退回,修订的变更令
                         sql =
                             'SELECT a.* FROM ?? AS a WHERE ' +
                             'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid) AND ' +
-                            '(a.status = ? OR a.status = ?) AND a.tid = ? ORDER BY a.in_time DESC';
+                            '(a.status = ? OR a.status = ? OR a.status = ?) AND a.tid = ? ORDER BY a.in_time DESC';
                         sqlParam = [
                             this.tableName,
                             this.ctx.service.changeAudit.tableName,
                             this.ctx.session.sessionUser.accountId,
                             audit.flow.status.uncheck,
                             audit.flow.status.back,
+                            audit.flow.status.revise,
                             tenderId,
                         ];
                         break;
@@ -326,17 +327,18 @@ module.exports = app => {
                         uid: this.ctx.session.sessionUser.accountId,
                         status: 2,
                     });
-                case 5: // 待上报(所有的)PS:取未上报和退回的变更令
+                case 5: // 待上报(所有的)PS:取未上报,退回,修订的变更令
                     const sql2 =
                         'SELECT count(*) AS count FROM ?? AS a WHERE ' +
                         'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? AND a.times = b.times GROUP BY b.cid) ' +
-                        'AND (a.status = ? OR a.status = ?) AND a.tid = ?';
+                        'AND (a.status = ? OR a.status = ? OR a.status = ?) AND a.tid = ?';
                     const sqlParam2 = [
                         this.tableName,
                         this.ctx.service.changeAudit.tableName,
                         this.ctx.session.sessionUser.accountId,
                         audit.flow.status.uncheck,
                         audit.flow.status.back,
+                        audit.flow.status.revise,
                         tenderId,
                     ];
                     const result2 = await this.db.query(sql2, sqlParam2);
@@ -1191,6 +1193,92 @@ module.exports = app => {
          * @param { string } cid - 查询的清单
          * @return {Promise<*>} - 可用的变更令列表
          */
+        async checkRevise(cid) {
+            // 初始化事务
+            this.transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                const changeData = await this.getDataByCondition({ cid });
+                const pid = this.ctx.session.sessionProject.id;
+                // 获取所有审核人列表
+                const auditors = await this.ctx.service.changeAudit.getAllAuditors(changeData.tid);
+                // 添加到消息推送表
+                const noticeContent = await this.getNoticeContent(pid, changeData.tid, changeData.cid, this.ctx.session.sessionUser.accountId);
+                const records = [];
+                auditors.forEach(auditor => {
+                    records.push({
+                        pid,
+                        type: pushType.change,
+                        uid: auditor.uid,
+                        status: audit.flow.status.revise,
+                        content: noticeContent,
+                    });
+                });
+                await this.transaction.insert('zh_notice', records);
+
+                // 新增新一次的审批人列表
+                // 获取当前次数审批人列表
+                const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(changeData.cid, changeData.times);
+                const lastauditInfo = await this.ctx.service.changeAudit.getLastUser(changeData.cid, changeData.times, 1, 0);
+                let usort = lastauditInfo.usort + 1;
+                const newTimes = changeData.times + 1;
+                const insert_audit_array = [];
+                for (const al of auditList) {
+                    const insert_audit = {
+                        tid: al.tid,
+                        cid: al.cid,
+                        uid: al.uid,
+                        name: al.name,
+                        jobs: al.jobs,
+                        company: al.company,
+                        times: newTimes,
+                        usite: al.usite,
+                        usort,
+                        status: al.usite !== 0 ? audit.flow.auditStatus.uncheck : audit.flow.auditStatus.checking,
+                    };
+                    insert_audit_array.push(insert_audit);
+                    usort++;
+                }
+                await this.transaction.insert(this.ctx.service.changeAudit.tableName, insert_audit_array);
+                // 变更金额也退回
+                const changeList = await this.ctx.service.changeAuditList.getAllDataByCondition({
+                    where: { cid: changeData.cid },
+                });
+                let total_price = 0;
+                const tp_decimal = changeData.tp_decimal ? changeData.tp_decimal : this.ctx.tender.info.decimal.tp;
+                for (const cl of changeList) {
+                    total_price = this.ctx.helper.add(total_price, this.ctx.helper.mul(cl.unit_price, cl.camount, tp_decimal));
+                }
+                // 设置变更令修订状态
+                const change_update = {
+                    w_code: changeData.w_code,
+                    status: audit.flow.status.revise,
+                    times: newTimes,
+                    cin_time: Date.parse(new Date()) / 1000,
+                    total_price,
+                    tp_decimal: null,
+                };
+                const options = {
+                    where: {
+                        cid: changeData.cid,
+                    },
+                };
+                await this.transaction.update(this.tableName, change_update, options);
+
+                await this.transaction.commit();
+                result = true;
+            } catch (error) {
+                await this.transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
+
+        /**
+         * 重新审批变更令
+         * @param { string } cid - 查询的清单
+         * @return {Promise<*>} - 可用的变更令列表
+         */
         async checkAgain(cid) {
             // 初始化事务
             this.transaction = await this.db.beginTransaction();

+ 4 - 0
app/service/change_audit.js

@@ -116,6 +116,9 @@ module.exports = app => {
             } else if (change.status === statusConst.back && uid === change.uid) {
                 // 待重新上报
                 return 2;
+            } else if (change.status === statusConst.revise && uid === change.uid) {
+                // 修订上报
+                return 9;
             } else if (change.status === statusConst.back && uid !== change.uid) {
                 // 被退回但你不是原报人
                 return 3;
@@ -151,6 +154,7 @@ module.exports = app => {
             switch (status) {
                 case 1:// 待上报
                 case 2:// 待重新上报
+                case 9:// 待修订
                     sql = 'SELECT * FROM ?? WHERE ' +
                         'cid = ? AND times = ? GROUP BY usite';
                     sqlParam = [this.tableName, change.cid,

+ 26 - 0
app/service/change_audit_list.js

@@ -210,6 +210,9 @@ module.exports = app => {
             // 判断t_type是否为费用
             const transaction = await this.db.beginTransaction();
             try {
+                const sql1 = 'SELECT a.* FROM ?? as b LEFT JOIN ?? as a ON b.cbid = a.id WHERE b.cid = ? GROUP BY b.cbid';
+                const sqlParam1 = [this.ctx.service.stageChange.tableName, this.tableName, this.ctx.change.cid];
+                const usedList = await transaction.query(sql1, sqlParam1);
                 // 先删除原本的台账清单数据
                 const sql = 'DELETE FROM ?? WHERE cid = ? and lid != "0"';
                 const sqlParam = [this.tableName, this.ctx.change.cid];
@@ -224,6 +227,29 @@ module.exports = app => {
                 }
                 if (insertDatas.length > 0) await transaction.insert(this.tableName, insertDatas);
                 await this.calcCamountSum(transaction);
+                // 更新stage_change和stage_change_final的cbid
+                if (usedList.length > 0) {
+                    const updateList = [];
+                    const newList = await transaction.select(this.tableName, { where: { cid: this.ctx.change.cid } });
+                    for (const used of usedList) {
+                        const newone = this._.find(newList, { code: used.code, lid: used.lid, gcl_id: used.gcl_id, bwmx: used.bwmx });
+                        if (newone) {
+                            updateList.push({
+                                row: {
+                                    cbid: newone.id,
+                                },
+                                where: {
+                                    cid: this.ctx.change.cid,
+                                    cbid: used.id,
+                                },
+                            });
+                        }
+                    }
+                    if (updateList.length > 0) {
+                        await transaction.updateRows(this.ctx.service.stageChange.tableName, updateList);
+                        await transaction.updateRows(this.ctx.service.stageChangeFinal.tableName, updateList);
+                    }
+                }
                 await transaction.commit();
                 return true;
             } catch (err) {

+ 1 - 1
app/service/stage_change.js

@@ -328,7 +328,7 @@ module.exports = app => {
 
         async getFinalUsedData(tid, cid) {
             const sql = 'SELECT c.lid, c.pid, SUM(c.qty) as used_qty,' +
-                '    cb.tid, cb.cid, cb.id, cb.code, cb.name, cb.unit, cb.unit_price, cb.detail, cb.samount' +
+                '    cb.tid, cb.cid, cb.id, cb.code, cb.name, cb.unit, cb.unit_price, cb.detail, cb.samount, cb.bwmx, cb.gcl_id' +
                 '  FROM ' + this.ctx.service.changeAuditList.tableName + ' As cb' +
                 '  LEFT JOIN ' + this.tableName + ' As c ON cb.id = c.cbid ' +
                 '  INNER JOIN (' +

+ 5 - 1
app/view/change/index.ejs

@@ -67,13 +67,17 @@
                         <td>
                             待上报
                         </td>
+                        <% } else if (c.status === auditConst.status.revise) { %>
+                            <td>
+                                待修订
+                            </td>
                         <% } else { %>
                         <td>
                             <%- c.changeAudit.name %>-<%- c.changeAudit.jobs %>
                             <span class="<%- auditConst.auditStatusClass[c.changeAudit.status] %>"><%- auditConst.auditStatusString[c.changeAudit.status] %></span>
                         </td>
                         <% } %>
-                        <td><% if ((c.status === auditConst.status.uncheck || (c.status === auditConst.status.back && c.uid === uid)) && !ctx.tender.isTourist) { %><a href="#del-bg" cid="<%= c.cid %>" data-toggle="modal" data-target="#del-bg" class="btn btn-outline-danger btn-sm delete-cid-modal">删除</a><% } %></td>
+                        <td><% if ((c.status === auditConst.status.uncheck || ((c.status === auditConst.status.back || (c.status === auditConst.status.revise && c.stageChangeNum === 0)) && c.uid === uid)) && !ctx.tender.isTourist) { %><a href="#del-bg" cid="<%= c.cid %>" data-toggle="modal" data-target="#del-bg" class="btn btn-outline-danger btn-sm delete-cid-modal">删除</a><% } %></td>
                     </tr>
                     <% } %>
                     </tbody>

+ 12 - 8
app/view/change/information.ejs

@@ -4,12 +4,12 @@
         <div class="title-main d-flex"><!--工具-->
             <% include ../tender/tender_sub_mini_menu.ejs %>
             <div>
-                <% if(auditStatus === auditConst.status.uncheck || auditStatus === auditConst.status.back) { %>
+                <% if(auditStatus === auditConst.status.uncheck || auditStatus === auditConst.status.back || auditStatus === auditConst.status.revise) { %>
                     <div class="d-inline-block">
                         <a class="btn btn-sm btn-primary" href="#add-bj" data-toggle="modal" data-target="#add-bj">拷贝其他变更令数据</a>
                     </div>
                 <% } %>
-                <% if (auditStatus === 1 || auditStatus === 2) { %>
+                <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                     <div class="d-inline-block">
                         <a href="#addlist" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="open-list-modal" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> 添加台账清单</a>
                     </div>
@@ -36,7 +36,7 @@
                 <!--info状态区分-->
                 <% if (auditStatus === 1) { %>
                     <a href="#sub-ap" data-category="up_change" data-toggle="modal" data-target="#sub-ap" class="btn btn-primary btn-sm">上报审批</a>
-                <% } else if (auditStatus === 2) { %>
+                <% } else if (auditStatus === 2 || auditStatus === 9) { %>
                     <a href="#sub-sp2" data-category="up_change" data-toggle="modal" data-target="#sub-sp2" class="btn btn-primary btn-sm">重新上报</a>
                 <% } else if (auditStatus === 3) { %>
                     <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm text-muted">审批退回</a>
@@ -59,14 +59,17 @@
                 <% if (auditStatus === 4 && ctx.session.sessionUser.accountId === auditList[auditList.length-1].uid) { %>
                     <% if (stageChangeNum === 0) { %>
                         <!--重新审批-->
-                        <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>
+                        <!--<a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>-->
                     <% } else { %>
-                        <button class="btn btn-outline-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="已被调用">重新审批</button>
+                        <!--<button class="btn btn-outline-secondary btn-sm" data-toggle="tooltip" data-placement="bottom" title="已被调用">重新审批</button>-->
                     <% } %>
                 <% } %>
+                <% if (auditStatus === 4 && ctx.session.sessionUser.accountId === change.uid) { %>
+                    <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-revise" class="btn btn-warning btn-sm">修订变更</a>
+                <% } %>
             </div>
             <!--info状态区分-->
-            <% if (auditStatus === 1 || auditStatus === 2) { %>
+            <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                 <div class="ml-auto px-4" id="show-save-btn" style="display: none">
                     <span>您修改了变更信息,记得保存修改。</span>
                     <button class="btn btn-sm btn-primary save_change_btn" id="save_change"><i class="fa fa-save"></i> 保存修改</button>
@@ -103,7 +106,7 @@
                 <div class="tab-content">
                     <div class="tab-pane active" id="bgxinxi">
                         <div class="sjs-sh-1" style="overflow-y: auto;">
-                            <% if (auditStatus === 1 || auditStatus === 2) { %>
+                            <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                             <form class="p-2" action="/tender/<%- change.tid %>/change/<%- change.cid %>/information/save?_csrf_j=<%= ctx.csrf %>" method="post" id="change_form">
                                 <div class="form-group">
                                     <label><b class="text-danger">*&nbsp;</b>申请编号</label>
@@ -404,7 +407,7 @@
     const style1 = new GC.Spread.Sheets.Style();
     style1.locked = true;
 </script>
-<% if (auditStatus === 1 || auditStatus === 2) { %>
+<% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
 <script>
     let changeUnits = JSON.parse('<%- JSON.stringify(changeUnits) %>');
     changeUnits = _.map(changeUnits, 'unit');
@@ -435,6 +438,7 @@
         w_code: '<%- change.w_code %>',
     };
     let changeInfo = Object.assign({}, back_changeInfo);
+    let changeUsedData = JSON.parse(unescape('<%- escape(JSON.stringify(changeUsedData)) %>'));
 </script>
 <script src="/public/js/change_information_set.js"></script>
 <script src="/public/js/change_audit.js"></script>

+ 131 - 47
app/view/change/information_modal.ejs

@@ -1,4 +1,4 @@
-<% if (auditStatus === 1 || auditStatus === 2) { %>
+<% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
 <!--变更单位-->
 <div class="modal fade" id="editcompany" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
     <div class="modal-dialog" role="document">
@@ -153,7 +153,7 @@
     </div>
 </div>
 
-<% if (auditStatus === 2) { %>
+<% if (auditStatus === 2 || auditStatus === 9) { %>
     <!--重新上报-->
     <div class="modal fade" id="sub-sp2" data-backdrop="static">
         <div class="modal-dialog modal-lg" role="document">
@@ -926,56 +926,109 @@
 </div>
 <% if (auditStatus === 4 && ctx.session.sessionUser.accountId === auditList[auditList.length-1].uid && stageChangeNum === 0) { %>
 <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
-    <!--终审重新审批-->
-    <div class="modal fade" id="sp-down-back" data-backdrop="static">
-        <div class="modal-dialog" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h5 class="modal-title">重新审批</h5>
-                </div>
-                <div class="modal-body">
-                    <h5>重新审批需要您的手机短信验证</h5>
-                    <h5>您目前还没设置认证手机,请先设置。</h5>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                    <a href="/profile/sms" class="btn btn-sm btn-primary">去设置</a>
+    <!--&lt;!&ndash;终审重新审批&ndash;&gt;-->
+    <!--<div class="modal fade" id="sp-down-back" data-backdrop="static">-->
+        <!--<div class="modal-dialog" role="document">-->
+            <!--<div class="modal-content">-->
+                <!--<div class="modal-header">-->
+                    <!--<h5 class="modal-title">重新审批</h5>-->
+                <!--</div>-->
+                <!--<div class="modal-body">-->
+                    <!--<h5>重新审批需要您的手机短信验证</h5>-->
+                    <!--<h5>您目前还没设置认证手机,请先设置。</h5>-->
+                <!--</div>-->
+                <!--<div class="modal-footer">-->
+                    <!--<button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>-->
+                    <!--<a href="/profile/sms" class="btn btn-sm btn-primary">去设置</a>-->
+                <!--</div>-->
+            <!--</div>-->
+        <!--</div>-->
+    <!--</div>-->
+<!--<% } else { %>-->
+    <!--&lt;!&ndash;重新审批&ndash;&gt;-->
+<!--<div class="modal fade" id="sp-down-back" data-backdrop="static">-->
+    <!--<div class="modal-dialog" role="document">-->
+        <!--<form id="againForm" class="modal-content" method="post" action="/tender/<%- tender.id %>/change/check/again" onsubmit="return false;">-->
+            <!--<div class="modal-header">-->
+                <!--<h5 class="modal-title">重新审批</h5>-->
+            <!--</div>-->
+            <!--<div class="modal-body">-->
+                <!--<h5>确认由「终审-<%= auditList[auditList.length-1].name %>」重新审批「<%= change.code %>」?</h5>-->
+                <!--<% if (ctx.session.sessionUser.loginStatus === 0) { %>-->
+                <!--<div class="form-group">-->
+                    <!--<label>重审需要验证码确认,验证码将发送至尾号<%- authMobile.slice(-4) %>的手机</label>-->
+                    <!--<div class="input-group input-group-sm mb-3">-->
+                        <!--<input class="form-control" type="text" readonly="readonly" name="code" placeholder="输入短信中的6位验证码" />-->
+                        <!--<div class="input-group-append">-->
+                            <!--<button class="btn btn-outline-secondary" type="button" id="get-code">获取验证码</button>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                <!--</div>-->
+                <!--<% } %>-->
+            <!--</div>-->
+            <!--<div class="modal-footer">-->
+                <!--<input type="hidden" name="cid" value="<%= change.cid %>">-->
+                <!--<input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />-->
+                <!--<button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>-->
+                <!--<button type="button" id="re-shenpi-btn" class="btn btn-warning btn-sm" <% if (ctx.session.sessionUser.loginStatus === 0) { %>disabled<% } %>>确定重审</button>-->
+            <!--</div>-->
+        <!--</form>-->
+    <!--</div>-->
+<!--</div>-->
+<% } %>
+<% } %>
+<% if (auditStatus === 4 && ctx.session.sessionUser.accountId === change.uid) { %>
+    <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
+        <!--原报修订变更-->
+        <div class="modal fade" id="sp-down-revise" data-backdrop="static">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">修订变更</h5>
+                    </div>
+                    <div class="modal-body">
+                        <h5>修订变更需要您的手机短信验证</h5>
+                        <h5>您目前还没设置认证手机,请先设置。</h5>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                        <a href="/profile/sms" class="btn btn-sm btn-primary">去设置</a>
+                    </div>
                 </div>
             </div>
         </div>
-    </div>
-<% } else { %>
-    <!--重新审批-->
-<div class="modal fade" id="sp-down-back" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <form id="againForm" class="modal-content" method="post" action="/tender/<%- tender.id %>/change/check/again" onsubmit="return false;">
-            <div class="modal-header">
-                <h5 class="modal-title">重新审批</h5>
-            </div>
-            <div class="modal-body">
-                <h5>确认由「终审-<%= auditList[auditList.length-1].name %>」重新审批「<%= change.code %>」?</h5>
-                <% if (ctx.session.sessionUser.loginStatus === 0) { %>
-                <div class="form-group">
-                    <label>重审需要验证码确认,验证码将发送至尾号<%- authMobile.slice(-4) %>的手机</label>
-                    <div class="input-group input-group-sm mb-3">
-                        <input class="form-control" type="text" readonly="readonly" name="code" placeholder="输入短信中的6位验证码" />
-                        <div class="input-group-append">
-                            <button class="btn btn-outline-secondary" type="button" id="get-code">获取验证码</button>
-                        </div>
+    <% } else { %>
+        <!--修订变更-->
+        <div class="modal fade" id="sp-down-revise" data-backdrop="static">
+            <div class="modal-dialog" role="document">
+                <form id="reviseForm" class="modal-content" method="post" action="/tender/<%- tender.id %>/change/check/revise" onsubmit="return false;">
+                    <div class="modal-header">
+                        <h5 class="modal-title">修订变更</h5>
                     </div>
-                </div>
-                <% } %>
-            </div>
-            <div class="modal-footer">
-                <input type="hidden" name="cid" value="<%= change.cid %>">
-                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
-                <button type="button" id="re-shenpi-btn" class="btn btn-warning btn-sm" <% if (ctx.session.sessionUser.loginStatus === 0) { %>disabled<% } %>>确定重审</button>
+                    <div class="modal-body">
+                        <h5>确认需要修订变更「<%= change.code %>」?</h5>
+                        <% if (ctx.session.sessionUser.loginStatus === 0) { %>
+                            <div class="form-group">
+                                <label>修订需要验证码确认,验证码将发送至尾号<%- authMobile.slice(-4) %>的手机</label>
+                                <div class="input-group input-group-sm mb-3">
+                                    <input class="form-control" type="text" readonly="readonly" name="code" placeholder="输入短信中的6位验证码" />
+                                    <div class="input-group-append">
+                                        <button class="btn btn-outline-secondary" type="button" id="get-code">获取验证码</button>
+                                    </div>
+                                </div>
+                            </div>
+                        <% } %>
+                    </div>
+                    <div class="modal-footer">
+                        <input type="hidden" name="cid" value="<%= change.cid %>">
+                        <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
+                        <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+                        <button type="button" id="re-shenpi-btn2" class="btn btn-warning btn-sm" <% if (ctx.session.sessionUser.loginStatus === 0) { %>disabled<% } %>>确定修订</button>
+                    </div>
+                </form>
             </div>
-        </form>
-    </div>
-</div>
-<% } %>
+        </div>
+    <% } %>
 <% } %>
 
 <div class="modal fade" id="warning-ledger" data-backdrop="static">
@@ -1097,4 +1150,35 @@
             }
         });
     })
+
+    $('#re-shenpi-btn2').click(function () {
+        const data = {
+            cid: '<%- change.cid %>',
+        };
+        <% if (ctx.session.sessionUser.loginStatus === 0) { %>
+        const code = $("#reviseForm input[name='code']").val();
+        if ($(this).hasClass('disabled')) {
+            return false;
+        }
+        if (code.length < 6) {
+            // alert('请填写正确的验证码');
+            toast('请填写正确的验证码', 'error');
+            return false;
+        }
+        data.code = code;
+        <% } %>
+        $.ajax({
+            url: '/tender/<%- tender.id %>/change/check/revise?_csrf_j=' + csrf,
+            type: 'post',
+            data: data,
+            dataTye: 'json',
+            success: function(response) {
+                if (response.err === 0) {
+                    window.location.href = response.url;
+                } else {
+                    toast(response.msg, 'error');
+                }
+            }
+        });
+    })
 </script>