@pisell/pisellos 0.0.547 → 0.0.551

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 (48) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  2. package/dist/modules/Holder/index.d.ts +42 -0
  3. package/dist/modules/Holder/index.js +500 -0
  4. package/dist/modules/Holder/types.d.ts +115 -0
  5. package/dist/modules/Holder/types.js +1 -0
  6. package/dist/modules/Holder/utils.d.ts +9 -0
  7. package/dist/modules/Holder/utils.js +20 -0
  8. package/dist/modules/Order/index.d.ts +1 -0
  9. package/dist/modules/Order/index.js +14 -1
  10. package/dist/modules/Order/types.d.ts +2 -0
  11. package/dist/modules/Order/utils.d.ts +9 -0
  12. package/dist/modules/Order/utils.js +41 -13
  13. package/dist/modules/Product/types.d.ts +7 -0
  14. package/dist/modules/index.d.ts +1 -0
  15. package/dist/modules/index.js +2 -1
  16. package/dist/plugins/window.d.ts +1 -0
  17. package/dist/solution/BookingByStep/index.d.ts +11 -2
  18. package/dist/solution/BookingByStep/index.js +35 -2
  19. package/dist/solution/BookingByStep/types.d.ts +2 -1
  20. package/dist/solution/BookingByStep/types.js +3 -1
  21. package/dist/solution/VenueBooking/index.d.ts +17 -0
  22. package/dist/solution/VenueBooking/index.js +932 -717
  23. package/dist/solution/VenueBooking/types.d.ts +2 -0
  24. package/dist/types/index.d.ts +1 -0
  25. package/lib/modules/Holder/index.d.ts +42 -0
  26. package/lib/modules/Holder/index.js +329 -0
  27. package/lib/modules/Holder/types.d.ts +115 -0
  28. package/lib/modules/Holder/types.js +17 -0
  29. package/lib/modules/Holder/utils.d.ts +9 -0
  30. package/lib/modules/Holder/utils.js +57 -0
  31. package/lib/modules/Order/index.d.ts +1 -0
  32. package/lib/modules/Order/index.js +11 -0
  33. package/lib/modules/Order/types.d.ts +2 -0
  34. package/lib/modules/Order/utils.d.ts +9 -0
  35. package/lib/modules/Order/utils.js +32 -5
  36. package/lib/modules/Product/types.d.ts +7 -0
  37. package/lib/modules/index.d.ts +1 -0
  38. package/lib/modules/index.js +3 -1
  39. package/lib/plugins/window.d.ts +1 -0
  40. package/lib/solution/BookingByStep/index.d.ts +11 -2
  41. package/lib/solution/BookingByStep/index.js +27 -0
  42. package/lib/solution/BookingByStep/types.d.ts +2 -1
  43. package/lib/solution/BookingByStep/types.js +5 -0
  44. package/lib/solution/VenueBooking/index.d.ts +17 -0
  45. package/lib/solution/VenueBooking/index.js +114 -6
  46. package/lib/solution/VenueBooking/types.d.ts +2 -0
  47. package/lib/types/index.d.ts +1 -0
  48. package/package.json +2 -2
@@ -0,0 +1,115 @@
1
+ import { ProductData } from '../Product/types';
2
+ /**
3
+ * 商品 holder 配置
4
+ */
5
+ export interface IHolderConfig {
6
+ required?: number;
7
+ resource_id: number;
8
+ status?: string;
9
+ [key: string]: any;
10
+ }
11
+ /**
12
+ * 表单记录
13
+ */
14
+ export interface IFormRecord {
15
+ form_id: number;
16
+ form_record_id: number;
17
+ main_field: string;
18
+ customer_cover?: string;
19
+ created_at?: string;
20
+ customer_id?: number;
21
+ [key: string]: any;
22
+ }
23
+ /**
24
+ * 表单配置/定义
25
+ */
26
+ export interface IFormInfo {
27
+ form_id: number;
28
+ name: string;
29
+ fields?: Record<string, any>[];
30
+ [key: string]: any;
31
+ }
32
+ /**
33
+ * 单个 form_id 下的数据结构
34
+ */
35
+ export interface IFormItemData {
36
+ records: IFormRecord[];
37
+ form: IFormInfo | Record<string, any>;
38
+ }
39
+ /**
40
+ * form_id 为 key 的 map 结构,如 948: { records: [], form: {} }
41
+ */
42
+ export type HolderFormMap = Record<string, IFormItemData>;
43
+ /**
44
+ * Holder 模块 reactive store,仅 holderMap 会触发 changed 事件
45
+ */
46
+ export interface HolderState {
47
+ holderMap: HolderFormMap;
48
+ }
49
+ export interface IFetchFormInfoParams {
50
+ url?: string;
51
+ query: {
52
+ form_id: string | number;
53
+ };
54
+ useCache?: boolean;
55
+ }
56
+ export interface IFetchFormRecordsParams {
57
+ url?: string;
58
+ query: {
59
+ customer_id?: number;
60
+ form_id: string | number;
61
+ shop_id: string | number;
62
+ num?: number;
63
+ skip?: number;
64
+ [key: string]: any;
65
+ };
66
+ useCache?: boolean;
67
+ }
68
+ export interface IAddFormRecordParams {
69
+ url?: string;
70
+ body: {
71
+ form_id: number | string;
72
+ shop_id: number | string;
73
+ customer_id?: number;
74
+ [key: string]: any;
75
+ };
76
+ }
77
+ /**
78
+ * UI 层自行调用添加接口后,将返回记录写入 holderMap
79
+ */
80
+ export interface IAppendFormRecordParams {
81
+ /** 接口返回的 data,或完整响应 { data: {...} } */
82
+ record: IFormRecord | Record<string, any>;
83
+ /** 可选,未传则从 record.form_id 读取 */
84
+ form_id?: number | string;
85
+ }
86
+ export interface IEnsureFormDataParams {
87
+ form_id: number | string;
88
+ shop_id: number | string;
89
+ customer_id?: number;
90
+ useCache?: boolean;
91
+ forceRefresh?: boolean;
92
+ formInfoUrl?: string;
93
+ recordsUrl?: string;
94
+ skip?: number;
95
+ num?: number;
96
+ }
97
+ export interface IEnsureFormByProductParams {
98
+ product: ProductData | Record<string, any>;
99
+ customer_id?: number;
100
+ shop_id?: number | string;
101
+ useCache?: boolean;
102
+ }
103
+ export interface HolderModuleAPI {
104
+ getHolderFormMap: () => HolderFormMap;
105
+ getHolderFormData: (formId: number | string) => IFormItemData | undefined;
106
+ setFormData: (formId: number | string, data: Partial<IFormItemData>) => void;
107
+ fetchFormInfo: (params: IFetchFormInfoParams) => Promise<IFormInfo | IFormInfo[]>;
108
+ fetchRecords: (params: IFetchFormRecordsParams) => Promise<IFormRecord[]>;
109
+ ensureFormData: (params: IEnsureFormDataParams) => Promise<IFormItemData>;
110
+ ensureFormByProduct: (params: IEnsureFormByProductParams) => Promise<IFormItemData | null>;
111
+ addFormRecord: (params: IAddFormRecordParams) => Promise<IFormRecord>;
112
+ appendFormRecord: (params: IAppendFormRecordParams) => IFormRecord;
113
+ removeFormRecord: (formId: number | string, formRecordId: number) => void;
114
+ clearFormData: (formId?: number | string) => void;
115
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ProductData } from '../Product/types';
2
+ import { IHolderConfig } from './types';
3
+ export declare function getProductHolderConfig(product?: ProductData | Record<string, any> | null): IHolderConfig | null;
4
+ export declare function getFormIdFromHolderConfig(config: IHolderConfig): string;
5
+ export declare function normalizeFormId(formId: number | string): string;
6
+ export declare function createEmptyFormItemData(): {
7
+ records: any[];
8
+ form: Record<string, any>;
9
+ };
@@ -0,0 +1,20 @@
1
+ export function getProductHolderConfig(product) {
2
+ var _product$holder_confi, _product$origin;
3
+ if (!product) return null;
4
+ var config = (_product$holder_confi = product === null || product === void 0 ? void 0 : product.holder_config) !== null && _product$holder_confi !== void 0 ? _product$holder_confi : product === null || product === void 0 || (_product$origin = product.origin) === null || _product$origin === void 0 ? void 0 : _product$origin.holder_config;
5
+ if (config !== null && config !== void 0 && config.status && (config === null || config === void 0 ? void 0 : config.status) !== 'enable') return null;
6
+ if (!(config !== null && config !== void 0 && config.resource_id)) return null;
7
+ return config;
8
+ }
9
+ export function getFormIdFromHolderConfig(config) {
10
+ return String(config === null || config === void 0 ? void 0 : config.resource_id);
11
+ }
12
+ export function normalizeFormId(formId) {
13
+ return String(formId);
14
+ }
15
+ export function createEmptyFormItemData() {
16
+ return {
17
+ records: [],
18
+ form: {}
19
+ };
20
+ }
@@ -57,6 +57,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
57
57
  private getTempOrderStorageKey;
58
58
  private restoreTempOrderFromStorage;
59
59
  persistTempOrder(): void;
60
+ notifyTempOrderChanged(): void;
60
61
  private createDefaultTempOrderInstance;
61
62
  ensureTempOrder(): ScanOrderTempOrder;
62
63
  restoreOrder(): ScanOrderTempOrder;
@@ -25,7 +25,7 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
25
25
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
26
26
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
27
  import { BaseModule } from "../BaseModule";
28
- import { generateDuration, getAllDiscountList, mergeRelationForms, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, filterProductsForScanOrderMore, isTempOrder } from "./utils";
28
+ import { generateDuration, getAllDiscountList, mergeRelationForms, ensureCartItemOriginHolder, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, filterProductsForScanOrderMore, isTempOrder } from "./utils";
29
29
  import { isNormalProduct } from "../Product/utils";
30
30
  import dayjs from 'dayjs';
31
31
  import { buildProductLineFingerprint, getProductIdentityIndex, getSafeProductNum, isIdentityMatch, normalizeOrderProduct } from "../../solution/ScanOrder/utils";
@@ -438,6 +438,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
438
438
  if (!this.window) return;
439
439
  this.window.localStorage.setItem(key, JSON.stringify(this.store.tempOrder));
440
440
  }
441
+ }, {
442
+ key: "notifyTempOrderChanged",
443
+ value: function notifyTempOrderChanged() {
444
+ if (!this.store.tempOrder) return;
445
+ this.store.tempOrder = _objectSpread(_objectSpread({}, this.store.tempOrder), {}, {
446
+ products: _toConsumableArray(this.store.tempOrder.products),
447
+ bookings: this.store.tempOrder.bookings ? _toConsumableArray(this.store.tempOrder.bookings) : []
448
+ });
449
+ this.persistTempOrder();
450
+ }
441
451
 
442
452
  // ─── TempOrder: 创建 & 获取 ───
443
453
  }, {
@@ -886,6 +896,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
886
896
  var discountList = getAllDiscountList(item);
887
897
  item._origin.product.discount_list = discountList;
888
898
 
899
+ // 为预约补齐 holder 信息
900
+ ensureCartItemOriginHolder(item);
901
+
889
902
  // 购物车是否为普通商品
890
903
  if (isNormalProduct(item._origin)) {
891
904
  var _order$relation_forms;
@@ -235,6 +235,8 @@ export interface OrderModuleAPI {
235
235
  updateProductInOrder: (params: UpdateProductInOrderParams) => Promise<ScanOrderOrderProduct[]>;
236
236
  removeProductFromOrder: (identity: ScanOrderOrderProductIdentity) => Promise<ScanOrderOrderProduct[]>;
237
237
  persistTempOrder: () => void;
238
+ /** 提交 tempOrder 变更并触发 `{moduleName}:changed` 事件 */
239
+ notifyTempOrderChanged: () => void;
238
240
  submitTempOrder: <T = any>(params?: {
239
241
  cacheId?: string;
240
242
  platform?: string;
@@ -86,6 +86,15 @@ export declare const mergeRelationForms: (relationForms: {
86
86
  form_id: number;
87
87
  form_record_ids: number[];
88
88
  }[];
89
+ export interface CartOrderHolder {
90
+ customer_id?: number;
91
+ form_id: number | string;
92
+ form_record: (number | string)[] | null;
93
+ }
94
+ /**
95
+ * 为购物车行补齐订单所需的 holder 信息(与 cartAccount 结构保持一致)
96
+ */
97
+ export declare function ensureCartItemOriginHolder(cartItem: CartItem): void;
89
98
  export declare const getAllDiscountList: (cartItem: CartItem) => any;
90
99
  export declare function createUuidV4(): string;
91
100
  export declare function isTempOrder(data: any): data is ScanOrderTempOrder;
@@ -18,6 +18,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
18
18
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
19
19
  import dayjs from "dayjs";
20
20
  import Decimal from 'decimal.js';
21
+ import { getProductHolderConfig } from "../Holder/utils";
21
22
  import { buildProductLineFingerprint, createEmptySummary } from "../../solution/ScanOrder/utils";
22
23
  /**
23
24
  * 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
@@ -259,10 +260,37 @@ export var mergeRelationForms = function mergeRelationForms(relationForms) {
259
260
  return item.form_record_ids.length > 0;
260
261
  }); // 过滤掉没有有效记录的表单
261
262
  };
263
+ function resolveCartItemHolderCustomerId(cartItem) {
264
+ var _origin$metadata, _ref5, _origin$holder$custom, _origin$holder, _account$_origin;
265
+ var origin = cartItem._origin;
266
+ var account = origin === null || origin === void 0 || (_origin$metadata = origin.metadata) === null || _origin$metadata === void 0 ? void 0 : _origin$metadata.account;
267
+ return (_ref5 = (_origin$holder$custom = origin === null || origin === void 0 || (_origin$holder = origin.holder) === null || _origin$holder === void 0 ? void 0 : _origin$holder.customer_id) !== null && _origin$holder$custom !== void 0 ? _origin$holder$custom : account === null || account === void 0 || (_account$_origin = account._origin) === null || _account$_origin === void 0 ? void 0 : _account$_origin.customer_id) !== null && _ref5 !== void 0 ? _ref5 : account === null || account === void 0 ? void 0 : account.customer_id;
268
+ }
269
+
270
+ /**
271
+ * 为购物车行补齐订单所需的 holder 信息(与 cartAccount 结构保持一致)
272
+ */
273
+ export function ensureCartItemOriginHolder(cartItem) {
274
+ var _cartItem$_origin, _cartItem$_productIni;
275
+ if (cartItem !== null && cartItem !== void 0 && (_cartItem$_origin = cartItem._origin) !== null && _cartItem$_origin !== void 0 && _cartItem$_origin.holder) {
276
+ return;
277
+ }
278
+ var holderConfig = getProductHolderConfig((_cartItem$_productIni = cartItem === null || cartItem === void 0 ? void 0 : cartItem._productInit) !== null && _cartItem$_productIni !== void 0 ? _cartItem$_productIni : cartItem === null || cartItem === void 0 ? void 0 : cartItem._productOrigin);
279
+ var formRecordId = cartItem === null || cartItem === void 0 ? void 0 : cartItem.holder_id;
280
+ if (!(holderConfig !== null && holderConfig !== void 0 && holderConfig.resource_id) || formRecordId == null) {
281
+ return;
282
+ }
283
+ cartItem._origin.holder = {
284
+ customer_id: resolveCartItemHolderCustomerId(cartItem),
285
+ form_id: holderConfig.resource_id,
286
+ form_record: [formRecordId]
287
+ };
288
+ }
289
+ ;
262
290
  export var getAllDiscountList = function getAllDiscountList(cartItem) {
263
- var _cartItem$_origin, _cartItem$_origin2;
264
- var discountList = (cartItem === null || cartItem === void 0 || (_cartItem$_origin = cartItem._origin) === null || _cartItem$_origin === void 0 || (_cartItem$_origin = _cartItem$_origin.product) === null || _cartItem$_origin === void 0 ? void 0 : _cartItem$_origin.discount_list) || [];
265
- ((cartItem === null || cartItem === void 0 || (_cartItem$_origin2 = cartItem._origin) === null || _cartItem$_origin2 === void 0 || (_cartItem$_origin2 = _cartItem$_origin2.product) === null || _cartItem$_origin2 === void 0 ? void 0 : _cartItem$_origin2.product_bundle) || []).forEach(function (item) {
291
+ var _cartItem$_origin2, _cartItem$_origin3;
292
+ var discountList = (cartItem === null || cartItem === void 0 || (_cartItem$_origin2 = cartItem._origin) === null || _cartItem$_origin2 === void 0 || (_cartItem$_origin2 = _cartItem$_origin2.product) === null || _cartItem$_origin2 === void 0 ? void 0 : _cartItem$_origin2.discount_list) || [];
293
+ ((cartItem === null || cartItem === void 0 || (_cartItem$_origin3 = cartItem._origin) === null || _cartItem$_origin3 === void 0 || (_cartItem$_origin3 = _cartItem$_origin3.product) === null || _cartItem$_origin3 === void 0 ? void 0 : _cartItem$_origin3.product_bundle) || []).forEach(function (item) {
266
294
  discountList = [].concat(_toConsumableArray(discountList), _toConsumableArray((item === null || item === void 0 ? void 0 : item.discount_list) || []));
267
295
  item.discount_list = undefined;
268
296
  });
@@ -334,7 +362,7 @@ function toBundleCustomPriceString(value) {
334
362
  function formatSubmitBundleItems(bundle) {
335
363
  if (!Array.isArray(bundle)) return [];
336
364
  return bundle.map(function (b) {
337
- var _rawBundle$bundle_sel, _rawBundle$price_type, _rawBundle$surcharge_, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$extension_, _rawBundle$extension_2, _rawBundle$price_type2, _ref5, _rawBundle$custom_pri;
365
+ var _rawBundle$bundle_sel, _rawBundle$price_type, _rawBundle$surcharge_, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$extension_, _rawBundle$extension_2, _rawBundle$price_type2, _ref6, _rawBundle$custom_pri;
338
366
  var rawBundle = b && _typeof(b) === 'object' ? b : {};
339
367
  var existedMetadata = rawBundle.metadata && _typeof(rawBundle.metadata) === 'object' ? rawBundle.metadata : {};
340
368
  var sellingPriceNum = toBundleNumber((_rawBundle$bundle_sel = rawBundle.bundle_selling_price) !== null && _rawBundle$bundle_sel !== void 0 ? _rawBundle$bundle_sel : rawBundle.price, 0);
@@ -358,7 +386,7 @@ function formatSubmitBundleItems(bundle) {
358
386
  price_type: priceType,
359
387
  price_type_ext: (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : '',
360
388
  // custom_price: customPriceStr,
361
- custom_price_type: (_ref5 = (_rawBundle$custom_pri = rawBundle.custom_price_type) !== null && _rawBundle$custom_pri !== void 0 ? _rawBundle$custom_pri : priceType) !== null && _ref5 !== void 0 ? _ref5 : '',
389
+ custom_price_type: (_ref6 = (_rawBundle$custom_pri = rawBundle.custom_price_type) !== null && _rawBundle$custom_pri !== void 0 ? _rawBundle$custom_pri : priceType) !== null && _ref6 !== void 0 ? _ref6 : '',
362
390
  bundle_selling_price: sellingPriceNum,
363
391
  option: formatSubmitOptionItems(rawBundle.option),
364
392
  bundle_group_id: rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.group_id,
@@ -520,7 +548,7 @@ export function createDefaultTempOrder(params) {
520
548
  };
521
549
  }
522
550
  export function buildSubmitPayload(params) {
523
- var _ref6, _ref7, _ref8, _tempOrder$is_price_i, _tempOrder$is_deposit;
551
+ var _ref7, _ref8, _ref9, _tempOrder$is_price_i, _tempOrder$is_deposit;
524
552
  var tempOrder = params.tempOrder,
525
553
  cacheId = params.cacheId,
526
554
  _params$now = params.now,
@@ -568,10 +596,10 @@ export function buildSubmitPayload(params) {
568
596
  var payload = _objectSpread(_objectSpread({}, tempOrderRest), {}, {
569
597
  platform: normalizeSubmitPlatform(platform !== null && platform !== void 0 ? platform : tempOrder.platform),
570
598
  request_unique_idempotency_token: cacheId,
571
- type: (_ref6 = type !== null && type !== void 0 ? type : tempOrder.type) !== null && _ref6 !== void 0 ? _ref6 : 'table-order',
572
- business_code: (_ref7 = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code) !== null && _ref7 !== void 0 ? _ref7 : 'table-order',
599
+ type: (_ref7 = type !== null && type !== void 0 ? type : tempOrder.type) !== null && _ref7 !== void 0 ? _ref7 : 'table-order',
600
+ business_code: (_ref8 = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code) !== null && _ref8 !== void 0 ? _ref8 : 'table-order',
573
601
  sales_channel: tempOrder.sales_channel || 'my_pisel',
574
- order_sales_channel: (_ref8 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref8 !== void 0 ? _ref8 : 'online_store',
602
+ order_sales_channel: (_ref9 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref9 !== void 0 ? _ref9 : 'online_store',
575
603
  status: tempOrder.status || 'normal',
576
604
  payment_status: tempOrder.payment_status || 'payment_processing',
577
605
  // shipping_status: tempOrder.shipping_status || 'unfulfilled',
@@ -595,10 +623,10 @@ export function buildSubmitPayload(params) {
595
623
  // holder: tempOrder.holder || null,
596
624
  // summary,
597
625
  metadata: function () {
598
- var _ref9 = tempOrder.metadata || {},
599
- _collectPax = _ref9.collect_pax,
600
- _tableOccupancyDuration = _ref9.table_occupancy_duration,
601
- rest = _objectWithoutProperties(_ref9, _excluded3);
626
+ var _ref10 = tempOrder.metadata || {},
627
+ _collectPax = _ref10.collect_pax,
628
+ _tableOccupancyDuration = _ref10.table_occupancy_duration,
629
+ rest = _objectWithoutProperties(_ref10, _excluded3);
602
630
  return _objectSpread({}, rest);
603
631
  }(),
604
632
  products: (tempOrder.products || []).map(function (product) {
@@ -210,6 +210,13 @@ export interface ProductData {
210
210
  option_group_count: number;
211
211
  /** 服务时长 */
212
212
  service_times?: any;
213
+ /** holder 表单配置 */
214
+ holder_config?: {
215
+ required?: number;
216
+ resource_id?: number;
217
+ status?: string;
218
+ [key: string]: any;
219
+ };
213
220
  }
214
221
  /**
215
222
  * 商品媒体信息接口
@@ -16,3 +16,4 @@ export * from './Schedule';
16
16
  export * from './Quotation';
17
17
  export * from './ScanOrderLogger';
18
18
  export * from './OpenData';
19
+ export * from './Holder';
@@ -15,4 +15,5 @@ export * from "./SalesSummary";
15
15
  export * from "./Schedule";
16
16
  export * from "./Quotation";
17
17
  export * from "./ScanOrderLogger";
18
- export * from "./OpenData";
18
+ export * from "./OpenData";
19
+ export * from "./Holder";
@@ -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 接口实现
@@ -10,6 +10,7 @@ import { ITime } from '../../modules/Date/types';
10
10
  import dayjs from 'dayjs';
11
11
  import { LoadScheduleAvailableDateParams } from '../../modules/Schedule/types';
12
12
  import { IHolder, IFetchHolderAccountsParams } from '../../modules/AccountList/types';
13
+ import { IAppendFormRecordParams } from '../../modules/Holder/types';
13
14
  export declare class BookingByStepImpl extends BaseModule implements Module {
14
15
  protected defaultName: string;
15
16
  protected defaultVersion: string;
@@ -126,6 +127,14 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
126
127
  * @param params
127
128
  */
128
129
  fetchHolderAccountsAsync(params: IFetchHolderAccountsParams): Promise<void>;
130
+ /**
131
+ * 获取 holder 表单 map
132
+ */
133
+ getHolderFormMap(): import("../../modules").HolderFormMap;
134
+ /**
135
+ * 添加表单记录
136
+ */
137
+ appendFormRecord(params: IAppendFormRecordParams): import("../../modules").IFormRecord;
129
138
  setDateRange(dateRange: ITime[]): Promise<void>;
130
139
  clearDateRange(): void;
131
140
  getDateRange(): Promise<ITime[]>;
@@ -311,7 +320,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
311
320
  date: string;
312
321
  status: string;
313
322
  week: string;
314
- weekNum: 0 | 1 | 4 | 2 | 3 | 5 | 6;
323
+ weekNum: 0 | 1 | 2 | 3 | 4 | 5 | 6;
315
324
  }[]>;
316
325
  submitTimeSlot(timeSlots: TimeSliceItem): void;
317
326
  private getScheduleDataByIds;
@@ -358,7 +367,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
358
367
  };
359
368
  setOtherData(key: string, value: any): void;
360
369
  getOtherData(key: string): any;
361
- getProductTypeById(id: number): Promise<"normal" | "duration" | "session">;
370
+ getProductTypeById(id: number): Promise<"duration" | "session" | "normal">;
362
371
  /**
363
372
  * 提供给 UI 的方法,减轻 UI 层的计算压力,UI 层只需要传递 cartItemId 和 resourceCode 即返回对应的 renderList
364
373
  *
@@ -118,7 +118,7 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
118
118
  this.otherData = ((_data$this$otherParam = data[this.otherParams.cacheId]) === null || _data$this$otherParam === void 0 || (_data$this$otherParam = _data$this$otherParam[this.name]) === null || _data$this$otherParam === void 0 ? void 0 : _data$this$otherParam['otherData']) || {};
119
119
  }
120
120
  }
121
- moduleArr = ['accountList', 'cart', 'schedule', 'summary', 'step', 'products', 'date', 'order'];
121
+ moduleArr = ['accountList', 'holder', 'cart', 'schedule', 'summary', 'step', 'products', 'date', 'order'];
122
122
  moduleArr.forEach(function (step) {
123
123
  var targetModule = createModule(step, _this2.name);
124
124
  if (targetModule) {
@@ -644,8 +644,27 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
644
644
  return _fetchHolderAccountsAsync.apply(this, arguments);
645
645
  }
646
646
  return fetchHolderAccountsAsync;
647
- }() // 设置日期范围,注入到日期模块中
647
+ }()
648
+ /**
649
+ * 获取 holder 表单 map
650
+ */
648
651
  )
652
+ }, {
653
+ key: "getHolderFormMap",
654
+ value: function getHolderFormMap() {
655
+ return this.store.holder.getHolderFormMap();
656
+ }
657
+
658
+ /**
659
+ * 添加表单记录
660
+ */
661
+ }, {
662
+ key: "appendFormRecord",
663
+ value: function appendFormRecord(params) {
664
+ return this.store.holder.appendFormRecord(params);
665
+ }
666
+
667
+ // 设置日期范围,注入到日期模块中
649
668
  }, {
650
669
  key: "setDateRange",
651
670
  value: function () {
@@ -1193,6 +1212,20 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
1193
1212
  account = activeAccount;
1194
1213
  }
1195
1214
  }
1215
+ try {
1216
+ var _this$window, _this$window$getLocal;
1217
+ var customer = JSON.parse(((_this$window = this.window) === null || _this$window === void 0 || (_this$window$getLocal = _this$window.getLocalStorage) === null || _this$window$getLocal === void 0 ? void 0 : _this$window$getLocal.call(_this$window, 'customer')) || '{}');
1218
+ if (customer !== null && customer !== void 0 && customer.id) {
1219
+ this.store.holder.ensureFormByProduct({
1220
+ product: productData,
1221
+ customer_id: Number(customer.id),
1222
+ shop_id: (productData === null || productData === void 0 ? void 0 : productData.shop_id) || '',
1223
+ useCache: true
1224
+ });
1225
+ }
1226
+ } catch (error) {
1227
+ console.error('[BookingByStep] 加载 holder 表单失败', error);
1228
+ }
1196
1229
  var flag = this.store.cart.mergeCartItemByRowKey({
1197
1230
  rowKey: rowKey,
1198
1231
  quantity: quantity,
@@ -1,4 +1,4 @@
1
- import { ProductList, CartModule, ProductData, AccountModule, AccountListModule, DateModule, GuestListModule, OrderModule, PaymentModule, ResourceListModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule } from '../../modules';
1
+ import { ProductList, CartModule, ProductData, AccountModule, AccountListModule, DateModule, GuestListModule, OrderModule, PaymentModule, ResourceListModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule, HolderModule } from '../../modules';
2
2
  export interface BookingByStepState {
3
3
  cart: CartModule;
4
4
  summary: SummaryModule;
@@ -16,6 +16,7 @@ export interface BookingByStepState {
16
16
  schedule: ScheduleModule;
17
17
  salesSummary?: SalesSummaryModule;
18
18
  scanOrderLogger?: ScanOrderLoggerModule;
19
+ holder: HolderModule;
19
20
  }
20
21
  export declare function createModule<T extends keyof BookingByStepState>(moduleName: T, solutionName: string, name?: string, version?: string): BookingByStepState[T];
21
22
  export declare enum BookingByStepHooks {
@@ -1,4 +1,4 @@
1
- import { ProductList, CartModule, AccountListModule, DateModule, OrderModule, PaymentModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule } from "../../modules";
1
+ import { ProductList, CartModule, AccountListModule, DateModule, OrderModule, PaymentModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule, HolderModule } from "../../modules";
2
2
  export function createModule(moduleName, solutionName, name, version) {
3
3
  switch (moduleName) {
4
4
  case 'cart':
@@ -23,6 +23,8 @@ export function createModule(moduleName, solutionName, name, version) {
23
23
  return new ScheduleModule("".concat(solutionName, "_").concat(name || moduleName), version);
24
24
  case 'scanOrderLogger':
25
25
  return new ScanOrderLoggerModule("".concat(solutionName, "_").concat(name || moduleName), version);
26
+ case 'holder':
27
+ return new HolderModule("".concat(solutionName, "_").concat(name || moduleName), version);
26
28
  default:
27
29
  throw new Error("Unknown module type: ".concat(moduleName));
28
30
  }
@@ -7,6 +7,7 @@ import type { OpenDataAvailabilityResult } from '../../modules/OpenData';
7
7
  import type { ProductData } from '../../modules/Product/types';
8
8
  import { type CartItemSummary, type PaxInfo, type QuantityCheckResult, type QuantityLimitResult } from '../../model/strategy/adapter/itemRule';
9
9
  import type { StrategyConfig } from '../../model/strategy/type';
10
+ import type { IAppendFormRecordParams } from '../../modules/Holder/types';
10
11
  export * from './types';
11
12
  interface VenueBookingItemRuleRuntimeConfig {
12
13
  strategyConfigs?: StrategyConfig[];
@@ -52,6 +53,13 @@ export declare class VenueBookingImpl extends BaseModule implements Module {
52
53
  constructor(name?: string, version?: string);
53
54
  private normalizeCustomerId;
54
55
  private resolveCustomerIdFromLoginPayload;
56
+ private resolveHolderCustomerId;
57
+ private ensureProductHolderForm;
58
+ /**
59
+ * 按商品 holder_config 预加载表单数据到 holderMap。
60
+ * appointment_booking 在加购时触发;venueBooking 在商品加载后预加载,避免 getHolderFormMap 为空。
61
+ */
62
+ private preloadHolderForms;
55
63
  private clearLoginEffectListeners;
56
64
  private registerLoginEffect;
57
65
  private registerCustomerLoginListeners;
@@ -193,6 +201,15 @@ export declare class VenueBookingImpl extends BaseModule implements Module {
193
201
  setUIState(key: string, value: any): void;
194
202
  getUIState<T = any>(key: string): T | undefined;
195
203
  deleteUIState(key: string): void;
204
+ setBookingHolder(bookingUid: string, holder: any): void;
205
+ /**
206
+ * 获取 holder 表单 map
207
+ */
208
+ getHolderFormMap(): import("../../modules/Holder").HolderFormMap;
209
+ /**
210
+ * 添加表单记录
211
+ */
212
+ appendFormRecord(params: IAppendFormRecordParams): import("../../modules/Holder").IFormRecord;
196
213
  checkOpenDataAvailability(): Promise<OpenDataAvailabilityResult>;
197
214
  setOtherParams(params: Record<string, any>, { cover }?: {
198
215
  cover?: boolean;