@pisell/pisellos 2.3.74 → 2.3.76
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.
- package/dist/core/index.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Order/index.js +75 -91
- package/dist/modules/Order/types.d.ts +3 -1
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +100 -72
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Order/index.js +1733 -2121
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.d.ts +3 -1
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1220 -1412
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +652 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,84 +1,98 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(scanCache_exports, {
|
|
22
|
-
default: () => scanCache_default
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
23
5
|
});
|
|
24
|
-
|
|
25
|
-
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 简单的数据压缩函数
|
|
9
|
+
* @param data 要压缩的数据
|
|
10
|
+
* @returns 压缩后的字符串
|
|
11
|
+
*/
|
|
12
|
+
const compressData = data => {
|
|
26
13
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
14
|
+
// 处理undefined值
|
|
15
|
+
if (data === undefined) {
|
|
16
|
+
return 'undefined';
|
|
29
17
|
}
|
|
30
18
|
return JSON.stringify(data);
|
|
31
19
|
} catch (error) {
|
|
32
|
-
console.warn(
|
|
20
|
+
console.warn('数据压缩失败:', error);
|
|
33
21
|
return JSON.stringify(data);
|
|
34
22
|
}
|
|
35
23
|
};
|
|
36
|
-
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 数据解压缩函数
|
|
27
|
+
* @param compressedData 压缩后的数据
|
|
28
|
+
* @returns 解压缩后的数据
|
|
29
|
+
*/
|
|
30
|
+
const decompressData = compressedData => {
|
|
37
31
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
// 处理undefined值
|
|
33
|
+
if (compressedData === 'undefined') {
|
|
34
|
+
return undefined;
|
|
40
35
|
}
|
|
41
36
|
return JSON.parse(compressedData);
|
|
42
37
|
} catch (error) {
|
|
43
|
-
console.warn(
|
|
38
|
+
console.warn('数据解压缩失败:', error);
|
|
44
39
|
return null;
|
|
45
40
|
}
|
|
46
41
|
};
|
|
47
|
-
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 双向链表节点
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* LRU缓存类,用于缓存接口数据
|
|
49
|
+
* 限制最多存储100条数据,超过时移除最久未使用的数据
|
|
50
|
+
* 支持数据压缩以减小缓存压力
|
|
51
|
+
* 尾部优先策略:新节点插入尾部,最近使用的节点移动到尾部,删除头部节点
|
|
52
|
+
*/
|
|
53
|
+
class LRUCache {
|
|
54
|
+
head = null; // 最久未使用的节点
|
|
55
|
+
tail = null; // 最近使用的节点
|
|
56
|
+
keyMap = new Map(); // key到节点的映射(只存储引用)
|
|
57
|
+
maxSize;
|
|
48
58
|
constructor(maxSize = 100) {
|
|
49
|
-
this.head = null;
|
|
50
|
-
// 最久未使用的节点
|
|
51
|
-
this.tail = null;
|
|
52
|
-
// 最近使用的节点
|
|
53
|
-
this.keyMap = /* @__PURE__ */ new Map();
|
|
54
59
|
this.maxSize = maxSize;
|
|
55
60
|
}
|
|
61
|
+
|
|
56
62
|
/**
|
|
57
63
|
* 将节点移动到链表尾部(最近使用)
|
|
58
64
|
* @param node 要移动的节点
|
|
59
65
|
*/
|
|
60
66
|
moveToTail(node) {
|
|
61
|
-
if (this.tail === node)
|
|
62
|
-
|
|
67
|
+
if (this.tail === node) return; // 已经是尾部
|
|
68
|
+
|
|
69
|
+
// 从当前位置移除
|
|
63
70
|
if (node.prev) {
|
|
64
71
|
node.prev.next = node.next;
|
|
65
72
|
}
|
|
66
73
|
if (node.next) {
|
|
67
74
|
node.next.prev = node.prev;
|
|
68
75
|
}
|
|
76
|
+
|
|
77
|
+
// 如果是头部,更新头部
|
|
69
78
|
if (this.head === node) {
|
|
70
79
|
this.head = node.next;
|
|
71
80
|
}
|
|
81
|
+
|
|
82
|
+
// 移动到尾部
|
|
72
83
|
if (this.tail) {
|
|
73
84
|
this.tail.next = node;
|
|
74
85
|
}
|
|
75
86
|
node.prev = this.tail;
|
|
76
87
|
node.next = null;
|
|
77
88
|
this.tail = node;
|
|
89
|
+
|
|
90
|
+
// 如果链表为空,设置头部
|
|
78
91
|
if (!this.head) {
|
|
79
92
|
this.head = node;
|
|
80
93
|
}
|
|
81
94
|
}
|
|
95
|
+
|
|
82
96
|
/**
|
|
83
97
|
* 添加新节点到链表尾部
|
|
84
98
|
* @param key 缓存键
|
|
@@ -86,6 +100,7 @@ var LRUCache = class {
|
|
|
86
100
|
* @param timestamp 时间戳
|
|
87
101
|
*/
|
|
88
102
|
addToTail(key, compressedData, timestamp) {
|
|
103
|
+
// 先保存当前的tail引用
|
|
89
104
|
const oldTail = this.tail;
|
|
90
105
|
const node = {
|
|
91
106
|
key,
|
|
@@ -95,16 +110,23 @@ var LRUCache = class {
|
|
|
95
110
|
// 使用保存的引用,避免循环引用
|
|
96
111
|
next: null
|
|
97
112
|
};
|
|
113
|
+
|
|
114
|
+
// 存储节点引用
|
|
98
115
|
this.keyMap.set(key, node);
|
|
116
|
+
|
|
117
|
+
// 更新链表关系
|
|
99
118
|
if (oldTail) {
|
|
100
119
|
oldTail.next = node;
|
|
101
120
|
}
|
|
102
121
|
this.tail = node;
|
|
122
|
+
|
|
123
|
+
// 如果是第一个节点,设置head
|
|
103
124
|
if (!this.head) {
|
|
104
125
|
this.head = node;
|
|
105
126
|
}
|
|
106
127
|
return node;
|
|
107
128
|
}
|
|
129
|
+
|
|
108
130
|
/**
|
|
109
131
|
* 从链表中移除节点
|
|
110
132
|
* @param node 要移除的节点
|
|
@@ -122,8 +144,11 @@ var LRUCache = class {
|
|
|
122
144
|
if (this.tail === node) {
|
|
123
145
|
this.tail = node.prev;
|
|
124
146
|
}
|
|
147
|
+
|
|
148
|
+
// 从Map中移除引用
|
|
125
149
|
this.keyMap.delete(node.key);
|
|
126
150
|
}
|
|
151
|
+
|
|
127
152
|
/**
|
|
128
153
|
* 移除最久未使用的节点(链表头部)
|
|
129
154
|
*/
|
|
@@ -132,26 +157,35 @@ var LRUCache = class {
|
|
|
132
157
|
this.removeNode(this.head);
|
|
133
158
|
}
|
|
134
159
|
}
|
|
160
|
+
|
|
135
161
|
/**
|
|
136
162
|
* 设置缓存
|
|
137
163
|
* @param key 缓存键
|
|
138
164
|
* @param data 缓存数据
|
|
139
165
|
*/
|
|
140
166
|
set(key, data) {
|
|
167
|
+
// 压缩数据
|
|
141
168
|
const compressedData = compressData(data);
|
|
142
169
|
const timestamp = Date.now();
|
|
170
|
+
|
|
171
|
+
// 检查是否已存在该key
|
|
143
172
|
const existingNode = this.keyMap.get(key);
|
|
144
173
|
if (existingNode) {
|
|
174
|
+
// 如果已存在,更新数据并移动到链表尾部
|
|
145
175
|
existingNode.compressedData = compressedData;
|
|
146
176
|
existingNode.timestamp = timestamp;
|
|
147
177
|
this.moveToTail(existingNode);
|
|
148
178
|
} else {
|
|
179
|
+
// 如果是新数据且缓存已满,移除最久未使用的数据(头部)
|
|
149
180
|
if (this.keyMap.size >= this.maxSize) {
|
|
150
181
|
this.removeOldest();
|
|
151
182
|
}
|
|
183
|
+
|
|
184
|
+
// 添加新数据到尾部
|
|
152
185
|
this.addToTail(key, compressedData, timestamp);
|
|
153
186
|
}
|
|
154
187
|
}
|
|
188
|
+
|
|
155
189
|
/**
|
|
156
190
|
* 获取缓存
|
|
157
191
|
* @param key 缓存键
|
|
@@ -160,18 +194,22 @@ var LRUCache = class {
|
|
|
160
194
|
get(key) {
|
|
161
195
|
const node = this.keyMap.get(key);
|
|
162
196
|
if (node) {
|
|
197
|
+
// 解压缩数据
|
|
163
198
|
const decompressedData = decompressData(node.compressedData);
|
|
164
199
|
if (decompressedData !== null) {
|
|
200
|
+
// 更新访问时间戳并移动到链表尾部
|
|
165
201
|
node.timestamp = Date.now();
|
|
166
202
|
this.moveToTail(node);
|
|
167
203
|
return decompressedData;
|
|
168
204
|
} else {
|
|
205
|
+
// 如果解压缩失败,删除该缓存项
|
|
169
206
|
this.removeNode(node);
|
|
170
|
-
return
|
|
207
|
+
return undefined;
|
|
171
208
|
}
|
|
172
209
|
}
|
|
173
|
-
return
|
|
210
|
+
return undefined;
|
|
174
211
|
}
|
|
212
|
+
|
|
175
213
|
/**
|
|
176
214
|
* 检查是否存在缓存
|
|
177
215
|
* @param key 缓存键
|
|
@@ -180,10 +218,12 @@ var LRUCache = class {
|
|
|
180
218
|
has(key) {
|
|
181
219
|
return this.keyMap.has(key);
|
|
182
220
|
}
|
|
221
|
+
|
|
183
222
|
/**
|
|
184
223
|
* 清除所有缓存
|
|
185
224
|
*/
|
|
186
225
|
clear() {
|
|
226
|
+
// 清除所有节点的引用关系,帮助垃圾回收
|
|
187
227
|
let current = this.head;
|
|
188
228
|
while (current) {
|
|
189
229
|
const next = current.next;
|
|
@@ -191,10 +231,13 @@ var LRUCache = class {
|
|
|
191
231
|
current.next = null;
|
|
192
232
|
current = next;
|
|
193
233
|
}
|
|
234
|
+
|
|
235
|
+
// 清除Map和头尾指针
|
|
194
236
|
this.keyMap.clear();
|
|
195
237
|
this.head = null;
|
|
196
238
|
this.tail = null;
|
|
197
239
|
}
|
|
240
|
+
|
|
198
241
|
/**
|
|
199
242
|
* 获取缓存大小
|
|
200
243
|
* @returns 当前缓存数量
|
|
@@ -202,6 +245,7 @@ var LRUCache = class {
|
|
|
202
245
|
size() {
|
|
203
246
|
return this.keyMap.size;
|
|
204
247
|
}
|
|
248
|
+
|
|
205
249
|
/**
|
|
206
250
|
* 获取缓存统计信息
|
|
207
251
|
* @returns 缓存统计信息
|
|
@@ -213,6 +257,7 @@ var LRUCache = class {
|
|
|
213
257
|
usage: Math.round(this.keyMap.size / this.maxSize * 100)
|
|
214
258
|
};
|
|
215
259
|
}
|
|
260
|
+
|
|
216
261
|
/**
|
|
217
262
|
* 删除指定的缓存项
|
|
218
263
|
* @param key 要删除的缓存键
|
|
@@ -226,6 +271,8 @@ var LRUCache = class {
|
|
|
226
271
|
}
|
|
227
272
|
return false;
|
|
228
273
|
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 创建全局缓存实例
|
|
277
|
+
const scanCache = new LRUCache();
|
|
278
|
+
var _default = exports.default = scanCache;
|
|
@@ -1,50 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(scanProductValues_exports, {
|
|
22
|
-
countScanVariantMatches: () => countScanVariantMatches,
|
|
23
|
-
genScanProductValues: () => genScanProductValues,
|
|
24
|
-
isScanProductBundle: () => isScanProductBundle,
|
|
25
|
-
isScanProductOption: () => isScanProductOption
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
26
5
|
});
|
|
27
|
-
|
|
6
|
+
exports.countScanVariantMatches = countScanVariantMatches;
|
|
7
|
+
exports.genScanProductValues = genScanProductValues;
|
|
8
|
+
exports.isScanProductBundle = isScanProductBundle;
|
|
9
|
+
exports.isScanProductOption = isScanProductOption;
|
|
10
|
+
/**
|
|
11
|
+
* 扫码商品条码预选规格纯函数(对齐 ticketBooking addServiceVariant/utils)。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** 套餐商品 */
|
|
28
15
|
function isScanProductBundle(item) {
|
|
29
|
-
return (
|
|
16
|
+
return (item?.bundle_group_count || 0) > 0;
|
|
30
17
|
}
|
|
18
|
+
|
|
19
|
+
/** 单规格 / 选项组商品 */
|
|
31
20
|
function isScanProductOption(item) {
|
|
32
|
-
|
|
33
|
-
return ((item == null ? void 0 : item.option_group_count) || 0) > 0 || (((_a = item == null ? void 0 : item.option_group) == null ? void 0 : _a.length) || 0) > 0;
|
|
21
|
+
return (item?.option_group_count || 0) > 0 || (item?.option_group?.length || 0) > 0;
|
|
34
22
|
}
|
|
35
23
|
function formatVariantGroupTitle(title, variantGroup = []) {
|
|
36
24
|
try {
|
|
37
|
-
return variantGroup.map(
|
|
38
|
-
const value = title
|
|
39
|
-
return value ? `${
|
|
40
|
-
}).filter(Boolean).join(
|
|
25
|
+
return variantGroup.map(group => {
|
|
26
|
+
const value = title?.[group?.position_id];
|
|
27
|
+
return value ? `${group?.name || '-'}: ${value}` : '';
|
|
28
|
+
}).filter(Boolean).join(', ');
|
|
41
29
|
} catch {
|
|
42
|
-
return
|
|
30
|
+
return '';
|
|
43
31
|
}
|
|
44
32
|
}
|
|
45
33
|
function formatDataKey(data) {
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
const next = {
|
|
35
|
+
...data
|
|
36
|
+
};
|
|
48
37
|
let key = `${next.product_id}`;
|
|
49
38
|
let rowKey = key;
|
|
50
39
|
if (next.product_variant_id) {
|
|
@@ -52,19 +41,19 @@ function formatDataKey(data) {
|
|
|
52
41
|
key += str;
|
|
53
42
|
rowKey += str;
|
|
54
43
|
}
|
|
55
|
-
if (
|
|
44
|
+
if (next?.option?.length) {
|
|
56
45
|
for (const item of next.option) {
|
|
57
46
|
const str = `_${item.option_group_id}_${item.product_option_item_id}`;
|
|
58
47
|
key += str;
|
|
59
48
|
rowKey += `${str}_${item.quantity || item.num}`;
|
|
60
49
|
}
|
|
61
50
|
}
|
|
62
|
-
if (
|
|
51
|
+
if (next?.bundle?.length) {
|
|
63
52
|
for (const item of next.bundle) {
|
|
64
53
|
let str = `_${item.group_id}_${item.bundle_product_id}`;
|
|
65
54
|
key += str;
|
|
66
55
|
rowKey += `${str}_${item.quantity || item.num}`;
|
|
67
|
-
if (item
|
|
56
|
+
if (item?.option) {
|
|
68
57
|
for (const opt of item.option) {
|
|
69
58
|
const optStr = `_${opt.option_group_id}_${opt.product_option_item_id}`;
|
|
70
59
|
key += optStr;
|
|
@@ -73,13 +62,13 @@ function formatDataKey(data) {
|
|
|
73
62
|
}
|
|
74
63
|
}
|
|
75
64
|
}
|
|
76
|
-
if (next
|
|
77
|
-
const str = `_${
|
|
65
|
+
if (next?.session) {
|
|
66
|
+
const str = `_${next.session?.key}`;
|
|
78
67
|
key += str;
|
|
79
68
|
rowKey += str;
|
|
80
69
|
}
|
|
81
|
-
if (next
|
|
82
|
-
const str = `_${
|
|
70
|
+
if (next?.schedule) {
|
|
71
|
+
const str = `_${next.schedule?.key}`;
|
|
83
72
|
key += str;
|
|
84
73
|
rowKey += str;
|
|
85
74
|
}
|
|
@@ -87,41 +76,40 @@ function formatDataKey(data) {
|
|
|
87
76
|
next.rowKey = rowKey;
|
|
88
77
|
return next;
|
|
89
78
|
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 根据条码匹配 variant,生成 cartDetailValue(对齐 ticketBooking `genValues`)。
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```ts
|
|
85
|
+
* const values = genScanProductValues(catalogItem, '6901234567890');
|
|
86
|
+
* const itemWithSelection = { ...catalogItem, cartDetailValue: values };
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
90
89
|
function genScanProductValues(item, code) {
|
|
91
|
-
var _a, _b;
|
|
92
90
|
const params = {
|
|
93
91
|
bundle: [],
|
|
94
92
|
option: [],
|
|
95
93
|
product_id: item.id,
|
|
96
94
|
product_variant_id: 0,
|
|
97
95
|
quantity: 1,
|
|
98
|
-
rowKey:
|
|
96
|
+
rowKey: '',
|
|
99
97
|
session: null
|
|
100
98
|
};
|
|
101
|
-
if (
|
|
102
|
-
const variantItem = (item.variant || []).find(
|
|
103
|
-
(v) => (v == null ? void 0 : v.code) === code || (v == null ? void 0 : v.barcode) === code
|
|
104
|
-
);
|
|
99
|
+
if (item?.variant_group?.length || item?.option_group?.length) {
|
|
100
|
+
const variantItem = (item.variant || []).find(v => v?.code === code || v?.barcode === code);
|
|
105
101
|
if (variantItem) {
|
|
106
|
-
params.price = Number(
|
|
102
|
+
params.price = Number(variantItem?.price || 0);
|
|
107
103
|
params.product_variant_id = variantItem.id;
|
|
108
|
-
params.product_option_string = formatVariantGroupTitle(
|
|
109
|
-
variantItem == null ? void 0 : variantItem.title,
|
|
110
|
-
(item == null ? void 0 : item.variant_group) || []
|
|
111
|
-
);
|
|
104
|
+
params.product_option_string = formatVariantGroupTitle(variantItem?.title, item?.variant_group || []);
|
|
112
105
|
}
|
|
113
106
|
}
|
|
114
107
|
return formatDataKey(params);
|
|
115
108
|
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* 统计条码命中的 variant 数量(多命中时需弹窗选择)。
|
|
112
|
+
*/
|
|
116
113
|
function countScanVariantMatches(item, code) {
|
|
117
|
-
return (
|
|
118
|
-
|
|
119
|
-
).length;
|
|
120
|
-
}
|
|
121
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
122
|
-
0 && (module.exports = {
|
|
123
|
-
countScanVariantMatches,
|
|
124
|
-
genScanProductValues,
|
|
125
|
-
isScanProductBundle,
|
|
126
|
-
isScanProductOption
|
|
127
|
-
});
|
|
114
|
+
return (item?.variant || []).filter(v => v?.code === code || v?.barcode === code).length;
|
|
115
|
+
}
|
|
@@ -1,60 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
__export(sessionCatalogStale_exports, {
|
|
32
|
-
buildSessionCatalogStaleInfo: () => buildSessionCatalogStaleInfo,
|
|
33
|
-
isSessionCatalogDateStale: () => isSessionCatalogDateStale
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
34
5
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
var
|
|
6
|
+
exports.buildSessionCatalogStaleInfo = buildSessionCatalogStaleInfo;
|
|
7
|
+
exports.isSessionCatalogDateStale = isSessionCatalogDateStale;
|
|
8
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
const SESSION_EXTENSION_TYPES = ['session_product', 'session_ticket'];
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 是否为 session 商品。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* getIsSessionProduct({ extension_type: 'session_ticket' }); // true
|
|
17
|
+
*/
|
|
38
18
|
function getIsSessionProduct(product) {
|
|
39
|
-
return SESSION_EXTENSION_TYPES.includes(product
|
|
19
|
+
return SESSION_EXTENSION_TYPES.includes(product?.extension_type);
|
|
40
20
|
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 从 session 快照解析日历日 YYYY-MM-DD。
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* resolveSessionCalendarDay({ start_at: '2026-06-05 10:00:00' }); // '2026-06-05'
|
|
27
|
+
*/
|
|
41
28
|
function resolveSessionCalendarDay(session) {
|
|
42
|
-
if (!session)
|
|
43
|
-
return null;
|
|
29
|
+
if (!session) return null;
|
|
44
30
|
const raw = session.start_at ?? session.end_at;
|
|
45
|
-
if (!raw)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return parsed.isValid() ? parsed.format("YYYY-MM-DD") : null;
|
|
31
|
+
if (!raw) return null;
|
|
32
|
+
const parsed = (0, _dayjs.default)(raw);
|
|
33
|
+
return parsed.isValid() ? parsed.format('YYYY-MM-DD') : null;
|
|
49
34
|
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 将 booking / TimeBar 日期规范为 YYYY-MM-DD。
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* formatScheduleCalendarDay('2026-06-05 19:01:18'); // '2026-06-05'
|
|
41
|
+
*/
|
|
50
42
|
function formatScheduleCalendarDay(date) {
|
|
51
|
-
if (date == null || date ===
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return parsed.isValid() ? parsed.format("YYYY-MM-DD") : null;
|
|
43
|
+
if (date == null || date === '') return null;
|
|
44
|
+
const parsed = (0, _dayjs.default)(date);
|
|
45
|
+
return parsed.isValid() ? parsed.format('YYYY-MM-DD') : null;
|
|
55
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* 判断 session 商品 catalog 中的 session 日历日是否与当前 TimeBar / bookingDate 不一致。
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* isSessionCatalogDateStale(product, '2026-06-05 19:01:18');
|
|
52
|
+
* // session 为 2026-06-04 → true;一致或无 session 快照 → false
|
|
53
|
+
*/
|
|
56
54
|
function isSessionCatalogDateStale(product, bookingDate) {
|
|
57
|
-
var _a;
|
|
58
55
|
if (!getIsSessionProduct(product)) {
|
|
59
56
|
return false;
|
|
60
57
|
}
|
|
@@ -62,24 +59,25 @@ function isSessionCatalogDateStale(product, bookingDate) {
|
|
|
62
59
|
if (!timeBarDay) {
|
|
63
60
|
return false;
|
|
64
61
|
}
|
|
65
|
-
const sessionDay = resolveSessionCalendarDay(
|
|
62
|
+
const sessionDay = resolveSessionCalendarDay(product.cartDetailValue?.session);
|
|
66
63
|
if (!sessionDay) {
|
|
67
64
|
return false;
|
|
68
65
|
}
|
|
69
66
|
return sessionDay !== timeBarDay;
|
|
70
67
|
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 组装 session catalog 日期不一致时的日志 metadata。
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* buildSessionCatalogStaleInfo(product, '2026-06-05 19:01:18');
|
|
74
|
+
*/
|
|
71
75
|
function buildSessionCatalogStaleInfo(product, bookingDate) {
|
|
72
|
-
var _a;
|
|
73
76
|
return {
|
|
74
|
-
productId:
|
|
75
|
-
productTitle:
|
|
76
|
-
sessionDay: resolveSessionCalendarDay(
|
|
77
|
+
productId: product?.id ?? null,
|
|
78
|
+
productTitle: product?.title ?? product?.name ?? null,
|
|
79
|
+
sessionDay: resolveSessionCalendarDay(product.cartDetailValue?.session),
|
|
77
80
|
timeBarDay: formatScheduleCalendarDay(bookingDate),
|
|
78
81
|
bookingDate
|
|
79
82
|
};
|
|
80
|
-
}
|
|
81
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
82
|
-
0 && (module.exports = {
|
|
83
|
-
buildSessionCatalogStaleInfo,
|
|
84
|
-
isSessionCatalogDateStale
|
|
85
|
-
});
|
|
83
|
+
}
|