Browse Source

审批管理内容

laiguoran 5 years ago
parent
commit
01e722e0d5

+ 14 - 5
app/controller/measure_controller.js

@@ -243,14 +243,23 @@ module.exports = app => {
                 const stage_highOrder = await ctx.service.stage.count({
                     tid: ctx.tender.id,
                 });
-                if (stageInfo === undefined || ctx.session.sessionUser.accountId !== stageInfo.user_id || stage_highOrder !== stageInfo.order) {
+
+                if (ctx.request.body.confirm !== undefined && ctx.request.body.confirm !== '确认删除本期') {
+                    throw '请输入正确的文本信息';
+                }
+                if (stageInfo && (ctx.session.sessionUser.accountId !== stageInfo.user_id || (ctx.session.sessionUser.is_admin && ctx.request.body.confirm === '确认删除本期')) && stage_highOrder === stageInfo.order) {
+                    const result = await ctx.service.stage.deleteStage(stage_id);
+                    if (!result) {
+                        throw '删除计量期失败,请重试';
+                    }
+                } else {
                     throw '您无权删除计量期';
                 }
-                const result = await ctx.service.stage.deleteStage(stage_id);
-                if (!result) {
-                    throw '删除计量期失败,请重试';
+                if (ctx.request.body.stage_order !== undefined && parseInt(ctx.request.body.stage_order) !== stage_highOrder) {
+                    ctx.redirect(ctx.request.header.referer);
+                } else {
+                    ctx.redirect('/tender/' + ctx.tender.id + '/measure/stage/');
                 }
-                ctx.redirect('/tender/' + ctx.tender.id + '/measure/stage/');
             } catch (err) {
                 this.log(err);
                 console.log(err);

+ 38 - 4
app/controller/stage_controller.js

@@ -1062,7 +1062,11 @@ module.exports = app => {
                     throw '台账修订中,请勿修改提交期数据';
                 }
 
-                if (ctx.stage.auditors[ctx.stage.auditors.length - 1].aid === ctx.session.sessionUser.accountId && ctx.stage.status === auditConst.status.checked && ctx.stage.order === ctx.stage.highOrder) {
+                if (ctx.query.confirm !== undefined && ctx.query.confirm !== '确认设置终审审批') {
+                    throw '请输入正确的文本信息';
+                }
+
+                if ((ctx.stage.auditors[ctx.stage.auditors.length - 1].aid === ctx.session.sessionUser.accountId || (ctx.query.confirm === '确认设置终审审批' && ctx.session.sessionUser.is_admin)) && ctx.stage.status === auditConst.status.checked && ctx.stage.order === ctx.stage.highOrder) {
                     await ctx.service.stageAudit.checkAgain(ctx.stage.id, ctx.stage.times);
                     ctx.redirect(ctx.request.header.referer);
                 } else {
@@ -1575,23 +1579,53 @@ module.exports = app => {
                 await this._getStageAuditViewData(ctx);
                 const renderData = await this._getDefaultRenderData(ctx);
                 // 获取已完成期审批列表
-                const lastStage = await ctx.service.stage.getLastestStage(ctx.tender.id);
+                const lastStage = await ctx.service.stage.getLastestStage(ctx.tender.id, true);
                 const auditList = [];
-                if (lastStage && lastStage.status === auditConst.status.checked) {
+                if (lastStage) {
                     renderData.lastStageUser = await ctx.service.projectAccount.getDataById(lastStage.user_id);
-                    for (let i = lastStage.times; i > 0; i--) {
+                    const times = lastStage.status !== auditConst.status.checkNo ? lastStage.times : lastStage.times - 1;
+                    for (let i = times; i > 0; i--) {
                         const timeAuditList = await ctx.service.stageAudit.getAuditors(lastStage.id, i, 'desc');
                         auditList.push(timeAuditList);
                     }
                 }
                 renderData.lastStage = lastStage;
                 renderData.lastAuditList = auditList;
+                renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.stage.manager);
                 await this.layout('stage/manager.ejs', renderData, 'stage/manager_modal.ejs');
             } catch (err) {
                 this.log(err);
                 ctx.redirect('/tender/' + ctx.tender.id + '/measure/stage');
             }
         }
+
+        /**
+         * 删除本次审批 - 期审批管理页面
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async managerAuditDelete(ctx) {
+            try {
+                if (ctx.stage.revising) {
+                    throw '台账修订中,请勿修改提交期数据';
+                }
+
+                if (ctx.request.body.confirm !== undefined && ctx.request.body.confirm !== '确认删除本次审批') {
+                    throw '请输入正确的文本信息';
+                }
+
+                if (ctx.request.body.confirm === '确认删除本次审批' && ctx.session.sessionUser.is_admin && ctx.stage.order === ctx.stage.highOrder && ctx.stage.times !== 1) {
+                    await ctx.service.stageAudit.timesDelete();
+                    ctx.redirect(ctx.request.header.referer);
+                } else {
+                    throw '您无权进行该操作';
+                }
+            } catch (err) {
+                this.log(err);
+                ctx.session.postError = err.toString();
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
     }
 
     return StageController;

+ 1 - 0
app/router.js

@@ -228,6 +228,7 @@ module.exports = app => {
     app.post('/tender/:id/measure/stage/:order/extra/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.deleteFile');
     // 期审批管理
     app.get('/tender/:id/measure/stage/:order/manager', sessionAuth, tenderCheck, stageCheck, 'stageController.manager');
+    app.post('/tender/:id/measure/stage/:order/manager/audit/delete', sessionAuth, tenderCheck, stageCheck, 'stageController.managerAuditDelete');
     // 报表
     app.get('/tender/:id/report', sessionAuth, tenderCheck, 'reportController.index');
     app.get('/tender/:id/measure/stage/:order/report', sessionAuth, tenderCheck, stageCheck, 'reportController.index');

+ 57 - 0
app/service/stage_audit.js

@@ -983,6 +983,63 @@ module.exports = app => {
             const sqlParam = [this.tableName, this.ctx.service.stage.tableName, this.ctx.service.tender.tableName, this.ctx.service.tenderInfo.tableName, auditorId, auditConst.status.checking];
             return await this.db.query(sql, sqlParam);
         }
+
+        /**
+         * 删除本次审批流程
+         * @param {Number} stageId - 标段id
+         * @param {Number} times - 第几次审批
+         * @returns {Promise<void>}
+         */
+        async timesDelete() {
+            const transaction = await this.db.beginTransaction();
+            try {
+                // 当前审批人2次添加至流程中
+                // 判断当前期是否是重新上报状态,决定删除times数并获取times个数
+                await transaction.delete(this.tableName, { sid: this.ctx.stage.id, times: this.ctx.stage.times });
+                const isCheckNo = this.ctx.stage.status === auditConst.status.checkNo;
+                const nowTimes = isCheckNo ? this.ctx.stage.times - 1 : this.ctx.stage.times;
+                if (isCheckNo) {
+                    await transaction.delete(this.tableName, { sid: this.ctx.stage.id, times: nowTimes });
+                }
+                // 添加上一次审批人
+                const sql = 'SELECT `tid`, `sid`, `aid`, `order` FROM ?? WHERE `sid` = ? and `times` = ? GROUP BY `aid` ORDER BY `id` ASC';
+                const sqlParam = [this.tableName, this.ctx.stage.id, nowTimes - 1];
+                const auditors = await this.db.query(sql, sqlParam);
+                let order = 1;
+                for (const a of auditors) {
+                    a.times = nowTimes;
+                    a.order = order;
+                    a.status = auditConst.status.uncheck;
+                    order++;
+                }
+
+                // 拷贝新一次审核流程列表
+                await transaction.insert(this.tableName, auditors);
+
+                // const tpData = await this.ctx.service.stageBills.getSumTotalPrice(this.ctx.stage);
+                // // 计算并合同支付最终数据
+                // const [yfPay, sfPay] = await this.ctx.service.stagePay.calcAllStagePays(this.ctx.stage, transaction);
+                // 同步 期信息
+                await transaction.update(this.ctx.service.stage.tableName, {
+                    id: this.ctx.stage.id, status: auditConst.status.checkNo,
+                    // contract_tp: tpData.contract_tp,
+                    // qc_tp: tpData.qc_tp,
+                    times: nowTimes,
+                    // yf_tp: yfPay.tp,
+                    // sf_tp: sfPay.tp,
+                    // tp_history: JSON.stringify(this.ctx.stage.tp_history),
+                    cache_time_r: this.ctx.stage.cache_time_l,
+                });
+                // 复制一份最新数据给原报
+                // await this.ctx.service.stagePay.copyAuditStagePays(this.ctx.stage, this.ctx.stage.times + 1, 0, transaction);
+                // await this.ctx.service.stageJgcl.updateHistory(this.ctx.stage, transaction);
+                // await this.ctx.service.stageBonus.updateHistory(this.ctx.stage, transaction);
+                await transaction.commit();
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
 
     return StageAudit;

+ 1 - 1
app/view/stage/audit_btn.ejs

@@ -25,7 +25,7 @@
     <% if (ctx.stage.auditors !== undefined && ctx.stage.auditors.length !== 0 && ctx.stage.auditors[ctx.stage.auditors.length-1].aid === ctx.session.sessionUser.accountId && ctx.stage.status === auditConst.status.checked && ctx.stage.order === ctx.stage.highOrder) { %>
         <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm btn-block">重新审批</a>
     <% } %>
-    <% if (ctx.stage.user_id === ctx.session.sessionUser.accountId && ctx.stage.order === ctx.stage.highOrder) { %>
+    <% if (ctx.stage.user_id === ctx.session.sessionUser.accountId && ctx.stage.order === ctx.stage.highOrder && (ctx.stage.status === auditConst.status.checkNo || ctx.stage.status === auditConst.status.uncheck)) { %>
         <a href="#del-qi" data-toggle="modal" data-target="#del-qi" class="btn btn-outline-danger btn-sm btn-block mt-5">删除本期</a>
     <% } %>
 </div>

+ 1 - 1
app/view/stage/audit_modal.ejs

@@ -1450,7 +1450,7 @@
         </div>
     </div>
 <% } %>
-<% if (ctx.stage.user_id === ctx.session.sessionUser.accountId && ctx.stage.order === ctx.stage.highOrder) { %>
+<% if (ctx.stage.user_id === ctx.session.sessionUser.accountId && ctx.stage.order === ctx.stage.highOrder && (ctx.stage.status === auditConst.status.checkNo || ctx.stage.status === auditConst.status.uncheck)) { %>
     <!--删除期-->
     <% if (ctx.stage.hadMaterial) { %>
         <div class="modal fade" id="del-qi" data-backdrop="static">

+ 12 - 3
app/view/stage/manager.ejs

@@ -13,7 +13,7 @@
             <div class="c-body">
                 <% if (lastStage) { %>
                 <% for (let i = lastStage.order; i > 0; i--) { %>
-                    <% if (i === lastStage.order && lastStage.status === auditConst.status.checked) { %>
+                    <% if (i === lastStage.order && lastStage.status !== auditConst.status.uncheck) { %>
                     <table class="table table-bordered">
                         <thead>
                         <tr><th>第<%- lastStage.order %>期</th></tr>
@@ -24,7 +24,16 @@
                                 <table class="table table-bordered table-hover">
                                     <thead>
                                     <tr><th colspan="5"><%- lastAuditList[la][0].times %>#
-                                            <% if (parseInt(la) === 0) { %><a href="#del" data-toggle="modal" class="btn btn-sm btn-light pull-right text-danger">删除本次审批</a><a href="#pass" data-toggle="modal" class="btn btn-sm btn-warning pull-right mr-2">设置终审审批</a><% } %>
+                                            <% if (parseInt(la) === 0) { %>
+                                                <% if (lastStage.times === 1 || (lastStage.times === 2 && lastStage.status === auditConst.status.checkNo)) { %>
+                                                <a href="#del-qi" data-toggle="modal" class="btn btn-sm btn-light pull-right text-danger">删除本期</a>
+                                                <% } else { %>
+                                                <a href="#del" data-toggle="modal" class="btn btn-sm btn-light pull-right text-danger">删除本次审批</a>
+                                                <% } %>
+                                                <% if (lastStage.status === auditConst.status.checked) { %>
+                                                <a href="#pass" data-toggle="modal" class="btn btn-sm btn-warning pull-right mr-2">设置终审审批</a>
+                                                <% } %>
+                                            <% } %>
                                         </th></tr>
                                     </thead>
                                     <tbody>
@@ -44,7 +53,7 @@
                                             <% } else { %>
                                             <span class="<%- auditConst.auditStringClass[audit.status] %>"><% if (audit.status !== auditConst.status.uncheck) { %><%- auditConst.auditProgress[audit.status] %><% } %></span>
                                             <% } %>
-                                            <p class="text-muted m-0"><% if (audit.status !== auditConst.status.uncheck) { %><%- audit.end_time.toLocaleDateString() %><% } %></p></td>
+                                            <p class="text-muted m-0"><% if (audit.status !== auditConst.status.uncheck && audit.status !== auditConst.status.checking) { %><%- audit.end_time.toLocaleDateString() %><% } %></p></td>
                                         <td><%- audit.opinion %></td>
                                     </tr>
                                     <% } %>

+ 37 - 9
app/view/stage/manager_modal.ejs

@@ -1,7 +1,8 @@
+<% if (lastStage) { %>
 <!--删除本次审批-->
 <div class="modal fade" id="del" data-backdrop="static">
     <div class="modal-dialog" role="document">
-        <div class="modal-content">
+        <form class="modal-content" action='/tender/<%= ctx.tender.id %>/measure/stage/<%- lastStage.order %>/manager/audit/delete' method="post">
             <div class="modal-header">
                 <h5 class="modal-title">删除本次审批</h5>
             </div>
@@ -9,32 +10,59 @@
                 <p class="mb-2">删除本次审批,本期计量将退回至上一轮审批状态。</p>
                 <p class="mb-2">删除后数据不可恢复,请谨慎操作。</p>
                 <p class="mb-2">请在下方文本框输入文本「<span class="text-danger">确认删除本次审批</span>」,确认删除。</p>
-                <p class="mb-2"><input type="text" class="form-control form-control-sm" placeholder="输入文本,确认删除"></p>
+                <p class="mb-2"><input type="text" name="confirm" class="form-control form-control-sm" placeholder="输入文本,确认删除"></p>
             </div>
             <div class="modal-footer">
+                <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <button type="button" class="btn btn-sm btn-danger">确认删除</button>
+                <button type="submit" class="btn btn-sm btn-danger">确认删除</button>
             </div>
-        </div>
+        </form>
     </div>
 </div>
+<!--删除本期-->
+<div class="modal fade" id="del-qi" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <form class="modal-content" action='/tender/<%= ctx.tender.id %>/measure/stage/delete' method="post">
+            <div class="modal-header">
+                <h5 class="modal-title">删除期</h5>
+            </div>
+            <div class="modal-body">
+                <h5>确认删除「第<%= lastStage.order %>期」?</h5>
+                <h5>删除后,数据无法恢复,请谨慎操作。</h5>
+                <p class="mb-2">请在下方文本框输入文本「<span class="text-danger">确认删除本期</span>」,确认删除。</p>
+                <p class="mb-2"><input type="text" name="confirm" class="form-control form-control-sm" placeholder="输入文本,确认删除"></p>
+            </div>
+            <div class="modal-footer">
+                <input type="hidden" name="stage_id" value="<%= lastStage.id %>">
+                <input type="hidden" name="stage_order" value="<%- ctx.stage.order %>">
+                <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
+                <button type="submit" class="btn btn-danger btn-sm">确定删除</button>
+            </div>
+        </form>
+    </div>
+</div>
+<% if (lastStage.status === auditConst.status.checked) { %>
 <!--设置终审-->
 <div class="modal fade" id="pass" data-backdrop="static">
     <div class="modal-dialog" role="document">
-        <div class="modal-content">
+        <form action="/tender/<%- ctx.tender.id %>/measure/stage/<%- lastStage.order %>/audit/check/again" method="get" class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">设置终审审批</h5>
             </div>
             <div class="modal-body">
-                <p class="mb-2">设置本期计量终审「孙鸿福」为审批中状态。</p>
+                <p class="mb-2">设置本期计量终审「<%- lastAuditList[0][0].name  %>」为审批中状态。</p>
                 <p class="mb-2">请在下方文本框输入文本「<span class="text-danger">确认设置终审审批</span>」,确认设置。</p>
-                <p class="mb-2"><input type="text" class="form-control form-control-sm" placeholder="输入文本,确认设置">
+                <p class="mb-2"><input type="text" name="confirm" class="form-control form-control-sm" placeholder="输入文本,确认设置">
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <button type="button" class="btn btn-sm btn-warning">确认设置</button>
+                <button type="submit" class="btn btn-sm btn-warning">确认设置</button>
             </div>
-        </div>
+        </form>
     </div>
 </div>
+<% } %>
+<% } %>
 <% include ./audit_modal.ejs %>

+ 9 - 0
app/view/stage/stage_sub_menu.ejs

@@ -68,6 +68,15 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.session.sessionUser.is_admin) { %>
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled">
+                <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/manager') { %>active<% } %>">
+                    <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/manager"><span class="ml-3">审批管理</span></a>
+                </li>
+            </ul>
+        </div>
+        <% } %>
         <% include ./audit_btn.ejs %>
         <div class="side-fold"><a href="javascript: void(0)" data-toggle="tooltip" data-placement="top" data-original-title="折叠侧栏" id="to-mini-menu"><i class="fa fa-upload fa-rotate-270"></i></a></div>
     </div>

+ 9 - 0
app/view/stage/stage_sub_mini_menu.ejs

@@ -68,6 +68,15 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.session.sessionUser.is_admin) { %>
+            <div class="nav-box">
+                <ul class="nav-list list-unstyled">
+                    <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/manager') { %>active<% } %>">
+                        <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/manager"><span class="ml-3">审批管理</span></a>
+                    </li>
+                </ul>
+            </div>
+        <% } %>
         <% include ./audit_btn.ejs %>
         <div class="side-fold"><a href="javascript: void(0);" data-toggle="tooltip" data-placement="top" data-original-title="展开侧栏" id="to-menu"><i class="fa fa-upload fa-rotate-90"></i></a></div>
     </div>

+ 14 - 1
config/web.js

@@ -405,7 +405,20 @@ const JsFiles = {
                     "/public/js/stage_audit.js",
                 ],
                 mergeFile: 'stage_compare',
-            }
+            },
+            manager: {
+                files: [
+                    "/public/js/decimal.min.js",
+                ],
+                mergeFiles: [
+                    "/public/js/sub_menu.js",
+                    "/public/js/div_resizer.js",
+                    "/public/js/shares/cs_tools.js",
+                    "/public/js/zh_calc.js",
+                    "/public/js/stage_audit.js",
+                ],
+                mergeFile: 'stage_manager',
+            },
         },
         stageExtra: {
             jgcl: {