@pisell/pisellos 0.0.500 → 0.0.502

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 (68) hide show
  1. package/dist/model/strategy/adapter/itemRule/adapter.d.ts +8 -0
  2. package/dist/model/strategy/adapter/itemRule/adapter.js +52 -8
  3. package/dist/model/strategy/adapter/itemRule/examples.d.ts +15 -0
  4. package/dist/model/strategy/adapter/itemRule/examples.js +68 -1
  5. package/dist/model/strategy/adapter/itemRule/index.d.ts +1 -1
  6. package/dist/model/strategy/adapter/itemRule/index.js +1 -1
  7. package/dist/model/strategy/adapter/itemRule/type.d.ts +20 -1
  8. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  9. package/dist/modules/Order/index.d.ts +10 -0
  10. package/dist/modules/Order/index.js +64 -40
  11. package/dist/modules/Order/types.d.ts +13 -1
  12. package/dist/modules/Order/utils.d.ts +36 -1
  13. package/dist/modules/Order/utils.js +120 -24
  14. package/dist/modules/ProductList/index.js +2 -2
  15. package/dist/modules/Quotation/index.js +6 -3
  16. package/dist/modules/SalesSummary/types.d.ts +2 -1
  17. package/dist/modules/SalesSummary/utils.js +10 -10
  18. package/dist/modules/Schedule/utils.d.ts +1 -1
  19. package/dist/solution/ScanOrder/index.d.ts +22 -0
  20. package/dist/solution/ScanOrder/index.js +863 -369
  21. package/dist/solution/ScanOrder/types.d.ts +31 -8
  22. package/dist/solution/ScanOrder/utils.d.ts +26 -0
  23. package/dist/solution/ScanOrder/utils.js +191 -44
  24. package/dist/solution/VenueBooking/index.d.ts +42 -5
  25. package/dist/solution/VenueBooking/index.js +692 -280
  26. package/dist/solution/VenueBooking/types.d.ts +23 -0
  27. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +2 -1
  28. package/dist/solution/VenueBooking/utils/dateSummary.js +7 -5
  29. package/dist/solution/VenueBooking/utils/resource.d.ts +11 -1
  30. package/dist/solution/VenueBooking/utils/resource.js +57 -21
  31. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +5 -0
  32. package/dist/solution/VenueBooking/utils/slotMerge.js +33 -12
  33. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +1 -1
  34. package/dist/solution/VenueBooking/utils/timeSlot.js +259 -62
  35. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +8 -0
  36. package/lib/model/strategy/adapter/itemRule/adapter.js +41 -2
  37. package/lib/model/strategy/adapter/itemRule/examples.d.ts +15 -0
  38. package/lib/model/strategy/adapter/itemRule/examples.js +47 -0
  39. package/lib/model/strategy/adapter/itemRule/index.d.ts +1 -1
  40. package/lib/model/strategy/adapter/itemRule/index.js +2 -0
  41. package/lib/model/strategy/adapter/itemRule/type.d.ts +20 -1
  42. package/lib/modules/Order/index.d.ts +10 -0
  43. package/lib/modules/Order/index.js +40 -43
  44. package/lib/modules/Order/types.d.ts +13 -1
  45. package/lib/modules/Order/utils.d.ts +36 -1
  46. package/lib/modules/Order/utils.js +100 -21
  47. package/lib/modules/ProductList/index.js +3 -2
  48. package/lib/modules/Quotation/index.js +3 -0
  49. package/lib/modules/SalesSummary/types.d.ts +2 -1
  50. package/lib/modules/SalesSummary/utils.js +2 -2
  51. package/lib/modules/Schedule/utils.d.ts +1 -1
  52. package/lib/solution/ScanOrder/index.d.ts +22 -0
  53. package/lib/solution/ScanOrder/index.js +376 -21
  54. package/lib/solution/ScanOrder/types.d.ts +31 -8
  55. package/lib/solution/ScanOrder/utils.d.ts +26 -0
  56. package/lib/solution/ScanOrder/utils.js +128 -19
  57. package/lib/solution/VenueBooking/index.d.ts +42 -5
  58. package/lib/solution/VenueBooking/index.js +356 -84
  59. package/lib/solution/VenueBooking/types.d.ts +23 -0
  60. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +2 -1
  61. package/lib/solution/VenueBooking/utils/dateSummary.js +14 -5
  62. package/lib/solution/VenueBooking/utils/resource.d.ts +11 -1
  63. package/lib/solution/VenueBooking/utils/resource.js +15 -4
  64. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +5 -0
  65. package/lib/solution/VenueBooking/utils/slotMerge.js +29 -12
  66. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +1 -1
  67. package/lib/solution/VenueBooking/utils/timeSlot.js +182 -43
  68. package/package.json +1 -1
@@ -159,41 +159,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
159
159
  this.store.rules = rules;
160
160
  }
161
161
  createDefaultRulesHooks() {
162
- return {
163
- getProduct: (product) => {
164
- var _a, _b, _c, _d;
165
- return {
166
- id: product.product_id,
167
- _id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
168
- price: product.selling_price,
169
- total: new import_decimal.default(product.payment_price || product.selling_price || 0).times(product.num || 1).toNumber(),
170
- origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
171
- original_price: product.original_price,
172
- quantity: product.num || 1,
173
- num: product.num || 1,
174
- discount_list: product.discount_list || [],
175
- bundle: product.product_bundle || [],
176
- booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
177
- isClient: false,
178
- isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
179
- holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
180
- startDate: (_d = product._origin) == null ? void 0 : _d.startDate
181
- };
182
- },
183
- setProduct: (product, values) => ({
184
- ...product,
185
- selling_price: values.price !== void 0 ? String(values.price) : product.selling_price,
186
- payment_price: values.total !== void 0 ? String(values.total) : product.payment_price,
187
- original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
188
- discount_list: values.discount_list ?? product.discount_list,
189
- num: values.quantity ?? product.num,
190
- product_bundle: values.bundle ?? product.product_bundle,
191
- metadata: {
192
- ...product.metadata || {},
193
- ...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
194
- }
195
- })
196
- };
162
+ return (0, import_utils.createDefaultOrderRulesHooks)();
197
163
  }
198
164
  // ─── Discount: 公共 API ───
199
165
  async loadDiscountConfig(params) {
@@ -267,28 +233,28 @@ var OrderModule = class extends import_BaseModule.BaseModule {
267
233
  };
268
234
  }
269
235
  applyDiscount() {
270
- var _a, _b, _c, _d, _e, _f;
236
+ var _a, _b, _c, _d, _e;
271
237
  const tempOrder = this.store.tempOrder;
272
- if (!((_a = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _a.length))
238
+ if (!tempOrder)
273
239
  return;
274
240
  const rulesModule = this.store.rules;
275
241
  if (!rulesModule)
276
242
  return;
277
- const discountList = ((_b = this.store.discount) == null ? void 0 : _b.getDiscountList()) || [];
278
- const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
243
+ const discountList = ((_a = this.store.discount) == null ? void 0 : _a.getDiscountList()) || [];
244
+ const holders = ((_b = tempOrder.holder) == null ? void 0 : _b.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
279
245
  const result = rulesModule.calcDiscount({
280
246
  productList: tempOrder.products,
281
247
  discountList,
282
248
  holders,
283
- isFormSubject: !!((_d = tempOrder.holder) == null ? void 0 : _d.type) && tempOrder.holder.type === "form",
284
- orderTotalAmount: Number(((_e = tempOrder == null ? void 0 : tempOrder.summary) == null ? void 0 : _e.total_amount) || 0)
249
+ isFormSubject: !!((_c = tempOrder.holder) == null ? void 0 : _c.type) && tempOrder.holder.type === "form",
250
+ orderTotalAmount: Number(((_d = tempOrder == null ? void 0 : tempOrder.summary) == null ? void 0 : _d.total_amount) || 0)
285
251
  });
286
252
  if (result == null ? void 0 : result.productList) {
287
253
  tempOrder.products = result.productList;
288
254
  }
289
255
  if (result == null ? void 0 : result.discountList) {
290
256
  OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
291
- (_f = this.store.discount) == null ? void 0 : _f.setDiscountList(result.discountList);
257
+ (_e = this.store.discount) == null ? void 0 : _e.setDiscountList(result.discountList);
292
258
  tempOrder.discount_list = result.discountList.filter((d) => d.isSelected);
293
259
  }
294
260
  }
@@ -350,6 +316,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
350
316
  this.persistTempOrder();
351
317
  return newOrder;
352
318
  }
319
+ restoreOrder() {
320
+ const freshTempOrder = this.createDefaultTempOrderInstance();
321
+ this.store.tempOrder = freshTempOrder;
322
+ this.persistTempOrder();
323
+ return freshTempOrder;
324
+ }
353
325
  getTempOrder() {
354
326
  return this.store.tempOrder;
355
327
  }
@@ -410,6 +382,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
410
382
  this.persistTempOrder();
411
383
  return tempOrder.note;
412
384
  }
385
+ updateTempOrderBuzzer(buzzer) {
386
+ const tempOrder = this.ensureTempOrder();
387
+ tempOrder.buzzer = String(buzzer || "");
388
+ this.persistTempOrder();
389
+ return tempOrder.buzzer;
390
+ }
413
391
  updateTempOrderContactsInfo(contactsInfo) {
414
392
  const tempOrder = this.ensureTempOrder();
415
393
  tempOrder.contacts_info = Array.isArray(contactsInfo) ? contactsInfo : [];
@@ -490,7 +468,12 @@ var OrderModule = class extends import_BaseModule.BaseModule {
490
468
  const effectiveCacheId = (params == null ? void 0 : params.cacheId) ?? this.cacheId;
491
469
  const payload = (0, import_utils.buildSubmitPayload)({
492
470
  tempOrder,
493
- cacheId: effectiveCacheId
471
+ cacheId: effectiveCacheId,
472
+ platform: params == null ? void 0 : params.platform,
473
+ businessCode: params == null ? void 0 : params.businessCode,
474
+ channel: params == null ? void 0 : params.channel,
475
+ type: params == null ? void 0 : params.type,
476
+ enhance: params == null ? void 0 : params.enhancePayload
494
477
  });
495
478
  let result;
496
479
  if (tempOrder.order_id) {
@@ -733,6 +716,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
733
716
  };
734
717
  return this.request.put(fetchUrl, requestBody);
735
718
  }
719
+ // TODO 获取详情的接口
720
+ async getOrderInfoByRemote(order_id) {
721
+ const res = await this.request.get(`/order/sales/${order_id}`, {
722
+ with: ["products", "scheduleEvents"]
723
+ });
724
+ if (res.code === 200 && this.store.tempOrder) {
725
+ this.store.tempOrder.lastOrderInfo = res.data;
726
+ }
727
+ return res;
728
+ }
729
+ getLastOrderInfo() {
730
+ var _a, _b;
731
+ return (_b = (_a = this.store) == null ? void 0 : _a.tempOrder) == null ? void 0 : _b.lastOrderInfo;
732
+ }
736
733
  };
737
734
  // Annotate the CommonJS export names for ESM import in node:
738
735
  0 && (module.exports = {
@@ -3,6 +3,7 @@ import type { ScanOrderTempOrder, ScanOrderOrderProduct, ScanOrderOrderProductId
3
3
  import type { DiscountModule } from '../Discount';
4
4
  import type { RulesModule } from '../Rules';
5
5
  import type { Discount } from '../Discount/types';
6
+ import type { SubmitPayloadEnhancer } from './utils';
6
7
  export declare enum OrderHooks {
7
8
  OnOrderCreate = "order:onOrderCreate",
8
9
  OnOrderUpdate = "order:onOrderUpdate",
@@ -68,10 +69,12 @@ export interface SubmitScanOrderBooking {
68
69
  start_time?: string;
69
70
  end_time?: string;
70
71
  metadata?: Record<string, any>;
72
+ resources?: Array<Record<string, any>>;
73
+ product_uid?: string;
71
74
  }
72
75
  export interface SubmitScanOrderFormRecord {
73
76
  form_id: number | string;
74
- form_record_ids: Array<number | string>;
77
+ form_record_id: number | string;
75
78
  }
76
79
  export interface SubmitScanOrderParams {
77
80
  url?: string;
@@ -107,6 +110,8 @@ export interface SubmitScanOrderParams {
107
110
  shop_discount: string;
108
111
  surcharge_fee: string;
109
112
  note: string;
113
+ delivery_type?: string;
114
+ table_number?: Record<string, any>;
110
115
  schedule_date: string;
111
116
  created_at?: string;
112
117
  products: SubmitScanOrderProduct[];
@@ -195,12 +200,14 @@ export interface OrderModuleAPI {
195
200
  getTempOrder: () => ScanOrderTempOrder | null;
196
201
  ensureTempOrder: () => ScanOrderTempOrder;
197
202
  addNewOrder: () => Promise<ScanOrderTempOrder>;
203
+ restoreOrder: () => ScanOrderTempOrder;
198
204
  getOrderProducts: () => ScanOrderOrderProduct[];
199
205
  getScanOrderSummary: () => Promise<ScanOrderSummary>;
200
206
  recalculateSummary: (options?: {
201
207
  createIfMissing?: boolean;
202
208
  }) => Promise<ScanOrderSummary | null>;
203
209
  updateTempOrderNote: (note: string) => string;
210
+ updateTempOrderBuzzer: (buzzer: string) => string;
204
211
  updateTempOrderContactsInfo: (contactsInfo: any[]) => any[];
205
212
  addProductToOrder: (product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity) => Promise<ScanOrderOrderProduct[]>;
206
213
  updateProductInOrder: (params: {
@@ -212,6 +219,11 @@ export interface OrderModuleAPI {
212
219
  persistTempOrder: () => void;
213
220
  submitTempOrder: <T = any>(params?: {
214
221
  cacheId?: string;
222
+ platform?: string;
223
+ businessCode?: string;
224
+ channel?: string;
225
+ type?: string;
226
+ enhancePayload?: SubmitPayloadEnhancer;
215
227
  }) => Promise<T>;
216
228
  loadDiscountConfig: (params: {
217
229
  customerId: number;
@@ -1,5 +1,25 @@
1
1
  import { CartItem } from "../Cart";
2
2
  import type { ScanOrderSubmitPayload, ScanOrderSubmitProduct, ScanOrderSummary, ScanOrderTempOrder } from '../../solution/ScanOrder/types';
3
+ import type { RulesParamsHooks } from '../Rules/types';
4
+ /**
5
+ * OrderModule 默认 Rules 钩子工厂。
6
+ *
7
+ * 价格语义约定(订单域):
8
+ * - `selling_price`:券后单品单价(实际成交单价)。初次加购 = `original_price`;券应用后由 Rules 引擎更新。
9
+ * - `original_price`:券前单品单价(店铺售价)。不承载后台划线价语义。
10
+ * - `payment_price`:已从内部字段移除;只在出站 payload 中由 `selling_price` 派生以兼容后端。
11
+ *
12
+ * Rules 钩子契约:
13
+ * - `getProduct.total` = `selling_price × num`(当前成交总价)
14
+ * - `getProduct.origin_total` = `original_price × num`(券前总价)
15
+ * - `setProduct` 写回 `selling_price` 的优先级:
16
+ * 1. `values.main_product_selling_price`(券应用分支,per-unit 券后主价)
17
+ * 2. `values.price`(还原分支 `restoredPrice`、good_pass 归零)
18
+ * 3. `values.total / num`(仅当 Rules 只给出总价时的兜底)
19
+ *
20
+ * 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
21
+ */
22
+ export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
3
23
  /**
4
24
  * 通过 session 类商品的开始时间结束时间生成商品的时长
5
25
  * @param {CartItem} cartItem
@@ -28,14 +48,29 @@ export declare function formatDateTime(date: Date): string;
28
48
  export declare function normalizeSubmitBooking<T extends {
29
49
  metadata?: Record<string, any>;
30
50
  }>(booking: T): T;
51
+ /** 提交用人数:有限且为正则向下取整,否则为 1 */
52
+ export declare function normalizeSubmitCollectPaxValue(value: unknown): number;
53
+ /** 从临时订单 metadata 解析合成 booking 的 collect_pax */
54
+ export declare function resolveSubmitCollectPax(tempOrder: ScanOrderTempOrder): number;
31
55
  export declare function createDefaultTempOrder(params: {
32
56
  now: string;
33
57
  summary?: ScanOrderSummary;
34
58
  }): ScanOrderTempOrder;
59
+ export interface SubmitPayloadEnhancerContext {
60
+ tempOrder: ScanOrderTempOrder;
61
+ bookingUuid: string;
62
+ now: Date;
63
+ }
64
+ export type SubmitPayloadEnhancer = (payload: ScanOrderSubmitPayload, ctx: SubmitPayloadEnhancerContext) => ScanOrderSubmitPayload;
35
65
  export declare function buildSubmitPayload(params: {
36
66
  tempOrder: ScanOrderTempOrder;
37
67
  cacheId?: string;
38
68
  now?: Date;
69
+ platform?: string;
70
+ businessCode?: string;
71
+ channel?: string;
72
+ type?: string;
73
+ enhance?: SubmitPayloadEnhancer;
39
74
  }): ScanOrderSubmitPayload;
40
75
  export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
41
76
  bundle: any[];
@@ -43,7 +78,7 @@ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
43
78
  option: any[];
44
79
  product_id: number | null;
45
80
  product_variant_id: number;
46
- quantity: number;
81
+ num: number;
47
82
  rowKey: number | null;
48
83
  session: null;
49
84
  unique: string;
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  var utils_exports = {};
31
31
  __export(utils_exports, {
32
32
  buildSubmitPayload: () => buildSubmitPayload,
33
+ createDefaultOrderRulesHooks: () => createDefaultOrderRulesHooks,
33
34
  createDefaultTempOrder: () => createDefaultTempOrder,
34
35
  createEmptySummary: () => import_utils2.createEmptySummary,
35
36
  createUuidV4: () => createUuidV4,
@@ -39,12 +40,59 @@ __export(utils_exports, {
39
40
  getAllDiscountList: () => getAllDiscountList,
40
41
  isTempOrder: () => isTempOrder,
41
42
  mergeRelationForms: () => mergeRelationForms,
42
- normalizeSubmitBooking: () => normalizeSubmitBooking
43
+ normalizeSubmitBooking: () => normalizeSubmitBooking,
44
+ normalizeSubmitCollectPaxValue: () => normalizeSubmitCollectPaxValue,
45
+ resolveSubmitCollectPax: () => resolveSubmitCollectPax
43
46
  });
44
47
  module.exports = __toCommonJS(utils_exports);
45
48
  var import_dayjs = __toESM(require("dayjs"));
49
+ var import_decimal = __toESM(require("decimal.js"));
46
50
  var import_utils = require("../../solution/ScanOrder/utils");
47
51
  var import_utils2 = require("../../solution/ScanOrder/utils");
52
+ function createDefaultOrderRulesHooks() {
53
+ const toUnitPriceString = (totalLike, num) => {
54
+ const effectiveNum = Number(num) > 0 ? Number(num) : 1;
55
+ return new import_decimal.default(Number(totalLike) || 0).dividedBy(effectiveNum).toDecimalPlaces(2).toString();
56
+ };
57
+ return {
58
+ getProduct: (product) => {
59
+ var _a, _b, _c, _d;
60
+ return {
61
+ id: product.product_id,
62
+ _id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
63
+ price: product.selling_price,
64
+ total: new import_decimal.default(product.selling_price || 0).times(product.num || 1).toNumber(),
65
+ origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
66
+ original_price: product.original_price,
67
+ quantity: product.num || 1,
68
+ num: product.num || 1,
69
+ discount_list: product.discount_list || [],
70
+ bundle: product.product_bundle || [],
71
+ booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
72
+ isClient: false,
73
+ isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
74
+ holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
75
+ startDate: (_d = product._origin) == null ? void 0 : _d.startDate
76
+ };
77
+ },
78
+ setProduct: (product, values) => {
79
+ const nextNum = Number(values.quantity ?? product.num ?? 1) || 1;
80
+ const nextSellingPrice = values.main_product_selling_price !== void 0 ? String(values.main_product_selling_price) : values.price !== void 0 ? String(values.price) : values.total !== void 0 ? toUnitPriceString(values.total, nextNum) : product.selling_price;
81
+ return {
82
+ ...product,
83
+ selling_price: nextSellingPrice,
84
+ original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
85
+ discount_list: values.discount_list ?? product.discount_list,
86
+ num: values.quantity ?? product.num,
87
+ product_bundle: values.bundle ?? product.product_bundle,
88
+ metadata: {
89
+ ...product.metadata || {},
90
+ ...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
91
+ }
92
+ };
93
+ }
94
+ };
95
+ }
48
96
  var generateDuration = (cartItem) => {
49
97
  const startDate = (0, import_dayjs.default)(`${cartItem.start_date} ${cartItem.start_time}`);
50
98
  const endDate = (0, import_dayjs.default)(`${cartItem.end_date} ${cartItem.end_time}`);
@@ -124,13 +172,18 @@ function normalizeSubmitProduct(product) {
124
172
  if (rawMetadata.price_breakdown) {
125
173
  cleanMetadata.price_breakdown = rawMetadata.price_breakdown;
126
174
  }
175
+ if (rawMetadata.is_rule !== void 0) {
176
+ cleanMetadata.is_rule = rawMetadata.is_rule;
177
+ }
127
178
  return {
128
179
  ...submitProduct,
129
180
  ...bookingUid ? { booking_uid: bookingUid } : {},
130
181
  product_option_item: submitProduct.product_option_item || [],
131
182
  discount_list: submitProduct.discount_list || [],
132
183
  product_bundle: submitProduct.product_bundle || [],
133
- metadata: cleanMetadata
184
+ metadata: cleanMetadata,
185
+ // 出站兼容:后端仍消费 payment_price 字段,从 selling_price(券后单价)派生。
186
+ payment_price: submitProduct.selling_price
134
187
  };
135
188
  }
136
189
  var SUBMIT_BOOKING_METADATA_WHITELIST = [
@@ -172,6 +225,14 @@ function resolveTableOccupancyDuration(tempOrder) {
172
225
  }
173
226
  return DEFAULT_TABLE_OCCUPANCY_DURATION;
174
227
  }
228
+ function normalizeSubmitCollectPaxValue(value) {
229
+ const n = Number(value);
230
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : 1;
231
+ }
232
+ function resolveSubmitCollectPax(tempOrder) {
233
+ var _a;
234
+ return normalizeSubmitCollectPaxValue((_a = tempOrder.metadata) == null ? void 0 : _a.collect_pax);
235
+ }
175
236
  function createDefaultTempOrder(params) {
176
237
  const summary = params.summary || (0, import_utils.createEmptySummary)();
177
238
  return {
@@ -221,7 +282,16 @@ function createDefaultTempOrder(params) {
221
282
  };
222
283
  }
223
284
  function buildSubmitPayload(params) {
224
- const { tempOrder, cacheId, now = /* @__PURE__ */ new Date() } = params;
285
+ const {
286
+ tempOrder,
287
+ cacheId,
288
+ now = /* @__PURE__ */ new Date(),
289
+ platform,
290
+ businessCode,
291
+ channel,
292
+ type,
293
+ enhance
294
+ } = params;
225
295
  const scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
226
296
  const summary = tempOrder.summary || (0, import_utils.createEmptySummary)();
227
297
  const relationId = tempOrder.relation_id;
@@ -231,8 +301,8 @@ function buildSubmitPayload(params) {
231
301
  const bookingDuration = resolveTableOccupancyDuration(tempOrder);
232
302
  const bookingEnd = bookingStart.add(bookingDuration, "minute");
233
303
  const bookings = relationId && tableFormId ? [{
234
- relation_id: relationId,
235
- form_id: tableFormId,
304
+ relation_id: 0,
305
+ form_id: 0,
236
306
  start_time: bookingStart.format("HH:mm"),
237
307
  start_date: bookingStart.format("YYYY-MM-DD"),
238
308
  end_time: bookingEnd.format("HH:mm"),
@@ -240,28 +310,28 @@ function buildSubmitPayload(params) {
240
310
  duration: bookingDuration,
241
311
  metadata: {
242
312
  unique_identification_number: bookingUuid,
243
- collect_pax: 1
313
+ collect_pax: resolveSubmitCollectPax(tempOrder)
244
314
  },
245
315
  select_date: bookingStart.format("YYYY-MM-DD"),
246
316
  is_all: false,
247
- "like_status": "common",
248
- "schedule_id": 0,
249
- "relation_type": "form",
250
- "number": 1
317
+ like_status: "common",
318
+ schedule_id: 0,
319
+ relation_type: "",
320
+ number: 1
251
321
  }] : tempOrder.bookings || [];
252
322
  const formRecordIds = relationId && tableFormId ? [{
253
323
  form_id: tableFormId,
254
- form_record_ids: [relationId]
324
+ form_record_id: relationId
255
325
  }] : void 0;
256
326
  const { created_at: _createdAt, summary: _summary, surcharges: _surcharges, ...tempOrderRest } = tempOrder;
257
- return {
327
+ const payload = {
258
328
  ...tempOrderRest,
259
- platform: normalizeSubmitPlatform(tempOrder.platform),
329
+ platform: normalizeSubmitPlatform(platform ?? tempOrder.platform),
260
330
  request_unique_idempotency_token: cacheId,
261
- type: tempOrder.type || "table-order",
262
- business_code: tempOrder.business_code || "table-order",
331
+ type: type ?? tempOrder.type ?? "table-order",
332
+ business_code: businessCode ?? tempOrder.business_code ?? "table-order",
263
333
  sales_channel: tempOrder.sales_channel || "my_pisel",
264
- order_sales_channel: tempOrder.order_sales_channel || "online_store",
334
+ order_sales_channel: channel ?? tempOrder.order_sales_channel ?? "online_store",
265
335
  status: tempOrder.status || "normal",
266
336
  payment_status: tempOrder.payment_status || "payment_processing",
267
337
  // shipping_status: tempOrder.shipping_status || 'unfulfilled',
@@ -282,13 +352,19 @@ function buildSubmitPayload(params) {
282
352
  contacts_info: tempOrder.contacts_info || [],
283
353
  // holder: tempOrder.holder || null,
284
354
  // summary,
285
- metadata: {
286
- ...tempOrder.metadata
287
- },
355
+ metadata: (() => {
356
+ const {
357
+ collect_pax: _collectPax,
358
+ table_occupancy_duration: _tableOccupancyDuration,
359
+ ...rest
360
+ } = tempOrder.metadata || {};
361
+ return { ...rest };
362
+ })(),
288
363
  products: (tempOrder.products || []).map(
289
364
  (product) => normalizeSubmitProduct(product)
290
365
  )
291
366
  };
367
+ return enhance ? enhance(payload, { tempOrder, bookingUuid, now }) : payload;
292
368
  }
293
369
  function formatV1Product(products) {
294
370
  return products.map((product) => {
@@ -298,7 +374,7 @@ function formatV1Product(products) {
298
374
  option: product.product_option_item,
299
375
  product_id: product.product_id,
300
376
  product_variant_id: product.product_variant_id,
301
- quantity: product.num,
377
+ num: product.num,
302
378
  rowKey: product.product_id,
303
379
  session: null,
304
380
  unique: createUuidV4()
@@ -308,6 +384,7 @@ function formatV1Product(products) {
308
384
  // Annotate the CommonJS export names for ESM import in node:
309
385
  0 && (module.exports = {
310
386
  buildSubmitPayload,
387
+ createDefaultOrderRulesHooks,
311
388
  createDefaultTempOrder,
312
389
  createEmptySummary,
313
390
  createUuidV4,
@@ -317,5 +394,7 @@ function formatV1Product(products) {
317
394
  getAllDiscountList,
318
395
  isTempOrder,
319
396
  mergeRelationForms,
320
- normalizeSubmitBooking
397
+ normalizeSubmitBooking,
398
+ normalizeSubmitCollectPaxValue,
399
+ resolveSubmitCollectPax
321
400
  });
@@ -61,7 +61,7 @@ var ProductList = class extends import_BaseModule.BaseModule {
61
61
  cacheId,
62
62
  with_schedule
63
63
  }, options) {
64
- var _a, _b;
64
+ var _a;
65
65
  let userPlugin = this.core.getPlugin("user");
66
66
  let customer_id = void 0;
67
67
  try {
@@ -97,7 +97,8 @@ var ProductList = class extends import_BaseModule.BaseModule {
97
97
  schedule_date,
98
98
  with_schedule,
99
99
  schedule_datetime,
100
- application_code: (_b = this.otherParams) == null ? void 0 : _b.channel,
100
+ // application_code: this.otherParams?.channel,
101
+ application_code: "online-store",
101
102
  is_eject: 1
102
103
  },
103
104
  { osServer: true, callback: options == null ? void 0 : options.callback, subscriberId: options == null ? void 0 : options.subscriberId, useCache: true, customToast: () => {
@@ -43,6 +43,9 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
43
43
  const query = {};
44
44
  if (params == null ? void 0 : params.channel)
45
45
  query.channel = params.channel;
46
+ if ((params == null ? void 0 : params.channel) === "online_store") {
47
+ query.channel = "online-store";
48
+ }
46
49
  const res = await this.request.get(
47
50
  "/quotation/available",
48
51
  query,
@@ -2,9 +2,10 @@ export interface SalesSummaryProduct {
2
2
  product_id: number | null;
3
3
  product_variant_id: number;
4
4
  num: number;
5
+ /** 券后单品单价(订单域成交单价),由 OrderModule 维护。 */
5
6
  selling_price: string;
7
+ /** 券前单品单价(店铺售价)。 */
6
8
  original_price: string;
7
- payment_price: string;
8
9
  tax_fee: string;
9
10
  is_charge_tax?: number;
10
11
  product_option_item?: any[];
@@ -82,7 +82,7 @@ function getBundleUnitPrice(product, useOriginal = false) {
82
82
  }
83
83
  function getUnitPaymentTotal(product) {
84
84
  const variantPrice = getVariantPrice(product);
85
- const basePrice = variantPrice || toDecimal(product.selling_price || product.payment_price);
85
+ const basePrice = variantPrice || toDecimal(product.selling_price);
86
86
  return basePrice.plus(getOptionUnitPrice(product)).plus(getBundleUnitPrice(product));
87
87
  }
88
88
  function getUnitOriginalTotal(product) {
@@ -231,7 +231,7 @@ function calculateSingleItemTax(params) {
231
231
  function getMainProductPaymentTotal(product) {
232
232
  var _a, _b, _c, _d;
233
233
  const variantPrice = getVariantPrice(product);
234
- let total = variantPrice || toDecimal(((_a = product.metadata) == null ? void 0 : _a.main_product_selling_price) ?? product.selling_price ?? product.payment_price);
234
+ let total = variantPrice || toDecimal(((_a = product.metadata) == null ? void 0 : _a.main_product_selling_price) ?? product.selling_price);
235
235
  const mainDiscountList = ((_c = (_b = product._origin) == null ? void 0 : _b.product) == null ? void 0 : _c.discount_list) || ((_d = product._origin) == null ? void 0 : _d.discount_list) || [];
236
236
  const mainDiscountAmount = getDiscountListAmount(
237
237
  mainDiscountList.filter((d) => {
@@ -46,7 +46,7 @@ export declare const formatScheduleResult: (schedule: ScheduleItem) => {
46
46
  };
47
47
  export declare const calcScheduleDateRange: (schedule: ScheduleItem) => any[];
48
48
  export declare const calcCalendarDataBySchedules: (schedules: ScheduleItem[]) => unknown[];
49
- export declare const calcMinTimeMaxTimeBySchedules: (schedules: ScheduleItem[], scheduleAllMap?: ScheduleAllMap, selectDate?: string) => {};
49
+ export declare const calcMinTimeMaxTimeBySchedules: (schedules: ScheduleItem[], scheduleAllMap?: ScheduleAllMap, selectDate?: string) => ScheduleAllMap;
50
50
  /**
51
51
  * @title: 格式化日程数据
52
52
  * @description:
@@ -27,6 +27,8 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
27
27
  private itemRuleConfigsPromise;
28
28
  private itemRulePrefillApplied;
29
29
  private itemRuleRuntimeConfig;
30
+ /** 最近一次 checkResourceAvailable 从预约规则 link 拉取的商品快照 */
31
+ private enabledReservationRuleProducts;
30
32
  private getScanOrderLoggerContext;
31
33
  private serializeError;
32
34
  private addScanOrderLog;
@@ -50,10 +52,17 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
50
52
  };
51
53
  getTempOrder(): import("./types").ScanOrderTempOrder | null;
52
54
  updateTempOrderNote(note: string): string;
55
+ setPickupReferenceMode(mode: 'counter_pickup' | 'table_service'): {
56
+ service_type: 'dine_in';
57
+ pickup_reference_mode: 'counter_pickup' | 'table_service';
58
+ };
59
+ setPickupRef(buzzer: string): string;
53
60
  private ensureTempOrder;
54
61
  addNewOrder(): Promise<import("./types").ScanOrderTempOrder>;
62
+ restoreOrder(): Promise<import("./types").ScanOrderTempOrder>;
55
63
  getOrderProducts(): ScanOrderOrderProduct[];
56
64
  getSummary(): Promise<import("./types").ScanOrderSummary>;
65
+ private buildReservationRuleEnhancer;
57
66
  submitScanOrder<T = any>(): Promise<T>;
58
67
  addProductToOrder(product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity): Promise<ScanOrderOrderProduct[]>;
59
68
  updateProductInOrder(params: {
@@ -87,4 +96,17 @@ export declare class ScanOrderImpl extends BaseModule implements Module {
87
96
  }>;
88
97
  getProductList(): Promise<any>;
89
98
  getOtherParams(): Record<string, any>;
99
+ setOtherParams(params: Record<string, any>, { cover }?: {
100
+ cover?: boolean;
101
+ }): Promise<void>;
102
+ setEntryPaxNumber(number: number): Promise<void>;
103
+ getEntryPaxNumber(): number | null;
104
+ getFulfillmentModes(): {
105
+ enablePickup: boolean;
106
+ enableTableService: boolean;
107
+ };
108
+ checkManualPickupRef(): {
109
+ enabled: boolean;
110
+ manualInputType?: string;
111
+ };
90
112
  }