Browse Source

台账审批相关

MaiXinRong 6 years ago
parent
commit
a78b63c8a0

+ 49 - 72
app/controller/ledger_audit_controller.js

@@ -9,6 +9,7 @@
  */
 const auditConst = require('../const/audit').flow;
 const spreadConst = require('../const/spread');
+const measureType = require('../const/tender').measureType;
 
 module.exports = app => {
     class LedgerAuditController extends app.BaseController {
@@ -24,6 +25,31 @@ module.exports = app => {
         }
 
         /**
+         * 获取SpreadSetting
+         * @private
+         */
+        _getSpreadSetting() {
+            const _ = this.app._;
+            function removeFieldCols(setting, cols) {
+                _.remove(setting.cols, function (c) {
+                    return cols.indexOf(c.field) > -1;
+                });
+            }
+            const ledger = JSON.parse(JSON.stringify(spreadConst.ledgerSpread));
+            const pos = JSON.parse(JSON.stringify(spreadConst.ledgerPosSpread));
+            const tender = this.ctx.tender;
+            ledger.readOnly = true;
+            pos.readOnly = true;
+            if (tender.data.measure_type === measureType.tz.value) {
+                removeFieldCols(ledger, spreadConst.filterCols.tzWithoutCols);
+            }
+            if (!tender.info.display.ledger.dgnQty) {
+                removeFieldCols(ledger, spreadConst.filterCols.dgnCols);
+            }
+            return [ledger, pos];
+        }
+
+        /**
          * 台账审批页面(get)
          *
          * @param ctx
@@ -35,31 +61,44 @@ module.exports = app => {
                     tender: ctx.tender.data,
                     tenderMenu: this.menu.tenderMenu,
                     preUrl: '/tender/' + ctx.tender.id,
+                    measureType,
                 };
+                const [ledgerSpread, posSpread] = this._getSpreadSetting();
 
                 const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(ctx.tender.id, ctx.tender.data.ledger_times);
-                if (curAuditor && curAuditor.audit_id !== ctx.session.sessionUser.accountId) {
+                if (!curAuditor && ctx.tender.data.ledger_status !== auditConst.status.checkNo) {
                     throw '审核信息错误';
                 }
 
                 const auditors = await ctx.service.ledgerAudit.getAuditors(ctx.tender.id, ctx.tender.data.ledger_times);
-                const ledgerData = await ctx.service.ledger.getDataByTenderId(ctx.tender.id);
-                const content = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {
-                        tender_id: ctx.tender.id,
-                        times: ctx.tender.data.ledger_times,
-                        audit_id: auditors[0].audit_id,
+                if (ctx.tender.data.user_id !== ctx.session.sessionUser.accountId) {
+                    if (auditors.length > 0) {
+                        const auditor = this.app._.find(auditors, function (a) {return a.audit_id === ctx.session.sessionUser.accountId});
+                        if (!auditor) {
+                            throw '您无权查看台账审批';
+                        }
                     }
-                });
+                }
+
+                renderData.user = await ctx.service.projectAccount.getAccountInfoById(ctx.tender.data.user_id);
+                renderData.auditHistory = [];
+                if (ctx.tender.data.ledger_times > 1) {
+                    for (let i = 1; i < ctx.tender.data.ledger_times; i++) {
+                        renderData.auditHistory.push(await ctx.service.ledgerAudit.getAuditors(ctx.tender.id, i));
+                    }
+                }
+
+                const ledgerData = await ctx.service.ledger.getDataByTenderId(ctx.tender.id);
                 renderData.curAuditor = curAuditor;
                 renderData.auditConst = auditConst;
                 renderData.auditors = auditors;
-                renderData.content = content;
                 renderData.ledger = JSON.stringify(ledgerData);
-                renderData.ledgerSpreadSetting = JSON.stringify(spreadConst.ledgerSpread);
+                renderData.ledgerSpreadSetting = JSON.stringify(ledgerSpread);
+                renderData.posSpreadSetting = JSON.stringify(posSpread);
                 renderData.readOnly = true;
                 await this.layout('ledger/audit.ejs', renderData, 'ledger/audit_modal.ejs');
             } catch(err) {
+                console.log(err);
                 this.log(err);
                 ctx.redirect('/tender/'+ ctx.tender.id);
             }
@@ -186,68 +225,6 @@ module.exports = app => {
                 ctx.redirect(ctx.request.header.referer);
             }
         }
-
-        /**
-         * 添加清单意见(Ajax)
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async addContent(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: [],
-            };
-            try {
-                const tender = ctx.tender;
-                if (!tender.data || tender.data.ledger_status !== auditConst.status.checking ) {
-                    throw '当前标段数据有误';
-                }
-                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tender.id, tender.data.ledger_times);
-                if (curAudit.audit_id !== ctx.session.sessionUser.accountId) {
-                    throw '添加清单意见失败';
-                }
-                const data = JSON.parse(ctx.request.body.data);
-
-                await ctx.service.ledgerAuditContent.add(tender.data, curAudit.audit_id, data);
-                responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: tenderId, times: tender.data.ledger_times, audit_id: curAudit.audit_id}
-                });
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-
-            ctx.body = responseData;
-        }
-
-        /**
-         * 获取审核人的全部清单意见
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async getContent(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: [],
-            };
-            try {
-                const data = JSON.parse(ctx.request.body.data);
-
-                const times = ctx.tender.data.ledger_status === auditConst.status.checkNo ? ctx.tender.data.ledger_times - 1 : ctx.tender.data.ledger_times;
-                responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: ctx.tender.id, times: times, audit_id: data.audit_id}
-                });
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-
-            ctx.body = responseData;
-        }
     }
 
     return LedgerAuditController;

+ 21 - 12
app/controller/ledger_controller.js

@@ -13,9 +13,9 @@ const stdDataAddType = {
     withParent: 2
 }
 const auditConst = require('../const/audit').flow;
-const spreadConst = require('../const/spread');
 const tenderMenu = require('../../config/menu').tenderMenu;
 const measureType = require('../const/tender').measureType;
+const spreadConst = require('../const/spread');
 
 module.exports = app => {
 
@@ -35,6 +35,17 @@ module.exports = app => {
         }
 
         /**
+         * 检查标段是否只读(审核中,审核完成)
+         * @param {Object} tenderData
+         * @returns {boolean}
+         * @private
+         */
+        _ledgerReadOnly () {
+            const tender = this.ctx.tender.data;
+            return tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked;
+        }
+
+        /**
          * 获取SpreadSetting
          * @private
          */
@@ -79,12 +90,21 @@ module.exports = app => {
                     where: {tender_id: tender.id, times: times, audit_id: auditors[0].audit_id}
                 }) : null;
                 const ledgerData = await ctx.service.ledger.getDataByTenderId(tender.id, -1);
+                const user = await ctx.service.projectAccount.getAccountInfoById(ctx.tender.data.user_id);
+                const auditHistory = [];
+                if (ctx.tender.data.ledger_times > 1) {
+                    for (let i = 1; i < ctx.tender.data.ledger_times; i++) {
+                        auditHistory.push(await ctx.service.ledgerAudit.getAuditors(ctx.tender.id, i));
+                    }
+                }
                 const renderData = {
                     tender: tender.data,
                     tenderInfo: tender.info,
                     auditConst,
                     auditors,
                     curAuditor,
+                    user,
+                    auditHistory,
                     content,
                     ledger: JSON.stringify(ledgerData),
                     ledgerSpreadSetting: JSON.stringify(ledgerSpread),
@@ -101,17 +121,6 @@ module.exports = app => {
         }
 
         /**
-         * 检查标段是否只读(审核中,审核完成)
-         * @param {Object} tenderData
-         * @returns {boolean}
-         * @private
-         */
-        _ledgerReadOnly () {
-            const tender = this.ctx.tender.data;
-            return tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked;
-        }
-
-        /**
          * 获取子节点 (Ajax)
          * @param ctx
          * @return {Promise<void>}

+ 0 - 39
app/public/js/ledger.js

@@ -9,37 +9,6 @@ function checkTzMeasureType () {
     return tender.measure_type === measureType.tz.value;
 }
 
-function loadContent(data) {
-    const html = [];
-    html.push('<div name="auditContent" class="card my-3">');
-    html.push('<div class="card-body">');
-    html.push('<table class="table table-sm table-bordered mb-2">');
-    console.log(data);
-    console.log(data.rela_bills);
-    const bills = JSON.parse(data.rela_bills);
-    console.log(bills);
-    for (const b of bills) {
-        html.push('<tr bid=' + b.ledger_id + '>');
-        const code = b.code ? b.code : b.b_code;
-        html.push('<td>' + code + '</td>');
-        html.push('<td>' + b.name + '</td>');
-        html.push('</tr>');
-    }
-    html.push('</table>');
-    html.push('<p>'+ data.content +'</p>');
-    html.push('<span class="text-muted">' + data.in_time.toLocaleString() + '</span>');
-    html.push('</div>');
-    html.push('</div>');
-    $('#opinion>div.sjs-height-2').append(html.join(''));
-}
-
-function loadContents(data) {
-    $('div[name=auditContent]').remove();
-    for (const d of data) {
-        loadContent(d);
-    }
-};
-
 $(document).ready(function() {
     autoFlashHeight();
     // 初始化台账
@@ -589,7 +558,6 @@ $(document).ready(function() {
     }
     treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections());
 
-
     // 台账模式加载部位明细数据
     if (checkTzMeasureType()) {
         SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
@@ -1259,12 +1227,5 @@ $(document).ready(function() {
             }
         });
     });
-
-    $('select', '#opinion').change(function () {
-        postData(preUrl + '/ledger/audit/getContent', {audit_id: parseInt($(this).val())}, (data) => {
-            $('legend', '#opinion').text($(this).find('option:selected').text() + ' 清单意见');
-            loadContents(data);
-        });
-    });
 });
 

+ 48 - 112
app/public/js/ledger_audit.js

@@ -8,36 +8,13 @@
  * @version
  */
 
-function loadContent(data) {
-    const html = [];
-    html.push('<div name="auditContent" class="card my-3">');
-    html.push('<div class="card-body">');
-    html.push('<table class="table table-sm table-bordered mb-2">');
-    console.log(data);
-    console.log(data.rela_bills);
-    const bills = JSON.parse(data.rela_bills);
-    console.log(bills);
-    for (const b of bills) {
-        html.push('<tr bid=' + b.ledger_id + '>');
-        const code = b.code ? b.code : b.b_code;
-        html.push('<td>' + code + '</td>');
-        html.push('<td>' + b.name + '</td>');
-        html.push('</tr>');
-    }
-    html.push('</table>');
-    html.push('<p>'+ data.content +'</p>');
-    html.push('<span class="text-muted">' + data.in_time.toLocaleString() + '</span>');
-    html.push('</div>');
-    html.push('</div>');
-    $('#opinion>div.sjs-height-2').append(html.join(''));
+function getTenderId() {
+    return window.location.pathname.split('/')[2];
 }
 
-function loadContents(data) {
-    $('div[name=auditContent]').remove();
-    for (const d of data) {
-        loadContent(d);
-    }
-};
+function checkTzMeasureType () {
+    return tender.measure_type === measureType.tz.value;
+}
 
 $(document).ready(() => {
     autoFlashHeight();
@@ -48,14 +25,47 @@ $(document).ready(() => {
         order: 'order',
         level: 'level',
         rootId: -1,
-        keys: ['id', 'tender_id', 'ledger_id']
+        keys: ['id', 'tender_id', 'ledger_id'],
+        preUrl: '/ledger'
     });
     ledgerTree.loadDatas(ledger);
     SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting);
     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
 
+    // 初始化 部位明细
+    const pos = new PosData({
+        id: 'id', masterId: 'lid',
+    });
+    const posSpread = SpreadJsObj.createNewSpread($('#pos-spread')[0]);
+
+    // 台账模式加载部位明细数据
+    if (checkTzMeasureType()) {
+        SpreadJsObj.initSheet(posSpread.getActiveSheet(), posSpreadSetting);
+        postData('/api/tender/' + getTenderId() + '/pos', null, function (data) {
+            pos.loadDatas(data);
+        });
+    }
+
+    ledgerSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
+        const sheet = ledgerSpread.getActiveSheet();
+        let node;
+        if (!sheet || !sheet.zh_tree) {
+            node = null;
+        } else {
+            const sel = sheet.getSelections()[0];
+            node = sheet.zh_tree.nodes[sel.row];
+        }
+
+        if (node) {
+            const posData = pos.masterRange[itemsPre + node.id] || [];
+            SpreadJsObj.loadSheetData(posSpread.getActiveSheet(), 'data', posData);
+        } else {
+            SpreadJsObj.loadSheetData(posSpread.getActiveSheet(), 'data', []);
+        }
+    });
+
     let dealBills;
-    // 展开收起标准清单
+    // 展开收起 签约清单|清单意见
     $('a', '.side-menu').bind('click', function () {
         const tab = $(this), tabPanel = $(tab.attr('content'));
         const showSideTools = function (show) {
@@ -66,7 +76,7 @@ $(document).ready(() => {
                 $('.c-body.col-8').removeClass('col-8').addClass('col-12');
                 $('.c-body.col-4').removeClass('col-4').addClass('col-0').hide();
             }
-        }
+        };
         if (!tab.hasClass('active')) {
             $('a', '#side-menu').removeClass('active');
             tab.addClass('active');
@@ -76,13 +86,16 @@ $(document).ready(() => {
             if (tab.attr('content') === '#deal-bills' && !dealBills) {
                 dealBills = new DealBills($('#deal-bills-spread')[0], {
                     cols: [
-                        {title: '清单编号', field: 'code', width: 120, readOnly: true},
-                        {title: '名称', field: 'name', width: 230, readOnly: true},
-                        {title: '单位', field: 'unit', width: 50, readOnly: true},
+                        {title: '清单编号', field: 'code', width: 120, formatter: '@', readOnly: true},
+                        {title: '名称', field: 'name', width: 230, formatter: '@', readOnly: true},
+                        {title: '单位', field: 'unit', width: 50, formatter: '@', readOnly: true},
                         {title: '单价', field: 'unit_price', width: 50, readOnly: true},
                         {title: '数量', field: 'quantity', width: 50, readOnly: true},
                     ],
                     emptyRows: 0,
+                    headRows: 1,
+                    headRowHeight: [40],
+                    defaultRowHeight: 21,
                 });
                 dealBills.loadData();
             }
@@ -96,7 +109,7 @@ $(document).ready(() => {
     class DealBills {
         constructor (obj, spreadSetting) {
             this.obj = obj;
-            this.url = '/deal';
+            this.url = '/api/tender/' + getTenderId() + '/deal';
             this.spreadSetting = spreadSetting;
             this.spread = SpreadJsObj.createNewSpread(this.obj);
             SpreadJsObj.initSheet(this.spread.getActiveSheet(), this.spreadSetting);
@@ -108,81 +121,4 @@ $(document).ready(() => {
             });
         }
     }
-
-    // 右键菜单
-    $.contextMenu({
-        selector: '#ledger-spread',
-        build: function ($trigger, e) {
-            const target = SpreadJsObj.safeRightClickSelection($trigger, e, ledgerSpread);
-            return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
-        },
-        items: {
-            'addRelaBills': {
-                name: '添加至“清单意见”',
-                icon: 'fa-sign-in',
-                callback: function (key, opt) {
-                    const sheet = ledgerSpread.getActiveSheet();
-                    const selection = sheet.getSelections();
-                    const row = selection[0].row;
-                    const select = ledgerTree.nodes[row];
-                    const exist = $('tr[bid=' + select.ledger_id +']', '#rela_bills').length > 0;
-                    if (!exist) {
-                        const html = [];
-                        html.push('<tr bid=' + select.ledger_id + '>');
-                        html.push('<td>');
-                        html.push(select.code && select.code !== '' ? select.code : select.b_code);
-                        html.push('</td>');
-                        html.push('<td>' + select.name + '</td>');
-                        html.push('<td><a href="javascript: void(0);">移除</a></td>');
-                        html.push('</tr>');
-                        $('#rela_bills').append(html.join(''));
-                    }
-                    $('#billsHint').hide();
-
-                    if ($('tr[bid]', '#rela_bills').length === 1) {
-                        $('a', '#rela_bills').bind('click', function () {
-                            $(this).parent().parent().remove();
-                            if ($('tr[bid]', '#rela_bills').length === 0) {
-                                $('#billsHint').show();
-                            }
-                        });
-                    }
-                },
-                visible: function(key, opt){
-                    const sheet = ledgerSpread.getActiveSheet();
-                    const selection = sheet.getSelections();
-                    const row = selection[0].row;
-                    const select = ledgerTree.nodes[row];
-                    return select;
-                }
-            },
-        }
-    });
-    $('textarea').bind('input propertychange', function () {
-        if ($(this).val().length > 0) {
-            $('#opinionHint').hide();
-        } else {
-            $('#opinionHint').show();
-        }
-    });
-    $('#addContent').click(function () {
-        const bills = [];
-        for (const tr of $('#rela_bills>tr')) {
-            bills.push($(tr).attr('bid'));
-        }
-        const data = {
-            opinion: $('#content').val(),
-            bills,
-        };
-        postData('/ledger/audit/addContent', data, (data) => {
-            $('legend', '#opinion').text(userName + ' 清单意见');
-            loadContents(data);
-        });
-    });
-    $('select').change(function () {
-        postData('/ledger/audit/getContent', {audit_id: parseInt($(this).val())}, (data) => {
-            $('legend', '#opinion').text($(this).find('option:selected').text() + ' 清单意见');
-            loadContents(data);
-        });
-    });
 });

+ 2 - 4
app/router.js

@@ -88,10 +88,8 @@ module.exports = app => {
     app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, 'ledgerAuditController.index');
     app.post('/api/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, 'ledgerAuditController.add');
     app.post('/api/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, 'ledgerAuditController.remove');
-    app.post('/api/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, 'ledgerAuditController.start');
-    app.post('/api/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, 'ledgerAuditController.check');
-    app.post('/api/tender/:id/ledger/audit/addContent', sessionAuth, tenderCheck, 'ledgerAuditController.addContent');
-    app.post('/api/tender/:id/ledger/audit/getContent', sessionAuth, tenderCheck, 'ledgerAuditController.getContent');
+    app.post('/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, 'ledgerAuditController.start');
+    app.post('/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, 'ledgerAuditController.check');
 
     // 签约清单
     app.post('/api/tender/:id/deal/get-data', sessionAuth, tenderCheck, 'dealBillsController.getData');

+ 2 - 2
app/service/ledger_audit.js

@@ -238,7 +238,7 @@ module.exports = app => {
                         // 同步标段信息
                         await transaction.update(this.ctx.service.tender.tableName, {id: tenderId, ledger_status: checkType});
                         // 拷贝备份台账数据
-                        await this._copyHisytoryLedger(tenderId, times);
+                        await this._copyHisytoryLedger(tenderId, transaction, times);
                     }
                 } else {
                     // 同步标段信息
@@ -254,7 +254,7 @@ module.exports = app => {
                     }
                     await transaction.insert(this.tableName, auditors);
                     // 拷贝备份台账数据
-                    await this._copyHisytoryLedger(tenderId, times);
+                    await this._copyHisytoryLedger(tenderId, transaction, times);
                 }
 
                 await transaction.commit();

+ 1 - 1
app/view/dashboard/index.ejs

@@ -14,7 +14,7 @@
                     <div class="media-body">
                         <span class="pull-right text-muted"><%- t.begin_time.toLocaleString() %></span>
                         <h5 class="mt-0"><%- ctx.session.sessionUser.name %><small class="ml-3 text-muted">监理</small></h5>
-                        <p><a href="/ledger/explode?tenderId=<%- t.id %>"><%- t.name %></a> 台帐 需要您 <a href="/ledger/audit?tenderId=<%- t.id %>">审批</a>。</p>
+                        <p><a href="/ledger/explode?tenderId=<%- t.id %>"><%- t.name %></a> 台帐 需要您 <a href="/tender/<%- t.id %>/ledger/audit">审批</a>。</p>
                     </div>
                 </li>
                 <% } %>

+ 19 - 56
app/view/ledger/audit.ejs

@@ -4,8 +4,18 @@
         <div class="title-main d-flex justify-content-between">
             <div></div>
             <div>
-                <a href="#sp-done" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm pull-right">审批通过</a>
-                <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm pull-right">审批退回</a>
+                <% if (tender.ledger_status === auditConst.status.checkNo) { %>
+                    <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm pull-right text-dark">退回意见</a>
+                <% } else if (tender.ledger_status === auditConst.status.checking) { %>
+                    <% if (curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
+                        <a href="#sp-done" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm pull-right">审批通过</a>
+                        <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm pull-right">审批退回</a>
+                    <% } else {%>
+                        <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm pull-right text-dark">审批中</a>
+                    <% } %>
+                <% } else if (tender.ledger_status === auditConst.status.checked) { %>
+                <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-success btn-sm pull-right text-dark">审批通过</a>
+                <% } %>
             </div>
         </div>
     </div>
@@ -18,6 +28,7 @@
             <div class="c-body col-12">
                 <div class="sjs-height-1" id="ledger-spread">
                 </div>
+                <% if (tender.measure_type === measureType.tz.value) { %>
                 <div class="bcontent-wrap">
                     <div class="bc-bar mb-1">
                         <ul class="nav nav-tabs">
@@ -29,60 +40,14 @@
                     <div class="sp-wrap" id="pos-spread">
                     </div>
                 </div>
+                <% } %>
             </div>
             <!--右栏-->
             <div class="c-body col-0" style="display: none;">
                 <div class="tab-content">
                     <div id="deal-bills" class="tab-pane">
-                        <div class="sjs-height-1" id="deal-bills-spread">
-                        </div>
-                    </div>
-                    <div id="opinion" class="tab-pane">
-                        <div class="side-bar">
-                            <select class="form-control form-control-sm">
-                                <% for (const a of auditors) { %>
-                                    <option value="<%- a.audit_id %>"><%- a.name %></option>
-                                <% } %>
-                            </select>
-                        </div>
-                        <div class="sjs-height-2" style="overflow:auto">
-                            <% if (curAuditor && curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
-                            <div class="card my-3">
-                                <div class="card-header">添加清单意见</div>
-                                <div class="card-body">
-                                    <!--无清单 提示添加清单-->
-                                    <div class="alert alert-primary  px-2 py-1" role="alert">
-                                        台帐清单右键,添加至"清单意见"
-                                    </div>
-                                    <!--已添加清单-->
-                                    <table class="table table-sm table-bordered mb-2" id="rela_bills">
-                                    </table>
-                                    <textarea class="form-control" placeholder="审批内容" id="content"></textarea>
-                                    <div class="alert alert-warning px-2 py-1 mt-2 mb-1" role="alert" id="opinionHint">
-                                        请填写审批内容。
-                                    </div>
-                                    <div class="alert alert-warning px-2 py-1 mt-2 mb-1" role="alert" id="billsHint">
-                                        至少需要一条清单。
-                                    </div>
-                                    <button class="btn btn-sm btn-primary mt-1" id="addContent">添加</button>
-                                </div>
-                            </div>
-                            <% } %>
-                            <legend><%- auditors[0].name %> 清单意见</legend>
-                            <% for (const c of content) { %>
-                            <div name="auditContent" class="card my-3">
-                                <div class="card-body">
-                                    <table class="table table-sm table-bordered mb-2">
-                                        <% const bills = JSON.parse(c.rela_bills); %>
-                                        <% for (const b of bills) { %>
-                                        <tr bid="<%- b.ledger_id %>"><td><%- b.code ? b.code : b.b_code %></td><td><%- b.name %></td></tr>
-                                        <% } %>
-                                    </table>
-                                    <p><%- c.content %></p>
-                                    <span class="text-muted"><%- c.in_time.toLocaleString() %></span>
-                                </div>
-                            </div>
-                            <% } %>
+                        <div class="side-bar-1"></div>
+                        <div class="sjs-sh-1" id="deal-bills-spread">
                         </div>
                     </div>
                 </div>
@@ -95,20 +60,18 @@
                 <li class="nav-item">
                     <a class="nav-link" href="javascript: void(0);" role="tab" content="#deal-bills">签约清单</a>
                 </li>
-                <li class="nav-item">
-                    <a class="nav-link" href="javascript: void(0);" role="tab" content="#opinion">清单意见</a>
-                </li>
             </ul>
         </div>
     </div>
 </div>
 <script type="text/javascript">
+    const tender = JSON.parse('<%- JSON.stringify(tender) %>');
+    const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
     let ledger = '<%- ledger %>';
     ledger = JSON.parse(ledger);
     let ledgerSpreadSetting = '<%- ledgerSpreadSetting %>';
     ledgerSpreadSetting = JSON.parse(ledgerSpreadSetting);
-    ledgerSpreadSetting.readOnly = <%- readOnly %>;
-    const userName = '<%- ctx.session.sessionUser.name %>';
+    let posSpreadSetting = JSON.parse('<%- posSpreadSetting %>');
 </script>
 <script src="/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 <script>

+ 131 - 3
app/view/ledger/audit_modal.ejs

@@ -1,7 +1,8 @@
+<% if (tender.ledger_status === auditConst.status.checking && curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
 <!--审批通过-->
 <div class="modal fade" id="sp-done" data-backdrop="static">
     <div class="modal-dialog" role="document">
-        <form class="modal-content" action="/ledger/audit/check" method="post">
+        <form class="modal-content" action="/tender/<%- tender.id %>/ledger/audit/check" method="post">
             <div class="modal-header">
                 <h5 class="modal-title">审批通过</h5>
             </div>
@@ -39,7 +40,7 @@
 <!--审批退回-->
 <div class="modal fade" id="sp-back" data-backdrop="static">
     <div class="modal-dialog" role="document">
-        <form class="modal-content" action="/ledger/audit/check" method="post">
+        <form class="modal-content" action="/tender/<%- tender.id %>/ledger/audit/check" method="post">
             <div class="modal-header">
                 <h5 class="modal-title">审批退回</h5>
             </div>
@@ -73,4 +74,131 @@
             </div>
         </form>
     </div>
-</div>
+</div>
+<% } else { %>
+<!--审批流程/结果-->
+<div class="modal fade" id="sp-list" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">审批流程</h5>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-4">
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <li class="list-group-item">
+                                    <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- user.name %>  <small class="text-muted"><%- user.role %></small>
+                                </li>
+                                <% for (let i = 0; i < auditors.length; i++) { %>
+                                <li class="list-group-item">
+                                    <% if (i < auditors.length - 1) { %>
+                                    <i class="fa fa-chevron-circle-down"></i> <%- auditors[i].name %>  <small class="text-muted"><%- auditors[i].role %></small>
+                                    <% } else {%>
+                                    <i class="fa fa fa-stop-circle"></i> <%- auditors[i].name %>  <small class="text-muted"><%- auditors[i].role %></small>
+                                    <% } %>
+                                </li>
+                                <% } %>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="col-8 modal-height-500" style="overflow: auto">
+                        <% for (const ah of auditHistory) { %>
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <% for (let iA = 0; iA < ah.length; iA++) { %>
+                                    <% if (iA === 0) { %>
+                                        <li class="list-group-item">
+                                            <span class="text-success pull-right"><% if (auditHistory.indexOf(ah) > 0) { %>重新<% } %>上报</span>
+                                            <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i> <%- user.name %> <small class="text-muted"><%- user.role %></small></h5>
+                                            <p class="card-text"><%- ah[iA].begin_time.toLocaleDateString() %></p>
+                                        </li>
+                                        <li class="list-group-item">
+                                            <% 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) { %> <%- 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>
+                                            <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo) { %>
+                                            <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                            <% } %>
+                                        </li>
+                                    <% } else if (iA === ah.length - 1) { %>
+                                        <li class="list-group-item">
+                                            <% 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) { %> <%- user.name %><% } %></span>
+                                            <% } %>
+                                            <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) { %>
+                                            <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                            <% } %>
+                                        </li>
+                                    <% } else { %>
+                                        <li class="list-group-item">
+                                            <% 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) { %> <%- 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>
+                                            <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo) { %>
+                                            <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                            <% } %>
+                                        </li>
+                                    <% } %>
+                                <% } %>
+                            </ul>
+                        </div>
+                        <% } %>
+                        <% if (tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked) {%>
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <% for (let iA = 0; iA < auditors.length; iA++) { %>
+                                    <% if (iA === 0) { %>
+                                    <li class="list-group-item">
+                                        <span class="text-success pull-right"><% if (tender.ledger_times > 1) { %>重新<% } %>上报</span>
+                                        <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i> <%- user.name %> <small class="text-muted"><%- user.role %></small></h5>
+                                        <p class="card-text"><%- auditors[iA].begin_time.toLocaleDateString() %></p>
+                                    </li>
+                                    <li class="list-group-item">
+                                        <% 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) { %> <%- 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>
+                                        <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo) { %>
+                                        <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                        <% } %>
+                                    </li>
+                                    <% } else if (iA === auditors.length - 1) { %>
+                                    <li class="list-group-item">
+                                        <% 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) { %> <%- user.name %><% } %></span>
+                                        <% } %>
+                                        <h5 class="card-title"><i class="fa fa-stop-circle <%- 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) { %>
+                                        <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                        <% } %>
+                                    </li>
+                                    <% } else { %>
+                                    <li class="list-group-item">
+                                        <% 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) { %> <%- 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>
+                                        <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo) { %>
+                                        <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                        <% } %>
+                                    </li>
+                                    <% } %>
+                                <% } %>
+                            </ul>
+                        </div>
+                        <% } %>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% } %>

+ 0 - 33
app/view/ledger/explode.ejs

@@ -105,34 +105,6 @@
                         <div id="deal-bills-spread" class="sjs-sh-4">
                         </div>
                     </div>
-                    <% if (tender.ledger_status !== auditConst.status.uncheck) { %>
-                    <div id="opinion" class="tab-pane">
-                        <div class="side-bar">
-                            <select class="form-control form-control-sm">
-                                <% for (const a of auditors) { %>
-                                <option value="<%- a.audit_id %>"><%- a.name %></option>
-                                <% } %>
-                            </select>
-                        </div>
-                        <div class="sjs-height-2" style="overflow:auto">
-                            <legend><%- auditors[0].name %> 清单意见</legend>
-                            <% for (const c of content) { %>
-                            <div name="auditContent" class="card my-3">
-                                <div class="card-body">
-                                    <table class="table table-sm table-bordered mb-2">
-                                        <% const bills = JSON.parse(c.rela_bills); %>
-                                        <% for (const b of bills) { %>
-                                        <tr bid="<%- b.ledger_id %>"><td><%- b.code ? b.code : b.b_code %></td><td><%- b.name %></td></tr>
-                                        <% } %>
-                                    </table>
-                                    <p><%- c.content %></p>
-                                    <span class="text-muted"><%- c.in_time.toLocaleString() %></span>
-                                </div>
-                            </div>
-                            <% } %>
-                        </div>
-                    </div>
-                    <% } %>
                 </div>
             </div>
         </div>
@@ -151,11 +123,6 @@
                 <li class="nav-item">
                     <a class="nav-link" content="#deal-bills" href="javascript: void(0);">签约清单</a>
                 </li>
-                <% if (tender.ledger_status !== auditConst.status.uncheck) { %>
-                <li class="nav-item">
-                    <a class="nav-link" content="#opinion" href="javascript: void(0);">清单意见</a>
-                </li>
-                <% } %>
             </ul>
         </div>
     </div>

+ 112 - 15
app/view/ledger/explode_modal.ejs

@@ -96,7 +96,7 @@
                     </ul>
                 </div>
             </div>
-            <form class="modal-footer" method="post" action="/api/tender/<%- tender.id %>/ledger/audit/start">
+            <form class="modal-footer" method="post" action="/tender/<%- tender.id %>/ledger/audit/start">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>">
                 <button class="btn btn-primary" type="submit">确认上报</button>
@@ -134,7 +134,7 @@
                     </ul>
                 </div>
             </div>
-            <form class="modal-footer" action="/api/tender/<%- tender.id %>/ledger/audit/start" method="post">
+            <form class="modal-footer" action="/tender/<%- tender.id %>/ledger/audit/start" method="post">
                 <button type="submit" class="btn btn-primary">确认上报</button>
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
@@ -143,27 +143,124 @@
     </div>
 </div>
 <% } %>
-<% if (tender.status !== auditConst.status.unCheck) { %>
+<% if ((tender.ledger_status !== auditConst.status.unCheck) || (tender.ledger_times > 1)) { %>
 <!--审批流程/结果-->
 <div class="modal fade" id="sp-list" data-backdrop="static">
-    <div class="modal-dialog" role="document">
+    <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">审批流程</h5>
             </div>
             <div class="modal-body">
-                <div class="card mt-3">
-                    <ul class="list-group list-group-flush">
-                        <% for (let i = 0, iLen = auditors.length; i < iLen; i++) { %>
-                        <li class="list-group-item" auditorId="<%- auditors[i].audit_id %>">
-                            <% if (auditors[i].status !== auditConst.status.uncheck) { %>
-                            <span class="<%- auditConst.statusClass[auditors[i].status] %> pull-right"><%- auditConst.statusString[auditors[i].status] %></span>
-                            <% } %>
-                            <h5 class="card-title"><%- auditors[i].audit_order %> <%- auditors[i].name %> <small class="text-muted"><%- auditors[i].role %></small></h5>
-                            <p class="card-text"><%- auditors[i].opinion %> <%- auditors[i].end_time ? auditors[i].end_time.toLocaleString() : '' %></p>
-                        </li>
+                <div class="row">
+                    <div class="col-4">
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <li class="list-group-item">
+                                    <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- user.name %>  <small class="text-muted"><%- user.role %></small>
+                                </li>
+                                <% for (let i = 0; i < auditors.length; i++) { %>
+                                <li class="list-group-item">
+                                    <% if (i < auditors.length - 1) { %>
+                                    <i class="fa fa-chevron-circle-down"></i> <%- auditors[i].name %>  <small class="text-muted"><%- auditors[i].role %></small>
+                                    <% } else {%>
+                                    <i class="fa fa fa-stop-circle"></i> <%- auditors[i].name %>  <small class="text-muted"><%- auditors[i].role %></small>
+                                    <% } %>
+                                </li>
+                                <% } %>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="col-8 modal-height-500" style="overflow: auto">
+                        <% for (const ah of auditHistory) { %>
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <% for (let iA = 0; iA < ah.length; iA++) { %>
+                                <% if (iA === 0) { %>
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right"><% if (auditHistory.indexOf(ah) > 0) { %>重新<% } %>上报</span>
+                                    <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i> <%- user.name %> <small class="text-muted"><%- user.role %></small></h5>
+                                    <p class="card-text"><%- ah[iA].begin_time.toLocaleDateString() %></p>
+                                </li>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- 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>
+                                    <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo) { %>
+                                    <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } else if (iA === ah.length - 1) { %>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- user.name %><% } %></span>
+                                    <% } %>
+                                    <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) { %>
+                                    <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } else { %>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- 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>
+                                    <% if (ah[iA].status === auditConst.status.checked || ah[iA].status === auditConst.status.checkNo) { %>
+                                    <p class="card-text"><%- auditConst.statusString[ah[iA].status]%>,<%- ah[iA].opinion %>。<%- ah[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } %>
+                                <% } %>
+                            </ul>
+                        </div>
                         <% } %>
-                    </ul>
+                        <% if (tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked) {%>
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <% for (let iA = 0; iA < auditors.length; iA++) { %>
+                                <% if (iA === 0) { %>
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right"><% if (tender.ledger_times > 1) { %>重新<% } %>上报</span>
+                                    <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i> <%- user.name %> <small class="text-muted"><%- user.role %></small></h5>
+                                    <p class="card-text"><%- auditors[iA].begin_time.toLocaleDateString() %></p>
+                                </li>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- 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>
+                                    <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo) { %>
+                                    <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } else if (iA === auditors.length - 1) { %>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- user.name %><% } %></span>
+                                    <% } %>
+                                    <h5 class="card-title"><i class="fa fa-stop-circle <%- 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) { %>
+                                    <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } else { %>
+                                <li class="list-group-item">
+                                    <% 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) { %> <%- 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>
+                                    <% if (auditors[iA].status === auditConst.status.checked || auditors[iA].status === auditConst.status.checkNo) { %>
+                                    <p class="card-text"><%- auditConst.statusString[auditors[iA].status]%>,<%- auditors[iA].opinion %>。<%- auditors[iA].end_time.toLocaleDateString() %></p>
+                                    <% } %>
+                                </li>
+                                <% } %>
+                                <% } %>
+                            </ul>
+                        </div>
+                        <% } %>
+                    </div>
                 </div>
             </div>
             <div class="modal-footer">