'use strict'; /** * Created by Tony on 2019/7/5. */ const tenderMenu = require('../../config/menu').tenderMenu; const measureType = require('../const/tender').measureType; const accountGroup = require('../const/account_group').group; const JpcEx = require('../reports/rpt_component/jpc_ex'); const JV = require('../reports/rpt_component/jpc_value_define'); const rpt_xl_util = require('../reports/util/rpt_excel_util'); const rptDataExtractor = require('../reports/util/rpt_calculation_data_util'); const fsUtil = require('../public/js/fsUtil'); const fs = require('fs'); module.exports = app => { class ReportController extends app.BaseController { /** * 报表显示页面 * * @param {Object} ctx - egg全局context * @return {void} */ async index(ctx) { try { const tender = ctx.tender; const stage = ctx.stage; // console.log(tender.data); // console.log(tender.info); let stage_id = -1; let stage_order = -1; let stage_times = -1; let stage_status = -1; const treeNodes = await ctx.service.rptTreeNode.getNodesByProjectId([-1, tender.data.project_id]); const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator'); const stageList = await ctx.service.stage.getValidStagesShort(tender.id); const prjAccList = await ctx.service.projectAccount.getAllAccountByProjectId(tender.data.project_id); const roleList = await ctx.service.signatureRole.getSignatureRolesByTenderId(tender.id); // console.log(maxStageAmt[0].maxAmt); if (stage !== null && stage !== undefined) { stage_id = stage.id; stage_order = stage.order; stage_times = stage.times; stage_status = stage.status; } for (const prjAcc of prjAccList) { prjAcc.account_group = accountGroup[prjAcc.account_group]; } const renderData = { tender: tender.data, tenderInfo: tender.info, rpt_tpl_data: JSON.stringify(treeNodes), cust_cfg: JSON.stringify(custCfg), project_id: tender.data.project_id, tender_id: tender.id, tender_name: tender.data.name, stg_id: stage_id, stg_order: stage_order, stg_times: stage_times, stg_status: stage_status, stage_list: JSON.stringify(stageList), prj_account_list: JSON.stringify(prjAccList), role_list: JSON.stringify(roleList), tenderMenu, preUrl: '/tender/' + tender.id, measureType, // jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.explode), }; await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs'); // await this.layout('report/index.ejs', renderData); } catch (err) { this.log(err); console.log(err); // ctx.redirect('/tender/' + ctx.tender.id); } } /** * 报表打印页面 * * @param {Object} ctx - egg全局context * @return {void} */ async showPrintPage(ctx) { try { // const params = JSON.parse(ctx.request.body.params); const pageSize = ctx.params.size; // console.log('pageSize: ' + pageSize); const renderData = { size: pageSize, // orientation: params.orientation, }; if (pageSize === 'A3') { await ctx.render('report/rpt_printA3.ejs', renderData); } else { await ctx.render('report/rpt_print.ejs', renderData); } } catch (err) { this.log(err); console.log(err); } } /** * 获取报表数据 * * @param {Object} ctx - egg全局context * @return {void} */ async getReport(ctx) { try { // console.log('in getReport'); const params = JSON.parse(ctx.request.body.params); // console.log(params); let rptTpl = await ctx.service.rptTpl.getTplById(params.rpt_tpl_id); if (!rptTpl || rptTpl.length !== 1) { throw '获取模板失败'; } rptTpl = JSON.parse(rptTpl[0].rpt_content); // console.log('get the template!'); const pageRst = await getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir); // 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); ctx.body = { data: pageRst, signatureRelInfo: roleRel, stageAudit: stgAudit }; // ctx.body = { data: { msg: 'test the network' } }; ctx.status = 201; } catch (ex) { this.setMessage(ex.toString(), this.messageType.ERROR); } } /** * 获取多批次报表数据 * * @param {Object} ctx - egg全局context * @return {void} */ async getMultiReportsEx(ctx) { // 原则说明:把所有报表模板集中获取,统一filter,只读一次数据! 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); // console.log(pageRstArr); ctx.body = { data: pageRstArr, signatureRelInfo: roleRel }; ctx.status = 201; } async createExcelFilesEx(ctx) { const params = JSON.parse(ctx.request.body.params); const baseDir = this.app.baseDir; function getExcelByPageData(pageRst, rpt_name, innerRoleRel) { return new Promise(function(resolve, reject) { rpt_xl_util.exportExcel(pageRst, params.pageSize, rpt_name, params.isOneSheet, null, null, baseDir, innerRoleRel, (err, uuidName) => { if (err) return reject(err); const fileRst = { uuid: uuidName, reportName: rpt_name }; resolve(fileRst); } ); }); } const roleRelArr = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids); const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir); const runnableRst = []; for (let idx = 0; idx < pageRstArr.length; idx++) { let roleRel = null; for (const roleR of roleRelArr) { if (roleR.rpt_id === params.rpt_ids[idx]) { roleRel = JSON.parse(roleR.rel_content); break; } } // console.log('roleRel.rel_content: ' + roleRel.rel_content); // fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/testBuiltPageResult.jsp'); runnableRst.push(getExcelByPageData(pageRstArr[idx], params.rpt_names[idx], roleRel)); } const uuidRst = await Promise.all(runnableRst); ctx.body = { data: uuidRst }; ctx.status = 201; } async createExcelFilesInOneBookEx(ctx) { const params = JSON.parse(ctx.request.body.params); const baseDir = this.app.baseDir; function getExcelByPageData(pageRstArr, rpt_name, innerRoleRel) { return new Promise(function(resolve, reject) { rpt_xl_util.exportExcelInOneBook(pageRstArr, params.pageSize, rpt_name, baseDir, innerRoleRel, (err, uuidName) => { if (err) return reject(err); const fileRst = { uuid: uuidName, reportName: rpt_name }; resolve(fileRst); } ); }); } const roleRelArr = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids); const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir); const runnableRst = []; let rptRoleRelArr = []; const reAssignSignatureName = function(pageData, roleRel, rpt_name_key) { const keyMap = {}; for (const pageItem of pageData.items) { for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) { if (!keyMap.hasOwnProperty(signCell.signature_name)) { keyMap[signCell.signature_name] = rpt_name_key + '_' + signCell.signature_name; } } } for (const pageItem of pageData.items) { for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) { if (keyMap.hasOwnProperty(signCell.signature_name)) { signCell.signature_name = keyMap[signCell.signature_name]; } } } for (const roleSign of roleRel) { if (keyMap.hasOwnProperty(roleSign.signature_name)) { roleSign.signature_name = keyMap[roleSign.signature_name]; } } // console.log('keyMap of : ' + rpt_name_key); // console.log(keyMap); }; for (let idx = 0; idx < pageRstArr.length; idx++) { let roleRel = null; for (const roleR of roleRelArr) { if (roleR.rpt_id === params.rpt_ids[idx]) { roleRel = JSON.parse(roleR.rel_content); // 这里要做些电子签名的signature_name转换,以防重名 reAssignSignatureName(pageRstArr[idx], roleRel, params.rpt_names[idx]); rptRoleRelArr = rptRoleRelArr.concat(roleRel); break; } } } runnableRst.push(getExcelByPageData(pageRstArr, params.rptName, rptRoleRelArr)); const uuidRst = await Promise.all(runnableRst); ctx.body = { data: uuidRst }; ctx.status = 201; } async getFileByUUID(ctx) { // console.log('downloading : ' + ctx.params.uuid); const uuid = ctx.params.uuid; const rptName = ctx.params.rptName; const suffix = '.' + ctx.params.suffix; function getUuidFile(filestream) { return new Promise(function(resolve, reject) { filestream.on('data', function(chunk) { resolve(chunk); }); }); } try { const rptNameURI = encodeURI(rptName); const filePath = this.app.baseDir + '/app/public/download/'; const filestream = fs.createReadStream(filePath + uuid + suffix); const chunk = await getUuidFile(filestream); ctx.set({ 'Content-Type': 'application/vnd.openxmlformats', 'Content-Disposition': 'attachment; filename="' + rptNameURI + suffix + "\"; filename*=utf-8''" + rptNameURI + suffix, 'Content-Length': chunk.length, }); ctx.body = chunk; } catch (e) { console.log(e); } } } return ReportController; }; async function getReportData(ctx, params, filters) { const rst = {}; const runnableRst = []; const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化 // 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; } } // console.log('before query, runnableKey'); // console.log(runnableKey); const queryRst = await Promise.all(runnableRst); // console.log('after query'); for (let idx = 0; idx < runnableKey.length; idx++) { rst[runnableKey[idx]] = queryRst[idx]; // console.log(runnableKey[idx]); // if (rst[runnableKey[idx]] instanceof Array) console.log('is Array') // else console.log('is not Array'); } return rst; } async function getAllPagesCommon(ctx, rptTpl, params, option, outputType, baseDir) { // let rptTpl = null; const rptDataUtil = new rptDataExtractor(); rptDataUtil.initialize(rptTpl); // console.log(rptTpl); const filter = rptDataUtil.getDataRequestFilter(); // console.log(filter.tables); const rawDataObj = await getReportData(ctx, params, filter.tables); // console.log(rawDataObj); try { // console.log('before assemble'); const tplData = rptDataUtil.assembleData(rawDataObj, baseDir); // console.log(tplData); const printCom = JpcEx.createNew(); if (params.pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = params.pageSize; if (params.orientation && (params.orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = params.orientation; let defProperties = await ctx.service.rptPreDefineCfg.getCfgById('Administrator'); // console.log('defProperties: '); // console.log(defProperties[0].defined_content); defProperties = JSON.parse(defProperties[0].defined_content); if (params.custCfg) { setupCustomizeCfg(params.custCfg, rptTpl, defProperties); } else { // setupCustomizeCfg(defProperties, rptTpl, defProperties); } const dftOption = params.option || JV.PAGING_OPTION_NORMAL; printCom.initialize(rptTpl); printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType); const maxPages = printCom.totalPages; let pageRst = null; if (maxPages > 0) { pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, params.custCfg); } else { pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties); } if (pageRst) { // fsUtil.writeObjToFile(pageRst, 'D:/GitHome/temp/testBuiltPageResult.jsp'); } else { // } // console.log(pageRst); return pageRst; } catch (ex) { // console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id); console.log(ex); } } async function getMultiRptsCommon(ctx, params, outputType, baseDir) { for (let idx = 0; idx < params.rpt_ids.length; idx++) { params.rpt_ids[idx] = parseInt(params.rpt_ids[idx]); // 转换一下,以防万一 } const rptTpls = await ctx.service.rptTpl.getAllTplByIds(params.rpt_ids); // console.log(rptTpls); for (let rtIdx = 0; rtIdx < rptTpls.length; rtIdx++) { rptTpls[rtIdx] = JSON.parse(rptTpls[rtIdx].rpt_content); } const rptDataUtil = new rptDataExtractor(); const filterTables = []; if (rptTpls.length > 1) { rptTpls.sort(function(item1, item2) { const i1 = (item1._doc) ? item1._doc : item1; const i2 = (item2._doc) ? item2._doc : item2; const ID1 = params.rpt_ids.indexOf(i1[JV.PROP_ID]); const ID2 = params.rpt_ids.indexOf(i2[JV.PROP_ID]); return ID1 - ID2; }); } for (const rptTpl of rptTpls) { rptDataUtil.initialize(rptTpl); const filter = rptDataUtil.getDataRequestFilter(); // console.log(filter); for (const table of filter.tables) { if (filterTables.indexOf(table) < 0) { filterTables.push(table); } } } const rawDataObj = await getReportData(ctx, params, filterTables); try { const rptPageRstArray = []; // 1. 这里只用一份数据,根据实际应用情况,先备份 const backupData = {}; for (let filterIdx = 0; filterIdx < filterTables.length; filterIdx++) { backupData[filterTables[filterIdx]] = []; Object.assign(backupData[filterTables[filterIdx]], rawDataObj[filterTables[filterIdx]]); } // 2. 一个一个模板创建数据 let defProperties = await ctx.service.rptPreDefineCfg.getCfgById('Administrator'); // console.log('defProperties: '); // console.log(defProperties[0].defined_content); defProperties = JSON.parse(defProperties[0].defined_content); for (let tplIdx = 0; tplIdx < rptTpls.length; tplIdx++) { const rptTpl = (rptTpls[tplIdx]._doc) ? rptTpls[tplIdx]._doc : rptTpls[tplIdx]; rptDataUtil.initialize(rptTpl); const tplData = rptDataUtil.assembleData(rawDataObj, baseDir); const printCom = JpcEx.createNew(); rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = params.pageSize; if (params.pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = params.pageSize; if (params.orientation && (params.orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = params.orientation; if (params.custCfg) setupCustomizeCfg(params.custCfg, rptTpl, defProperties); const dftOption = params.option || JV.PAGING_OPTION_NORMAL; printCom.initialize(rptTpl); printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType); const maxPages = printCom.totalPages; let pageRst = null; if (maxPages > 0) { pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, params.custCfg); } else { pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties); } rptPageRstArray.push(pageRst); // 注意:这里需要把备份数据assign回去!!! if (tplIdx < rptTpls.length - 1) { for (let filterIdx = 0; filterIdx < filterTables.length; filterIdx++) { backupData[filterTables[filterIdx]] = []; Object.assign(rawDataObj[filterTables[filterIdx]], backupData[filterTables[filterIdx]]); } } } return rptPageRstArray; } catch (ex) { console.log('报表数据异常(getMultiRptsCommon): project_id ' + params.project_id + ', tender_id: ' + params.tender_id + ', stage_id: ' + params.stage_id); console.log(ex); } finally { // } } function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) { const tmpObj = {}; // 1. 字体 const newFonts = []; for (const font of defProperties.fonts) { const copyFont = {}; copyFont.ID = font.ID; for (const fontProp of JV.FONT_PROPS) { copyFont[fontProp] = font[fontProp]; } newFonts.push(copyFont); tmpObj[font.ID] = copyFont; } const private_setup_font = function(propStr, newFont) { if (tmpObj[propStr]) { tmpObj[propStr].Name = newFont.Name; tmpObj[propStr].FontHeight = String(newFont.FontHeight); tmpObj[propStr].FontBold = newFont.FontBold; tmpObj[propStr].FontItalic = newFont.FontItalic; tmpObj[propStr].FontUnderline = newFont.FontUnderline; } }; for (const custFont of customizeCfg.fonts) { switch (custFont.CfgDispName) { case '表标题': private_setup_font('ReportTitle_Main', custFont); break; case '列标题': private_setup_font('HeaderColumn', custFont); private_setup_font('FooterColumn', custFont); break; case '正文内容': private_setup_font('Content', custFont); break; case '合计': private_setup_font('GrandTotal', custFont); private_setup_font('SectionTotal', custFont); break; case '表眉/表脚': private_setup_font('Header', custFont); private_setup_font('Footer', custFont); break; default: break; } } // 1.1 窄体 if (tmpObj.Content_Narrow) { if (customizeCfg.isNarrow) { tmpObj.Content_Narrow.Name = 'Arial Narrow'; } else { if (tmpObj.Content) { tmpObj.Content_Narrow.Name = tmpObj.Content.Name; } else { tmpObj.Content_Narrow.Name = '宋体'; } } } defProperties.fonts = newFonts; // 2. 页边距 rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = customizeCfg.margins[JV.PROP_LEFT] / 10; rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = customizeCfg.margins[JV.PROP_RIGHT] / 10; rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = customizeCfg.margins[JV.PROP_TOP] / 10; rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = customizeCfg.margins[JV.PROP_BOTTOM] / 10; // 3. 边框宽度 if (customizeCfg.hasOwnProperty('borderThick')) { for (let i = 0; i < defProperties.styles.length; i++) { const style = defProperties.styles[i]; if (style.ID === 'BORDER_ALL_AROUND') { for (const border of style.border_style) { border.LineWeight = customizeCfg.borderThick; } } } } // 4. 边框竖线 if (!(customizeCfg.showVerticalLine)) { const private_copy_border = function(src) { const rst = {}; rst.Position = src.Position; rst.LineWeight = src.LineWeight; rst.DashStyle = src.DashStyle; rst.Color = src.Color; return rst; }; const newStyles = []; for (let i = 0; i < defProperties.styles.length; i++) { const style = defProperties.styles[i]; newStyles.push(style); if (style.ID === 'BORDER_ALL_AROUND') { const newStyle = {}; newStyle.ID = style.ID; newStyle.CfgDispName = style.CfgDispName; newStyle.border_style = []; for (const border of style.border_style) { const newBorder = private_copy_border(border); newStyle.border_style.push(newBorder); if (border.Position === 'Left' || border.Position === 'Right') { newBorder.LineWeight = 0; } } newStyles[newStyles.length - 1] = newStyle; } } defProperties.styles = newStyles; } // 5. 补0 const private_Setup_Format = function(tabFields) { if (tabFields) { for (const tabField of tabFields) { if (tabField[JV.PROP_FORMAT]) { tabField[JV.PROP_FORMAT] = tabField[JV.PROP_FORMAT].replace(new RegExp('#', 'gm'), '0'); } } } }; if (customizeCfg.fillZero) { if (rptTpl[JV.NODE_FLOW_INFO]) { if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) { for (const discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) { private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]); } } if (rptTpl[JV.NODE_FLOW_INFO_EX]) { if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES]) private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]); if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) { for (const discrete of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) { private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]); } } } } else if (rptTpl[JV.NODE_BILL_INFO]) { if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS]); if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) { for (const discrete of rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) { private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]); } } } else if (rptTpl[JV.NODE_CROSS_INFO]) { if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT]) private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS]); if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) { for (const discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) { private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]); } } } } } 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'); } } singleRoleRel.rel_content = JSON.stringify(roleRelContent); } }