@pisell/pisellos 2.2.262 → 2.2.264

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 (131) hide show
  1. package/dist/model/strategy/adapter/index.d.ts +0 -4
  2. package/dist/model/strategy/adapter/index.js +1 -5
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  11. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  12. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +10 -16
  13. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +1 -2
  14. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -1
  15. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +1 -32
  16. package/dist/modules/Discount/index.d.ts +2 -5
  17. package/dist/modules/Discount/index.js +7 -30
  18. package/dist/modules/Discount/types.d.ts +0 -4
  19. package/dist/modules/Order/index.d.ts +2 -14
  20. package/dist/modules/Order/index.js +736 -1035
  21. package/dist/modules/Order/types.d.ts +0 -16
  22. package/dist/modules/Order/utils.d.ts +3 -4
  23. package/dist/modules/Order/utils.js +61 -54
  24. package/dist/modules/Product/types.d.ts +0 -22
  25. package/dist/modules/ProductList/index.d.ts +1 -1
  26. package/dist/modules/ProductList/index.js +2 -4
  27. package/dist/modules/ProductList/types.d.ts +0 -2
  28. package/dist/modules/Rules/index.d.ts +9 -2
  29. package/dist/modules/Rules/index.js +43 -69
  30. package/dist/modules/Rules/types.d.ts +1 -10
  31. package/dist/server/index.d.ts +0 -55
  32. package/dist/server/index.js +742 -1161
  33. package/dist/server/modules/order/index.d.ts +4 -10
  34. package/dist/server/modules/order/index.js +399 -404
  35. package/dist/server/modules/order/types.d.ts +0 -4
  36. package/dist/server/modules/products/index.d.ts +8 -31
  37. package/dist/server/modules/products/index.js +390 -549
  38. package/dist/server/modules/products/types.d.ts +0 -18
  39. package/dist/solution/BaseSales/index.d.ts +1 -21
  40. package/dist/solution/BaseSales/index.js +789 -1136
  41. package/dist/solution/BaseSales/types.d.ts +1 -6
  42. package/dist/solution/BaseSales/types.js +1 -1
  43. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  44. package/dist/solution/BaseSales/utils/cartPromotion.js +97 -50
  45. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -3
  46. package/dist/solution/BaseSales/utils/parseSalesResponse.js +8 -6
  47. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +1 -14
  48. package/dist/solution/BookingByStep/index.d.ts +1 -1
  49. package/dist/solution/BookingTicket/index.js +25 -59
  50. package/dist/solution/BookingTicket/types.d.ts +0 -2
  51. package/dist/solution/ScanOrder/index.js +31 -20
  52. package/dist/solution/ShopDiscount/index.js +14 -15
  53. package/dist/solution/VenueBooking/index.js +30 -19
  54. package/lib/model/strategy/adapter/index.d.ts +0 -4
  55. package/lib/model/strategy/adapter/index.js +2 -13
  56. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  57. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  58. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  59. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  60. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  61. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  62. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  63. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  64. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  65. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  66. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +0 -5
  67. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +0 -1
  68. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +1 -1
  69. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +2 -23
  70. package/lib/modules/Discount/index.d.ts +2 -5
  71. package/lib/modules/Discount/index.js +3 -23
  72. package/lib/modules/Discount/types.d.ts +0 -4
  73. package/lib/modules/Order/index.d.ts +2 -14
  74. package/lib/modules/Order/index.js +60 -326
  75. package/lib/modules/Order/types.d.ts +0 -16
  76. package/lib/modules/Order/utils.d.ts +3 -4
  77. package/lib/modules/Order/utils.js +23 -22
  78. package/lib/modules/Product/types.d.ts +0 -22
  79. package/lib/modules/ProductList/index.d.ts +1 -1
  80. package/lib/modules/ProductList/index.js +2 -4
  81. package/lib/modules/ProductList/types.d.ts +0 -2
  82. package/lib/modules/Rules/index.d.ts +9 -2
  83. package/lib/modules/Rules/index.js +29 -61
  84. package/lib/modules/Rules/types.d.ts +1 -10
  85. package/lib/server/index.d.ts +0 -55
  86. package/lib/server/index.js +31 -327
  87. package/lib/server/modules/order/index.d.ts +4 -10
  88. package/lib/server/modules/order/index.js +139 -198
  89. package/lib/server/modules/order/types.d.ts +0 -4
  90. package/lib/server/modules/products/index.d.ts +8 -31
  91. package/lib/server/modules/products/index.js +35 -134
  92. package/lib/server/modules/products/types.d.ts +0 -18
  93. package/lib/solution/BaseSales/index.d.ts +1 -21
  94. package/lib/solution/BaseSales/index.js +72 -313
  95. package/lib/solution/BaseSales/types.d.ts +1 -6
  96. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  97. package/lib/solution/BaseSales/utils/cartPromotion.js +64 -25
  98. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -3
  99. package/lib/solution/BaseSales/utils/parseSalesResponse.js +5 -4
  100. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +0 -8
  101. package/lib/solution/BookingByStep/index.d.ts +1 -1
  102. package/lib/solution/BookingTicket/index.js +8 -33
  103. package/lib/solution/BookingTicket/types.d.ts +0 -2
  104. package/lib/solution/ScanOrder/index.js +8 -0
  105. package/lib/solution/ShopDiscount/index.js +1 -2
  106. package/lib/solution/VenueBooking/index.js +8 -0
  107. package/package.json +1 -1
  108. package/dist/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
  109. package/dist/model/strategy/adapter/dataVariant/adapter.js +0 -167
  110. package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
  111. package/dist/model/strategy/adapter/dataVariant/evaluator.js +0 -780
  112. package/dist/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
  113. package/dist/model/strategy/adapter/dataVariant/examples.js +0 -277
  114. package/dist/model/strategy/adapter/dataVariant/index.d.ts +0 -4
  115. package/dist/model/strategy/adapter/dataVariant/index.js +0 -4
  116. package/dist/model/strategy/adapter/dataVariant/type.d.ts +0 -148
  117. package/dist/model/strategy/adapter/dataVariant/type.js +0 -54
  118. package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +0 -53
  119. package/dist/modules/Order/utils/orderCollectionIdentity.js +0 -405
  120. package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +0 -50
  121. package/lib/model/strategy/adapter/dataVariant/adapter.js +0 -149
  122. package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +0 -89
  123. package/lib/model/strategy/adapter/dataVariant/evaluator.js +0 -583
  124. package/lib/model/strategy/adapter/dataVariant/examples.d.ts +0 -39
  125. package/lib/model/strategy/adapter/dataVariant/examples.js +0 -293
  126. package/lib/model/strategy/adapter/dataVariant/index.d.ts +0 -4
  127. package/lib/model/strategy/adapter/dataVariant/index.js +0 -38
  128. package/lib/model/strategy/adapter/dataVariant/type.d.ts +0 -148
  129. package/lib/model/strategy/adapter/dataVariant/type.js +0 -31
  130. package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +0 -53
  131. package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -415
@@ -76,8 +76,6 @@ var Server = class {
76
76
  };
77
77
  // ---- 商品查询订阅者 ----
78
78
  this.productQuerySubscribers = /* @__PURE__ */ new Map();
79
- /** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
80
- this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
81
79
  // ---- 订单 / 预约列表查询订阅者 ----
82
80
  this.orderQuerySubscribers = /* @__PURE__ */ new Map();
83
81
  this.bookingQuerySubscribers = /* @__PURE__ */ new Map();
@@ -210,7 +208,7 @@ var Server = class {
210
208
  */
211
209
  this.handleProductQuery = async ({ url, method, data, config }) => {
212
210
  console.log("[Server] handleProductQuery:", url, method, data, config);
213
- const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type, strategy_context } = data;
211
+ const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type } = data;
214
212
  const { callback, subscriberId } = config || {};
215
213
  this.logInfo("handleProductQuery: 开始处理商品查询请求", {
216
214
  menu_list_ids,
@@ -218,32 +216,19 @@ var Server = class {
218
216
  schedule_datetime,
219
217
  schedule_date,
220
218
  customer_id,
221
- extension_type,
222
- strategyContextKeys: strategy_context ? Object.keys(strategy_context) : []
219
+ extension_type
223
220
  });
224
221
  if (subscriberId && typeof callback === "function") {
225
222
  this.productQuerySubscribers.set(subscriberId, {
226
223
  callback,
227
- context: { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, strategy_context }
224
+ context: { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type }
228
225
  });
229
226
  this.logInfo("handleProductQuery: 已注册订阅者", {
230
227
  subscriberId,
231
228
  totalSubscribers: this.productQuerySubscribers.size
232
229
  });
233
230
  }
234
- const result = await this.computeProductQueryResult({
235
- menu_list_ids,
236
- ids,
237
- schedule_date,
238
- schedule_datetime,
239
- customer_id,
240
- extension_type,
241
- strategy_context
242
- });
243
- if (subscriberId && typeof callback === "function") {
244
- this.syncProductQueryScheduleTimers(subscriberId, strategy_context);
245
- }
246
- return result;
231
+ return this.computeProductQueryResult({ menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type });
247
232
  };
248
233
  /**
249
234
  * 按商品 id 查询单条(GET /shop/product/query/:productId)
@@ -784,13 +769,12 @@ var Server = class {
784
769
  if (!this.shouldForceRemoteSalesDetail(data)) {
785
770
  const localOrder = await this.order.getLocalOrderByLookup(lookup);
786
771
  if (localOrder) {
787
- const enrichedOrder = await this.withSalesDetailProductSnapshots(localOrder);
788
772
  this.logInfo("handleOrderSalesDetail: 命中本地订单", { lookup });
789
773
  return {
790
774
  code: 200,
791
775
  status: true,
792
776
  message: "",
793
- data: enrichedOrder
777
+ data: localOrder
794
778
  };
795
779
  }
796
780
  }
@@ -837,12 +821,11 @@ var Server = class {
837
821
  };
838
822
  }
839
823
  this.logInfo("handleOrderSalesDetail: 远端订单已同步到本地", { lookup });
840
- const enrichedOrder = await this.withSalesDetailProductSnapshots(savedOrder);
841
824
  return {
842
825
  code: 200,
843
826
  status: true,
844
827
  message: "",
845
- data: enrichedOrder
828
+ data: savedOrder
846
829
  };
847
830
  } catch (error) {
848
831
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -1926,7 +1909,6 @@ var Server = class {
1926
1909
  */
1927
1910
  removeProductQuerySubscriber(subscriberId) {
1928
1911
  if (subscriberId) {
1929
- this.clearSubscriberScheduleTimers(subscriberId);
1930
1912
  this.productQuerySubscribers.delete(subscriberId);
1931
1913
  this.logInfo("removeProductQuerySubscriber: 已移除订阅者", {
1932
1914
  subscriberId,
@@ -1934,156 +1916,6 @@ var Server = class {
1934
1916
  });
1935
1917
  }
1936
1918
  }
1937
- /**
1938
- * 构建商品 query 响应 data 段,附带智能定价 schedule_time_points 元数据。
1939
- */
1940
- buildProductQueryResultPayload(list, count) {
1941
- var _a, _b;
1942
- return {
1943
- list,
1944
- count: count ?? list.length,
1945
- schedule_time_points: ((_b = (_a = this.products) == null ? void 0 : _a.getLastScheduleTimePoints) == null ? void 0 : _b.call(_a)) ?? []
1946
- };
1947
- }
1948
- /**
1949
- * 是否启用商品 query 订阅的 schedule 时间点定时重算。
1950
- * strategy_context.enable_schedule_reload === false 时关闭。
1951
- */
1952
- shouldScheduleProductQueryReload(strategy_context) {
1953
- return (strategy_context == null ? void 0 : strategy_context.enable_schedule_reload) !== false;
1954
- }
1955
- /**
1956
- * 清除指定 subscriber 的全部 schedule 定时器,防止重复 query 或 unsubscribe 后泄漏。
1957
- */
1958
- clearSubscriberScheduleTimers(subscriberId) {
1959
- const timers = this.productQueryScheduleTimers.get(subscriberId);
1960
- if (timers == null ? void 0 : timers.length) {
1961
- timers.forEach((timerId) => clearTimeout(timerId));
1962
- }
1963
- this.productQueryScheduleTimers.delete(subscriberId);
1964
- const subscriber = this.productQuerySubscribers.get(subscriberId);
1965
- if (subscriber) {
1966
- subscriber.scheduleTimerIds = [];
1967
- }
1968
- }
1969
- /**
1970
- * 从 productQueryScheduleTimers 移除已触发的 timer 引用。
1971
- */
1972
- removeScheduleTimerRef(subscriberId, timerId) {
1973
- const timers = this.productQueryScheduleTimers.get(subscriberId);
1974
- if (!(timers == null ? void 0 : timers.length))
1975
- return;
1976
- const next = timers.filter((id) => id !== timerId);
1977
- if (next.length === 0) {
1978
- this.productQueryScheduleTimers.delete(subscriberId);
1979
- } else {
1980
- this.productQueryScheduleTimers.set(subscriberId, next);
1981
- }
1982
- const subscriber = this.productQuerySubscribers.get(subscriberId);
1983
- if (subscriber) {
1984
- subscriber.scheduleTimerIds = next;
1985
- }
1986
- }
1987
- /**
1988
- * 计算 schedule 变价时间点到当前时刻的延迟(ms)。已过期返回 -1。
1989
- */
1990
- computeScheduleTimePointDelayMs(scheduleDate, timePoint) {
1991
- const parts = timePoint.split(":");
1992
- if (parts.length < 2)
1993
- return -1;
1994
- const hours = parseInt(parts[0], 10);
1995
- const minutes = parseInt(parts[1], 10);
1996
- if (!Number.isFinite(hours) || !Number.isFinite(minutes))
1997
- return -1;
1998
- const target = (0, import_dayjs.default)(scheduleDate).hour(hours).minute(minutes).second(4).millisecond(0);
1999
- const delayMs = target.diff((0, import_dayjs.default)());
2000
- return delayMs >= 0 ? delayMs : -1;
2001
- }
2002
- /**
2003
- * 定时重算前刷新 subscriber schedule 上下文:使用执行瞬间时间,禁止沿用首次 query 的 schedule_datetime。
2004
- */
2005
- refreshSubscriberScheduleAtExecution(subscriber) {
2006
- const executedAt = (0, import_dayjs.default)();
2007
- const bookingDate = subscriber.context.schedule_date || executedAt.format("YYYY-MM-DD");
2008
- subscriber.context.schedule_date = bookingDate;
2009
- subscriber.context.schedule_datetime = `${bookingDate} ${executedAt.format("HH:mm:ss")}`;
2010
- }
2011
- /**
2012
- * 为 subscriber 注册智能定价 scheduleTimePoints 定时重算。
2013
- * 必须先 clearSubscriberScheduleTimers,再调用本方法。
2014
- */
2015
- scheduleSubscriberTimePointReloads(subscriberId, timePoints) {
2016
- const subscriber = this.productQuerySubscribers.get(subscriberId);
2017
- if (!subscriber || !timePoints.length)
2018
- return;
2019
- const scheduleDate = subscriber.context.schedule_date || (0, import_dayjs.default)().format("YYYY-MM-DD");
2020
- const timerIds = [];
2021
- for (const timePoint of timePoints) {
2022
- const delayMs = this.computeScheduleTimePointDelayMs(scheduleDate, timePoint);
2023
- if (delayMs < 0)
2024
- continue;
2025
- const timerId = setTimeout(() => {
2026
- void this.onScheduleTimePointTimerFire(subscriberId, timerId);
2027
- }, delayMs);
2028
- timerIds.push(timerId);
2029
- }
2030
- if (timerIds.length > 0) {
2031
- this.productQueryScheduleTimers.set(subscriberId, timerIds);
2032
- subscriber.scheduleTimerIds = timerIds;
2033
- this.logInfo("scheduleSubscriberTimePointReloads: 已注册定时器", {
2034
- subscriberId,
2035
- timerCount: timerIds.length,
2036
- timePoints
2037
- });
2038
- }
2039
- }
2040
- /**
2041
- * schedule 变价时间点定时器触发:刷新 schedule_datetime 后重算并 callback。
2042
- */
2043
- async onScheduleTimePointTimerFire(subscriberId, timerId) {
2044
- this.removeScheduleTimerRef(subscriberId, timerId);
2045
- if (!this.productQuerySubscribers.has(subscriberId))
2046
- return;
2047
- const subscriber = this.productQuerySubscribers.get(subscriberId);
2048
- this.refreshSubscriberScheduleAtExecution(subscriber);
2049
- await this.recomputeAndNotifySubscriber(subscriberId);
2050
- }
2051
- /**
2052
- * 对单个商品 query 订阅者重算并推送(定时路径;不新建 schedule timer)。
2053
- */
2054
- async recomputeAndNotifySubscriber(subscriberId) {
2055
- const subscriber = this.productQuerySubscribers.get(subscriberId);
2056
- if (!subscriber)
2057
- return;
2058
- try {
2059
- const result = await this.computeProductQueryResult(subscriber.context);
2060
- subscriber.callback(result);
2061
- this.logInfo("recomputeAndNotifySubscriber: 已推送", {
2062
- subscriberId,
2063
- schedule_datetime: subscriber.context.schedule_datetime
2064
- });
2065
- } catch (error) {
2066
- const errorMessage = error instanceof Error ? error.message : String(error);
2067
- this.logError("recomputeAndNotifySubscriber: 推送失败", {
2068
- subscriberId,
2069
- error: errorMessage
2070
- });
2071
- }
2072
- }
2073
- /**
2074
- * query 完成后为 subscriber 同步 schedule 定时器(先 clear 再 schedule)。
2075
- */
2076
- syncProductQueryScheduleTimers(subscriberId, strategy_context) {
2077
- var _a, _b;
2078
- this.clearSubscriberScheduleTimers(subscriberId);
2079
- if (!this.shouldScheduleProductQueryReload(strategy_context)) {
2080
- return;
2081
- }
2082
- const timePoints = ((_b = (_a = this.products) == null ? void 0 : _a.getLastScheduleTimePoints) == null ? void 0 : _b.call(_a)) ?? [];
2083
- if (timePoints.length > 0) {
2084
- this.scheduleSubscriberTimePointReloads(subscriberId, timePoints);
2085
- }
2086
- }
2087
1919
  /**
2088
1920
  * 执行 sales 搜索并登记可见订单号。
2089
1921
  * 搜索参数完全透传后端,OS 不做过滤、筛选、排序。
@@ -3399,123 +3231,6 @@ var Server = class {
3399
3231
  return map;
3400
3232
  }, {});
3401
3233
  }
3402
- collectSalesDetailProductIds(order) {
3403
- const products = Array.isArray(order == null ? void 0 : order.products) ? order.products : [];
3404
- const productIds = /* @__PURE__ */ new Set();
3405
- const addProductId = (rawProductId) => {
3406
- if (rawProductId === void 0 || rawProductId === null || rawProductId === "")
3407
- return;
3408
- const productId = Number(rawProductId);
3409
- if (Number.isFinite(productId))
3410
- productIds.add(productId);
3411
- };
3412
- products.forEach((product) => {
3413
- addProductId((product == null ? void 0 : product.product_id) ?? (product == null ? void 0 : product.id));
3414
- if (Array.isArray(product == null ? void 0 : product.product_bundle)) {
3415
- product.product_bundle.forEach((bundle) => {
3416
- addProductId((bundle == null ? void 0 : bundle.bundle_product_id) ?? (bundle == null ? void 0 : bundle._bundle_product_id) ?? (bundle == null ? void 0 : bundle.product_id));
3417
- });
3418
- }
3419
- });
3420
- return Array.from(productIds);
3421
- }
3422
- async buildSalesDetailProductSnapshotMap(order) {
3423
- var _a;
3424
- const productIds = this.collectSalesDetailProductIds(order);
3425
- const getSnapshots = (_a = this.products) == null ? void 0 : _a.getProductSnapshotsByIds;
3426
- if (!productIds.length || typeof getSnapshots !== "function")
3427
- return {};
3428
- try {
3429
- return await getSnapshots.call(this.products, productIds);
3430
- } catch (error) {
3431
- this.logWarning("buildSalesDetailProductSnapshotMap: 查询本地商品快照失败", {
3432
- product_ids: productIds,
3433
- error: error instanceof Error ? error.message : String(error)
3434
- });
3435
- return {};
3436
- }
3437
- }
3438
- withProductCatalogSnapshots(product, snapshotMap) {
3439
- if (!product || typeof product !== "object")
3440
- return product;
3441
- const rawProductId = (product == null ? void 0 : product.product_id) ?? (product == null ? void 0 : product.id);
3442
- if (rawProductId === void 0 || rawProductId === null || rawProductId === "")
3443
- return product;
3444
- const productId = Number(rawProductId);
3445
- if (!Number.isFinite(productId))
3446
- return product;
3447
- const snapshot = snapshotMap[String(productId)];
3448
- if (!snapshot)
3449
- return product;
3450
- const shouldFillCover = (product.product_cover === void 0 || product.product_cover === null || product.product_cover === "") && snapshot.cover !== void 0 && snapshot.cover !== null && snapshot.cover !== "";
3451
- const metadata = product.metadata && typeof product.metadata === "object" ? product.metadata : {};
3452
- const shouldFillHolderConfig = (metadata.holder_config === void 0 || metadata.holder_config === null) && snapshot.holder_config !== void 0 && snapshot.holder_config !== null;
3453
- if (!shouldFillCover && !shouldFillHolderConfig)
3454
- return product;
3455
- return {
3456
- ...product,
3457
- ...shouldFillCover ? { product_cover: snapshot.cover } : {},
3458
- ...shouldFillHolderConfig ? {
3459
- metadata: {
3460
- ...metadata,
3461
- holder_config: snapshot.holder_config
3462
- }
3463
- } : {}
3464
- };
3465
- }
3466
- withBundleCatalogSnapshots(product, snapshotMap) {
3467
- if (!Array.isArray(product == null ? void 0 : product.product_bundle))
3468
- return product;
3469
- let hasChanged = false;
3470
- const productBundle = product.product_bundle.map((bundle) => {
3471
- if (!bundle || typeof bundle !== "object")
3472
- return bundle;
3473
- const rawProductId = (bundle == null ? void 0 : bundle.bundle_product_id) ?? (bundle == null ? void 0 : bundle._bundle_product_id) ?? (bundle == null ? void 0 : bundle.product_id);
3474
- if (rawProductId === void 0 || rawProductId === null || rawProductId === "")
3475
- return bundle;
3476
- const productId = Number(rawProductId);
3477
- if (!Number.isFinite(productId))
3478
- return bundle;
3479
- const snapshot = snapshotMap[String(productId)];
3480
- const shouldFillCover = (bundle.cover === void 0 || bundle.cover === null || bundle.cover === "") && (snapshot == null ? void 0 : snapshot.cover) !== void 0 && snapshot.cover !== null && snapshot.cover !== "";
3481
- if (!shouldFillCover)
3482
- return bundle;
3483
- hasChanged = true;
3484
- return {
3485
- ...bundle,
3486
- cover: snapshot.cover
3487
- };
3488
- });
3489
- if (!hasChanged)
3490
- return product;
3491
- return {
3492
- ...product,
3493
- product_bundle: productBundle
3494
- };
3495
- }
3496
- async withSalesDetailProductSnapshots(order) {
3497
- const products = Array.isArray(order == null ? void 0 : order.products) ? order.products : null;
3498
- if (!(products == null ? void 0 : products.length))
3499
- return order;
3500
- const snapshotMap = await this.buildSalesDetailProductSnapshotMap(order);
3501
- if (!Object.keys(snapshotMap).length)
3502
- return order;
3503
- let hasChanged = false;
3504
- const enrichedProducts = products.map((product) => {
3505
- const productWithBundleSnapshots = this.withBundleCatalogSnapshots(product, snapshotMap);
3506
- const nextProduct = this.withProductCatalogSnapshots(productWithBundleSnapshots, snapshotMap);
3507
- if (nextProduct !== product)
3508
- hasChanged = true;
3509
- return nextProduct;
3510
- });
3511
- if (!hasChanged)
3512
- return order;
3513
- const enrichedOrder = {
3514
- ...order,
3515
- products: enrichedProducts
3516
- };
3517
- return enrichedOrder;
3518
- }
3519
3234
  withPendingSyncProductTitles(order, productMap) {
3520
3235
  const products = Array.isArray(order.products) ? order.products : null;
3521
3236
  if (!(products == null ? void 0 : products.length))
@@ -4277,14 +3992,8 @@ var Server = class {
4277
3992
  */
4278
3993
  async computeProductQueryResult(context, options) {
4279
3994
  const tTotal = performance.now();
4280
- const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, product_id, strategy_context } = context;
3995
+ const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, extension_type, product_id } = context;
4281
3996
  const queryIds = Array.isArray(ids) ? ids.map((id) => Number(id)).filter((id) => Number.isFinite(id)) : [];
4282
- const formatterContext = this.buildProductFormatterContext({
4283
- schedule_date,
4284
- schedule_datetime,
4285
- customer_id,
4286
- strategy_context
4287
- });
4288
3997
  this.logInfo("computeProductQueryResult 开始", {
4289
3998
  menuListIdsCount: (menu_list_ids == null ? void 0 : menu_list_ids.length) ?? 0,
4290
3999
  ids: queryIds,
@@ -4293,17 +4002,20 @@ var Server = class {
4293
4002
  customer_id,
4294
4003
  extension_type,
4295
4004
  product_id,
4296
- strategyContextKeys: strategy_context ? Object.keys(strategy_context) : [],
4297
4005
  changedIds: options == null ? void 0 : options.changedIds
4298
4006
  });
4299
4007
  if (!this.products) {
4300
4008
  this.logError("computeProductQueryResult: Products 模块未注册");
4301
- return { message: "Products 模块未注册", data: this.buildProductQueryResultPayload([], 0) };
4009
+ return { message: "Products 模块未注册", data: { list: [], count: 0 } };
4302
4010
  }
4303
4011
  if (queryIds.length > 0) {
4304
4012
  const uniqueIds = Array.from(new Set(queryIds));
4305
4013
  const tPrice2 = performance.now();
4306
- const productsWithPrice = await this.products.getProductsWithPrice(schedule_date, formatterContext, {
4014
+ const productsWithPrice = await this.products.getProductsWithPrice(schedule_date, {
4015
+ scheduleModule: this.getSchedule(),
4016
+ schedule_datetime,
4017
+ customer_id
4018
+ }, {
4307
4019
  changedIds: options == null ? void 0 : options.changedIds,
4308
4020
  productIds: uniqueIds
4309
4021
  });
@@ -4324,7 +4036,7 @@ var Server = class {
4324
4036
  });
4325
4037
  return {
4326
4038
  code: 200,
4327
- data: this.buildProductQueryResultPayload(extensionFilteredProducts),
4039
+ data: { list: extensionFilteredProducts, count: extensionFilteredProducts.length },
4328
4040
  message: "",
4329
4041
  status: true
4330
4042
  };
@@ -4332,7 +4044,9 @@ var Server = class {
4332
4044
  if (product_id != null && Number.isFinite(Number(product_id))) {
4333
4045
  const pid = Number(product_id);
4334
4046
  const tPrice2 = performance.now();
4335
- const allProductsWithPrice = await this.products.getProductsWithPrice(schedule_date, formatterContext, {
4047
+ const allProductsWithPrice = await this.products.getProductsWithPrice(schedule_date, {
4048
+ scheduleModule: this.getSchedule()
4049
+ }, {
4336
4050
  changedIds: options == null ? void 0 : options.changedIds
4337
4051
  });
4338
4052
  (0, import_product.perfMark)("computeQuery.getProductsWithPrice(single)", performance.now() - tPrice2, {
@@ -4362,7 +4076,11 @@ var Server = class {
4362
4076
  }
4363
4077
  if (this.shouldQueryProductsByExtensionTypes(extension_type)) {
4364
4078
  const tPrice2 = performance.now();
4365
- let filteredProducts2 = await this.products.getProductsWithPrice(schedule_date, formatterContext, {
4079
+ let filteredProducts2 = await this.products.getProductsWithPrice(schedule_date, {
4080
+ scheduleModule: this.getSchedule(),
4081
+ schedule_datetime,
4082
+ customer_id
4083
+ }, {
4366
4084
  changedIds: options == null ? void 0 : options.changedIds
4367
4085
  });
4368
4086
  (0, import_product.perfMark)("computeQuery.getProductsWithPrice(extensionType)", performance.now() - tPrice2, {
@@ -4402,18 +4120,18 @@ var Server = class {
4402
4120
  });
4403
4121
  return {
4404
4122
  code: 200,
4405
- data: this.buildProductQueryResultPayload(filteredProducts2),
4123
+ data: { list: filteredProducts2, count: filteredProducts2.length },
4406
4124
  message: "",
4407
4125
  status: true
4408
4126
  };
4409
4127
  }
4410
4128
  if (!this.menu) {
4411
4129
  this.logError("computeProductQueryResult: Menu 模块未注册");
4412
- return { message: "Menu 模块未注册", data: this.buildProductQueryResultPayload([], 0) };
4130
+ return { message: "Menu 模块未注册", data: { list: [], count: 0 } };
4413
4131
  }
4414
4132
  if (!this.schedule) {
4415
4133
  this.logError("computeProductQueryResult: Schedule 模块未注册");
4416
- return { message: "Schedule 模块未注册", data: this.buildProductQueryResultPayload([], 0) };
4134
+ return { message: "Schedule 模块未注册", data: { list: [], count: 0 } };
4417
4135
  }
4418
4136
  let activeMenuList = [];
4419
4137
  if (menu_list_ids && Array.isArray(menu_list_ids) && menu_list_ids.length > 0) {
@@ -4437,7 +4155,11 @@ var Server = class {
4437
4155
  isAllProducts: !!productScope.isAllProducts
4438
4156
  });
4439
4157
  const tPrice = performance.now();
4440
- let filteredProducts = scopedProductIds.length > 0 ? await this.products.getProductsWithPrice(schedule_date, formatterContext, {
4158
+ let filteredProducts = scopedProductIds.length > 0 ? await this.products.getProductsWithPrice(schedule_date, {
4159
+ scheduleModule: this.getSchedule(),
4160
+ schedule_datetime,
4161
+ customer_id
4162
+ }, {
4441
4163
  changedIds: options == null ? void 0 : options.changedIds,
4442
4164
  productIds: productScope.isAllProducts ? void 0 : scopedProductIds
4443
4165
  }) : [];
@@ -4480,29 +4202,11 @@ var Server = class {
4480
4202
  });
4481
4203
  return {
4482
4204
  code: 200,
4483
- data: this.buildProductQueryResultPayload(filteredProducts),
4205
+ data: { list: filteredProducts, count: filteredProducts.length },
4484
4206
  message: "",
4485
4207
  status: true
4486
4208
  };
4487
4209
  }
4488
- /**
4489
- * 构建商品格式化上下文。
4490
- *
4491
- * 智能定价条件使用全量 menuList/scheduleList;Product Query 顶层参数只保留筛选商品集合所需字段。
4492
- */
4493
- buildProductFormatterContext(context) {
4494
- var _a, _b, _c, _d;
4495
- const scheduleModule = this.getSchedule();
4496
- return {
4497
- scheduleModule,
4498
- schedule_datetime: context.schedule_datetime,
4499
- customer_id: context.customer_id,
4500
- strategy_context: context.strategy_context,
4501
- menuList: ((_b = (_a = this.menu) == null ? void 0 : _a.getMenuList) == null ? void 0 : _b.call(_a)) || [],
4502
- scheduleList: ((_c = scheduleModule == null ? void 0 : scheduleModule.getScheduleList) == null ? void 0 : _c.call(scheduleModule)) || [],
4503
- dataVariantEvaluator: (_d = this.core.context) == null ? void 0 : _d.dataVariantEvaluator
4504
- };
4505
- }
4506
4210
  /**
4507
4211
  * 数据变更后,遍历所有订阅者重新计算查询结果并通过 callback 推送
4508
4212
  * 由 ProductsModule 的 onProductsSyncCompleted 事件触发
@@ -43,16 +43,6 @@ export declare class OrderModule extends BaseModule implements Module {
43
43
  */
44
44
  private logError;
45
45
  private logWarning;
46
- /**
47
- * 在订单进入内存或 SQLite 前统一压缩子项强身份重复并补齐协议 UID。
48
- * 仅记录计数与订单标识,不输出商品、预约、支付或客户明细。
49
- */
50
- private normalizeOrderCollectionsForIngress;
51
- /**
52
- * incoming 决定权威成员集合;同一持久化行仍从 existing 补齐 incoming 省略的本地展示字段。
53
- */
54
- private mergeAuthoritativeOrderCollection;
55
- private reconcileOverwriteOrderCollections;
56
46
  /**
57
47
  * 记录订单最近一次 SQLite 写入,供 pubsub 回声去重使用。
58
48
  *
@@ -222,6 +212,10 @@ export declare class OrderModule extends BaseModule implements Module {
222
212
  private findOrderIndexByIdentity;
223
213
  private getOrderCompletenessScore;
224
214
  private pickPreferredOrder;
215
+ private getProductIdentityKeys;
216
+ private mergeOrderProductLists;
217
+ private getPaymentMergeKey;
218
+ private mergeOrderPaymentLists;
225
219
  private mergeOrderRecords;
226
220
  private summarizeDuplicateOrders;
227
221
  private logDuplicateOrders;