rpt_controller.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. /**
  2. * Created by Tony on 2017/3/13.
  3. */
  4. let UserModel = require("../../users/models/user_model");
  5. const mongoose = require("mongoose");
  6. const async = require("async");
  7. const JV = require("../rpt_component/jpc_value_define");
  8. let Template = mongoose.model('rpt_templates');
  9. let rptTplDataFacade = require("../facade/rpt_tpl_data_facade");
  10. let fsUtil = require("../../../public/fsUtil");
  11. let pm_facade = require('../../../modules/pm/facade/pm_facade');
  12. const rptTplFacade = require("../facade/rpt_template_facade");
  13. const demoTemplateFacade = require("../facade/rpt_tpl_data_demo_facade");
  14. const JpcEx = require("../rpt_component/jpc_ex");
  15. const rptUtil = require("../util/rpt_util");
  16. const rpt_xl_util = require("../util/rpt_excel_util");
  17. const rpt_pdf_util = require("../util/rpt_pdf_util");
  18. const rpt_svg_util = require("../util/rpt_svg_util");
  19. const fs = require("fs");
  20. const strUtil = require("../../../public/stringUtil");
  21. const rptDataExtractor = require("../util/rpt_construct_data_util");
  22. //统一回调函数
  23. let callback = function(req, res, err, data){
  24. if(err){
  25. res.json({success: false, error: err});
  26. }
  27. else{
  28. //res.send({success: true, data: data});
  29. res.json({success:true, data: data});
  30. }
  31. };
  32. const WATERMARK_FONT = {
  33. "Name": "宋体",
  34. "FontHeight": "32",
  35. "FontColor": "GOLD",
  36. "FontBold": "T",
  37. "FontItalic": "F",
  38. "FontUnderline": "F",
  39. "FontStrikeOut": "F",
  40. "FontAngle": "45"
  41. };
  42. function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
  43. let tmpObj = {};
  44. //1. 字体
  45. let newFonts = [];
  46. for (let font of defProperties.fonts) {
  47. let copyFont = {};
  48. copyFont.ID = font.ID;
  49. for (let fontProp of JV.FONT_PROPS) {
  50. copyFont[fontProp] = font[fontProp];
  51. }
  52. newFonts.push(copyFont);
  53. tmpObj[font.ID] = copyFont;
  54. }
  55. let private_setup_font = function (propStr, newFont) {
  56. if (tmpObj[propStr]) {
  57. tmpObj[propStr].Name = newFont.Name;
  58. tmpObj[propStr].FontHeight = String(newFont.FontHeight);
  59. tmpObj[propStr].FontBold = newFont.FontBold;
  60. tmpObj[propStr].FontItalic = newFont.FontItalic;
  61. tmpObj[propStr].FontUnderline = newFont.FontUnderline;
  62. }
  63. };
  64. for (let custFont of customizeCfg.fonts) {
  65. switch (custFont.CfgDispName) {
  66. case "表标题":
  67. private_setup_font("ReportTitle_Main", custFont);
  68. break;
  69. case "列标题":
  70. private_setup_font("HeaderColumn", custFont);
  71. private_setup_font("FooterColumn", custFont);
  72. break;
  73. case "正文内容":
  74. private_setup_font("Content", custFont);
  75. break;
  76. case "合计":
  77. private_setup_font("GrandTotal", custFont);
  78. private_setup_font("SectionTotal", custFont);
  79. break;
  80. case "表眉/表脚":
  81. private_setup_font("Header", custFont);
  82. private_setup_font("Footer", custFont);
  83. break;
  84. }
  85. }
  86. // 1.1 窄体
  87. if (tmpObj["Content_Narrow"]) {
  88. if (customizeCfg.isNarrow) {
  89. tmpObj["Content_Narrow"].Name = "Arial Narrow";
  90. } else {
  91. if (tmpObj["Content"]) {
  92. tmpObj["Content_Narrow"].Name = tmpObj["Content"].Name;
  93. } else {
  94. tmpObj["Content_Narrow"].Name = "宋体";
  95. }
  96. }
  97. }
  98. defProperties.fonts = newFonts;
  99. //2. 页边距
  100. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = customizeCfg.margins[JV.PROP_LEFT] / 10;
  101. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = customizeCfg.margins[JV.PROP_RIGHT] / 10;
  102. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = customizeCfg.margins[JV.PROP_TOP] / 10;
  103. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = customizeCfg.margins[JV.PROP_BOTTOM] / 10;
  104. //3. 边框竖线
  105. if (!(customizeCfg.showVerticalLine)) {
  106. let private_copy_border = function (src) {
  107. let rst = {};
  108. rst.Position = src.Position;
  109. rst.LineWeight = src.LineWeight;
  110. rst.DashStyle = src.DashStyle;
  111. rst.Color = src.Color;
  112. return rst;
  113. };
  114. let newStyles = [];
  115. for (let i =0 ; i < defProperties.styles.length; i++) {
  116. let style = defProperties.styles[i];
  117. newStyles.push(style);
  118. if (style.ID === "BORDER_ALL_AROUND") {
  119. let newStyle = {};
  120. newStyle.ID = style.ID;
  121. newStyle.CfgDispName = style.CfgDispName;
  122. newStyle.border_style = [];
  123. for (let border of style.border_style) {
  124. let newBorder = private_copy_border(border);
  125. newStyle.border_style.push(newBorder);
  126. if (border.Position === "Left" || border.Position === "Right") {
  127. newBorder.LineWeight = 0;
  128. }
  129. }
  130. newStyles[newStyles.length - 1] = newStyle;
  131. }
  132. }
  133. defProperties.styles = newStyles;
  134. }
  135. //4. 补0
  136. let private_Setup_Format = function(tabFields) {
  137. if (tabFields) {
  138. for (let tabField of tabFields) {
  139. if (tabField[JV.PROP_FORMAT]) {
  140. tabField[JV.PROP_FORMAT] = tabField[JV.PROP_FORMAT].replace(new RegExp("#","gm"),"0");
  141. }
  142. }
  143. }
  144. };
  145. if (customizeCfg.fillZero) {
  146. if (rptTpl[JV.NODE_FLOW_INFO]) {
  147. 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]);
  148. 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]);
  149. 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]);
  150. if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP] && rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES])
  151. private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]);
  152. if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
  153. for (let discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
  154. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  155. }
  156. }
  157. if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
  158. 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]);
  159. 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]);
  160. 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]);
  161. 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]);
  162. 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])
  163. private_Setup_Format(rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES][JV.PROP_SUM_FIELDS]);
  164. if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
  165. for (let discrete of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
  166. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  167. }
  168. }
  169. }
  170. } else if (rptTpl[JV.NODE_BILL_INFO]) {
  171. 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]);
  172. if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
  173. for (let discrete of rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
  174. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  175. }
  176. }
  177. } else if (rptTpl[JV.NODE_CROSS_INFO]) {
  178. 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]);
  179. 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]);
  180. 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]);
  181. 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]);
  182. 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]);
  183. 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]);
  184. if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
  185. for (let discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
  186. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  187. }
  188. }
  189. }
  190. }
  191. }
  192. async function getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, option, outputType, flag, cb) {
  193. let rptTpl = null;
  194. rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
  195. rptTpl = rst;
  196. if (rptTpl) {
  197. let rptDataUtil = new rptDataExtractor();
  198. rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
  199. let summaryRst = [], economicRst = [];
  200. let filter = rptDataUtil.getDataRequestFilter(summaryRst, economicRst);
  201. let promiseArr = [null, null, null];
  202. if (summaryRst.length > 0) {
  203. if (summaryRst.indexOf(`Construct`) >= 0 || summaryRst.indexOf(`ConstructDetail`) >= 0) {
  204. promiseArr[0] = pm_facade.getSummaryInfoByTender(prj_id, pm_facade.projectType.project);
  205. }
  206. if (summaryRst.indexOf(`Segment`) >= 0 || summaryRst.indexOf(`SegmentDetail`) >= 0) {
  207. promiseArr[1] = pm_facade.getSummaryInfoByTender(prj_id, pm_facade.projectType.engineering);
  208. }
  209. }
  210. if (economicRst.length > 0) {
  211. // economicRst.push('ProjectInfoFields');
  212. // economicRst.push('ProjectFeatureFields');
  213. promiseArr[2] = pm_facade.getIndexReportData(prj_id, economicRst);
  214. }
  215. let _createPntPageData = function(tplData, rptTpl) {
  216. try {
  217. let printCom = JpcEx.createNew();
  218. if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
  219. //console.log("orientation: " + (orientation === 'null'));
  220. if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
  221. let defProperties = rptUtil.getReportDefaultCache();
  222. if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
  223. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  224. printCom.initialize(rptTpl);
  225. printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
  226. let maxPages = printCom.totalPages;
  227. let pageRst = null;
  228. if (maxPages > 0) {
  229. pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
  230. } else {
  231. pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
  232. }
  233. if (pageRst) {
  234. // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
  235. cb(null, pageRst);
  236. } else {
  237. cb('Have errors while on going...', null);
  238. }
  239. } catch(ex) {
  240. console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
  241. console.log(ex.toString());
  242. cb('Exception occurs while on going...', null);
  243. }
  244. };
  245. let buildPageData = function(rawDataObj, rptDataUtil, rptTpl) {
  246. try {
  247. let tplData = rptDataUtil.assembleData(rawDataObj);
  248. _createPntPageData(tplData, rptTpl);
  249. } catch (ex) {
  250. console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
  251. console.log(ex.toString());
  252. cb('Exception occurs while on going...', null);
  253. }
  254. };
  255. if (flag !== undefined && flag !== null && flag.constructSumType === 'constructSum') {
  256. //这个直接取本项目的建设项目下所有的单位工程的数据,然后合并
  257. try {
  258. console.log('准备取建设项目下所有单位工程数据:');
  259. const _combineData = function(destData, srcData) {
  260. // 备注:这里有一个前提条件,就是基于相同的报表模板
  261. for (let idx = 0; idx < destData[JV.DATA_DISCRETE_DATA].length; idx++) {
  262. destData[JV.DATA_DISCRETE_DATA][idx] = destData[JV.DATA_DISCRETE_DATA][idx].concat(srcData[JV.DATA_DISCRETE_DATA][idx]);
  263. }
  264. for (let idx = 0; idx < destData[JV.DATA_MASTER_DATA].length; idx++) {
  265. destData[JV.DATA_MASTER_DATA][idx] = destData[JV.DATA_MASTER_DATA][idx].concat(srcData[JV.DATA_MASTER_DATA][idx]);
  266. }
  267. for (let idx = 0; idx < destData[JV.DATA_MASTER_DATA_EX].length; idx++) {
  268. destData[JV.DATA_MASTER_DATA_EX][idx] = destData[JV.DATA_MASTER_DATA_EX][idx].concat(srcData[JV.DATA_MASTER_DATA_EX][idx]);
  269. }
  270. for (let idx = 0; idx < destData[JV.DATA_DETAIL_DATA].length; idx++) {
  271. destData[JV.DATA_DETAIL_DATA][idx] = destData[JV.DATA_DETAIL_DATA][idx].concat(srcData[JV.DATA_DETAIL_DATA][idx]);
  272. }
  273. for (let idx = 0; idx < destData[JV.DATA_DETAIL_DATA_EX].length; idx++) {
  274. destData[JV.DATA_DETAIL_DATA_EX][idx] = destData[JV.DATA_DETAIL_DATA_EX][idx].concat(srcData[JV.DATA_DETAIL_DATA_EX][idx]);
  275. }
  276. };
  277. rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids, filter).then(function(multiRawData) {
  278. //终于出来结果了 !_! (multiRawData是多个单位工程的原始数据!)
  279. if (multiRawData.length > 0) {
  280. //考虑到工料机的数据还需要再计算,所以还不能直接用,需要每个工程都处理一遍后,再合并
  281. let tplData = rptDataUtil.assembleData(multiRawData[0]);
  282. for (let idx = 1; idx < multiRawData.length; idx++) {
  283. let tmpData = rptDataUtil.assembleData(multiRawData[idx]);
  284. _combineData(tplData, tmpData);
  285. }
  286. _createPntPageData(tplData, rptTpl);
  287. } else {
  288. cb('Have errors while on going...', null);
  289. }
  290. });
  291. } catch(ex) {
  292. console.log("取建设项目下所有单位工程数据异常: userId " + user_id + ", project id: " + prj_ids.toString());
  293. console.log(ex.toString());
  294. cb('Exception occurs while on going...', null);
  295. }
  296. } else {
  297. //原有流程
  298. rptTplDataFacade.prepareProjectData(user_id, prj_id, filter, function (err, msg, rawDataObj) {
  299. if (!err) {
  300. //取汇总数据流程
  301. if (promiseArr[0] !== null) {
  302. promiseArr[0].then(function (rst) {
  303. rawDataObj.Construct = rst.parent;
  304. rawDataObj.ConstructDetail = rst.subList;
  305. if (promiseArr[1] !== null) {
  306. promiseArr[1].then(function (rst) {
  307. rawDataObj.Segment = rst.parent;
  308. rawDataObj.SegmentDetail = rst.subList;
  309. buildPageData(rawDataObj, rptDataUtil, rptTpl);
  310. });
  311. } else {
  312. buildPageData(rawDataObj, rptDataUtil, rptTpl);
  313. }
  314. });
  315. } else if (promiseArr[1] !== null) {
  316. promiseArr[1].then(function (rst) {
  317. rawDataObj.Segment = rst.parent;
  318. rawDataObj.SegmentDetail = rst.subList;
  319. buildPageData(rawDataObj, rptDataUtil, rptTpl);
  320. });
  321. } else {
  322. if (promiseArr[2] !== null) {
  323. promiseArr[2].then(function (rst) {
  324. let ecoFieldsRst = (rst._doc)?rst._doc:rst;
  325. // fsUtil.writeObjToFile(ecoFieldsRst, "D:/GitHome/ConstructionCost/tmp/testEcoFieldsResult.jsp");
  326. rawDataObj.prjData.push({moduleName: 'ProjectInfoFields', data: ecoFieldsRst.ProjectInfoFields});
  327. rawDataObj.prjData.push({moduleName: 'ProjectFeatureFields', data: ecoFieldsRst.ProjectFeatureFields});
  328. rawDataObj.prjData.push({moduleName: 'ProjectCostFields', data: ecoFieldsRst.ProjectCostFields});
  329. rawDataObj.prjData.push({moduleName: 'ProjectEcoFields', data: ecoFieldsRst.ProjectEcoFields});
  330. rawDataObj.prjData.push({moduleName: 'ProjectLabMaterialFields', data: ecoFieldsRst.ProjectLabMaterialFields});
  331. rawDataObj.prjData.push({moduleName: 'ProjectQtyFields', data: ecoFieldsRst.ProjectQtyFields});
  332. buildPageData(rawDataObj, rptDataUtil, rptTpl);
  333. });
  334. } else {
  335. buildPageData(rawDataObj, rptDataUtil, rptTpl);
  336. }
  337. }
  338. } else {
  339. cb('No report data were found!', null);
  340. }
  341. });
  342. }
  343. } else {
  344. cb('No report template was found!', null);
  345. }
  346. })
  347. }
  348. function fillWaterMark(pageRstArray) {
  349. for (const pageRst of pageRstArray) {
  350. if (!pageRst[JV.NODE_FONT_COLLECTION].hasOwnProperty(JV.PROP_WATERMARK)) {
  351. pageRst[JV.NODE_FONT_COLLECTION][JV.PROP_WATERMARK] = WATERMARK_FONT;
  352. }
  353. for (const page of pageRst.items) {
  354. const warterCell = {
  355. "font": "WaterMark",
  356. "control": "NewContent_Center",
  357. "style": "Default_None",
  358. "Value": "大司空云计价",
  359. "area": {
  360. "Left": 300,
  361. "Right": 500,
  362. "Top": 300,
  363. "Bottom": 500
  364. }
  365. };
  366. //page.cells.push(warterCell);
  367. page.cells.unshift(warterCell);
  368. }
  369. }
  370. }
  371. module.exports = {
  372. getReportAllPages: function (req, res) {
  373. let params = JSON.parse(req.body.params),
  374. rpt_id = params.rpt_tpl_id,
  375. prj_id = params.prj_id,
  376. prj_ids = params.prj_ids,
  377. flag = params.flag;
  378. pageSize = params.pageSize,
  379. orientation = params.orientation,
  380. customizeCfg = params.custCfg
  381. ;
  382. // req.session.sessionUser.ssoId
  383. let user_id = req.session.sessionUser.id;
  384. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, flag, function (err, pageRst) {
  385. try {
  386. let userModel = new UserModel();
  387. // console.log('req.session.sessionUser.ssoId: ' + req.session.sessionUser.ssoId);
  388. userModel.isFree(req.session.sessionUser.ssoId, params.compilation).then(function(rst) {
  389. // console.log('is Free user? ' + rst);
  390. if (rst) {
  391. //加水印!
  392. // fillWaterMark([pageRst]);
  393. }
  394. callback(req, res, err, pageRst);
  395. });
  396. } catch (error) {
  397. //
  398. } finally {
  399. //callback(req, res, err, pageRst);
  400. }
  401. });
  402. },
  403. getMultiReports: function (req, res) {
  404. let params = JSON.parse(req.body.params),
  405. prj_id = params.prj_id,
  406. prj_ids = params.prj_ids,
  407. rpt_ids = params.rpt_ids.split(','),
  408. flags = params.flags;
  409. pageSize = params.pageSize,
  410. orientation = params.orientation,
  411. customizeCfg = params.custCfg,
  412. option = params.option;
  413. let user_id = req.session.sessionUser.id;
  414. let parallelFunctions = [];
  415. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  416. for (let idx = 0; idx < rpt_ids.length; idx++) {
  417. let id = rpt_ids[idx], r_flag = flags[idx];
  418. parallelFunctions.push((function (rpt_id, flag) {
  419. return function (cb) {
  420. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_NORMAL, flag, function (err, pageRst) {
  421. if(err){
  422. cb(err);
  423. }
  424. else{
  425. cb(null, pageRst);
  426. }
  427. })
  428. }
  429. })(parseInt(id), r_flag));
  430. }
  431. async.parallel(parallelFunctions, function (err, pageRstArray) {
  432. if (err) {
  433. callback(req, res, '数据有误', null);
  434. } else {
  435. callback(req, res, err, pageRstArray);
  436. }
  437. })
  438. },
  439. getMultiReportsEx: function (req, res) {
  440. //原则说明:把所有报表模板集中获取,统一filter,只读一次数据!(有空再整)
  441. let params = JSON.parse(req.body.params),
  442. prj_id = params.prj_id,
  443. rpt_ids = params.rpt_ids.split(','),
  444. pageSize = params.pageSize,
  445. orientation = params.orientation,
  446. customizeCfg = params.custCfg,
  447. option = params.option;
  448. let user_id = req.session.sessionUser.id;
  449. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  450. },
  451. getReportAllPagesSvg: function (req, res) {
  452. let params = JSON.parse(req.body.params),
  453. rpt_id = params.rpt_tpl_id,
  454. flag = params.flag;
  455. prj_id = params.prj_id,
  456. prj_ids = params.prj_ids,
  457. pageSize = params.pageSize,
  458. orientation = params.orientation,
  459. customizeCfg = params.custCfg
  460. ;
  461. let user_id = req.session.sessionUser.id;
  462. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_SVG, flag, function (err, pageRst) {
  463. let svgRstStrArr = rpt_svg_util.exportSvgStr(pageRst, 0, 0);
  464. callback(req, res, err, svgRstStrArr);
  465. });
  466. },
  467. createExcelFilesInOneBook: function (req, res) {
  468. let params = JSON.parse(req.body.params),
  469. prj_id = params.prj_id,
  470. prj_ids = params.prj_ids,
  471. rpt_ids = params.rpt_ids,
  472. flags = params.flags;
  473. rptName = params.rptName,
  474. pageSize = params.pageSize,
  475. orientation = params.orientation,
  476. customizeCfg = params.custCfg,
  477. option = params.option;
  478. let user_id = req.session.sessionUser.id;
  479. let parallelFunctions = [];
  480. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  481. for (let idx = 0; idx < rpt_ids.length; idx++) {
  482. let r_id = rpt_ids[idx], r_flag = flags[idx];
  483. parallelFunctions.push((function (rpt_id, flag) {
  484. return function (cb) {
  485. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, flag, function (err, pageRst) {
  486. if(err){
  487. cb(err);
  488. }
  489. else{
  490. cb(err, pageRst);
  491. }
  492. })
  493. }
  494. })(parseInt(r_id), r_flag));
  495. }
  496. async.parallel(parallelFunctions, function (err, pageRstArray) {
  497. if (err) {
  498. callback(req, res, '数据有误', null);
  499. } else {
  500. rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(uuidName){
  501. let fileRst = {uuid: uuidName, reportName: rptName};
  502. callback(req, res, err, fileRst);
  503. });
  504. }
  505. })
  506. },
  507. createExcelFiles: function (req, res) {
  508. let params = JSON.parse(req.body.params),
  509. prj_id = params.prj_id,
  510. prj_ids = params.prj_ids,
  511. rpt_ids = params.rpt_ids,
  512. flags = params.flags;
  513. rpt_names = params.rpt_names,
  514. pageSize = params.pageSize,
  515. orientation = params.orientation,
  516. isOneSheet = params.isOneSheet,
  517. customizeCfg = params.custCfg,
  518. option = params.option;
  519. let user_id = req.session.sessionUser.id;
  520. let parallelFunctions = [];
  521. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  522. for (let idx = 0; idx < rpt_ids.length; idx++) {
  523. let r_id = rpt_ids[idx], r_flag = flags[idx];
  524. let r_name = rpt_names[idx];
  525. parallelFunctions.push((function (rpt_id, rpt_name, flag) {
  526. return function (cb) {
  527. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, flag, function (err, pageRst) {
  528. if(err){
  529. cb(err);
  530. } else {
  531. rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
  532. let fileRst = {uuid: uuidName, reportName: rpt_name};
  533. cb(err, fileRst);
  534. })
  535. }
  536. })
  537. }
  538. })(parseInt(r_id), r_name, r_flag));
  539. }
  540. async.parallel(parallelFunctions, function (err, fileRstArray) {
  541. if (err) {
  542. callback(req, res, '数据有误', null);
  543. } else {
  544. // console.log(err);
  545. callback(req, res, err, fileRstArray);
  546. }
  547. })
  548. },
  549. getFileByUUID: function (req, res) {
  550. let uuid = req.params.uuid,
  551. rptName = req.params.rptName,
  552. suffix = "." + req.params.suffix
  553. ;
  554. // let user_id = req.session.sessionUser.id; //未来要校验user id
  555. try {
  556. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  557. let rptNameURI = encodeURI(rptName);
  558. res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + suffix + "\"; filename*=utf-8''" + rptNameURI + suffix );
  559. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuid + suffix);
  560. filestream.on('data', function(chunk) {
  561. res.write(chunk);
  562. });
  563. filestream.on('end', function() {
  564. res.end();
  565. });
  566. } catch (e) {
  567. console.log(e);
  568. }
  569. },
  570. getExcel: function(req, res) {
  571. let prj_id = req.params.prj_id,
  572. prj_ids = params.prj_ids,
  573. rpt_id = req.params.rpt_id,
  574. flag = req.params.flag,
  575. pageSize = req.params.size,
  576. orientation = req.params.orientation,
  577. rptName = req.params.rptName,
  578. isOneSheet = req.params.isOneSheet,
  579. option = req.params.option
  580. ;
  581. let customizeCfg = null;
  582. let user_id = req.session.sessionUser.id;
  583. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  584. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_EXCEL, flag, function(err, pageRst){
  585. try {
  586. rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(uuidName){
  587. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  588. let rptNameURI = encodeURI(rptName);
  589. res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
  590. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.xlsx');
  591. filestream.on('data', function(chunk) {
  592. res.write(chunk);
  593. });
  594. filestream.on('end', function() {
  595. res.end();
  596. });
  597. });
  598. } catch (e) {
  599. console.log(e);
  600. }
  601. })
  602. },
  603. getExcelInOneBook: function (req, res) {
  604. let prj_id = req.params.prj_id,
  605. prj_ids = params.prj_ids,
  606. rpt_ids = req.params.rpt_ids.split(','),
  607. flags = req.params.flags;
  608. pageSize = req.params.size,
  609. rptName = req.params.rptName,
  610. option = req.params.option;
  611. let user_id = req.session.sessionUser.id;
  612. let parallelFunctions = [];
  613. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  614. for (let idx = 0; idx < rpt_ids.length; idx++) {
  615. let id = rpt_ids[idx], r_flag = flags[idx];
  616. parallelFunctions.push((function (rpt_id, flag) {
  617. return function (cb) {
  618. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, null, null, dftOption, JV.OUTPUT_TYPE_EXCEL, flag, function (err, pageRst) {
  619. if(err){
  620. cb(err);
  621. }
  622. else{
  623. cb(null, pageRst);
  624. }
  625. })
  626. }
  627. })(parseInt(id), r_flag));
  628. }
  629. async.parallel(parallelFunctions, function (err, pageRstArray) {
  630. if (err) {
  631. callback(req, res, '数据有误', null);
  632. } else {
  633. rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
  634. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  635. let rptNameURI = encodeURI(rptName);
  636. res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx');
  637. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
  638. filestream.on('data', function(chunk) {
  639. res.write(chunk);
  640. });
  641. filestream.on('end', function() {
  642. res.end();
  643. });
  644. });
  645. }
  646. })
  647. },
  648. createPdfFiles: function (req, res) {
  649. let params = JSON.parse(req.body.params),
  650. prj_id = params.prj_id,
  651. prj_ids = params.prj_ids,
  652. rpt_ids = params.rpt_ids,
  653. flags = params.flags,
  654. rpt_names = params.rpt_names,
  655. pageSize = params.pageSize,
  656. orientation = params.orientation,
  657. customizeCfg = params.custCfg,
  658. option = params.option;
  659. let user_id = req.session.sessionUser.id;
  660. let parallelFunctions = [];
  661. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  662. for (let idx = 0; idx < rpt_ids.length; idx++) {
  663. let r_id = rpt_ids[idx], r_flag = flags[idx];
  664. let r_name = rpt_names[idx];
  665. parallelFunctions.push((function (rpt_id, rpt_name, flag) {
  666. return function (cb) {
  667. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, customizeCfg, dftOption, JV.OUTPUT_TYPE_PDF, flag, function (err, pageRst) {
  668. if(err){
  669. cb(err);
  670. }
  671. else{
  672. rpt_pdf_util.export_pdf_file(pageRst, pageSize, rpt_name, function(uuidName){
  673. let fileRst = {uuid: uuidName, reportName: rpt_name};
  674. cb(err, fileRst);
  675. })
  676. }
  677. })
  678. }
  679. })(parseInt(r_id), r_name, r_flag));
  680. }
  681. async.parallel(parallelFunctions, function (err, fileRstArray) {
  682. if (err) {
  683. callback(req, res, '数据有误', null);
  684. } else {
  685. // console.log(err);
  686. callback(req, res, err, fileRstArray);
  687. }
  688. })
  689. },
  690. getPDF:function (req, res) {
  691. let prj_id = req.params.prj_id,
  692. prj_ids = params.prj_ids,
  693. rpt_id = req.params.rpt_id,
  694. flag = req.params.flag;
  695. pageSize = req.params.size,
  696. orientation = req.params.orientation,
  697. rptName = req.params.rptName
  698. ;
  699. let user_id = req.session.sessionUser.id;
  700. getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_PDF, flag, function(err, pageRst){
  701. rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (uuidName) {
  702. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  703. // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
  704. let rptNameURI = encodeURI(rptName);
  705. res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" );
  706. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.pdf');
  707. filestream.on('data', function(chunk) {
  708. res.write(chunk);
  709. });
  710. filestream.on('end', function() {
  711. res.end();
  712. });
  713. })
  714. })
  715. }
  716. };