@pisell/pisellos 2.2.278 → 2.2.280

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 (188) hide show
  1. package/dist/modules/BaseModule.d.ts +1 -0
  2. package/dist/modules/BaseModule.js +24 -28
  3. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +7 -3
  4. package/dist/modules/BookingContext/utils/productExtend.js +5 -9
  5. package/dist/modules/BookingContext/utils/timeSlices.js +24 -3
  6. package/dist/modules/Customer/index.d.ts +4 -0
  7. package/dist/modules/Customer/index.js +91 -59
  8. package/dist/modules/Customer/types.d.ts +2 -0
  9. package/dist/modules/Discount/index.d.ts +1 -0
  10. package/dist/modules/Discount/index.js +40 -11
  11. package/dist/modules/Discount/types.d.ts +1 -0
  12. package/dist/modules/Holder/index.d.ts +48 -0
  13. package/dist/modules/Holder/index.js +640 -0
  14. package/dist/modules/Holder/types.d.ts +123 -0
  15. package/dist/modules/Holder/types.js +1 -0
  16. package/dist/modules/Holder/utils.d.ts +13 -0
  17. package/dist/modules/Holder/utils.js +34 -0
  18. package/dist/modules/OpenData/index.js +2 -2
  19. package/dist/modules/Order/index.d.ts +32 -4
  20. package/dist/modules/Order/index.js +868 -675
  21. package/dist/modules/Order/types.d.ts +22 -1
  22. package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +45 -0
  23. package/dist/modules/Order/utils/discountProductLineIdentity.js +227 -0
  24. package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
  25. package/dist/modules/Order/utils/orderCollectionIdentity.js +75 -0
  26. package/dist/modules/Order/utils.d.ts +10 -0
  27. package/dist/modules/Order/utils.js +71 -34
  28. package/dist/modules/Payment/index.d.ts +4 -0
  29. package/dist/modules/Payment/index.js +14 -4
  30. package/dist/modules/Payment/walletpass.js +21 -7
  31. package/dist/modules/Product/types.d.ts +1 -0
  32. package/dist/modules/ProductList/index.js +33 -13
  33. package/dist/modules/Quotation/index.d.ts +1 -1
  34. package/dist/modules/Quotation/index.js +2 -2
  35. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  36. package/dist/modules/ResourcePlanner/index.js +181 -0
  37. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  38. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  39. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  40. package/dist/modules/ResourcePlanner/types.js +1 -0
  41. package/dist/modules/Rules/index.js +153 -56
  42. package/dist/modules/SalesSummary/index.js +12 -13
  43. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  44. package/dist/modules/ScanOrderLogger/index.js +15 -2
  45. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  46. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  47. package/dist/modules/Schedule/index.d.ts +3 -1
  48. package/dist/modules/Schedule/index.js +21 -16
  49. package/dist/modules/Summary/utils.js +38 -13
  50. package/dist/modules/index.d.ts +2 -0
  51. package/dist/modules/index.js +3 -1
  52. package/dist/plugins/window.d.ts +1 -0
  53. package/dist/server/index.d.ts +20 -0
  54. package/dist/server/index.js +1101 -909
  55. package/dist/server/modules/order/index.d.ts +2 -0
  56. package/dist/server/modules/order/index.js +261 -96
  57. package/dist/server/modules/order/types.d.ts +1 -1
  58. package/dist/solution/BaseSales/index.d.ts +20 -1
  59. package/dist/solution/BaseSales/index.js +989 -881
  60. package/dist/solution/BaseSales/utils/cartPromotion.js +19 -1
  61. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
  62. package/dist/solution/BaseSales/utils.js +31 -20
  63. package/dist/solution/BookingByStep/index.d.ts +17 -2
  64. package/dist/solution/BookingByStep/index.js +294 -215
  65. package/dist/solution/BookingByStep/types.d.ts +2 -1
  66. package/dist/solution/BookingByStep/types.js +3 -1
  67. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  68. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  69. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  70. package/dist/solution/BookingTicket/index.d.ts +21 -3
  71. package/dist/solution/BookingTicket/index.js +312 -226
  72. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  73. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  74. package/dist/solution/ScanOrder/index.d.ts +26 -14
  75. package/dist/solution/ScanOrder/index.js +1142 -739
  76. package/dist/solution/ScanOrder/types.d.ts +21 -1
  77. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  78. package/dist/solution/ScanOrder/utils.js +97 -45
  79. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  80. package/dist/solution/ShopDiscount/index.js +125 -87
  81. package/dist/solution/UnifiedBookingSales/index.d.ts +204 -0
  82. package/dist/solution/UnifiedBookingSales/index.js +2211 -0
  83. package/dist/solution/UnifiedBookingSales/types.d.ts +150 -0
  84. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  85. package/dist/solution/VenueBooking/index.d.ts +39 -11
  86. package/dist/solution/VenueBooking/index.js +1167 -841
  87. package/dist/solution/VenueBooking/types.d.ts +3 -0
  88. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  89. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  90. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  91. package/dist/solution/index.d.ts +1 -0
  92. package/dist/solution/index.js +2 -1
  93. package/dist/types/index.d.ts +1 -0
  94. package/lib/model/strategy/adapter/promotion/index.js +0 -51
  95. package/lib/modules/BaseModule.d.ts +1 -0
  96. package/lib/modules/BaseModule.js +24 -37
  97. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +3 -0
  98. package/lib/modules/BookingContext/utils/productExtend.js +4 -3
  99. package/lib/modules/BookingContext/utils/timeSlices.js +18 -3
  100. package/lib/modules/Customer/index.d.ts +4 -0
  101. package/lib/modules/Customer/index.js +11 -0
  102. package/lib/modules/Customer/types.d.ts +2 -0
  103. package/lib/modules/Discount/index.d.ts +1 -0
  104. package/lib/modules/Discount/index.js +9 -0
  105. package/lib/modules/Discount/types.d.ts +1 -0
  106. package/lib/modules/Holder/index.d.ts +48 -0
  107. package/lib/modules/Holder/index.js +402 -0
  108. package/lib/modules/Holder/types.d.ts +123 -0
  109. package/lib/modules/Holder/types.js +17 -0
  110. package/lib/modules/Holder/utils.d.ts +13 -0
  111. package/lib/modules/Holder/utils.js +71 -0
  112. package/lib/modules/OpenData/index.js +1 -1
  113. package/lib/modules/Order/index.d.ts +32 -4
  114. package/lib/modules/Order/index.js +372 -156
  115. package/lib/modules/Order/types.d.ts +22 -1
  116. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +45 -0
  117. package/lib/modules/Order/utils/discountProductLineIdentity.js +170 -0
  118. package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +15 -0
  119. package/lib/modules/Order/utils/orderCollectionIdentity.js +70 -0
  120. package/lib/modules/Order/utils.d.ts +10 -0
  121. package/lib/modules/Order/utils.js +39 -6
  122. package/lib/modules/Payment/index.d.ts +4 -0
  123. package/lib/modules/Payment/index.js +7 -0
  124. package/lib/modules/Payment/walletpass.js +12 -0
  125. package/lib/modules/Product/types.d.ts +1 -0
  126. package/lib/modules/ProductList/index.js +49 -31
  127. package/lib/modules/Quotation/index.d.ts +1 -1
  128. package/lib/modules/Quotation/index.js +2 -2
  129. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  130. package/lib/modules/ResourcePlanner/index.js +148 -0
  131. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  132. package/lib/modules/ResourcePlanner/planner.js +933 -0
  133. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  134. package/lib/modules/ResourcePlanner/types.js +17 -0
  135. package/lib/modules/Rules/index.js +117 -25
  136. package/lib/modules/SalesSummary/index.js +6 -7
  137. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  138. package/lib/modules/ScanOrderLogger/index.js +13 -1
  139. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  140. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  141. package/lib/modules/Schedule/index.d.ts +3 -1
  142. package/lib/modules/Schedule/index.js +10 -8
  143. package/lib/modules/Summary/utils.js +21 -1
  144. package/lib/modules/index.d.ts +2 -0
  145. package/lib/modules/index.js +5 -1
  146. package/lib/plugins/window.d.ts +1 -0
  147. package/lib/server/index.d.ts +20 -0
  148. package/lib/server/index.js +124 -19
  149. package/lib/server/modules/order/index.d.ts +2 -0
  150. package/lib/server/modules/order/index.js +75 -5
  151. package/lib/server/modules/order/types.d.ts +1 -1
  152. package/lib/solution/BaseSales/index.d.ts +20 -1
  153. package/lib/solution/BaseSales/index.js +105 -31
  154. package/lib/solution/BaseSales/utils/cartPromotion.js +18 -0
  155. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +1 -0
  156. package/lib/solution/BaseSales/utils.js +29 -18
  157. package/lib/solution/BookingByStep/index.d.ts +17 -2
  158. package/lib/solution/BookingByStep/index.js +60 -18
  159. package/lib/solution/BookingByStep/types.d.ts +2 -1
  160. package/lib/solution/BookingByStep/types.js +5 -0
  161. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  162. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  163. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  164. package/lib/solution/BookingTicket/index.d.ts +21 -3
  165. package/lib/solution/BookingTicket/index.js +75 -16
  166. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  167. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  168. package/lib/solution/ScanOrder/index.d.ts +26 -14
  169. package/lib/solution/ScanOrder/index.js +449 -182
  170. package/lib/solution/ScanOrder/types.d.ts +21 -1
  171. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  172. package/lib/solution/ScanOrder/utils.js +60 -18
  173. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  174. package/lib/solution/ShopDiscount/index.js +14 -0
  175. package/lib/solution/UnifiedBookingSales/index.d.ts +204 -0
  176. package/lib/solution/UnifiedBookingSales/index.js +1273 -0
  177. package/lib/solution/UnifiedBookingSales/types.d.ts +150 -0
  178. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  179. package/lib/solution/VenueBooking/index.d.ts +39 -11
  180. package/lib/solution/VenueBooking/index.js +322 -110
  181. package/lib/solution/VenueBooking/types.d.ts +3 -0
  182. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  183. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  184. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  185. package/lib/solution/index.d.ts +1 -0
  186. package/lib/solution/index.js +3 -1
  187. package/lib/types/index.d.ts +1 -0
  188. package/package.json +1 -1
@@ -95,12 +95,12 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
95
95
  *
96
96
  * @memberof ScheduleModule
97
97
  */
98
- async loadAllSchedule() {
98
+ async loadAllSchedule(options = {}) {
99
99
  var _a;
100
100
  const scheduleList = await this.request.get(
101
101
  `/schedule`,
102
102
  { num: 999 },
103
- { useCache: true }
103
+ { useCache: options.useCache ?? true }
104
104
  );
105
105
  this.setScheduleList(((_a = scheduleList.data) == null ? void 0 : _a.list) || []);
106
106
  }
@@ -126,7 +126,6 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
126
126
  custom_page_id,
127
127
  channel
128
128
  }) {
129
- var _a, _b, _c;
130
129
  if ((0, import_dayjs.default)(startDate).isBefore((0, import_dayjs.default)(), "day")) {
131
130
  startDate = (0, import_dayjs.default)().format("YYYY-MM-DD");
132
131
  }
@@ -144,17 +143,20 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
144
143
  channel
145
144
  }
146
145
  );
147
- this.setAvailabilityScheduleDateList(res.data.date_list);
148
- this.setOtherProductsIds(res.data.other_product_ids || []);
149
- if (!((_a = res.data.date_list) == null ? void 0 : _a.length) && !((_b = res.data.other_product_ids) == null ? void 0 : _b.length) || (0, import_dayjs.default)(endDate).isBefore((0, import_dayjs.default)(), "day")) {
146
+ const responseData = res.data || {};
147
+ const dateList = Array.isArray(responseData.date_list) ? responseData.date_list : [];
148
+ const otherProductIds = Array.isArray(responseData.other_product_ids) ? responseData.other_product_ids : [];
149
+ this.setAvailabilityScheduleDateList(dateList);
150
+ this.setOtherProductsIds(otherProductIds);
151
+ if (!dateList.length && !otherProductIds.length || (0, import_dayjs.default)(endDate).isBefore((0, import_dayjs.default)(), "day")) {
150
152
  return dates;
151
153
  }
152
- if ((_c = res.data.other_product_ids) == null ? void 0 : _c.length) {
154
+ if (otherProductIds.length) {
153
155
  dates.forEach((n) => {
154
156
  n.status = "available";
155
157
  });
156
158
  } else {
157
- res.data.date_list.forEach((n) => {
159
+ dateList.forEach((n) => {
158
160
  const index = dates.findIndex((m) => m.date === n.date);
159
161
  if (index !== -1) {
160
162
  dates[index].status = "available";
@@ -437,11 +437,31 @@ var getBundleItemIsDiscountPrice = (item) => {
437
437
  var getBundleItemIsMarkupOrDiscountPrice = (item) => {
438
438
  return getBundleItemIsMarkupPrice(item) || getBundleItemIsDiscountPrice(item);
439
439
  };
440
+ var getDiscountAmount = (discounts) => {
441
+ return (discounts || []).reduce((total, discount) => {
442
+ return total.add(new import_decimal.default(discount.amount || 0));
443
+ }, new import_decimal.default(0)).toNumber();
444
+ };
440
445
  var getMainProductTotal = (item) => {
441
- var _a, _b;
446
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
442
447
  let total = new import_decimal.default(
443
448
  (item == null ? void 0 : item.main_product_selling_price) ?? ((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.main_product_selling_price) ?? ((_b = item == null ? void 0 : item.metadata) == null ? void 0 : _b.main_product_original_price) ?? 0
444
449
  );
450
+ const hasMainProductPrice = (item == null ? void 0 : item.main_product_selling_price) != null || ((_c = item == null ? void 0 : item.metadata) == null ? void 0 : _c.main_product_selling_price) != null || ((_d = item == null ? void 0 : item.metadata) == null ? void 0 : _d.main_product_original_price) != null;
451
+ if (!hasMainProductPrice) {
452
+ total = new import_decimal.default((item == null ? void 0 : item.main_product_selling_price) ?? ((_e = item == null ? void 0 : item.metadata) == null ? void 0 : _e.main_product_selling_price) ?? item.price ?? 0);
453
+ const discount = ((_g = (_f = item == null ? void 0 : item._origin) == null ? void 0 : _f.product) == null ? void 0 : _g.discount_list) || ((_j = (_i = (_h = item == null ? void 0 : item._originData) == null ? void 0 : _h.product) == null ? void 0 : _i.discount_list) == null ? void 0 : _j.filter((item2) => {
454
+ var _a2;
455
+ return !((_a2 = item2 == null ? void 0 : item2.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
456
+ })) || [];
457
+ const mainProductDiscountAmount = getDiscountAmount(discount);
458
+ total = total.minus(mainProductDiscountAmount);
459
+ if ((item == null ? void 0 : item.option) && Array.isArray(item == null ? void 0 : item.option)) {
460
+ total = total.add(item == null ? void 0 : item.option.reduce((t, option) => {
461
+ return t.add(new import_decimal.default(option.price || 0).mul(option.num || 1));
462
+ }, new import_decimal.default(0)));
463
+ }
464
+ }
445
465
  for (let bundleItem of (item == null ? void 0 : item.bundle) || []) {
446
466
  if (getBundleItemIsMarkupOrDiscountPrice(bundleItem)) {
447
467
  const bundleItemTotal = new import_decimal.default(bundleItem.bundle_selling_price ?? bundleItem.price ?? 0);
@@ -18,3 +18,5 @@ export * from './Quotation';
18
18
  export * from './ScanOrderLogger';
19
19
  export * from './OpenData';
20
20
  export * from './BookingContext';
21
+ export * from './Holder';
22
+ export * from './ResourcePlanner';
@@ -36,6 +36,8 @@ __reExport(modules_exports, require("./Quotation"), module.exports);
36
36
  __reExport(modules_exports, require("./ScanOrderLogger"), module.exports);
37
37
  __reExport(modules_exports, require("./OpenData"), module.exports);
38
38
  __reExport(modules_exports, require("./BookingContext"), module.exports);
39
+ __reExport(modules_exports, require("./Holder"), module.exports);
40
+ __reExport(modules_exports, require("./ResourcePlanner"), module.exports);
39
41
  // Annotate the CommonJS export names for ESM import in node:
40
42
  0 && (module.exports = {
41
43
  ...require("./Product"),
@@ -57,5 +59,7 @@ __reExport(modules_exports, require("./BookingContext"), module.exports);
57
59
  ...require("./Quotation"),
58
60
  ...require("./ScanOrderLogger"),
59
61
  ...require("./OpenData"),
60
- ...require("./BookingContext")
62
+ ...require("./BookingContext"),
63
+ ...require("./Holder"),
64
+ ...require("./ResourcePlanner")
61
65
  });
@@ -16,6 +16,7 @@ export interface WindowPlugin extends Plugin {
16
16
  history: History;
17
17
  interaction?: any;
18
18
  getWalletPassEvaluator?: () => WalletPassEvaluator;
19
+ getLocalStorage?: (key: string) => string | null;
19
20
  }
20
21
  /**
21
22
  * 简单的 Storage 接口实现
@@ -49,6 +49,10 @@ declare class Server {
49
49
  private productQuerySubscribers;
50
50
  /** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
51
51
  private productQueryScheduleTimers;
52
+ /** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
53
+ private menuScheduleRefreshInFlight;
54
+ private lastMenuScheduleRefreshAt;
55
+ private readonly MENU_SCHEDULE_REFRESH_COOLDOWN_MS;
52
56
  private orderQuerySubscribers;
53
57
  private bookingQuerySubscribers;
54
58
  private bookingRemoteQuerySubscribers;
@@ -160,6 +164,12 @@ declare class Server {
160
164
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
161
165
  */
162
166
  refreshOrdersInBackground(): Promise<void>;
167
+ /**
168
+ * 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
169
+ * 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
170
+ * UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
171
+ */
172
+ checkRemoteOrderProductMembership(orderId: string | number): Promise<void>;
163
173
  /**
164
174
  * 清空所有server模块的IndexedDB缓存
165
175
  * @returns Promise<void>
@@ -267,6 +277,16 @@ declare class Server {
267
277
  * 存储订阅者信息,便于数据变更时推送最新结果
268
278
  */
269
279
  private handleProductQuery;
280
+ /**
281
+ * ProductList callers such as standalone retail pages do not always have a selected schedule.
282
+ * In that case query against the current local time so menu availability can still be evaluated.
283
+ */
284
+ private resolveProductQueryScheduleContext;
285
+ /**
286
+ * OpenData 的关联餐牌可能已更新,而 server_menu/server_schedule 仍命中本地持久化缓存。
287
+ * 仅在当前筛选没有任何生效餐牌时刷新一次,并由调用方重新计算筛选结果。
288
+ */
289
+ private refreshMenuScheduleCacheAfterEmptyResult;
270
290
  /**
271
291
  * 按商品 id 查询单条(GET /shop/product/query/:productId)
272
292
  * schedule_date 必填:query 或 data;schedule_datetime 可选。不走订阅。
@@ -84,6 +84,10 @@ var Server = class {
84
84
  this.productQuerySubscribers = /* @__PURE__ */ new Map();
85
85
  /** subscriberId → 智能定价变价时间点定时器句柄(与 subscriber 分离存储,便于 clear) */
86
86
  this.productQueryScheduleTimers = /* @__PURE__ */ new Map();
87
+ /** 餐牌筛选为空时才触发的菜单/日程缓存自愈,避免每次商品查询都请求远端。 */
88
+ this.menuScheduleRefreshInFlight = null;
89
+ this.lastMenuScheduleRefreshAt = 0;
90
+ this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS = 30 * 1e3;
87
91
  // ---- 订单 / 预约列表查询订阅者 ----
88
92
  this.orderQuerySubscribers = /* @__PURE__ */ new Map();
89
93
  this.bookingQuerySubscribers = /* @__PURE__ */ new Map();
@@ -217,7 +221,11 @@ var Server = class {
217
221
  */
218
222
  this.handleProductQuery = async ({ url, method, data, config }) => {
219
223
  console.log("[Server] handleProductQuery:", url, method, data, config);
220
- const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids, extension_type, strategy_context } = data;
224
+ const { menu_list_ids, customer_id, ids, extension_type, strategy_context } = data;
225
+ const { schedule_date, schedule_datetime } = this.resolveProductQueryScheduleContext({
226
+ schedule_date: data.schedule_date,
227
+ schedule_datetime: data.schedule_datetime
228
+ });
221
229
  const { callback, subscriberId } = config || {};
222
230
  this.logInfo("handleProductQuery: 开始处理商品查询请求", {
223
231
  menu_list_ids,
@@ -1789,6 +1797,57 @@ var Server = class {
1789
1797
  });
1790
1798
  }
1791
1799
  }
1800
+ /**
1801
+ * 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
1802
+ * 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
1803
+ * UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
1804
+ */
1805
+ async checkRemoteOrderProductMembership(orderId) {
1806
+ const normalizedOrderId = String(orderId ?? "").trim();
1807
+ if (!normalizedOrderId || normalizedOrderId.startsWith("local_order")) {
1808
+ this.logInfo("checkRemoteOrderProductMembership: 跳过非正式订单", {
1809
+ orderId
1810
+ });
1811
+ return;
1812
+ }
1813
+ if (!this.order) {
1814
+ const error = new Error("Order 模块未注册");
1815
+ this.logWarning("checkRemoteOrderProductMembership: Order 模块未注册", {
1816
+ orderId: normalizedOrderId
1817
+ });
1818
+ throw error;
1819
+ }
1820
+ this.logInfo("checkRemoteOrderProductMembership 开始", {
1821
+ orderId: normalizedOrderId
1822
+ });
1823
+ const startTime = Date.now();
1824
+ try {
1825
+ const freshOrders = await this.order.fetchOrdersByHttp([
1826
+ normalizedOrderId
1827
+ ]);
1828
+ const freshOrder = freshOrders.find(
1829
+ (order) => String(order == null ? void 0 : order.order_id) === normalizedOrderId
1830
+ );
1831
+ if (!freshOrder) {
1832
+ throw new Error("Server 未返回目标订单最新快照");
1833
+ }
1834
+ await this.order.upsertOrdersFromRemote(
1835
+ [freshOrder],
1836
+ "manual.editOpenRemoteCheck"
1837
+ );
1838
+ this.logInfo("checkRemoteOrderProductMembership 完成", {
1839
+ orderId: normalizedOrderId,
1840
+ duration: `${Date.now() - startTime}ms`
1841
+ });
1842
+ } catch (error) {
1843
+ this.logError("checkRemoteOrderProductMembership 失败", {
1844
+ orderId: normalizedOrderId,
1845
+ duration: `${Date.now() - startTime}ms`,
1846
+ error: error instanceof Error ? error.message : String(error)
1847
+ });
1848
+ throw error;
1849
+ }
1850
+ }
1792
1851
  /**
1793
1852
  * 清空所有server模块的IndexedDB缓存
1794
1853
  * @returns Promise<void>
@@ -2219,15 +2278,12 @@ var Server = class {
2219
2278
  return;
2220
2279
  const scheduleDate = subscriber.context.schedule_date || (0, import_dayjs.default)().format("YYYY-MM-DD");
2221
2280
  const timerIds = [];
2222
- for (const timePoint of timePoints) {
2223
- const delayMs = this.computeScheduleTimePointDelayMs(scheduleDate, timePoint);
2224
- if (delayMs < 0)
2225
- continue;
2226
- const timerId = setTimeout(() => {
2227
- void this.onScheduleTimePointTimerFire(subscriberId, timerId);
2228
- }, delayMs);
2229
- timerIds.push(timerId);
2230
- }
2281
+ setInterval(() => {
2282
+ const currentTime = (0, import_dayjs.default)().format("hh:mm");
2283
+ if (timePoints.includes(currentTime)) {
2284
+ this.onScheduleTimePointTimerFire(subscriberId);
2285
+ }
2286
+ }, 6e4);
2231
2287
  if (timerIds.length > 0) {
2232
2288
  this.productQueryScheduleTimers.set(subscriberId, timerIds);
2233
2289
  subscriber.scheduleTimerIds = timerIds;
@@ -2242,7 +2298,7 @@ var Server = class {
2242
2298
  * schedule 变价时间点定时器触发:刷新 schedule_datetime 后重算并 callback。
2243
2299
  */
2244
2300
  async onScheduleTimePointTimerFire(subscriberId, timerId) {
2245
- this.removeScheduleTimerRef(subscriberId, timerId);
2301
+ timerId && this.removeScheduleTimerRef(subscriberId, timerId);
2246
2302
  if (!this.productQuerySubscribers.has(subscriberId))
2247
2303
  return;
2248
2304
  const subscriber = this.productQuerySubscribers.get(subscriberId);
@@ -2313,6 +2369,43 @@ var Server = class {
2313
2369
  this.scheduleSubscriberTimePointReloads(subscriberId, timePoints);
2314
2370
  }
2315
2371
  }
2372
+ /**
2373
+ * ProductList callers such as standalone retail pages do not always have a selected schedule.
2374
+ * In that case query against the current local time so menu availability can still be evaluated.
2375
+ */
2376
+ resolveProductQueryScheduleContext(params) {
2377
+ const now = (0, import_dayjs.default)();
2378
+ const schedule_datetime = typeof params.schedule_datetime === "string" && params.schedule_datetime.trim() ? params.schedule_datetime : now.format("YYYY-MM-DD HH:mm:ss");
2379
+ const schedule_date = typeof params.schedule_date === "string" && params.schedule_date.trim() ? params.schedule_date : (0, import_dayjs.default)(schedule_datetime).isValid() ? (0, import_dayjs.default)(schedule_datetime).format("YYYY-MM-DD") : now.format("YYYY-MM-DD");
2380
+ return { schedule_date, schedule_datetime };
2381
+ }
2382
+ /**
2383
+ * OpenData 的关联餐牌可能已更新,而 server_menu/server_schedule 仍命中本地持久化缓存。
2384
+ * 仅在当前筛选没有任何生效餐牌时刷新一次,并由调用方重新计算筛选结果。
2385
+ */
2386
+ async refreshMenuScheduleCacheAfterEmptyResult() {
2387
+ if (!this.menu || !this.schedule)
2388
+ return false;
2389
+ const now = Date.now();
2390
+ if (now - this.lastMenuScheduleRefreshAt < this.MENU_SCHEDULE_REFRESH_COOLDOWN_MS) {
2391
+ return false;
2392
+ }
2393
+ if (!this.menuScheduleRefreshInFlight) {
2394
+ this.lastMenuScheduleRefreshAt = now;
2395
+ this.menuScheduleRefreshInFlight = Promise.all([
2396
+ this.menu.loadMenuList(),
2397
+ this.schedule.loadAllSchedule()
2398
+ ]).then(() => void 0).catch((error) => {
2399
+ this.logWarning("刷新菜单/日程缓存失败,继续使用现有缓存", {
2400
+ error: error instanceof Error ? error.message : String(error)
2401
+ });
2402
+ }).finally(() => {
2403
+ this.menuScheduleRefreshInFlight = null;
2404
+ });
2405
+ }
2406
+ await this.menuScheduleRefreshInFlight;
2407
+ return true;
2408
+ }
2316
2409
  /**
2317
2410
  * 执行 sales 搜索并登记可见订单号。
2318
2411
  * 搜索参数完全透传后端,OS 不做过滤、筛选、排序。
@@ -3763,9 +3856,7 @@ var Server = class {
3763
3856
  checkoutData,
3764
3857
  order: pendingOrder,
3765
3858
  response: pendingResult,
3766
- requireFullyPaid: true,
3767
- // 自动小票固定使用 print_all 的收据类型 0,不随订单 type 改成券/手环类型 99。
3768
- isManualPrint: true
3859
+ requireFullyPaid: true
3769
3860
  });
3770
3861
  }
3771
3862
  await this.dispatchCheckoutSyncTask({
@@ -3813,10 +3904,21 @@ var Server = class {
3813
3904
  data: (normalized == null ? void 0 : normalized.data) ?? null
3814
3905
  };
3815
3906
  }
3816
- return this.withSyncedOrderIdInCheckoutResponse(
3907
+ const response = this.withSyncedOrderIdInCheckoutResponse(
3817
3908
  syncResult.normalizedResponse,
3818
3909
  syncResult.syncedOrder
3819
3910
  );
3911
+ const syncedOrder = syncResult.syncedOrder;
3912
+ if (syncedOrder && this.shouldBuildSmallTicketData(syncResult.checkoutData) && this.isSalesOrderFullyPaid(syncedOrder)) {
3913
+ await this.dispatchLocalReceiptPrint({
3914
+ checkoutData: syncResult.checkoutData,
3915
+ order: syncedOrder,
3916
+ response: syncResult.normalizedResponse,
3917
+ requireFullyPaid: true
3918
+ // print_all 的 type=0 是收据打印;不要沿用同步成功后的券/手环打印 type=99。
3919
+ });
3920
+ }
3921
+ return response;
3820
3922
  } catch (error) {
3821
3923
  const backendError = this.extractBackendErrorResponse(error);
3822
3924
  if (backendError) {
@@ -3990,7 +4092,7 @@ var Server = class {
3990
4092
  var _a, _b, _c, _d, _e;
3991
4093
  if (((_b = (_a = this.core.context) == null ? void 0 : _a.getPlatform) == null ? void 0 : _b.call(_a)) !== "android")
3992
4094
  return true;
3993
- return ((_e = (_d = (_c = this.app) == null ? void 0 : _c.storage) == null ? void 0 : _d.getStorage) == null ? void 0 : _e.call(_d, AUTO_PRINT_STORAGE_KEY)) === "true";
4095
+ return ((_e = (_d = (_c = this.app) == null ? void 0 : _c.storage) == null ? void 0 : _d.getStorage) == null ? void 0 : _e.call(_d, AUTO_PRINT_STORAGE_KEY)) !== "false";
3994
4096
  }
3995
4097
  shouldBuildSmallTicketData(order) {
3996
4098
  if (!order || typeof order !== "object")
@@ -5115,13 +5217,16 @@ var Server = class {
5115
5217
  let activeMenuList = [];
5116
5218
  if (menu_list_ids && Array.isArray(menu_list_ids) && menu_list_ids.length > 0) {
5117
5219
  const tMenu = performance.now();
5118
- const menuList = this.menu.getMenuByIds(menu_list_ids);
5119
- activeMenuList = menuList.filter((menu) => {
5220
+ const getActiveMenus = () => this.menu.getMenuByIds(menu_list_ids).filter((menu) => {
5120
5221
  var _a;
5121
5222
  return ((_a = this.schedule) == null ? void 0 : _a.getDateIsInSchedule(schedule_datetime, menu.schedule)) || false;
5122
5223
  });
5224
+ activeMenuList = getActiveMenus();
5225
+ if (!activeMenuList.length && await this.refreshMenuScheduleCacheAfterEmptyResult()) {
5226
+ activeMenuList = getActiveMenus();
5227
+ }
5123
5228
  (0, import_product.perfMark)("computeQuery.filterActiveMenu", performance.now() - tMenu, {
5124
- totalMenu: menuList.length,
5229
+ totalMenu: menu_list_ids.length,
5125
5230
  activeMenu: activeMenuList.length
5126
5231
  });
5127
5232
  }
@@ -235,6 +235,7 @@ export declare class OrderModule extends BaseModule implements Module {
235
235
  */
236
236
  private lookupOrderIndexByIdentityKeys;
237
237
  private isRemoteEchoMergeSource;
238
+ private isRemoteProductMembershipChangeSource;
238
239
  private getProductMembershipKey;
239
240
  private doProductsHaveStableMembershipIdentity;
240
241
  /**
@@ -273,6 +274,7 @@ export declare class OrderModule extends BaseModule implements Module {
273
274
  * // => 'S-1001'
274
275
  */
275
276
  private getOrderStorageKey;
277
+ private getPersistedOrderStorageKey;
276
278
  private getOrderIdentityMatchKeys;
277
279
  private doOrdersShareIdentity;
278
280
  private findOrderIndexByIdentity;
@@ -39,6 +39,7 @@ var import_orderCollectionIdentity = require("../../../modules/Order/utils/order
39
39
  var import_types = require("./types");
40
40
  var import_payment_utils = require("../../../modules/Order/payment-utils");
41
41
  var INDEXDB_STORE_NAME = "orders";
42
+ var ORDER_STORAGE_KEY_FIELD = "__order_storage_key";
42
43
  var ORDER_LAST_FULL_FETCH_AT_STORAGE_KEY = "server_order_last_full_fetch_at";
43
44
  var ORDER_SYNC_THROTTLE_MS_STORAGE_KEY = "order_sync_throttle_ms";
44
45
  var DEFAULT_ORDER_SYNC_THROTTLE_MS = 2e3;
@@ -920,10 +921,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
920
921
  */
921
922
  async upsertOrdersFromRemote(freshOrders, source = "upsertOrdersFromRemote") {
922
923
  if (!(freshOrders == null ? void 0 : freshOrders.length)) {
923
- this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
924
+ this.logInfo("upsertOrdersFromRemote-订单列表为空", { source });
924
925
  return;
925
926
  }
926
- this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length, source });
927
+ this.logInfo("upsertOrdersFromRemote-开始", {
928
+ count: freshOrders.length,
929
+ source
930
+ });
927
931
  await this.mergeOrdersToStore(freshOrders, source);
928
932
  }
929
933
  async markOrderSyncedByExternalSaleNumber(params) {
@@ -1530,6 +1534,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1530
1534
  const patchedOrders = [];
1531
1535
  const remoteProductMembershipChanges = [];
1532
1536
  const forceWriteStorageKeys = /* @__PURE__ */ new Set();
1537
+ const storageKeyMigrations = [];
1533
1538
  const mergeActions = {};
1534
1539
  const existingProductsHaveStableIdentity = this.store.list.map(
1535
1540
  (order) => this.doProductsHaveStableMembershipIdentity(
@@ -1554,6 +1559,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1554
1559
  const mergeKey = storageKey || (fresh.order_id !== void 0 && fresh.order_id !== null ? this.getIdKey(fresh.order_id) : "");
1555
1560
  if (matchIndex >= 0) {
1556
1561
  const existingOrder = updatedList[matchIndex];
1562
+ const previousStorageKey = this.getPersistedOrderStorageKey(existingOrder);
1557
1563
  if (this.isPendingSyncOrder(existingOrder) && this.isRemoteEchoMergeSource(source)) {
1558
1564
  this.logInfo("mergeOrdersToStore-跳过 pending 订单远端覆盖", {
1559
1565
  source,
@@ -1615,6 +1621,14 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1615
1621
  }
1616
1622
  }
1617
1623
  }
1624
+ const nextStorageKey = this.getOrderStorageKey(mergedOrder);
1625
+ if (previousStorageKey && nextStorageKey && previousStorageKey !== nextStorageKey) {
1626
+ storageKeyMigrations.push({
1627
+ orderId: mergedOrder.order_id ?? existingOrder.order_id ?? fresh.order_id ?? null,
1628
+ from: previousStorageKey,
1629
+ to: nextStorageKey
1630
+ });
1631
+ }
1618
1632
  updatedList[adjustedMatchIndex] = mergedOrder;
1619
1633
  existingProductsHaveStableIdentity[adjustedMatchIndex] = mergedProductsHaveStableIdentity;
1620
1634
  if (membershipChange) {
@@ -1652,7 +1666,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1652
1666
  patchedOrders,
1653
1667
  source,
1654
1668
  mergeActions,
1655
- {},
1669
+ { storageKeyMigrations },
1656
1670
  forceWriteStorageKeys
1657
1671
  );
1658
1672
  this.logInfo("mergeOrdersToStore-结束", {
@@ -1685,6 +1699,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1685
1699
  isRemoteEchoMergeSource(source) {
1686
1700
  return source === "pubsub.bodyUpsert" || source === "pubsub.httpRefresh";
1687
1701
  }
1702
+ isRemoteProductMembershipChangeSource(source) {
1703
+ return this.isRemoteEchoMergeSource(source) || source === "manual.editOpenRemoteCheck";
1704
+ }
1688
1705
  getProductMembershipKey(product) {
1689
1706
  const persistentId = (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product);
1690
1707
  if (persistentId)
@@ -1717,7 +1734,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1717
1734
  * 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
1718
1735
  */
1719
1736
  getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
1720
- if (!this.isRemoteEchoMergeSource(source))
1737
+ if (!this.isRemoteProductMembershipChangeSource(source))
1721
1738
  return null;
1722
1739
  const previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
1723
1740
  const currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
@@ -1854,6 +1871,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1854
1871
  }
1855
1872
  return "";
1856
1873
  }
1874
+ getPersistedOrderStorageKey(order) {
1875
+ const persistedStorageKey = order == null ? void 0 : order[ORDER_STORAGE_KEY_FIELD];
1876
+ if (persistedStorageKey !== void 0 && persistedStorageKey !== null && persistedStorageKey !== "") {
1877
+ return String(persistedStorageKey);
1878
+ }
1879
+ return this.getOrderStorageKey(order);
1880
+ }
1857
1881
  getOrderIdentityMatchKeys(order) {
1858
1882
  return this.getOrderIdentityEntries(order).map((entry) => `${entry.field}:${entry.key}`);
1859
1883
  }
@@ -2284,7 +2308,18 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2284
2308
  throw new Error("订单 SQLite 数据库未初始化");
2285
2309
  return;
2286
2310
  }
2287
- const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).filter((order) => this.getOrderStorageKey(order));
2311
+ const migrationTargetStorageKeys = new Set(
2312
+ (options.storageKeyMigrations || []).map((migration) => migration.to)
2313
+ );
2314
+ const ordersSnapshot = (0, import_lodash_es.cloneDeep)(orders).map((order) => this.normalizeOrderCollectionsForIngress(order, `${source}.sqliteIngress`)).map((order) => {
2315
+ const storageKey = this.getOrderStorageKey(order);
2316
+ if (!storageKey || !migrationTargetStorageKeys.has(storageKey))
2317
+ return order;
2318
+ return {
2319
+ ...order,
2320
+ [ORDER_STORAGE_KEY_FIELD]: storageKey
2321
+ };
2322
+ }).filter((order) => this.getOrderStorageKey(order));
2288
2323
  if (ordersSnapshot.length === 0) {
2289
2324
  return;
2290
2325
  }
@@ -2301,6 +2336,17 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2301
2336
  if (compactedToWrite.length === 0) {
2302
2337
  return;
2303
2338
  }
2339
+ const writtenStorageKeys = new Set(
2340
+ compactedToWrite.map((order) => this.getOrderStorageKey(order)).filter(Boolean)
2341
+ );
2342
+ const storageKeyMigrations = /* @__PURE__ */ new Map();
2343
+ for (const migration of options.storageKeyMigrations || []) {
2344
+ if (!writtenStorageKeys.has(migration.to))
2345
+ continue;
2346
+ if (writtenStorageKeys.has(migration.from))
2347
+ continue;
2348
+ storageKeyMigrations.set(migration.from, migration);
2349
+ }
2304
2350
  try {
2305
2351
  await this.runInOrderSQLiteSaveQueue(async () => {
2306
2352
  let writeMethod = "none";
@@ -2324,6 +2370,30 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2324
2370
  throw new Error("订单 SQLite 数据库不支持写入");
2325
2371
  }
2326
2372
  this.recordRecentSqliteWrite(source, compactedToWrite);
2373
+ if (writeMethod !== "none") {
2374
+ for (const migration of storageKeyMigrations.values()) {
2375
+ try {
2376
+ await this.dbManager.delete(INDEXDB_STORE_NAME, migration.from);
2377
+ this.recentSqliteWriteByStorageKey.delete(migration.from);
2378
+ for (const order of orders) {
2379
+ if (this.getOrderStorageKey(order) !== migration.to)
2380
+ continue;
2381
+ const orderRecord = order;
2382
+ if (String(orderRecord[ORDER_STORAGE_KEY_FIELD] ?? "") !== migration.from)
2383
+ continue;
2384
+ orderRecord[ORDER_STORAGE_KEY_FIELD] = migration.to;
2385
+ }
2386
+ } catch (error) {
2387
+ this.logError("删除订单旧 SQLite storage key 失败", {
2388
+ source,
2389
+ order_id: migration.orderId,
2390
+ oldStorageKey: migration.from,
2391
+ newStorageKey: migration.to,
2392
+ error: error instanceof Error ? error.message : String(error)
2393
+ });
2394
+ }
2395
+ }
2396
+ }
2327
2397
  this.logInfo("patchOrdersInSQLite-完成", {
2328
2398
  source,
2329
2399
  count: compactedToWrite.length,
@@ -568,7 +568,7 @@ export interface OrderChangedPayload {
568
568
  /** 触发来源,便于订阅者区分 pubsub / 远端覆盖 / 清空等场景 */
569
569
  source?: string;
570
570
  }
571
- export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh';
571
+ export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh' | 'manual.editOpenRemoteCheck';
572
572
  /**
573
573
  * 远端订单快照相对本地订单产生商品成员增删时的广播载荷。
574
574
  * 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
@@ -119,6 +119,15 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
119
119
  * application_code 仅作为接口兼容字段,不能替代 channel / business_code。
120
120
  */
121
121
  private getPriceQueryStrategyContext;
122
+ /**
123
+ * 子类可在商品重报价前准备客户维度的策略上下文,例如等待 Wallet/优惠资产加载。
124
+ */
125
+ protected prepareProductPriceQueryContext(_customerId?: number | string): Promise<void>;
126
+ /**
127
+ * 默认保留 BaseSales 的 legacy quotation 行为;已由 /product/query 统一完成
128
+ * 智能定价与报价合并的业务可在子类中覆盖,避免二次覆盖权威价格。
129
+ */
130
+ protected preferAuthoritativeProductQueryPrice(): boolean;
122
131
  private getPriceQuerySchedule;
123
132
  private loadProductsForPriceQuery;
124
133
  private loadProductForPriceQuery;
@@ -141,7 +150,9 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
141
150
  * const params = this.buildSubModuleOtherParams();
142
151
  * this.core.registerModule(orderModule, { otherParams: params });
143
152
  */
144
- protected buildSubModuleOtherParams(): Record<string, any>;
153
+ protected isSessionStoragePersistEnabled(): boolean;
154
+ protected shouldUseSessionStorageForSubModule(_moduleName?: string): boolean;
155
+ protected buildSubModuleOtherParams(moduleName?: string): Record<string, any>;
145
156
  /**
146
157
  * 将父级 otherParams 的变更显式同步给已注册的子模块。
147
158
  *
@@ -290,6 +301,13 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
290
301
  confirmPendingVoucherPayments?: boolean;
291
302
  enhancePayload?: SubmitPayloadEnhancer;
292
303
  }): Promise<T>;
304
+ /**
305
+ * 默认保持 WebPOS 的本地待同步订单模式;需要云端确认后才算成功的渠道可覆盖此策略。
306
+ * otherParams.checkoutSyncTaskEnabled 优先,便于同一 solution 按入口恢复旧行为。
307
+ */
308
+ protected shouldUseCheckoutSyncTask(): boolean;
309
+ /** 可由特定 solution 为真实 checkout 补充默认收据数据请求。 */
310
+ protected getDefaultCheckoutSmallTicketDataFlag(): number | undefined;
293
311
  printLocalOrderReceipt<T = any>(lookup?: BaseSalesPrintLocalOrderReceiptParams): Promise<T>;
294
312
  private getSubmitPaymentStatus;
295
313
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
@@ -427,6 +445,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
427
445
  transformBaseProductToOrderProduct(params: TransformBaseProductToOrderProductParams): import("./utils/transformBaseProductToOrderProduct").BaseProductOrderProductInput | null;
428
446
  calculateProductBookingPrice(params: BaseSalesCalculateProductBookingPriceParams): Promise<BaseSalesProductBookingPriceResult>;
429
447
  getQuotationCustomerScopeInfo(): BaseSalesQuotationCustomerScopeInfo;
448
+ private hasSmartPricingStrategies;
430
449
  shouldRecalculateProductBookingPricesForContextChange(params: BaseSalesPriceRecalculationContextChange): boolean;
431
450
  calculateProductBookingPrices(paramsList: BaseSalesCalculateProductBookingPriceParams[]): Promise<BaseSalesProductBookingPriceResult[]>;
432
451
  addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput, options?: AddProductToOrderOptions): Promise<import("../../modules/Order/types").OrderProduct[]>;