Browse Source

1. 报表内存表,期-合同支付数据

MaiXinRong 5 years ago
parent
commit
17a727ef3f

+ 2 - 7
app/service/report_memory.js

@@ -514,20 +514,15 @@ module.exports = app => {
             await this.ctx.service.tender.checkTender(tid);
             await this.ctx.service.stage.checkStage(sid);
 
-            const dealPay = await this.ctx.service.stagePay.getStagePays(ctx.stage);
+            const dealPay = await this.ctx.service.stagePay.getStagePays(this.ctx.stage);
 
-            if (ctx.stage.order > 1) {
-                renderData.pre = await ctx.service.stageBillsFinal.getSumTotalPrice(ctx.stage.tid, ctx.stage.order - 1);
-                renderData.pre.gather_tp = ctx.helper.add(renderData.pre.contract_tp, renderData.pre.qc_tp);
-            } else {
-                renderData.pre = {contract_tp: null, qc_tp: null, gather_tp: null};
-            }
             if (!this.ctx.stage.readOnly && this.ctx.stage.check_calc) {
                 // 计算 本期金额
                 const PayCalculator = require('../lib/pay_calc');
                 const payCalculator = new PayCalculator(this.ctx, this.ctx.stage, this.ctx.tender.info);
                 await payCalculator.calculateAll(dealPay);
             }
+            return dealPay;
         }
     }
 

+ 244 - 244
test/app/lib/rpt_data_analysis.test.js

@@ -35,235 +35,235 @@ describe('test/app/service/report_memory.test.js', () => {
         mockData.session = ctx.session;
     });
     // 数据
-    // it('test changeSort', function* () {
-    //     const ctx = app.mockContext(mockData);
-    //
-    //     // test12 - 第6期
-    //     const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
-    //     const params = {
-    //         tender_id: stage.tid,
-    //         stage_id: stage.id,
-    //     };
-    //     const filters = ['change', 'change_audit_list'];
-    //     const data = yield ctx.service.report.getReportData(params, filters);
-    //     reportDataAnalysis.analysisObj.changeSort.fun(ctx, data);
-    //     assert(data.change[0].code === 'test7-BG-001');
-    //     assert(data.change[2].code === 'test7-BG-003');
-    //     const changeCid = ctx.helper._.map(data.change, 'cid');
-    //     const changeBillsCid = ctx.helper._.uniq(ctx.helper._.map(data.change_audit_list, 'cid'));
-    //     assert(changeCid.length === changeBillsCid.length);
-    //     changeCid.forEach(function (a, i) {
-    //         assert(a === changeBillsCid[i]);
-    //     });
-    // });
-    // it('test gatherGcl && sortGcl', function* () {
-    //     const ctx = app.mockContext(mockData);
-    //
-    //     // test12 - 第6期
-    //     const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
-    //     const params = {
-    //         tender_id: stage.tid,
-    //         stage_id: stage.id,
-    //     };
-    //     const filters = ['mem_stage_bills'];
-    //     const data = yield ctx.service.report.getReportData(params, filters, {
-    //         mem_stage_bills: [
-    //             'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-    //             'code', 'b_code', 'name', 'unit', 'unit_price',
-    //             'deal_qty', 'deal_tp',
-    //             'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-    //             'dgn_qty1', 'dgn_qty2',
-    //             'drawing_code', 'memo', 'node_type', 'is_tp',
-    //             'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-    //             'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-    //             'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
-    //             'final_tp', 'final_ratio',
-    //             'qc_bgl_code',
-    //             'chapter',
-    //         ]
-    //     });
-    //     assert(data.mem_stage_bills.length === 216);
-    //     reportDataAnalysis.analysisObj.gatherGcl.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //         {field: 'name', table: 'mem_stage_bills'},
-    //         {field: 'unit', table: 'mem_stage_bills'},
-    //         {field: 'unit_price', table: 'mem_stage_bills'},
-    //         {field: 'is_leaf', table: 'mem_stage_bills'},
-    //     ]);
-    //     assert(data.mem_stage_bills.length === 43);
-    //     reportDataAnalysis.analysisObj.sortGcl.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //     ]);
-    //     const codeIndex = ctx.helper._.map(data.mem_stage_bills, 'b_code');
-    //     const codeIndex100 = ['103-1', '103-2', '103-3-a', '103-3-b', '103-4', '104-1'];
-    //     const codeIndex200 = [
-    //         '203-1-a', '203-1-b', '203-1-d', '204-1-b', '204-1-g-4', '204-1-j', '205-1-o-1', '206-2',
-    //         '207-1-b', '207-2-a', '207-3-a', '207-4-a', '208-1-a', '208-3-a', '208-3-c', '208-4-b-1', '209-1-a',
-    //     ];
-    //     const codeIndex400 = [
-    //         '403-1-a', '403-1-b', '403-2-a', '403-2-b', '403-3-a', '403-3-b', '403-4-a', '403-4-b',
-    //         '405-1-b-5', '405-1-b-6', '410-1-b', '410-1-c', '410-2-b', '410-2-c', '410-6-c',
-    //         '411-5', '411-7-a', '411-8-a', '413-1-a', '417-5-a'
-    //     ];
-    //     let codeResult = codeIndex100.concat(codeIndex200, codeIndex400);
-    //     codeIndex.forEach(function (a, i) {
-    //         assert(a === codeResult[i]);
-    //     });
-    // });
-    // it('test gatherChapter', function* () {
-    //     const ctx = app.mockContext(mockData);
-    //
-    //     // test12 - 第6期
-    //     const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
-    //     const params = {
-    //         tender_id: stage.tid,
-    //         stage_id: stage.id,
-    //     };
-    //     const filters = ['mem_stage_bills', 'tender_info'];
-    //     const data = yield ctx.service.report.getReportData(params, filters, {
-    //         mem_stage_bills: [
-    //             'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-    //             'code', 'b_code', 'name', 'unit', 'unit_price',
-    //             'deal_qty', 'deal_tp',
-    //             'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-    //             'dgn_qty1', 'dgn_qty2',
-    //             'drawing_code', 'memo', 'node_type', 'is_tp',
-    //             'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-    //             'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-    //             'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
-    //             'final_tp', 'final_ratio',
-    //             'qc_bgl_code',
-    //             'chapter',
-    //         ]
-    //     });
-    //     reportDataAnalysis.analysisObj.gatherChapter.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //         {field: 'is_leaf', table: 'mem_stage_bills'},
-    //     ]);
-    //     const chapter100 = ctx.helper._.find(data.mem_stage_bills, {code: '100'});
-    //     assert(chapter100.total_price === 1045756);
-    //     const chapter200 = ctx.helper._.find(data.mem_stage_bills, {code: '200'});
-    //     assert(chapter200.total_price.toFixed(0) == 3813369);
-    //     assert(chapter200.contract_tp == 700.5);
-    //     const chapter400 = ctx.helper._.find(data.mem_stage_bills, {code: '400'});
-    //     assert(chapter400.total_price.toFixed(0) == 1231018);
-    // });
-    // it('test gatherChapter', function* () {
-    //     const ctx = app.mockContext(mockData);
-    //
-    //     // test12 - 第6期
-    //     const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
-    //     const params = {
-    //         tender_id: stage.tid,
-    //         stage_id: stage.id,
-    //     };
-    //     const filters = ['mem_stage_bills', 'tender_info'];
-    //     const data = yield ctx.service.report.getReportData(params, filters, {
-    //         mem_stage_bills: [
-    //             'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-    //             'code', 'b_code', 'name', 'unit', 'unit_price',
-    //             'deal_qty', 'deal_tp',
-    //             'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-    //             'dgn_qty1', 'dgn_qty2',
-    //             'drawing_code', 'memo', 'node_type', 'is_tp',
-    //             'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-    //             'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-    //             'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
-    //             'final_tp', 'final_ratio',
-    //             'qc_bgl_code',
-    //             'chapter',
-    //         ]
-    //     });
-    //     reportDataAnalysis.analysisObj.gatherChapter.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //         {field: 'is_leaf', table: 'mem_stage_bills'},
-    //     ]);
-    //     const chapter100 = ctx.helper._.find(data.mem_stage_bills, {code: '100'});
-    //     assert(chapter100.total_price === 1045756);
-    //     const chapter200 = ctx.helper._.find(data.mem_stage_bills, {code: '200'});
-    //     assert(chapter200.total_price.toFixed(0) == 3813369);
-    //     assert(chapter200.contract_tp == 700.5);
-    //     const chapter400 = ctx.helper._.find(data.mem_stage_bills, {code: '400'});
-    //     assert(chapter400.total_price.toFixed(0) == 1231018);
-    // });
-    // it('test join', function* () {
-    //     const ctx = app.mockContext(mockData);
-    //
-    //     // test12 - 第6期
-    //     const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
-    //     const params = {
-    //         tender_id: stage.tid,
-    //         stage_id: stage.id,
-    //     };
-    //     const filters = ['mem_stage_bills', 'deal_bills'];
-    //     const data = yield ctx.service.report.getReportData(params, filters, {
-    //         mem_stage_bills: [
-    //             'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-    //             'code', 'b_code', 'name', 'unit', 'unit_price',
-    //             'deal_qty', 'deal_tp',
-    //             'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-    //             'dgn_qty1', 'dgn_qty2',
-    //             'drawing_code', 'memo', 'node_type', 'is_tp',
-    //             'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-    //             'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-    //             'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
-    //             'final_tp', 'final_ratio',
-    //             'qc_bgl_code',
-    //             'chapter',
-    //         ]
-    //     });
-    //     assert(data.mem_stage_bills.length === 216);
-    //     reportDataAnalysis.analysisObj.gatherGcl.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //         {field: 'name', table: 'mem_stage_bills'},
-    //         {field: 'unit', table: 'mem_stage_bills'},
-    //         {field: 'unit_price', table: 'mem_stage_bills'},
-    //         {field: 'is_leaf', table: 'mem_stage_bills'},
-    //     ]);
-    //     assert(data.mem_stage_bills.length === 43);
-    //     const joinOptions = {
-    //         main: 'mem_stage_bills',
-    //         sub: 'deal_bills',
-    //         keyFields: [
-    //             {main: 'b_code', sub: 'code', type: 'string'},
-    //             {main: 'name', sub: 'name',type: 'string'},
-    //             {main: 'unit', sub: 'unit',type: 'string'},
-    //             {main: 'unit_price', sub: 'unit_price',type: 'number'},
-    //         ],
-    //         importFields: [
-    //             {main: 'ex_value1', sub: 'quantity', type: 'number'},
-    //             {main: 'ex_value2', sub: 'total_price', type: 'number'}
-    //         ],
-    //         joinType: 'outer', //'outer', 'main', 'sub', 'inner'
-    //     };
-    //     yield ctx.helper.saveBufferFile(JSON.stringify(joinOptions, '', '\t'), ctx.app.baseDir + '/analysis_join_options.json');
-    //     reportDataAnalysis.analysisObj.join.fun(ctx, data, [], joinOptions);
-    //     assert(data.mem_stage_bills.length === 132);
-    //     reportDataAnalysis.analysisObj.sortGcl.fun(ctx, data, [
-    //         {field: 'b_code', table: 'mem_stage_bills'},
-    //     ]);
-    //     const codeIndex = ctx.helper._.map(data.mem_stage_bills, 'b_code');
-    //     const codeIndex100 = ['101-1-b', '102-2', '102-3', '102-4', '102-5', '103-1', '103-2',
-    //         '103-3',  '103-3-a', '103-3-b', '103-4', '104-1', '123-1'];
-    //     const codeIndex200 = [
-    //         '203-1-a', '203-1-a', '203-1-b', '203-1-b', '203-1-d', '203-1-d', '204-1-b', '204-1-b',
-    //         '204-1-c', '204-1-d',
-    //         '204-1-g-4', '204-1-g-4', '204-1-j', '204-1-j', '205-1-o-1', '205-1-o-1', '206-2', '206-2',
-    //         '207-1-b',
-    //         '207-2-a', '207-2-a',
-    //         '207-2-b', '207-2-c', '207-3-a',
-    //         '207-4-a', '207-4-a',
-    //         '207-4-c', '207-10-a',
-    //         '208-1-a', '208-1-a', '208-3-a', '208-3-a',
-    //         '208-3-b',
-    //         '208-3-c', '208-3-c', '208-4-b-1', '208-4-b-1', '209-1-a', '209-1-a',
-    //         '209-3', '209-3-b', '215-12', '215-12-a'
-    //     ];
-    //     let codeResult = codeIndex100.concat(codeIndex200);
-    //     codeResult.forEach(function (a, i) {
-    //         assert(a === codeIndex[i]);
-    //     });
-    // });
+    it('test changeSort', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const params = {
+            tender_id: stage.tid,
+            stage_id: stage.id,
+        };
+        const filters = ['change', 'change_audit_list'];
+        const data = yield ctx.service.report.getReportData(params, filters);
+        reportDataAnalysis.analysisObj.changeSort.fun(ctx, data);
+        assert(data.change[0].code === 'test7-BG-001');
+        assert(data.change[2].code === 'test7-BG-003');
+        const changeCid = ctx.helper._.map(data.change, 'cid');
+        const changeBillsCid = ctx.helper._.uniq(ctx.helper._.map(data.change_audit_list, 'cid'));
+        assert(changeCid.length === changeBillsCid.length);
+        changeCid.forEach(function (a, i) {
+            assert(a === changeBillsCid[i]);
+        });
+    });
+    it('test gatherGcl && sortGcl', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const params = {
+            tender_id: stage.tid,
+            stage_id: stage.id,
+        };
+        const filters = ['mem_stage_bills'];
+        const data = yield ctx.service.report.getReportData(params, filters, {
+            mem_stage_bills: [
+                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
+                'code', 'b_code', 'name', 'unit', 'unit_price',
+                'deal_qty', 'deal_tp',
+                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
+                'dgn_qty1', 'dgn_qty2',
+                'drawing_code', 'memo', 'node_type', 'is_tp',
+                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
+                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
+                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
+                'final_tp', 'final_ratio',
+                'qc_bgl_code',
+                'chapter',
+            ]
+        });
+        assert(data.mem_stage_bills.length === 216);
+        reportDataAnalysis.analysisObj.gatherGcl.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+            {field: 'name', table: 'mem_stage_bills'},
+            {field: 'unit', table: 'mem_stage_bills'},
+            {field: 'unit_price', table: 'mem_stage_bills'},
+            {field: 'is_leaf', table: 'mem_stage_bills'},
+        ]);
+        assert(data.mem_stage_bills.length === 43);
+        reportDataAnalysis.analysisObj.sortGcl.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+        ]);
+        const codeIndex = ctx.helper._.map(data.mem_stage_bills, 'b_code');
+        const codeIndex100 = ['103-1', '103-2', '103-3-a', '103-3-b', '103-4', '104-1'];
+        const codeIndex200 = [
+            '203-1-a', '203-1-b', '203-1-d', '204-1-b', '204-1-g-4', '204-1-j', '205-1-o-1', '206-2',
+            '207-1-b', '207-2-a', '207-3-a', '207-4-a', '208-1-a', '208-3-a', '208-3-c', '208-4-b-1', '209-1-a',
+        ];
+        const codeIndex400 = [
+            '403-1-a', '403-1-b', '403-2-a', '403-2-b', '403-3-a', '403-3-b', '403-4-a', '403-4-b',
+            '405-1-b-5', '405-1-b-6', '410-1-b', '410-1-c', '410-2-b', '410-2-c', '410-6-c',
+            '411-5', '411-7-a', '411-8-a', '413-1-a', '417-5-a'
+        ];
+        let codeResult = codeIndex100.concat(codeIndex200, codeIndex400);
+        codeIndex.forEach(function (a, i) {
+            assert(a === codeResult[i]);
+        });
+    });
+    it('test gatherChapter', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const params = {
+            tender_id: stage.tid,
+            stage_id: stage.id,
+        };
+        const filters = ['mem_stage_bills', 'tender_info'];
+        const data = yield ctx.service.report.getReportData(params, filters, {
+            mem_stage_bills: [
+                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
+                'code', 'b_code', 'name', 'unit', 'unit_price',
+                'deal_qty', 'deal_tp',
+                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
+                'dgn_qty1', 'dgn_qty2',
+                'drawing_code', 'memo', 'node_type', 'is_tp',
+                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
+                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
+                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
+                'final_tp', 'final_ratio',
+                'qc_bgl_code',
+                'chapter',
+            ]
+        });
+        reportDataAnalysis.analysisObj.gatherChapter.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+            {field: 'is_leaf', table: 'mem_stage_bills'},
+        ]);
+        const chapter100 = ctx.helper._.find(data.mem_stage_bills, {code: '100'});
+        assert(chapter100.total_price === 1045756);
+        const chapter200 = ctx.helper._.find(data.mem_stage_bills, {code: '200'});
+        assert(chapter200.total_price.toFixed(0) == 3813369);
+        assert(chapter200.contract_tp == 700.5);
+        const chapter400 = ctx.helper._.find(data.mem_stage_bills, {code: '400'});
+        assert(chapter400.total_price.toFixed(0) == 1231018);
+    });
+    it('test gatherChapter', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const params = {
+            tender_id: stage.tid,
+            stage_id: stage.id,
+        };
+        const filters = ['mem_stage_bills', 'tender_info'];
+        const data = yield ctx.service.report.getReportData(params, filters, {
+            mem_stage_bills: [
+                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
+                'code', 'b_code', 'name', 'unit', 'unit_price',
+                'deal_qty', 'deal_tp',
+                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
+                'dgn_qty1', 'dgn_qty2',
+                'drawing_code', 'memo', 'node_type', 'is_tp',
+                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
+                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
+                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
+                'final_tp', 'final_ratio',
+                'qc_bgl_code',
+                'chapter',
+            ]
+        });
+        reportDataAnalysis.analysisObj.gatherChapter.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+            {field: 'is_leaf', table: 'mem_stage_bills'},
+        ]);
+        const chapter100 = ctx.helper._.find(data.mem_stage_bills, {code: '100'});
+        assert(chapter100.total_price === 1045756);
+        const chapter200 = ctx.helper._.find(data.mem_stage_bills, {code: '200'});
+        assert(chapter200.total_price.toFixed(0) == 3813369);
+        assert(chapter200.contract_tp == 700.5);
+        const chapter400 = ctx.helper._.find(data.mem_stage_bills, {code: '400'});
+        assert(chapter400.total_price.toFixed(0) == 1231018);
+    });
+    it('test join', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const params = {
+            tender_id: stage.tid,
+            stage_id: stage.id,
+        };
+        const filters = ['mem_stage_bills', 'deal_bills'];
+        const data = yield ctx.service.report.getReportData(params, filters, {
+            mem_stage_bills: [
+                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
+                'code', 'b_code', 'name', 'unit', 'unit_price',
+                'deal_qty', 'deal_tp',
+                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
+                'dgn_qty1', 'dgn_qty2',
+                'drawing_code', 'memo', 'node_type', 'is_tp',
+                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
+                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
+                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
+                'final_tp', 'final_ratio',
+                'qc_bgl_code',
+                'chapter',
+            ]
+        });
+        assert(data.mem_stage_bills.length === 216);
+        reportDataAnalysis.analysisObj.gatherGcl.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+            {field: 'name', table: 'mem_stage_bills'},
+            {field: 'unit', table: 'mem_stage_bills'},
+            {field: 'unit_price', table: 'mem_stage_bills'},
+            {field: 'is_leaf', table: 'mem_stage_bills'},
+        ]);
+        assert(data.mem_stage_bills.length === 43);
+        const joinOptions = {
+            main: 'mem_stage_bills',
+            sub: 'deal_bills',
+            keyFields: [
+                {main: 'b_code', sub: 'code', type: 'string'},
+                {main: 'name', sub: 'name',type: 'string'},
+                {main: 'unit', sub: 'unit',type: 'string'},
+                {main: 'unit_price', sub: 'unit_price',type: 'number'},
+            ],
+            importFields: [
+                {main: 'ex_value1', sub: 'quantity', type: 'number'},
+                {main: 'ex_value2', sub: 'total_price', type: 'number'}
+            ],
+            joinType: 'outer', //'outer', 'main', 'sub', 'inner'
+        };
+        yield ctx.helper.saveBufferFile(JSON.stringify(joinOptions, '', '\t'), ctx.app.baseDir + '/analysis_join_options.json');
+        reportDataAnalysis.analysisObj.join.fun(ctx, data, [], joinOptions);
+        assert(data.mem_stage_bills.length === 132);
+        reportDataAnalysis.analysisObj.sortGcl.fun(ctx, data, [
+            {field: 'b_code', table: 'mem_stage_bills'},
+        ]);
+        const codeIndex = ctx.helper._.map(data.mem_stage_bills, 'b_code');
+        const codeIndex100 = ['101-1-b', '102-2', '102-3', '102-4', '102-5', '103-1', '103-2',
+            '103-3',  '103-3-a', '103-3-b', '103-4', '104-1', '123-1'];
+        const codeIndex200 = [
+            '203-1-a', '203-1-a', '203-1-b', '203-1-b', '203-1-d', '203-1-d', '204-1-b', '204-1-b',
+            '204-1-c', '204-1-d',
+            '204-1-g-4', '204-1-g-4', '204-1-j', '204-1-j', '205-1-o-1', '205-1-o-1', '206-2', '206-2',
+            '207-1-b',
+            '207-2-a', '207-2-a',
+            '207-2-b', '207-2-c', '207-3-a',
+            '207-4-a', '207-4-a',
+            '207-4-c', '207-10-a',
+            '208-1-a', '208-1-a', '208-3-a', '208-3-a',
+            '208-3-b',
+            '208-3-c', '208-3-c', '208-4-b-1', '208-4-b-1', '209-1-a', '209-1-a',
+            '209-3', '209-3-b', '215-12', '215-12-a'
+        ];
+        let codeResult = codeIndex100.concat(codeIndex200);
+        codeResult.forEach(function (a, i) {
+            assert(a === codeIndex[i]);
+        });
+    });
     it('test filter', function* () {
         const ctx = app.mockContext(mockData);
         const orgData = {
@@ -460,20 +460,20 @@ describe('test/app/service/report_memory.test.js', () => {
         assert(define[2].name === reportDataAnalysis.analysisObj.sortGcl.name);
         assert(define[2].hint === reportDataAnalysis.analysisObj.sortGcl.hint);
 
-        const x = {
-            count: 7,
-            gclSum: {
-                name: '第100章至700章清单合计',
-                order: 1,
-            },
-            custom: [
-                {name: '已包含在清单合计中的材料、工程设备、专业工程暂估价', order: 2},
-                {name: '清单合计减去材料、工程设备、专业工程暂估价(即8-9=10)', order_calc: 'o1-o2', order: 3},
-                {name: '计日工合计', node_type: '计日工', order: 4},
-                {name: '暂列金额(不含计日工总额)(即10×暂列金额比列)', node_type: '暂列金额', order: 5},
-                {name: '投标报价、台账价(8+11+12)=13', order_calc: 'o1+o4+o5', order: 6},
-            ],
-        };
-        ctx.helper.saveBufferFile(JSON.stringify(x, "", "\t"), ctx.app.baseDir + '/mem_stage_pos.json');
+        // const x = {
+        //     count: 7,
+        //     gclSum: {
+        //         name: '第100章至700章清单合计',
+        //         order: 1,
+        //     },
+        //     custom: [
+        //         {name: '已包含在清单合计中的材料、工程设备、专业工程暂估价', order: 2},
+        //         {name: '清单合计减去材料、工程设备、专业工程暂估价(即8-9=10)', order_calc: 'o1-o2', order: 3},
+        //         {name: '计日工合计', node_type: '计日工', order: 4},
+        //         {name: '暂列金额(不含计日工总额)(即10×暂列金额比列)', node_type: '暂列金额', order: 5},
+        //         {name: '投标报价、台账价(8+11+12)=13', order_calc: 'o1+o4+o5', order: 6},
+        //     ],
+        // };
+        // ctx.helper.saveBufferFile(JSON.stringify(x, "", "\t"), ctx.app.baseDir + '/mem_stage_pos.json');
     });
 });

+ 29 - 0
test/app/service/report_memory.test.js

@@ -292,4 +292,33 @@ describe('test/app/service/report_memory.test.js', () => {
             yield saveTableDefine(ctx, tableDefine, ctx.app.baseDir + '/mem_stage_bills_compare_define.json');
         }
     });
+    it('test getStagePay', function* () {
+        const ctx = app.mockContext(mockData);
+        // test12 - 第4期
+        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        const data = yield ctx.service.reportMemory.getStagePayData(stage.tid, stage.id, []);
+        if (data instanceof Array) {
+            yield ctx.helper.saveBufferFile(JSON.stringify(data, '', '\t'), ctx.app.baseDir + '/mem_stage_pay.json');
+
+            const tableDefine = {};
+            tableDefine.Name = '期-合同支付-数据(mem_stage_pay)';
+            tableDefine.remark = '';
+            tableDefine.ID = 27;
+            tableDefine.key = 'mem_stage_pay';
+            tableDefine.items = [];
+            const prefix = '期-合同支付-';
+
+            addFields(tableDefine, prefix + '名称', 'name', dataType.str);
+            addFields(tableDefine, prefix + '计算公式', 'expr', dataType.str);
+            addFields(tableDefine, prefix + '金额', 'tp', dataType.currency);
+            addFields(tableDefine, prefix + '截止上期-金额', 'pre_tp', dataType.currency);
+            addFields(tableDefine, prefix + '截止本期-金额', 'end_tp', dataType.currency);
+            addFields(tableDefine, prefix + '排序', 'order', dataType.int);
+            addFields(tableDefine, prefix + '是否扣款项', 'minus', dataType.int);
+            addFields(tableDefine, prefix + '支付类型', 'ptype', dataType.int);
+            addFields(tableDefine, prefix + '起扣金额', 'sprice', dataType.currency);
+            addFields(tableDefine, prefix + '扣款限额', 'rprice', dataType.currency);
+            yield saveTableDefine(ctx, tableDefine, ctx.app.baseDir + '/mem_stage_pay_define.json');
+        }
+    });
 });