浏览代码

清单意见

MaiXinRong 7 年之前
父节点
当前提交
a9f175fb29

+ 96 - 9
app/controller/ledger_audit_controller.js

@@ -37,21 +37,28 @@ module.exports = app => {
 
                 const tenderId = ctx.request.query.tenderId;
                 const tender = await ctx.service.tender.getDataById(tenderId);
+                if (!tender.ledger_times) {
+                    tender.ledger_times = 1;
+                }
                 ctx.session.sessionUser.tenderId = tender.id;
                 ctx.session.sessionUser.tenderName = tender.name;
 
-                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tender.times);
+                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tender.ledger_times);
                 if (curAuditor.audit_id !== ctx.session.sessionUser.accountId) {
                     throw '审核信息错误';
                 }
 
-                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, tender.times);
+                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, tender.ledger_times);
                 const ledgerData = await ctx.service.ledger.getDataByTenderId(tenderId);
+                const content = await ctx.service.ledgerAuditContent.getAllDataByCondition({
+                    where: {tender_id: tenderId, times: tender.ledger_times, audit_id: auditors[0].audit_id}
+                });
                 const renderData = {
                     auditConst,
                     tender,
                     curAuditor,
                     auditors,
+                    content,
                     ledger: JSON.stringify(ledgerData),
                     ledgerSpreadSetting: JSON.stringify(spreadConst.ledgerSpread),
                     readOnly: true,
@@ -156,11 +163,11 @@ module.exports = app => {
                 if (tenderData.user_id !== ctx.session.sessionUser.accountId) {
                     throw '上报失败';
                 }
-                if (!tenderData.times) {
-                    tenderData.times = 1;
+                if (!tenderData.ledger_times) {
+                    tenderData.ledger_times = 1;
                 }
 
-                await ctx.service.ledgerAudit.start(tenderId, tenderData.times);
+                await ctx.service.ledgerAudit.start(tenderId, tenderData.ledger_times);
 
                 ctx.redirect('/ledger/explode');
             } catch (err) {
@@ -186,10 +193,10 @@ module.exports = app => {
                 if (!tenderData || tenderData.ledger_status !== auditConst.status.checking ) {
                     throw '当前标段数据有误';
                 }
-                if (!tenderData.times) {
-                    tenderData.times = 1;
+                if (!tenderData.ledger_times) {
+                    tenderData.ledger_times = 1;
                 }
-                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.times);
+                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.ledger_times);
                 if (curAudit.audit_id !== ctx.session.sessionUser.accountId) {
                     throw '审批失败';
                 }
@@ -198,7 +205,7 @@ module.exports = app => {
                     throw '提交数据错误';
                 }
 
-                await ctx.service.ledgerAudit.check(tenderId, checkType, ctx.request.body.opinion, tenderData.times);
+                await ctx.service.ledgerAudit.check(tenderId, checkType, ctx.request.body.opinion, tenderData.ledger_times);
 
                 ctx.redirect('/ledger/explode');
             } catch (err) {
@@ -207,6 +214,86 @@ module.exports = app => {
                 ctx.redirect(ctx.request.headers.referer);
             }
         }
+
+        /**
+         * 添加清单意见(Ajax)
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async addContent(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: [],
+            };
+            try {
+                const tenderId = ctx.session.sessionUser.tenderId;
+                if (!tenderId) {
+                    throw '当前未打开标段';
+                }
+                const tenderData = await ctx.service.tender.getDataById(tenderId);
+                if (!tenderData || tenderData.ledger_status !== auditConst.status.checking ) {
+                    throw '当前标段数据有误';
+                }
+                if (!tenderData.ledger_times) {
+                    tenderData.ledger_times = 1;
+                }
+                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.ledger_times);
+                if (curAudit.audit_id !== ctx.session.sessionUser.accountId) {
+                    throw '添加清单意见失败';
+                }
+                const data = JSON.parse(ctx.request.body.data);
+
+                const result = await ctx.service.ledgerAuditContent.add(tenderData, curAudit.audit_id, data);
+                responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
+                    where: {tender_id: tenderId, times: tenderData.ledger_times, audit_id: curAudit.audit_id}
+                });
+            } catch (err) {
+                console.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 tenderId = ctx.session.sessionUser.tenderId;
+                if (!tenderId) {
+                    throw '当前未打开标段';
+                }
+                const tenderData = await ctx.service.tender.getDataById(tenderId);
+                if (!tenderData) {
+                    throw '当前标段数据有误';
+                }
+                if (!tenderData.ledger_times) {
+                    tenderData.ledger_times = 1;
+                }
+                const data = JSON.parse(ctx.request.body.data);
+
+                const times = tenderData.ledger_status === auditConst.status.checkNo ? tenderData.ledger_times - 1 : tenderData.ledger_times;
+                responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
+                    where: {tender_id: tenderId, times: times, audit_id: data.audit_id}
+                });
+            } catch (err) {
+                console.log(err);
+                responseData.err = 1;
+                responseData.msg = err.toString();
+            }
+
+            ctx.body = responseData;
+        }
     }
 
     return LedgerAuditController;

+ 10 - 3
app/controller/ledger_controller.js

@@ -68,15 +68,22 @@ module.exports = app => {
                 if (!tenderData.ledger_status) {
                     tenderData.ledger_status = auditConst.status.uncheck;
                 }
-                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.times);
-                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, tenderData.times);
-
+                if (!tenderData.ledger_times) {
+                    tenderData.ledger_times = 1;
+                }
+                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.ledger_times);
+                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, tenderData.ledger_times);
+                const times = tenderData.ledger_status === auditConst.status.checkNo ? tenderData.ledger_times - 1 : tenderData.ledger_times;
+                const content = await ctx.service.ledgerAuditContent.getAllDataByCondition({
+                    where: {tender_id: tenderId, times: times, audit_id: auditors[0].audit_id}
+                });
                 const ledgerData = await ctx.service.ledger.getDataByTenderId(tenderId);
                 const renderData = {
                     tenderData,
                     auditConst,
                     auditors,
                     curAuditor,
+                    content,
                     ledger: JSON.stringify(ledgerData),
                     ledgerSpreadSetting: JSON.stringify(spreadConst.ledgerSpread),
                     tenderList,

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

@@ -5,6 +5,38 @@
  * @date 2018/02/05
  * @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 loadContents(data) {
+    $('div[name=auditContent]').remove();
+    for (const d of data) {
+        loadContent(d);
+    }
+};
+
 $(document).ready(function() {
     autoFlashHeight();
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
@@ -844,5 +876,12 @@ $(document).ready(function() {
             }
         });
     });
+
+    $('select', '#opinion').change(function () {
+        postData('/ledger/audit/getContent', {audit_id: parseInt($(this).val())}, (data) => {
+            $('legend', '#opinion').text($(this).find('option:selected').text() + ' 清单意见');
+            loadContents(data);
+        });
+    });
 });
 

+ 108 - 1
app/public/js/ledger_audit.js

@@ -8,6 +8,37 @@
  * @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 loadContents(data) {
+    $('div[name=auditContent]').remove();
+    for (const d of data) {
+        loadContent(d);
+    }
+};
+
 $(document).ready(() => {
     autoFlashHeight();
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
@@ -23,7 +54,6 @@ $(document).ready(() => {
     SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting);
     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
 
-
     let dealBills;
     // 展开收起标准清单
     $('a', '.side-menu').bind('click', function () {
@@ -78,4 +108,81 @@ $(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 - 0
app/router.js

@@ -50,6 +50,8 @@ module.exports = app => {
     app.post('/ledger/audit/delete', sessionAuth, 'ledgerAuditController.remove');
     app.post('/ledger/audit/start', sessionAuth, 'ledgerAuditController.start');
     app.post('/ledger/audit/check', sessionAuth, 'ledgerAuditController.check');
+    app.post('/ledger/audit/addContent', sessionAuth, 'ledgerAuditController.addContent');
+    app.post('/ledger/audit/getContent', sessionAuth, 'ledgerAuditController.getContent');
 
     // 签约清单
     app.post('/deal/get-data', sessionAuth, 'dealBillsController.getData');

+ 40 - 0
app/service/ledger_audit_content.js

@@ -0,0 +1,40 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2018/6/1
+ * @version
+ */
+
+module.exports = app => {
+    class LedgerAuditContent extends app.BaseService {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'ledger_audit_content';
+        }
+
+        async add(tender, auditId, data) {
+            const newContent = {
+                tender_id: tender.id,
+                audit_id: auditId,
+                times: tender.times,
+                in_time: new Date(),
+                content: data.opinion,
+            };
+            const relaBills = await this.ctx.service.ledger.getDataByNodeIds(tender.id, data.bills);
+            newContent.rela_bills = JSON.stringify(relaBills);
+            const result = await this.db.insert(this.tableName, newContent);
+            return result.effectRows = 1;
+        }
+    }
+
+    return LedgerAuditContent;
+};

+ 23 - 21
app/view/ledger/audit.ejs

@@ -27,9 +27,14 @@
                     </div>
                     <div id="opinion" class="tab-pane">
                         <div class="side-bar">
-                            <select class="form-control form-control-sm"><option>王五</option><option>张三</option></select>
+                            <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">
@@ -38,38 +43,34 @@
                                         台帐清单右键,添加至"清单意见"
                                     </div>
                                     <!--已添加清单-->
-                                    <table class="table table-sm table-bordered mb-2">
-                                        <tr><td>行2</td><td>203-1-1</td><td>挖土方</td><td><a href="#">移除</a></td></tr>
+                                    <table class="table table-sm table-bordered mb-2" id="rela_bills">
                                     </table>
-                                    <textarea class="form-control" placeholder="审批内容"></textarea>
-                                    <div class="alert alert-warning px-2 py-1 mt-2 mb-1" role="alert">
+                                    <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">
+                                    <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">添加</button>
-                                </div>
-                            </div>
-                            <legend>张三 清单意见</legend>
-                            <div class="card my-3">
-                                <div class="card-body">
-                                    <table class="table table-sm table-bordered mb-2">
-                                        <tr><td>行2</td><td>203-1-1</td><td>挖土方</td></tr>
-                                    </table>
-                                    <p>审批意见</p>
-                                    <span class="text-muted">2018-05-31 21:18:20</span>
+                                    <button class="btn btn-sm btn-primary mt-1" id="addContent">添加</button>
                                 </div>
                             </div>
-                            <div class="card my-3">
+                            <% } %>
+                            <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">
-                                        <tr><td>行3</td><td>203-1-2</td><td>挖土方</td></tr>
+                                        <% 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>审批意见</p>
-                                    <span class="text-muted">2018-05-23 13:11:10</span>
+                                    <p><%- c.content %></p>
+                                    <span class="text-muted"><%- c.in_time.toLocaleString() %></span>
                                 </div>
                             </div>
+                            <% } %>
                         </div>
                     </div>
                 </div>
@@ -95,6 +96,7 @@
     let ledgerSpreadSetting = '<%- ledgerSpreadSetting %>';
     ledgerSpreadSetting = JSON.parse(ledgerSpreadSetting);
     ledgerSpreadSetting.readOnly = <%- readOnly %>;
+    const userName = '<%- ctx.session.sessionUser.name %>';
 </script>
 <script src="/public/js/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 <script>

+ 19 - 15
app/view/ledger/explode.ejs

@@ -85,32 +85,34 @@
                         <div id="deal-bills-spread" class="sjs-height-2">
                         </div>
                     </div>
+                    <% if (tenderData.ledger_status !== auditConst.status.uncheck) { %>
                     <div id="opinion" class="tab-pane">
                         <div class="side-bar">
-                            <select class="form-control form-control-sm"><option>王五</option><option>张三</option></select>
+                            <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>张三 清单意见</legend>
-                            <div class="card my-3">
+                            <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">
-                                        <tr><td>行2</td><td>203-1-1</td><td>挖土方</td></tr>
+                                        <% 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>审批意见</p>
-                                    <span class="text-muted">2018-05-31 21:18:20</span>
-                                </div>
-                            </div>
-                            <div class="card my-3">
-                                <div class="card-body">
-                                    <table class="table table-sm table-bordered mb-2">
-                                        <tr><td>行3</td><td>203-1-2</td><td>挖土方</td></tr>
-                                    </table>
-                                    <p>审批意见</p>
-                                    <span class="text-muted">2018-05-23 13:11:10</span>
+                                    <p><%- c.content %></p>
+                                    <span class="text-muted"><%- c.in_time.toLocaleString() %></span>
                                 </div>
                             </div>
+                            <% } %>
                         </div>
                     </div>
+                    <% } %>
                 </div>
             </div>
         </div>
@@ -126,9 +128,11 @@
                 <li class="nav-item">
                     <a class="nav-link" content="#deal-bills" href="javascript: void(0);">签约清单</a>
                 </li>
+                <% if (tenderData.ledger_status !== auditConst.status.uncheck) { %>
                 <li class="nav-item">
                     <a class="nav-link" content="#opinion" href="javascript: void(0);">清单意见</a>
                 </li>
+                <% } %>
             </ul>
         </div>
     </div>