Browse Source

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

MaiXinRong 4 years ago
parent
commit
7aa9460ba4

+ 33 - 13
app/controller/advance_controller.js

@@ -1,7 +1,6 @@
 'use strict';
 const accountGroup = require('../const/account_group').group;
 const auditConst = require('../const/audit').advance;
-const ledgerAuditConst = require('../const/audit').ledger.status;
 const sendToWormhole = require('stream-wormhole');
 const path = require('path');
 const fs = require('fs');
@@ -19,11 +18,10 @@ module.exports = app => {
          */
         async index(ctx) {
             const type = auditConst.type.start;
-            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type);
-            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
             const advancePayTotal = ctx.tender.info.deal_param.startAdvance;
+            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type, this.decimal, advancePayTotal);
+            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
             const progress = await ctx.service.advance.calcProgress(latestOrder, advancePayTotal);
-            // const showAddBtn = ctx.tender.data.ledger_status !== ledgerAuditConst.uncheck && ctx.tender.data.user_id === ctx.session.sessionUser.accountId ? !latestOrder || (latestOrder.status === auditConst.status.checked && latestOrder.prev_total_amount < advancePayTotal) : false;
             const showAddBtn = ctx.tender.data.user_id === ctx.session.sessionUser.accountId ? (!latestOrder || (latestOrder.status === auditConst.status.checked && latestOrder.prev_total_amount < advancePayTotal)) : false;
             const renderData = {
                 type,
@@ -46,9 +44,9 @@ module.exports = app => {
          */
         async materialList(ctx) {
             const type = auditConst.type.material;
-            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type);
-            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
             const advancePayTotal = ctx.tender.info.deal_param.materialAdvance;
+            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type, this.decimal, advancePayTotal);
+            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
             const progress = await ctx.service.advance.calcProgress(latestOrder, advancePayTotal);
             const showAddBtn = ctx.tender.data.user_id === ctx.session.sessionUser.accountId ? !latestOrder || (latestOrder.status === auditConst.status.checked && latestOrder.prev_total_amount < advancePayTotal) : false;
             const renderData = {
@@ -109,9 +107,21 @@ module.exports = app => {
             return data;
         }
 
-        _checkCanEntry(ctx) {
-            if (ctx.session.sessionUser.accountId !== ctx.advance.uid) {
-                if (ctx.advance.status === auditConst.status.uncheck) {
+        /**
+         * 权限判断-进入详情页
+         * @param {Object} ctx - 全局上下文
+         * @return {void}
+         * @private
+         */
+        async _checkCanEntry(ctx) {
+            if (ctx.advance.status === auditConst.status.uncheck) {
+                if (ctx.session.sessionUser.accountId !== ctx.advance.uid) {
+                    throw '无权访问';
+                }
+            } else {
+                const auditors = await ctx.service.advanceAudit.getAuditorsWithOwner(ctx.advance.id, ctx.advance.times);
+                const cur_uid = ctx.session.sessionUser.accountId;
+                if (auditors.findIndex(item => item.audit_id === cur_uid) === -1) {
                     throw '无权访问';
                 }
             }
@@ -124,18 +134,26 @@ module.exports = app => {
         async detail(ctx) {
             const advancePayTotal = ctx.advance.type === 0 ? ctx.tender.info.deal_param.startAdvance : ctx.tender.info.deal_param.materialAdvance;
             try {
-                this._checkCanEntry(ctx);
-                const renderData = await this._getDefaultRenderData(ctx);
+                await this._checkCanEntry(ctx);
                 const { uncheck, checkNo } = auditConst.status;
                 const { status } = ctx.advance;
+                const isEdited = ctx.session.sessionUser.accountId === ctx.advance.uid && (status === uncheck || status === checkNo);
+                const renderData = await this._getDefaultRenderData(ctx);
                 // 获取上一期预付款记录
                 const prevAdvance = await ctx.service.advance.getPreviousRecord(ctx.tender.id, ctx.advance.type);
                 // 最大支付比例
                 const max_pr = ctx.helper.mul(ctx.helper.div(ctx.helper.sub(advancePayTotal, (prevAdvance && prevAdvance.prev_total_amount || 0)), advancePayTotal, 10), 100);
-                renderData.isEdited = status === uncheck || status === checkNo;
+                // 特殊处理金额的显示(formatMoney)
+                const s1 = parseFloat(ctx.advance.prev_amount).toString().split('.')[1];
+                const s2 = parseFloat(ctx.advance.prev_total_amount).toString().split('.')[1];
+                const prev_amount = ctx.helper.formatMoney(ctx.advance.prev_amount, ',', s1 && s1.length || 0);
+                const prev_total_amount = ctx.helper.formatMoney(ctx.advance.prev_total_amount, ',', s2 && s2.length || 0);
+                renderData.isEdited = isEdited;
                 renderData.advance = ctx.advance;
-                renderData.decimal = this.decimal;
+                renderData.prev_amount = prev_amount;
+                renderData.prev_total_amount = prev_total_amount;
                 renderData.max_pr = max_pr;
+                renderData.decimal = this.decimal;
                 renderData.advancePayTotal = advancePayTotal;
                 renderData.prevAdvance = prevAdvance;
                 await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs');
@@ -152,6 +170,7 @@ module.exports = app => {
         async update(ctx) {
             const { id } = ctx.advance;
             const data = JSON.parse(ctx.request.body.data);
+            console.log('data', data);
             try {
                 const result = await ctx.service.advance.updateAdvance(data, id);
                 if (result) {
@@ -251,6 +270,7 @@ module.exports = app => {
          */
         async start(ctx) {
             const data = JSON.parse(ctx.request.body.data);
+            console.log('data', data);
             try {
                 // 检查权限等
                 if (!ctx.advance) {

+ 31 - 1
app/controller/change_controller.js

@@ -266,7 +266,7 @@ module.exports = app => {
                 const auditStatus = await ctx.service.changeAudit.getStatusByChange(change);
 
                 // 获取附件列表
-                const attList = await ctx.service.changeAtt.getAllChangeFiles(ctx.params.cid);
+                const attList = await ctx.service.changeAtt.getChangeAttachment(ctx.params.cid);
 
                 // 根据auditStatus获取审批人列表
                 const auditList = await ctx.service.changeAudit.getListByStatus(change, auditStatus);
@@ -749,6 +749,36 @@ module.exports = app => {
         }
 
         /**
+         * 查看附件
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkFile(ctx) {
+            const responseData = { err: 0, msg: '' };
+            const id = parseInt(ctx.params.id);
+            if (id) {
+                try {
+                    const fileInfo = await ctx.service.changeAtt.getDataById(id);
+                    if (fileInfo && Object.keys(fileInfo).length) {
+                        let filepath = fileInfo.filepath;
+                        if (!ctx.helper.canPreview(fileInfo.fileext)) {
+                            filepath = `/change/download/file/${fileInfo.id}`;
+                        } else {
+                            filepath = filepath.replace(/^app|\/app/, '');
+                        }
+                        fileInfo.filepath && (responseData.data = { filepath });
+                    }
+                } catch (error) {
+                    this.log(error);
+                    this.setMessage(error.toString(), this.messageType.ERROR);
+                    responseData.err = 1;
+                    responseData.msg = error.toString();
+                }
+            }
+            ctx.body = responseData;
+        }
+
+        /**
          * 删除变更令
          * @param {Object} ctx - egg全局变量
          * @return {void}

+ 6 - 5
app/public/js/advance_audit.js

@@ -18,7 +18,6 @@ $(document).ready(function () {
 
     // 控制上报弹窗的文案
     function checkModal(isHide) {
-        console.log($('#start-modal'))
         $('#start-modal').empty()
         if (isHide) {
             // 隐藏上传按钮
@@ -205,13 +204,14 @@ $(document).ready(function () {
                 // 限制不能超过最大值
                 val = re_amount
             }
-            $(this).val(fixedToSub(val, decimal)) // 重新赋值限制只有两位小数
+            // $(this).val(fixedToSub(val, decimal)) // 重新赋值限制只有两位小数
             const pay_a_input = $(`.pay-input[data-type=${reverse(type)}]`)
             pay_ratio = parseFloat(ZhCalc.mul(ZhCalc.div(val, advancePayTotal), 100).toFixed(2))
             cur_amount = val
             pay_a_input.val(pay_ratio)
+            const total = parseFloat(ZhCalc.add(val, p_amount).toFixed(decimal)).toString().split('.')[1]
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(val, p_amount), ',', decimal) + '元')
+            $('#p_total2').text(formatMoney(total, ',', total && total.length || 0) + '元')
         } else {
             if (val.toFixed(1) === max.toFixed(1)) {
                 val = max
@@ -221,9 +221,10 @@ $(document).ready(function () {
             const cur_m_input = $(`.pay-input[data-type=${reverse(type)}]`)
             cur_amount = ZhCalc.mul(advancePayTotal, ZhCalc.div(val, 100))
             pay_ratio = val
-            cur_m_input.val(cur_amount.toFixed(decimal))
+            cur_m_input.val(parseFloat(cur_amount.toFixed(decimal)))
+            const total = parseFloat(ZhCalc.add(cur_amount, p_amount).toFixed(decimal)).toString().split('.')[1]
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', decimal) + '元')
+            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', total && total.length || 0) + '元')
         }
         const data = {
             pay_ratio,

+ 10 - 2
app/public/js/change_detail.js

@@ -81,7 +81,7 @@ $(document).ready(() => {
             for (const fileInfo of data) {
                 html += '<tr> ' +
                     '<td>' + index + '</td> ' +
-                    '<td><a href="/change/download/file/' + fileInfo.id + '">' + fileInfo.filename + fileInfo.fileext + '</a></td> ' +
+                    `<td><a href="javascript: void(0);" class="file-atn" f-id="${fileInfo.id}">${fileInfo.filename}${fileInfo.fileext}</a></td>`+
                     '<td>' + fileInfo.filesize + '</td> ' +
                     '<td>' + fileInfo.in_time + '</td> ' +
                     '<td> <a class="btn btn-light btn-sm delete-file" data-attid="' + fileInfo.id + '"  title="删除附件"><span class="fa fa-trash text-danger"></span></a> </td> ' +
@@ -112,7 +112,15 @@ $(document).ready(() => {
             });
         });
     });
-
+    // /change/download/file/
+    $('#attList').on('click', '.file-atn', function() {
+        const id = $(this).attr('f-id')
+        postData(`/change/download/file/${id}`, {}, (data) => {
+            const { filepath } = data
+            $('#file-upload').attr('href', filepath)
+            $('#file-upload')[0].click()
+        })
+    })
     //
     const cca = getLocalCache('change-checkbox-account-' + accountId);
     if (cca !== null && cca !== undefined) {

+ 1 - 0
app/router.js

@@ -300,6 +300,7 @@ module.exports = app => {
     app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'changeController.info');
     app.post('/change/upload/file', sessionAuth, 'changeController.uploadFile');
     app.get('/change/download/file/:id', sessionAuth, 'changeController.downloadFile');
+    app.post('/change/download/file/:id', sessionAuth, 'changeController.checkFile');
     app.post('/change/delete/file', sessionAuth, 'changeController.deleteFile');
     app.post('/tender/:id/change/delete', sessionAuth, tenderCheck, 'changeController.delete');
     app.post('/tender/:id/change/bills', sessionAuth, tenderCheck, 'changeController.bills');

+ 24 - 5
app/service/advance.js

@@ -10,10 +10,12 @@ module.exports = app => {
         }
         /**
          * 获取预付款列表
-         * @param {Number} tid 标段id
-         * @param {Number} type 预付款类型
+         * @param {Number} tid - 标段id
+         * @param {Number} type - 预付款类型
+         * @param {Number} decimal - 小数位数
+         * @param {Number} advancePayTotal - 预付款总额
          */
-        async getAdvanceList(tid, type) {
+        async getAdvanceList(tid, type, decimal, advancePayTotal) {
             this.initSqlBuilder();
             this.sqlBuilder.setAndWhere('tid', {
                 value: tid,
@@ -33,6 +35,22 @@ module.exports = app => {
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const advance = await this.db.query(sql, sqlParam);
             for (const item of advance) {
+                item.pay_ratio = this.ctx.helper.mul(this.ctx.helper.div(item.cur_amount, advancePayTotal), 100, 2) || 0;
+                if (item.status === auditConst.status.uncheck || item.status === auditConst.status.checkNo) {
+                    const s1 = parseFloat(item.cur_amount.toFixed(decimal)).toString().split('.')[1];
+                    const s2 = parseFloat(item.prev_amount.toFixed(decimal)).toString().split('.')[1];
+                    const s3 = parseFloat(item.prev_total_amount.toFixed(decimal)).toString().split('.')[1];
+                    item.cur_amount = this.ctx.helper.formatMoney(item.cur_amount, ',', s1 && s1.length || 0);
+                    item.prev_amount = this.ctx.helper.formatMoney(item.prev_amount, ',', s2 && s2.length || 0);
+                    item.prev_total_amount = this.ctx.helper.formatMoney(item.prev_total_amount, ',', s3 && s3.length || 0);
+                } else {
+                    const s1 = item.cur_amount.toString().split('.')[1] && item.cur_amount.toString().split('.')[1].length;
+                    const s2 = item.prev_amount.toString().split('.')[1] && item.prev_amount.toString().split('.')[1].length;
+                    const s3 = item.prev_total_amount.toString().split('.')[1] && item.prev_total_amount.toString().split('.')[1].length;
+                    item.cur_amount = this.ctx.helper.formatMoney(item.cur_amount, ',', s1 || 0);
+                    item.prev_amount = this.ctx.helper.formatMoney(item.prev_amount, ',', s2 || 0);
+                    item.prev_total_amount = this.ctx.helper.formatMoney(item.prev_total_amount, ',', s3 || 0);
+                }
                 item.curAuditor = await this.ctx.service.advanceAudit.getAuditorByStatus(item.id, item.status, item.times);
                 if (item.status === auditConst.status.checkNoPre) {
                     item.curAuditor2 = await this.ctx.service.advanceAudit.getAuditorByStatus(item.id, auditConst.status.checking);
@@ -90,8 +108,8 @@ module.exports = app => {
             if (!latestOrder) {
                 latestOrder = {
                     order: 1,
-                    prev_amount: 0.00,
-                    prev_total_amount: 0.00,
+                    prev_amount: 0,
+                    prev_total_amount: 0,
                 };
             } else {
                 latestOrder.order = latestOrder.order + 1;
@@ -166,6 +184,7 @@ module.exports = app => {
             const prevRecord = await this.getPreviousRecord(ctx.tender.id, ctx.advance.type) || { prev_total_amount: 0 };
             const { cur_amount } = payload;
             payload.prev_total_amount = ctx.helper.add(cur_amount, prevRecord.prev_total_amount);
+            console.log(payload);
             return await this.update(payload, {
                 id,
             });

+ 8 - 8
app/view/advance/detail.ejs

@@ -33,17 +33,17 @@
                                 <td class="text-right" width="405">
                                     <div class="input-group input-group-sm">
                                         <input type="number" class="pay-input form-control nospin text-right"
-                                            max="<%- max_pr %>" min="1" step="0.01" placeholder="请填写支付比例,将自动计算本期金额" data-type="0" <%- isEdited && ctx.session.sessionUser.accountId === ctx.advance.uid ? '' : 'disabled' %>
-                                            value="<%- advance.cur_amount && ctx.helper.mul(ctx.helper.div(advance.cur_amount, advancePayTotal), 100, 2) || 0 %>">
+                                            max="<%- max_pr %>" min="1" step="0.01" placeholder="请填写支付比例,将自动计算本期金额" data-type="0" <%- isEdited ? '' : 'disabled' %>
+                                            value="<%- advance.pay_ratio && ctx.helper.mul(ctx.helper.div(advance.cur_amount, advancePayTotal), 100, 2) || 0 %>">
                                         <div class="input-group-append"><span class="input-group-text">%</span></div>
                                     </div>
                                 </td>
                                 <th width="150" class="text-center">本期金额</th>
                                 <td class="text-right" width="405">
                                     <div class="input-group input-group-sm">
-                                        <input type="number" class="pay-input form-control nospin text-right" min="1" <%- isEdited && ctx.session.sessionUser.accountId === ctx.advance.uid ? '' : 'disabled' %>
+                                        <input type="number" class="pay-input form-control nospin text-right" min="1" <%- isEdited  ? '' : 'disabled' %>
                                             placeholder="请填写本期金额,将自动计算支付比例" data-type="1"
-                                            value="<%- advance.cur_amount && advance.cur_amount.toFixed(decimal) %>">
+                                            value="<%- advance.cur_amount && isEdited ? parseFloat(advance.cur_amount.toFixed(decimal)) : advance.cur_amount %>">
                                         <div class="input-group-append"><span class="input-group-text">元</span></div>
                                     </div>
                                 </td>
@@ -51,18 +51,18 @@
                             <tr>
                                 <th class="text-center">截止上期</th>
                                 <td class="text-right" id="p_total1" width="405">
-                                    <%- ctx.helper.formatMoney((prevAdvance && prevAdvance.prev_total_amount || 0), ',', decimal) %>元
+                                    <%- prev_amount %>元
                                 </td>
                                 <th class="text-center">截止本期金额</th>
                                 <td class="text-right" id="p_total2" width="405">
-                                    <%- ctx.helper.formatMoney((prevAdvance && prevAdvance.prev_total_amount + advance.cur_amount || (advance.cur_amount || 0)), ',', decimal) %>元
+                                    <%- prev_total_amount %>元
                                 </td>
                             </tr>
                             <tr>
                                 <th class="text-center" >备注</th>
                                 <td colspan="3">
                                     <textarea id="ad-remark" class="form-control form-control-sm" rows="2"
-                                        <%- isEdited && ctx.session.sessionUser.accountId === ctx.advance.uid ? '' : 'disabled' %>></textarea>
+                                        <%- isEdited ? '' : 'disabled' %>></textarea>
                                 </td>
                             </tr>
                         </tbody>
@@ -76,7 +76,7 @@
                         <tbody id="file-content">
                         </tbody>
                     </table>
-                    <% if(isEdited && ctx.session.sessionUser.accountId === ctx.advance.uid) { %>
+                    <% if(isEdited) { %>
                     <table class="table table-bordered mt-3">
                         <thead>
                             <tr>

+ 4 - 4
app/view/advance/index.ejs

@@ -59,10 +59,10 @@
                         <% advanceList.forEach(item => { %>
                             <tr>
                                 <td><a href="/tender/<%- ctx.tender.id %>/advance/<%- item.id %>/detail" data-id="<%- item.id %>">第<%- item.order %>期</a></td>
-                                <td><%- item.cur_amount && ctx.helper.mul(ctx.helper.div(item.cur_amount, advancePayTotal), 100, 2) || 0 %>%</td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.cur_amount, ',', decimal)%></td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.prev_amount, ',', decimal)%></td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.prev_total_amount, ',', decimal)%></td>
+                                <td><%- item.pay_ratio %>%</td>
+                                <td class="text-right"><%- item.cur_amount %></td>
+                                <td class="text-right"><%- item.prev_amount %></td>
+                                <td class="text-right"><%- item.prev_total_amount %></td>
                                 <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file" data-id="<%- item.id %>"><i
                                             class="fa fa-paperclip"></i> <%- item.fileList.length %></a></td>
                                 <td>

+ 1 - 1
app/view/advance/modal.ejs

@@ -23,7 +23,7 @@
                 <h5 class="modal-title">附件</h5>
             </div>
             <div class="modal-body">
-                <div class="modal-height-500">
+                <div class="modal-height-500" style="overflow: auto;">
                     <table class="table table-sm table-bordered" id="file-content">
                     </table>
                 </div>

+ 2 - 2
app/view/change/info.ejs

@@ -699,7 +699,7 @@
             <% } %>
             </div>
         </div>
-
+        <a href="" id="file-upload" target="_blank" style="display: none;"></a>
         <div class="c-body tab-pane" role="tabpanel" id="files">
             <div class="sjs-height-0">
             <table class="table table-bordered">
@@ -717,7 +717,7 @@
                 <% for (const [index,att] of attList.entries()) { %>
                 <tr>
                     <td><%- index+1 %></td>
-                    <td><a href="<%- att.filepath %>" target="_black"><%- att.filename %><%- att.fileext %></a></td>
+                    <td><a href="javascript: void(0);" class="file-atn" f-id="<%- att.id %>"><%- att.filename %><%- att.fileext %></a></td>
                     <td><%- ctx.helper.bytesToSize(att.filesize) %></td>
                     <td><%- moment(att.in_time * 1000).format('YYYY-MM-DD') %></td>
                     <td>