/** * Created by Tony on 2017/3/13. */ import mongoose from "mongoose"; import async from "async"; import JV from "../rpt_component/jpc_value_define"; let Template = mongoose.model('rpt_templates'); let rptTplDataFacade = require("../facade/rpt_tpl_data_facade"); let fsUtil = require("../../../public/fsUtil"); import rptTplFacade from "../facade/rpt_template_facade"; import demoTemplateFacade from "../facade/rpt_tpl_data_demo_facade"; import JpcEx from "../rpt_component/jpc_ex"; import rptUtil from "../util/rpt_util"; import rpt_xl_util from "../util/rpt_excel_util"; import rpt_pdf_util from "../util/rpt_pdf_util"; import rpt_svg_util from "../util/rpt_svg_util"; import fs from "fs"; import strUtil from "../../../public/stringUtil"; import rptDataExtractor from "../util/rpt_construct_data_util"; //统一回调函数 let callback = function(req, res, err, data){ if(err){ res.json({success: false, error: err}); } else{ //res.send({success: true, data: data}); res.json({success:true, data: data}); } }; function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) { let rptTpl = null; rptTplFacade.getRptTemplate(rpt_id).then(function(rst) { rptTpl = rst; if (rptTpl) { if (rptTpl.ID_KEY) { return demoTemplateFacade.getDemoData(rptTpl.ID_KEY); } else { //callback(req, res, 'No report template data were found!', null); cb('No report template data were found!', null); } } else { //callback(req, res, 'No report template was found!', null); cb('No report template was found!', null); } }).then(function(tplData){ if (tplData) { let printCom = JpcEx.createNew(); rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize; let defProperties = rptUtil.getReportDefaultCache(); let dftOption = option||JV.PAGING_OPTION_NORMAL; printCom.initialize(rptTpl); printCom.analyzeData(rptTpl, tplData, defProperties, dftOption); let maxPages = printCom.totalPages; let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties); if (pageRst) { cb(null, pageRst); } else { //callback(req, res, "Have errors while on going...", null); cb('Have errors while on going...', null); } } else { //callback(req, res, 'No report data were found!', null); cb('No report data were found!', null); } } ); } function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) { let tmpObj = {}; //1. 字体 let newFonts = []; for (let font of defProperties.fonts) { let copyFont = {}; copyFont.ID = font.ID; for (let fontProp of JV.FONT_PROPS) { copyFont[fontProp] = font[fontProp]; } newFonts.push(copyFont); tmpObj[font.ID] = copyFont; } let 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 (let 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; } } // 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.showVerticalLine)) { let private_copy_border = function (src) { let rst = {}; rst.Position = src.Position; rst.LineWeight = src.LineWeight; rst.DashStyle = src.DashStyle; rst.Color = src.Color; return rst; }; let newStyles = []; for (let i =0 ; i < defProperties.styles.length; i++) { let style = defProperties.styles[i]; newStyles.push(style); if (style.ID === "BORDER_ALL_AROUND") { let newStyle = {}; newStyle.ID = style.ID; newStyle.CfgDispName = style.CfgDispName; newStyle.border_style = []; for (let border of style.border_style) { let 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; } //4. 补0 let private_Setup_Format = function(tabFields) { if (tabFields) { for (let 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]) { private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]); for (let 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]) { private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS]); for (let 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]) { private_Setup_Format(rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS]); for (let 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]) { private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT][JV.TAB_CROSS_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.TAB_CROSS_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.TAB_CROSS_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS]); private_Setup_Format(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS]); for (let discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) { private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]); } } } } function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, cb) { let rptTpl = null; rptTplFacade.getRptTemplate(rpt_id).then(function(rst) { rptTpl = rst; if (rptTpl) { let rptDataUtil = new rptDataExtractor(); rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl); let filter = rptDataUtil.getDataRequestFilter(); rptTplDataFacade.prepareProjectData(user_id, prj_id, filter, function (err, msg, rawDataObj) { if (!err) { let tplData = rptDataUtil.assembleData(rawDataObj); let printCom = JpcEx.createNew(); if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize; //console.log("orientation: " + (orientation === 'null')); if (orientation !== 'null') rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation; let defProperties = rptUtil.getReportDefaultCache(); if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties); let dftOption = option||JV.PAGING_OPTION_NORMAL; printCom.initialize(rptTpl); printCom.analyzeData(rptTpl, tplData, defProperties, dftOption); let maxPages = printCom.totalPages; let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg); if (pageRst) { // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp"); cb(null, pageRst); } else { cb('Have errors while on going...', null); } } else { cb('No report data were found!', null); } }); } else { cb('No report template was found!', null); } }) } module.exports = { getReportAllPages: function (req, res) { let params = JSON.parse(req.body.params), rpt_id = params.rpt_tpl_id, prj_id = params.prj_id, pageSize = params.pageSize, orientation = params.orientation, customizeCfg = params.custCfg ; // req.session.sessionUser.ssoId let user_id = req.session.sessionUser.id; getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, function (err, pageRst) { callback(req, res, err, pageRst); }); }, getMultiReports: function (req, res) { let params = JSON.parse(req.body.params), prj_id = params.prj_id, rpt_ids = params.rpt_ids.split(','), customizeCfg = params.custCfg, option = params.option; let user_id = req.session.sessionUser.id; let parallelFucs = []; let dftOption = option||JV.PAGING_OPTION_NORMAL; for (let id of rpt_ids) { parallelFucs.push((function (rpt_id) { return function (cb) { getAllPagesCommon(user_id, prj_id, rpt_id, null, null, customizeCfg, dftOption, function (err, pageRst) { if(err){ cb(err); } else{ cb(null, pageRst); } }) } })(parseInt(id))); } async.parallel(parallelFucs, function (err, pageRstArray) { if (err) { callback(req, res, '数据有误', null); } else { callback(req, res, err, pageRstArray); } }) }, getReportAllPagesSvg: function (req, res) { let params = JSON.parse(req.body.params), rpt_id = params.rpt_tpl_id, prj_id = params.prj_id, pageSize = params.pageSize, orientation = params.orientation, customizeCfg = params.custCfg ; let user_id = req.session.sessionUser.id; getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, function (err, pageRst) { let svgRstStrArr = rpt_svg_util.exportSvgStr(pageRst, 0, 0); callback(req, res, err, svgRstStrArr); }); }, getTestReportAllPages: function(req, res){ let rpt_id = req.body.ID; let pageSize = req.body.pageSize; getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){ //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst)); callback(req, res, err, pageRst); }) }, getExcel: function(req, res) { let prj_id = req.params.prj_id, rpt_id = req.params.rpt_id, pageSize = req.params.size, orientation = req.params.orientation, rptName = req.params.rptName, isOneSheet = req.params.isOneSheet, option = req.params.option; let user_id = req.session.sessionUser.id; let dftOption = option||JV.PAGING_OPTION_NORMAL; getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){ try { rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){ res.setHeader('Content-Type', 'application/vnd.openxmlformats'); let rptNameURI = encodeURI(rptName); res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' ); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }); } catch (e) { console.log(e); } }) }, getExcelInOneBook: function (req, res) { let prj_id = req.params.prj_id, rpt_ids = req.params.rpt_ids.split(','), pageSize = req.params.size, rptName = req.params.rptName, option = req.params.option; let user_id = req.session.sessionUser.id; let parallelFucs = []; let dftOption = option||JV.PAGING_OPTION_NORMAL; for (let id of rpt_ids) { parallelFucs.push((function (rpt_id) { return function (cb) { getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, function (err, pageRst) { if(err){ cb(err); } else{ cb(null, pageRst); } }) } })(parseInt(id))); } async.parallel(parallelFucs, function (err, pageRstArray) { if (err) { callback(req, res, '数据有误', null); } else { rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){ res.setHeader('Content-Type', 'application/vnd.openxmlformats'); let rptNameURI = encodeURI(rptName); res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx'); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }); } }) }, getTestExcel: function(req, res) { let rpt_id = req.params.id, pageSize = req.params.size, rptName = req.params.rptName, isOneSheet = req.params.isOneSheet, option = req.params.option; let dftOption = option||JV.PAGING_OPTION_NORMAL; getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){ fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst)); try { rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){ res.setHeader('Content-Type', 'application/vnd.openxmlformats'); res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx"); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }); } catch (e) { console.log(e); } }) }, getTestExcelInOneBook: function(req, res) { let rpt_ids = req.params.ids.split(','), pageSize = req.params.size, rptName = req.params.rptName, option = req.params.option; let parallelFucs = []; let dftOption = option||JV.PAGING_OPTION_NORMAL; for (let id of rpt_ids) { parallelFucs.push((function (rpt_id) { return function (cb) { getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function (err, pageRst) { if(err){ cb(err); } else{ cb(null, pageRst); } }) } })(parseInt(id))); } async.parallel(parallelFucs, function (err, pageRstArray) { if (err) { callback(req, res, '数据有误', null); } else { rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){ res.setHeader('Content-Type', 'application/vnd.openxmlformats'); res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx"); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }); //callback(req, res, false, '', {compilation: rst, gljLibs: gljLibsRst}); } }) }, getPDF:function (req, res) { let prj_id = req.params.prj_id, rpt_id = req.params.rpt_id, pageSize = req.params.size, orientation = req.params.orientation, rptName = req.params.rptName ; let user_id = req.session.sessionUser.id; getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){ rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) { res.setHeader('Content-Type', 'application/vnd.openxmlformats'); // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf"); let rptNameURI = encodeURI(rptName); res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" ); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }) }) }, getTestPDF:function (req, res) { let rpt_id = req.params.id, pageSize = req.params.size, rptName = req.params.rptName; getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){ rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) { res.setHeader('Content-Type', 'application/vnd.openxmlformats'); // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf"); let rptNameURI = encodeURI(rptName); res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" ); let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf'); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); }); }) }) } };