billsUtil.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Zhong
  6. * @date 2019/11/1
  7. * @version
  8. */
  9. ((factory) => {
  10. if (typeof module !== 'undefined') {
  11. module.exports = factory();
  12. } else {
  13. window.BILLS_UTIL = factory();
  14. }
  15. })(() => {
  16. // 清单模板各清单重设ID时,重新转换清单基数的ID引用(清单模板基数中使用@x标识行号)
  17. function parseCalcBase(calcBase, uuidMapping) {
  18. const orgIDRefs = [...new Set(calcBase.match(/@\d+/g))];
  19. orgIDRefs.forEach(orgRef => {
  20. const orgID = orgRef.match(/\d+/)[0];
  21. const newID = uuidMapping[orgID] || null;
  22. // ID匹配不上则不转换这个引用
  23. if (!newID) {
  24. return;
  25. }
  26. const replaceStr = `@${newID}`;
  27. calcBase = calcBase.replace(new RegExp(`${orgRef}\\b`, 'g'), replaceStr);
  28. });
  29. return calcBase;
  30. }
  31. // 重新转换清单基数的ID引用(@xxx标识的是ID)
  32. function parseIDRefCalcBase(calcBase, uuidMapping) {
  33. let rst = calcBase;
  34. Object
  35. .entries(uuidMapping)
  36. .forEach(([orgID, newID]) => {
  37. rst = rst.replace(orgID, newID);
  38. });
  39. return rst;
  40. }
  41. /*
  42. * @param {Array}billsList (完整的清单树结构数据)
  43. * @param {Function}idFactory 生成ID的方法
  44. * @param {boolean}isIDRef 清单的计算基数,是否可能使用了ID引用(区分模板清单的行引用)
  45. * @return {void}
  46. * */
  47. function resetTreeData(billsList, idFactory, isIDRef = false) {
  48. const idMapping = {};
  49. idMapping['-1'] = -1;
  50. // 建立新ID-旧ID映射
  51. billsList.forEach(bills => idMapping[bills.ID] = idFactory());
  52. const reg = /@\d+/;
  53. billsList.forEach(function (bills) {
  54. bills.ID = idMapping[bills.ID] ? idMapping[bills.ID] : -1;
  55. bills.ParentID = idMapping[bills.ParentID] ? idMapping[bills.ParentID] : -1;
  56. bills.NextSiblingID = idMapping[bills.NextSiblingID] ? idMapping[bills.NextSiblingID] : -1;
  57. if (isIDRef) {
  58. const IDRefReg = /@/;
  59. if (bills.calcBase && IDRefReg.test(bills.calcBase)) {
  60. bills.calcBase = parseIDRefCalcBase(bills.calcBase, idMapping);
  61. }
  62. } else {
  63. const needToParseCalcBase = bills.calcBase && reg.test(bills.calcBase);
  64. if (needToParseCalcBase) {
  65. bills.calcBase = parseCalcBase(bills.calcBase, idMapping);
  66. }
  67. }
  68. });
  69. }
  70. return {
  71. parseCalcBase,
  72. resetTreeData
  73. };
  74. });