jpc_data.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. 'use strict';
  2. import { JpcCommonHelper } from './helper/jpc_helper_common';
  3. import { IDataObj, IRptTpl } from '../interface/basic';
  4. import { IDataObjProps } from '../interface/enum';
  5. export const JpcData = {
  6. createNew() {
  7. let JpcDataRst = {
  8. dataSeq: [],
  9. exDataSeq: [],
  10. analyzeData(rptTpl: IRptTpl, dataObj: IDataObj) {
  11. let me = this;
  12. let _analyse = function (MASTER_FIELD_STR: string, DETAIL_FIELD_STR: string, MASTER_DATA_STR: string, DETAIL_DATA_STR: string, dataSeqArr: any) {
  13. //1. get ID fields
  14. let masterIDs = [];
  15. if (rptTpl.指标_数据_映射[MASTER_FIELD_STR]) {
  16. for (let i = 0; i < rptTpl.指标_数据_映射[MASTER_FIELD_STR].length; i++) {
  17. let mstFieldObj = rptTpl.指标_数据_映射[MASTER_FIELD_STR][i];
  18. if (JpcCommonHelper.getBoolean(mstFieldObj.isID)) {
  19. masterIDs.push({ "idx": i, "seq": mstFieldObj.IDSeq });
  20. }
  21. }
  22. }
  23. let detailIDs = [];
  24. if (rptTpl.指标_数据_映射[DETAIL_FIELD_STR]) {
  25. for (let i = 0; i < rptTpl.指标_数据_映射[DETAIL_FIELD_STR].length; i++) {
  26. let dtlFieldObj = rptTpl.指标_数据_映射[DETAIL_FIELD_STR][i];
  27. if (JpcCommonHelper.getBoolean(dtlFieldObj.isID)) {
  28. detailIDs.push({ "idx": i, "seq": dtlFieldObj.IDSeq });
  29. }
  30. }
  31. }
  32. //2. sort the ID fields
  33. if (masterIDs.length > 1) {
  34. masterIDs.sort(function (a, b) {
  35. return 1 * a["seq"] - 1 * b["seq"];
  36. })
  37. }
  38. if (detailIDs.length > 1) {
  39. detailIDs.sort(function (a, b) {
  40. return 1 * a["seq"] - 1 * b["seq"];
  41. })
  42. }
  43. //3. prepare data sequence
  44. if (masterIDs.length > 0) {
  45. let mst_dt_len = 0, dtl_dt_len = 0, mst_fields = [];
  46. for (let i = 0; i < masterIDs.length; i++) {
  47. mst_fields.push(dataObj[MASTER_DATA_STR][masterIDs[i]["idx"]]);
  48. mst_dt_len = dataObj[MASTER_DATA_STR][masterIDs[i]["idx"]].length;
  49. }
  50. let dtl_fields = [];
  51. for (let i = 0; i < detailIDs.length; i++) {
  52. dtl_fields.push(dataObj[DETAIL_DATA_STR][detailIDs[i]["idx"]]);
  53. dtl_dt_len = dataObj[DETAIL_DATA_STR][detailIDs[i]["idx"]].length;
  54. }
  55. let sIdx = 0;
  56. let isEqual = true;
  57. for (let i = 0; i < mst_dt_len; i++) {
  58. dataSeqArr.push([]);
  59. //then compare the master/detail ID-field value
  60. for (let j = sIdx; j < dtl_dt_len; j++) {
  61. isEqual = true;
  62. for (let k = 0; k < mst_fields.length; k++) {
  63. if (!(mst_fields[k][i] === dtl_fields[k][j])) {
  64. isEqual = false;
  65. break;
  66. }
  67. }
  68. if (isEqual) {
  69. dataSeqArr[i].push(j);
  70. } else {
  71. sIdx = j;
  72. //below logic is for the data robustness purpose, to avoid those strange record(detail level) which could not match even one of the master record!
  73. if (i < mst_dt_len - 1 && j < dtl_dt_len - 1) {
  74. for (let j1 = j; j1 < dtl_dt_len; j1++) {
  75. isEqual = true;
  76. for (let k = 0; k < mst_fields.length; k++) {
  77. if (!(mst_fields[k][i + 1] === dtl_fields[k][j1])) {
  78. isEqual = false;
  79. break;
  80. }
  81. }
  82. if (isEqual) {
  83. sIdx = j1;
  84. break;
  85. }
  86. }
  87. }
  88. break;
  89. }
  90. }
  91. }
  92. } else { //if no master data
  93. if (dataObj && dataObj[DETAIL_DATA_STR] && dataObj[DETAIL_DATA_STR].length > 0) {
  94. //may be bill type report which may only have discrete fields!
  95. let field = dataObj[DETAIL_DATA_STR][0];
  96. dataSeqArr.push([]);
  97. for (let i = 0; i < field.length; i++) {
  98. dataSeqArr[0].push(i);
  99. }
  100. }
  101. }
  102. };
  103. if ((rptTpl) && (dataObj)) {
  104. _analyse('主数据指标_集合', '从数据指标_集合', IDataObjProps.master_data, IDataObjProps.detail_data, me.dataSeq);
  105. if (rptTpl.流水式表_拓展信息) {
  106. _analyse('主数据指标_拓展集合', '从数据指标_拓展集合', IDataObjProps.master_data_ex, IDataObjProps.detail_data_ex, me.exDataSeq);
  107. }
  108. }
  109. }
  110. };
  111. return JpcDataRst;
  112. }
  113. };