ソースを参照

计量管理,计量汇总,新增合同支付汇总

MaiXinRong 3 週間 前
コミット
16b49ea4d8

+ 42 - 0
app/controller/spss_controller.js

@@ -79,6 +79,19 @@ module.exports = app => {
             }
         }
 
+        async gatherStagePay(ctx) {
+            try {
+                const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
+                const renderData = {
+                    categoryData,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherStagePay)
+                };
+                await this.layout('spss/gather_stage_pay.ejs', renderData, 'spss/spss_select_modal.ejs');
+            } catch(err) {
+                ctx.log(err);
+            }
+        }
+
         async compareLedger(ctx) {
             try {
                 const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
@@ -366,6 +379,28 @@ module.exports = app => {
                 : await this._loadStagesData(tender, filter.stages, filter.preStage, filter.endStage);
         }
 
+        async _loadStagePayData(tender, stage) {
+            if (!stage) return [];
+
+            const dealPay = await this.ctx.service.stagePay.getStagePays(stage);
+            if (!stage.readOnly) {
+                // 计算 本期金额
+                const PayCalculator = require('../lib/pay_calc');
+                const payCalculator = new PayCalculator(this.ctx, stage, tender.info);
+                await payCalculator.calculateAll(dealPay);
+            }
+            return dealPay;
+        }
+        async _loadStagesPayData(tender, stages, preStage, endStage) {
+            // todo
+            return [];
+        }
+        async _loadPayData(tender, filter) {
+            return filter.type === 'stage'
+                ? await this._loadStagePayData(tender, filter.stage)
+                : await this._loadStagesPayData(tender, filter.stage, filter.preStage, filter.endStage);
+        }
+
         async _loadStageJgclData(tender, stage) {
             if (!stage) return [];
 
@@ -531,6 +566,13 @@ module.exports = app => {
                         }
                         [result.bills, result.pos] = await this._loadStageLedgerData(tender, stageFilter);
                         break;
+                    case 'pay':
+                        if (!stageFilter) {
+                            stageFilter = await this._filterStages(tender, stageInfo);
+                            result.stage_filter = stageFilter.filter;
+                        }
+                        result.pay = await this._loadPayData(tender, stageFilter);
+                        break;
                     case 'jgcl':
                         if (!stageFilter) {
                             stageFilter = await this._filterStages(tender, stageInfo);

+ 158 - 0
app/public/js/spss_gather_stage_pay.js

@@ -0,0 +1,158 @@
+$(document).ready(() => {
+    autoFlashHeight();
+    $('#data-spread').height($('.sjs-height-0').height() - $('.nav-tabs').height() - 16);
+    const paySpreadSetting = {
+        cols: [
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 235, formatter: '@'},
+            {title: '扣款', colSpan: '1', rowSpan: '2', field: 'minus', hAlign: 1, width: 60, cellType: 'checkbox'},
+        ],
+        baseCols: [
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 235, formatter: '@'},
+            {title: '扣款', colSpan: '1', rowSpan: '2', field: 'minus', hAlign: 1, width: 60, cellType: 'checkbox'},
+        ],
+        extraCols: [
+            {title: '标段1|第1期', colSpan: '1|1', rowSpan: '1|1', field: 'show_tp1', hAlign: 2, width: 80, type: 'Number', formatTitle: '%s|%f', formatField: 'show_tp_%d'},
+        ],
+        endCols: [
+            {title: '合计', colSpan: '1', rowSpan: '2', field: 'sum_tp', hAlign: 2, width: 80, type: 'Number'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
+    };
+
+    const paySpread = SpreadJsObj.createNewSpread($('#pay-spread')[0]);
+    const paySheet = paySpread.getActiveSheet();
+    const payGather = {
+        pays: [],
+        seData: 'cur',
+        gatherPays(tenders) {
+            this.pays = [];
+            for (const [i, t] of tenders.entries()) {
+                const endfix = '_' + (i + 1);
+                for (const data of t.pay) {
+                    if (!data.name) data.name = '';
+                    data.minus = data.minus ? 1 : 0;
+
+                    let p = this.pays.find(x => { return x.name === data.name && x.minus === data.minus; });
+                    if (!p) {
+                        p = { name: data.name, minus: data.minus };
+                        this.pays.push(p);
+                    }
+                    p['tp' + endfix] = ZhCalc.add(p['tp' + endfix], data.tp);
+                    p['pre_tp' + endfix] = ZhCalc.add(p['pre_tp' + endfix], data.pre_tp);
+                    p['end_tp' + endfix] = ZhCalc.add(p['end_tp' + endfix], data.end_tp);
+
+                    p['sum_tp' + endfix] = ZhCalc.add(p['sum_tp' + endfix], data.tp);
+                    p['sum_pre_tp' + endfix] = ZhCalc.add(p['sum_pre_tp' + endfix], data.pre_tp);
+                    p['sum_end_tp' + endfix] = ZhCalc.add(p['sum_end_tp' + endfix], data.end_tp);
+                }
+            }
+        },
+        gatherStageExtraData(tenders) {
+            this.tenderCount = tenders.length;
+            this.gatherPays(tenders);
+        },
+        rebuildSpreadSetting(tenders) {
+            paySpreadSetting.cols = [...paySpreadSetting.baseCols];
+            const pushExtraCols = function(spreadSetting) {
+                for (const [i, tender] of tenders.entries()) {
+                    for (const col of spreadSetting.extraCols) {
+                        const newCol = JSON.parse(JSON.stringify(col));
+                        if (newCol.formatTitle) newCol.title = newCol.formatTitle.replace('%s', tender.name).replace('%f', tender.stage_filter);
+                        if (newCol.formatField) newCol.field = newCol.formatField.replace('%d', i + 1);
+                        spreadSetting.cols.push(newCol);
+                    }
+                }
+            };
+            pushExtraCols(paySpreadSetting);
+            paySpreadSetting.cols.push(...paySpreadSetting.endCols);
+        },
+        loadPayShowData(field) {
+            const prefix = field === 'end' ? 'end_' : '';
+            for (const cl of this.pays) {
+                for (let i = 1; i<= this.tenderCount; i++) {
+                    cl['show_tp_' + i] = cl[prefix + 'tp_' + i];
+                }
+                cl.sum_tp = cl['sum_' + prefix + 'tp'];
+            }
+            SpreadJsObj.reloadColData(paySheet, 2, this.tenderCount + 1);
+        },
+        loadShowData(force = false) {
+            const field = $('[name=compare-data]:checked').val();
+            if (field === this.seData && !force) return;
+            this.seData = field;
+            this.loadPayShowData(field);
+        },
+        refreshShowData() {
+            const field = $('[name=compare-data]:checked').val();
+            if (field === this.seData) return;
+
+            this.loadShowData();
+        },
+        loadSheetData() {
+            SpreadJsObj.initSheet(paySheet, paySpreadSetting);
+            SpreadJsObj.loadSheetData(paySheet, SpreadJsObj.DataType.Data, this.pays);
+            SpreadJsObj.locateRow(paySheet, 0);
+        },
+        refreshStageExtraData(type) {
+            if (type) {
+                if (this.seType === type) return;
+                this.seType = type;
+            }
+            this.loadSheetData();
+        },
+    };
+    payGather.loadSheetData();
+
+    const tenderSelect = TenderSelectMulti({
+        title: '汇总标段',
+        type: 'gather',
+        dataType: 'stage',
+        zoneValid: false,
+        afterSelect: function(select) {
+            const data = { filter: 'pay', tender: select };
+            postData(`/sp/${spid}/spss/load`, data, function(result) {
+                payGather.rebuildSpreadSetting(result);
+                payGather.gatherStageExtraData(result);
+                SpreadJsObj.reLoadSheetHeader(paySheet, true);
+                payGather.loadShowData(true);
+                payGather.loadSheetData();
+            });
+        },
+    });
+    $('#gather-select').click(tenderSelect.showSelect);
+
+    $('[name=compare-data]').click(function() {
+        payGather.refreshShowData();
+    });
+
+    $('#export-excel').click(function() {
+        const sheets = [];
+        sheets.push({ name: '合同支付', setting: paySpreadSetting, data: payGather.pays });
+        SpreadExcelObj.exportSimpleXlsxSheets(sheets, "计量汇总-合同支付.xlsx");
+    });
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+            paySpread.refresh();
+        }
+    });
+});

+ 1 - 0
app/router.js

@@ -297,6 +297,7 @@ module.exports = app => {
     app.get('/sp/:id/spss/gather/ledger', sessionAuth, subProjectCheck, 'spssController.gatherLedger');
     app.get('/sp/:id/spss/gather/stage', sessionAuth, subProjectCheck, 'spssController.gatherStage');
     app.get('/sp/:id/spss/gather/stage/extra', sessionAuth, subProjectCheck, 'spssController.gatherStageExtra');
+    app.get('/sp/:id/spss/gather/stage/pay', sessionAuth, subProjectCheck, 'spssController.gatherStagePay');
     app.get('/sp/:id/spss/compare/ledger', sessionAuth, subProjectCheck, 'spssController.compareLedger');
     app.get('/sp/:id/spss/compare/stage', sessionAuth, subProjectCheck, 'spssController.compareStage');
     app.post('/sp/:id/spss/load', sessionAuth, subProjectCheck, 'spssController.load');

+ 1 - 0
app/view/spss/gather_stage.ejs

@@ -9,6 +9,7 @@
                         <div class="btn-group btn-group-toggle group-tab">
                             <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage" class="btn btn-sm btn-light active">计量台账 </a>
                             <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/extra" class="btn btn-sm btn-light">其他台账 </a>
+                            <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/pay" class="btn btn-sm btn-light">合同支付 </a>
                         </div>
                     </div>
                     <div class="d-inline-block mr-2">

+ 1 - 0
app/view/spss/gather_stage_extra.ejs

@@ -9,6 +9,7 @@
                         <div class="btn-group btn-group-toggle group-tab">
                             <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage" class="btn btn-sm btn-light">计量台账 </a>
                             <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/extra" class="btn btn-sm btn-light active">其他台账 </a>
+                            <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/pay" class="btn btn-sm btn-light">合同支付 </a>
                         </div>
                     </div>
                     <div class="d-inline-block">

+ 40 - 0
app/view/spss/gather_stage_pay.ejs

@@ -0,0 +1,40 @@
+<% include ../tender/list_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex">
+            <% include ../tender/list_sub_mini_menu.ejs %>
+            <div class="title-main  d-flex justify-content-between">
+                <div>
+                    <div class="d-inline-block">
+                        <div class="btn-group btn-group-toggle group-tab">
+                            <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage" class="btn btn-sm btn-light">计量台账 </a>
+                            <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/extra" class="btn btn-sm btn-light">其他台账 </a>
+                            <a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage/pay" class="btn btn-sm btn-light active">合同支付 </a>
+                        </div>
+                    </div>
+                    <div class="d-inline-block">
+                        <button class="btn btn-primary btn-sm mr-2" id="export-excel">导出Excel</button>
+                        <button class="btn btn-sm btn-primary" id="gather-select">汇总标段</button>
+                    </div>
+                    <div class="d-inline-block ml-2">
+                        <span>汇总数据:</span>
+                        <div class="d-inline-block" style="vertical-align: middle">
+                            <div class="form-check form-check-inline">
+                                <input class="form-check-input pt-1" type="radio" id="radio_cur" value="contract" name="compare-data" checked="checked">
+                                <label class="form-check-label" for="radio_cur">本期</label>
+                            </div>
+                            <div class="form-check form-check-inline">
+                                <input class="form-check-input" type="radio" id="radio_end" value="end" name="compare-data">
+                                <label class="form-check-label" for="radio_end">截止本期</label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="sjs-height-0" style="background-color: #fff" id="pay-spread">
+        </div>
+    </div>
+</div>

+ 1 - 1
app/view/tender/list_sub_menu_list.ejs

@@ -29,7 +29,7 @@
         <div class="collapse show" id="spssCollapse" style="">
             <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/spss/info') { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/info"><span class="ml-3">金额汇总</span></a></li>
             <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/spss/gather/ledger') { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/gather/ledger"><span class="ml-3">台账汇总</span></a></li>
-            <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/spss/gather/stage') { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage"><span class="ml-3">计量汇总</span></a></li>
+            <li class="<% if (ctx.url.indexOf('/sp/' + ctx.subProject.id + '/spss/gather/stage') === 0) { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/gather/stage"><span class="ml-3">计量汇总</span></a></li>
             <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/spss/compare/ledger') { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/compare/ledger"><span class="ml-3">台账对比</span></a></li>
             <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/spss/compare/stage') { %>active<% } %>"><a href="/sp/<%- ctx.subProject.id %>/spss/compare/stage"><span class="ml-3">计量对比</span></a></li>
         </div>

+ 23 - 0
config/web.js

@@ -2118,6 +2118,29 @@ const JsFiles = {
                 ],
                 mergeFile: 'spss_gather_stage_extra',
             },
+            gatherStagePay: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                    '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
+                    '/public/js/decimal.min.js',
+                    '/public/js/math.min.js',
+                    '/public/js/file-saver/FileSaver.js',
+                    '/public/js/datepicker/datepicker.min.js', '/public/js/datepicker/datepicker.zh.js',
+                ],
+                mergeFiles: [
+                    '/public/js/sub_menu.js',
+                    '/public/js/div_resizer.js',
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/shares/sjs_setting.js',
+                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/tender_select_multi.js',
+                    '/public/js/zh_calc.js',
+                    '/public/js/path_tree.js',
+                    '/public/js/shares/tenders2tree.js',
+                    '/public/js/spss_gather_stage_pay.js',
+                ],
+                mergeFile: 'spss_gather_stage_pay',
+            },
             compareLedger: {
                 files: [
                     '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',