@pisell/pisellos 2.3.73 → 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.
Files changed (296) hide show
  1. package/dist/core/index.d.ts +7 -0
  2. package/dist/core/index.js +111 -71
  3. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  4. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  5. package/dist/model/strategy/strategy-example.js +5 -19
  6. package/dist/modules/Cart/index.js +0 -3
  7. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  8. package/dist/modules/Date/index.js +1 -5
  9. package/dist/modules/Discount/index.js +2 -4
  10. package/dist/modules/OpenData/index.js +0 -2
  11. package/dist/modules/Order/index.d.ts +1 -1
  12. package/dist/modules/Order/index.js +36 -64
  13. package/dist/modules/Payment/index.js +97 -162
  14. package/dist/modules/Quotation/index.d.ts +6 -0
  15. package/dist/modules/Quotation/index.js +75 -19
  16. package/dist/modules/Rules/index.js +1 -4
  17. package/dist/modules/Schedule/index.js +0 -1
  18. package/dist/modules/Schedule/utils.js +0 -1
  19. package/dist/modules/Step/index.js +0 -1
  20. package/dist/plugins/request.d.ts +1 -0
  21. package/dist/plugins/request.js +1 -4
  22. package/dist/plugins/window.js +2 -6
  23. package/dist/server/index.d.ts +8 -2
  24. package/dist/server/index.js +303 -269
  25. package/dist/server/modules/floor-plan/index.d.ts +4 -0
  26. package/dist/server/modules/floor-plan/index.js +240 -98
  27. package/dist/server/modules/menu/index.js +75 -59
  28. package/dist/server/modules/order/index.d.ts +17 -7
  29. package/dist/server/modules/order/index.js +421 -211
  30. package/dist/server/modules/products/index.d.ts +8 -2
  31. package/dist/server/modules/products/index.js +191 -117
  32. package/dist/server/modules/quotation/index.js +29 -38
  33. package/dist/server/modules/resource/index.js +24 -17
  34. package/dist/server/modules/schedule/index.js +27 -35
  35. package/dist/server/utils/product.js +0 -1
  36. package/dist/solution/BaseSales/index.js +38 -41
  37. package/dist/solution/BookingByStep/index.d.ts +1 -1
  38. package/dist/solution/BookingByStep/index.js +7 -59
  39. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  40. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  41. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  42. package/dist/solution/BookingTicket/index.js +0 -2
  43. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
  44. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  45. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  46. package/dist/solution/BuyTickets/index.js +9 -12
  47. package/dist/solution/Checkout/index.js +177 -252
  48. package/dist/solution/Checkout/utils/index.js +4 -16
  49. package/dist/solution/RegisterAndLogin/index.js +30 -76
  50. package/dist/solution/ScanOrder/index.js +50 -60
  51. package/dist/solution/ShopDiscount/index.js +2 -7
  52. package/dist/solution/VenueBooking/index.js +45 -55
  53. package/dist/utils/task.js +15 -18
  54. package/dist/utils/watch.js +0 -1
  55. package/lib/apis/picoding.js +2 -0
  56. package/lib/core/index.d.ts +7 -0
  57. package/lib/core/index.js +149 -131
  58. package/lib/effects/index.js +46 -57
  59. package/lib/index.js +82 -49
  60. package/lib/model/index.js +14 -21
  61. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  62. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  63. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  64. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  65. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  66. package/lib/model/strategy/adapter/index.js +100 -64
  67. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  68. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  69. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  70. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  71. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  72. package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
  73. package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
  74. package/lib/model/strategy/adapter/promotion/examples.js +222 -234
  75. package/lib/model/strategy/adapter/promotion/index.js +1 -0
  76. package/lib/model/strategy/adapter/promotion/type.js +243 -36
  77. package/lib/model/strategy/adapter/type.js +4 -16
  78. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
  79. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  80. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  81. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  82. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  83. package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
  84. package/lib/model/strategy/engine.js +270 -168
  85. package/lib/model/strategy/index.js +49 -34
  86. package/lib/model/strategy/strategy-example.js +243 -239
  87. package/lib/model/strategy/type.js +100 -40
  88. package/lib/modules/Account/index.js +39 -53
  89. package/lib/modules/Account/types.js +20 -33
  90. package/lib/modules/AccountList/index.js +116 -154
  91. package/lib/modules/AccountList/types.js +30 -31
  92. package/lib/modules/AccountList/utils.js +18 -30
  93. package/lib/modules/BaseModule.js +23 -42
  94. package/lib/modules/BookingContext/index.js +158 -136
  95. package/lib/modules/BookingContext/types.js +46 -32
  96. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
  97. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
  98. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
  99. package/lib/modules/BookingContext/utils/flexible.js +38 -55
  100. package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
  101. package/lib/modules/BookingContext/utils/index.js +124 -41
  102. package/lib/modules/BookingContext/utils/noResource.js +58 -70
  103. package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
  104. package/lib/modules/BookingContext/utils/productExtend.js +202 -155
  105. package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
  106. package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
  107. package/lib/modules/BookingContext/utils/resources.js +209 -167
  108. package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
  109. package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
  110. package/lib/modules/Cart/index.js +170 -124
  111. package/lib/modules/Cart/types.js +46 -51
  112. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  113. package/lib/modules/Cart/utils/cartDate.js +56 -61
  114. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  115. package/lib/modules/Cart/utils/cartNote.js +27 -32
  116. package/lib/modules/Cart/utils/cartProduct.js +321 -251
  117. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  118. package/lib/modules/Cart/utils/cartResource.js +70 -78
  119. package/lib/modules/Cart/utils/changePrice.js +22 -50
  120. package/lib/modules/Cart/utils/index.js +106 -48
  121. package/lib/modules/Customer/constants.js +13 -34
  122. package/lib/modules/Customer/index.js +235 -172
  123. package/lib/modules/Customer/types.js +38 -35
  124. package/lib/modules/Date/index.js +116 -115
  125. package/lib/modules/Date/types.js +16 -28
  126. package/lib/modules/Date/utils.js +174 -123
  127. package/lib/modules/Discount/index.js +122 -127
  128. package/lib/modules/Discount/types.js +9 -31
  129. package/lib/modules/Guests/index.js +30 -56
  130. package/lib/modules/Guests/types.js +23 -33
  131. package/lib/modules/Holder/index.js +209 -189
  132. package/lib/modules/Holder/types.js +4 -16
  133. package/lib/modules/Holder/utils.js +20 -49
  134. package/lib/modules/OpenData/index.js +70 -76
  135. package/lib/modules/OpenData/types.js +4 -16
  136. package/lib/modules/OpenData/utils.js +44 -78
  137. package/lib/modules/Order/index.d.ts +1 -1
  138. package/lib/modules/Order/index.js +1713 -2118
  139. package/lib/modules/Order/payment-utils.js +77 -120
  140. package/lib/modules/Order/types.js +88 -35
  141. package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
  142. package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
  143. package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
  144. package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
  145. package/lib/modules/Order/utils.js +814 -647
  146. package/lib/modules/Payment/cash.js +20 -33
  147. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  148. package/lib/modules/Payment/eftpos.js +16 -30
  149. package/lib/modules/Payment/index.js +532 -399
  150. package/lib/modules/Payment/mx51.js +1 -0
  151. package/lib/modules/Payment/types.js +230 -108
  152. package/lib/modules/Payment/utils.js +52 -51
  153. package/lib/modules/Payment/walletpass.js +485 -660
  154. package/lib/modules/Product/index.js +51 -46
  155. package/lib/modules/Product/types.js +4 -16
  156. package/lib/modules/Product/utils.js +32 -33
  157. package/lib/modules/ProductList/index.js +113 -123
  158. package/lib/modules/ProductList/types.js +9 -31
  159. package/lib/modules/Quotation/index.d.ts +6 -0
  160. package/lib/modules/Quotation/index.js +110 -103
  161. package/lib/modules/Quotation/types.js +4 -16
  162. package/lib/modules/Resource/index.js +27 -59
  163. package/lib/modules/Resource/types.js +22 -32
  164. package/lib/modules/Resource/utils.js +30 -38
  165. package/lib/modules/ResourcePlanner/index.js +25 -23
  166. package/lib/modules/ResourcePlanner/localClock.js +54 -119
  167. package/lib/modules/ResourcePlanner/planner.js +589 -770
  168. package/lib/modules/ResourcePlanner/types.js +10 -29
  169. package/lib/modules/Rules/index.js +1218 -959
  170. package/lib/modules/Rules/types.js +17 -40
  171. package/lib/modules/SalesSummary/index.js +85 -90
  172. package/lib/modules/SalesSummary/types.js +4 -16
  173. package/lib/modules/SalesSummary/utils.js +355 -430
  174. package/lib/modules/ScanOrderLogger/index.js +59 -79
  175. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  176. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  177. package/lib/modules/ScanOrderLogger/types.js +4 -16
  178. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
  179. package/lib/modules/Schedule/index.js +100 -114
  180. package/lib/modules/Schedule/type.js +4 -16
  181. package/lib/modules/Schedule/types.js +4 -16
  182. package/lib/modules/Schedule/utils.js +433 -291
  183. package/lib/modules/Step/index.js +40 -52
  184. package/lib/modules/Step/tyeps.js +4 -16
  185. package/lib/modules/Summary/index.js +66 -71
  186. package/lib/modules/Summary/types.js +4 -16
  187. package/lib/modules/Summary/utils.js +773 -418
  188. package/lib/modules/SurchargeList/index.js +46 -60
  189. package/lib/modules/SurchargeList/types.js +4 -16
  190. package/lib/modules/index.js +245 -63
  191. package/lib/plugins/app.js +4 -16
  192. package/lib/plugins/index.js +36 -25
  193. package/lib/plugins/request.d.ts +1 -0
  194. package/lib/plugins/request.js +137 -126
  195. package/lib/plugins/shopStore.js +4 -16
  196. package/lib/plugins/user.js +4 -16
  197. package/lib/plugins/window.js +171 -179
  198. package/lib/server/index.d.ts +8 -2
  199. package/lib/server/index.js +3083 -2663
  200. package/lib/server/modules/floor-plan/index.d.ts +4 -0
  201. package/lib/server/modules/floor-plan/index.js +159 -127
  202. package/lib/server/modules/floor-plan/types.js +15 -30
  203. package/lib/server/modules/index.js +106 -68
  204. package/lib/server/modules/menu/index.js +170 -124
  205. package/lib/server/modules/menu/types.js +18 -31
  206. package/lib/server/modules/order/index.d.ts +17 -7
  207. package/lib/server/modules/order/index.js +916 -977
  208. package/lib/server/modules/order/types.js +122 -33
  209. package/lib/server/modules/order/utils/filterBookings.js +219 -194
  210. package/lib/server/modules/order/utils/filterOrders.js +118 -92
  211. package/lib/server/modules/payment/index.js +59 -83
  212. package/lib/server/modules/payment/types.js +4 -16
  213. package/lib/server/modules/products/index.d.ts +8 -2
  214. package/lib/server/modules/products/index.js +656 -471
  215. package/lib/server/modules/products/types.js +44 -34
  216. package/lib/server/modules/quotation/index.js +137 -172
  217. package/lib/server/modules/quotation/types.js +21 -31
  218. package/lib/server/modules/resource/index.js +225 -186
  219. package/lib/server/modules/resource/types.js +42 -33
  220. package/lib/server/modules/schedule/index.js +135 -123
  221. package/lib/server/modules/schedule/types.js +14 -21
  222. package/lib/server/modules/schedule/utils.js +334 -163
  223. package/lib/server/types.js +4 -16
  224. package/lib/server/utils/index.js +25 -23
  225. package/lib/server/utils/product.js +196 -139
  226. package/lib/server/utils/schedule.js +34 -41
  227. package/lib/server/utils/small-ticket.js +479 -456
  228. package/lib/server/utils/time.js +40 -49
  229. package/lib/solution/BaseSales/index.js +1186 -1410
  230. package/lib/solution/BaseSales/types.js +42 -38
  231. package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
  232. package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
  233. package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
  234. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
  235. package/lib/solution/BaseSales/utils.js +158 -143
  236. package/lib/solution/BookingByStep/index.d.ts +1 -1
  237. package/lib/solution/BookingByStep/index.js +1527 -1340
  238. package/lib/solution/BookingByStep/types.js +40 -99
  239. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  240. package/lib/solution/BookingByStep/utils/products.js +42 -52
  241. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  242. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  243. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  244. package/lib/solution/BookingTicket/index.js +607 -522
  245. package/lib/solution/BookingTicket/types.js +99 -77
  246. package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
  247. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
  248. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
  249. package/lib/solution/BookingTicket/utils/cartView.js +114 -99
  250. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  251. package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
  252. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
  253. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
  254. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
  255. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
  256. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
  257. package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
  258. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  259. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
  260. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
  261. package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
  262. package/lib/solution/BuyTickets/index.js +67 -70
  263. package/lib/solution/BuyTickets/types.js +22 -38
  264. package/lib/solution/Checkout/index.js +1451 -1158
  265. package/lib/solution/Checkout/types.js +91 -61
  266. package/lib/solution/Checkout/utils/index.js +228 -156
  267. package/lib/solution/PlaceOrder/index.js +55 -0
  268. package/lib/solution/RegisterAndLogin/config.js +493 -460
  269. package/lib/solution/RegisterAndLogin/index.js +633 -630
  270. package/lib/solution/RegisterAndLogin/types.js +189 -76
  271. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  272. package/lib/solution/Sales/index.js +328 -324
  273. package/lib/solution/Sales/types.js +27 -33
  274. package/lib/solution/ScanOrder/index.js +832 -864
  275. package/lib/solution/ScanOrder/types.js +33 -34
  276. package/lib/solution/ScanOrder/utils.js +409 -374
  277. package/lib/solution/ShopDiscount/index.js +226 -232
  278. package/lib/solution/ShopDiscount/types.js +15 -37
  279. package/lib/solution/ShopDiscount/utils.js +300 -172
  280. package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
  281. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
  282. package/lib/solution/UnifiedBookingSales/types.js +10 -32
  283. package/lib/solution/VenueBooking/index.js +811 -879
  284. package/lib/solution/VenueBooking/types.js +19 -39
  285. package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
  286. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  287. package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
  288. package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
  289. package/lib/solution/VenueBooking/utils.js +130 -67
  290. package/lib/solution/index.js +124 -41
  291. package/lib/store/createStore.js +32 -29
  292. package/lib/types/index.js +4 -16
  293. package/lib/utils/payment-number.js +26 -46
  294. package/lib/utils/task.js +36 -36
  295. package/lib/utils/watch.js +81 -47
  296. package/package.json +2 -1
@@ -1,129 +1,130 @@
1
- var __defProp = Object.defineProperty;
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
- // src/server/modules/menu/index.ts
20
- var menu_exports = {};
21
- __export(menu_exports, {
22
- MenuModule: () => MenuModule
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
23
5
  });
24
- module.exports = __toCommonJS(menu_exports);
25
- var import_lodash_es = require("lodash-es");
26
- var import_BaseModule = require("../../../modules/BaseModule");
27
- var import_types = require("./types");
28
- var INDEXDB_STORE_NAME = "menu";
29
- var MenuModule = class extends import_BaseModule.BaseModule {
30
- // LoggerManager 实例
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 == null ? void 0 : options.store;
40
- this.request = core.getPlugin("request");
31
+ this.store = options?.store;
32
+
33
+ // 获取依赖的插件
34
+ this.request = core.getPlugin('request');
41
35
  if (!this.request) {
42
- throw new Error("MenuModule 需要 request 插件支持");
36
+ throw new Error('MenuModule 需要 request 插件支持');
43
37
  }
44
- if (Array.isArray((_a = options == null ? void 0 : options.initialState) == null ? void 0 : _a.menuList)) {
45
- this.store.menuList = options == null ? void 0 : options.initialState.menuList;
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(import_types.MenuHooks.onMenuChanged, this.store.menuList);
42
+ this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
48
43
  } else {
49
44
  this.store.menuList = [];
50
- this.store.map = /* @__PURE__ */ new Map();
45
+ this.store.map = new Map();
51
46
  }
52
- const appPlugin = core.getPlugin("app");
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.log("[Menu] IndexDB Manager 已初始化");
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
- var _a;
74
- this.logInfo("开始从服务器加载餐牌列表");
69
+ this.logInfo('开始从服务器加载餐牌列表');
75
70
  const startTime = Date.now();
76
71
  try {
77
- const response = await this.request.get(
78
- `/form/data/v1`,
79
- {
80
- skip: 1,
81
- num: 999,
82
- code: "menu_list"
83
- },
84
- { cache: void 0 }
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("[Menu] 加载餐牌数据失败:", 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(import_types.MenuHooks.onMenuLoaded, menuList);
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("getMenuByIds: 未提供有效的 ids", { idsCount: 0 });
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("getMenuByIds: 查询完成", {
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,151 +152,193 @@ 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 = void 0;
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
- console.log("[Menu] IndexDB 缓存已清空");
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("[Menu] 清空 IndexDB 缓存失败:", error);
173
- this.logError("清空 IndexDB 缓存失败", { error: errorMessage });
175
+ console.error('[Menu] 清空 IndexDB 缓存失败:', error);
176
+ this.logError('清空 IndexDB 缓存失败', {
177
+ error: errorMessage
178
+ });
174
179
  }
175
180
  }
176
- console.log("[Menu] 缓存已清空");
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("loadMenuFromIndexDB: dbManager 不可用");
190
+ this.logWarning('loadMenuFromIndexDB: dbManager 不可用');
186
191
  return [];
187
192
  }
193
+ const startedAt = performance.now();
188
194
  try {
195
+ // 直接获取所有餐牌记录
189
196
  const menuList = await this.dbManager.getAll(INDEXDB_STORE_NAME);
190
- this.logInfo("从 IndexDB 加载餐牌数据", {
191
- menuCount: (menuList == null ? void 0 : menuList.length) ?? 0
197
+ this.logInfo('从 IndexDB 加载餐牌数据', {
198
+ menuCount: menuList?.length ?? 0,
199
+ durationMs: +(performance.now() - startedAt).toFixed(2)
192
200
  });
193
201
  return menuList || [];
194
202
  } catch (error) {
195
203
  const errorMessage = error instanceof Error ? error.message : String(error);
196
- console.error("[Menu] 从 IndexDB 读取数据失败:", error);
197
- this.logError("从 IndexDB 读取数据失败", { error: errorMessage });
204
+ console.error('[Menu] 从 IndexDB 读取数据失败:', error);
205
+ this.logError('从 IndexDB 读取数据失败', {
206
+ durationMs: +(performance.now() - startedAt).toFixed(2),
207
+ error: errorMessage
208
+ });
198
209
  return [];
199
210
  }
200
211
  }
212
+
201
213
  /**
202
214
  * 保存餐牌数据到 IndexDB
203
215
  * @private
204
216
  */
205
217
  async saveMenuToIndexDB(menuList) {
206
218
  if (!this.dbManager) {
207
- this.logWarning("saveMenuToIndexDB: dbManager 不可用");
219
+ this.logWarning('saveMenuToIndexDB: dbManager 不可用');
208
220
  return;
209
221
  }
210
- this.logInfo("开始保存餐牌数据到 IndexDB", { menuCount: menuList.length });
222
+ const startedAt = performance.now();
223
+ let clearDurationMs = 0;
224
+ let writeDurationMs = 0;
225
+ this.logInfo('开始保存餐牌数据到 IndexDB', {
226
+ menuCount: menuList.length
227
+ });
211
228
  try {
212
- await this.dbManager.clear(INDEXDB_STORE_NAME);
213
- const savePromises = menuList.map(
214
- (menu) => this.dbManager.add(INDEXDB_STORE_NAME, menu)
215
- );
216
- await Promise.all(savePromises);
217
- console.log(`[Menu] 已将 ${menuList.length} 条餐牌数据保存到 IndexDB`);
218
- this.logInfo("餐牌数据已保存到 IndexDB", { menuCount: menuList.length });
229
+ // 先清空现有的餐牌数据
230
+ const clearStartedAt = performance.now();
231
+ try {
232
+ await this.dbManager.clear(INDEXDB_STORE_NAME);
233
+ } finally {
234
+ clearDurationMs = +(performance.now() - clearStartedAt).toFixed(2);
235
+ }
236
+
237
+ // 逐个保存餐牌(每个餐牌是独立的记录)
238
+ const writeStartedAt = performance.now();
239
+ const savePromises = menuList.map(menu => this.dbManager.add(INDEXDB_STORE_NAME, menu));
240
+ try {
241
+ await Promise.all(savePromises);
242
+ } finally {
243
+ writeDurationMs = +(performance.now() - writeStartedAt).toFixed(2);
244
+ }
245
+ this.logInfo('餐牌数据已保存到 IndexDB', {
246
+ menuCount: menuList.length,
247
+ clearDurationMs,
248
+ writeDurationMs,
249
+ totalDurationMs: +(performance.now() - startedAt).toFixed(2)
250
+ });
219
251
  } catch (error) {
220
252
  const errorMessage = error instanceof Error ? error.message : String(error);
221
- console.error("[Menu] 保存数据到 IndexDB 失败:", error);
222
- this.logError("保存数据到 IndexDB 失败", {
253
+ console.error('[Menu] 保存数据到 IndexDB 失败:', error);
254
+ this.logError('保存数据到 IndexDB 失败', {
223
255
  menuCount: menuList.length,
256
+ clearDurationMs,
257
+ writeDurationMs,
258
+ totalDurationMs: +(performance.now() - startedAt).toFixed(2),
224
259
  error: errorMessage
225
260
  });
226
261
  }
227
262
  }
263
+
228
264
  /**
229
265
  * 预加载模块数据(统一接口)
230
266
  * 在模块注册后自动调用
231
267
  */
232
268
  async preload() {
233
- console.log("[Menu] 开始预加载数据...");
234
269
  const startTime = Date.now();
235
- this.logInfo("开始预加载数据");
270
+ this.logInfo('开始预加载数据');
236
271
  try {
272
+ // 1. 尝试从 IndexDB 加载数据
237
273
  const cachedData = await this.loadMenuFromIndexDB();
238
274
  if (cachedData && cachedData.length > 0) {
239
- console.log(`[Menu] IndexDB 加载了 ${cachedData.length} 条餐牌数据`);
240
- this.store.menuList = (0, import_lodash_es.cloneDeep)(cachedData);
275
+ // 将缓存数据放入 store
276
+ this.store.menuList = (0, _lodashEs.cloneDeep)(cachedData);
277
+ // 同步更新 Map 缓存
241
278
  this.syncMenuMap();
242
- this.core.effects.emit(import_types.MenuHooks.onMenuChanged, this.store.menuList);
279
+ this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
243
280
  const duration = Date.now() - startTime;
244
- this.logInfo("预加载完成(从 IndexDB)", {
281
+ this.logInfo('预加载完成(从 IndexDB)', {
245
282
  menuCount: cachedData.length,
246
283
  duration: `${duration}ms`,
247
- source: "IndexDB"
284
+ source: 'IndexDB'
248
285
  });
249
286
  return;
250
287
  }
251
- console.log("[Menu] IndexDB 中没有缓存数据,从服务器加载...");
252
- this.logInfo("IndexDB 中没有缓存数据,准备从服务器加载");
288
+ this.logInfo('IndexDB 中没有缓存数据,准备从服务器加载');
253
289
  } catch (error) {
254
290
  const errorMessage = error instanceof Error ? error.message : String(error);
255
- console.warn("[Menu] 从 IndexDB 加载数据失败:", error);
256
- this.logWarning("从 IndexDB 加载数据失败,准备从服务器加载", { error: errorMessage });
291
+ console.warn('[Menu] 从 IndexDB 加载数据失败:', error);
292
+ this.logWarning('从 IndexDB 加载数据失败,准备从服务器加载', {
293
+ error: errorMessage
294
+ });
257
295
  }
296
+
297
+ // 2. 如果 IndexDB 中没有数据,从服务器加载
258
298
  const menuList = await this.loadMenuList();
299
+
300
+ // 3. 将服务器数据保存到 IndexDB 和 store
259
301
  if (menuList && menuList.length > 0) {
260
302
  await this.saveMenuToIndexDB(menuList);
261
- this.store.menuList = (0, import_lodash_es.cloneDeep)(menuList);
303
+ this.store.menuList = (0, _lodashEs.cloneDeep)(menuList);
304
+ // 同步更新 Map 缓存
262
305
  this.syncMenuMap();
263
- this.core.effects.emit(import_types.MenuHooks.onMenuChanged, this.store.menuList);
306
+ this.core.effects.emit(_types.MenuHooks.onMenuChanged, this.store.menuList);
264
307
  const duration = Date.now() - startTime;
265
- this.logInfo("预加载完成(从服务器)", {
308
+ this.logInfo('预加载完成(从服务器)', {
266
309
  menuCount: menuList.length,
267
310
  duration: `${duration}ms`,
268
- source: "Server"
311
+ source: 'Server'
269
312
  });
270
313
  } else {
271
314
  const duration = Date.now() - startTime;
272
- this.logWarning("预加载完成但未获取到数据", {
315
+ this.logWarning('预加载完成但未获取到数据', {
273
316
  duration: `${duration}ms`
274
317
  });
275
318
  }
276
319
  }
320
+
277
321
  /**
278
322
  * 获取模块的路由定义
279
323
  * 返回该模块需要注册的 API 路由
280
324
  */
281
325
  getRoutes() {
282
326
  return [
283
- // GET /api/menu - 获取所有餐牌
284
- {
285
- method: "get",
286
- path: "/api/menu",
287
- handler: async () => {
288
- const menuList = this.getMenuList();
289
- return {
290
- success: true,
291
- data: menuList,
292
- total: menuList.length
293
- };
294
- }
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
+ };
295
338
  }
296
- ];
339
+ }];
297
340
  }
341
+
298
342
  /**
299
343
  * 记录信息日志
300
344
  * @param title 日志标题
@@ -304,14 +348,16 @@ var MenuModule = class extends import_BaseModule.BaseModule {
304
348
  try {
305
349
  if (this.logger) {
306
350
  this.logger.addLog({
307
- type: "info",
351
+ type: 'info',
308
352
  title: `[MenuModule] ${title}`,
309
353
  metadata: metadata || {}
310
354
  });
311
355
  }
312
356
  } catch {
357
+ // 日志记录失败不影响主流程
313
358
  }
314
359
  }
360
+
315
361
  /**
316
362
  * 记录警告日志
317
363
  * @param title 日志标题
@@ -321,14 +367,16 @@ var MenuModule = class extends import_BaseModule.BaseModule {
321
367
  try {
322
368
  if (this.logger) {
323
369
  this.logger.addLog({
324
- type: "warning",
370
+ type: 'warning',
325
371
  title: `[MenuModule] ${title}`,
326
372
  metadata: metadata || {}
327
373
  });
328
374
  }
329
375
  } catch {
376
+ // 日志记录失败不影响主流程
330
377
  }
331
378
  }
379
+
332
380
  /**
333
381
  * 记录错误日志
334
382
  * @param title 日志标题
@@ -338,16 +386,14 @@ var MenuModule = class extends import_BaseModule.BaseModule {
338
386
  try {
339
387
  if (this.logger) {
340
388
  this.logger.addLog({
341
- type: "error",
389
+ type: 'error',
342
390
  title: `[MenuModule] ${title}`,
343
391
  metadata: metadata || {}
344
392
  });
345
393
  }
346
394
  } catch {
395
+ // 日志记录失败不影响主流程
347
396
  }
348
397
  }
349
- };
350
- // Annotate the CommonJS export names for ESM import in node:
351
- 0 && (module.exports = {
352
- MenuModule
353
- });
398
+ }
399
+ exports.MenuModule = MenuModule;
@@ -1,33 +1,20 @@
1
- var __defProp = Object.defineProperty;
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
- // src/server/modules/menu/types.ts
20
- var types_exports = {};
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
+ }({});
@@ -119,14 +119,23 @@ export declare class OrderModule extends BaseModule implements Module {
119
119
  payment: Record<string, any>;
120
120
  previousPayment: Record<string, any>;
121
121
  } | null>;
122
- loadOrdersByServer(): Promise<OrderData[]>;
122
+ loadOrdersByServer(options?: {
123
+ trigger?: string;
124
+ }): Promise<OrderData[]>;
123
125
  /**
124
126
  * 静默全量刷新:后台重新拉取全量 SSE 订单数据并更新本地
125
127
  * 拿到完整数据后一次性替换 store,触发订单变更与同步完成事件
126
128
  * @returns 刷新后的订单列表
127
129
  */
128
- silentRefresh(): Promise<OrderData[]>;
130
+ silentRefresh(options?: {
131
+ trigger?: string;
132
+ }): Promise<OrderData[]>;
129
133
  private normalizeOrderForMemoryList;
134
+ /**
135
+ * 将已经完成集合规范化的订单转换为内存身份,不重复扫描 products/bookings/payments。
136
+ */
137
+ private prepareNormalizedOrderForMemoryList;
138
+ private prepareNormalizedOrdersForMemoryList;
130
139
  private normalizeOrdersForMemoryList;
131
140
  private hasRealOrderId;
132
141
  private shouldKeepOrderInMemory;
@@ -291,13 +300,14 @@ export declare class OrderModule extends BaseModule implements Module {
291
300
  private logDuplicateOrders;
292
301
  private compactOrderListByIdentity;
293
302
  /**
294
- * 当前订单拉取窗口:
295
- * - 优先使用 createdAtQuery.sales_time_between(已按营业日边界初始化)
296
- * - 无法解析时退化为自然日窗口
303
+ * 当前订单缓存可复用窗口。
304
+ * start_time 模式使用精确的营业日起止时间;配置缺失或异常时退化为自然日。
297
305
  */
298
- private getCurrentPullWindow;
306
+ private getCurrentOrderCacheWindow;
299
307
  private hasPulledOrdersToday;
300
308
  private markOrderPulledAtNow;
309
+ private clearOrderSnapshotMarker;
310
+ private getCurrentShopId;
301
311
  private getStorageItem;
302
312
  private setStorageItem;
303
313
  private loadOrdersFromSQLite;
@@ -335,7 +345,7 @@ export declare class OrderModule extends BaseModule implements Module {
335
345
  * 用于 SSE 全量拉取与营业日窗口裁剪。
336
346
  *
337
347
  * @example
338
- * await this.replaceOrdersSnapshotInSQLite(orderList)
348
+ * const { orders, persisted } = await this.replaceOrdersSnapshotInSQLite(orderList, 'refresh')
339
349
  */
340
350
  private replaceOrdersSnapshotInSQLite;
341
351
  /**