Jpc_Data.js 4.7 KB

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