MaiXinRong 5 vuotta sitten
vanhempi
commit
8c70576489

+ 48 - 2
app/controller/tender_controller.js

@@ -227,14 +227,60 @@ module.exports = app => {
          */
         async tenderInfo(ctx) {
             try {
-                const lastStage = await ctx.service.stage.getLastestStage(ctx.tender.id);
+                const tender = ctx.tender.data;
+                if (tender.user_id === this.ctx.session.sessionUser.accountId && (
+                    tender.ledger_status === auditConst.ledger.status.checkNo || tender.ledger_status === auditConst.ledger.status.uncheck)) {
+                    const sum = await this.ctx.service.ledger.addUp({tender_id: tender.id, is_leaf: true});
+                    tender.total_price = sum.total_price;
+                    tender.deal_tp = sum.deal_tp;
+                }
+                const stages = await ctx.service.stage.getValidStages(ctx.tender.id);
+                const lastStage = stages[0]; //await ctx.service.stage.getLastestStage(ctx.tender.id);
+                if (lastStage) {
+                    await this.ctx.service.stage.checkStageGatherData(lastStage);
+                    tender.gather_tp = ctx.helper.add(lastStage.contract_tp, lastStage.qc_tp);
+                    tender.end_contract_tp = ctx.helper.add(lastStage.contract_tp, lastStage.pre_contract_tp);
+                    tender.end_qc_tp = ctx.helper.add(lastStage.qc_tp, lastStage.pre_qc_tp);
+                    tender.end_gather_tp = ctx.helper.add(tender.end_contract_tp, tender.end_qc_tp);
+                    tender.pre_gather_tp = ctx.helper.add(lastStage.pre_contract_tp, lastStage.pre_qc_tp);
+                    tender.yf_tp = lastStage.yf_tp;
+                    tender.qc_ratio = ctx.helper.mul(ctx.helper.div(tender.end_qc_tp, tender.gather_tp, 2), 100);
+                    tender.sum = ctx.helper.add(tender.total_price, tender.end_qc_tp);
+                    tender.pre_ratio = ctx.helper.mul(ctx.helper.div(tender.pre_gather_tp, tender.sum, 2), 100);
+                    tender.cur_ratio = ctx.helper.mul(ctx.helper.div(tender.gather_tp, tender.sum, 2), 100);
+                    tender.other_tp = ctx.helper.sub(ctx.helper.sub(tender.sum, tender.pre_gather_tp), tender.gather_tp);
+                    tender.other_ratio = Math.max(0, 100 - tender.pre_ratio - tender.cur_ratio);
+                }
+                const monthProgress = [];
+                for (const s of stages) {
+                    if (s.s_time) {
+                        let progress = monthProgress.find(function (x) {
+                            return x.month === s.s_time;
+                        });
+                        if (!progress) {
+                            progress = {month: s.s_time};
+                            monthProgress.push(progress);
+                        }
+                        progress.tp = ctx.helper.add(ctx.helper.add(progress.tp, s.contract_tp), s.qc_tp);
+                    }
+                }
+                monthProgress.sort(function (x, y) {
+                    return Date.parse(x.month) - Date.parse(y.month);
+                });
+                let sum = 0;
+                for (const p of monthProgress) {
+                    sum = ctx.helper.add(sum, p.tp);
+                    p.end_tp = sum;
+                }
                 const renderData = {
-                    tender: ctx.tender.data,
+                    tender: tender,
                     tenderInfo: ctx.tender.info,
                     tenderMenu: this.menu.tenderMenu,
                     preUrl: '/tender/' + ctx.tender.id,
                     cooperation: ctx.session.sessionUser.cooperation,
                     lastStage,
+                    stages: stages.reverse(),
+                    monthProgress,
                     audit: auditConst,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.tender.info),
                 };

+ 11 - 0
app/extend/helper.js

@@ -753,4 +753,15 @@ module.exports = {
         }
         return '';
     },
+    formatMoney(s, dot = ',') {
+        if (!s) return '0.00';
+        s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(2) + "";
+        var 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;
+    }
 };

+ 1 - 0
app/service/stage.js

@@ -142,6 +142,7 @@ module.exports = app => {
                     const tpData = await this.ctx.service.stageBills.getSumTotalPrice(stage);
                     stage.contract_tp = tpData.contract_tp;
                     stage.qc_tp = tpData.qc_tp;
+                    stage.yf_tp = await this.ctx.service.stagePay.getYfTotalPrice(stage);
                     stage.tp = this.ctx.helper.add(stage.contract_tp, stage.qc_tp);
                     stage.end_tp = this.ctx.helper.add(stage.pre_tp, stage.tp);
                 }

+ 1 - 1
app/service/tender.js

@@ -12,7 +12,7 @@ const tenderConst = require('../const/tender');
 const auditConst = require('../const/audit');
 const fs = require('fs');
 const path = require('path');
-const commonQueryColumns = ['id', 'project_id', 'name', 'status', 'category', 'ledger_times', 'ledger_status', 'measure_type', 'user_id', 'valuation'];
+const commonQueryColumns = ['id', 'project_id', 'name', 'status', 'category', 'ledger_times', 'ledger_status', 'measure_type', 'user_id', 'valuation', 'total_price', 'deal_tp'];
 
 module.exports = app => {
 

+ 54 - 20
app/view/tender/detail.ejs

@@ -6,7 +6,7 @@
             <% if (tender.ledger_status !== audit.ledger.status.uncheck) { %>
             <h2>进行至
                 <% if (lastStage) { %>
-                第<%- lastStage.order %>期<small class="<%- audit.stage.auditStringClass[lastStage.status] %>">(<%- audit.stage.auditString[lastStage.status] %>)</small>
+                第<%- lastStage.order %>期<small class="<%- audit.stage.statusClass[lastStage.status] %>">(<%- audit.stage.statusString[lastStage.status] %>)</small>
                 <% } else { %>
                 台账<small class="<%- audit.ledger.auditStringClass[tender.ledger_status] %>">(<%- audit.ledger.auditString[tender.ledger_status] %>)</small>
                 <% } %>
@@ -26,7 +26,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">163,000.00</h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.total_price) %></h5>
                             <p class="card-text text-muted">0号台帐合同</p>
                         </div>
                     </div>
@@ -34,7 +34,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">30,000.00</h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.gather_tp) %></h5>
                             <p class="card-text text-muted">本期完成</p>
                         </div>
                     </div>
@@ -42,7 +42,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">50,000.00 <small class="text-danger"  data-toggle="tooltip" data-placement="bottom" title="" data-original-title="占合同比例">1%</small></h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.end_qc_tp) %><small class="text-danger"  data-toggle="tooltip" data-placement="bottom" title="" data-original-title="占合同比例"><%- tender.qc_ratio %>%</small></h5>
                             <p class="card-text text-muted">截止本期变更</p>
                         </div>
                     </div>
@@ -50,7 +50,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">70,000.00</h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.end_gather_tp) %></h5>
                             <p class="card-text text-muted">截止本期完成</p>
                         </div>
                     </div>
@@ -58,7 +58,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">40,000.00</h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.pre_gather_tp) %></h5>
                             <p class="card-text text-muted">截止上期完成</p>
                         </div>
                     </div>
@@ -66,7 +66,7 @@
                 <div class="col-auto">
                     <div class="card text-center">
                         <div class="card-body">
-                            <h5 class="card-title">30,000.00</h5>
+                            <h5 class="card-title"><%- ctx.helper.formatMoney(tender.yf_tp) %></h5>
                             <p class="card-text text-muted">本期应付</p>
                         </div>
                     </div>
@@ -75,9 +75,9 @@
             <!--进度条-->
             <div class="mb-5">
                 <div class="progress">
-                    <div class="progress-bar bg-success" style="width: 24%;" data-placement="bottom" data-toggle="tooltip" data-original-title="截止上期累计完成:¥40,000.00">24%</div>
-                    <div class="progress-bar bg-info" style="width:18%;" data-placement="bottom" data-toggle="tooltip" data-original-title="本期完成:¥30,000.00">18%</div>
-                    <div class="progress-bar bg-gray" style="width:58%;" data-placement="bottom" data-toggle="tooltip" data-original-title="未完成:¥930,00.00">58%</div>
+                    <div class="progress-bar bg-success" style="width: <%- tender.pre_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="截止上期累计完成:¥<%- ctx.helper.formatMoney(tender.end_gather_tp) %>"><%- tender.pre_ratio %>%</div>
+                    <div class="progress-bar bg-info" style="width: <%- tender.cur_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="本期完成:¥<%- ctx.helper.formatMoney(tender.gather_tp) %>"><%- tender.cur_ratio %>%</div>
+                    <div class="progress-bar bg-gray" style="width: <%- tender.other_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="未完成:¥<%- ctx.helper.formatMoney(tender.other_tp) %>"><%- tender.other_ratio %>%</div>
                 </div>
             </div>
             <ul class="nav nav-tabs">
@@ -574,7 +574,11 @@
             {
                 type : 'category',
                 splitLine : {show : true},
-                data : ['第一期','第二期','第三期','第四期','第五期','第六期','第七期']
+                data : [
+                    <% for (const s of stages) {%>
+                    '第<%- s.order %>期',
+                    <% } %>
+                ]
             }
         ],
         yAxis : [
@@ -603,35 +607,55 @@
                 type:'bar',
                 tooltip : {trigger: 'item',formatter: "{b}  <br/>{a}:{c}元"},
                 stack: '合同',
-                data:[320, 332, 301, 334, 390, 330, 320]
+                data:[
+                    <% for (const s of stages) {%>
+                    <%- s.contract_tp %>,
+                    <% } %>
+                ]
             },
             {
                 name:'本期数量变更计量',
                 type:'bar',
                 tooltip : {trigger: 'item',formatter: "{b}  <br/>{a}:{c}元"},
-                stack: '合同',
-                data:[320, -20, 301, 334, 390, 330, 320]
+                stack: '变更',
+                data:[
+                    <% for (const s of stages) {%>
+                    <%- s.qc_tp %>,
+                    <% } %>
+                ]
             },
             {
                 name:'截至上期累计完成',
                 type:'bar',
                 tooltip : {trigger: 'item',formatter: "{b}  <br/>{a}:{c}元"},
                 stack: '完成',
-                data:[120, 132, 101, 134, 90, 230, 210]
+                data:[
+                    <% for (const s of stages) {%>
+                    <%- ctx.helper.mul(s.pre_contract_tp, s.pre_qc_tp) %>,
+                    <% } %>
+                ]
             },
             {
                 name:'本期完成计量',
                 type:'bar',
                 tooltip : {trigger: 'item',formatter: "{b}  <br/>{a}:{c}元"},
                 stack: '完成',
-                data:[220, 182, 191, 234, 290, 330, 310]
+                data:[
+                    <% for (const s of stages) {%>
+                    <%- ctx.helper.mul(s.contract_tp, s.qc_tp) %>,
+                    <% } %>
+                ]
             },
             {
                 name:'完成度',
                 type:'line',
                 tooltip : {trigger: 'axis',formatter: "{b}占总标段<br/>{a}:{c} %"},
                 yAxisIndex: 1,
-                data:[10, 15, 20, 13, 11, 9, 5]
+                data:[
+                    <% for (const s of stages) {%>
+                    <%- ctx.helper.mul(ctx.helper.div(ctx.helper.mul(s.contract_tp, s.qc_tp), tender.sum, 2), 100) %>,
+                    <% } %>
+                ]
             },
         ]
     };
@@ -670,7 +694,9 @@
                 type : 'category',
                 boundaryGap : true,
                 data : [
-                    '2月','3月','4月','5月','6月','7月','8月','9月','10月'
+                    <% for (const mp of monthProgress) { %>
+                    '<%- mp.month %>',
+                    <% } %>
                 ]
             }
         ],
@@ -697,7 +723,11 @@
                         }
                     }
                 },
-                data:[10, 10, 30, 40, 50, 60, 80, 85, 100]
+                data:[
+                    <% for (const mp of monthProgress) { %>
+                    <%- mp.end_tp %>,
+                    <% } %>
+                ]
             },
             {
                 name:'本月完成',
@@ -712,7 +742,11 @@
                         }
                     }
                 },
-                data:[10, 0, 20, 10, 10, 10, 10, 5, 15]
+                data:[
+                    <% for (const mp of monthProgress) { %>
+                    <%- mp.tp %>,
+                    <% } %>
+                ]
             }
         ]
     };