jpc_data.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. let JV = require('./jpc_value_define');
  2. let JpcData = {
  3. createNew: function() {
  4. let JpcDataRst = {};
  5. JpcDataRst.dataSeq = [];
  6. JpcDataRst.exDataSeq = [];
  7. JpcDataRst.analyzeData = function(rptTpl, dataObj) {
  8. let me = this;
  9. let private_analyse = function(MASTER_FIELD_STR, DETAIL_FIELD_STR, MASTER_DATA_STR, DETAIL_DATA_STR, dataSeqArr) {
  10. //1. get ID fields
  11. let masterIDs = [];
  12. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR].length; i++) {
  13. let mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][MASTER_FIELD_STR][i];
  14. if ((mstFieldObj[JV.PROP_IS_ID]) && (mstFieldObj[JV.PROP_IS_ID] === 'T')) {
  15. masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});
  16. }
  17. }
  18. let detailIDs = [];
  19. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR].length; i++) {
  20. let dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][DETAIL_FIELD_STR][i];
  21. if ((dtlFieldObj[JV.PROP_IS_ID]) && (dtlFieldObj[JV.PROP_IS_ID] === 'T')) {
  22. detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});
  23. }
  24. }
  25. //2. sort the ID fields
  26. if (masterIDs.length > 1) {
  27. masterIDs.sort(function(a, b) {
  28. return 1*a["seq"] - 1*b["seq"];
  29. })
  30. }
  31. if (detailIDs.length > 1) {
  32. detailIDs.sort(function(a, b) {
  33. return 1*a["seq"] - 1*b["seq"];
  34. })
  35. }
  36. //3. prepare data sequence
  37. if (masterIDs.length > 0) {
  38. let mst_dt_len = 0, dtl_dt_len = 0, mst_fields = [];
  39. for (let i = 0; i < masterIDs.length; i++) {
  40. mst_fields.push(dataObj[MASTER_DATA_STR][masterIDs[i]["idx"]]);
  41. mst_dt_len = dataObj[MASTER_DATA_STR][masterIDs[i]["idx"]].length;
  42. }
  43. let dtl_fields = [];
  44. for (let i = 0; i < detailIDs.length; i++) {
  45. dtl_fields.push(dataObj[DETAIL_DATA_STR][detailIDs[i]["idx"]]);
  46. dtl_dt_len = dataObj[DETAIL_DATA_STR][detailIDs[i]["idx"]].length;
  47. }
  48. let sIdx = 0;
  49. let isEqual = true;
  50. for (let i = 0; i < mst_dt_len; i++) {
  51. dataSeqArr.push([]);
  52. //then compare the master/detail ID-field value
  53. for (let j = sIdx; j < dtl_dt_len; j++) {
  54. isEqual = true;
  55. for (let k = 0; k < mst_fields.length; k++) {
  56. if (!(mst_fields[k][i] === dtl_fields[k][j])) {
  57. isEqual = false;
  58. break;
  59. }
  60. }
  61. if (isEqual) {
  62. dataSeqArr[i].push(j);
  63. } else {
  64. sIdx = j;
  65. //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!
  66. if (i < mst_dt_len - 1 && j < dtl_dt_len - 1) {
  67. for (let j1 = j; j1 < dtl_dt_len; j1++) {
  68. isEqual = true;
  69. for (let k = 0; k < mst_fields.length; k++) {
  70. if (!(mst_fields[k][i + 1] === dtl_fields[k][j1])) {
  71. isEqual = false;
  72. break;
  73. }
  74. }
  75. if (isEqual) {
  76. sIdx = j1;
  77. break;
  78. }
  79. }
  80. }
  81. break;
  82. }
  83. }
  84. }
  85. } else { //if no master data
  86. let field = dataObj[DETAIL_DATA_STR][0];
  87. //dataSeqArr = [[]];
  88. dataSeqArr.push([]);
  89. for (let i = 0; i < field.length; i++) {
  90. dataSeqArr[0].push(i);
  91. }
  92. }
  93. };
  94. if ((rptTpl) && (dataObj)) {
  95. //*
  96. private_analyse(JV.NODE_MASTER_FIELDS, JV.NODE_DETAIL_FIELDS, JV.DATA_MASTER_DATA, JV.DATA_DETAIL_DATA, me.dataSeq);
  97. if (rptTpl[JV.NODE_FLOW_INFO_EX]) {
  98. private_analyse(JV.NODE_MASTER_FIELDS_EX, JV.NODE_DETAIL_FIELDS_EX, JV.DATA_MASTER_DATA_EX, JV.DATA_DETAIL_DATA_EX, me.exDataSeq);
  99. }
  100. /*/
  101. //1. get ID fields
  102. let masterIDs = [];
  103. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].length; i++) {
  104. let mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS][i];
  105. if ((mstFieldObj[JV.PROP_IS_ID]) && (mstFieldObj[JV.PROP_IS_ID] === 'T')) {
  106. masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});
  107. }
  108. }
  109. let detailIDs = [];
  110. for (let i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].length; i++) {
  111. let dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS][i];
  112. if ((dtlFieldObj[JV.PROP_IS_ID]) && (dtlFieldObj[JV.PROP_IS_ID] === 'T')) {
  113. detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});
  114. }
  115. }
  116. //2. sort the ID fields
  117. if (masterIDs.length > 1) {
  118. masterIDs.sort(function(a, b) {
  119. return 1*a["seq"] - 1*b["seq"];
  120. })
  121. }
  122. if (detailIDs.length > 1) {
  123. detailIDs.sort(function(a, b) {
  124. return 1*a["seq"] - 1*b["seq"];
  125. })
  126. }
  127. //3. prepare data sequence
  128. if (masterIDs.length > 0) {
  129. let mst_dt_len = 0, dtl_dt_len = 0, mst_fields = [];
  130. for (let i = 0; i < masterIDs.length; i++) {
  131. mst_fields.push(dataObj[JV.DATA_MASTER_DATA][masterIDs[i]["idx"]]);
  132. mst_dt_len = dataObj[JV.DATA_MASTER_DATA][masterIDs[i]["idx"]].length;
  133. }
  134. let dtl_fields = [];
  135. for (let i = 0; i < detailIDs.length; i++) {
  136. dtl_fields.push(dataObj[JV.DATA_DETAIL_DATA][detailIDs[i]["idx"]]);
  137. dtl_dt_len = dataObj[JV.DATA_DETAIL_DATA][detailIDs[i]["idx"]].length;
  138. }
  139. let sIdx = 0;
  140. let isEqual = true;
  141. for (let i = 0; i < mst_dt_len; i++) {
  142. me.dataSeq.push([]);
  143. //then compare the master/detail ID-field value
  144. for (let j = sIdx; j < dtl_dt_len; j++) {
  145. isEqual = true;
  146. for (let k = 0; k < mst_fields.length; k++) {
  147. if (!(mst_fields[k][i] === dtl_fields[k][j])) {
  148. isEqual = false;
  149. break;
  150. }
  151. }
  152. if (isEqual) {
  153. me.dataSeq[i].push(j);
  154. } else {
  155. sIdx = j;
  156. //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!
  157. if (i < mst_dt_len - 1 && j < dtl_dt_len - 1) {
  158. for (let j1 = j; j1 < dtl_dt_len; j1++) {
  159. isEqual = true;
  160. for (let k = 0; k < mst_fields.length; k++) {
  161. if (!(mst_fields[k][i + 1] === dtl_fields[k][j1])) {
  162. isEqual = false;
  163. break;
  164. }
  165. }
  166. if (isEqual) {
  167. sIdx = j1;
  168. break;
  169. }
  170. }
  171. }
  172. break;
  173. }
  174. }
  175. }
  176. } else { //if no master data
  177. let field = dataObj[JV.DATA_DETAIL_DATA][0];
  178. me.dataSeq = [[]];
  179. for (let i = 0; i < field.length; i++) {
  180. me.dataSeq[0].push(i);
  181. }
  182. }
  183. //*/
  184. }
  185. //alert(3);
  186. };
  187. return JpcDataRst;
  188. }
  189. }
  190. module.exports = JpcData;