| 
					
				 | 
			
			
				@@ -124,8 +124,10 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // console.log(pageRst); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const stgAudit = await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                encodeSignatureDataUri(roleRel, this.app.baseDir); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log('after role stage!'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log(roleRel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await encodeSignatureDataUri(roleRel, this.app.baseDir); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log('encodeSignatureDataUri!'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctx.body = { data: pageRst, signatureRelInfo: roleRel, stageAudit: stgAudit }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // ctx.body = { data: { msg: 'test the network' } }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctx.status = 201; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -145,7 +147,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const params = JSON.parse(ctx.request.body.params); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            encodeSignatureDataUri(roleRel, this.app.baseDir); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            await encodeSignatureDataUri(roleRel, this.app.baseDir); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // console.log(pageRstArr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ctx.body = { data: pageRstArr, signatureRelInfo: roleRel }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ctx.status = 201; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -280,52 +282,60 @@ async function getReportData(ctx, params, filters) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const rst = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const runnableRst = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const mem_tz_runnableRst = []; // 内存表,中间计量台账清单数据,因有主从关系,但却又只算一次,所以上面的并行机制无法满足需求,所以得走另外的分支处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const mem_tz_runnableKey = []; // 配合内存表用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // console.log('params'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // console.log(params); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (const filter of filters) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        switch (filter) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'project' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.project.getProjectById(params.project_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('project'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'tender_info' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.tenderInfo.getTenderInfo(params.tender_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('tender_info'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'ledger' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.ledger.getData(params.tender_id, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('ledger'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'stage_bills': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.stageBills.getLastestStageData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('stage_bills'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'stage_bills_final': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.stageBillsFinal.getFinalDataEx(params.tender_id, params.stage_order)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('stage_bills_final'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'stage': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.stage.getStageById(params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('stage'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'stage_pay': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.stagePay.getAuditorStageData(params.stage_id, params.stage_times, params.stage_order)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('stage_pay'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'mem_stage_im_tz': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.reportMemory.getStageImTzData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('mem_stage_im_tz'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'mem_stage_im_tz_bills': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.reportMemory.getStageImTzBillsData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('mem_stage_im_tz_bills'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            case 'mem_stage_im_zl': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableRst.push(ctx.service.reportMemory.getStageImZlData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                runnableKey.push('mem_stage_im_zl'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (runnableKey.indexOf(filter) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            switch (filter) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'project' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.project.getProjectById(params.project_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('project'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'tender_info' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.tenderInfo.getTenderInfo(params.tender_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('tender_info'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'ledger' : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.ledger.getData(params.tender_id, 0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('ledger'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'stage_bills': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.stageBills.getLastestStageData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('stage_bills'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'stage_bills_final': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.stageBillsFinal.getFinalDataEx(params.tender_id, params.stage_order)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('stage_bills_final'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'stage': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.stage.getStageById(params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('stage'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'stage_pay': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.stagePay.getAuditorStageData(params.stage_id, params.stage_times, params.stage_order)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('stage_pay'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'mem_stage_im_tz': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (mem_tz_runnableRst.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        mem_tz_runnableRst.push(ctx.service.reportMemory.getStageImTzNoReturn(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    mem_tz_runnableKey.push('mem_stage_im_tz'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'mem_stage_im_tz_bills': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (mem_tz_runnableRst.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        mem_tz_runnableRst.push(ctx.service.reportMemory.getStageImTzNoReturn(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    mem_tz_runnableKey.push('mem_stage_im_tz_bills'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                case 'mem_stage_im_zl': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableRst.push(ctx.service.reportMemory.getStageImZlData(params.tender_id, params.stage_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    runnableKey.push('mem_stage_im_zl'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // console.log('before query, runnableKey'); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -338,6 +348,12 @@ async function getReportData(ctx, params, filters) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // if (rst[runnableKey[idx]] instanceof Array) console.log('is Array') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // else console.log('is not Array'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (mem_tz_runnableRst.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        await mem_tz_runnableRst[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (const key of mem_tz_runnableKey) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            rst[key] = ctx.service.reportMemory.getStageImTzDataDirectlyByKey(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return rst; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -635,19 +651,42 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function encodeSignatureDataUri(roleRel, baseDir) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (const singleRoleRel of roleRel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const roleRelContent = JSON.parse(singleRoleRel.rel_content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (const role of roleRelContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (role.sign_path !== '') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const filePath = baseDir + '/app' + role.sign_path; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const bData = fs.readFileSync(filePath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const base64Str = bData.toString('base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const datauri = 'data:image/png;base64,' + base64Str; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                role.sign_pic = datauri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // fsUtil.writeObjToFile(datauri, 'D:/Temp/imageDataUri.txt'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function isFileExisted(file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return new Promise(function(resolve, reject) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        fs.access(file, err => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                reject(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                resolve(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+async function encodeSignatureDataUri(roleRel, baseDir) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (roleRel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (const singleRoleRel of roleRel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const roleRelContent = JSON.parse(singleRoleRel.rel_content); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const role of roleRelContent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // console.log(role); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (role.sign_path !== '') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const filePath = baseDir + '/app' + role.sign_path; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const res = await isFileExisted(filePath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const bData = fs.readFileSync(filePath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const base64Str = bData.toString('base64'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const datauri = 'data:image/png;base64,' + base64Str; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            role.sign_pic = datauri; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            console.log('文件不存在:' + filePath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        console.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            singleRoleRel.rel_content = JSON.stringify(roleRelContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        singleRoleRel.rel_content = JSON.stringify(roleRelContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |