Browse Source

refactor: 重构预付款支付比例与本期金额转化逻辑、优化小数点位数显示

lanjianrong 4 năm trước cách đây
mục cha
commit
ba81294f2a

+ 11 - 0
app/controller/advance_controller.js

@@ -7,6 +7,11 @@ const path = require('path');
 const fs = require('fs');
 module.exports = app => {
     class advanceController extends app.BaseController {
+        constructor(ctx) {
+            super(ctx);
+            const { decimal } = ctx.tender.info;
+            this.decimal = decimal.pay ? decimal.payTp : decimal.tp;
+        }
 
         /**
          * 开工预付款页面(AJAX) GET
@@ -21,6 +26,7 @@ module.exports = app => {
             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 renderData = {
                 type,
+                decimal: this.decimal,
                 showAddBtn,
                 advanceList,
                 latestOrder,
@@ -46,6 +52,7 @@ module.exports = app => {
             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 renderData = {
                 type,
+                decimal: this.decimal,
                 showAddBtn,
                 advanceList,
                 latestOrder,
@@ -131,8 +138,12 @@ module.exports = app => {
                 const { status } = ctx.advance;
                 // 获取上一期预付款记录
                 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;
                 renderData.advance = ctx.advance;
+                renderData.decimal = this.decimal;
+                renderData.max_pr = max_pr;
                 renderData.advancePayTotal = advancePayTotal;
                 renderData.prevAdvance = prevAdvance;
                 await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs');

+ 5 - 4
app/extend/helper.js

@@ -821,17 +821,18 @@ module.exports = {
         }
         return '';
     },
-    formatMoney(s, dot = ',') {
-        if (!s) return '0.00';
-        s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(2) + '';
+    formatMoney(s = 0, dot = ',', decimal = 2) {
+        if (!s) return s.toFixed(decimal);
+        s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(decimal === 0 ? 2 : decimal) + '';
         const l = s.split('.')[0].split('').reverse(),
             r = s.split('.')[1];
         let t = '';
         for (let i = 0; i < l.length; i++) {
             t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? dot : '');
         }
-        return t.split('').reverse().join('') + '.' + r;
+        return t.split('').reverse().join('') + (decimal === 0 ? '' : '.' + r);
     },
+
     transFormToChinese(num) {
         const changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
         const unit = ['', '十', '百', '千', '万'];

+ 22 - 15
app/public/js/advance_audit.js

@@ -117,13 +117,17 @@ $(document).ready(function () {
         })
     })
 
+    // 转化成两位小数
+    function fixedToSub(s) {
+        return parseFloat(parseFloat(s).toFixed(2))
+    }
     // 自动转换支付比例和本期金额
     $('.pay-input').on('input propertychange', function(e) {
-        let val = parseInt(e.target.value)
+        let val = parseFloat(e.target.value)
         const p_amount = prevAdvance && prevAdvance.prev_total_amount || 0 // 截止本期金额
         const re_amount = ZhCalc.sub(advancePayTotal, p_amount) // 剩余未付款的总额
-        const min = parseInt($(this).attr('min'))
-        const max = parseInt($(this).attr('max'))
+        const min = parseFloat($(this).attr('min'))
+        const max = parseFloat($(this).attr('max'))
         const type = parseInt($(this).data('type'))
         let pay_ratio = null
         let cur_amount = null
@@ -137,6 +141,7 @@ $(document).ready(function () {
             $(this).val(max)
             val = max
         }
+        $(this).val(fixedToSub(val)) // 重新赋值限制只有两位小数
         // 本期金额转化
         if (type === 1) {
             if (val > re_amount) {
@@ -145,26 +150,27 @@ $(document).ready(function () {
                 val = re_amount
             }
             const pay_a_input = $(`.pay-input[data-type=${reverse(type)}]`)
-            pay_ratio = ZhCalc.round(ZhCalc.mul(ZhCalc.div(val, re_amount), 100), 2)
+            pay_ratio = parseFloat(ZhCalc.mul(ZhCalc.div(val, advancePayTotal), 100).toFixed(2))
             cur_amount = val
             pay_a_input.val(pay_ratio)
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(val, p_amount)))
+            $('#p_total2').text(formatMoney(ZhCalc.add(val, p_amount), ',', decimal))
         } else {
             // 支付比例转化
             const cur_m_input = $(`.pay-input[data-type=${reverse(type)}]`)
-            cur_amount = ZhCalc.mul(re_amount, ZhCalc.div(val, 100))
+            cur_amount = ZhCalc.mul(advancePayTotal, ZhCalc.div(val, 100, 10))
+            console.log('val', ZhCalc.div(val, 100, 10), 'cur_amount', cur_amount)
             pay_ratio = val
             cur_m_input.val(cur_amount)
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount)))
+            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', decimal))
         }
         const data = {
             pay_ratio,
             cur_amount,
         }
         oldVal = {
-            cur_amount: parseInt($(`.pay-input[data-type=${1}]`).val()),
+            cur_amount: parseFloat($(`.pay-input[data-type=${1}]`).val()),
             remark: filterText($('#ad-remark').val())
         }
         clearTimeout(timer)
@@ -178,7 +184,7 @@ $(document).ready(function () {
 
     function checkInput() {
         const newVal = {
-            cur_amount: parseInt($(`.pay-input[data-type=${1}]`).val()),
+            cur_amount: parseFloat($(`.pay-input[data-type=${1}]`).val()),
             remark: filterText($('#ad-remark').val())
         }
         return newVal.cur_amount === oldVal.cur_amount && newVal.remark === oldVal.remark
@@ -187,8 +193,8 @@ $(document).ready(function () {
     $('#ad-remark').on('input propertychange', function(e) {
         const remark = filterText(e.target.value);
         oldVal = {
-            pay_ratio: parseInt($(`.pay-input[data-type=${0}]`).val()),
-            cur_amount: parseInt($(`.pay-input[data-type=${1}]`).val()),
+            pay_ratio: parseFloat($(`.pay-input[data-type=${0}]`).val()),
+            cur_amount: parseFloat($(`.pay-input[data-type=${1}]`).val()),
             remark
         }
         const data = oldVal
@@ -300,14 +306,15 @@ function reverse(num){
     return 1^num
 }
 
-function formatMoney(s, dot = ',') {
+function formatMoney(s, dot = ',', decimal = 2) {
     if (!s) return '0.00';
-    s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(2) + '';
+    s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(decimal === 0 ? 2 : decimal) + '';
     let l = s.split('.')[0].split('').reverse(),
-        r = s.split('.')[1];
+        r = s.split('.')[1].slice(0, decimal);
     let t = '';
     for (let i = 0; i < l.length; i++) {
         t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? dot : '');
     }
-    return t.split('').reverse().join('') + '.' + r;
+    debugger
+    return t.split('').reverse().join('') + (decimal === 0 ? '' : '.' + r)
 }

+ 6 - 5
app/view/advance/detail.ejs

@@ -33,7 +33,7 @@
                                 <th width="150">支付比例</th>
                                 <td class="text-right">
                                     <div class="input-group input-group-sm">
-                                        <input type="number" class="pay-input form-control nospin text-right" max="100"
+                                        <input type="number" class="pay-input form-control nospin text-right" max="<%- max_pr %>"
                                             min="1" placeholder="请填写支付比例,将自动计算本期金额" data-type="0"
                                             value="<%- advance.pay_ratio %>">
                                         <div class="input-group-append"><span class="input-group-text">%</span></div>
@@ -57,18 +57,18 @@
                                 </td>
                                 <th width="150">本期金额</th>
                                 <td class="text-right">
-                                    <%- ctx.helper.formatMoney(advance.cur_amount || 0) %>
+                                    <%- ctx.helper.formatMoney((advance.cur_amount || 0), ',', decimal) %>
                                 </td>
                             </tr>
                             <% } %>
                             <tr>
                                 <th>截止上期</th>
                                 <td class="text-right" id="p_total1">
-                                    <%- ctx.helper.formatMoney(prevAdvance && prevAdvance.prev_total_amount || 0) %>
+                                    <%- ctx.helper.formatMoney((prevAdvance && prevAdvance.prev_total_amount || 0), ',', decimal) %>
                                 </td>
                                 <th>截止本期金额</th>
                                 <td class="text-right" id="p_total2">
-                                    <%- ctx.helper.formatMoney(prevAdvance && prevAdvance.prev_total_amount + advance.cur_amount || (advance.cur_amount || 0)) %>
+                                    <%- ctx.helper.formatMoney((prevAdvance && prevAdvance.prev_total_amount + advance.cur_amount || (advance.cur_amount || 0)), ',', decimal) %>
                                 </td>
                             </tr>
                             <tr>
@@ -330,7 +330,7 @@
                                         </ul>
                                     </div>
                                     <!-- 展开/收起历史流程 -->
-                                    <% if(idx === auditHistory.length - 1) { %>
+                                    <% if(idx === auditHistory.length - 1 && auditHistory.length !== 1) { %>
                                         <div class="text-right"><a href="javascript: void(0);" id="fold-btn"  data-target="show" data-idx="<%- idx + 1 %>">展开历史审批流程</a></div>
                                     <% } %>
                                     <% }) %>
@@ -346,6 +346,7 @@
 </div>
 <script>
     const cur_uid = parseInt('<%- ctx.session.sessionUser.accountId %>');
+    const decimal = parseInt('<%- decimal %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const advance = JSON.parse('<%- JSON.stringify(advance) %>');
     const prevAdvance = JSON.parse('<%- JSON.stringify(prevAdvance) %>');

+ 8 - 7
app/view/advance/index.ejs

@@ -20,11 +20,11 @@
                 <div class="d-inline-block ml-4" style="width:300px">
                     <div class="progress">
                         <div class="progress-bar bg-success" style="width: <%- progress.p_ratio%>%;" data-placement="bottom"
-                            data-toggle="tooltip" data-original-title="截止上期金额:¥<%- ctx.helper.formatMoney(progress.p_amount) %>"><%- progress.p_ratio %>%</div>
+                            data-toggle="tooltip" data-original-title="截止上期金额:¥<%- ctx.helper.formatMoney(progress.p_amount, ',', decimal) %>"><%- progress.p_ratio.toFixed() %>%</div>
                         <div class="progress-bar bg-info" style="width:<%- progress.c_ratio%>%;" data-placement="bottom"
-                            data-toggle="tooltip" data-original-title="本期金额:¥<%- ctx.helper.formatMoney(progress.c_amount) %>"><%- progress.c_ratio %>%</div>
+                            data-toggle="tooltip" data-original-title="本期金额:¥<%- ctx.helper.formatMoney(progress.c_amount, ',', decimal) %>"><%- progress.c_ratio.toFixed() %>%</div>
                         <div class="progress-bar bg-gray" style="width:<%- progress.s_ratio%>%;" data-placement="bottom"
-                            data-toggle="tooltip" data-original-title="未完成:¥<%- ctx.helper.formatMoney(progress.s_amount) %>"><%- progress.s_ratio %>%</div>
+                            data-toggle="tooltip" data-original-title="未完成:¥<%- ctx.helper.formatMoney(progress.s_amount, ',', decimal) %>"><%- progress.s_ratio.toFixed() %>%</div>
                     </div>
                 </div>
             </div>
@@ -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) || 0%>%</td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.cur_amount)%></td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.prev_amount)%></td>
-                                <td class="text-right"><%- ctx.helper.formatMoney(item.prev_total_amount)%></td>
+                                <td><%- item.cur_amount && ctx.helper.mul(ctx.helper.div(item.cur_amount, advancePayTotal), 100).toFixed(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><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>
@@ -95,4 +95,5 @@
     const type = parseInt('<%- type %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const advanceList = JSON.parse('<%- JSON.stringify(advanceList) %>');
+    const decimal = parseInt('<%- decimal %>');
 </script>