@pisell/pisellos 2.3.69 → 2.3.71

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 (44) hide show
  1. package/dist/core/index.d.ts +0 -7
  2. package/dist/core/index.js +65 -109
  3. package/dist/modules/Order/index.d.ts +1 -1
  4. package/dist/modules/Order/types.d.ts +2 -0
  5. package/dist/modules/Order/types.js +1 -0
  6. package/dist/modules/Quotation/index.d.ts +0 -6
  7. package/dist/modules/Quotation/index.js +19 -75
  8. package/dist/plugins/request.d.ts +0 -1
  9. package/dist/server/index.d.ts +2 -8
  10. package/dist/server/index.js +140 -206
  11. package/dist/server/modules/floor-plan/index.d.ts +0 -4
  12. package/dist/server/modules/floor-plan/index.js +98 -240
  13. package/dist/server/modules/menu/index.js +23 -48
  14. package/dist/server/modules/order/index.d.ts +7 -17
  15. package/dist/server/modules/order/index.js +207 -419
  16. package/dist/server/modules/products/index.d.ts +2 -8
  17. package/dist/server/modules/products/index.js +75 -167
  18. package/dist/server/modules/resource/index.js +13 -21
  19. package/dist/solution/BaseSales/index.js +15 -4
  20. package/dist/solution/BookingByStep/index.d.ts +1 -1
  21. package/dist/solution/BookingTicket/index.d.ts +5 -15
  22. package/dist/solution/BookingTicket/index.js +21 -6
  23. package/lib/core/index.d.ts +0 -7
  24. package/lib/core/index.js +2 -20
  25. package/lib/modules/Order/index.d.ts +1 -1
  26. package/lib/modules/Order/types.d.ts +2 -0
  27. package/lib/modules/Quotation/index.d.ts +0 -6
  28. package/lib/modules/Quotation/index.js +5 -49
  29. package/lib/plugins/request.d.ts +0 -1
  30. package/lib/server/index.d.ts +2 -8
  31. package/lib/server/index.js +17 -52
  32. package/lib/server/modules/floor-plan/index.d.ts +0 -4
  33. package/lib/server/modules/floor-plan/index.js +6 -54
  34. package/lib/server/modules/menu/index.js +5 -31
  35. package/lib/server/modules/order/index.d.ts +7 -17
  36. package/lib/server/modules/order/index.js +40 -197
  37. package/lib/server/modules/products/index.d.ts +2 -8
  38. package/lib/server/modules/products/index.js +24 -97
  39. package/lib/server/modules/resource/index.js +2 -7
  40. package/lib/solution/BaseSales/index.js +4 -4
  41. package/lib/solution/BookingByStep/index.d.ts +1 -1
  42. package/lib/solution/BookingTicket/index.d.ts +5 -15
  43. package/lib/solution/BookingTicket/index.js +15 -5
  44. package/package.json +1 -1
@@ -41,7 +41,7 @@ import { handleGlobalScan, handleCustomerScan, handleUniversalScan } from "./uti
41
41
  import scanCache from "./utils/scan/scanCache";
42
42
  import { formatGlobalScanResult } from "./utils/scan/formatGlobalScan";
43
43
  import { applyGlobalScan } from "./utils/scan/applyGlobalScan";
44
- import { buildCartView } from "./utils/cartView";
44
+ import { buildCartView, isWalkInCustomer } from "./utils/cartView";
45
45
  import { buildCacheItemFromCartDetail, buildCacheItemFromDetail, buildRequiresDetailPayload as _buildRequiresDetailPayload, decideAddProduct as decideAddProductUtil, decideAfterDetail as decideAfterDetailUtil, decideAutoClose as decideAutoCloseUtil, getIsEject as getIsEjectUtil, getIsOnlySession as getIsOnlySessionUtil, transformDetailToProductAndBooking as transformDetailToProductAndBookingUtil } from "./utils/addProductDecision";
46
46
  import { buildCacheItemFromOrderLine as buildCacheItemFromOrderLineUtil } from "../../modules/BookingContext/utils/buildCacheItemFromOrderLine";
47
47
  import { buildSessionCatalogStaleInfo, isSessionCatalogDateStale } from "./utils/sessionCatalogStale";
@@ -542,7 +542,12 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
542
542
  country_calling_code: selectedCustomer === null || selectedCustomer === void 0 ? void 0 : selectedCustomer.country_calling_code
543
543
  });
544
544
  customerModule.setSelectedCustomer(customer);
545
- this.setOrderCustomer(customer);
545
+ // 详情 hydrate 后仍需广播一次,让 CustomerContext 等 UI 订阅方拿到刚补齐的
546
+ // customerSnapshot;但它不是用户主动切换客户。通过 source 明确标记初始化事件,
547
+ // 商品报价/折扣订阅方即可跳过 prepare/config,其他旧订阅方仍可照常刷新 UI。
548
+ this.setOrderCustomer(customer, {
549
+ source: 'detailHydrate'
550
+ });
546
551
  // await this.store.order.saveDraft();
547
552
  }
548
553
  return _context6.abrupt("return", sales);
@@ -678,7 +683,13 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
678
683
  try {
679
684
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
680
685
  var item = _step.value;
681
- var topLevelId = Number(item.customer_id);
686
+ var rawCustomerId = item.customer_id;
687
+ if (!rawCustomerId || isWalkInCustomer({
688
+ id: rawCustomerId
689
+ })) {
690
+ continue;
691
+ }
692
+ var topLevelId = Number(rawCustomerId);
682
693
  if (Number.isFinite(topLevelId) && topLevelId > 0) {
683
694
  return topLevelId;
684
695
  }
@@ -1558,7 +1569,7 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
1558
1569
  */
1559
1570
  }, {
1560
1571
  key: "setOrderCustomer",
1561
- value: function setOrderCustomer(customer) {
1572
+ value: function setOrderCustomer(customer, options) {
1562
1573
  var _this$store$order$get3,
1563
1574
  _this3 = this;
1564
1575
  if (!customer) {
@@ -1581,12 +1592,16 @@ export var BookingTicketImpl = /*#__PURE__*/function (_BaseSalesImpl) {
1581
1592
  var snapshotReplenished = !snapshotBeforeSet && Boolean(snapshotAfterOrderSet);
1582
1593
  if (snapshotReplenished) {
1583
1594
  var _next2 = this.buildOrderCustomerPayload();
1584
- this.core.effects.emit("".concat(this.name, ":onOrderCustomerChange"), _next2);
1595
+ this.core.effects.emit("".concat(this.name, ":onOrderCustomerChange"), _next2 && options !== null && options !== void 0 && options.source ? _objectSpread(_objectSpread({}, _next2), {}, {
1596
+ source: options.source
1597
+ }) : _next2);
1585
1598
  }
1586
1599
  return;
1587
1600
  }
1588
1601
  var next = this.buildOrderCustomerPayload();
1589
- this.core.effects.emit("".concat(this.name, ":onOrderCustomerChange"), next);
1602
+ this.core.effects.emit("".concat(this.name, ":onOrderCustomerChange"), next && options !== null && options !== void 0 && options.source ? _objectSpread(_objectSpread({}, next), {}, {
1603
+ source: options.source
1604
+ }) : next);
1590
1605
  this.refreshDiscountConfigAfterOrderCustomerChange(patch.customer_id);
1591
1606
  // 客户切换可能改变可用促销/赠品;触发一次重算(recursion-safe)。
1592
1607
  var promotionRefreshTask = this.store.order.applyPromotion().then(function () {
@@ -12,15 +12,8 @@ declare class PisellOSCore implements PisellCore {
12
12
  context: BusinessContext;
13
13
  server: any;
14
14
  serverOptions?: ServerOptions;
15
- private serverModulePromise?;
16
15
  constructor(options?: PisellOSOptions);
17
16
  private initialize;
18
- /**
19
- * 仅预加载 Server 模块代码,不创建实例、不注册模块、不请求业务数据。
20
- * 导入失败会清空 Promise,正式 initializeServer 时仍可重新尝试。
21
- */
22
- preloadServerModule(): Promise<void>;
23
- private loadServerModule;
24
17
  /**
25
18
  * 初始化 Server(公开方法,需要外部显式调用并等待)
26
19
  * Server 配置从构造函数传入的 options.server 中获取
package/lib/core/index.js CHANGED
@@ -36,6 +36,7 @@ module.exports = __toCommonJS(core_exports);
36
36
  var import_createStore = require("../store/createStore");
37
37
  var import_effects = require("../effects");
38
38
  var PisellOSCore = class {
39
+ // 保存 Server 配置
39
40
  constructor(options) {
40
41
  this.plugins = /* @__PURE__ */ new Map();
41
42
  this.modules = /* @__PURE__ */ new Map();
@@ -49,7 +50,6 @@ var PisellOSCore = class {
49
50
  this.serverOptions = options.server;
50
51
  }
51
52
  this.initialize(options);
52
- console.log("constructor123456");
53
53
  }
54
54
  initialize(options) {
55
55
  if (options == null ? void 0 : options.plugins) {
@@ -64,24 +64,6 @@ var PisellOSCore = class {
64
64
  }
65
65
  this.log("[PisellOS] 核心初始化完成");
66
66
  }
67
- /**
68
- * 仅预加载 Server 模块代码,不创建实例、不注册模块、不请求业务数据。
69
- * 导入失败会清空 Promise,正式 initializeServer 时仍可重新尝试。
70
- */
71
- async preloadServerModule() {
72
- if (this.server || !this.serverOptions)
73
- return;
74
- await this.loadServerModule();
75
- }
76
- loadServerModule() {
77
- if (!this.serverModulePromise) {
78
- this.serverModulePromise = import("../server").catch((error) => {
79
- this.serverModulePromise = void 0;
80
- throw error;
81
- });
82
- }
83
- return this.serverModulePromise;
84
- }
85
67
  /**
86
68
  * 初始化 Server(公开方法,需要外部显式调用并等待)
87
69
  * Server 配置从构造函数传入的 options.server 中获取
@@ -96,7 +78,7 @@ var PisellOSCore = class {
96
78
  return;
97
79
  }
98
80
  try {
99
- const ServerModule = await this.loadServerModule();
81
+ const ServerModule = await import("../server");
100
82
  const Server = ServerModule.default;
101
83
  this.server = new Server(this);
102
84
  this.log("Server 实例已创建");
@@ -512,7 +512,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
512
512
  generateIdempotencyToken(): string;
513
513
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
514
514
  createOrder(params: CommitOrderParams['query']): {
515
- type: "appointment_booking" | "virtual";
515
+ type: "virtual" | "appointment_booking";
516
516
  platform: string;
517
517
  sales_channel: string;
518
518
  order_sales_channel: string;
@@ -157,11 +157,13 @@ export interface OrderCustomerPatch {
157
157
  * 下单客户变更事件 payload。
158
158
  * - `patch`:tempOrder 上的协议字段视图(会随订单提交)
159
159
  * - `snapshot`:UI 富字段快照(仅本地,不随订单提交)
160
+ * - `source`:缺省表示真实业务变更;`detailHydrate` 仅表示打开详情时快照已就绪
160
161
  * 清空时整个 payload 为 null。
161
162
  */
162
163
  export interface OrderCustomerChangePayload {
163
164
  patch: OrderCustomerView;
164
165
  snapshot: ICustomer | null;
166
+ source?: 'detailHydrate';
165
167
  }
166
168
  export interface OrderScanCodeResult {
167
169
  isAvailable: boolean;
@@ -9,8 +9,6 @@ export declare class QuotationModule extends BaseModule implements Module {
9
9
  private request;
10
10
  private store;
11
11
  private scheduleResolver?;
12
- private app;
13
- private quotationListUpdatedListener?;
14
12
  constructor(name?: string, version?: string);
15
13
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
16
14
  loadQuotations(params?: {
@@ -18,7 +16,6 @@ export declare class QuotationModule extends BaseModule implements Module {
18
16
  customer_id?: number | string;
19
17
  }): Promise<void>;
20
18
  getQuotationList(): QuotationItem[];
21
- setQuotationListUpdatedListener(listener?: () => void): void;
22
19
  getQuotationCustomerScopeInfo(): QuotationCustomerScopeInfo;
23
20
  /**
24
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
@@ -63,9 +60,6 @@ export declare class QuotationModule extends BaseModule implements Module {
63
60
  customer_id?: number | string;
64
61
  }): Map<string, string | null>;
65
62
  setScheduleResolver(resolver: (id: number) => ScheduleItem | undefined): void;
66
- private applyQuotationResponse;
67
- private notifyQuotationListUpdated;
68
- private getQuotationCacheKeyData;
69
63
  private isQuotationVisibleForCustomer;
70
64
  private hasValidCustomerId;
71
65
  private normalizeCustomerId;
@@ -32,49 +32,32 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
32
32
  this.store = { list: [] };
33
33
  }
34
34
  async initialize(core, options) {
35
- var _a, _b;
36
35
  this.core = core;
37
36
  this.request = core.getPlugin("request");
38
37
  if (!this.request)
39
38
  throw new Error("QuotationModule 需要 request 插件支持");
40
- this.app = (_b = (_a = core.getPlugin("app")) == null ? void 0 : _a.getApp) == null ? void 0 : _b.call(_a);
41
39
  this.store = { list: [] };
42
40
  }
43
41
  async loadQuotations(params) {
42
+ var _a;
44
43
  const query = {};
45
44
  if (params == null ? void 0 : params.channel)
46
45
  query.channel = params.channel;
47
46
  if ((params == null ? void 0 : params.channel) === "online_store") {
48
47
  query.channel = "online-store";
49
48
  }
50
- let initialResultApplied = false;
51
- const applyRemoteUpdate = (response) => {
52
- this.applyQuotationResponse(response);
53
- if (initialResultApplied) {
54
- this.notifyQuotationListUpdated();
55
- }
56
- };
57
49
  const res = await this.request.get(
58
50
  "/quotation/available",
59
51
  query,
60
- {
61
- cache: {
62
- type: "indexDB",
63
- updateCache: true,
64
- cacheKeyData: this.getQuotationCacheKeyData(query)
65
- },
66
- cacheUpdateChange: applyRemoteUpdate
67
- }
52
+ { useCache: false, osServer: true }
68
53
  );
69
- this.applyQuotationResponse(res);
70
- initialResultApplied = true;
54
+ const list = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.list) || (res == null ? void 0 : res.list) || [];
55
+ list.sort((a, b) => b.sort - a.sort);
56
+ this.store.list = list;
71
57
  }
72
58
  getQuotationList() {
73
59
  return this.store.list;
74
60
  }
75
- setQuotationListUpdatedListener(listener) {
76
- this.quotationListUpdatedListener = listener;
77
- }
78
61
  getQuotationCustomerScopeInfo() {
79
62
  const customerById = /* @__PURE__ */ new Map();
80
63
  const quotationScopes = this.store.list.filter((quotation) => Array.isArray(quotation.customer) && quotation.customer.length > 0).map((quotation) => {
@@ -173,33 +156,6 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
173
156
  setScheduleResolver(resolver) {
174
157
  this.scheduleResolver = resolver;
175
158
  }
176
- applyQuotationResponse(response) {
177
- var _a;
178
- const source = ((_a = response == null ? void 0 : response.data) == null ? void 0 : _a.list) || (response == null ? void 0 : response.list) || [];
179
- this.store.list = [...source].sort((a, b) => Number(b.sort || 0) - Number(a.sort || 0));
180
- }
181
- notifyQuotationListUpdated() {
182
- var _a;
183
- try {
184
- (_a = this.quotationListUpdatedListener) == null ? void 0 : _a.call(this);
185
- } catch (error) {
186
- console.warn("[QuotationModule] 报价单后台更新回调失败", error);
187
- }
188
- }
189
- getQuotationCacheKeyData(query) {
190
- var _a, _b, _c;
191
- let shopId = "";
192
- try {
193
- const storedCore = (_c = (_b = (_a = this.app) == null ? void 0 : _a.storage) == null ? void 0 : _b.getStorage) == null ? void 0 : _c.call(_b, "core");
194
- const coreInfo = typeof storedCore === "string" ? JSON.parse(storedCore || "{}") : storedCore || {};
195
- shopId = String((coreInfo == null ? void 0 : coreInfo.id) || "");
196
- } catch {
197
- }
198
- return {
199
- ...query,
200
- shop_id: shopId
201
- };
202
- }
203
159
  isQuotationVisibleForCustomer(quotation, customerId) {
204
160
  const customers = quotation.customer || [];
205
161
  if (customers.length === 0)
@@ -68,7 +68,6 @@ export interface RequestOptions {
68
68
  useCache?: boolean;
69
69
  customToast?: () => void;
70
70
  cache?: CacheProps;
71
- cacheUpdateChange?: (data: any) => void;
72
71
  osServer?: boolean;
73
72
  prefix?: boolean;
74
73
  callback?: (res: any) => void;
@@ -51,8 +51,6 @@ declare class Server {
51
51
  private productQueryScheduleTimers;
52
52
  /** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
53
53
  private menuScheduleRefreshInFlight;
54
- /** 启动阶段模块预加载任务;预渲染商品查询复用该任务,避免缓存尚未 ready 时误触发远端自愈。 */
55
- private startupModulePreloadInFlight;
56
54
  private lastMenuScheduleRefreshAt;
57
55
  private readonly MENU_SCHEDULE_REFRESH_COOLDOWN_MS;
58
56
  private orderQuerySubscribers;
@@ -159,17 +157,13 @@ declare class Server {
159
157
  * 重新拉取全量 SSE 接口,更新本地数据后触发 onProductsSyncCompleted
160
158
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
161
159
  */
162
- refreshProductsInBackground(options?: {
163
- trigger?: string;
164
- }): Promise<void>;
160
+ refreshProductsInBackground(): Promise<void>;
165
161
  /**
166
162
  * 后台静默刷新订单数据
167
163
  * 重新拉取全量 SSE 接口,更新本地数据后触发 onOrdersSyncCompleted
168
164
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
169
165
  */
170
- refreshOrdersInBackground(options?: {
171
- trigger?: string;
172
- }): Promise<void>;
166
+ refreshOrdersInBackground(): Promise<void>;
173
167
  /**
174
168
  * 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
175
169
  * 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
@@ -86,8 +86,6 @@ var Server = class {
86
86
  this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
87
87
  /** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
88
88
  this.menuScheduleRefreshInFlight = null;
89
- /** 启动阶段模块预加载任务;预渲染商品查询复用该任务,避免缓存尚未 ready 时误触发远端自愈。 */
90
- this.startupModulePreloadInFlight = null;
91
89
  this.lastMenuScheduleRefreshAt = 0;
92
90
  this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS = 30 * 1e3;
93
91
  // ---- 订单 / 预约列表查询订阅者 ----
@@ -1385,15 +1383,7 @@ var Server = class {
1385
1383
  this.registerDeviceTaskActions();
1386
1384
  const registeredModules = await this.registerModules(moduleConfigs);
1387
1385
  if (autoPreload) {
1388
- const preloadTask = this.preloadModulesData(registeredModules, options);
1389
- this.startupModulePreloadInFlight = preloadTask;
1390
- try {
1391
- await preloadTask;
1392
- } finally {
1393
- if (this.startupModulePreloadInFlight === preloadTask) {
1394
- this.startupModulePreloadInFlight = null;
1395
- }
1396
- }
1386
+ await this.preloadModulesData(registeredModules, options);
1397
1387
  } else {
1398
1388
  this.logInfo("跳过自动预加载", { autoPreload });
1399
1389
  }
@@ -1698,22 +1688,11 @@ var Server = class {
1698
1688
  return;
1699
1689
  }
1700
1690
  try {
1691
+ await this.schedule.loadAllSchedule();
1701
1692
  this.products.clearPriceCache();
1702
1693
  await this.products.setupQuotationPriceBridge({
1703
1694
  scheduleModule: this.schedule,
1704
- channel: (_a = this.core.context) == null ? void 0 : _a.channel,
1705
- onQuotationUpdated: () => {
1706
- void this.recomputeAndNotifyProductQuery();
1707
- }
1708
- });
1709
- void this.schedule.loadAllSchedule().then(() => {
1710
- var _a2;
1711
- (_a2 = this.products) == null ? void 0 : _a2.clearPriceCache();
1712
- void this.recomputeAndNotifyProductQuery();
1713
- }).catch((error) => {
1714
- this.logWarning("Products 报价单价格桥接后台刷新 Schedule 失败,继续使用本地数据", {
1715
- error: error instanceof Error ? error.message : String(error)
1716
- });
1695
+ channel: (_a = this.core.context) == null ? void 0 : _a.channel
1717
1696
  });
1718
1697
  this.logInfo("Products 报价单价格桥接初始化完成");
1719
1698
  } catch (error) {
@@ -1771,27 +1750,22 @@ var Server = class {
1771
1750
  * 重新拉取全量 SSE 接口,更新本地数据后触发 onProductsSyncCompleted
1772
1751
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
1773
1752
  */
1774
- async refreshProductsInBackground(options = {}) {
1753
+ async refreshProductsInBackground() {
1775
1754
  if (!this.products) {
1776
1755
  this.logWarning("refreshProductsInBackground: Products 模块未注册");
1777
1756
  return;
1778
1757
  }
1779
- const trigger = options.trigger || "background";
1780
- this.logInfo("refreshProductsInBackground 开始", { trigger });
1758
+ this.logInfo("refreshProductsInBackground 开始");
1781
1759
  const startTime = Date.now();
1782
1760
  try {
1783
- await this.products.silentRefresh({ trigger });
1761
+ await this.products.silentRefresh();
1784
1762
  const duration = Date.now() - startTime;
1785
- this.logInfo("refreshProductsInBackground 完成", {
1786
- trigger,
1787
- duration: `${duration}ms`
1788
- });
1763
+ this.logInfo("refreshProductsInBackground 完成", { duration: `${duration}ms` });
1789
1764
  } catch (error) {
1790
1765
  const duration = Date.now() - startTime;
1791
1766
  const errorMessage = error instanceof Error ? error.message : String(error);
1792
1767
  console.error("[Server] refreshProductsInBackground 失败:", error);
1793
1768
  this.logError("refreshProductsInBackground 失败", {
1794
- trigger,
1795
1769
  duration: `${duration}ms`,
1796
1770
  error: errorMessage
1797
1771
  });
@@ -1802,27 +1776,22 @@ var Server = class {
1802
1776
  * 重新拉取全量 SSE 接口,更新本地数据后触发 onOrdersSyncCompleted
1803
1777
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
1804
1778
  */
1805
- async refreshOrdersInBackground(options = {}) {
1779
+ async refreshOrdersInBackground() {
1806
1780
  if (!this.order) {
1807
1781
  this.logWarning("refreshOrdersInBackground: Order 模块未注册");
1808
1782
  return;
1809
1783
  }
1810
- const trigger = options.trigger || "background";
1811
- this.logInfo("refreshOrdersInBackground 开始", { trigger });
1784
+ this.logInfo("refreshOrdersInBackground 开始");
1812
1785
  const startTime = Date.now();
1813
1786
  try {
1814
- await this.order.silentRefresh({ trigger });
1787
+ await this.order.silentRefresh();
1815
1788
  const duration = Date.now() - startTime;
1816
- this.logInfo("refreshOrdersInBackground 完成", {
1817
- trigger,
1818
- duration: `${duration}ms`
1819
- });
1789
+ this.logInfo("refreshOrdersInBackground 完成", { duration: `${duration}ms` });
1820
1790
  } catch (error) {
1821
1791
  const duration = Date.now() - startTime;
1822
1792
  const errorMessage = error instanceof Error ? error.message : String(error);
1823
1793
  console.error("[Server] refreshOrdersInBackground 失败:", error);
1824
1794
  this.logError("refreshOrdersInBackground 失败", {
1825
- trigger,
1826
1795
  duration: `${duration}ms`,
1827
1796
  error: errorMessage
1828
1797
  });
@@ -5109,6 +5078,12 @@ var Server = class {
5109
5078
  const tTotal = performance.now();
5110
5079
  const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, product_id, strategy_context } = context;
5111
5080
  const queryIds = Array.isArray(ids) ? ids.map((id) => Number(id)).filter((id) => Number.isFinite(id)) : [];
5081
+ const formatterContext = this.buildProductFormatterContext({
5082
+ schedule_date,
5083
+ schedule_datetime,
5084
+ customer_id,
5085
+ strategy_context
5086
+ });
5112
5087
  this.logInfo("computeProductQueryResult 开始", {
5113
5088
  menuListIdsCount: (menu_list_ids == null ? void 0 : menu_list_ids.length) ?? 0,
5114
5089
  ids: queryIds,
@@ -5120,16 +5095,6 @@ var Server = class {
5120
5095
  strategyContextKeys: strategy_context ? Object.keys(strategy_context) : [],
5121
5096
  changedIds: options == null ? void 0 : options.changedIds
5122
5097
  });
5123
- const startupPreloadTask = this.startupModulePreloadInFlight;
5124
- if (startupPreloadTask) {
5125
- await startupPreloadTask;
5126
- }
5127
- const formatterContext = this.buildProductFormatterContext({
5128
- schedule_date,
5129
- schedule_datetime,
5130
- customer_id,
5131
- strategy_context
5132
- });
5133
5098
  if (!this.products) {
5134
5099
  this.logError("computeProductQueryResult: Products 模块未注册");
5135
5100
  return { message: "Products 模块未注册", data: this.buildProductQueryResultPayload([], 0) };
@@ -10,7 +10,6 @@ export declare class FloorPlanModule extends BaseModule implements Module {
10
10
  private store;
11
11
  private request;
12
12
  private logger;
13
- private dbManager;
14
13
  private floorPlanDataSource;
15
14
  private pendingSyncMessages;
16
15
  private syncTimer?;
@@ -29,9 +28,6 @@ export declare class FloorPlanModule extends BaseModule implements Module {
29
28
  private mergeItems;
30
29
  private removeByIds;
31
30
  private loadListFromServer;
32
- private loadListFromSQLite;
33
- private saveListToSQLite;
34
- private refreshListFromServer;
35
31
  fetchByIdFromServer(id: number | string): Promise<FloorPlanItem | null>;
36
32
  fetchByCodeFromServer(code: string): Promise<FloorPlanItem | null>;
37
33
  preload(): Promise<void>;
@@ -25,7 +25,6 @@ module.exports = __toCommonJS(floor_plan_exports);
25
25
  var import_BaseModule = require("../../../modules/BaseModule");
26
26
  var import_types = require("./types");
27
27
  var FLOOR_PLAN_SYNC_DEBOUNCE_MS = 3e3;
28
- var FLOOR_PLAN_STORE_NAME = "floor_plans";
29
28
  var FloorPlanModule = class extends import_BaseModule.BaseModule {
30
29
  constructor(name, version) {
31
30
  super(name, version);
@@ -51,7 +50,6 @@ var FloorPlanModule = class extends import_BaseModule.BaseModule {
51
50
  if (appPlugin) {
52
51
  const app = appPlugin.getApp();
53
52
  this.logger = app.logger;
54
- this.dbManager = app.sqlite || app.dbManager;
55
53
  }
56
54
  this.initFloorPlanDataSource();
57
55
  this.setupFloorPlanSync();
@@ -161,45 +159,6 @@ var FloorPlanModule = class extends import_BaseModule.BaseModule {
161
159
  return [];
162
160
  }
163
161
  }
164
- async loadListFromSQLite() {
165
- if (!this.dbManager)
166
- return [];
167
- try {
168
- const list = await this.dbManager.getAll(FLOOR_PLAN_STORE_NAME);
169
- return Array.isArray(list) ? list : [];
170
- } catch (error) {
171
- this.logWarning("从 SQLite 读取平面图失败", {
172
- error: error instanceof Error ? error.message : String(error)
173
- });
174
- return [];
175
- }
176
- }
177
- async saveListToSQLite(list) {
178
- if (!this.dbManager)
179
- return;
180
- try {
181
- await this.dbManager.clear(FLOOR_PLAN_STORE_NAME);
182
- if (list.length > 0) {
183
- await this.dbManager.bulkAdd(FLOOR_PLAN_STORE_NAME, list);
184
- }
185
- } catch (error) {
186
- this.logWarning("保存平面图到 SQLite 失败", {
187
- count: list.length,
188
- error: error instanceof Error ? error.message : String(error)
189
- });
190
- }
191
- }
192
- async refreshListFromServer() {
193
- const list = await this.loadListFromServer();
194
- if (list.length === 0) {
195
- this.logWarning("远端平面图刷新完成但列表为空");
196
- return;
197
- }
198
- this.replaceStore(list);
199
- await this.saveListToSQLite(list);
200
- this.core.effects.emit(import_types.FloorPlanHooks.onFloorPlansChanged, this.getSortedList());
201
- this.logInfo("远端平面图刷新完成", { count: list.length });
202
- }
203
162
  async fetchByIdFromServer(id) {
204
163
  try {
205
164
  const res = await this.request.get(
@@ -231,19 +190,14 @@ var FloorPlanModule = class extends import_BaseModule.BaseModule {
231
190
  }
232
191
  async preload() {
233
192
  this.logInfo("开始预加载平面图列表");
234
- const cachedList = await this.loadListFromSQLite();
235
- if (cachedList.length > 0) {
236
- this.replaceStore(cachedList);
193
+ const list = await this.loadListFromServer();
194
+ if (list.length > 0) {
195
+ this.replaceStore(list);
237
196
  this.core.effects.emit(import_types.FloorPlanHooks.onFloorPlansChanged, this.getSortedList());
238
- this.logInfo("预加载完成(SQLite)", { count: cachedList.length });
239
- void this.refreshListFromServer().catch((error) => {
240
- this.logWarning("后台刷新平面图失败,继续使用本地数据", {
241
- error: error instanceof Error ? error.message : String(error)
242
- });
243
- });
244
- return;
197
+ this.logInfo("预加载完成", { count: list.length });
198
+ } else {
199
+ this.logWarning("预加载完成但列表为空");
245
200
  }
246
- await this.refreshListFromServer();
247
201
  }
248
202
  initFloorPlanDataSource() {
249
203
  var _a, _b;
@@ -345,7 +299,6 @@ var FloorPlanModule = class extends import_BaseModule.BaseModule {
345
299
  }
346
300
  }
347
301
  if (changed) {
348
- await this.saveListToSQLite(this.store.list);
349
302
  this.core.effects.emit(import_types.FloorPlanHooks.onFloorPlansChanged, this.getSortedList());
350
303
  this.core.effects.emit(import_types.FloorPlanHooks.onFloorPlanSyncCompleted, null);
351
304
  }
@@ -354,7 +307,6 @@ var FloorPlanModule = class extends import_BaseModule.BaseModule {
354
307
  this.store.list = [];
355
308
  this.store.map.clear();
356
309
  this.store.codeMap.clear();
357
- await this.saveListToSQLite([]);
358
310
  }
359
311
  destroy() {
360
312
  var _a;
@@ -185,21 +185,16 @@ var MenuModule = class extends import_BaseModule.BaseModule {
185
185
  this.logWarning("loadMenuFromIndexDB: dbManager 不可用");
186
186
  return [];
187
187
  }
188
- const startedAt = performance.now();
189
188
  try {
190
189
  const menuList = await this.dbManager.getAll(INDEXDB_STORE_NAME);
191
190
  this.logInfo("从 IndexDB 加载餐牌数据", {
192
- menuCount: (menuList == null ? void 0 : menuList.length) ?? 0,
193
- durationMs: +(performance.now() - startedAt).toFixed(2)
191
+ menuCount: (menuList == null ? void 0 : menuList.length) ?? 0
194
192
  });
195
193
  return menuList || [];
196
194
  } catch (error) {
197
195
  const errorMessage = error instanceof Error ? error.message : String(error);
198
196
  console.error("[Menu] 从 IndexDB 读取数据失败:", error);
199
- this.logError("从 IndexDB 读取数据失败", {
200
- durationMs: +(performance.now() - startedAt).toFixed(2),
201
- error: errorMessage
202
- });
197
+ this.logError("从 IndexDB 读取数据失败", { error: errorMessage });
203
198
  return [];
204
199
  }
205
200
  }
@@ -212,41 +207,20 @@ var MenuModule = class extends import_BaseModule.BaseModule {
212
207
  this.logWarning("saveMenuToIndexDB: dbManager 不可用");
213
208
  return;
214
209
  }
215
- const startedAt = performance.now();
216
- let clearDurationMs = 0;
217
- let writeDurationMs = 0;
218
210
  this.logInfo("开始保存餐牌数据到 IndexDB", { menuCount: menuList.length });
219
211
  try {
220
- const clearStartedAt = performance.now();
221
- try {
222
- await this.dbManager.clear(INDEXDB_STORE_NAME);
223
- } finally {
224
- clearDurationMs = +(performance.now() - clearStartedAt).toFixed(2);
225
- }
226
- const writeStartedAt = performance.now();
212
+ await this.dbManager.clear(INDEXDB_STORE_NAME);
227
213
  const savePromises = menuList.map(
228
214
  (menu) => this.dbManager.add(INDEXDB_STORE_NAME, menu)
229
215
  );
230
- try {
231
- await Promise.all(savePromises);
232
- } finally {
233
- writeDurationMs = +(performance.now() - writeStartedAt).toFixed(2);
234
- }
216
+ await Promise.all(savePromises);
235
217
  console.log(`[Menu] 已将 ${menuList.length} 条餐牌数据保存到 IndexDB`);
236
- this.logInfo("餐牌数据已保存到 IndexDB", {
237
- menuCount: menuList.length,
238
- clearDurationMs,
239
- writeDurationMs,
240
- totalDurationMs: +(performance.now() - startedAt).toFixed(2)
241
- });
218
+ this.logInfo("餐牌数据已保存到 IndexDB", { menuCount: menuList.length });
242
219
  } catch (error) {
243
220
  const errorMessage = error instanceof Error ? error.message : String(error);
244
221
  console.error("[Menu] 保存数据到 IndexDB 失败:", error);
245
222
  this.logError("保存数据到 IndexDB 失败", {
246
223
  menuCount: menuList.length,
247
- clearDurationMs,
248
- writeDurationMs,
249
- totalDurationMs: +(performance.now() - startedAt).toFixed(2),
250
224
  error: errorMessage
251
225
  });
252
226
  }