Browse Source

fix: 预付款最后一期金额计算修改

lanjianrong 4 years ago
parent
commit
e7266d1ffe

+ 11 - 8
app/controller/advance_controller.js

@@ -152,20 +152,23 @@ module.exports = app => {
                 // 获取上一期预付款记录
                 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);
+                const max_pr = ctx.helper.mul(ctx.helper.div(ctx.helper.sub(advancePayTotal, (prevAdvance && prevAdvance.prev_total_amount || 2)), advancePayTotal, 10), 100);
+
+                const isLimitMax = ctx.helper.round(max_pr, 2) === ctx.advance.pay_ratio;
                 // 特殊处理金额的显示(formatMoney)
                 let cur_amount,
                     prev_total_amount;
-                const s1 = parseFloat(ctx.advance.prev_amount).toString().split('.')[1];
-                const prev_amount = ctx.helper.formatMoney(ctx.advance.prev_amount, ',', s1 && s1.length || 0);
+                const s1 = parseFloat(ctx.advance.prev_amount).toString().split('.')[1] || '';
+                const prev_amount = ctx.helper.formatMoney(ctx.advance.prev_amount, ',', isLimitMax ? s1.length : 2);
                 if (status === uncheck || status === checkNo) {
-                    cur_amount = parseFloat(ctx.helper.round(ctx.advance.cur_amount, this.decimal)) || 0;
-                    const s2 = parseFloat(ctx.helper.add(cur_amount, ctx.advance.prev_amount)).toString().split('.')[1];
-                    prev_total_amount = ctx.helper.formatMoney(ctx.helper.add(cur_amount, ctx.advance.prev_amount), ',', s2 && s2.length || 0);
+                    // cur_amount = parseFloat(ctx.helper.round(ctx.advance.cur_amount, 2)) || 0;
+                    cur_amount = ctx.advance.cur_amount || 0;
+                    const s2 = parseFloat(ctx.helper.add(cur_amount, ctx.advance.prev_amount)).toString().split('.')[1] || '';
+                    prev_total_amount = ctx.helper.formatMoney(ctx.helper.add(cur_amount, ctx.advance.prev_amount), ',', isLimitMax ? s2.length : 2);
                 } else {
                     cur_amount = ctx.advance.cur_amount;
                     const s2 = parseFloat(ctx.advance.prev_total_amount).toString().split('.')[1];
-                    prev_total_amount = ctx.helper.formatMoney(ctx.advance.prev_total_amount, ',', s2 && s2.length || 0);
+                    prev_total_amount = ctx.helper.formatMoney(ctx.advance.prev_total_amount, ',', isLimitMax ? s2.length : 2);
                 }
 
                 renderData.isEdited = isEdited;
@@ -174,7 +177,7 @@ module.exports = app => {
                 renderData.prev_amount = prev_amount;
                 renderData.prev_total_amount = prev_total_amount;
                 renderData.max_pr = max_pr;
-                renderData.decimal = this.decimal;
+                renderData.decimal = 2;
                 renderData.advancePayTotal = advancePayTotal;
                 renderData.prevAdvance = prevAdvance;
                 await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs');

+ 18 - 9
app/public/js/advance_audit.js

@@ -11,6 +11,7 @@
 $(document).ready(function () {
     autoFlashHeight()
 
+    const decimal = 2
     let oldVal = null
     let timer = null
     let oldSearchVal = null
@@ -217,6 +218,9 @@ $(document).ready(function () {
         const type = parseInt($(this).data('type'))
         let pay_ratio = null
         let cur_amount = null
+
+        let isLimitMax = false  // 用来判断是否达到最大
+
         if (val < min) {
             // 限制最小值为min
             $(this).val(min)
@@ -229,32 +233,37 @@ $(document).ready(function () {
         }
         // 本期金额转化
         if (type === 1) {
-            if (val > re_amount) {
+            if (val >= re_amount) {
                 // 限制不能超过最大值
                 val = re_amount
+                debugger
+                isLimitMax = true
             }
-            $(this).val(fixedToSub(val, decimal)) // 重新赋值限制只有两位小数
+            $(this).val(isLimitMax ? 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 = ZhCalc.round(val, decimal)
+            cur_amount = isLimitMax ? re_amount : ZhCalc.round(val, decimal)
             pay_a_input.val(pay_ratio)
             const total = parseFloat(ZhCalc.add(cur_amount, p_amount)).toString().split('.')[1]
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', total && total.length || 0) + '元')
+            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', isLimitMax ? total.length : 2) + '元')
         } else {
             // 支付比例转化
+
             val = fixedToSub(val)
-            if (val.toFixed(1) === max.toFixed(1)) {
-                val = max
+            if (val.toFixed(2) === max.toFixed(2)) {
+              // 比例达到最大,特殊处理金额的显示小数点
+                val = fixedToSub(max, 2);
+                isLimitMax = true
             }
             $(this).val(val) // 重新赋值限制只有两位小数
             const cur_m_input = $(`.pay-input[data-type=${reverse(type)}]`)
-            cur_amount = ZhCalc.round(ZhCalc.mul(advancePayTotal, ZhCalc.div(val, 100)), decimal)
+            cur_amount = isLimitMax ? re_amount : ZhCalc.round(ZhCalc.mul(advancePayTotal, ZhCalc.div(val, 100), 10), decimal)
             pay_ratio = val
-            cur_m_input.val(parseFloat(cur_amount.toFixed(decimal)))
+            cur_m_input.val(cur_amount)
             const total = parseFloat(ZhCalc.add(cur_amount, p_amount)).toString().split('.')[1]
             // 截止本期金额文案更新
-            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', total && total.length || 0) + '元')
+            $('#p_total2').text(formatMoney(ZhCalc.add(cur_amount, p_amount), ',', isLimitMax ? total.length : 2) + '元')
         }
         const data = {
             pay_ratio,

+ 6 - 3
app/service/advance.js

@@ -34,17 +34,20 @@ module.exports = app => {
             this.sqlBuilder.orderBy = [['order', 'desc']];
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const advance = await this.db.query(sql, sqlParam);
+            let isLastItem = false;
             for (const item of advance) {
                 let s1,
                     s3;
                 const s2 = item.prev_amount.toString().split('.')[1];
+                isLastItem = this.ctx.helper.add(item.cur_amount, item.prev_amount) === advancePayTotal;
                 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 cur_amount = item.cur_amount && this.ctx.helper.round(item.cur_amount, decimal) || 0;
+                    const cur_amount = item.cur_amount || 0;
                     s1 = parseFloat(cur_amount).toString().split('.')[1];
                     s3 = parseFloat(this.ctx.helper.add(cur_amount, item.prev_amount)).toString().split('.')[1];
-                    item.cur_amount = this.ctx.helper.formatMoney(cur_amount, ',', s1 && s1.length || 0);
-                    item.prev_total_amount = this.ctx.helper.formatMoney(this.ctx.helper.add(cur_amount, item.prev_amount), ',', s3 && s3.length || 0);
+                    isLastItem && (s3 = advancePayTotal.toString().split('.')[1]);
+                    item.cur_amount = this.ctx.helper.formatMoney(cur_amount, ',', isLastItem ? s1 && s1.length || 0 : 2);
+                    item.prev_total_amount = this.ctx.helper.formatMoney(this.ctx.helper.add(cur_amount, item.prev_amount), ',', isLastItem ? s3 && s3.length || 0 : 2);
                 } else {
                     s1 = item.cur_amount && item.cur_amount.toString().split('.')[1];
                     s3 = item.prev_total_amount.toString().split('.')[1];

+ 2 - 1
app/view/advance/detail.ejs

@@ -22,6 +22,7 @@
                         <thead>
                             <tr>
                                 <th colspan="4" class="text-center">
+                                    <!-- 签约<%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款:<%- ctx.helper.formatMoney(advancePayTotal, ',', 2) %> -->
                                     签约<%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款:<%- ctx.helper.formatMoney(advancePayTotal, ',', parseFloat(advancePayTotal).toString().split('.')[1] && parseFloat(advancePayTotal).toString().split('.')[1].length || 0) %>
                                 </th>
@@ -348,7 +349,7 @@
 </div>
 <script>
     const cur_uid = parseInt('<%- ctx.session.sessionUser.accountId %>');
-    const decimal = parseInt('<%- decimal %>');
+    // const decimal = parseInt('<%- decimal %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const advance = JSON.parse(unescape('<%- escape(JSON.stringify(advance)) %>'));
     const prevAdvance = JSON.parse(unescape('<%- escape(JSON.stringify(prevAdvance)) %>'));