Bläddra i källkod

变更3种的重新审批功能

ellisran 1 år sedan
förälder
incheckning
3bc5dadb7f

+ 18 - 0
app/const/audit.js

@@ -620,6 +620,7 @@ const changeProject = (function() {
     statusString[status.checked] = '审批通过';
     statusString[status.checkNo] = '终止';
     statusString[status.back] = '审批退回';
+    statusString[status.checkAgain] = '重新审批';
     statusString[status.revise] = '修订';
     statusString[status.cancelRevise] = '撤销修订';
     statusString[status.checkCancel] = '撤回';
@@ -630,6 +631,7 @@ const changeProject = (function() {
     statusClass[status.checked] = 'text-success';
     statusClass[status.checkNo] = 'text-danger';
     statusClass[status.back] = 'text-warning';
+    statusClass[status.checkAgain] = 'text-warning';
     statusClass[status.revise] = 'text-warning';
     statusClass[status.cancelRevise] = 'text-success';
     statusClass[status.checkCancel] = 'text-warning';
@@ -642,6 +644,7 @@ const changeProject = (function() {
     auditString[status.checked] = '审批通过';
     auditString[status.checkNo] = '终止';
     auditString[status.back] = '审批退回';
+    auditString[status.checkAgain] = '重新审批';
     auditString[status.revise] = '修订';
     auditString[status.cancelRevise] = '撤销修订';
     auditString[status.checkCancel] = '撤回';
@@ -652,6 +655,7 @@ const changeProject = (function() {
     auditStringClass[status.checked] = 'text-success';
     auditStringClass[status.checkNo] = 'text-danger';
     auditStringClass[status.back] = 'text-warning';
+    auditStringClass[status.checkAgain] = 'text-warning';
     auditStringClass[status.revise] = 'text-warning';
     auditStringClass[status.cancelRevise] = 'text-success';
     auditStringClass[status.checkCancel] = 'text-warning';
@@ -662,6 +666,7 @@ const changeProject = (function() {
     auditProgress[status.checked] = '审批通过';
     auditProgress[status.checkNo] = '终止';
     auditProgress[status.back] = '审批退回';
+    auditProgress[status.checkAgain] = '重新审批';
     auditProgress[status.revise] = '修订中';
     auditProgress[status.cancelRevise] = '撤销修订';
     auditProgress[status.checkCancel] = '撤回';
@@ -672,6 +677,7 @@ const changeProject = (function() {
     auditProgressClass[status.checked] = 'text-success';
     auditProgressClass[status.checkNo] = 'text-danger';
     auditProgressClass[status.back] = 'text-warning';
+    auditProgressClass[status.checkAgain] = 'text-warning';
     auditProgressClass[status.revise] = 'text-warning';
     auditProgressClass[status.cancelRevise] = 'text-success';
     auditProgressClass[status.checkCancel] = 'text-warning';
@@ -729,6 +735,7 @@ const changeApply = (function() {
     statusString[status.checking] = '审批中';
     statusString[status.checked] = '审批通过';
     statusString[status.checkNo] = '审批退回';
+    statusString[status.checkAgain] = '重新审批';
     statusString[status.revise] = '修订';
     statusString[status.cancelRevise] = '撤销修订';
     statusString[status.checkCancel] = '撤回';
@@ -738,6 +745,7 @@ const changeApply = (function() {
     statusClass[status.checking] = 'text-warning';
     statusClass[status.checked] = 'text-success';
     statusClass[status.checkNo] = 'text-warning';
+    statusClass[status.checkAgain] = 'text-warning';
     statusClass[status.revise] = 'text-warning';
     statusClass[status.cancelRevise] = 'text-success';
     statusClass[status.checkCancel] = 'text-warning';
@@ -749,6 +757,7 @@ const changeApply = (function() {
     auditString[status.checking] = '审批中';
     auditString[status.checked] = '审批通过';
     auditString[status.checkNo] = '审批退回';
+    auditString[status.checkAgain] = '重新审批';
     auditString[status.revise] = '修订';
     auditString[status.cancelRevise] = '撤销修订';
     auditString[status.checkCancel] = '撤回';
@@ -758,6 +767,7 @@ const changeApply = (function() {
     auditStringClass[status.checking] = 'text-warning';
     auditStringClass[status.checked] = 'text-success';
     auditStringClass[status.checkNo] = 'text-warning';
+    auditStringClass[status.checkAgain] = 'text-warning';
     auditStringClass[status.revise] = 'text-warning';
     auditStringClass[status.cancelRevise] = 'text-success';
     auditStringClass[status.checkCancel] = 'text-warning';
@@ -767,6 +777,7 @@ const changeApply = (function() {
     auditProgress[status.checking] = '审批中';
     auditProgress[status.checked] = '审批通过';
     auditProgress[status.checkNo] = '审批退回';
+    auditProgress[status.checkAgain] = '重新审批';
     auditProgress[status.revise] = '修订中';
     auditProgress[status.cancelRevise] = '撤销修订';
     auditProgress[status.checkCancel] = '撤回';
@@ -776,6 +787,7 @@ const changeApply = (function() {
     auditProgressClass[status.checking] = 'text-warning';
     auditProgressClass[status.checked] = 'text-success';
     auditProgressClass[status.checkNo] = 'text-warning';
+    auditProgressClass[status.checkAgain] = 'text-warning';
     auditProgressClass[status.revise] = 'text-warning';
     auditProgressClass[status.cancelRevise] = 'text-success';
     auditProgressClass[status.checkCancel] = 'text-warning';
@@ -831,6 +843,7 @@ const changePlan = (function() {
     statusString[status.checking] = '审批中';
     statusString[status.checked] = '审批通过';
     statusString[status.checkNo] = '审批退回';
+    statusString[status.checkAgain] = '重新审批';
     statusString[status.revise] = '修订';
     statusString[status.cancelRevise] = '撤销修订';
     statusString[status.checkCancel] = '撤回';
@@ -840,6 +853,7 @@ const changePlan = (function() {
     statusClass[status.checking] = 'text-warning';
     statusClass[status.checked] = 'text-success';
     statusClass[status.checkNo] = 'text-warning';
+    statusClass[status.checkAgain] = 'text-warning';
     statusClass[status.revise] = 'text-warning';
     statusClass[status.cancelRevise] = 'text-success';
     statusClass[status.checkCancel] = 'text-warning';
@@ -851,6 +865,7 @@ const changePlan = (function() {
     auditString[status.checking] = '审批中';
     auditString[status.checked] = '审批通过';
     auditString[status.checkNo] = '审批退回';
+    auditString[status.checkAgain] = '重新审批';
     auditString[status.revise] = '修订';
     auditString[status.cancelRevise] = '撤销修订';
     auditString[status.checkCancel] = '撤回';
@@ -860,6 +875,7 @@ const changePlan = (function() {
     auditStringClass[status.checking] = 'text-warning';
     auditStringClass[status.checked] = 'text-success';
     auditStringClass[status.checkNo] = 'text-warning';
+    auditStringClass[status.checkAgain] = 'text-warning';
     auditStringClass[status.revise] = 'text-warning';
     auditStringClass[status.cancelRevise] = 'text-success';
     auditStringClass[status.checkCancel] = 'text-warning';
@@ -869,6 +885,7 @@ const changePlan = (function() {
     auditProgress[status.checking] = '审批中';
     auditProgress[status.checked] = '审批通过';
     auditProgress[status.checkNo] = '审批退回';
+    auditProgress[status.checkAgain] = '重新审批';
     auditProgress[status.revise] = '修订中';
     auditProgress[status.cancelRevise] = '撤销修订';
     auditProgress[status.checkCancel] = '撤回';
@@ -878,6 +895,7 @@ const changePlan = (function() {
     auditProgressClass[status.checking] = 'text-warning';
     auditProgressClass[status.checked] = 'text-success';
     auditProgressClass[status.checkNo] = 'text-warning';
+    auditProgressClass[status.checkAgain] = 'text-warning';
     auditProgressClass[status.revise] = 'text-warning';
     auditProgressClass[status.cancelRevise] = 'text-success';
     auditProgressClass[status.checkCancel] = 'text-warning';

+ 156 - 0
app/controller/change_controller.js

@@ -2681,6 +2681,58 @@ module.exports = app => {
         }
 
         /**
+         * 变更立项重新审批
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkProjectAgain(ctx) {
+            try {
+                // 获取终审
+                const auditInfo = await this.ctx.service.changeProjectAudit.getAuditorByStatus(ctx.change.id, audit.changeProject.status.checked);
+                if (ctx.change.status !== audit.changeProject.status.checked || ctx.session.sessionUser.accountId !== auditInfo.aid) {
+                    throw '您无权进行该操作';
+                }
+                // 判断是否被变更申请调用了,是则无法发起修订
+                const projectInfo = await ctx.service.changeApply.getDataByCondition({ tid: ctx.tender.id, project_code: ctx.change.code });
+                if (projectInfo) {
+                    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 result = await ctx.service.changeProjectAudit.checkAgain(ctx.change);
+                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 {Object} ctx - egg全局变量
          * @return {void}
@@ -3402,6 +3454,58 @@ module.exports = app => {
         }
 
         /**
+         * 变更申请重新审批
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkApplyAgain(ctx) {
+            try {
+                // 获取终审
+                const auditInfo = await this.ctx.service.changeApplyAudit.getAuditorByStatus(ctx.change.id, audit.changeApply.status.checked);
+                if (ctx.change.status !== audit.changeApply.status.checked || ctx.session.sessionUser.accountId !== auditInfo.aid) {
+                    throw '您无权进行该操作';
+                }
+                // 判断是否被变更申请调用了,是则无法发起修订
+                const projectInfo = await ctx.service.changePlan.getDataByCondition({ tid: ctx.tender.id, apply_code: ctx.change.code });
+                if (projectInfo) {
+                    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 result = await ctx.service.changeApplyAudit.checkAgain(ctx.change);
+                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 {Object} ctx - egg全局变量
          * @return {void}
@@ -4128,6 +4232,58 @@ module.exports = app => {
         }
 
         /**
+         * 变更申请重新审批
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkPlanAgain(ctx) {
+            try {
+                // 获取终审
+                const auditInfo = await this.ctx.service.changePlanAudit.getAuditorByStatus(ctx.change.id, audit.changePlan.status.checked);
+                if (ctx.change.status !== audit.changePlan.status.checked || ctx.session.sessionUser.accountId !== auditInfo.aid) {
+                    throw '您无权进行该操作';
+                }
+                // 判断是否被变更申请调用了,是则无法发起修订
+                const projectInfo = await ctx.service.change.getDataByCondition({ tid: ctx.tender.id, plan_code: ctx.change.code });
+                if (projectInfo) {
+                    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 result = await ctx.service.changePlanAudit.checkAgain(ctx.change);
+                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 {Object} ctx - egg全局变量
          * @return {void}

+ 1 - 1
app/public/js/change_apply_information.js

@@ -769,7 +769,7 @@ $(document).ready(() => {
         // 数组去重
         dealBillList = result.dealBills;
         changeListData = gclGatherData;
-        console.log(changeListData, dealBillList);
+        // console.log(changeListData, dealBillList);
 
         SpreadJsObj.initSpreadSettingEvents(changeSpreadSetting, changeCol);
         SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting);

+ 3 - 0
app/router.js

@@ -551,6 +551,7 @@ module.exports = app => {
     app.post('/tender/:id/change/project/cancel/audit', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.checkProjectAuditCancel');
     app.post('/tender/:id/change/project/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.checkProjectRevise');
     app.post('/tender/:id/change/project/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.cancelProjectRevise');
+    app.post('/tender/:id/change/project/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.checkProjectAgain');
     // 变更申请
     app.get('/tender/:id/change/apply', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.apply');
     app.get('/tender/:id/change/apply/status/:status', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.applyStatus');
@@ -570,6 +571,7 @@ module.exports = app => {
     app.post('/tender/:id/change/apply/cancel/audit', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.checkApplyAuditCancel');
     app.post('/tender/:id/change/apply/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.checkApplyRevise');
     app.post('/tender/:id/change/apply/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.cancelApplyRevise');
+    app.post('/tender/:id/change/apply/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.checkApplyAgain');
     // 变更方案
     app.get('/tender/:id/change/plan', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.plan');
     app.get('/tender/:id/change/plan/status/:status', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.planStatus');
@@ -589,6 +591,7 @@ module.exports = app => {
     app.post('/tender/:id/change/plan/cancel/audit', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.checkPlanAuditCancel');
     app.post('/tender/:id/change/plan/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.checkPlanRevise');
     app.post('/tender/:id/change/plan/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.cancelPlanRevise');
+    app.post('/tender/:id/change/plan/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.checkPlanAgain');
     // 材料调差
     app.get('/tender/:id/measure/material', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.index');
     app.post('/tender/:id/measure/material/add', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, 'materialController.add');

+ 56 - 0
app/service/change_apply_audit.js

@@ -888,6 +888,62 @@ module.exports = app => {
             }
             return result;
         }
+
+        /**
+         * 重新审批变更申请
+         * @param { string } cid - 查询的清单
+         * @return {Promise<*>} - 可用的变更令列表
+         */
+        async checkAgain(change) {
+            // 初始化事务
+            const time = new Date();
+            const transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                // 获取终审
+                const zsAudit = await this.getAuditorByStatus(change.id, auditConst.status.checked);
+                const lastAudit = await this.getLastAudit(change.id, change.times);
+                const insert_audit_array = [];
+                // 新增2个审批状态到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    caid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 1,
+                    status: auditConst.status.checkAgain,
+                    begin_time: time,
+                    end_time: time,
+                    opinion: '',
+                });
+                // 新增2个审批人到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    caid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 2,
+                    status: auditConst.status.checking,
+                    begin_time: time,
+                });
+                await transaction.insert(this.tableName, insert_audit_array);
+
+                // 设置变更令审批中
+                await transaction.update(this.ctx.service.changeApply.tableName, {
+                    id: change.id,
+                    status: auditConst.status.checking,
+                    notice_code: null,
+                    notice_uid: null,
+                    decimal: null,
+                });
+                await transaction.commit();
+                result = true;
+            } catch (error) {
+                await transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
     }
 
     return ChangeApplyAudit;

+ 72 - 0
app/service/change_plan_audit.js

@@ -951,6 +951,78 @@ module.exports = app => {
             }
             return result;
         }
+
+        /**
+         * 重新审批变更方案
+         * @param { string } cid - 查询的清单
+         * @return {Promise<*>} - 可用的变更令列表
+         */
+        async checkAgain(change) {
+            // 初始化事务
+            const time = new Date();
+            const transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                // 获取终审
+                const zsAudit = await this.getAuditorByStatus(change.id, auditConst.status.checked);
+                const lastAudit = await this.getLastAudit(change.id, change.times);
+                const insert_audit_array = [];
+                // 新增2个审批状态到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    cpid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 1,
+                    status: auditConst.status.checkAgain,
+                    begin_time: time,
+                    end_time: time,
+                    opinion: '',
+                });
+                // 新增2个审批人到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    cpid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 2,
+                    status: auditConst.status.checking,
+                    begin_time: time,
+                });
+                await transaction.insert(this.tableName, insert_audit_array);
+
+                // 设置变更令审批中
+                await transaction.update(this.ctx.service.changePlan.tableName, {
+                    id: change.id,
+                    status: auditConst.status.checking,
+                });
+                // 清除上一人的值并调整spamount值
+                const updateList = [];
+                const changeList = await this.ctx.service.changePlanList.getAllDataByCondition({
+                    where: { cpid: change.id },
+                });
+                for (const cl of changeList) {
+                    const audit_amount = cl.audit_amount.split(',');
+                    const last_amount = audit_amount[audit_amount.length - 1] ? audit_amount[audit_amount.length - 1] : 0;
+                    audit_amount.splice(-1, 1);
+                    const list_update = {
+                        id: cl.id,
+                        audit_amount: audit_amount.join(','),
+                        spamount: parseFloat(last_amount),
+                    };
+                    updateList.push(list_update);
+                }
+                if (updateList.length > 0) await transaction.updateRows(this.ctx.service.changePlanList.tableName, updateList);
+                // 更新total_price
+                await this.ctx.service.changePlanList.calcCamountSum(transaction);
+                await transaction.commit();
+                result = true;
+            } catch (error) {
+                await transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
     }
     return ChangePlanAudit;
 };

+ 53 - 0
app/service/change_project_audit.js

@@ -982,6 +982,59 @@ module.exports = app => {
             }
             return result;
         }
+
+        /**
+         * 重新审批变更立项
+         * @param { string } cid - 查询的清单
+         * @return {Promise<*>} - 可用的变更令列表
+         */
+        async checkAgain(change) {
+            // 初始化事务
+            const time = new Date();
+            const transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                // 获取终审
+                const zsAudit = await this.getAuditorByStatus(change.id, auditConst.status.checked);
+                const lastAudit = await this.getLastAudit(change.id, change.times);
+                const insert_audit_array = [];
+                // 新增2个审批状态到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    cpid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 1,
+                    status: auditConst.status.checkAgain,
+                    begin_time: time,
+                    end_time: time,
+                    opinion: '',
+                });
+                // 新增2个审批人到审批列表中
+                insert_audit_array.push({
+                    tid: change.tid,
+                    cpid: change.id,
+                    aid: zsAudit.aid,
+                    times: zsAudit.times,
+                    order: lastAudit.order + 2,
+                    status: auditConst.status.checking,
+                    begin_time: time,
+                });
+                await transaction.insert(this.tableName, insert_audit_array);
+
+                // 设置变更令审批中
+                await transaction.update(this.ctx.service.changeProject.tableName, {
+                    id: change.id,
+                    status: auditConst.status.checking,
+                });
+                await transaction.commit();
+                result = true;
+            } catch (error) {
+                await transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
     }
 
     return ChangeProjectAudit;

+ 4 - 0
app/view/change/apply_information.ejs

@@ -34,6 +34,10 @@
                         <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批中</a>
                     <% } %>
                 <% } else if (ctx.change.status === auditConst.status.checked) { %>
+                    <% if (ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+                        <!--重新审批-->
+                        <a href="#sp-down-back" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>
+                    <% } %>
                     <% if (ctx.session.sessionUser.accountId === ctx.change.uid) { %>
                         <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-revise" class="btn btn-warning btn-sm mr-2">修订变更</a>
                     <% } %>

+ 90 - 6
app/view/change/apply_information_modal.ejs

@@ -258,7 +258,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -302,7 +302,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -440,7 +440,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -499,7 +499,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -650,7 +650,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -713,7 +713,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -786,6 +786,59 @@
         </div>
     <% } %>
 <% } %>
+<% if (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+    <% 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>
+                    </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/apply/check/again" onsubmit="return false;">
+                    <div class="modal-header">
+                        <h5 class="modal-title">重新审批</h5>
+                    </div>
+                    <div class="modal-body">
+                        <h5>确认由「终审-<%= ctx.change.auditors2[ctx.change.auditors2.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="caid" value="<%= change.id %>">
+                        <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 (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.uid) { %>
     <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
         <!--原报修订变更-->
@@ -913,6 +966,37 @@
         }
     });
 
+    $('#re-shenpi-btn').click(function () {
+        const data = {
+            caid: parseInt('<%- ctx.change.id %>'),
+        };
+        <% if (ctx.session.sessionUser.loginStatus === 0) { %>
+        const code = $("#againForm input[name='code']").val();
+        if ($(this).hasClass('disabled')) {
+            return false;
+        }
+        if (code.length < 6) {
+            // alert('请填写正确的验证码');
+            toastr.error('请填写正确的验证码');
+            return false;
+        }
+        data.code = code;
+        <% } %>
+        $.ajax({
+            url: '/tender/<%- tender.id %>/change/apply/check/again?_csrf_j=' + csrf,
+            type: 'post',
+            data: data,
+            dataTye: 'json',
+            success: function(response) {
+                if (response.err === 0) {
+                    window.location.href = response.url;
+                } else {
+                    toastr.error(response.msg);
+                }
+            }
+        });
+    })
+
     $('#re-shenpi-btn2').click(function () {
         const data = {
             caid: parseInt('<%- ctx.change.id %>'),

+ 4 - 0
app/view/change/plan_information.ejs

@@ -34,6 +34,10 @@
                         <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批中</a>
                     <% } %>
                 <% } else if (ctx.change.status === auditConst.status.checked) { %>
+                    <% if (ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+                        <!--重新审批-->
+                        <a href="#sp-down-back" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>
+                    <% } %>
                     <% if (ctx.session.sessionUser.accountId === ctx.change.uid) { %>
                         <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-revise" class="btn btn-warning btn-sm mr-2">修订变更</a>
                     <% } %>

+ 90 - 6
app/view/change/plan_information_modal.ejs

@@ -250,7 +250,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -294,7 +294,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -432,7 +432,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -483,7 +483,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -626,7 +626,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -689,7 +689,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.checkNo, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -762,6 +762,59 @@
         </div>
     <% } %>
 <% } %>
+<% if (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+    <% 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>
+                    </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/plan/check/again" onsubmit="return false;">
+                    <div class="modal-header">
+                        <h5 class="modal-title">重新审批</h5>
+                    </div>
+                    <div class="modal-body">
+                        <h5>确认由「终审-<%= ctx.change.auditors2[ctx.change.auditors2.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="cpid" value="<%= change.id %>">
+                        <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 (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.uid) { %>
     <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
         <!--原报修订变更-->
@@ -889,6 +942,37 @@
         }
     });
 
+    $('#re-shenpi-btn').click(function () {
+        const data = {
+            cpid: parseInt('<%- ctx.change.id %>'),
+        };
+        <% if (ctx.session.sessionUser.loginStatus === 0) { %>
+        const code = $("#againForm input[name='code']").val();
+        if ($(this).hasClass('disabled')) {
+            return false;
+        }
+        if (code.length < 6) {
+            // alert('请填写正确的验证码');
+            toastr.error('请填写正确的验证码');
+            return false;
+        }
+        data.code = code;
+        <% } %>
+        $.ajax({
+            url: '/tender/<%- tender.id %>/change/plan/check/again?_csrf_j=' + csrf,
+            type: 'post',
+            data: data,
+            dataTye: 'json',
+            success: function(response) {
+                if (response.err === 0) {
+                    window.location.href = response.url;
+                } else {
+                    toastr.error(response.msg);
+                }
+            }
+        });
+    })
+
     $('#re-shenpi-btn2').click(function () {
         const data = {
             cpid: parseInt('<%- ctx.change.id %>'),

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

@@ -31,8 +31,12 @@
                         <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批中</a>
                     <% } %>
                 <% } else if (ctx.change.status === auditConst.status.checked) { %>
+                    <% if (ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+                        <!--重新审批-->
+                        <a href="#sp-down-back" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>
+                    <% } %>
                     <% if (ctx.session.sessionUser.accountId === ctx.change.uid) { %>
-                        <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-revise" class="btn btn-warning btn-sm mr-2">修订变更</a>
+                        <a href="#sp-down-revise" data-toggle="modal" data-target="#sp-down-revise" class="btn btn-warning btn-sm mr-2">修订变更</a>
                     <% } %>
                     <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批完成</a>
                 <% } else if (ctx.change.status === auditConst.status.back || ctx.change.status === auditConst.status.revise) { %>

+ 91 - 7
app/view/change/project_information_modal.ejs

@@ -198,7 +198,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -246,7 +246,7 @@
                                                     <div class="timeline-item-icon bg-success text-light">
                                                         <i class="fa fa-check"></i>
                                                     </div>
-                                                <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                     <div class="timeline-item-icon bg-warning text-light">
                                                         <i class="fa fa-level-up"></i>
                                                     </div>
@@ -388,7 +388,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -445,7 +445,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -594,7 +594,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -661,7 +661,7 @@
                                                             <div class="timeline-item-icon bg-success text-light">
                                                                 <i class="fa fa-check"></i>
                                                             </div>
-                                                        <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
+                                                        <% } else if(ctx.helper._.includes([auditConst.status.back, auditConst.status.revise, auditConst.status.checkCancel, auditConst.status.checkAgain], auditor.status)) {%>
                                                             <div class="timeline-item-icon bg-warning text-light">
                                                                 <i class="fa fa-level-up"></i>
                                                             </div>
@@ -827,6 +827,59 @@
         </div>
     </div>
 </div>
+<% if (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.auditors2[ctx.change.auditors2.length-1].aid) { %>
+    <% 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>
+                    </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/project/check/again" onsubmit="return false;">
+                    <div class="modal-header">
+                        <h5 class="modal-title">重新审批</h5>
+                    </div>
+                    <div class="modal-body">
+                        <h5>确认由「终审-<%= ctx.change.auditors2[ctx.change.auditors2.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="cpid" value="<%= change.id %>">
+                        <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 (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.uid) { %>
     <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
         <!--原报修订变更-->
@@ -948,6 +1001,37 @@
         }
     });
 
+    $('#re-shenpi-btn').click(function () {
+        const data = {
+            cpid: parseInt('<%- ctx.change.id %>'),
+        };
+        <% if (ctx.session.sessionUser.loginStatus === 0) { %>
+        const code = $("#againForm input[name='code']").val();
+        if ($(this).hasClass('disabled')) {
+            return false;
+        }
+        if (code.length < 6) {
+            // alert('请填写正确的验证码');
+            toastr.error('请填写正确的验证码');
+            return false;
+        }
+        data.code = code;
+        <% } %>
+        $.ajax({
+            url: '/tender/<%- tender.id %>/change/project/check/again?_csrf_j=' + csrf,
+            type: 'post',
+            data: data,
+            dataTye: 'json',
+            success: function(response) {
+                if (response.err === 0) {
+                    window.location.href = response.url;
+                } else {
+                    toastr.error(response.msg);
+                }
+            }
+        });
+    })
+
     $('#re-shenpi-btn2').click(function () {
         const data = {
             cpid: parseInt('<%- ctx.change.id %>'),
@@ -959,7 +1043,7 @@
         }
         if (code.length < 6) {
             // alert('请填写正确的验证码');
-            toast('请填写正确的验证码', 'error');
+            toastr.error('请填写正确的验证码');
             return false;
         }
         data.code = code;