@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,17 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+
15
+ // src/modules/Holder/types.ts
16
+ var types_exports = {};
17
+ module.exports = __toCommonJS(types_exports);
@@ -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,71 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/modules/Holder/utils.ts
20
+ var utils_exports = {};
21
+ __export(utils_exports, {
22
+ createEmptyFormItemData: () => createEmptyFormItemData,
23
+ getFormIdFromHolderConfig: () => getFormIdFromHolderConfig,
24
+ getProductHolderConfig: () => getProductHolderConfig,
25
+ normalizeFormId: () => normalizeFormId,
26
+ resolveFormMetaFromHolderItem: () => resolveFormMetaFromHolderItem
27
+ });
28
+ module.exports = __toCommonJS(utils_exports);
29
+ function getProductHolderConfig(product) {
30
+ var _a;
31
+ if (!product)
32
+ return null;
33
+ const config = (product == null ? void 0 : product.holder_config) ?? ((_a = product == null ? void 0 : product.origin) == null ? void 0 : _a.holder_config);
34
+ if ((config == null ? void 0 : config.status) && (config == null ? void 0 : config.status) !== "enable")
35
+ return null;
36
+ if (!(config == null ? void 0 : config.resource_id))
37
+ return null;
38
+ return config;
39
+ }
40
+ function getFormIdFromHolderConfig(config) {
41
+ return Number(config == null ? void 0 : config.resource_id);
42
+ }
43
+ function normalizeFormId(formId) {
44
+ return Number(formId);
45
+ }
46
+ function createEmptyFormItemData() {
47
+ return {
48
+ records: [],
49
+ form: {}
50
+ };
51
+ }
52
+ function resolveFormMetaFromHolderItem(mapKey, item) {
53
+ const formInfo = item.form || {};
54
+ const nestedForm = formInfo.form || {};
55
+ const form_id = normalizeFormId(
56
+ nestedForm.id ?? formInfo.form_id ?? formInfo.id ?? mapKey
57
+ );
58
+ const shop_id = nestedForm.shop_id ?? formInfo.shop_id;
59
+ if (shop_id === void 0 || shop_id === null || shop_id === "") {
60
+ return null;
61
+ }
62
+ return { form_id, shop_id };
63
+ }
64
+ // Annotate the CommonJS export names for ESM import in node:
65
+ 0 && (module.exports = {
66
+ createEmptyFormItemData,
67
+ getFormIdFromHolderConfig,
68
+ getProductHolderConfig,
69
+ normalizeFormId,
70
+ resolveFormMetaFromHolderItem
71
+ });
@@ -73,7 +73,7 @@ var OpenDataModule = class extends import_BaseModule.BaseModule {
73
73
  }
74
74
  async fetchOpenData(params) {
75
75
  var _a, _b;
76
- const getData = (_b = (_a = this.appPlugin).getData) == null ? void 0 : _b.call(_a);
76
+ const getData = (_b = (_a = this.appPlugin) == null ? void 0 : _a.getData) == null ? void 0 : _b.call(_a);
77
77
  const shopId = getData == null ? void 0 : getData("shop_id");
78
78
  if (!shopId)
79
79
  throw new Error("[OpenDataModule] 无法获取 shop_id");
@@ -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[];
@@ -328,7 +328,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
328
328
  });
329
329
  }
330
330
  async initialize(core, options) {
331
- var _a, _b, _c;
331
+ var _a, _b, _c, _d;
332
332
  this.core = core;
333
333
  this.store = options.store;
334
334
  if (!this.store.tempOrder) {
@@ -341,19 +341,19 @@ var OrderModule = class extends import_BaseModule.BaseModule {
341
341
  this.store.availableWalletIds = [];
342
342
  }
343
343
  this.request = this.core.getPlugin("request");
344
- this.appPlugin = this.core.getPlugin("app");
345
- if (!this.appPlugin) {
346
- throw new Error("Order 模块需要 app 插件支持");
344
+ const appPlugin = this.core.getPlugin("app");
345
+ if (!appPlugin) {
346
+ console.error("Order 模块需要 app 插件支持");
347
347
  }
348
- const app = this.appPlugin.getApp();
349
- this.logger = app.logger;
348
+ const app = (_a = appPlugin == null ? void 0 : appPlugin.getApp) == null ? void 0 : _a.call(appPlugin);
349
+ this.logger = app == null ? void 0 : app.logger;
350
350
  this.window = this.core.getPlugin("window");
351
351
  const otherParams = options.otherParams || {};
352
352
  this.cacheId = otherParams.cacheId;
353
353
  this.salesSummaryModuleName = otherParams.salesSummaryModuleName;
354
- this.rulesHooksOverride = (_a = otherParams.rules) == null ? void 0 : _a.hooks;
354
+ this.rulesHooksOverride = (_b = otherParams.rules) == null ? void 0 : _b.hooks;
355
355
  this.moduleHooksOverride = options.hooks;
356
- this.orderHooks = this.moduleHooksOverride || ((_b = otherParams.order) == null ? void 0 : _b.hooks) || ((_c = otherParams.hooks) == null ? void 0 : _c.order);
356
+ this.orderHooks = this.moduleHooksOverride || ((_c = otherParams.order) == null ? void 0 : _c.hooks) || ((_d = otherParams.hooks) == null ? void 0 : _d.order);
357
357
  this.otherParams = otherParams;
358
358
  this.registerDiscountModules(options);
359
359
  this.logInfo("OrderModule initialized successfully");
@@ -880,6 +880,16 @@ var OrderModule = class extends import_BaseModule.BaseModule {
880
880
  /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
881
881
  persistTempOrder() {
882
882
  }
883
+ notifyTempOrderChanged() {
884
+ if (!this.store.tempOrder)
885
+ return;
886
+ this.store.tempOrder = {
887
+ ...this.store.tempOrder,
888
+ products: [...this.store.tempOrder.products],
889
+ bookings: this.store.tempOrder.bookings ? [...this.store.tempOrder.bookings] : []
890
+ };
891
+ this.persistTempOrder();
892
+ }
883
893
  // ─── TempOrder: 创建 & 获取 ───
884
894
  createDefaultTempOrderInstance() {
885
895
  return (0, import_utils.createDefaultTempOrder)({
@@ -2888,7 +2898,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2888
2898
  * await this.appendProductLineToTempOrder(tempOrder, { product_id: 1, num: 1 }, booking);
2889
2899
  */
2890
2900
  async appendProductLineToTempOrder(tempOrder, product, booking, options) {
2891
- var _a, _b, _c, _d;
2901
+ var _a, _b, _c, _d, _e, _f, _g;
2892
2902
  const linked = booking ? this.createLinkedProductAndBooking({ product, booking }) : null;
2893
2903
  const productToAdd = (linked == null ? void 0 : linked.product) || product;
2894
2904
  const incomingFingerprint = (0, import_utils3.buildProductLineFingerprint)(
@@ -2920,7 +2930,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2920
2930
  );
2921
2931
  const hasIncomingProductNote = this.hasOrderProductLineNote(normalizedIncoming);
2922
2932
  const hasIncomingBookingUid = this.hasLinkedBookingUid(productToAdd) || this.hasLinkedBookingUid(normalizedIncoming);
2923
- const shouldForceNewLine = !!booking || hasIncomingProductNote || hasIncomingBookingUid || isWeighingProduct;
2933
+ const isIncomingCustomItem = ((_e = (_d = productToAdd.metadata) == null ? void 0 : _d.origin) == null ? void 0 : _e.isCustomItem) === true || ((_f = productToAdd._origin) == null ? void 0 : _f.isCustomItem) === true;
2934
+ const shouldForceNewLine = !!booking || hasIncomingProductNote || hasIncomingBookingUid || isIncomingCustomItem || isWeighingProduct;
2924
2935
  const matchedIndex = hasIncomingGoodPass || shouldForceNewLine ? -1 : tempOrder.products.findIndex((item) => {
2925
2936
  var _a2;
2926
2937
  if (this.hasGoodPassDiscount(item))
@@ -2981,7 +2992,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
2981
2992
  }
2982
2993
  } else {
2983
2994
  const targetProduct = matchedProduct;
2984
- const targetUid = (_d = targetProduct.metadata) == null ? void 0 : _d.unique_identification_number;
2995
+ const targetUid = (_g = targetProduct.metadata) == null ? void 0 : _g.unique_identification_number;
2985
2996
  const normalizedProduct = (0, import_utils.mergeOrderProductDisplayFields)(
2986
2997
  targetProduct,
2987
2998
  (0, import_utils3.normalizeOrderProduct)({
@@ -3985,7 +3996,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
3985
3996
  tempOrder,
3986
3997
  effectivePayments
3987
3998
  );
3988
- const submitResult = await this.submitTempOrder({
3999
+ const submitParams = {
3989
4000
  payments: effectivePayments,
3990
4001
  paymentStatus,
3991
4002
  smallTicketDataFlag: params.smallTicketDataFlag,
@@ -3999,7 +4010,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
3999
4010
  };
4000
4011
  return nextPayload;
4001
4012
  }
4002
- });
4013
+ };
4014
+ const submitResult = params.checkoutSyncTaskEnabled === false ? await this.submitTempOrderAsync(submitParams) : await this.submitTempOrder(submitParams);
4003
4015
  return { ...completion, submitResult };
4004
4016
  }
4005
4017
  createOrder(params) {
@@ -4016,11 +4028,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
4016
4028
  is_deposit: 0,
4017
4029
  relation_products: [],
4018
4030
  relation_forms: [],
4031
+ business_code: params == null ? void 0 : params.business_code,
4019
4032
  ...(params == null ? void 0 : params.extraData) || {}
4020
4033
  };
4021
4034
  let is_deposit = 0;
4022
4035
  if (params.cartItems.length > 0) {
4023
4036
  params.cartItems.forEach((item) => {
4037
+ var _a2;
4024
4038
  if (!item._origin.duration) {
4025
4039
  const { duration, durationType } = (0, import_utils.generateDuration)(item);
4026
4040
  item._origin.duration = duration;
@@ -4029,6 +4043,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
4029
4043
  item._origin.sub_type = (0, import_utils.normalizeBookingSubType)(item._origin);
4030
4044
  const discountList = (0, import_utils.getAllDiscountList)(item);
4031
4045
  item._origin.product.discount_list = discountList;
4046
+ if ((_a2 = params == null ? void 0 : params.extraData) == null ? void 0 : _a2.is_add_holder_info) {
4047
+ (0, import_utils.ensureCartItemOriginHolder)(item, this.window);
4048
+ }
4032
4049
  if ((0, import_utils2.isNormalProduct)(item._origin)) {
4033
4050
  order.relation_products.push(item._origin.product);
4034
4051
  const relationForms = item._origin.relation_forms || [];
@@ -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;
@@ -36,8 +36,9 @@ __export(utils_exports, {
36
36
  composeLinePrice: () => composeLinePrice,
37
37
  createDefaultOrderRulesHooks: () => createDefaultOrderRulesHooks,
38
38
  createDefaultTempOrder: () => createDefaultTempOrder,
39
- createEmptySummary: () => import_utils2.createEmptySummary,
39
+ createEmptySummary: () => import_utils3.createEmptySummary,
40
40
  createUuidV4: () => import_orderCollectionIdentity.createUuidV4,
41
+ ensureCartItemOriginHolder: () => ensureCartItemOriginHolder,
41
42
  ensureManualProductDiscountList: () => import_manualProductDiscount.ensureManualProductDiscountList,
42
43
  ensureProductSku: () => ensureProductSku,
43
44
  findManualProductDiscountItem: () => import_manualProductDiscount.findManualProductDiscountItem,
@@ -85,9 +86,10 @@ __export(utils_exports, {
85
86
  module.exports = __toCommonJS(utils_exports);
86
87
  var import_dayjs = __toESM(require("dayjs"));
87
88
  var import_decimal = __toESM(require("decimal.js"));
88
- var import_utils = require("../../solution/ScanOrder/utils");
89
- var import_orderCollectionIdentity = require("./utils/orderCollectionIdentity");
89
+ var import_utils = require("../Holder/utils");
90
90
  var import_utils2 = require("../../solution/ScanOrder/utils");
91
+ var import_orderCollectionIdentity = require("./utils/orderCollectionIdentity");
92
+ var import_utils3 = require("../../solution/ScanOrder/utils");
91
93
  var import_manualProductDiscount = require("./utils/manualProductDiscount");
92
94
  function composeLinePrice(params) {
93
95
  const { mainPrice, bundle, useOriginalBundle } = params;
@@ -546,7 +548,7 @@ function createDefaultOrderRulesHooks() {
546
548
  // 否则同 SKU 不同小料会在 calcDiscount 重组时互相覆盖。
547
549
  // 不透明 identity 契约下,normalizeOrderProduct / hydrate 已保证唯一值存在;
548
550
  // 留 fingerprint 分支仅作 Rules 单测里直接传裸 product 时的兜底。
549
- _id: ((_a = product.metadata) == null ? void 0 : _a.unique_identification_number) ? `${product.product_id}_${product.product_variant_id}_${product.metadata.unique_identification_number}` : `${product.product_id}_${product.product_variant_id}_${(0, import_utils.buildProductLineFingerprint)(
551
+ _id: ((_a = product.metadata) == null ? void 0 : _a.unique_identification_number) ? `${product.product_id}_${product.product_variant_id}_${product.metadata.unique_identification_number}` : `${product.product_id}_${product.product_variant_id}_${(0, import_utils2.buildProductLineFingerprint)(
550
552
  getProductSkuOptions(product),
551
553
  product.product_bundle
552
554
  )}`,
@@ -638,6 +640,34 @@ var mergeRelationForms = (relationForms) => {
638
640
  }, {})
639
641
  ).filter((item) => item.form_record_ids.length > 0);
640
642
  };
643
+ function getCustomerIdFromStorage(window) {
644
+ var _a;
645
+ try {
646
+ const customer = JSON.parse(((_a = window == null ? void 0 : window.getLocalStorage) == null ? void 0 : _a.call(window, "customer")) || "{}");
647
+ const customerId = Number(customer == null ? void 0 : customer.id);
648
+ return Number.isFinite(customerId) && customerId > 0 ? customerId : void 0;
649
+ } catch {
650
+ return void 0;
651
+ }
652
+ }
653
+ function ensureCartItemOriginHolder(cartItem, window) {
654
+ var _a;
655
+ if ((_a = cartItem == null ? void 0 : cartItem._origin) == null ? void 0 : _a.holder) {
656
+ return;
657
+ }
658
+ const holderConfig = (0, import_utils.getProductHolderConfig)(
659
+ (cartItem == null ? void 0 : cartItem._productInit) ?? (cartItem == null ? void 0 : cartItem._productOrigin)
660
+ );
661
+ const formRecordId = cartItem == null ? void 0 : cartItem.holder_id;
662
+ if (!(holderConfig == null ? void 0 : holderConfig.resource_id) || formRecordId == null) {
663
+ return;
664
+ }
665
+ cartItem._origin.holder = {
666
+ customer_id: getCustomerIdFromStorage(window),
667
+ form_id: holderConfig.resource_id,
668
+ form_record: [formRecordId]
669
+ };
670
+ }
641
671
  var getAllDiscountList = (cartItem) => {
642
672
  var _a, _b, _c, _d;
643
673
  let discountList = ((_b = (_a = cartItem == null ? void 0 : cartItem._origin) == null ? void 0 : _a.product) == null ? void 0 : _b.discount_list) || [];
@@ -1003,7 +1033,7 @@ function buildSubmitPayload(params) {
1003
1033
  // contacts: tempOrder.contacts || [],
1004
1034
  contacts_info: tempOrder.contacts_info && !Array.isArray(tempOrder.contacts_info) ? tempOrder.contacts_info : null,
1005
1035
  // holder: tempOrder.holder || null,
1006
- summary: summary || tempOrder.summary || (0, import_utils.createEmptySummary)(),
1036
+ summary: summary || tempOrder.summary || (0, import_utils2.createEmptySummary)(),
1007
1037
  metadata: (() => {
1008
1038
  const {
1009
1039
  collect_pax: _collectPax,
@@ -1252,6 +1282,7 @@ function indexOrderProductsByUid(products) {
1252
1282
  createDefaultTempOrder,
1253
1283
  createEmptySummary,
1254
1284
  createUuidV4,
1285
+ ensureCartItemOriginHolder,
1255
1286
  ensureManualProductDiscountList,
1256
1287
  ensureProductSku,
1257
1288
  findManualProductDiscountItem,
@@ -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;
@@ -106,39 +106,56 @@ var ProductList = class extends import_BaseModule.BaseModule {
106
106
  } catch (error) {
107
107
  console.error(error);
108
108
  }
109
+ const channelMap = {
110
+ online_store: "online-store",
111
+ scan_to_order: "online-store",
112
+ "scan-to-order": "online-store",
113
+ scan_to_order_2: "mobile_order",
114
+ scan_to_order_3: "scantoorder3"
115
+ };
116
+ const rawApplicationCode = (_b = this.otherParams) == null ? void 0 : _b.channel;
117
+ const mappedApplicationCode = typeof rawApplicationCode === "string" ? channelMap[rawApplicationCode] || rawApplicationCode : rawApplicationCode;
118
+ const queryPayload = {
119
+ open_quotation: 1,
120
+ open_bundle: 0,
121
+ exclude_extension_type: [
122
+ "product_party",
123
+ "product_event",
124
+ "product_series_event",
125
+ "product_package_ticket",
126
+ "ticket",
127
+ "event_item"
128
+ ],
129
+ with: [
130
+ "category",
131
+ "collection",
132
+ "resourceRelation",
133
+ "bundleGroup.bundleItem",
134
+ "optionGroup.optionItem",
135
+ "variantGroup.variantItem",
136
+ "dataVariants"
137
+ ],
138
+ status,
139
+ num: 500,
140
+ skip: 1,
141
+ customer_id,
142
+ ...Array.isArray(category_ids) && category_ids.length ? { category_ids } : {},
143
+ ...Array.isArray(product_ids) && product_ids.length ? { ids: product_ids } : {},
144
+ ...Array.isArray(collection) && collection.length ? { collection } : {},
145
+ front_end_cache_id: cacheId,
146
+ ...Array.isArray(menu_list_ids) && menu_list_ids.length ? { menu_list_ids } : {},
147
+ with_count,
148
+ // client_schedule_ids: schedule_ids,
149
+ schedule_date,
150
+ application_code: mappedApplicationCode,
151
+ is_eject: 1,
152
+ with_schedule,
153
+ schedule_datetime,
154
+ extension_type
155
+ };
109
156
  const productsData = await this.request.post(
110
157
  `/product/query`,
111
- {
112
- open_quotation: 1,
113
- open_bundle: 0,
114
- exclude_extension_type: [
115
- "product_party",
116
- "product_event",
117
- "product_series_event",
118
- "product_package_ticket",
119
- "ticket",
120
- "event_item"
121
- ],
122
- with: ["category", "collection", "resourceRelation"],
123
- status,
124
- num: 500,
125
- skip: 1,
126
- customer_id,
127
- category_ids,
128
- ids: product_ids,
129
- collection,
130
- front_end_cache_id: cacheId,
131
- menu_list_ids,
132
- with_count,
133
- // client_schedule_ids: schedule_ids,
134
- schedule_date,
135
- application_code: (_b = this.otherParams) == null ? void 0 : _b.channel,
136
- is_eject: 1,
137
- with_schedule,
138
- schedule_datetime,
139
- extension_type,
140
- strategy_context
141
- },
158
+ queryPayload,
142
159
  { osServer: true, callback: options == null ? void 0 : options.callback, subscriberId: options == null ? void 0 : options.subscriberId, customToast: () => {
143
160
  } }
144
161
  );
@@ -21,7 +21,7 @@ export declare class QuotationModule extends BaseModule implements Module {
21
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
22
22
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
23
23
  *
24
- * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
24
+ * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
25
25
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
26
26
  * the requested productId wins.
27
27
  */
@@ -52,7 +52,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
52
52
  { useCache: false, osServer: true }
53
53
  );
54
54
  const list = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.list) || (res == null ? void 0 : res.list) || [];
55
- list.sort((a, b) => a.sort - b.sort);
55
+ list.sort((a, b) => b.sort - a.sort);
56
56
  this.store.list = list;
57
57
  }
58
58
  getQuotationList() {
@@ -96,7 +96,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
96
96
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
97
97
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
98
98
  *
99
- * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
99
+ * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
100
100
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
101
101
  * the requested productId wins.
102
102
  */