Browse Source

带票额度统计 调整

lowkeyman 2 months atrás
parent
commit
19eba5bde8

+ 1 - 1
admin/include/limit.php

@@ -60,8 +60,8 @@ $_limit =  array(
         array('name'=> '异常订单列表', 'op'=>null, 'act'=>'refill_error'),
         array('name'=> '服务器磁盘监控', 'op'=>null, 'act'=>'arw_monitor'),
         array('name'=> '对账管理', 'op'=>null, 'act'=>'orderstats'),
-        array('name'=> '上下游金额统计', 'op'=>null, 'act'=>'refill_amount_stats'),
         array('name'=> '带票额度统计', 'op'=>null, 'act'=>'refill_tax_quota_stats'),
+        array('name'=> '上下游金额统计', 'op'=>null, 'act'=>'refill_amount_stats'),
     )),
     array('name' => '办卡业务', 'child' => array(
         array('name' => '信息列表', 'op' => null, 'act' => 'retail'),

+ 1 - 1
admin/include/menu.php

@@ -142,8 +142,8 @@ $arr = array(
 					array('args'=>'index,refill_error,refill',			'text'=>'异常订单列表'),
 					array('args'=>'index,arw_monitor,refill',			'text'=>'服务器磁盘监控'),
 					array('args'=>'index,refill_tax_stats,refill',	    'text'=>'带票对账统计'),
-					array('args'=>'index,refill_amount_stats,refill',	    'text'=>'上下游金额统计'),
 					array('args'=>'index,refill_tax_quota_stats,refill',	    'text'=>'带票额度统计'),
+					array('args'=>'index,refill_amount_stats,refill',	    'text'=>'上下游金额统计'),
 				)
 			],
 			[

+ 11 - 4
admin/templates/default/js/stats-quota.js

@@ -199,7 +199,7 @@ class CompanyComponent extends Component {
            <div id="{{comp-id}}">
              <div class="quota-tablebar">
                 <button v-on:click="open" type="button" class="layui-btn layui-bg-green">新增</button>
-                <span>主体额度说明:(按月统计)</span>
+                <span>1、主体额度说明:(按月统计)</span>
              </div>
              <div id="company-model-{{comp-id}}" class="company-model" style="display: none;">
               <div class="leftmenu-manager-container selected-items" id="selected-items-{{comp-id}}"></div>
@@ -211,10 +211,12 @@ class CompanyComponent extends Component {
                 <div class="form-group">
                   <label for="total_quota-{{comp-id}}">总额度(元):</label>
                   <input type="text" id="total_quota-{{comp-id}}" />
+                  <span style="display: inline-block;margin-left: 10px;color: red;" id="total_quota_cn-{{comp-id}}"></span>
                 </div>
                 <div class="form-group">
                   <label for="used_quota-{{comp-id}}">已用额度(元):</label>
                   <input type="text" id="used_quota-{{comp-id}}" />
+                  <span style="display: inline-block;margin-left: 10px;color: red;" id="used_quota-{{comp-id}}"></span>
                 </div>
                 <div class="form-group">
                   <label for="remark-{{comp-id}}">备注:</label>
@@ -422,6 +424,11 @@ class CompanyComponent extends Component {
 
                 val = normalizeAmount(val);//过滤,比如前导 0
                 jqObj.val(formatDecimals(val));
+
+                const $span = jqObj.next('span');
+                if ($span.length > 0) {
+                    $span.text(cnMoneyFormat(val));
+                }
             });
     }
 }
@@ -433,7 +440,7 @@ class MerchantComponent extends Component {
            <div id="{{comp-id}}">
              <div class="quota-tablebar">
                 <button v-on:click="open" type="button" class="layui-btn layui-bg-green">新增</button>
-                <span>下游(机构)</span>
+                <span>2、下游(机构)</span>
              </div>
              <div id="merchant-model-{{comp-id}}" class="merchant-model" style="display: none;">
               <div class="leftmenu-manager-container selected-items" id="selected-items-{{comp-id}}"></div>
@@ -725,7 +732,7 @@ class ChannelComponent extends Component {
            <div id="{{comp-id}}">
              <div class="quota-tablebar">
                 <button v-on:click="open" type="button" class="layui-btn layui-bg-green">新增</button>
-                <span>上游(通道)</span>
+                <span>3、上游</span>
              </div>
              <div id="channel-model-{{comp-id}}" class="channel-model" style="display: none;">
               <div class="leftmenu-manager-container selected-items" id="selected-items-{{comp-id}}"></div>
@@ -1016,7 +1023,7 @@ class SummaryComponent extends Component {
            <div id="{{comp-id}}">
              <div class="quota-tablebar">
                 <button v-on:click="open" type="button" class="layui-btn layui-bg-green">新增</button>
-                <span>综合统计</span>
+                <span>4、综合统计</span>
              </div>
              <div id="summary-model-{{comp-id}}" class="summary-model" style="display: none;">
               <div class="leftmenu-manager-container selected-items" id="selected-items-{{comp-id}}"></div>

+ 75 - 0
admin/templates/default/js/stats-utils.js

@@ -32,6 +32,81 @@ function formatDecimals(number, digit= 2) {//格式化金额
     return parseFloat(number).toFixed(digit);
 }
 
+function cnMoneyFormat(money) {
+    let number_data = money;
+    number_data = parseInt(number_data);
+
+    let yi = 0; // 亿
+    let wan = 0; // 万
+    let qian = 0; // 千
+
+    const qian_s = 1000; // 千
+    const wan_s = 10000; // 万
+    const yi_s = 100000000; // 亿
+
+    // 取整
+    function qz(data) {
+        return Math.floor(data);
+    }
+
+    // 为 0 判断输出
+    function data_if(data, amount) {
+        return data === 0 ? '' : data + amount;
+    }
+
+    // 亿
+    function yi_f(data) {
+        yi = qz(data / yi_s);
+        data = data - (yi * yi_s);
+        return {
+            data1: data_if(yi, '亿'),
+            data2: data,
+        };
+    }
+
+    // 万
+    function wan_f(data) {
+        wan = qz(data / wan_s);
+        data = data - (wan * wan_s);
+        return {
+            data1: data_if(wan, '万'),
+            data2: data,
+        };
+    }
+
+    // 千
+    function qian_f(data) {
+        qian = qz(data / qian_s);
+        data = data - (qian * qian_s);
+        return {
+            data1: data_if(qian, '千'),
+            data2: data,
+        };
+    }
+
+    yi = yi_f(number_data);
+    number_data = yi.data2;
+    wan = wan_f(number_data);
+    number_data = wan.data2;
+
+    qian = qian_f(number_data);
+    number_data = qian.data2;
+
+    let result = yi.data1 + wan.data1 + qian.data1 + number_data;
+    let resultValue = result.substr(0, 1);
+
+    if (resultValue === '0') {
+        result = result.substr(1, result.length);
+    }
+    let resultVali = result.substr(0, 3);
+
+    if (resultVali === 'NaN') {
+        return '';
+    } else {
+        return result;
+    }
+}
+
 function isValidKey(obj, key) {
     if (obj.hasOwnProperty(key)) {
         if (obj[key] !== null && obj[key] !== undefined && obj[key] !== '') {

+ 106 - 27
admin/templates/default/refill_quota_stats.index.php

@@ -25,7 +25,7 @@
         display: flex;
         justify-content: space-between;
         align-items: center;
-        border: 1px solid #ccc;
+        /*border: 1px solid #ccc;*/
         padding: 10px;
     }
 
@@ -192,8 +192,8 @@
         font-size: 16px;
         color: #333;
         position: absolute;
-        left: 50%;
-        transform: translateX(-50%);
+        left: 120px;
+        /*transform: translateX(-50%);*/
     }
 
     .quota-tablebar button {
@@ -293,6 +293,25 @@
     .negative-value {
         color: red;
     }
+
+    #tb-summary + .layui-table-view .layui-table-header .layui-table-cell {
+        white-space: normal !important;
+        line-height: 1.5em !important;
+        height: auto !important;
+        overflow: visible !important;
+    }
+
+    #tb-summary + .layui-table-view .layui-table-header th {
+        height: 50px !important;
+        vertical-align: middle !important;
+    }
+
+    #tb-summary + .layui-table-view .layui-table-header th[data-field="channel_invoice_quota"],
+    #tb-summary + .layui-table-view .layui-table-header th[data-field="mch_invoice_quota"] {
+        color: blue !important;
+    }
+
+
 </style>
 
 <div class="page" id="app">
@@ -411,6 +430,8 @@
 
                 const tableData = dataHelper.getCompanyList();
                 tableData.forEach(function (item) {
+                    item.total_quota = formatDecimals(item.total_quota);
+                    item.used_quota = formatDecimals(item.used_quota);
                     item.left_quota = formatDecimals(item.total_quota - item.used_quota);
                 });
                 layui.table.render({
@@ -552,9 +573,10 @@
                         item.amounts = formatDecimals(amountsItem.amounts, 2);
                     } else {
                         item.mch_name = '';
-                        item.amounts = 0.00;
+                        item.amounts = '0';
                     }
 
+                    item.total_invoiced = formatDecimals(item.total_invoiced);
                     Object.assign(item, {
                         estimated_invoice_amount:0,
                         available_invoice_amount: 0,
@@ -761,7 +783,7 @@
                     if (!groupSum[tdGroup]) {
                         groupSum[tdGroup] = 0;
                     }
-                    if (isNumeric(amount)) {
+                    if (isNumeric(amount) && amount > 0) { //负数不计入求和
                         groupSum[tdGroup] += parseFloat(amount);
                     }
                 });
@@ -799,6 +821,10 @@
                 item.remark = remark;
 
                 await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_MERCHANT, item, 2);
+
+                setTimeout(function () {
+                    summaryTable.renderTable();
+                }, 0);
             }
 
             applyOne(index) {
@@ -831,9 +857,10 @@
                         item.amounts = formatDecimals(amountsItem.amounts, 2);
                     } else {
                         item.store_name = '';
-                        item.amounts = 0.00;
+                        item.amounts = '0';
                     }
 
+                    item.total_invoiced = formatDecimals(item.total_invoiced);
                     Object.assign(item, {
                         estimated_invoice_amount:0,
                         available_invoice_amount: 0,
@@ -1040,7 +1067,7 @@
                     if (!groupSum[tdGroup]) {
                         groupSum[tdGroup] = 0;
                     }
-                    if (isNumeric(amount)) {
+                    if (isNumeric(amount) && amount > 0) { //负数不计入求和
                         groupSum[tdGroup] += parseFloat(amount);
                     }
                 });
@@ -1078,6 +1105,10 @@
                 item.remark = remark;
 
                 await dataHelper.addOrUpdateData(CONSTANTS.KEY_QUOTA_CHANNEL, item, 2);
+
+                setTimeout(function () {
+                    summaryTable.renderTable();
+                }, 0);
             }
 
             applyOne(index) {
@@ -1098,6 +1129,8 @@
                 tableData.forEach(item => {
                     Object.assign(item, {
                         subject_quota: 0,
+                        channel_amounts: 0,
+                        channel_total_invoiced: 0,
                         channel_invoice_quota: 0,
                         subject_channel_delta: 0,
                         mch_invoice_quota: 0,
@@ -1118,69 +1151,115 @@
                     cols: [[
                         {field: 'subject', title: '对应主体', width: 150},
                         {field: 'subject_quota', title: '主体额度', width: 100},
-                        {field: 'channel_invoice_quota', title: '上游可开票', width: 150},
+                        {field: 'channel_amounts', title: '上游本月需开票', width: 150},
+                        {field: 'channel_total_invoiced', title: '上游已开票', width: 150},
+                        {field: 'channel_invoice_quota', title: '上游需开票', width: 150},
                         {field: 'subject_channel_delta', title: '差额(主体-上游)', width: 150},
                         {field: 'mch_invoice_quota', title: '下游需开票', width: 150},
                         {field: 'subject_mch_delta', title: '差额(主体-下游)', width: 150},
-                        {field: 'channel_mch_delta', title: '差额(上-下)', width: 150}
+                        {field: 'channel_mch_delta', title: '差额(上-下)<br>ps:还需进货', width: 150}
                     ]],
                     done: function (res, curr, count) {
                         const channelQuota = {};
                         const channelTb = $('#' + channelTable.tableId);
                         const channelTrs = channelTb.next('.layui-table-view').find('.layui-table-body tbody tr');
                         channelTrs.each(function (i, tr) {
-                            const subject = $(tr).find('td[data-field="subject"]').not('.layui-hide').find('div').text();
-                            const estimated_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').not('.layui-hide').find('div').text();
+                            const subject = $(tr).find('td[data-field="subject"]').find('div').text();
+                            const estimated_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').find('div').text();
+                            const channel_amounts = $(tr).find('td[data-field="amounts"]').find('div').text();
+                            const total_invoiced = $(tr).find('td[data-field="total_invoiced"]').find('div').text();
+
                             if (!channelQuota[subject]) {
-                                channelQuota[subject] = 0;
+                                channelQuota[subject] = {
+                                    channel_amounts: 0,
+                                    channel_total_invoiced: 0,
+                                    channel_invoice_quota: 0
+                                };
+                            }
+
+                            const n_estimated_amount = parseFloat(estimated_amount);
+                            if (n_estimated_amount > 0) {
+                                channelQuota[subject].channel_invoice_quota += n_estimated_amount;
                             }
-                            channelQuota[subject] += parseFloat(estimated_amount);
+
+                            channelQuota[subject].channel_amounts += parseFloat(channel_amounts);
+                            channelQuota[subject].channel_total_invoiced += parseFloat(total_invoiced);
                         });
 
                         const merchantQuota = {};
                         const merchantTb = $('#' + merchantTable.tableId);
                         const merchantTrs = merchantTb.next('.layui-table-view').find('.layui-table-body tbody tr');
                         merchantTrs.each(function (i, tr) {
-                            const subject = $(tr).find('td[data-field="subject"]').not('.layui-hide').find('div').text();
-                            const estimated_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').not('.layui-hide').find('div').text();
+                            const subject = $(tr).find('td[data-field="subject"]').find('div').text();
+                            const estimated_amount = $(tr).find('td[data-field="estimated_invoice_amount"]').find('div').text();
                             if (!merchantQuota[subject]) {
                                 merchantQuota[subject] = 0;
                             }
-                            merchantQuota[subject] += parseFloat(estimated_amount);
+
+                            const n_estimated_amount = parseFloat(estimated_amount);
+                            if (n_estimated_amount > 0) {
+                                merchantQuota[subject] += n_estimated_amount;
+                            }
                         });
 
                         const summaryTb = $('#' + that.tableId);
                         const summaryTrs = summaryTb.next('.layui-table-view').find('.layui-table-body tbody tr');
                         summaryTrs.each(function (i, tr) {
-                            const subjectTd = $(tr).find('td[data-field="subject"]').not('.layui-hide').find('div');
-                            const subjectQuotaTd = $(tr).find('td[data-field="subject_quota"]').not('.layui-hide').find('div');
-                            const channelInvoiceQuotaTd = $(tr).find('td[data-field="channel_invoice_quota"]').not('.layui-hide').find('div');
-                            const subjectChannelDeltaTd = $(tr).find('td[data-field="subject_channel_delta"]').not('.layui-hide').find('div');
-                            const mchInvoiceQuotaTd = $(tr).find('td[data-field="mch_invoice_quota"]').not('.layui-hide').find('div');
-                            const subjectMchDeltaTd = $(tr).find('td[data-field="subject_mch_delta"]').not('.layui-hide').find('div');
-                            const channelMchDeltaTd = $(tr).find('td[data-field="channel_mch_delta"]').not('.layui-hide').find('div');
-
-                            let channel_invoice_quota = 0, mch_invoice_quota = 0;
+                            const subjectTd = $(tr).find('td[data-field="subject"]').find('div');
+                            const subjectQuotaTd = $(tr).find('td[data-field="subject_quota"]').find('div');
+                            const channelAmountsTd = $(tr).find('td[data-field="channel_amounts"]').find('div');
+                            const channelTotalInvoicedTd = $(tr).find('td[data-field="channel_total_invoiced"]').find('div');
+                            const channelInvoiceQuotaTd = $(tr).find('td[data-field="channel_invoice_quota"]').find('div');
+                            const subjectChannelDeltaTd = $(tr).find('td[data-field="subject_channel_delta"]').find('div');
+                            const mchInvoiceQuotaTd = $(tr).find('td[data-field="mch_invoice_quota"]').find('div');
+                            const subjectMchDeltaTd = $(tr).find('td[data-field="subject_mch_delta"]').find('div');
+                            const channelMchDeltaTd = $(tr).find('td[data-field="channel_mch_delta"]').find('div');
+
+                            let channel_invoice_quota = 0, channel_amounts = 0, channel_total_invoiced = 0, mch_invoice_quota = 0;
                             const subject_quota = parseFloat(subjectQuotaTd.text());
                             const subject = subjectTd.text();
                             if (channelQuota[subject] !== undefined) {
-                                channel_invoice_quota = channelQuota[subject];
+                                channel_invoice_quota = channelQuota[subject].channel_invoice_quota;
+                                channel_amounts = channelQuota[subject].channel_amounts;
+                                channel_total_invoiced = channelQuota[subject].channel_total_invoiced;
                             }
                             if (merchantQuota[subject] !== undefined) {
                                 mch_invoice_quota = merchantQuota[subject];
                             }
 
+                            channelAmountsTd.html(formatDecimals(channel_amounts));
+                            channelTotalInvoicedTd.html(formatDecimals(channel_total_invoiced));
                             channelInvoiceQuotaTd.html(formatDecimals(channel_invoice_quota));
                             subjectChannelDeltaTd.html(formatDecimals(subject_quota - channel_invoice_quota));
                             mchInvoiceQuotaTd.html(formatDecimals(mch_invoice_quota));
                             subjectMchDeltaTd.html(formatDecimals(subject_quota - mch_invoice_quota));
-                            channelMchDeltaTd.html(formatDecimals(channel_invoice_quota - mch_invoice_quota));
+                            channelMchDeltaTd.html(formatDecimals(channel_amounts - mch_invoice_quota));
                         });
 
                         that.setValueClass(['subject_quota', 'channel_invoice_quota', 'subject_channel_delta', 'mch_invoice_quota', 'subject_mch_delta', 'channel_mch_delta']);
+                        that.setRole();
                     }
                 });
             }
+
+            setRole() {
+                if (isAdmin === true) {
+                    return;
+                }
+
+                const tbRoot = $('#' + this.tableId);
+                const bodyTrs = tbRoot.next('.layui-table-view').find('.layui-table-body tbody tr');
+                const headerTrs = tbRoot.next('.layui-table-view').find('.layui-table-header thead tr');
+                const hideColumns = ['channel_amounts', 'channel_total_invoiced'];
+                for (let col of hideColumns) {
+                    bodyTrs.each(function (i, tr) {
+                        $(tr).find('td[data-field="' + col + '"]').addClass('layui-hide');
+                    });
+                    headerTrs.each(function (i, tr) {
+                        $(tr).find('th[data-field="' + col + '"]').addClass('layui-hide');
+                    });
+                }
+            }
         }