ls-pro-common 3.1.45 → 3.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/common.css +16 -0
  2. package/dist/common.js +1 -1
  3. package/dist/common.less +2 -1
  4. package/dist/common.min.css +16 -0
  5. package/dist/common.min.js +1 -1
  6. package/es/components/Select/AreaCitySelect.d.ts +5 -0
  7. package/es/components/Select/AreaCitySelect.js +25 -0
  8. package/es/components/Select/AreaDistrictSelect.d.ts +5 -0
  9. package/es/components/Select/AreaDistrictSelect.js +25 -0
  10. package/es/components/Select/AreaProvinceSelect.d.ts +5 -0
  11. package/es/components/Select/AreaProvinceSelect.js +25 -0
  12. package/es/components/Select/Base.d.ts +11 -0
  13. package/es/components/Select/Base.js +127 -0
  14. package/es/components/Select/BrandDeptSelect.d.ts +5 -0
  15. package/es/components/Select/BrandDeptSelect.js +12 -0
  16. package/es/components/Select/CategorySelect.d.ts +5 -0
  17. package/es/components/Select/CategorySelect.js +12 -0
  18. package/es/components/Select/ColorSelect.d.ts +5 -0
  19. package/es/components/Select/ColorSelect.js +12 -0
  20. package/es/components/Select/ExpressCompanyPageSelect.d.ts +5 -0
  21. package/es/components/Select/ExpressCompanyPageSelect.js +12 -0
  22. package/es/components/Select/ExpressCompanySelect.d.ts +5 -0
  23. package/es/components/Select/ExpressCompanySelect.js +12 -0
  24. package/es/components/Select/GenderSelect.d.ts +5 -0
  25. package/es/components/Select/GenderSelect.js +12 -0
  26. package/es/components/Select/LogisticCategorySelect.d.ts +5 -0
  27. package/es/components/Select/LogisticCategorySelect.js +12 -0
  28. package/es/components/Select/LogisticRegionSelect.d.ts +5 -0
  29. package/es/components/Select/LogisticRegionSelect.js +12 -0
  30. package/es/components/Select/ManagingCitySelect.d.ts +5 -0
  31. package/es/components/Select/ManagingCitySelect.js +12 -0
  32. package/es/components/Select/OwnerSelect.d.ts +5 -0
  33. package/es/components/Select/OwnerSelect.js +12 -0
  34. package/es/components/Select/PhysicalStoreSelect.d.ts +5 -0
  35. package/es/components/Select/PhysicalStoreSelect.js +12 -0
  36. package/es/components/Select/PowerUnitSelect.d.ts +5 -0
  37. package/es/components/Select/PowerUnitSelect.js +12 -0
  38. package/es/components/Select/ProfitLossMainSelect.d.ts +5 -0
  39. package/es/components/Select/ProfitLossMainSelect.js +12 -0
  40. package/es/components/Select/SeasonSelect.d.ts +5 -0
  41. package/es/components/Select/SeasonSelect.js +12 -0
  42. package/es/components/Select/SettleAccountSelect.d.ts +5 -0
  43. package/es/components/Select/SettleAccountSelect.js +12 -0
  44. package/es/components/Select/SettleCategorySelect.d.ts +5 -0
  45. package/es/components/Select/SettleCategorySelect.js +12 -0
  46. package/es/components/Select/SettleCompanySelect.d.ts +5 -0
  47. package/es/components/Select/SettleCompanySelect.js +12 -0
  48. package/es/components/Select/ShopPageSelect.d.ts +5 -0
  49. package/es/components/Select/ShopPageSelect.js +12 -0
  50. package/es/components/Select/SizeTypeSelect.d.ts +5 -0
  51. package/es/components/Select/SizeTypeSelect.js +12 -0
  52. package/es/components/Select/StoreSelect.d.ts +5 -0
  53. package/es/components/Select/StoreSelect.js +12 -0
  54. package/es/components/Select/SupplierSelect.d.ts +5 -0
  55. package/es/components/Select/SupplierSelect.js +12 -0
  56. package/es/components/Select/TransportLocnoSelect.d.ts +5 -0
  57. package/es/components/Select/TransportLocnoSelect.js +12 -0
  58. package/es/components/Select/TransportPointPageSelect.d.ts +5 -0
  59. package/es/components/Select/TransportPointPageSelect.js +12 -0
  60. package/es/components/Select/UploadPointPageSelect.d.ts +5 -0
  61. package/es/components/Select/UploadPointPageSelect.js +12 -0
  62. package/es/components/Select/YearSelect.d.ts +5 -0
  63. package/es/components/Select/YearSelect.js +12 -0
  64. package/es/components/Select/common.d.ts +32 -0
  65. package/es/components/Select/common.js +20 -0
  66. package/es/components/Select/index.less +17 -0
  67. package/es/components/ViewOffice.js +1 -0
  68. package/es/components/index.d.ts +28 -0
  69. package/es/components/index.js +29 -1
  70. package/es/hooks/useMdm.d.ts +11 -2
  71. package/es/hooks/useMdm.js +26 -11
  72. package/es/http/index.d.ts +21 -0
  73. package/es/http/index.js +246 -2
  74. package/es/http/mdmCache.d.ts +19 -0
  75. package/es/http/mdmCache.js +157 -0
  76. package/es/http/mdmRequest.d.ts +148 -73
  77. package/es/http/mdmRequest.js +223 -93
  78. package/es/utils/index.d.ts +5 -3
  79. package/es/utils/index.js +15 -3
  80. package/es/utils/modal.js +1 -1
  81. package/es/utils/pasteUpload.d.ts +27 -0
  82. package/es/utils/pasteUpload.js +117 -0
  83. package/lib/components/Select/AreaCitySelect.d.ts +5 -0
  84. package/lib/components/Select/AreaCitySelect.js +25 -0
  85. package/lib/components/Select/AreaDistrictSelect.d.ts +5 -0
  86. package/lib/components/Select/AreaDistrictSelect.js +25 -0
  87. package/lib/components/Select/AreaProvinceSelect.d.ts +5 -0
  88. package/lib/components/Select/AreaProvinceSelect.js +25 -0
  89. package/lib/components/Select/Base.d.ts +11 -0
  90. package/lib/components/Select/Base.js +127 -0
  91. package/lib/components/Select/BrandDeptSelect.d.ts +5 -0
  92. package/lib/components/Select/BrandDeptSelect.js +12 -0
  93. package/lib/components/Select/CategorySelect.d.ts +5 -0
  94. package/lib/components/Select/CategorySelect.js +12 -0
  95. package/lib/components/Select/ColorSelect.d.ts +5 -0
  96. package/lib/components/Select/ColorSelect.js +12 -0
  97. package/lib/components/Select/ExpressCompanyPageSelect.d.ts +5 -0
  98. package/lib/components/Select/ExpressCompanyPageSelect.js +12 -0
  99. package/lib/components/Select/ExpressCompanySelect.d.ts +5 -0
  100. package/lib/components/Select/ExpressCompanySelect.js +12 -0
  101. package/lib/components/Select/GenderSelect.d.ts +5 -0
  102. package/lib/components/Select/GenderSelect.js +12 -0
  103. package/lib/components/Select/LogisticCategorySelect.d.ts +5 -0
  104. package/lib/components/Select/LogisticCategorySelect.js +12 -0
  105. package/lib/components/Select/LogisticRegionSelect.d.ts +5 -0
  106. package/lib/components/Select/LogisticRegionSelect.js +12 -0
  107. package/lib/components/Select/ManagingCitySelect.d.ts +5 -0
  108. package/lib/components/Select/ManagingCitySelect.js +12 -0
  109. package/lib/components/Select/OwnerSelect.d.ts +5 -0
  110. package/lib/components/Select/OwnerSelect.js +12 -0
  111. package/lib/components/Select/PhysicalStoreSelect.d.ts +5 -0
  112. package/lib/components/Select/PhysicalStoreSelect.js +12 -0
  113. package/lib/components/Select/PowerUnitSelect.d.ts +5 -0
  114. package/lib/components/Select/PowerUnitSelect.js +12 -0
  115. package/lib/components/Select/ProfitLossMainSelect.d.ts +5 -0
  116. package/lib/components/Select/ProfitLossMainSelect.js +12 -0
  117. package/lib/components/Select/SeasonSelect.d.ts +5 -0
  118. package/lib/components/Select/SeasonSelect.js +12 -0
  119. package/lib/components/Select/SettleAccountSelect.d.ts +5 -0
  120. package/lib/components/Select/SettleAccountSelect.js +12 -0
  121. package/lib/components/Select/SettleCategorySelect.d.ts +5 -0
  122. package/lib/components/Select/SettleCategorySelect.js +12 -0
  123. package/lib/components/Select/SettleCompanySelect.d.ts +5 -0
  124. package/lib/components/Select/SettleCompanySelect.js +12 -0
  125. package/lib/components/Select/ShopPageSelect.d.ts +5 -0
  126. package/lib/components/Select/ShopPageSelect.js +12 -0
  127. package/lib/components/Select/SizeTypeSelect.d.ts +5 -0
  128. package/lib/components/Select/SizeTypeSelect.js +12 -0
  129. package/lib/components/Select/StoreSelect.d.ts +5 -0
  130. package/lib/components/Select/StoreSelect.js +12 -0
  131. package/lib/components/Select/SupplierSelect.d.ts +5 -0
  132. package/lib/components/Select/SupplierSelect.js +12 -0
  133. package/lib/components/Select/TransportLocnoSelect.d.ts +5 -0
  134. package/lib/components/Select/TransportLocnoSelect.js +12 -0
  135. package/lib/components/Select/TransportPointPageSelect.d.ts +5 -0
  136. package/lib/components/Select/TransportPointPageSelect.js +12 -0
  137. package/lib/components/Select/UploadPointPageSelect.d.ts +5 -0
  138. package/lib/components/Select/UploadPointPageSelect.js +12 -0
  139. package/lib/components/Select/YearSelect.d.ts +5 -0
  140. package/lib/components/Select/YearSelect.js +12 -0
  141. package/lib/components/Select/common.d.ts +32 -0
  142. package/lib/components/Select/common.js +20 -0
  143. package/lib/components/Select/index.less +17 -0
  144. package/lib/components/ViewOffice.js +1 -0
  145. package/lib/components/index.d.ts +28 -0
  146. package/lib/components/index.js +29 -1
  147. package/lib/hooks/useMdm.d.ts +11 -2
  148. package/lib/hooks/useMdm.js +26 -11
  149. package/lib/http/index.d.ts +21 -0
  150. package/lib/http/index.js +246 -2
  151. package/lib/http/mdmCache.d.ts +19 -0
  152. package/lib/http/mdmCache.js +157 -0
  153. package/lib/http/mdmRequest.d.ts +148 -73
  154. package/lib/http/mdmRequest.js +223 -93
  155. package/lib/utils/index.d.ts +5 -3
  156. package/lib/utils/index.js +15 -3
  157. package/lib/utils/modal.js +1 -1
  158. package/lib/utils/pasteUpload.d.ts +27 -0
  159. package/lib/utils/pasteUpload.js +117 -0
  160. package/package.json +1 -1
package/lib/http/index.js CHANGED
@@ -156,7 +156,7 @@ request.interceptors.response.use( /*#__PURE__*/function () {
156
156
  case 18:
157
157
  if ((retCode === 'timeout' || retCode === '4011' || retCode === '4013' || retCode === '9009' && retMsg === '令牌不能为空') && !isMobile) {
158
158
  if (!getCookie('token')) {
159
- (window.top || window).location.href = location.pathname === '/' ? '/login' : '/login?redirect=' + encodeURIComponent(location.href);
159
+ (window.top || window).location.href = location.pathname === '/' || location.pathname.startsWith('/login') ? '/login' : '/login?redirect=' + encodeURIComponent(location.href);
160
160
  } else {
161
161
  reLogin();
162
162
  }
@@ -225,7 +225,7 @@ request.interceptors.response.use( /*#__PURE__*/function () {
225
225
  if (_retCode && !status.includes(_retCode)) {
226
226
  if ((_retCode === 'timeout' || _retCode === '4011' || _retCode === '9009' && _retMsg === '令牌不能为空') && !isMobile) {
227
227
  if (!getCookie('token')) {
228
- (window.top || window).location.href = location.pathname === '/' ? '/login' : '/login?redirect=' + encodeURIComponent(location.href);
228
+ (window.top || window).location.href = location.pathname === '/' || location.pathname.startsWith('/login') ? '/login' : '/login?redirect=' + encodeURIComponent(location.href);
229
229
  } else {
230
230
  reLogin();
231
231
  }
@@ -469,6 +469,250 @@ export var getResourceRight = function getResourceRight(ids) {
469
469
  resourceIds: ids
470
470
  }, true, false);
471
471
  };
472
+ /**
473
+ * 上传文件,因fetch不支持进度回调,使用XMLHttpRequest实现上传文件
474
+ *
475
+ * @param url 上传接口地址
476
+ * @param file 要上传的文件
477
+ * @param params 附加其它参数 {key:value}
478
+ * @param labelName 对应后端接口的文件字段名,默认为 'file'
479
+ * @param needGateWay 是否需要网关,默认为 true,如果url里已包含网关,则不需要网关
480
+ * @param onProgress 进度回调函数,参数为 0-100 的进度百分比
481
+ * @returns 返回包含 promise 和 cancel 方法的对象
482
+ */
483
+ export var httpUpload = function httpUpload(url, file) {
484
+ var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
485
+ var labelName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'file';
486
+ var needGateWay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
487
+ var onProgress = arguments.length > 5 ? arguments[5] : undefined;
488
+ var formData = new FormData();
489
+ // 处理附加参数,转换为FormData格式
490
+ Object.keys(params).forEach(function (key) {
491
+ var value = params[key];
492
+ if (value !== undefined && value !== null) {
493
+ formData.append(key, typeof value === 'string' ? value : JSON.stringify(value));
494
+ }
495
+ });
496
+ // 添加文件
497
+ formData.append(labelName, file);
498
+ // 如果需要网关,转换 URL
499
+ var finalUrl = needGateWay ? toGatewayUrl(url) : url;
500
+ // 创建 XMLHttpRequest 以实现进度追踪和取消功能
501
+ var xhr = new XMLHttpRequest();
502
+ var isCancelled = false;
503
+ var promise = new Promise(function (resolve, reject) {
504
+ var _window$crypto$random2, _window$crypto2;
505
+ // 处理 URL(模拟拦截器的逻辑)
506
+ var requestUrl = finalUrl;
507
+ // 移除 noToken 参数
508
+ requestUrl = requestUrl.replace('&noToken=1', '').replace('noToken=1', '');
509
+ // 处理 resCode
510
+ var resCode = getUrlQuery('resCode', requestUrl) || window.__currentResCode__ || getUrlQuery('resCode') || getUrlQuery('resourceId') || getResourceProps('resourceId');
511
+ // 添加时间戳和随机数参数
512
+ var param = {
513
+ _t1: Date.now(),
514
+ __r: ((_window$crypto$random2 = (_window$crypto2 = window.crypto)['randomUUID']) === null || _window$crypto$random2 === void 0 ? void 0 : _window$crypto$random2.call(_window$crypto2)) || Math.random()
515
+ };
516
+ // 当没有明文参数resCode的时候,添加resCode参数为资源Id
517
+ if (resCode && !getUrlQuery('resCode', requestUrl)) {
518
+ param.resCode = resCode;
519
+ }
520
+ requestUrl = setUrlQuery(requestUrl, param);
521
+ // 设置请求头
522
+ xhr.open('POST', requestUrl, true);
523
+ xhr.timeout = 60000 * 10; // 10分钟超时
524
+ // 设置请求头(模拟拦截器的逻辑)
525
+ var headers = {};
526
+ if (browserId) {
527
+ headers.browserId = browserId;
528
+ } else if (getCache('browserId')) {
529
+ browserId = getCache('browserId');
530
+ headers.browserId = browserId;
531
+ } else {
532
+ // 异步获取 browserId(不影响当前请求)
533
+ getBrowserId().then(function (id) {
534
+ browserId = id;
535
+ });
536
+ }
537
+ var shopNo = getCacheSessionFirst('shopNo');
538
+ if (shopNo) {
539
+ headers.shopNo = shopNo;
540
+ }
541
+ var shopCode = getCacheSessionFirst('shopCode');
542
+ if (shopCode) {
543
+ headers.shopCode = shopCode;
544
+ }
545
+ var storeNo = getCacheSessionFirst('storeNo');
546
+ if (storeNo) {
547
+ headers.storeNo = storeNo;
548
+ }
549
+ var tag = getCookie('x-asm-prefer-tag');
550
+ if (tag) {
551
+ headers['x-asm-prefer-tag'] = tag;
552
+ }
553
+ if (isDingtalk) {
554
+ headers['terminal'] = 'APP';
555
+ } else {
556
+ headers['terminal'] = 'PC';
557
+ }
558
+ var expireWarnFlag = getCache('expireWarnFlag', true);
559
+ headers.expireWarnFlag = expireWarnFlag === '1' ? '1' : '0';
560
+ var token = getCookie('token');
561
+ if (token && requestUrl.indexOf('noToken=1') === -1) {
562
+ headers.token = token;
563
+ }
564
+ Object.keys(headers).forEach(function (key) {
565
+ xhr.setRequestHeader(key, headers[key]);
566
+ });
567
+ // 监听上传进度
568
+ if (onProgress && xhr.upload) {
569
+ xhr.upload.addEventListener('progress', function (e) {
570
+ if (e.lengthComputable && !isCancelled) {
571
+ var percent = Math.round(e.loaded / e.total * 100);
572
+ onProgress(percent);
573
+ }
574
+ });
575
+ }
576
+ // 监听请求完成
577
+ xhr.onload = function () {
578
+ var _navigator2, _navigator2$userAgent;
579
+ if (isCancelled) {
580
+ return;
581
+ }
582
+ var noMsg = getUrlQuery('noMsg', requestUrl);
583
+ var userAgent = (_navigator2 = navigator) === null || _navigator2 === void 0 ? void 0 : (_navigator2$userAgent = _navigator2.userAgent) === null || _navigator2$userAgent === void 0 ? void 0 : _navigator2$userAgent.toLowerCase();
584
+ var isMobile = /mobile/i.test(userAgent);
585
+ if (xhr.status >= 200 && xhr.status < 300) {
586
+ try {
587
+ var _response$flag, _response$flag2, _response$flag3;
588
+ var response = JSON.parse(xhr.responseText);
589
+ // 处理业务异常(模拟响应拦截器的逻辑)
590
+ var retCode = (response === null || response === void 0 ? void 0 : (_response$flag = response.flag) === null || _response$flag === void 0 ? void 0 : _response$flag.retCode) || '0';
591
+ var retMsg = (response === null || response === void 0 ? void 0 : (_response$flag2 = response.flag) === null || _response$flag2 === void 0 ? void 0 : _response$flag2.retMsg) || '请求的服务出错';
592
+ var status = (getUrlQuery('apiStatus', requestUrl) || '0').split(',');
593
+ var faultCode = response === null || response === void 0 ? void 0 : (_response$flag3 = response.flag) === null || _response$flag3 === void 0 ? void 0 : _response$flag3.faultCode;
594
+ var is99110 = false;
595
+ // wms 提示,是否排班标识
596
+ if (retCode === '99110') {
597
+ is99110 = true;
598
+ if (getCache('expireWarnFlag', true) === '1' || ifExpireWarn) {
599
+ resolve(response);
600
+ return;
601
+ }
602
+ ifExpireWarn = true;
603
+ setCache('expireWarnFlag', '1', true);
604
+ }
605
+ if (retCode && !status.includes(retCode) && noMsg !== '1') {
606
+ if ((retCode === 'timeout' || retCode === '4011' || retCode === '4013' || retCode === '9009' && retMsg === '令牌不能为空') && !isMobile) {
607
+ if (!getCookie('token')) {
608
+ (window.top || window).location.href = location.pathname === '/' || location.pathname.startsWith('/login') ? '/login' : '/login?redirect=' + encodeURIComponent(location.href);
609
+ } else {
610
+ reLogin();
611
+ }
612
+ reject(new Error(retMsg));
613
+ return;
614
+ } else if (faultCode) {
615
+ var text;
616
+ if (retCode === '4012') {
617
+ text = '用户已禁用,无权限进行操作';
618
+ }
619
+ httpError(text || retMsg, retCode, faultCode, {
620
+ title: is99110 ? '账号到期提醒' : '请求接口出错'
621
+ });
622
+ reject(new Error(retMsg));
623
+ return;
624
+ } else {
625
+ showError(retMsg);
626
+ reject(new Error(retMsg));
627
+ return;
628
+ }
629
+ }
630
+ resolve(response);
631
+ } catch (e) {
632
+ resolve(xhr.responseText);
633
+ }
634
+ } else {
635
+ // HTTP 状态码错误
636
+ try {
637
+ var _response$flag4, _response$flag5, _response$flag6;
638
+ var _response = JSON.parse(xhr.responseText);
639
+ var _retCode2 = (_response$flag4 = _response.flag) === null || _response$flag4 === void 0 ? void 0 : _response$flag4.retCode;
640
+ var _retMsg2 = (_response$flag5 = _response.flag) === null || _response$flag5 === void 0 ? void 0 : _response$flag5.retMsg;
641
+ var _faultCode2 = (_response$flag6 = _response.flag) === null || _response$flag6 === void 0 ? void 0 : _response$flag6.faultCode;
642
+ var _is2 = false;
643
+ // wms 提示,是否排班标识
644
+ if (_retCode2 === '99110') {
645
+ _is2 = true;
646
+ if (getCache('expireWarnFlag', true) === '1' || ifExpireWarn) {
647
+ reject(new Error(_retMsg2 || httpStatus[xhr.status] || xhr.statusText));
648
+ return;
649
+ }
650
+ ifExpireWarn = true;
651
+ setCache('expireWarnFlag', '1', true);
652
+ }
653
+ if (noMsg !== '1') {
654
+ if (_faultCode2) {
655
+ var _text3;
656
+ if (_retCode2 === '4012') {
657
+ _text3 = '用户已禁用,无权限进行操作';
658
+ }
659
+ httpError(_text3 || _retMsg2, _retCode2, _faultCode2, {
660
+ title: _is2 ? '账号到期提醒' : '请求接口出错'
661
+ });
662
+ } else {
663
+ var _text4 = httpStatus[xhr.status];
664
+ if (xhr.status === 503 && xhr.statusText === 'no healthy upstream') {
665
+ _text4 = '请求的服务未启动';
666
+ } else if (xhr.status === 503 && xhr.statusText === 'reached concurrency limit') {
667
+ _text4 = '请求的服务被限流';
668
+ }
669
+ showError(_text4 || _retMsg2 || xhr.statusText);
670
+ }
671
+ }
672
+ reject(new Error(_retMsg2 || httpStatus[xhr.status] || xhr.statusText));
673
+ } catch (e) {
674
+ var _text5 = httpStatus[xhr.status];
675
+ if (xhr.status === 503 && xhr.statusText === 'no healthy upstream') {
676
+ _text5 = '请求的服务未启动';
677
+ } else if (xhr.status === 503 && xhr.statusText === 'reached concurrency limit') {
678
+ _text5 = '请求的服务被限流';
679
+ }
680
+ var httpStatusText = _text5 || e.message || xhr.statusText;
681
+ if (noMsg !== '1') {
682
+ showError(httpStatusText);
683
+ }
684
+ reject(new Error(httpStatusText));
685
+ }
686
+ }
687
+ };
688
+ // 监听错误
689
+ xhr.onerror = function () {
690
+ if (!isCancelled) {
691
+ reject(new Error('网络错误'));
692
+ }
693
+ };
694
+ // 监听超时
695
+ xhr.ontimeout = function () {
696
+ if (!isCancelled) {
697
+ showError('请求超时');
698
+ reject(new Error('请求超时'));
699
+ }
700
+ };
701
+ // 发送请求
702
+ xhr.send(formData);
703
+ });
704
+ // 取消方法
705
+ var cancel = function cancel() {
706
+ if (!isCancelled) {
707
+ isCancelled = true;
708
+ xhr.abort();
709
+ }
710
+ };
711
+ return {
712
+ promise: promise,
713
+ cancel: cancel
714
+ };
715
+ };
472
716
  // 默认分批获取数据的大小
473
717
  var defaultPageSize = 2000;
474
718
  /**
@@ -0,0 +1,19 @@
1
+ /** 主数据内存缓存管理器 使用 LRU (Least Recently Used) 策略管理缓存 防止内存无限增长导致页面卡顿 */
2
+ /** 设置主数据缓存 */
3
+ export declare const setMdmCache: (key: string, value: any) => void;
4
+ /** 获取主数据缓存 */
5
+ export declare const getMdmCache: (key: string) => any | undefined;
6
+ /** 删除指定缓存 */
7
+ export declare const deleteMdmCache: (key: string) => boolean;
8
+ /** 清空所有主数据缓存 */
9
+ export declare const clearMdmCache: () => void;
10
+ /** 获取缓存统计信息(用于监控和调试) */
11
+ export declare const getMdmCacheStats: () => {
12
+ size: number;
13
+ sizeMB: string;
14
+ count: number;
15
+ maxSize: number;
16
+ maxCount: number;
17
+ };
18
+ /** 获取所有缓存键(用于调试) */
19
+ export declare const getMdmCacheKeys: () => string[];
@@ -0,0 +1,157 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
+ /** 主数据内存缓存管理器 使用 LRU (Least Recently Used) 策略管理缓存 防止内存无限增长导致页面卡顿 */
4
+ var LRUCache = /*#__PURE__*/function () {
5
+ function LRUCache() {
6
+ var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50 * 1024 * 1024;
7
+ var maxCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
8
+ _classCallCheck(this, LRUCache);
9
+ this.cache = void 0;
10
+ this.maxSize = void 0;
11
+ // 最大缓存大小(字节),默认 50MB
12
+ this.maxCount = void 0;
13
+ // 最大缓存条目数,默认 100
14
+ this.currentSize = 0;
15
+ this.cache = new Map();
16
+ this.maxSize = maxSize;
17
+ this.maxCount = maxCount;
18
+ }
19
+ /** 估算对象大小(字节) */
20
+ _createClass(LRUCache, [{
21
+ key: "estimateSize",
22
+ value: function estimateSize(obj) {
23
+ try {
24
+ return new Blob([JSON.stringify(obj)]).size;
25
+ } catch (_unused) {
26
+ // 如果序列化失败,使用粗略估算
27
+ return JSON.stringify(obj).length * 2;
28
+ }
29
+ }
30
+ /** 获取缓存 */
31
+ }, {
32
+ key: "get",
33
+ value: function get(key) {
34
+ var item = this.cache.get(key);
35
+ if (!item) {
36
+ return undefined;
37
+ }
38
+ // 更新最后使用时间
39
+ item.lastUsed = Date.now();
40
+ // 将该项移到 Map 末尾(LRU)
41
+ this.cache.delete(key);
42
+ this.cache.set(key, item);
43
+ return item.value;
44
+ }
45
+ /** 设置缓存 */
46
+ }, {
47
+ key: "set",
48
+ value: function set(key, value) {
49
+ var size = this.estimateSize(value);
50
+ var item = {
51
+ value: value,
52
+ lastUsed: Date.now(),
53
+ size: size
54
+ };
55
+ // 如果已存在,先删除旧项
56
+ var oldItem = this.cache.get(key);
57
+ if (oldItem) {
58
+ this.currentSize -= oldItem.size;
59
+ this.cache.delete(key);
60
+ }
61
+ // 检查是否需要清理空间
62
+ this.evictIfNeeded(size);
63
+ // 添加新项
64
+ this.cache.set(key, item);
65
+ this.currentSize += size;
66
+ }
67
+ /** 清理空间(LRU 策略) */
68
+ }, {
69
+ key: "evictIfNeeded",
70
+ value: function evictIfNeeded(newItemSize) {
71
+ // 检查数量限制
72
+ while (this.cache.size >= this.maxCount && this.cache.size > 0) {
73
+ var firstKey = this.cache.keys().next().value;
74
+ if (!firstKey) break;
75
+ var item = this.cache.get(firstKey);
76
+ if (item) {
77
+ this.currentSize -= item.size;
78
+ this.cache.delete(firstKey);
79
+ }
80
+ }
81
+ // 检查大小限制
82
+ while (this.currentSize + newItemSize > this.maxSize && this.cache.size > 0) {
83
+ // 找到最久未使用的项(Map 的第一个)
84
+ var _firstKey = this.cache.keys().next().value;
85
+ if (!_firstKey) break;
86
+ var _item = this.cache.get(_firstKey);
87
+ if (_item) {
88
+ this.currentSize -= _item.size;
89
+ this.cache.delete(_firstKey);
90
+ }
91
+ }
92
+ }
93
+ /** 删除指定缓存 */
94
+ }, {
95
+ key: "delete",
96
+ value: function _delete(key) {
97
+ var item = this.cache.get(key);
98
+ if (item) {
99
+ this.currentSize -= item.size;
100
+ return this.cache.delete(key);
101
+ }
102
+ return false;
103
+ }
104
+ /** 清空所有缓存 */
105
+ }, {
106
+ key: "clear",
107
+ value: function clear() {
108
+ this.cache.clear();
109
+ this.currentSize = 0;
110
+ }
111
+ /** 获取缓存统计信息 */
112
+ }, {
113
+ key: "getStats",
114
+ value: function getStats() {
115
+ return {
116
+ size: this.currentSize,
117
+ sizeMB: (this.currentSize / 1024 / 1024).toFixed(2),
118
+ count: this.cache.size,
119
+ maxSize: this.maxSize,
120
+ maxCount: this.maxCount
121
+ };
122
+ }
123
+ /** 获取所有缓存键 */
124
+ }, {
125
+ key: "keys",
126
+ value: function keys() {
127
+ return Array.from(this.cache.keys());
128
+ }
129
+ }]);
130
+ return LRUCache;
131
+ }(); // 创建全局缓存实例
132
+ // 默认限制:50MB 或 100 个条目
133
+ var mdmCache = new LRUCache(50 * 1024 * 1024, 100);
134
+ /** 设置主数据缓存 */
135
+ export var setMdmCache = function setMdmCache(key, value) {
136
+ mdmCache.set(key, value);
137
+ };
138
+ /** 获取主数据缓存 */
139
+ export var getMdmCache = function getMdmCache(key) {
140
+ return mdmCache.get(key);
141
+ };
142
+ /** 删除指定缓存 */
143
+ export var deleteMdmCache = function deleteMdmCache(key) {
144
+ return mdmCache.delete(key);
145
+ };
146
+ /** 清空所有主数据缓存 */
147
+ export var clearMdmCache = function clearMdmCache() {
148
+ mdmCache.clear();
149
+ };
150
+ /** 获取缓存统计信息(用于监控和调试) */
151
+ export var getMdmCacheStats = function getMdmCacheStats() {
152
+ return mdmCache.getStats();
153
+ };
154
+ /** 获取所有缓存键(用于调试) */
155
+ export var getMdmCacheKeys = function getMdmCacheKeys() {
156
+ return mdmCache.keys();
157
+ };