jpc_report.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. 'use strict';
  2. /**
  3. * Created by Tony on 2023/4/14.
  4. */
  5. const BaseService = require('../base/base_service');
  6. const JpcEx = require('../reports/rpt_component/jpc_ex');
  7. const JV = require('../reports/rpt_component/jpc_value_define');
  8. const rpt_xl_util = require('../reports/util/rpt_excel_util');
  9. const rptDataExtractor = require('../reports/util/rpt_calculation_data_util');
  10. const RPT_DEF_PROPERTIES = require('../const/report_defined_properties');
  11. module.exports = app => {
  12. class JpcReport extends BaseService {
  13. /**
  14. * 构造函数
  15. *
  16. * @param {Object} ctx - egg全局变量
  17. * @return {void}
  18. */
  19. constructor(ctx) {
  20. super(ctx);
  21. this.tableName = '';
  22. this.dataId = '';
  23. }
  24. async getAllPagesCommon(ctx, rptTpl, params, option, outputType, baseDir, customSelect) {
  25. // const rptDataUtil = new rptDataExtractor();
  26. // rptDataUtil.initialize(rptTpl);
  27. // const filter = rptDataUtil.getDataRequestFilter();
  28. // const rawDataObj = await ctx.service.report.getReportData(params, filter.tables, filter.memFieldKeys,
  29. // rptTpl[JV.NODE_CUSTOM_DEFINE], customSelect);
  30. // // console.log(rawDataObj);
  31. // try {
  32. // const printCom = JpcEx.createNew();
  33. // if (params.pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = params.pageSize;
  34. // if (params.orientation && (params.orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = params.orientation;
  35. // const defProperties = RPT_DEF_PROPERTIES;
  36. // const tplData = rptDataUtil.assembleData(ctx, rawDataObj, baseDir, printCom, customSelect);
  37. // if (params.custCfg) {
  38. // setupCustomizeCfg(params.custCfg, rptTpl, defProperties);
  39. // } else {
  40. // // setupCustomizeCfg(defProperties, rptTpl, defProperties);
  41. // }
  42. // const dftOption = params.option || JV.PAGING_OPTION_NORMAL;
  43. // printCom.initialize(rptTpl);
  44. // printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType, customSelect);
  45. // const maxPages = printCom.totalPages;
  46. // let pageRst = null;
  47. // if (maxPages > 0) {
  48. // pageRst = printCom.outputAsSimpleJSONPageArray(ctx.helper, rptTpl, tplData, 1, maxPages, defProperties, params.custCfg, customSelect);
  49. // } else {
  50. // pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
  51. // }
  52. // pageRst.id = params.rpt_tpl_id;
  53. // return pageRst;
  54. // } catch (ex) {
  55. // console.log('报表数据异常, tender id: ' + params.tender_id);
  56. // console.log(ex);
  57. // }
  58. }
  59. getAllPreviewPagesCommon(rawRptTpl, pageSize) {
  60. const printCom = JpcEx.createNew();
  61. const defProperties = RPT_DEF_PROPERTIES;
  62. const rptTpl = JSON.parse(rawRptTpl.rpt_content);
  63. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
  64. setupSomeDftCustomizeCfg(rptTpl);
  65. printCom.initialize(rptTpl);
  66. const pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
  67. return pageRst;
  68. }
  69. }
  70. return JpcReport;
  71. };
  72. function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
  73. const tmpObj = {};
  74. // 1. 字体
  75. const newFonts = [];
  76. for (const font of defProperties.fonts) {
  77. const copyFont = {};
  78. copyFont.ID = font.ID;
  79. for (const fontProp of JV.FONT_PROPS) {
  80. copyFont[fontProp] = font[fontProp];
  81. }
  82. newFonts.push(copyFont);
  83. tmpObj[font.ID] = copyFont;
  84. }
  85. const private_setup_font = function(propStr, newFont) {
  86. if (tmpObj[propStr]) {
  87. tmpObj[propStr].Name = newFont.Name;
  88. tmpObj[propStr].FontHeight = String(newFont.FontHeight);
  89. tmpObj[propStr].FontBold = newFont.FontBold;
  90. tmpObj[propStr].FontItalic = newFont.FontItalic;
  91. tmpObj[propStr].FontUnderline = newFont.FontUnderline;
  92. }
  93. };
  94. for (const custFont of customizeCfg.fonts) {
  95. switch (custFont.CfgDispName) {
  96. case '表标题':
  97. private_setup_font('ReportTitle_Main', custFont);
  98. break;
  99. case '列标题':
  100. private_setup_font('HeaderColumn', custFont);
  101. private_setup_font('FooterColumn', custFont);
  102. break;
  103. case '正文内容':
  104. private_setup_font('Content', custFont);
  105. break;
  106. case '合计':
  107. private_setup_font('GrandTotal', custFont);
  108. private_setup_font('SectionTotal', custFont);
  109. break;
  110. case '表眉/表脚':
  111. private_setup_font('Header', custFont);
  112. private_setup_font('Footer', custFont);
  113. break;
  114. default:
  115. break;
  116. }
  117. }
  118. // 1.1 窄体
  119. if (tmpObj.Content_Narrow) {
  120. if (customizeCfg.isNarrow) {
  121. tmpObj.Content_Narrow.Name = 'Arial Narrow';
  122. } else {
  123. if (tmpObj.Content) {
  124. tmpObj.Content_Narrow.Name = tmpObj.Content.Name;
  125. } else {
  126. tmpObj.Content_Narrow.Name = '宋体';
  127. }
  128. }
  129. }
  130. defProperties.fonts = newFonts;
  131. // 2. 页边距
  132. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = customizeCfg.margins[JV.PROP_LEFT] / 10;
  133. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = customizeCfg.margins[JV.PROP_RIGHT] / 10;
  134. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = customizeCfg.margins[JV.PROP_TOP] / 10;
  135. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = customizeCfg.margins[JV.PROP_BOTTOM] / 10;
  136. // 3. 边框宽度
  137. if (customizeCfg.hasOwnProperty('borderThick')) {
  138. for (let i = 0; i < defProperties.styles.length; i++) {
  139. const style = defProperties.styles[i];
  140. if (style.ID === 'BORDER_ALL_AROUND') {
  141. for (const border of style.border_style) {
  142. border.LineWeight = customizeCfg.borderThick;
  143. }
  144. }
  145. }
  146. }
  147. // 4. 边框竖线
  148. if (!(customizeCfg.showVerticalLine)) {
  149. const private_copy_border = function(src) {
  150. const rst = {};
  151. rst.Position = src.Position;
  152. rst.LineWeight = src.LineWeight;
  153. rst.DashStyle = src.DashStyle;
  154. rst.Color = src.Color;
  155. return rst;
  156. };
  157. const newStyles = [];
  158. for (let i = 0; i < defProperties.styles.length; i++) {
  159. const style = defProperties.styles[i];
  160. newStyles.push(style);
  161. if (style.ID === 'BORDER_ALL_AROUND') {
  162. const newStyle = {};
  163. newStyle.ID = style.ID;
  164. newStyle.CfgDispName = style.CfgDispName;
  165. newStyle.border_style = [];
  166. for (const border of style.border_style) {
  167. const newBorder = private_copy_border(border);
  168. newStyle.border_style.push(newBorder);
  169. if (border.Position === 'Left' || border.Position === 'Right') {
  170. newBorder.LineWeight = 0;
  171. }
  172. }
  173. newStyles[newStyles.length - 1] = newStyle;
  174. }
  175. }
  176. defProperties.styles = newStyles;
  177. }
  178. // 5. 补0
  179. const private_Setup_Format = function(tabFields) {
  180. if (tabFields) {
  181. for (const tabField of tabFields) {
  182. if (tabField[JV.PROP_FORMAT]) {
  183. tabField[JV.PROP_FORMAT] = tabField[JV.PROP_FORMAT].replace(new RegExp('#', 'gm'), '0');
  184. }
  185. }
  186. }
  187. };
  188. if (customizeCfg.fillZero) {
  189. if (rptTpl[JV.NODE_FLOW_INFO]) {
  190. 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]);
  191. 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]);
  192. 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]);
  193. 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]);
  194. if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
  195. for (const discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
  196. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  197. }
  198. }
  199. if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
  200. 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]);
  201. 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]);
  202. 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]);
  203. 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]);
  204. 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]);
  205. if (rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
  206. for (const discrete of rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_DISCRETE_INFO]) {
  207. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  208. }
  209. }
  210. }
  211. } else if (rptTpl[JV.NODE_BILL_INFO]) {
  212. 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]);
  213. if (rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
  214. for (const discrete of rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]) {
  215. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  216. }
  217. }
  218. } else if (rptTpl[JV.NODE_CROSS_INFO]) {
  219. 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]);
  220. 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]);
  221. 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]);
  222. 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]);
  223. 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]);
  224. 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]);
  225. if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
  226. for (const discrete of rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO]) {
  227. private_Setup_Format(discrete[JV.PROP_DISCRETE_FIELDS]);
  228. }
  229. }
  230. }
  231. }
  232. }
  233. function setupSomeDftCustomizeCfg(rptTpl) {
  234. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = 1.5;
  235. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = 1.5;
  236. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = 1.5;
  237. rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = 1.5;
  238. }