rpt_construct_data_util.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. /**
  2. * Created by Tony on 2017/7/14.
  3. * 报表数据提取class,是协助报表模板里指标字段自主提取数据的工具类
  4. */
  5. let JV = require('../rpt_component/jpc_value_define');
  6. let $JE = require('../rpt_component/jpc_rte');
  7. let consts = require('../../../modules/main/models/project_consts');
  8. let fsUtil = require("../../../public/fsUtil");
  9. let treeUtil = require('../../../public/treeUtil');
  10. let projectConst = consts.projectConst;
  11. let projectConstList = consts.projectConstList;
  12. class Rpt_Common{
  13. initialize(rpt_tpl, currentDataObj) {
  14. this.template = rpt_tpl;
  15. this.currentDataObj = currentDataObj;
  16. };
  17. Multiply(val1, val2, fixFormat) {
  18. let rst = [], maxLen = val1.length, minLen = val2.length;
  19. if (minLen > maxLen) {
  20. maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
  21. }
  22. for (let i = 0; i < maxLen; i++) {
  23. let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) * ((i < val2.length)?val2[i]:val2[minLen - 1]);
  24. if (fixFormat) value = value.toFixed(fixFormat);
  25. rst.push(value);
  26. }
  27. return rst;
  28. };
  29. Divide(val1, val2, fixFormat) {
  30. let rst = [], maxLen = val1.length, minLen = val2.length;
  31. if (minLen > maxLen) {
  32. maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
  33. }
  34. for (let i = 0; i < maxLen; i++) {
  35. let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) / ((i < val2.length)?val2[i]:val2[minLen - 1]);
  36. if (fixFormat) value = value.toFixed(fixFormat);
  37. rst.push(value);
  38. }
  39. return rst;
  40. };
  41. Plus(val1, val2, fixFormat) {
  42. let rst = [], maxLen = val1.length, minLen = val2.length;
  43. if (minLen > maxLen) {
  44. maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
  45. }
  46. for (let i = 0; i < maxLen; i++) {
  47. let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) + ((i < val2.length)?val2[i]:val2[minLen - 1]);
  48. if (fixFormat) value = value.toFixed(fixFormat);
  49. rst.push(value);
  50. }
  51. return rst;
  52. };
  53. MultiPlus(arrVal, fixFormat) {
  54. let rst = [];
  55. for (let i = 0; i < arrVal.length; i++) {
  56. let valItem = arrVal[i];
  57. if (i === 0) {
  58. for (let dtl of valItem) {
  59. let value = parseFloat(dtl);
  60. if (fixFormat) value = value.toFixed(fixFormat);
  61. rst.push(value);
  62. }
  63. } else {
  64. for (let j = 0; j < valItem.length; j++) {
  65. if (j < rst.length) {
  66. let value = rst[j] + valItem[j];
  67. if (fixFormat) value = value.toFixed(fixFormat);
  68. rst[j] = value;
  69. } else {
  70. let value = parseFloat(valItem[j]);
  71. if (fixFormat) value = value.toFixed(fixFormat);
  72. rst.push(value);
  73. }
  74. }
  75. }
  76. }
  77. return rst;
  78. };
  79. Minus(val1, val2, fixFormat) {
  80. let rst = [], maxLen = val1.length, minLen = val2.length;
  81. if (minLen > maxLen) {
  82. maxLen = maxLen + minLen; minLen = maxLen - minLen; maxLen = maxLen - minLen;
  83. }
  84. for (let i = 0; i < maxLen; i++) {
  85. let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) - ((i < val2.length)?val2[i]:val2[minLen - 1]);
  86. if (fixFormat) value = value.toFixed(fixFormat);
  87. rst.push(value);
  88. }
  89. return rst;
  90. };
  91. }
  92. class Rpt_Data_Extractor {
  93. constructor () {
  94. this.COMMON = new Rpt_Common();
  95. };
  96. initialize(tpl) {
  97. this.rptTpl = tpl;
  98. };
  99. //-- 根据报表模板映射指标(非离散指标)的定义,罗列出所有需要用到的data对象key,作为数据请求的过滤依据
  100. getDataRequestFilter() {
  101. let rst = [];
  102. let tpl = this.rptTpl;
  103. let pri_func_chk_filter = function (field) {
  104. for (let key of projectConstList) {
  105. if (rst.indexOf(key) < 0) {
  106. if (field[JV.PROP_FIELD_EXP_MAP]) {
  107. if (field[JV.PROP_FIELD_EXP_MAP].indexOf('.' + key + '.') >= 0) {
  108. rst.push(key);
  109. if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
  110. rst.push(projectConst.PROJECTGLJ);
  111. }
  112. if (key === projectConst.PROJECTGLJ && (rst.indexOf(projectConst.RATION_GLJ) < 0)) {
  113. rst.push(projectConst.RATION_GLJ);
  114. }
  115. }
  116. }
  117. }
  118. }
  119. };
  120. let pri_setup_filter = function (FIELD_LIST_KEY) {
  121. if (tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
  122. for (let field of tpl[JV.NODE_FIELD_MAP][FIELD_LIST_KEY]) {
  123. pri_func_chk_filter(field);
  124. }
  125. }
  126. };
  127. pri_setup_filter(JV.NODE_DISCRETE_FIELDS);
  128. pri_setup_filter(JV.NODE_MASTER_FIELDS);
  129. pri_setup_filter(JV.NODE_DETAIL_FIELDS);
  130. pri_setup_filter(JV.NODE_MASTER_FIELDS_EX);
  131. pri_setup_filter(JV.NODE_DETAIL_FIELDS_EX);
  132. return rst;
  133. };
  134. //--- 装配数据(把收集到的数据,依据报表模板的指示,预处理(如:排序、过滤、合计)及装配到相关指标) ---//
  135. assembleData(rawDataObj) {
  136. let $PROJECT = {"COMMON": null, "MAIN": {}, "DETAIL": {}};
  137. let tpl = this.rptTpl;
  138. this.COMMON.initialize(tpl, rawDataObj);
  139. $PROJECT.COMMON = this.COMMON;
  140. $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;
  141. $PROJECT.MAIN.getProperty = ext_mainGetPropety;
  142. $PROJECT.MAIN.getFee = ext_mainGetFee;
  143. if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
  144. for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
  145. let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
  146. switch(preHandle[JV.PROP_HANDLE_TYPE]) {
  147. case JV.PROP_HANDLE_TYPE_SORT:
  148. sortData(srcData, preHandle);
  149. break;
  150. case JV.PROP_HANDLE_TYPE_FILTER:
  151. filterData(srcData, preHandle, rawDataObj.prjData);
  152. break;
  153. case JV.PROP_HANDLE_TYPE_SUM:
  154. summaryData(srcData, preHandle, rawDataObj.prjData);
  155. break;
  156. default:
  157. break;
  158. }
  159. }
  160. }
  161. for (let item of rawDataObj.prjData) {
  162. setupFunc($PROJECT.DETAIL, item.moduleName, item);
  163. }
  164. let rptDataObj = {};
  165. rptDataObj[JV.DATA_DISCRETE_DATA] = [];
  166. rptDataObj[JV.DATA_MASTER_DATA] = [];
  167. rptDataObj[JV.DATA_DETAIL_DATA] = [];
  168. rptDataObj[JV.DATA_MASTER_DATA_EX] = [];
  169. rptDataObj[JV.DATA_DETAIL_DATA_EX] = [];
  170. assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS], rptDataObj[JV.DATA_DISCRETE_DATA], $PROJECT);
  171. // console.log(JV.DATA_DISCRETE_DATA);
  172. // console.log(rptDataObj[JV.DATA_DISCRETE_DATA]);
  173. assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS], rptDataObj[JV.DATA_MASTER_DATA], $PROJECT);
  174. // console.log(JV.DATA_MASTER_DATA);
  175. // console.log(rptDataObj[JV.DATA_MASTER_DATA]);
  176. assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS], rptDataObj[JV.DATA_DETAIL_DATA], $PROJECT);
  177. // console.log(JV.DATA_DETAIL_DATA);
  178. // console.log(rptDataObj[JV.DATA_DETAIL_DATA]);
  179. assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS_EX], rptDataObj[JV.DATA_MASTER_DATA_EX], $PROJECT);
  180. // console.log(JV.DATA_MASTER_DATA_EX);
  181. // console.log(rptDataObj[JV.DATA_MASTER_DATA_EX]);
  182. assembleFields(tpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS_EX], rptDataObj[JV.DATA_DETAIL_DATA_EX], $PROJECT);
  183. // console.log(JV.DATA_DETAIL_DATA_EX);
  184. // console.log(rptDataObj[JV.DATA_DETAIL_DATA_EX]);
  185. return rptDataObj;
  186. };
  187. }
  188. function getModuleDataByKey(prjData, key) {
  189. let rst = null;
  190. for (let item of prjData) {
  191. if (item.moduleName === key) {
  192. rst = item;
  193. break;
  194. }
  195. }
  196. return rst;
  197. }
  198. function summaryData(sourceData, handleCfg, prjData){
  199. let rstArr = [], tempRstArr = [];
  200. let curParentPrjData = {};
  201. for (let item of sourceData.data) {
  202. if (item._doc) {
  203. tempRstArr.push(item._doc);
  204. } else {
  205. tempRstArr.push(item);
  206. }
  207. }
  208. let private_get_grp_key = function (item) {
  209. let keys = [];
  210. for (let cfg of handleCfg[JV.PROP_SUM_GROUP_KEYS]) {
  211. if (typeof cfg === "string") {
  212. keys.push(item[cfg]);
  213. } else {
  214. if (!curParentPrjData[cfg["seeking_parent"]]) curParentPrjData[cfg["seeking_parent"]] = getModuleDataByKey(prjData, cfg["seeking_parent"]);
  215. for (let pDataItem of curParentPrjData[cfg["seeking_parent"]].data) {
  216. let data = (pDataItem._doc)?pDataItem._doc:pDataItem;
  217. if (item[cfg["seeking_key"]] === data[cfg["parent_key"]]) {
  218. keys.push(data[cfg["parent_grp_key"]]);
  219. break;
  220. }
  221. }
  222. }
  223. }
  224. return ( "grp_key_" + keys.join('_'));
  225. }
  226. let sumObj = {};
  227. for (let dtl of tempRstArr) {
  228. let grpKey = private_get_grp_key(dtl);
  229. if (sumObj[grpKey] === null || sumObj[grpKey] === undefined) {
  230. sumObj[grpKey] = dtl;
  231. rstArr.push(dtl);
  232. } else {
  233. for (let sumKey of handleCfg[JV.PROP_SUM_SUM_KEYS]) {
  234. if (dtl[sumKey]) {
  235. sumObj[grpKey][sumKey] += dtl[sumKey];
  236. }
  237. }
  238. }
  239. }
  240. delete sourceData.data;
  241. sourceData.data = rstArr;
  242. // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sumRst.js");
  243. }
  244. function filterData(sourceData, handleCfg, prjData) {
  245. let rstArr = [], tempRstArr = [];
  246. for (let item of sourceData.data) {
  247. if (item._doc) {
  248. tempRstArr.push(item._doc);
  249. } else {
  250. tempRstArr.push(item);
  251. }
  252. }
  253. let private_chkVal = function (src, dest, compStr) {
  254. let rst = true;
  255. switch (compStr) {
  256. case "==" :
  257. rst = (src == dest);
  258. break;
  259. case "===" :
  260. rst = (src === dest);
  261. break;
  262. case ">" :
  263. rst = (src > dest);
  264. break;
  265. case ">=" :
  266. rst = (src >= dest);
  267. break;
  268. case "<" :
  269. rst = (src < dest);
  270. break;
  271. case "<=" :
  272. rst = (src <= dest);
  273. break;
  274. case "!=" :
  275. rst = (src != dest);
  276. break;
  277. case "!==" :
  278. rst = (src !== dest);
  279. break;
  280. default:
  281. rst = true;
  282. }
  283. return rst;
  284. }
  285. for (let item of tempRstArr) {
  286. let compRst = true;
  287. let curComparePrjData = null;
  288. for (let cfg of handleCfg[JV.PROP_FILTER_KEY]) {
  289. if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
  290. //比较key值
  291. compRst = private_chkVal(item[cfg.key], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);
  292. } else if (cfg[JV.PROP_FILTER_COMPARE_OBJ] && cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]){
  293. //通过其他对象来过滤
  294. if (!curComparePrjData) {
  295. curComparePrjData = getModuleDataByKey(prjData, cfg[JV.PROP_FILTER_COMPARE_OBJ]);
  296. }
  297. for (let data of curComparePrjData.data) {
  298. compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
  299. if (compRst) break;
  300. }
  301. }
  302. }
  303. if (compRst) {
  304. rstArr.push(item);
  305. }
  306. }
  307. delete sourceData.data;
  308. sourceData.data = rstArr;
  309. // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/filteredRst.js");
  310. }
  311. function sortData(sourceData, sortCfg) {
  312. let rst = sourceData.data, tempRstArr = [];
  313. let sortType = sortCfg[JV.PROP_SORT_TYPE];
  314. for (let item of sourceData.data) {
  315. if (item._doc) {
  316. tempRstArr.push(item._doc);
  317. } else {
  318. tempRstArr.push(item);
  319. }
  320. }
  321. switch (sortType) {
  322. case "tree":
  323. rst = treeUtil.buildTreeNodeDirectly(tempRstArr);
  324. let destArr = [];
  325. treeUtil.getFlatArray(rst, destArr);
  326. delete sourceData.data;
  327. sourceData.data = destArr;
  328. // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.js");
  329. break;
  330. case "normal":
  331. tempRstArr.sort(function(a, b){
  332. let compRst = 0;
  333. for (let comp of sortCfg[JV.PROP_SORT_KEYS]) {
  334. let reverse = (comp.order === 'ascend')?1:(-1);
  335. if (a[comp.key] > b[comp.key]) {
  336. compRst = reverse;
  337. break;
  338. } else if (a[comp.key] < b[comp.key]) {
  339. compRst = -reverse;
  340. break;
  341. }
  342. }
  343. return compRst;
  344. });
  345. delete sourceData.data;
  346. sourceData.data = tempRstArr;
  347. // fsUtil.wirteObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/normalSortedRst.js");
  348. break;
  349. default:
  350. //
  351. }
  352. return rst;
  353. }
  354. function setupFunc(obj, prop, ownRawObj) {
  355. obj[prop] = {};
  356. // if (prop === projectConst.CALC_PROGRAM) {
  357. // obj[prop]["myOwnRawDataObj"] = ownRawObj.data;
  358. // } else {
  359. // obj[prop]["myOwnRawDataObj"] = ownRawObj;
  360. // }
  361. obj[prop]["myOwnRawDataObj"] = ownRawObj;
  362. obj[prop].getProperty = ext_getPropety;
  363. obj[prop].getFee = ext_getFee;
  364. obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
  365. obj[prop].getArrayItemByKey = ext_getArrayItemByKey;
  366. if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
  367. if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
  368. }
  369. function assembleFields(fieldList, rstDataArr, $PROJECT) {
  370. if (fieldList) {
  371. for (let field of fieldList) {
  372. shielded_exec_env($PROJECT, field, rstDataArr);
  373. }
  374. }
  375. }
  376. function shielded_exec_env($PROJECT, $ME, rptDataItemObj) {
  377. if ($ME[JV.PROP_FIELD_EXP_MAP]) {
  378. rptDataItemObj.push(eval($ME[JV.PROP_FIELD_EXP_MAP]));
  379. }
  380. }
  381. function ext_mainGetPropety(propKey) {
  382. let rst = [], parentObj = this;
  383. let dtObj = parentObj["myOwnRawDataObj"];
  384. if (propKey && dtObj) {
  385. if (dtObj.hasOwnProperty("property")) {
  386. rst.push(dtObj["property"][propKey]);
  387. } else {
  388. rst.push(dtObj[propKey]);
  389. }
  390. }
  391. return rst;
  392. }
  393. function ext_getPropety(propKey) {
  394. let rst = [], parentObj = this;
  395. let dtObj = parentObj["myOwnRawDataObj"];
  396. if (propKey && dtObj) {
  397. for (let dItem of dtObj.data) {
  398. let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
  399. if (doc.hasOwnProperty("property")) {
  400. rst.push(doc["property"][propKey]);
  401. } else if (doc.hasOwnProperty(propKey)) {
  402. rst.push(doc[propKey]);
  403. } else {
  404. rst.push('');
  405. }
  406. }
  407. }
  408. return rst;
  409. }
  410. function ext_mainGetFee(feeKey, dtlFeeKey) {
  411. let rst = [];
  412. let parentObj = this;
  413. let dtObj = parentObj["myOwnRawDataObj"];
  414. if ((dtObj) && (feeKey)) {
  415. if (dtObj.hasOwnProperty("fees")) {
  416. for (let fee of dtObj["fees"]) {
  417. if (fee["fieldName"] === feeKey) {
  418. if (dtlFeeKey) {
  419. rst.push(fee[dtlFeeKey]);
  420. } else {
  421. rst.push(fee["unitFee"]);
  422. }
  423. break;
  424. }
  425. }
  426. } else if (dtObj.hasOwnProperty(feeKey)) {
  427. rst.push(dtObj[feeKey]);
  428. } else {
  429. //
  430. }
  431. }
  432. return rst;
  433. }
  434. function ext_getFee(feeKey, dtlFeeKey) {
  435. let rst = [], parentObj = this;
  436. let dtObj = parentObj["myOwnRawDataObj"];
  437. if (feeKey && dtObj) {
  438. for (let dItem of dtObj.data) {
  439. let hasValue = false;
  440. if (dItem.hasOwnProperty("fees")) {
  441. for (let fee of dItem["fees"]) {
  442. if (fee["fieldName"] === feeKey) {
  443. if (dtlFeeKey) {
  444. rst.push(fee[dtlFeeKey]);
  445. } else {
  446. rst.push(fee["unitFee"]);
  447. }
  448. hasValue = true;
  449. break;
  450. }
  451. }
  452. } else if (dItem.hasOwnProperty(feeKey)) {
  453. hasValue = true;
  454. rst.push(dItem[feeKey]);
  455. } else {
  456. hasValue = true;
  457. rst.push(0);
  458. }
  459. if (!hasValue) {
  460. rst.push(0);
  461. }
  462. }
  463. }
  464. for (let i = 0; i < rst.length; i++) {
  465. rst[i] = parseFloat(rst[i]);
  466. }
  467. return rst;
  468. }
  469. function ext_getCalcProperty(templateIDs, calcItemKey, calcItemKeyVal, calcItemRstKey){
  470. let rst = [], parentObj = this; //this should be "calc_program" object
  471. let dtObj = parentObj["myOwnRawDataObj"];
  472. let optimizeObj = {};
  473. let private_getProperty = function (cId) {
  474. let calcTplObj = optimizeObj["calc_program_" + cId];
  475. if (!calcTplObj) {
  476. let templates = (dtObj.data._doc)?dtObj.data._doc.templates:dtObj.data.templates;
  477. for (let tpl of templates) {
  478. if (cId === tpl.ID) {
  479. optimizeObj["calc_program_" + cId] = tpl;
  480. calcTplObj = tpl;
  481. break;
  482. }
  483. }
  484. }
  485. if (calcTplObj) {
  486. for (let calcItem of calcTplObj.calcItems) {
  487. if (calcItem[calcItemKey] === calcItemKeyVal) {
  488. rst.push(calcItem[calcItemRstKey]);
  489. break;
  490. }
  491. }
  492. }
  493. };
  494. if (templateIDs instanceof Array) {
  495. for (let tplId of templateIDs) {
  496. private_getProperty(tplId);
  497. }
  498. } else {
  499. private_getProperty(templateIDs);
  500. }
  501. optimizeObj = null;
  502. return rst;
  503. }
  504. function ext_getFeeRate(fee_Ids){
  505. let rst = [], parentObj = this; //this should be "feeRate" object
  506. let dtObj = parentObj["myOwnRawDataObj"];
  507. let optimizeObj = {};
  508. let private_getFeeRate = function (fId) {
  509. let feeRateItemObj = optimizeObj["fee_rates_" + fId];
  510. if (!feeRateItemObj) {
  511. let rates = (dtObj.data._doc)?dtObj.data._doc.rates:dtObj.data.rates;
  512. for (let feeItem of rates) {
  513. if (fId === feeItem.ID) {
  514. optimizeObj["fee_rates_" + fId] = feeItem;
  515. feeRateItemObj = feeItem;
  516. break;
  517. }
  518. }
  519. }
  520. if (feeRateItemObj) {
  521. rst.push(feeRateItemObj.rate);
  522. } else {
  523. rst.push(0);
  524. }
  525. };
  526. if (fee_Ids instanceof Array) {
  527. for (let fId of fee_Ids) {
  528. private_getFeeRate(fId);
  529. }
  530. } else {
  531. private_getFeeRate(fee_Ids);
  532. }
  533. optimizeObj = null;
  534. return rst;
  535. }
  536. function ext_getArrayItemByKey(arrayKey, itemKey, itemKeyValue, itemRstKey){
  537. let rst = [], parentObj = this;
  538. let dtObj = parentObj["myOwnRawDataObj"];
  539. let private_getItemValue = function (arr, dtlItKV) {
  540. for (let item of arr) {
  541. if (item[itemKey] === dtlItKV) {
  542. if (itemRstKey) {
  543. rst.push(item[itemRstKey]);
  544. } else {
  545. rst.push(item);
  546. }
  547. break;
  548. }
  549. }
  550. };
  551. let arr = dtObj[arrayKey];
  552. if (arr && arr instanceof Array) {
  553. if (itemKeyValue instanceof Array) {
  554. for (let dtlItemKeyVal of itemKeyValue) {
  555. private_getItemValue(arr, dtlItemKeyVal);
  556. }
  557. } else {
  558. private_getItemValue(arr, itemKeyValue);
  559. }
  560. }
  561. }
  562. function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey) {
  563. let rst = [], parentObj = this;
  564. let IdKey = (adHocIdKey)?adHocIdKey:"ID";
  565. let dtObj = parentObj["myOwnRawDataObj"];
  566. if (foreignIdVal !== null && foreignIdVal !== undefined) {
  567. let isFound = false;
  568. if (foreignIdVal instanceof Array) {
  569. for (let idVal of foreignIdVal) {
  570. isFound = false;
  571. for (let i = 0; i < dtObj.data.length; i++) {
  572. let item = (dtObj.data[i]._doc)?dtObj.data[i]._doc:dtObj.data[i];
  573. if (item[IdKey] === idVal) {
  574. let splitPKey = propKey.split(".");
  575. if (splitPKey.length > 1) {
  576. let rstP = null;
  577. for (let i = 0; i < splitPKey.length; i++) {
  578. if (i === 0) {
  579. rstP = item[splitPKey[i]];
  580. } else {
  581. if (splitPKey[i].indexOf("[") === 0 && splitPKey[i].indexOf("]") === (splitPKey[i].length - 1)) {
  582. //考虑数组情况^_^!!!
  583. } else {
  584. //
  585. }
  586. rstP = rstP[splitPKey[i]];
  587. }
  588. }
  589. rst.push(rstP);
  590. } else {
  591. rst.push(item[propKey]);
  592. }
  593. isFound = true;
  594. break;
  595. }
  596. }
  597. // if (!isFound) rst.push[null];
  598. }
  599. } else {
  600. for (let item of dtObj.data) {
  601. if (item[IdKey] === foreignIdVal) {
  602. rst.push(item[propKey]);
  603. isFound = true;
  604. break;
  605. }
  606. }
  607. // if (!isFound) rst.push[null];
  608. }
  609. }
  610. return rst;
  611. }
  612. export default Rpt_Data_Extractor;