@pisell/pisellos 2.3.53 → 2.3.55

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 (149) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  2. package/dist/modules/Discount/index.d.ts +1 -0
  3. package/dist/modules/Discount/index.js +40 -11
  4. package/dist/modules/Discount/types.d.ts +1 -0
  5. package/dist/modules/Holder/index.d.ts +48 -0
  6. package/dist/modules/Holder/index.js +640 -0
  7. package/dist/modules/Holder/types.d.ts +123 -0
  8. package/dist/modules/Holder/types.js +1 -0
  9. package/dist/modules/Holder/utils.d.ts +13 -0
  10. package/dist/modules/Holder/utils.js +34 -0
  11. package/dist/modules/OpenData/index.js +2 -2
  12. package/dist/modules/Order/index.d.ts +4 -2
  13. package/dist/modules/Order/index.js +66 -34
  14. package/dist/modules/Order/types.d.ts +9 -0
  15. package/dist/modules/Order/utils.d.ts +10 -0
  16. package/dist/modules/Order/utils.js +35 -3
  17. package/dist/modules/Product/types.d.ts +1 -0
  18. package/dist/modules/ProductList/index.js +34 -15
  19. package/dist/modules/Quotation/index.d.ts +1 -1
  20. package/dist/modules/Quotation/index.js +2 -2
  21. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  22. package/dist/modules/ResourcePlanner/index.js +181 -0
  23. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  24. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  25. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  26. package/dist/modules/ResourcePlanner/types.js +1 -0
  27. package/dist/modules/Rules/index.js +47 -13
  28. package/dist/modules/SalesSummary/index.js +12 -13
  29. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  30. package/dist/modules/ScanOrderLogger/index.js +15 -2
  31. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  32. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  33. package/dist/modules/Schedule/index.d.ts +3 -1
  34. package/dist/modules/Schedule/index.js +21 -16
  35. package/dist/modules/Summary/utils.js +38 -13
  36. package/dist/modules/index.d.ts +2 -0
  37. package/dist/modules/index.js +3 -1
  38. package/dist/plugins/window.d.ts +1 -0
  39. package/dist/server/index.d.ts +14 -0
  40. package/dist/server/index.js +907 -793
  41. package/dist/solution/BaseSales/index.d.ts +7 -0
  42. package/dist/solution/BaseSales/index.js +64 -42
  43. package/dist/solution/BaseSales/utils/cartPromotion.js +4 -1
  44. package/dist/solution/BookingByStep/index.d.ts +17 -2
  45. package/dist/solution/BookingByStep/index.js +294 -215
  46. package/dist/solution/BookingByStep/types.d.ts +2 -1
  47. package/dist/solution/BookingByStep/types.js +3 -1
  48. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  49. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  50. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  51. package/dist/solution/BookingTicket/index.d.ts +14 -2
  52. package/dist/solution/BookingTicket/index.js +2 -2
  53. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  54. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  55. package/dist/solution/ScanOrder/index.d.ts +26 -14
  56. package/dist/solution/ScanOrder/index.js +1142 -739
  57. package/dist/solution/ScanOrder/types.d.ts +21 -1
  58. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  59. package/dist/solution/ScanOrder/utils.js +66 -25
  60. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  61. package/dist/solution/ShopDiscount/index.js +125 -87
  62. package/dist/solution/UnifiedBookingSales/index.d.ts +179 -0
  63. package/dist/solution/UnifiedBookingSales/index.js +1892 -0
  64. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  65. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  66. package/dist/solution/VenueBooking/index.d.ts +39 -11
  67. package/dist/solution/VenueBooking/index.js +1167 -841
  68. package/dist/solution/VenueBooking/types.d.ts +3 -0
  69. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  70. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  71. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  72. package/dist/solution/index.d.ts +1 -0
  73. package/dist/solution/index.js +2 -1
  74. package/dist/types/index.d.ts +1 -0
  75. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  76. package/lib/modules/Discount/index.d.ts +1 -0
  77. package/lib/modules/Discount/index.js +9 -0
  78. package/lib/modules/Discount/types.d.ts +1 -0
  79. package/lib/modules/Holder/index.d.ts +48 -0
  80. package/lib/modules/Holder/index.js +402 -0
  81. package/lib/modules/Holder/types.d.ts +123 -0
  82. package/lib/modules/Holder/types.js +17 -0
  83. package/lib/modules/Holder/utils.d.ts +13 -0
  84. package/lib/modules/Holder/utils.js +71 -0
  85. package/lib/modules/OpenData/index.js +1 -1
  86. package/lib/modules/Order/index.d.ts +4 -2
  87. package/lib/modules/Order/index.js +30 -13
  88. package/lib/modules/Order/types.d.ts +9 -0
  89. package/lib/modules/Order/utils.d.ts +10 -0
  90. package/lib/modules/Order/utils.js +36 -5
  91. package/lib/modules/Product/types.d.ts +1 -0
  92. package/lib/modules/ProductList/index.js +48 -31
  93. package/lib/modules/Quotation/index.d.ts +1 -1
  94. package/lib/modules/Quotation/index.js +2 -2
  95. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  96. package/lib/modules/ResourcePlanner/index.js +148 -0
  97. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  98. package/lib/modules/ResourcePlanner/planner.js +933 -0
  99. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  100. package/lib/modules/ResourcePlanner/types.js +17 -0
  101. package/lib/modules/Rules/index.js +33 -16
  102. package/lib/modules/SalesSummary/index.js +6 -7
  103. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  104. package/lib/modules/ScanOrderLogger/index.js +13 -1
  105. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  106. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  107. package/lib/modules/Schedule/index.d.ts +3 -1
  108. package/lib/modules/Schedule/index.js +10 -8
  109. package/lib/modules/Summary/utils.js +21 -1
  110. package/lib/modules/index.d.ts +2 -0
  111. package/lib/modules/index.js +5 -1
  112. package/lib/plugins/window.d.ts +1 -0
  113. package/lib/server/index.d.ts +14 -0
  114. package/lib/server/index.js +72 -15
  115. package/lib/solution/BaseSales/index.d.ts +7 -0
  116. package/lib/solution/BaseSales/index.js +24 -8
  117. package/lib/solution/BaseSales/utils/cartPromotion.js +3 -0
  118. package/lib/solution/BookingByStep/index.d.ts +17 -2
  119. package/lib/solution/BookingByStep/index.js +60 -18
  120. package/lib/solution/BookingByStep/types.d.ts +2 -1
  121. package/lib/solution/BookingByStep/types.js +5 -0
  122. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  123. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  124. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  125. package/lib/solution/BookingTicket/index.d.ts +14 -2
  126. package/lib/solution/BookingTicket/index.js +10 -2
  127. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  128. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  129. package/lib/solution/ScanOrder/index.d.ts +26 -14
  130. package/lib/solution/ScanOrder/index.js +449 -182
  131. package/lib/solution/ScanOrder/types.d.ts +21 -1
  132. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  133. package/lib/solution/ScanOrder/utils.js +31 -0
  134. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  135. package/lib/solution/ShopDiscount/index.js +14 -0
  136. package/lib/solution/UnifiedBookingSales/index.d.ts +179 -0
  137. package/lib/solution/UnifiedBookingSales/index.js +1085 -0
  138. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  139. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  140. package/lib/solution/VenueBooking/index.d.ts +39 -11
  141. package/lib/solution/VenueBooking/index.js +322 -110
  142. package/lib/solution/VenueBooking/types.d.ts +3 -0
  143. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  144. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  145. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  146. package/lib/solution/index.d.ts +1 -0
  147. package/lib/solution/index.js +3 -1
  148. package/lib/types/index.d.ts +1 -0
  149. package/package.json +1 -1
@@ -0,0 +1,123 @@
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;
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 IRefreshAllFormRecordsParams {
104
+ customer_id?: number;
105
+ useCache?: boolean;
106
+ recordsUrl?: string;
107
+ num?: number;
108
+ skip?: number;
109
+ }
110
+ export interface HolderModuleAPI {
111
+ getHolderFormMap: () => HolderFormMap;
112
+ getHolderFormData: (formId: number | string) => IFormItemData | undefined;
113
+ setFormData: (formId: number | string, data: Partial<IFormItemData>) => void;
114
+ fetchFormInfo: (params: IFetchFormInfoParams) => Promise<IFormInfo | IFormInfo[]>;
115
+ fetchRecords: (params: IFetchFormRecordsParams) => Promise<IFormRecord[]>;
116
+ ensureFormData: (params: IEnsureFormDataParams) => Promise<IFormItemData>;
117
+ ensureFormByProduct: (params: IEnsureFormByProductParams) => Promise<IFormItemData | null>;
118
+ addFormRecord: (params: IAddFormRecordParams) => Promise<IFormRecord>;
119
+ appendFormRecord: (params: IAppendFormRecordParams) => IFormRecord;
120
+ removeFormRecord: (formId: number | string, formRecordId: number) => void;
121
+ clearFormData: (formId?: number | string) => void;
122
+ refreshAllFormRecords: (params?: IRefreshAllFormRecordsParams) => Promise<HolderFormMap>;
123
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { ProductData } from '../Product/types';
2
+ import { IFormItemData, IHolderConfig } from './types';
3
+ export declare function getProductHolderConfig(product?: ProductData | Record<string, any> | null): IHolderConfig | null;
4
+ export declare function getFormIdFromHolderConfig(config: IHolderConfig): number;
5
+ export declare function normalizeFormId(formId: number | string): number;
6
+ export declare function createEmptyFormItemData(): {
7
+ records: any[];
8
+ form: Record<string, any>;
9
+ };
10
+ export declare function resolveFormMetaFromHolderItem(mapKey: string, item: IFormItemData): {
11
+ form_id: string | number;
12
+ shop_id: number | string;
13
+ } | null;
@@ -0,0 +1,34 @@
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 Number(config === null || config === void 0 ? void 0 : config.resource_id);
11
+ }
12
+ export function normalizeFormId(formId) {
13
+ return Number(formId);
14
+ }
15
+ export function createEmptyFormItemData() {
16
+ return {
17
+ records: [],
18
+ form: {}
19
+ };
20
+ }
21
+ export function resolveFormMetaFromHolderItem(mapKey, item) {
22
+ var _ref, _ref2, _nestedForm$id, _nestedForm$shop_id;
23
+ var formInfo = item.form || {};
24
+ var nestedForm = formInfo.form || {};
25
+ var form_id = normalizeFormId((_ref = (_ref2 = (_nestedForm$id = nestedForm.id) !== null && _nestedForm$id !== void 0 ? _nestedForm$id : formInfo.form_id) !== null && _ref2 !== void 0 ? _ref2 : formInfo.id) !== null && _ref !== void 0 ? _ref : mapKey);
26
+ var shop_id = (_nestedForm$shop_id = nestedForm.shop_id) !== null && _nestedForm$shop_id !== void 0 ? _nestedForm$shop_id : formInfo.shop_id;
27
+ if (shop_id === undefined || shop_id === null || shop_id === '') {
28
+ return null;
29
+ }
30
+ return {
31
+ form_id: form_id,
32
+ shop_id: shop_id
33
+ };
34
+ }
@@ -105,12 +105,12 @@ export var OpenDataModule = /*#__PURE__*/function (_BaseModule) {
105
105
  key: "fetchOpenData",
106
106
  value: function () {
107
107
  var _fetchOpenData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(params) {
108
- var _this$appPlugin$getDa, _this$appPlugin;
108
+ var _this$appPlugin, _this$appPlugin$getDa;
109
109
  var getData, shopId, tenantId, headers, response, data;
110
110
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
111
111
  while (1) switch (_context2.prev = _context2.next) {
112
112
  case 0:
113
- getData = (_this$appPlugin$getDa = (_this$appPlugin = this.appPlugin).getData) === null || _this$appPlugin$getDa === void 0 ? void 0 : _this$appPlugin$getDa.call(_this$appPlugin);
113
+ getData = (_this$appPlugin = this.appPlugin) === null || _this$appPlugin === void 0 || (_this$appPlugin$getDa = _this$appPlugin.getData) === null || _this$appPlugin$getDa === void 0 ? void 0 : _this$appPlugin$getDa.call(_this$appPlugin);
114
114
  shopId = getData === null || getData === void 0 ? void 0 : getData('shop_id');
115
115
  if (shopId) {
116
116
  _context2.next = 4;
@@ -1,6 +1,6 @@
1
1
  import { Module, PisellCore, ModuleOptions } from '../../types';
2
2
  import { BaseModule } from '../BaseModule';
3
- import { OrderModuleAPI, CommitOrderParams, UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, CheckoutOrderParams, CancelOrderParams, ChangeBookingStatusParams } from './types';
3
+ import { OrderModuleAPI, CommitOrderParams, UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, CancelOrderParams, ChangeBookingStatusParams, CheckoutOrderParams } from './types';
4
4
  import { CartItem } from '../Cart/types';
5
5
  import { type SubmitPayloadEnhancer } from './utils';
6
6
  import type { OrderAmountSnapshot, AddProductBookingInput, AddProductToOrderOptions, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, ReplaceTempOrderOptions, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions, RemoveProductsFromOrderOptions } from './types';
@@ -147,6 +147,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
147
147
  isTempOrderPersistEnabled(): boolean;
148
148
  /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
149
149
  persistTempOrder(): void;
150
+ notifyTempOrderChanged(): void;
150
151
  private createDefaultTempOrderInstance;
151
152
  private createExternalSaleNumber;
152
153
  private ensureExternalSaleNumber;
@@ -486,7 +487,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
486
487
  generateIdempotencyToken(): string;
487
488
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
488
489
  createOrder(params: CommitOrderParams['query']): {
489
- type: "appointment_booking" | "virtual";
490
+ type: "virtual" | "appointment_booking";
490
491
  platform: string;
491
492
  sales_channel: string;
492
493
  order_sales_channel: string;
@@ -496,6 +497,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
496
497
  is_deposit: number;
497
498
  relation_products: any[];
498
499
  relation_forms: any[];
500
+ business_code: string | undefined;
499
501
  };
500
502
  checkBeforeSubmitOrder(params: {
501
503
  cartItems: CartItem[];
@@ -32,7 +32,7 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
32
32
  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); }
33
33
  import { BaseModule } from "../BaseModule";
34
34
  import { OrderHooks } from "./types";
35
- import { composeLinePrice, generateDuration, getAllDiscountList, mergeRelationForms, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, isTempOrder, normalizeBookingIsAll, normalizeBookingSubType, mapPaymentItemsToOrderPayments, normalizeOrderProductDiscountList, resolveEffectivePerUnitDiscount, ensureProductSku, getProductSkuOptions, normalizeProductSkuOptions, sumOptionUnitPrice, clearTempOrderHolderAssignments, getOrderProductLineUid, indexOrderProductsByUid, calculateOrderProductsDeposit, mergeOrderProductDisplayFields, resolveIsFormSubject } from "./utils";
35
+ import { composeLinePrice, generateDuration, getAllDiscountList, mergeRelationForms, ensureCartItemOriginHolder, buildSubmitPayload, createDefaultTempOrder, createDefaultOrderRulesHooks, createEmptySummary, createUuidV4, formatDateTime, isTempOrder, normalizeBookingIsAll, normalizeBookingSubType, mapPaymentItemsToOrderPayments, normalizeOrderProductDiscountList, resolveEffectivePerUnitDiscount, ensureProductSku, getProductSkuOptions, normalizeProductSkuOptions, sumOptionUnitPrice, clearTempOrderHolderAssignments, getOrderProductLineUid, indexOrderProductsByUid, calculateOrderProductsDeposit, mergeOrderProductDisplayFields, resolveIsFormSubject } from "./utils";
36
36
  import { isNormalProduct } from "../Product/utils";
37
37
  import dayjs from 'dayjs';
38
38
  import { ensureOrderPaymentNumber, mergeOrderPaymentRecord, resolveOrderPaymentIdentity } from "./payment-utils";
@@ -309,8 +309,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
309
309
  key: "initialize",
310
310
  value: function () {
311
311
  var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(core, options) {
312
- var _otherParams$rules, _otherParams$order, _otherParams$hooks;
313
- var app, otherParams;
312
+ var _appPlugin$getApp, _otherParams$rules, _otherParams$order, _otherParams$hooks;
313
+ var appPlugin, app, otherParams;
314
314
  return _regeneratorRuntime().wrap(function _callee$(_context) {
315
315
  while (1) switch (_context.prev = _context.next) {
316
316
  case 0:
@@ -326,15 +326,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
326
326
  this.store.availableWalletIds = [];
327
327
  }
328
328
  this.request = this.core.getPlugin('request');
329
- this.appPlugin = this.core.getPlugin('app');
330
- if (this.appPlugin) {
331
- _context.next = 9;
332
- break;
329
+ appPlugin = this.core.getPlugin('app');
330
+ if (!appPlugin) {
331
+ console.error('Order 模块需要 app 插件支持');
333
332
  }
334
- throw new Error('Order 模块需要 app 插件支持');
335
- case 9:
336
- app = this.appPlugin.getApp();
337
- this.logger = app.logger;
333
+ app = appPlugin === null || appPlugin === void 0 || (_appPlugin$getApp = appPlugin.getApp) === null || _appPlugin$getApp === void 0 ? void 0 : _appPlugin$getApp.call(appPlugin);
334
+ this.logger = app === null || app === void 0 ? void 0 : app.logger;
338
335
  this.window = this.core.getPlugin('window');
339
336
  otherParams = options.otherParams || {};
340
337
  this.cacheId = otherParams.cacheId;
@@ -345,7 +342,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
345
342
  this.otherParams = otherParams;
346
343
  this.registerDiscountModules(options);
347
344
  this.logInfo('OrderModule initialized successfully');
348
- case 21:
345
+ case 20:
349
346
  case "end":
350
347
  return _context.stop();
351
348
  }
@@ -1276,6 +1273,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1276
1273
  value: function persistTempOrder() {
1277
1274
  // no-op: OrderModule 的刷新恢复不再依赖 localStorage。
1278
1275
  }
1276
+ }, {
1277
+ key: "notifyTempOrderChanged",
1278
+ value: function notifyTempOrderChanged() {
1279
+ if (!this.store.tempOrder) return;
1280
+ this.store.tempOrder = _objectSpread(_objectSpread({}, this.store.tempOrder), {}, {
1281
+ products: _toConsumableArray(this.store.tempOrder.products),
1282
+ bookings: this.store.tempOrder.bookings ? _toConsumableArray(this.store.tempOrder.bookings) : []
1283
+ });
1284
+ this.persistTempOrder();
1285
+ }
1279
1286
 
1280
1287
  // ─── TempOrder: 创建 & 获取 ───
1281
1288
  }, {
@@ -3881,8 +3888,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3881
3888
  _normalizedIncoming$p2,
3882
3889
  _booking_uid,
3883
3890
  _metadata,
3891
+ _productToAdd$metadat,
3892
+ _origin,
3884
3893
  _this26 = this;
3885
- var linked, productToAdd, incomingFingerprint, normalizedIncoming, isWeighingProduct, netWeight, incomingBookingUid, hasIncomingGoodPass, hasIncomingProductNote, hasIncomingBookingUid, shouldForceNewLine, matchedIndex, matchedProduct, existedFingerprint, shouldMerge, insertAtIndex, _targetProduct$metada, targetProduct, targetUid, normalizedProduct, nextNum, targetIsManualProductDiscount, nextDiscountList, mergedProduct;
3894
+ var linked, productToAdd, incomingFingerprint, normalizedIncoming, isWeighingProduct, netWeight, incomingBookingUid, hasIncomingGoodPass, hasIncomingProductNote, hasIncomingBookingUid, isIncomingCustomItem, shouldForceNewLine, matchedIndex, matchedProduct, existedFingerprint, shouldMerge, insertAtIndex, _targetProduct$metada, targetProduct, targetUid, normalizedProduct, nextNum, targetIsManualProductDiscount, nextDiscountList, mergedProduct;
3886
3895
  return _regeneratorRuntime().wrap(function _callee20$(_context22) {
3887
3896
  while (1) switch (_context22.prev = _context22.next) {
3888
3897
  case 0:
@@ -3912,7 +3921,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3912
3921
  hasIncomingGoodPass = this.hasGoodPassDiscount(normalizedIncoming);
3913
3922
  hasIncomingProductNote = this.hasOrderProductLineNote(normalizedIncoming);
3914
3923
  hasIncomingBookingUid = this.hasLinkedBookingUid(productToAdd) || this.hasLinkedBookingUid(normalizedIncoming);
3915
- shouldForceNewLine = !!booking || hasIncomingProductNote || hasIncomingBookingUid || isWeighingProduct;
3924
+ isIncomingCustomItem = ((_productToAdd$metadat = productToAdd.metadata) === null || _productToAdd$metadat === void 0 || (_productToAdd$metadat = _productToAdd$metadat.origin) === null || _productToAdd$metadat === void 0 ? void 0 : _productToAdd$metadat.isCustomItem) === true || ((_origin = productToAdd._origin) === null || _origin === void 0 ? void 0 : _origin.isCustomItem) === true;
3925
+ shouldForceNewLine = !!booking || hasIncomingProductNote || hasIncomingBookingUid || isIncomingCustomItem || isWeighingProduct;
3916
3926
  matchedIndex = hasIncomingGoodPass || shouldForceNewLine ? -1 : tempOrder.products.findIndex(function (item) {
3917
3927
  var _item$metadata3;
3918
3928
  if (_this26.hasGoodPassDiscount(item)) return false;
@@ -3927,10 +3937,10 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3927
3937
  matchedProduct = matchedIndex === -1 ? null : tempOrder.products[matchedIndex];
3928
3938
  existedFingerprint = matchedProduct ? buildProductLineFingerprint(getProductSkuOptions(matchedProduct), matchedProduct.product_bundle) : '';
3929
3939
  if (!matchedProduct) {
3930
- _context22.next = 24;
3940
+ _context22.next = 25;
3931
3941
  break;
3932
3942
  }
3933
- _context22.next = 21;
3943
+ _context22.next = 22;
3934
3944
  return this.shouldMergeProductToOrder({
3935
3945
  incomingProduct: productToAdd,
3936
3946
  normalizedIncoming: normalizedIncoming,
@@ -3941,13 +3951,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
3941
3951
  tempOrder: tempOrder,
3942
3952
  booking: booking
3943
3953
  });
3944
- case 21:
3954
+ case 22:
3945
3955
  _context22.t0 = _context22.sent;
3946
- _context22.next = 25;
3956
+ _context22.next = 26;
3947
3957
  break;
3948
- case 24:
3949
- _context22.t0 = false;
3950
3958
  case 25:
3959
+ _context22.t0 = false;
3960
+ case 26:
3951
3961
  shouldMerge = _context22.t0;
3952
3962
  if (matchedIndex === -1 || !matchedProduct || !shouldMerge) {
3953
3963
  this.captureProductRuntime(tempOrder, productToAdd, normalizedIncoming);
@@ -4008,7 +4018,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
4008
4018
  if (linked) {
4009
4019
  tempOrder.bookings = [].concat(_toConsumableArray(tempOrder.bookings || []), [linked.booking]);
4010
4020
  }
4011
- case 28:
4021
+ case 29:
4012
4022
  case "end":
4013
4023
  return _context22.stop();
4014
4024
  }
@@ -5334,7 +5344,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5334
5344
  var _syncPaymentsToOrder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(params) {
5335
5345
  var _this31 = this,
5336
5346
  _params$confirmPendin;
5337
- var tempOrder, needsPaymentNumber, devicePrefix, mappedPayments, shouldConfirmPendingVoucherPayments, effectivePayments, completion, orderPaidPaymentTotal, paymentStatus, paymentSyncIdempotencyToken, submitResult;
5347
+ var tempOrder, needsPaymentNumber, devicePrefix, mappedPayments, shouldConfirmPendingVoucherPayments, effectivePayments, completion, orderPaidPaymentTotal, paymentStatus, paymentSyncIdempotencyToken, submitParams, submitResult;
5338
5348
  return _regeneratorRuntime().wrap(function _callee36$(_context39) {
5339
5349
  while (1) switch (_context39.prev = _context39.next) {
5340
5350
  case 0:
@@ -5387,8 +5397,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5387
5397
  case 25:
5388
5398
  this.store.syncState = 'submitting';
5389
5399
  paymentSyncIdempotencyToken = this.buildPaymentSyncIdempotencyToken(tempOrder, effectivePayments);
5390
- _context39.next = 29;
5391
- return this.submitTempOrder({
5400
+ submitParams = {
5392
5401
  payments: effectivePayments,
5393
5402
  paymentStatus: paymentStatus,
5394
5403
  smallTicketDataFlag: params.smallTicketDataFlag,
@@ -5401,13 +5410,28 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5401
5410
  });
5402
5411
  return nextPayload;
5403
5412
  }
5404
- });
5405
- case 29:
5406
- submitResult = _context39.sent;
5413
+ };
5414
+ if (!(params.checkoutSyncTaskEnabled === false)) {
5415
+ _context39.next = 34;
5416
+ break;
5417
+ }
5418
+ _context39.next = 31;
5419
+ return this.submitTempOrderAsync(submitParams);
5420
+ case 31:
5421
+ _context39.t1 = _context39.sent;
5422
+ _context39.next = 37;
5423
+ break;
5424
+ case 34:
5425
+ _context39.next = 36;
5426
+ return this.submitTempOrder(submitParams);
5427
+ case 36:
5428
+ _context39.t1 = _context39.sent;
5429
+ case 37:
5430
+ submitResult = _context39.t1;
5407
5431
  return _context39.abrupt("return", _objectSpread(_objectSpread({}, completion), {}, {
5408
5432
  submitResult: submitResult
5409
5433
  }));
5410
- case 31:
5434
+ case 39:
5411
5435
  case "end":
5412
5436
  return _context39.stop();
5413
5437
  }
@@ -5421,6 +5445,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5421
5445
  }, {
5422
5446
  key: "createOrder",
5423
5447
  value: function createOrder(params) {
5448
+ var _this32 = this;
5424
5449
  var order = _objectSpread({
5425
5450
  type: (params === null || params === void 0 ? void 0 : params.type) || 'appointment_booking',
5426
5451
  // 要从外面拿,virtual
@@ -5432,11 +5457,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5432
5457
  schedule_date: '',
5433
5458
  is_deposit: 0,
5434
5459
  relation_products: [],
5435
- relation_forms: []
5460
+ relation_forms: [],
5461
+ business_code: params === null || params === void 0 ? void 0 : params.business_code
5436
5462
  }, (params === null || params === void 0 ? void 0 : params.extraData) || {});
5437
5463
  var is_deposit = 0; // 是否存在定金,0 不存在,1 存在
5438
5464
  if (params.cartItems.length > 0) {
5439
5465
  params.cartItems.forEach(function (item) {
5466
+ var _params$extraData;
5440
5467
  if (!item._origin.duration) {
5441
5468
  var _generateDuration = generateDuration(item),
5442
5469
  duration = _generateDuration.duration,
@@ -5448,6 +5475,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5448
5475
  var discountList = getAllDiscountList(item);
5449
5476
  item._origin.product.discount_list = discountList;
5450
5477
 
5478
+ // 为预约补齐 holder 信息
5479
+ if (params !== null && params !== void 0 && (_params$extraData = params.extraData) !== null && _params$extraData !== void 0 && _params$extraData.is_add_holder_info) {
5480
+ ensureCartItemOriginHolder(item, _this32.window);
5481
+ }
5482
+
5451
5483
  // 购物车是否为普通商品
5452
5484
  if (isNormalProduct(item._origin)) {
5453
5485
  var _order$relation_forms;
@@ -6105,7 +6137,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6105
6137
  }, {
6106
6138
  key: "normalizeTempOrderForRuntime",
6107
6139
  value: function normalizeTempOrderForRuntime(raw, options) {
6108
- var _this32 = this;
6140
+ var _this33 = this;
6109
6141
  var runtimeRaw = this.withoutSyntheticDraftOrderIdForRuntime(raw);
6110
6142
  var nextTempOrder = _objectSpread(_objectSpread({}, this.createDefaultTempOrderInstance()), runtimeRaw || {});
6111
6143
  // ES 列表详情使用 id 表示订单主键;OS 详情态统一依赖 order_id 驱动操作按钮。
@@ -6129,12 +6161,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6129
6161
  nextTempOrder.holder = raw.holder && _typeof(raw.holder) === 'object' ? _objectSpread({}, raw.holder) : null;
6130
6162
  var rawProducts = Array.isArray(raw.products) ? raw.products : [];
6131
6163
  nextTempOrder.products = rawProducts.length > 0 ? rawProducts.map(function (p) {
6132
- return _this32.normalizeHydratedOrderProduct(p, {
6164
+ return _this33.normalizeHydratedOrderProduct(p, {
6133
6165
  makeEditMark: options === null || options === void 0 ? void 0 : options.makeEditMark
6134
6166
  });
6135
6167
  }) : [];
6136
6168
  nextTempOrder.bookings = Array.isArray(raw.bookings) ? raw.bookings.map(function (b) {
6137
- var booking = _this32.normalizeHydratedBookingHolder(b || {});
6169
+ var booking = _this33.normalizeHydratedBookingHolder(b || {});
6138
6170
  return _objectSpread(_objectSpread({}, booking), {}, {
6139
6171
  is_all: normalizeBookingIsAll(booking),
6140
6172
  sub_type: normalizeBookingSubType(booking)
@@ -6321,7 +6353,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6321
6353
  }, {
6322
6354
  key: "normalizeHydratedOrderProduct",
6323
6355
  value: function normalizeHydratedOrderProduct(product, options) {
6324
- var _this33 = this;
6356
+ var _this34 = this;
6325
6357
  var row = _objectSpread({}, product || {});
6326
6358
  if (row.num === undefined && row.product_quantity !== undefined) {
6327
6359
  row.num = row.product_quantity;
@@ -6329,7 +6361,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6329
6361
  var productSku = ensureProductSku(row);
6330
6362
  row.product_sku = _objectSpread(_objectSpread({}, productSku), {}, {
6331
6363
  option: normalizeProductSkuOptions(productSku.option.map(function (optionItem) {
6332
- return _this33.normalizeHydratedProductOptionItem(optionItem || {});
6364
+ return _this34.normalizeHydratedProductOptionItem(optionItem || {});
6333
6365
  }))
6334
6366
  });
6335
6367
  delete row["product_".concat('option', "_item")];
@@ -414,6 +414,7 @@ export interface CommitOrderParams {
414
414
  type: 'virtual' | 'appointment_booking';
415
415
  platform?: string;
416
416
  extraData?: Record<string, any>;
417
+ business_code?: string;
417
418
  };
418
419
  }
419
420
  export interface OrderSubmitBooking {
@@ -589,6 +590,12 @@ export interface SyncPaymentsToOrderParams {
589
590
  payments: OrderPaymentSource[];
590
591
  paymentStatus?: SubmitSalesOrderParams['query']['payment_status'];
591
592
  submitWhenPaid?: boolean;
593
+ /**
594
+ * Whether the checkout should be queued as the local `sync_sales` task.
595
+ * Defaults to true to preserve the WebPOS retry path. Set to false when
596
+ * the caller must wait for the cloud checkout response before proceeding.
597
+ */
598
+ checkoutSyncTaskEnabled?: boolean;
592
599
  smallTicketDataFlag?: number;
593
600
  businessCode?: string;
594
601
  channel?: string;
@@ -751,6 +758,8 @@ export interface OrderModuleAPI {
751
758
  setEnableTempOrderPersist: (enabled: boolean) => void;
752
759
  /** 是否允许 saveDraft 写入 IndexedDB 草稿。 */
753
760
  isTempOrderPersistEnabled: () => boolean;
761
+ /** 提交 tempOrder 变更并触发 `{moduleName}:changed` 事件 */
762
+ notifyTempOrderChanged: () => void;
754
763
  submitTempOrder: <T = any>(params?: {
755
764
  cacheId?: string;
756
765
  platform?: string;
@@ -15,6 +15,7 @@ export interface OrderProductsDepositSummary {
15
15
  deposit_policy_ids: number[];
16
16
  hasDeposit: boolean;
17
17
  }
18
+ import type { WindowPlugin } from '../../plugins';
18
19
  /**
19
20
  * 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
20
21
  *
@@ -177,6 +178,15 @@ export declare const mergeRelationForms: (relationForms: {
177
178
  form_id: number;
178
179
  form_record_ids: number[];
179
180
  }[];
181
+ export interface CartOrderHolder {
182
+ customer_id?: number;
183
+ form_id: number | string;
184
+ form_record: (number | string)[] | null;
185
+ }
186
+ /**
187
+ * 为购物车行补齐订单所需的 holder 信息(与 cartAccount 结构保持一致)
188
+ */
189
+ export declare function ensureCartItemOriginHolder(cartItem: CartItem, window?: WindowPlugin): void;
180
190
  export declare const getAllDiscountList: (cartItem: CartItem) => any;
181
191
  export { createUuidV4 };
182
192
  export declare function isTempOrder(data: any): data is OrderTempOrder;
@@ -20,6 +20,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
20
20
  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; }
21
21
  import dayjs from "dayjs";
22
22
  import Decimal from 'decimal.js';
23
+ import { getProductHolderConfig } from "../Holder/utils";
23
24
  import { buildProductLineFingerprint, createEmptySummary } from "../../solution/ScanOrder/utils";
24
25
  import { createUuidV4 } from "./utils/orderCollectionIdentity";
25
26
  /**
@@ -744,10 +745,41 @@ export var mergeRelationForms = function mergeRelationForms(relationForms) {
744
745
  return item.form_record_ids.length > 0;
745
746
  }); // 过滤掉没有有效记录的表单
746
747
  };
748
+ function getCustomerIdFromStorage(window) {
749
+ try {
750
+ var _window$getLocalStora;
751
+ var customer = JSON.parse((window === null || window === void 0 || (_window$getLocalStora = window.getLocalStorage) === null || _window$getLocalStora === void 0 ? void 0 : _window$getLocalStora.call(window, 'customer')) || '{}');
752
+ var customerId = Number(customer === null || customer === void 0 ? void 0 : customer.id);
753
+ return Number.isFinite(customerId) && customerId > 0 ? customerId : undefined;
754
+ } catch (_unused) {
755
+ return undefined;
756
+ }
757
+ }
758
+
759
+ /**
760
+ * 为购物车行补齐订单所需的 holder 信息(与 cartAccount 结构保持一致)
761
+ */
762
+ export function ensureCartItemOriginHolder(cartItem, window) {
763
+ var _cartItem$_origin, _cartItem$_productIni;
764
+ if (cartItem !== null && cartItem !== void 0 && (_cartItem$_origin = cartItem._origin) !== null && _cartItem$_origin !== void 0 && _cartItem$_origin.holder) {
765
+ return;
766
+ }
767
+ 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);
768
+ var formRecordId = cartItem === null || cartItem === void 0 ? void 0 : cartItem.holder_id;
769
+ if (!(holderConfig !== null && holderConfig !== void 0 && holderConfig.resource_id) || formRecordId == null) {
770
+ return;
771
+ }
772
+ cartItem._origin.holder = {
773
+ customer_id: getCustomerIdFromStorage(window),
774
+ form_id: holderConfig.resource_id,
775
+ form_record: [formRecordId]
776
+ };
777
+ }
778
+ ;
747
779
  export var getAllDiscountList = function getAllDiscountList(cartItem) {
748
- var _cartItem$_origin, _cartItem$_origin2;
749
- 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) || [];
750
- ((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) {
780
+ var _cartItem$_origin2, _cartItem$_origin3;
781
+ 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) || [];
782
+ ((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) {
751
783
  discountList = [].concat(_toConsumableArray(discountList), _toConsumableArray((item === null || item === void 0 ? void 0 : item.discount_list) || []));
752
784
  item.discount_list = undefined;
753
785
  });
@@ -193,6 +193,7 @@ export interface ProductData {
193
193
  status?: string;
194
194
  required?: number | string | boolean;
195
195
  resource_id?: number | string | null;
196
+ [key: string]: any;
196
197
  };
197
198
  /** 组合商品id,动态附加 */
198
199
  product_variant_id?: number;