jpc_data.js 5.6 KB

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