jpc_data.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 'use strict';
  2. const JV = require('./jpc_value_define');
  3. const jpc_common_helper = require('./helper/jpc_helper_common');
  4. const JpcData = {
  5. createNew() {
  6. const JpcDataRst = {};
  7. JpcDataRst.dataSeq = [];
  8. JpcDataRst.exDataSeq = [];
  9. JpcDataRst.analyzeData = function(rptTpl, dataObj) {
  10. const me = this;
  11. const private_analyse = function(MASTER_FIELD_STR, DETAIL_FIELD_STR, MASTER_DATA_STR, DETAIL_DATA_STR, dataSeqArr) {
  12. // 1. get ID fields
  13. const masterIDs = [];
  14. if (rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR]) {
  15. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR].length; i++) {
  16. const mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR][i];
  17. if (jpc_common_helper.getBoolean(mstFieldObj[JV.PROP_IS_ID])) {
  18. masterIDs.push({ idx: i, seq: mstFieldObj[JV.PROP_ID_SEQ] });
  19. }
  20. }
  21. }
  22. const detailIDs = [];
  23. if (rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR]) {
  24. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR].length; i++) {
  25. const dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR][i];
  26. if (jpc_common_helper.getBoolean(dtlFieldObj[JV.PROP_IS_ID])) {
  27. detailIDs.push({ idx: i, seq: dtlFieldObj[JV.PROP_ID_SEQ] });
  28. }
  29. }
  30. }
  31. // 2. sort the ID fields
  32. if (masterIDs.length > 1) {
  33. masterIDs.sort(function(a, b) {
  34. return 1 * a.seq - 1 * b.seq;
  35. });
  36. }
  37. if (detailIDs.length > 1) {
  38. detailIDs.sort(function(a, b) {
  39. return 1 * a.seq - 1 * b.seq;
  40. });
  41. }
  42. // 3. prepare data sequence
  43. if (masterIDs.length > 0) {
  44. let mst_dt_len = 0,
  45. dtl_dt_len = 0;
  46. const mst_fields = [];
  47. for (let i = 0; i < masterIDs.length; i++) {
  48. mst_fields.push(dataObj[MASTER_DATA_STR][masterIDs[i].idx]);
  49. mst_dt_len = dataObj[MASTER_DATA_STR][masterIDs[i].idx].length;
  50. }
  51. const dtl_fields = [];
  52. for (let i = 0; i < detailIDs.length; i++) {
  53. dtl_fields.push(dataObj[DETAIL_DATA_STR][detailIDs[i].idx]);
  54. dtl_dt_len = dataObj[DETAIL_DATA_STR][detailIDs[i].idx].length;
  55. }
  56. let sIdx = 0;
  57. let isEqual = true;
  58. for (let i = 0; i < mst_dt_len; i++) {
  59. dataSeqArr.push([]);
  60. // then compare the master/detail ID-field value
  61. for (let j = sIdx; j < dtl_dt_len; j++) {
  62. isEqual = true;
  63. for (let k = 0; k < mst_fields.length; k++) {
  64. if (!(mst_fields[k][i] === dtl_fields[k][j])) {
  65. isEqual = false;
  66. break;
  67. }
  68. }
  69. if (isEqual) {
  70. dataSeqArr[i].push(j);
  71. } else {
  72. sIdx = j;
  73. // 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!
  74. if (i < mst_dt_len - 1 && j < dtl_dt_len - 1) {
  75. for (let j1 = j; j1 < dtl_dt_len; j1++) {
  76. isEqual = true;
  77. for (let k = 0; k < mst_fields.length; k++) {
  78. if (!(mst_fields[k][i + 1] === dtl_fields[k][j1])) {
  79. isEqual = false;
  80. break;
  81. }
  82. }
  83. if (isEqual) {
  84. sIdx = j1;
  85. break;
  86. }
  87. }
  88. }
  89. break;
  90. }
  91. }
  92. }
  93. } else { // if no master data
  94. if (dataObj && dataObj[DETAIL_DATA_STR] && dataObj[DETAIL_DATA_STR].length > 0) {
  95. // may be bill type report which may only have discrete fields!
  96. const field = dataObj[DETAIL_DATA_STR][0];
  97. dataSeqArr.push([]);
  98. for (let i = 0; i < field.length; i++) {
  99. dataSeqArr[0].push(i);
  100. }
  101. }
  102. }
  103. };
  104. if ((rptTpl) && (dataObj)) {
  105. private_analyse(JV.NODE_MASTER_FIELDS, JV.NODE_DETAIL_FIELDS, JV.DATA_MASTER_DATA, JV.DATA_DETAIL_DATA, me.dataSeq);
  106. if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
  107. private_analyse(JV.NODE_MASTER_FIELDS_EX, JV.NODE_DETAIL_FIELDS_EX, JV.DATA_MASTER_DATA_EX, JV.DATA_DETAIL_DATA_EX, me.exDataSeq);
  108. }
  109. }
  110. };
  111. return JpcDataRst;
  112. },
  113. };
  114. module.exports = JpcData;