base.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. class rptMemBase {
  10. constructor(ctx, bindData) {
  11. this.ctx = ctx;
  12. // 绑定表配置 -- 绑定表指几个数据表,共用一个加载逻辑,存在任一张时,其他表均同步加载
  13. this.bindData = bindData;
  14. }
  15. /**
  16. * 数据表分类(普通表,绑定表)
  17. * @param sourceFilters
  18. * @returns {*[]}
  19. */
  20. getFilter(sourceFilters) {
  21. const common = [], spec = [];
  22. for (const sf of sourceFilters) {
  23. let bSpec = false;
  24. for (const key in this.bindData) {
  25. const b = this.bindData[key];
  26. if (b.indexOf(sf) >= 0) {
  27. bSpec = true;
  28. if (spec.indexOf(key) === -1) {
  29. spec.push(key);
  30. break;
  31. }
  32. }
  33. }
  34. if (!bSpec) common.push(sf);
  35. }
  36. return [common, spec];
  37. }
  38. getFieldKeys(source, filter) {
  39. const result = [];
  40. for (const f of filter) {
  41. if (source[f]) result.push(...source[f]);
  42. }
  43. return result;
  44. }
  45. /**
  46. * 获取普通表数据(请在子类重构)
  47. * @param params 报表基础传参
  48. * @param tableName 表名
  49. * @param fields 数据列名
  50. * @returns {Promise<void>}
  51. */
  52. getCommonData(params, tableName, fields) {
  53. throw '基础报表数据不可使用';
  54. }
  55. /**
  56. * 获取绑定表数据(请在子类重构)
  57. * @param params 报表基础传参
  58. * @param key
  59. * @param fields 数据列名
  60. * @returns {Promise<void>}
  61. */
  62. async getBindData(params, key, fields) {
  63. throw '基础报表数据不可使用';
  64. }
  65. /**
  66. * 读取报表数据前的预加载部分,子类按需重构
  67. * @returns {Promise<void>}
  68. */
  69. async doBeforeLoadReport(params) {
  70. return;
  71. }
  72. /**
  73. * 获取报表数据
  74. * @param params 报表基础传参
  75. * @param sourceFilters 数据表
  76. * @param memFieldKeys 数据表-数据列
  77. * @returns {Promise<void>}
  78. */
  79. async getReportData(params, sourceFilters, memFieldKeys) {
  80. // 预加载部分(tenderCheck,stageCheck,paymentSafeCheck...)
  81. await this.doBeforeLoadReport(params);
  82. const rst = {};
  83. // 数据表分类为普通表,绑定表
  84. const [filters, bindFilters] = this.getFilter(sourceFilters);
  85. // 加载普通表数据
  86. const runnableRst = [];
  87. const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化
  88. for (const filter of filters) {
  89. if (runnableKey.indexOf(filter) >= 0) return;
  90. runnableKey.push(filter);
  91. runnableRst.push(this.getCommonData(params, filter, memFieldKeys[filter]));
  92. }
  93. const queryRst = await Promise.all(runnableRst);
  94. for (let idx = 0; idx < runnableKey.length; idx++) {
  95. rst[runnableKey[idx]] = queryRst[idx];
  96. }
  97. // 加载绑定表数据局
  98. for (const bindFilter of bindFilters) {
  99. const resultData = await this.getBindData(params, this.getFieldKeys(memFieldKeys, this.bindData[bindFilter]));
  100. for (const d in resultData) {
  101. rst[d] = resultData[d];
  102. }
  103. }
  104. return rst;
  105. }
  106. }
  107. module.exports = rptMemBase;