浏览代码

期列表审批流程查看和按钮显示正确

laiguoran 6 年之前
父节点
当前提交
e5fb255d7c

+ 41 - 1
app/controller/measure_controller.js

@@ -43,10 +43,16 @@ module.exports = app => {
                     tenderMenu: this.menu.tenderMenu,
                     preUrl: '/tender/' + ctx.tender.id,
                     auditConst,
+                    auditConst2: JSON.stringify(auditConst),
                 };
                 renderData.stages = await ctx.service.stage.getValidStages(ctx.tender.id);
                 for (const s of renderData.stages) {
-                    s.curAuditor = null;
+                    // s.curAuditor = null;
+                    // 根据期状态返回展示用户
+                    s.curAuditor = await ctx.service.stageAudit.getAuditorByStatus(s.id, s.status, s.times);
+                    if (s.status === auditConst.status.checkNoPre) {
+                        s.curAuditor2 = await ctx.service.stageAudit.getAuditorByStatus(s.id, auditConst.status.checking);
+                    }
                 }
                 await this.layout('measure/stage.ejs', renderData, 'measure/stage_modal.ejs');
             } catch (err) {
@@ -56,6 +62,40 @@ module.exports = app => {
         }
 
         /**
+         * 期审批流程(Get)
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async stageAuditors(ctx) {
+            try {
+                const responseData = {
+                    err: 0, msg: '', data: {},
+                };
+                const order = JSON.parse(ctx.request.body.data).order;
+                const tenderId = ctx.params.id;
+                const stageInfo = await ctx.service.stage.getDataByCondition({ tid: tenderId, order });
+                // 获取审批流程中右边列表
+                const auditHistory = [];
+                const times = stageInfo.status === auditConst.status.checkNo ? stageInfo.times - 1 : stageInfo.times;
+                if (times >= 1) {
+                    for (let i = 1; i <= times; i++) {
+                        auditHistory.push(await ctx.service.stageAudit.getAuditors(stageInfo.id, i));
+                    }
+                }
+                responseData.data.auditHistory = auditHistory;
+                // 获取审批流程中左边列表
+                responseData.data.auditors = await ctx.service.stageAudit.getAuditGroupByList(stageInfo.id, times);
+                // 获取原报信息
+                const stageAuditor = await ctx.service.projectAccount.getAccountInfoById(stageInfo.user_id);
+                responseData.data.stageAuditor = stageAuditor;
+                ctx.body = responseData;
+            } catch (error) {
+                this.log(error);
+                ctx.body = { err: 1, msg: error.toString(), data: null };
+            }
+        }
+
+        /**
          * 新增期(Post)
          * @param ctx
          * @returns {Promise<void>}

+ 81 - 0
app/public/js/measure_stage.js

@@ -0,0 +1,81 @@
+'use strict';
+
+/**
+ * 期计量 - 期列表页面 js
+ *
+ * @author Mai
+ * @date 2018/12/7
+ * @version
+ */
+
+// 获取审批流程
+$('a[data-target="#sp-list" ]').on('click', function () {
+   const data = {
+       order: $(this).attr('s-order'),
+   };
+   postData('/tender/' + tenderId + '/measure/stage/auditors', data, function (result) {
+       const stageAuditor = result.stageAuditor;
+       const auditors = result.auditors;
+       const auditHistory = result.auditHistory;
+       // 生成左边列表流程
+       const lefthtml = [];
+       lefthtml.push('<li class="list-group-item"><i class="fa fa fa-play-circle fa-rotate-90"></i> '+ stageAuditor.name +'  <small class="text-muted">'+ stageAuditor.role +'</small></li>');
+       for (const [index,a] of auditors.entries()) {
+           if (index+1 === auditors.length) {
+               lefthtml.push('<li class="list-group-item"><i class="fa fa-stop-circle"></i> '+ a.name +'  <small class="text-muted">'+ a.role +'</small></li>');
+           } else {
+               lefthtml.push('<li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> '+ a.name +'  <small class="text-muted">'+ a.role +'</small></li>');
+           }
+       }
+       $('#auditor-list').html(lefthtml.join(''));
+
+       // 生成右边列表流程
+       const righthtml = [];
+       for(const ah of auditHistory) {
+           righthtml.push('<div class="card mt-3"><ul class="list-group list-group-flush">');
+           for (let iA = 0; iA < ah.length; iA++) {
+               if (iA === 0) {
+                   righthtml.push('<li class="list-group-item">');
+                   righthtml.push('<span class="text-success pull-right">'+ (auditHistory.indexOf(ah) > 0 ? '重新' : '') +'上报</span>');
+                   righthtml.push('<h5 class="card-title">');
+                   righthtml.push('<i class="fa fa-play-circle fa-rotate-90 text-success"></i> '+ stageAuditor.name +' <small class="text-muted">'+ stageAuditor.role +'</small></h5>');
+                   righthtml.push('<p class="card-text"><small class="text-muted">' + (ah[iA].begin_time ? moment(ah[iA].begin_time).format('YYYY-MM-DD') : '') + '</small></p></li>');
+                   righthtml.push('<li class="list-group-item">');
+                   if (ah[iA].status !== auditConst.status.uncheck) {
+                       righthtml.push('<span class="'+ auditConst.statusClass[ah[iA].status] +' pull-right">' + auditConst.statusString[ah[iA].status] + (ah[iA].status === auditConst.status.checkNo ? ' ' + stageAuditor.name : '') + '</span>');
+                   }
+                   righthtml.push('<h5 class="card-title"><i class="fa '+ (iA === ah.length - 1 ? 'fa-stop-circle ' : 'fa-chevron-circle-down ') + auditConst.statusClass[ah[iA].status] +'"></i> '+ ah[iA].name +' <small class="text-muted">'+ ah[iA].role +'</small></h5>');
+                   if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) {
+                       righthtml.push('<p class="card-text mb-1">'+ ah[iA].opinion +'</p>');
+                       righthtml.push('<p class="card-text"><small class="text-muted">'+ (ah[iA].end_time ? moment(ah[iA].end_time).format('YYYY-MM-DD') : '') +'</small></p>');
+                   }
+                   righthtml.push('</li>');
+               } else if (iA === ah.length - 1) {
+                   righthtml.push('<li class="list-group-item">');
+                   if (ah[iA].status !== auditConst.status.uncheck) {
+                       righthtml.push('<span class="'+ auditConst.statusClass[ah[iA].status] +' pull-right">' + auditConst.statusString[ah[iA].status] + (ah[iA].status === auditConst.status.checkNo ? ' ' + stageAuditor.name : '') + '</span>');
+                   }
+                   righthtml.push('<h5 class="card-title"><i class="fa fa-stop-circle '+ auditConst.statusClass[ah[iA].status] +'"></i> '+ ah[iA].name +' <small class="text-muted">'+ ah[iA].role +'</small></h5>');
+                   if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) {
+                       righthtml.push('<p class="card-text mb-1">'+ ah[iA].opinion +'</p>');
+                       righthtml.push('<p class="card-text"><small class="text-muted">'+ (ah[iA].end_time ? moment(ah[iA].end_time).format('YYYY-MM-DD') : '') +'</small></p>');
+                   }
+                   righthtml.push('</li>');
+               } else {
+                   righthtml.push('<li class="list-group-item">');
+                   if (ah[iA].status !== auditConst.status.uncheck) {
+                       righthtml.push('<span class="'+ auditConst.statusClass[ah[iA].status] +' pull-right">' + auditConst.statusString[ah[iA].status] + (ah[iA].status === auditConst.status.checkNo ? ' ' + stageAuditor.name : '') + '</span>');
+                   }
+                   righthtml.push('<h5 class="card-title"><i class="fa fa-chevron-circle-down '+ auditConst.statusClass[ah[iA].status] +'"></i> '+ ah[iA].name +' <small class="text-muted">'+ ah[iA].role +'</small></h5>');
+                   if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) {
+                       righthtml.push('<p class="card-text mb-1">'+ ah[iA].opinion +'</p>');
+                       righthtml.push('<p class="card-text"><small class="text-muted">'+ (ah[iA].end_time ? moment(ah[iA].end_time).format('YYYY-MM-DD') : '') +'</small></p>');
+                   }
+                   righthtml.push('</li>');
+               }
+           }
+           righthtml.push('</ul></div>');
+       }
+       $('#auditor-list2').html(righthtml.join(''));
+   })
+});

+ 1 - 0
app/router.js

@@ -115,6 +115,7 @@ module.exports = app => {
     // 计量台账
     // 期计量
     app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'measureController.stage');
+    app.post('/tender/:id/measure/stage/auditors', sessionAuth, tenderCheck, 'measureController.stageAuditors');
     app.post('/tender/:id/measure/add', sessionAuth, tenderCheck, 'measureController.add');
     app.post('/tender/:id/measure/save', sessionAuth, tenderCheck, 'measureController.save');
     // 计量台账 -- 清单汇总

+ 41 - 0
app/service/stage_audit.js

@@ -415,6 +415,47 @@ module.exports = app => {
             const result = await transaction.insert(this.tableName, newAuditors);
             return result.effectRows = auditors.length;
         }
+
+        /**
+         * 移除审核人
+         *
+         * @param {Number} stageId - 期id
+         * @param {Number} status - 期状态
+         * @param {Number} status - 期次数
+         * @return {Promise<boolean>}
+         */
+        async getAuditorByStatus(stageId, status, times = 1) {
+            let auditor = null;
+            let sql = '';
+            let sqlParam = '';
+            switch (status) {
+                case auditConst.status.checking :
+                case auditConst.status.checked :
+                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`sid`, la.`aid`, la.`order` ' +
+                        'FROM ?? AS la, ?? AS pa ' +
+                        'WHERE la.`sid` = ? and (la.`status` = ? or la.`status` = ?) and la.`aid` = pa.`id` order by la.`times` desc';
+                    sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, stageId, auditConst.status.checking, auditConst.status.checked];
+                    auditor = await this.db.queryOne(sql, sqlParam);
+                    break;
+                case auditConst.status.checkNo :
+                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`sid`, la.`aid`, la.`order` ' +
+                        'FROM ?? AS la, ?? AS pa ' +
+                        'WHERE la.`sid` = ? and la.`status` = ? and la.`times` = ? and la.`aid` = pa.`id` order by la.`times` desc';
+                    sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, stageId, auditConst.status.checkNo, parseInt(times) - 1];
+                    auditor = await this.db.queryOne(sql, sqlParam);
+                    break;
+                case auditConst.status.checkNoPre :
+                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`sid`, la.`aid`, la.`order` ' +
+                        'FROM ?? AS la, ?? AS pa ' +
+                        'WHERE la.`sid` = ? and la.`status` = ? and la.`aid` = pa.`id` order by la.`times` desc';
+                    sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, stageId, auditConst.status.checkNoPre];
+                    auditor = await this.db.queryOne(sql, sqlParam);
+                    break;
+                case auditConst.status.uncheck :
+                default:break;
+            }
+            return auditor;
+        }
     }
 
     return StageAudit;

+ 6 - 2
app/view/measure/stage.ejs

@@ -47,7 +47,11 @@
                     <td class="text-center">
                     <% if (s.status === auditConst.status.uncheck && s.user_id === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- '/tender/' + ctx.tender.id + '/measure/stage/' + s.order %>" class="btn <%- auditConst.statusButtonClass[s.status] %> btn-sm"><%- auditConst.statusButton[s.status] %></a>
-                    <% } else if (s.status !== auditConst.status.checked && s.curAuditor && s.curAuditor === ctx.session.sessionUser.accountId) { %>
+                    <% } else if (s.status === auditConst.status.checkNo && s.curAuditor && s.user_id === ctx.session.sessionUser.accountId) { %>
+                        <a href="<%- '/tender/' + ctx.tender.id + '/measure/stage/' + s.order %>" class="btn <%- auditConst.statusButtonClass[s.status] %> btn-sm"><%- auditConst.statusButton[s.status] %></a>
+                    <% } else if (s.status === auditConst.status.checking && s.curAuditor && s.curAuditor.aid === ctx.session.sessionUser.accountId) { %>
+                        <a href="<%- '/tender/' + ctx.tender.id + '/measure/stage/' + s.order %>" class="btn <%- auditConst.statusButtonClass[s.status] %> btn-sm"><%- auditConst.statusButton[s.status] %></a>
+                    <% } else if (s.status === auditConst.status.checkNoPre && s.curAuditor && s.curAuditor2.aid === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- '/tender/' + ctx.tender.id + '/measure/stage/' + s.order %>" class="btn <%- auditConst.statusButtonClass[s.status] %> btn-sm"><%- auditConst.statusButton[s.status] %></a>
                     <% } else { %>
                         <span class="<%- auditConst.auditStringClass[s.status] %>"><%- auditConst.auditString[s.status] %></span>
@@ -56,7 +60,7 @@
 
                     <td class="<%- auditConst.auditProgressClass[s.status] %>">
                         <% if (s.curAuditor) { %>
-                        <a href="#sp-list" data-toggle="modal" data-target="#sp-list" s-order="<%- s.order %>"><%- s.curAuditor.name %>-<%s.curAuditor.role %></a>
+                        <a href="#sp-list" data-toggle="modal" data-target="#sp-list" s-order="<%- s.order %>"><%- s.curAuditor.name %><%if (s.curAuditor.role !== '' && s.curAuditor.role !== null) { %>-<%- s.curAuditor.role %><% } %></a>
                         <% } %>
                         <%- auditConst.auditProgress[s.status] %>
                     </td>

+ 7 - 3
app/view/measure/stage_modal.ejs

@@ -41,7 +41,7 @@
                 <div class="row">
                     <div class="col-4">
                         <div class="card mt-3">
-                            <ul class="list-group list-group-flush">
+                            <ul class="list-group list-group-flush" id="auditor-list">
                                 <li class="list-group-item"><i class="fa fa fa-play-circle fa-rotate-90"></i> 布尔  <small class="text-muted">施工</small></li>
                                 <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 张三  <small class="text-muted">监理</small></li>
                                 <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 王五 <small class="text-muted">监理</small></li>
@@ -49,7 +49,7 @@
                             </ul>
                         </div>
                     </div>
-                    <div class="col-8 modal-height-500" style="overflow: auto">
+                    <div class="col-8 modal-height-500" style="overflow: auto" id="auditor-list2">
                         <div class="card mt-3">
                             <ul class="list-group list-group-flush">
                                 <li class="list-group-item">
@@ -174,4 +174,8 @@
     $('.datepicker-here').datepicker({
         autoClose: true,
     });
-</script>
+    const tenderId = '<%- ctx.tender.id %>';
+    const auditConst = JSON.parse('<%- auditConst2 %>');
+</script>
+<script src="/public/js/moment/moment.min.js"></script>
+<script src="/public/js/measure_stage.js"></script>

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

@@ -269,7 +269,7 @@
                                     <% if (ah[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[ah[iA].status] %> pull-right"><%- auditConst.statusString[ah[iA].status]%><% if (ah[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === ah.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
                                     <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- ah[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- ah[iA].end_time.toLocaleDateString() %></small></p>
@@ -317,7 +317,7 @@
                                     <% if (auditors[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[auditors[iA].status] %> pull-right"><%- auditConst.statusString[auditors[iA].status]%><% if (auditors[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === auditors.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
                                     <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo || auditors[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- auditors[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- auditors[iA].end_time.toLocaleDateString() %></small></p>
@@ -403,7 +403,7 @@
                                     <% if (ah[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[ah[iA].status] %> pull-right"><%- auditConst.statusString[ah[iA].status]%><% if (ah[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === ah.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
                                     <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- ah[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- ah[iA].end_time.toLocaleDateString() %></small></p>
@@ -451,7 +451,7 @@
                                     <% if (auditors[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[auditors[iA].status] %> pull-right"><%- auditConst.statusString[auditors[iA].status]%><% if (auditors[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === auditors.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
                                     <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo || auditors[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- auditors[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- auditors[iA].end_time.toLocaleDateString() %></small></p>
@@ -536,7 +536,7 @@
                                     <% if (ah[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[ah[iA].status] %> pull-right"><%- auditConst.statusString[ah[iA].status]%><% if (ah[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === ah.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
                                     <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- ah[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- ah[iA].end_time.toLocaleDateString() %></small></p>
@@ -625,7 +625,7 @@
                                                     <% if (ah[iA].status !== auditConst.status.uncheck) { %>
                                                         <span class="<%- auditConst.statusClass[ah[iA].status] %> pull-right"><%- auditConst.statusString[ah[iA].status]%><% if (ah[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                                     <% } %>
-                                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
+                                                    <h5 class="card-title"><i class="fa <%if (iA === ah.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
                                                     <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) { %>
                                                         <p class="card-text mb-1"><%- ah[iA].opinion %></p>
                                                         <p class="card-text"><small class="text-muted"><%- ah[iA].end_time.toLocaleDateString() %></small></p>
@@ -738,7 +738,7 @@
                                     <% if (ah[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[ah[iA].status] %> pull-right"><%- auditConst.statusString[ah[iA].status]%><% if (ah[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === ah.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[ah[iA].status] %>"></i> <%- ah[iA].name %> <small class="text-muted"><%- ah[iA].role %></small></h5>
                                     <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo || ah[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- ah[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- ah[iA].end_time.toLocaleDateString() %></small></p>
@@ -786,7 +786,7 @@
                                     <% if (auditors[iA].status !== auditConst.status.uncheck) { %>
                                     <span class="<%- auditConst.statusClass[auditors[iA].status] %> pull-right"><%- auditConst.statusString[auditors[iA].status]%><% if (auditors[iA].status === auditConst.status.checkNo) { %> <%- ctx.stage.user.name %><% } %></span>
                                     <% } %>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <h5 class="card-title"><i class="fa <%if (iA === auditors.length - 1) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> <%- auditConst.statusClass[auditors[iA].status] %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
                                     <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo || auditors[iA].status === auditConst.status.checkNoPre) { %>
                                     <p class="card-text mb-1"><%- auditors[iA].opinion %></p>
                                     <p class="card-text"><small class="text-muted"><%- auditors[iA].end_time.toLocaleDateString() %></small></p>