rpt_controller.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /**
  2. * Created by Tony on 2017/3/13.
  3. */
  4. import mongoose from "mongoose";
  5. import async from "async";
  6. import JV from "../rpt_component/jpc_value_define";
  7. let Template = mongoose.model('rpt_templates');
  8. let rptTplDataFacade = require("../facade/rpt_tpl_data_facade");
  9. //let fsUtil = require("../../../public/fsUtil");
  10. import rptTplFacade from "../facade/rpt_template_facade";
  11. import demoTemplateFacade from "../facade/rpt_tpl_data_demo_facade";
  12. import JpcEx from "../rpt_component/jpc_ex";
  13. import rptUtil from "../util/rpt_util";
  14. import rpt_xl_util from "../util/rpt_excel_util";
  15. import rpt_pdf_util from "../util/rpt_pdf_util";
  16. import fs from "fs";
  17. import strUtil from "../../../public/stringUtil";
  18. import rptDataExtractor from "../util/rpt_construct_data_util";
  19. //统一回调函数
  20. let callback = function(req, res, err, data){
  21. if(err){
  22. res.json({success: false, error: err});
  23. }
  24. else{
  25. //res.send({success: true, data: data});
  26. res.json({success:true, data: data});
  27. }
  28. };
  29. function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
  30. let rptTpl = null;
  31. rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
  32. rptTpl = rst;
  33. if (rptTpl) {
  34. if (rptTpl.ID_KEY) {
  35. return demoTemplateFacade.getDemoData(rptTpl.ID_KEY);
  36. } else {
  37. //callback(req, res, 'No report template data were found!', null);
  38. cb('No report template data were found!', null);
  39. }
  40. } else {
  41. //callback(req, res, 'No report template was found!', null);
  42. cb('No report template was found!', null);
  43. }
  44. }).then(function(tplData){
  45. if (tplData) {
  46. let printCom = JpcEx.createNew();
  47. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
  48. let defProperties = rptUtil.getReportDefaultCache();
  49. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  50. printCom.initialize(rptTpl);
  51. printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
  52. let maxPages = printCom.totalPages;
  53. let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
  54. if (pageRst) {
  55. cb(null, pageRst);
  56. } else {
  57. //callback(req, res, "Have errors while on going...", null);
  58. cb('Have errors while on going...', null);
  59. }
  60. } else {
  61. //callback(req, res, 'No report data were found!', null);
  62. cb('No report data were found!', null);
  63. }
  64. }
  65. );
  66. }
  67. function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, option, cb) {
  68. let rptTpl = null;
  69. rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
  70. rptTpl = rst;
  71. if (rptTpl) {
  72. let rptDataUtil = new rptDataExtractor();
  73. rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
  74. let filter = rptDataUtil.getDataRequestFilter();
  75. rptTplDataFacade.prepareProjectData(user_id, prj_id, filter, function (err, msg, rawDataObj) {
  76. if (!err) {
  77. let tplData = rptDataUtil.assembleData(rawDataObj);
  78. let printCom = JpcEx.createNew();
  79. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
  80. let defProperties = rptUtil.getReportDefaultCache();
  81. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  82. printCom.initialize(rptTpl);
  83. printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
  84. let maxPages = printCom.totalPages;
  85. let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
  86. if (pageRst) {
  87. //fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
  88. cb(null, pageRst);
  89. } else {
  90. cb('Have errors while on going...', null);
  91. }
  92. } else {
  93. cb('No report data were found!', null);
  94. }
  95. });
  96. } else {
  97. cb('No report template was found!', null);
  98. }
  99. })
  100. }
  101. function getPreViewPage(rpt_id, pageSize, cb) {
  102. let rptTpl = null;
  103. rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
  104. rptTpl = rst;
  105. if (rptTpl) {
  106. let printCom = JpcEx.createNew();
  107. let defProperties = rptUtil.getReportDefaultCache();
  108. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
  109. printCom.initialize(rptTpl);
  110. let pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
  111. if (pageRst) {
  112. //fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/previewPageResult.jsp");
  113. cb(null, pageRst);
  114. } else {
  115. cb('Have errors while on going...', null);
  116. }
  117. } else {
  118. cb('No report template was found!', null);
  119. }
  120. });
  121. }
  122. module.exports = {
  123. getPreviewPage: function(req, res) {
  124. let rpt_id = params.rpt_tpl_id,
  125. pageSize = params.pageSize;
  126. getPreViewPage(rpt_id, pageSize, function (err, pageRst) {
  127. callback(req, res, err, pageRst);
  128. });
  129. },
  130. getReportAllPages: function (req, res) {
  131. let params = JSON.parse(req.body.params),
  132. rpt_id = params.rpt_tpl_id,
  133. prj_id = params.prj_id,
  134. user_id = params.user_id,
  135. pageSize = params.pageSize;
  136. // req.session.sessionUser.ssoId
  137. getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, function (err, pageRst) {
  138. callback(req, res, err, pageRst);
  139. });
  140. },
  141. getTestReportAllPages: function(req, res){
  142. let rpt_id = req.body.ID;
  143. let pageSize = req.body.pageSize;
  144. getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
  145. //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
  146. callback(req, res, err, pageRst);
  147. })
  148. },
  149. getExcel: function(req, res) {
  150. let prj_id = req.params.prj_id,
  151. rpt_id = req.params.rpt_id,
  152. pageSize = req.params.size,
  153. rptName = req.params.rptName,
  154. isOneSheet = req.params.isOneSheet,
  155. option = req.params.option;
  156. let user_id = req.session.sessionUser.ssoId;
  157. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  158. getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, dftOption, function(err, pageRst){
  159. try {
  160. rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
  161. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  162. res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
  163. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
  164. filestream.on('data', function(chunk) {
  165. res.write(chunk);
  166. });
  167. filestream.on('end', function() {
  168. res.end();
  169. });
  170. });
  171. } catch (e) {
  172. console.log(e);
  173. }
  174. })
  175. },
  176. getTestExcel: function(req, res) {
  177. let rpt_id = req.params.id,
  178. pageSize = req.params.size,
  179. rptName = req.params.rptName,
  180. isOneSheet = req.params.isOneSheet,
  181. option = req.params.option;
  182. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  183. getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
  184. fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
  185. try {
  186. rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
  187. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  188. res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
  189. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
  190. filestream.on('data', function(chunk) {
  191. res.write(chunk);
  192. });
  193. filestream.on('end', function() {
  194. res.end();
  195. });
  196. });
  197. } catch (e) {
  198. console.log(e);
  199. }
  200. })
  201. },
  202. getTestExcelInOneBook: function(req, res) {
  203. let rpt_ids = req.params.ids.split(','),
  204. pageSize = req.params.size,
  205. rptName = req.params.rptName,
  206. option = req.params.option;
  207. let parallelFucs = [];
  208. let dftOption = option||JV.PAGING_OPTION_NORMAL;
  209. for (let id of rpt_ids) {
  210. parallelFucs.push((function (rpt_id) {
  211. return function (cb) {
  212. getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function (err, pageRst) {
  213. if(err){
  214. cb(err);
  215. }
  216. else{
  217. cb(null, pageRst);
  218. }
  219. })
  220. }
  221. })(parseInt(id)));
  222. }
  223. async.parallel(parallelFucs, function (err, pageRstArray) {
  224. if (err) {
  225. callback(req, res, '数据有误', null);
  226. } else {
  227. rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
  228. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  229. res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
  230. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + tmpFilePath + '.xlsx');
  231. filestream.on('data', function(chunk) {
  232. res.write(chunk);
  233. });
  234. filestream.on('end', function() {
  235. res.end();
  236. });
  237. });
  238. //callback(req, res, false, '', {compilation: rst, gljLibs: gljLibsRst});
  239. }
  240. })
  241. },
  242. getPDF:function (req, res) {
  243. let prj_id = req.params.prj_id,
  244. rpt_id = req.params.rpt_id,
  245. pageSize = req.params.size,
  246. rptName = req.params.rptName
  247. ;
  248. let user_id = req.session.sessionUser.ssoId;
  249. getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
  250. rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
  251. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  252. res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
  253. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
  254. filestream.on('data', function(chunk) {
  255. res.write(chunk);
  256. });
  257. filestream.on('end', function() {
  258. res.end();
  259. });
  260. })
  261. })
  262. },
  263. getTestPDF:function (req, res) {
  264. let rpt_id = req.params.id,
  265. pageSize = req.params.size,
  266. rptName = req.params.rptName;
  267. getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
  268. rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
  269. res.setHeader('Content-Type', 'application/vnd.openxmlformats');
  270. res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
  271. let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
  272. filestream.on('data', function(chunk) {
  273. res.write(chunk);
  274. });
  275. filestream.on('end', function() {
  276. res.end();
  277. });
  278. })
  279. })
  280. }
  281. };