@pisell/pisellos 2.3.74 → 2.3.75
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.js +36 -64
- 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 +38 -41
- 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.js +1713 -2118
- package/lib/modules/Order/payment-utils.js +77 -120
- 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 +1186 -1410
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.js +642 -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,129 +1,130 @@
|
|
|
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(menu_exports, {
|
|
22
|
-
MenuModule: () => MenuModule
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
23
5
|
});
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
6
|
+
exports.MenuModule = void 0;
|
|
7
|
+
var _lodashEs = require("lodash-es");
|
|
8
|
+
var _BaseModule = require("../../../modules/BaseModule");
|
|
9
|
+
var _types = require("./types");
|
|
10
|
+
/**
|
|
11
|
+
* IndexDB 存储名称
|
|
12
|
+
*/
|
|
13
|
+
const INDEXDB_STORE_NAME = 'menu';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 餐牌模块 - 用于管理餐牌数据和根据餐牌过滤商品
|
|
17
|
+
*/
|
|
18
|
+
class MenuModule extends _BaseModule.BaseModule {
|
|
19
|
+
defaultName = 'menu';
|
|
20
|
+
defaultVersion = '1.0.0';
|
|
21
|
+
request;
|
|
22
|
+
store;
|
|
23
|
+
dbManager; // IndexDBManager 实例
|
|
24
|
+
logger; // LoggerManager 实例
|
|
25
|
+
|
|
31
26
|
constructor(name, version) {
|
|
32
27
|
super(name, version);
|
|
33
|
-
this.defaultName = "menu";
|
|
34
|
-
this.defaultVersion = "1.0.0";
|
|
35
28
|
}
|
|
36
29
|
async initialize(core, options) {
|
|
37
|
-
var _a;
|
|
38
30
|
this.core = core;
|
|
39
|
-
this.store = options
|
|
40
|
-
|
|
31
|
+
this.store = options?.store;
|
|
32
|
+
|
|
33
|
+
// 获取依赖的插件
|
|
34
|
+
this.request = core.getPlugin('request');
|
|
41
35
|
if (!this.request) {
|
|
42
|
-
throw new Error(
|
|
36
|
+
throw new Error('MenuModule 需要 request 插件支持');
|
|
43
37
|
}
|
|
44
|
-
if (Array.isArray(
|
|
45
|
-
this.store.menuList = options
|
|
38
|
+
if (Array.isArray(options?.initialState?.menuList)) {
|
|
39
|
+
this.store.menuList = options?.initialState.menuList;
|
|
40
|
+
// 同步更新 Map 缓存
|
|
46
41
|
this.syncMenuMap();
|
|
47
|
-
this.core.effects.emit(
|
|
42
|
+
this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
|
|
48
43
|
} else {
|
|
49
44
|
this.store.menuList = [];
|
|
50
|
-
this.store.map =
|
|
45
|
+
this.store.map = new Map();
|
|
51
46
|
}
|
|
52
|
-
|
|
47
|
+
|
|
48
|
+
// 获取并存储 dbManager
|
|
49
|
+
const appPlugin = core.getPlugin('app');
|
|
53
50
|
if (appPlugin) {
|
|
54
51
|
const app = appPlugin.getApp();
|
|
55
52
|
this.dbManager = app.dbManager;
|
|
56
53
|
this.logger = app.logger;
|
|
57
|
-
if (this.dbManager) {
|
|
58
|
-
console.
|
|
59
|
-
} else {
|
|
60
|
-
console.warn("[Menu] IndexDB Manager 未找到");
|
|
54
|
+
if (this.dbManager) {} else {
|
|
55
|
+
console.warn('[Menu] IndexDB Manager 未找到');
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
|
-
this.logInfo(
|
|
58
|
+
this.logInfo('模块初始化完成', {
|
|
64
59
|
hasDbManager: !!this.dbManager,
|
|
65
60
|
hasLogger: !!this.logger,
|
|
66
61
|
initialMenuCount: this.store.menuList.length
|
|
67
62
|
});
|
|
68
63
|
}
|
|
64
|
+
|
|
69
65
|
/**
|
|
70
66
|
* 加载餐牌列表(从服务器)
|
|
71
67
|
*/
|
|
72
68
|
async loadMenuList() {
|
|
73
|
-
|
|
74
|
-
this.logInfo("开始从服务器加载餐牌列表");
|
|
69
|
+
this.logInfo('开始从服务器加载餐牌列表');
|
|
75
70
|
const startTime = Date.now();
|
|
76
71
|
try {
|
|
77
|
-
const response = await this.request.get(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
);
|
|
86
|
-
const menuList = ((_a = response == null ? void 0 : response.data) == null ? void 0 : _a.list) || [];
|
|
72
|
+
const response = await this.request.get(`/form/data/v1`, {
|
|
73
|
+
skip: 1,
|
|
74
|
+
num: 999,
|
|
75
|
+
code: 'menu_list'
|
|
76
|
+
}, {
|
|
77
|
+
cache: undefined
|
|
78
|
+
});
|
|
79
|
+
const menuList = response?.data?.list || [];
|
|
87
80
|
const duration = Date.now() - startTime;
|
|
88
|
-
this.logInfo(
|
|
81
|
+
this.logInfo('从服务器加载餐牌列表成功', {
|
|
89
82
|
menuCount: menuList.length,
|
|
90
83
|
duration: `${duration}ms`
|
|
91
84
|
});
|
|
85
|
+
|
|
86
|
+
// 保存到 IndexDB
|
|
92
87
|
await this.saveMenuToIndexDB(menuList);
|
|
93
88
|
await this.setMenuList(menuList);
|
|
94
89
|
return menuList;
|
|
95
90
|
} catch (error) {
|
|
96
91
|
const duration = Date.now() - startTime;
|
|
97
92
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
98
|
-
console.error(
|
|
99
|
-
this.logError(
|
|
93
|
+
console.error('[Menu] 加载餐牌数据失败:', error);
|
|
94
|
+
this.logError('从服务器加载餐牌列表失败', {
|
|
100
95
|
duration: `${duration}ms`,
|
|
101
96
|
error: errorMessage
|
|
102
97
|
});
|
|
103
98
|
return [];
|
|
104
99
|
}
|
|
105
100
|
}
|
|
101
|
+
|
|
106
102
|
/**
|
|
107
103
|
* 设置餐牌列表
|
|
108
104
|
*/
|
|
109
105
|
async setMenuList(menuList) {
|
|
110
106
|
this.store.menuList = menuList;
|
|
107
|
+
// 同步更新 Map 缓存
|
|
111
108
|
this.syncMenuMap();
|
|
112
|
-
await this.core.effects.emit(
|
|
109
|
+
await this.core.effects.emit(_types.MenuHooks.onMenuLoaded, menuList);
|
|
113
110
|
}
|
|
111
|
+
|
|
114
112
|
/**
|
|
115
113
|
* 获取餐牌列表
|
|
116
114
|
*/
|
|
117
115
|
getMenuList() {
|
|
118
116
|
return this.store.menuList;
|
|
119
117
|
}
|
|
118
|
+
|
|
120
119
|
/**
|
|
121
120
|
* 根据 form_record_id 数组获取餐牌详情
|
|
122
121
|
* 使用 Map 快速查询,时间复杂度 O(m),m 为 ids 数量
|
|
123
122
|
*/
|
|
124
123
|
getMenuByIds(ids) {
|
|
125
124
|
if (!ids || ids.length === 0) {
|
|
126
|
-
this.logInfo(
|
|
125
|
+
this.logInfo('getMenuByIds: 未提供有效的 ids', {
|
|
126
|
+
idsCount: 0
|
|
127
|
+
});
|
|
127
128
|
return [];
|
|
128
129
|
}
|
|
129
130
|
const result = [];
|
|
@@ -133,13 +134,14 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
133
134
|
result.push(menu);
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
|
-
this.logInfo(
|
|
137
|
+
this.logInfo('getMenuByIds: 查询完成', {
|
|
137
138
|
requestedCount: ids.length,
|
|
138
139
|
foundCount: result.length,
|
|
139
140
|
notFoundCount: ids.length - result.length
|
|
140
141
|
});
|
|
141
142
|
return result;
|
|
142
143
|
}
|
|
144
|
+
|
|
143
145
|
/**
|
|
144
146
|
* 同步更新餐牌 Map 缓存
|
|
145
147
|
* 将 menuList 中的餐牌同步到 map,以 form_record_id 为 key
|
|
@@ -150,90 +152,97 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
150
152
|
for (const menu of this.store.menuList) {
|
|
151
153
|
this.store.map.set(menu.form_record_id, menu);
|
|
152
154
|
}
|
|
153
|
-
console.log(`[Menu] Map 缓存已同步,共 ${this.store.map.size} 个餐牌`);
|
|
154
155
|
}
|
|
156
|
+
|
|
155
157
|
/**
|
|
156
158
|
* 清空缓存
|
|
157
159
|
*/
|
|
158
160
|
async clear() {
|
|
159
|
-
this.logInfo(
|
|
161
|
+
this.logInfo('开始清空缓存', {
|
|
160
162
|
currentMenuCount: this.store.menuList.length
|
|
161
163
|
});
|
|
162
164
|
this.store.menuList = [];
|
|
163
165
|
this.store.map.clear();
|
|
164
|
-
this.store.currentMenu =
|
|
166
|
+
this.store.currentMenu = undefined;
|
|
167
|
+
|
|
168
|
+
// 同时清空 IndexDB 中的数据
|
|
165
169
|
if (this.dbManager) {
|
|
166
170
|
try {
|
|
167
171
|
await this.dbManager.clear(INDEXDB_STORE_NAME);
|
|
168
|
-
|
|
169
|
-
this.logInfo("IndexDB 缓存已清空");
|
|
172
|
+
this.logInfo('IndexDB 缓存已清空');
|
|
170
173
|
} catch (error) {
|
|
171
174
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
172
|
-
console.error(
|
|
173
|
-
this.logError(
|
|
175
|
+
console.error('[Menu] 清空 IndexDB 缓存失败:', error);
|
|
176
|
+
this.logError('清空 IndexDB 缓存失败', {
|
|
177
|
+
error: errorMessage
|
|
178
|
+
});
|
|
174
179
|
}
|
|
175
180
|
}
|
|
176
|
-
|
|
177
|
-
this.logInfo("缓存清空完成");
|
|
181
|
+
this.logInfo('缓存清空完成');
|
|
178
182
|
}
|
|
183
|
+
|
|
179
184
|
/**
|
|
180
185
|
* 从 IndexDB 加载餐牌数据
|
|
181
186
|
* @private
|
|
182
187
|
*/
|
|
183
188
|
async loadMenuFromIndexDB() {
|
|
184
189
|
if (!this.dbManager) {
|
|
185
|
-
this.logWarning(
|
|
190
|
+
this.logWarning('loadMenuFromIndexDB: dbManager 不可用');
|
|
186
191
|
return [];
|
|
187
192
|
}
|
|
188
193
|
const startedAt = performance.now();
|
|
189
194
|
try {
|
|
195
|
+
// 直接获取所有餐牌记录
|
|
190
196
|
const menuList = await this.dbManager.getAll(INDEXDB_STORE_NAME);
|
|
191
|
-
this.logInfo(
|
|
192
|
-
menuCount:
|
|
197
|
+
this.logInfo('从 IndexDB 加载餐牌数据', {
|
|
198
|
+
menuCount: menuList?.length ?? 0,
|
|
193
199
|
durationMs: +(performance.now() - startedAt).toFixed(2)
|
|
194
200
|
});
|
|
195
201
|
return menuList || [];
|
|
196
202
|
} catch (error) {
|
|
197
203
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
198
|
-
console.error(
|
|
199
|
-
this.logError(
|
|
204
|
+
console.error('[Menu] 从 IndexDB 读取数据失败:', error);
|
|
205
|
+
this.logError('从 IndexDB 读取数据失败', {
|
|
200
206
|
durationMs: +(performance.now() - startedAt).toFixed(2),
|
|
201
207
|
error: errorMessage
|
|
202
208
|
});
|
|
203
209
|
return [];
|
|
204
210
|
}
|
|
205
211
|
}
|
|
212
|
+
|
|
206
213
|
/**
|
|
207
214
|
* 保存餐牌数据到 IndexDB
|
|
208
215
|
* @private
|
|
209
216
|
*/
|
|
210
217
|
async saveMenuToIndexDB(menuList) {
|
|
211
218
|
if (!this.dbManager) {
|
|
212
|
-
this.logWarning(
|
|
219
|
+
this.logWarning('saveMenuToIndexDB: dbManager 不可用');
|
|
213
220
|
return;
|
|
214
221
|
}
|
|
215
222
|
const startedAt = performance.now();
|
|
216
223
|
let clearDurationMs = 0;
|
|
217
224
|
let writeDurationMs = 0;
|
|
218
|
-
this.logInfo(
|
|
225
|
+
this.logInfo('开始保存餐牌数据到 IndexDB', {
|
|
226
|
+
menuCount: menuList.length
|
|
227
|
+
});
|
|
219
228
|
try {
|
|
229
|
+
// 先清空现有的餐牌数据
|
|
220
230
|
const clearStartedAt = performance.now();
|
|
221
231
|
try {
|
|
222
232
|
await this.dbManager.clear(INDEXDB_STORE_NAME);
|
|
223
233
|
} finally {
|
|
224
234
|
clearDurationMs = +(performance.now() - clearStartedAt).toFixed(2);
|
|
225
235
|
}
|
|
236
|
+
|
|
237
|
+
// 逐个保存餐牌(每个餐牌是独立的记录)
|
|
226
238
|
const writeStartedAt = performance.now();
|
|
227
|
-
const savePromises = menuList.map(
|
|
228
|
-
(menu) => this.dbManager.add(INDEXDB_STORE_NAME, menu)
|
|
229
|
-
);
|
|
239
|
+
const savePromises = menuList.map(menu => this.dbManager.add(INDEXDB_STORE_NAME, menu));
|
|
230
240
|
try {
|
|
231
241
|
await Promise.all(savePromises);
|
|
232
242
|
} finally {
|
|
233
243
|
writeDurationMs = +(performance.now() - writeStartedAt).toFixed(2);
|
|
234
244
|
}
|
|
235
|
-
|
|
236
|
-
this.logInfo("餐牌数据已保存到 IndexDB", {
|
|
245
|
+
this.logInfo('餐牌数据已保存到 IndexDB', {
|
|
237
246
|
menuCount: menuList.length,
|
|
238
247
|
clearDurationMs,
|
|
239
248
|
writeDurationMs,
|
|
@@ -241,8 +250,8 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
241
250
|
});
|
|
242
251
|
} catch (error) {
|
|
243
252
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
244
|
-
console.error(
|
|
245
|
-
this.logError(
|
|
253
|
+
console.error('[Menu] 保存数据到 IndexDB 失败:', error);
|
|
254
|
+
this.logError('保存数据到 IndexDB 失败', {
|
|
246
255
|
menuCount: menuList.length,
|
|
247
256
|
clearDurationMs,
|
|
248
257
|
writeDurationMs,
|
|
@@ -251,76 +260,85 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
251
260
|
});
|
|
252
261
|
}
|
|
253
262
|
}
|
|
263
|
+
|
|
254
264
|
/**
|
|
255
265
|
* 预加载模块数据(统一接口)
|
|
256
266
|
* 在模块注册后自动调用
|
|
257
267
|
*/
|
|
258
268
|
async preload() {
|
|
259
|
-
console.log("[Menu] 开始预加载数据...");
|
|
260
269
|
const startTime = Date.now();
|
|
261
|
-
this.logInfo(
|
|
270
|
+
this.logInfo('开始预加载数据');
|
|
262
271
|
try {
|
|
272
|
+
// 1. 尝试从 IndexDB 加载数据
|
|
263
273
|
const cachedData = await this.loadMenuFromIndexDB();
|
|
264
274
|
if (cachedData && cachedData.length > 0) {
|
|
265
|
-
|
|
266
|
-
this.store.menuList = (0,
|
|
275
|
+
// 将缓存数据放入 store
|
|
276
|
+
this.store.menuList = (0, _lodashEs.cloneDeep)(cachedData);
|
|
277
|
+
// 同步更新 Map 缓存
|
|
267
278
|
this.syncMenuMap();
|
|
268
|
-
this.core.effects.emit(
|
|
279
|
+
this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
|
|
269
280
|
const duration = Date.now() - startTime;
|
|
270
|
-
this.logInfo(
|
|
281
|
+
this.logInfo('预加载完成(从 IndexDB)', {
|
|
271
282
|
menuCount: cachedData.length,
|
|
272
283
|
duration: `${duration}ms`,
|
|
273
|
-
source:
|
|
284
|
+
source: 'IndexDB'
|
|
274
285
|
});
|
|
275
286
|
return;
|
|
276
287
|
}
|
|
277
|
-
|
|
278
|
-
this.logInfo("IndexDB 中没有缓存数据,准备从服务器加载");
|
|
288
|
+
this.logInfo('IndexDB 中没有缓存数据,准备从服务器加载');
|
|
279
289
|
} catch (error) {
|
|
280
290
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
281
|
-
console.warn(
|
|
282
|
-
this.logWarning(
|
|
291
|
+
console.warn('[Menu] 从 IndexDB 加载数据失败:', error);
|
|
292
|
+
this.logWarning('从 IndexDB 加载数据失败,准备从服务器加载', {
|
|
293
|
+
error: errorMessage
|
|
294
|
+
});
|
|
283
295
|
}
|
|
296
|
+
|
|
297
|
+
// 2. 如果 IndexDB 中没有数据,从服务器加载
|
|
284
298
|
const menuList = await this.loadMenuList();
|
|
299
|
+
|
|
300
|
+
// 3. 将服务器数据保存到 IndexDB 和 store
|
|
285
301
|
if (menuList && menuList.length > 0) {
|
|
286
302
|
await this.saveMenuToIndexDB(menuList);
|
|
287
|
-
this.store.menuList = (0,
|
|
303
|
+
this.store.menuList = (0, _lodashEs.cloneDeep)(menuList);
|
|
304
|
+
// 同步更新 Map 缓存
|
|
288
305
|
this.syncMenuMap();
|
|
289
|
-
this.core.effects.emit(
|
|
306
|
+
this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
|
|
290
307
|
const duration = Date.now() - startTime;
|
|
291
|
-
this.logInfo(
|
|
308
|
+
this.logInfo('预加载完成(从服务器)', {
|
|
292
309
|
menuCount: menuList.length,
|
|
293
310
|
duration: `${duration}ms`,
|
|
294
|
-
source:
|
|
311
|
+
source: 'Server'
|
|
295
312
|
});
|
|
296
313
|
} else {
|
|
297
314
|
const duration = Date.now() - startTime;
|
|
298
|
-
this.logWarning(
|
|
315
|
+
this.logWarning('预加载完成但未获取到数据', {
|
|
299
316
|
duration: `${duration}ms`
|
|
300
317
|
});
|
|
301
318
|
}
|
|
302
319
|
}
|
|
320
|
+
|
|
303
321
|
/**
|
|
304
322
|
* 获取模块的路由定义
|
|
305
323
|
* 返回该模块需要注册的 API 路由
|
|
306
324
|
*/
|
|
307
325
|
getRoutes() {
|
|
308
326
|
return [
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
}
|
|
327
|
+
// GET /api/menu - 获取所有餐牌
|
|
328
|
+
{
|
|
329
|
+
method: 'get',
|
|
330
|
+
path: '/api/menu',
|
|
331
|
+
handler: async () => {
|
|
332
|
+
const menuList = this.getMenuList();
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
data: menuList,
|
|
336
|
+
total: menuList.length
|
|
337
|
+
};
|
|
321
338
|
}
|
|
322
|
-
];
|
|
339
|
+
}];
|
|
323
340
|
}
|
|
341
|
+
|
|
324
342
|
/**
|
|
325
343
|
* 记录信息日志
|
|
326
344
|
* @param title 日志标题
|
|
@@ -330,14 +348,16 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
330
348
|
try {
|
|
331
349
|
if (this.logger) {
|
|
332
350
|
this.logger.addLog({
|
|
333
|
-
type:
|
|
351
|
+
type: 'info',
|
|
334
352
|
title: `[MenuModule] ${title}`,
|
|
335
353
|
metadata: metadata || {}
|
|
336
354
|
});
|
|
337
355
|
}
|
|
338
356
|
} catch {
|
|
357
|
+
// 日志记录失败不影响主流程
|
|
339
358
|
}
|
|
340
359
|
}
|
|
360
|
+
|
|
341
361
|
/**
|
|
342
362
|
* 记录警告日志
|
|
343
363
|
* @param title 日志标题
|
|
@@ -347,14 +367,16 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
347
367
|
try {
|
|
348
368
|
if (this.logger) {
|
|
349
369
|
this.logger.addLog({
|
|
350
|
-
type:
|
|
370
|
+
type: 'warning',
|
|
351
371
|
title: `[MenuModule] ${title}`,
|
|
352
372
|
metadata: metadata || {}
|
|
353
373
|
});
|
|
354
374
|
}
|
|
355
375
|
} catch {
|
|
376
|
+
// 日志记录失败不影响主流程
|
|
356
377
|
}
|
|
357
378
|
}
|
|
379
|
+
|
|
358
380
|
/**
|
|
359
381
|
* 记录错误日志
|
|
360
382
|
* @param title 日志标题
|
|
@@ -364,16 +386,14 @@ var MenuModule = class extends import_BaseModule.BaseModule {
|
|
|
364
386
|
try {
|
|
365
387
|
if (this.logger) {
|
|
366
388
|
this.logger.addLog({
|
|
367
|
-
type:
|
|
389
|
+
type: 'error',
|
|
368
390
|
title: `[MenuModule] ${title}`,
|
|
369
391
|
metadata: metadata || {}
|
|
370
392
|
});
|
|
371
393
|
}
|
|
372
394
|
} catch {
|
|
395
|
+
// 日志记录失败不影响主流程
|
|
373
396
|
}
|
|
374
397
|
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
0 && (module.exports = {
|
|
378
|
-
MenuModule
|
|
379
|
-
});
|
|
398
|
+
}
|
|
399
|
+
exports.MenuModule = MenuModule;
|
|
@@ -1,33 +1,20 @@
|
|
|
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(types_exports, {
|
|
22
|
-
MenuHooks: () => MenuHooks
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(types_exports);
|
|
25
|
-
var MenuHooks = /* @__PURE__ */ ((MenuHooks2) => {
|
|
26
|
-
MenuHooks2["onMenuLoaded"] = "menu:onMenuLoaded";
|
|
27
|
-
MenuHooks2["onMenuChanged"] = "menu:onMenuChanged";
|
|
28
|
-
return MenuHooks2;
|
|
29
|
-
})(MenuHooks || {});
|
|
30
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
31
|
-
0 && (module.exports = {
|
|
32
|
-
MenuHooks
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
33
5
|
});
|
|
6
|
+
exports.MenuHooks = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* 餐牌模块状态
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 餐牌数据结构
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 餐牌模块钩子
|
|
15
|
+
*/
|
|
16
|
+
let MenuHooks = exports.MenuHooks = /*#__PURE__*/function (MenuHooks) {
|
|
17
|
+
MenuHooks["onMenuLoaded"] = "menu:onMenuLoaded";
|
|
18
|
+
MenuHooks["onMenuChanged"] = "menu:onMenuChanged";
|
|
19
|
+
return MenuHooks;
|
|
20
|
+
}({});
|