| 
					
				 | 
			
			
				@@ -35,234 +35,366 @@ describe('test/app/service/report_memory.test.js', () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         mockData.session = ctx.session; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    it('test changeSort', function* () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            test: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'aaa', b: 0, c: true, order: 1}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'aaa', b: 1, c: false, order: 2}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'aaa', b: 2, c: false, order: 3}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'bbb', b: 3, c: true, order: 4}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'bbb', b: null, c: true, order: 5}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'ccc', b: 0, c: false, order: 6}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'ccc', b: -1, c: false, order: 7}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {a: 'ddd', b: 8, c: true, order: 8}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let data, result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // test12 - 第6期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tender_id: stage.tid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stage_id: stage.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // test boolean; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const b1 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "c", type: "bool", value: 'false'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], b1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [2, 3, 6, 7])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // test12 - 第6期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tender_id: stage.tid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stage_id: stage.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const b2 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "c", type: "bool", value: 'true'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], b2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [1, 4, 5, 8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // test12 - 第6期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tender_id: stage.tid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stage_id: stage.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // test number 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n1 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: 'non-zero'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [2, 3, 4, 7, 8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // test12 - 第6期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tender_id: stage.tid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stage_id: stage.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n2 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: '=', value: 1}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [2])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n3 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: '>', value: 1}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [3, 4, 8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n4 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: '>=', value: 1}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [2, 3, 4, 8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n5 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: '<', value: 1}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [1, 6, 7])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const n6 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "b", type: "num", operate: '<=', value: 1}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], n6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [1, 2, 6, 7])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // test12 - 第6期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tender_id: stage.tid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            stage_id: stage.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const s1 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "a", type: "str", operate: '=', value: 'aaa'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], s1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [1, 2, 3])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const s2 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "a", type: "str", operate: 'part', value: 'b'}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], s2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [4, 5])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const s3 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [{ field: "a", type: "str", operate: 'enum', value: ['ccc', 'ddd']}] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], s3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [6, 7, 8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // mix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const m1 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            table: 'test', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            condition: [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { field: "c", type: "bool", value: 'true'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { field: "b", type: "num", operate: 'non-zero'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { field: "a", type: "str", operate: 'enum', value: ['aaa', 'ddd']}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        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]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data = JSON.parse(JSON.stringify(orgData)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reportDataAnalysis.analysisObj.filter.fun(ctx, data, [], m1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = ctx.helper._.map(data.test, 'order'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(ctx.helper._.isEqual(result, [8])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // it('test gatherChapter custom', function* () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //     const ctx = app.mockContext(mockData); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -317,7 +449,7 @@ describe('test/app/service/report_memory.test.js', () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const ctx = app.mockContext(mockData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const define = reportDataAnalysis.analysisDefine; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert(define.length === 5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert(define.length === 7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert(define[0].key === 'changeSort'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert(define[0].name === reportDataAnalysis.analysisObj.changeSort.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert(define[0].hint === reportDataAnalysis.analysisObj.changeSort.hint); 
			 |