@pisell/pisellos 2.3.41 → 2.3.43

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 (147) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  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 +3 -1
  13. package/dist/modules/Order/index.js +55 -26
  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 +33 -14
  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 +772 -657
  41. package/dist/solution/BaseSales/index.d.ts +7 -0
  42. package/dist/solution/BaseSales/index.js +64 -42
  43. package/dist/solution/BookingByStep/index.d.ts +17 -2
  44. package/dist/solution/BookingByStep/index.js +294 -215
  45. package/dist/solution/BookingByStep/types.d.ts +2 -1
  46. package/dist/solution/BookingByStep/types.js +3 -1
  47. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  48. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  49. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  50. package/dist/solution/BookingTicket/index.d.ts +1 -1
  51. package/dist/solution/BookingTicket/index.js +2 -2
  52. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  53. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  54. package/dist/solution/ScanOrder/index.d.ts +26 -14
  55. package/dist/solution/ScanOrder/index.js +1142 -739
  56. package/dist/solution/ScanOrder/types.d.ts +21 -1
  57. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  58. package/dist/solution/ScanOrder/utils.js +66 -25
  59. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  60. package/dist/solution/ShopDiscount/index.js +125 -87
  61. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  62. package/dist/solution/UnifiedBookingSales/index.js +1891 -0
  63. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  64. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  65. package/dist/solution/VenueBooking/index.d.ts +39 -11
  66. package/dist/solution/VenueBooking/index.js +1167 -841
  67. package/dist/solution/VenueBooking/types.d.ts +3 -0
  68. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  69. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  70. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  71. package/dist/solution/index.d.ts +1 -0
  72. package/dist/solution/index.js +2 -1
  73. package/dist/types/index.d.ts +1 -0
  74. package/lib/model/strategy/adapter/promotion/index.js +0 -51
  75. package/lib/modules/Discount/index.d.ts +1 -0
  76. package/lib/modules/Discount/index.js +9 -0
  77. package/lib/modules/Discount/types.d.ts +1 -0
  78. package/lib/modules/Holder/index.d.ts +48 -0
  79. package/lib/modules/Holder/index.js +402 -0
  80. package/lib/modules/Holder/types.d.ts +123 -0
  81. package/lib/modules/Holder/types.js +17 -0
  82. package/lib/modules/Holder/utils.d.ts +13 -0
  83. package/lib/modules/Holder/utils.js +71 -0
  84. package/lib/modules/OpenData/index.js +1 -1
  85. package/lib/modules/Order/index.d.ts +3 -1
  86. package/lib/modules/Order/index.js +27 -11
  87. package/lib/modules/Order/types.d.ts +9 -0
  88. package/lib/modules/Order/utils.d.ts +10 -0
  89. package/lib/modules/Order/utils.js +36 -5
  90. package/lib/modules/Product/types.d.ts +1 -0
  91. package/lib/modules/ProductList/index.js +40 -31
  92. package/lib/modules/Quotation/index.d.ts +1 -1
  93. package/lib/modules/Quotation/index.js +2 -2
  94. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  95. package/lib/modules/ResourcePlanner/index.js +148 -0
  96. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  97. package/lib/modules/ResourcePlanner/planner.js +933 -0
  98. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  99. package/lib/modules/ResourcePlanner/types.js +17 -0
  100. package/lib/modules/Rules/index.js +33 -16
  101. package/lib/modules/SalesSummary/index.js +6 -7
  102. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  103. package/lib/modules/ScanOrderLogger/index.js +13 -1
  104. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  105. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  106. package/lib/modules/Schedule/index.d.ts +3 -1
  107. package/lib/modules/Schedule/index.js +10 -8
  108. package/lib/modules/Summary/utils.js +21 -1
  109. package/lib/modules/index.d.ts +2 -0
  110. package/lib/modules/index.js +5 -1
  111. package/lib/plugins/window.d.ts +1 -0
  112. package/lib/server/index.d.ts +14 -0
  113. package/lib/server/index.js +65 -5
  114. package/lib/solution/BaseSales/index.d.ts +7 -0
  115. package/lib/solution/BaseSales/index.js +24 -8
  116. package/lib/solution/BookingByStep/index.d.ts +17 -2
  117. package/lib/solution/BookingByStep/index.js +60 -18
  118. package/lib/solution/BookingByStep/types.d.ts +2 -1
  119. package/lib/solution/BookingByStep/types.js +5 -0
  120. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  121. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  122. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  123. package/lib/solution/BookingTicket/index.d.ts +1 -1
  124. package/lib/solution/BookingTicket/index.js +10 -2
  125. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  126. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  127. package/lib/solution/ScanOrder/index.d.ts +26 -14
  128. package/lib/solution/ScanOrder/index.js +449 -182
  129. package/lib/solution/ScanOrder/types.d.ts +21 -1
  130. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  131. package/lib/solution/ScanOrder/utils.js +31 -0
  132. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  133. package/lib/solution/ShopDiscount/index.js +14 -0
  134. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  135. package/lib/solution/UnifiedBookingSales/index.js +1084 -0
  136. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  137. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  138. package/lib/solution/VenueBooking/index.d.ts +39 -11
  139. package/lib/solution/VenueBooking/index.js +322 -110
  140. package/lib/solution/VenueBooking/types.d.ts +3 -0
  141. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  142. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  143. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  144. package/lib/solution/index.d.ts +1 -0
  145. package/lib/solution/index.js +3 -1
  146. package/lib/types/index.d.ts +1 -0
  147. 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, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, ReplaceTempOrderOptions, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from './types';
@@ -146,6 +146,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
146
146
  isTempOrderPersistEnabled(): boolean;
147
147
  /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
148
148
  persistTempOrder(): void;
149
+ notifyTempOrderChanged(): void;
149
150
  private createDefaultTempOrderInstance;
150
151
  private createExternalSaleNumber;
151
152
  private ensureExternalSaleNumber;
@@ -495,6 +496,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
495
496
  is_deposit: number;
496
497
  relation_products: any[];
497
498
  relation_forms: any[];
499
+ business_code: string | undefined;
498
500
  };
499
501
  checkBeforeSubmitOrder(params: {
500
502
  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";
@@ -290,8 +290,8 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
290
290
  key: "initialize",
291
291
  value: function () {
292
292
  var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(core, options) {
293
- var _otherParams$rules, _otherParams$order, _otherParams$hooks;
294
- var app, otherParams;
293
+ var _appPlugin$getApp, _otherParams$rules, _otherParams$order, _otherParams$hooks;
294
+ var appPlugin, app, otherParams;
295
295
  return _regeneratorRuntime().wrap(function _callee$(_context) {
296
296
  while (1) switch (_context.prev = _context.next) {
297
297
  case 0:
@@ -307,15 +307,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
307
307
  this.store.availableWalletIds = [];
308
308
  }
309
309
  this.request = this.core.getPlugin('request');
310
- this.appPlugin = this.core.getPlugin('app');
311
- if (this.appPlugin) {
312
- _context.next = 9;
313
- break;
310
+ appPlugin = this.core.getPlugin('app');
311
+ if (!appPlugin) {
312
+ console.error('Order 模块需要 app 插件支持');
314
313
  }
315
- throw new Error('Order 模块需要 app 插件支持');
316
- case 9:
317
- app = this.appPlugin.getApp();
318
- this.logger = app.logger;
314
+ app = appPlugin === null || appPlugin === void 0 || (_appPlugin$getApp = appPlugin.getApp) === null || _appPlugin$getApp === void 0 ? void 0 : _appPlugin$getApp.call(appPlugin);
315
+ this.logger = app === null || app === void 0 ? void 0 : app.logger;
319
316
  this.window = this.core.getPlugin('window');
320
317
  otherParams = options.otherParams || {};
321
318
  this.cacheId = otherParams.cacheId;
@@ -326,7 +323,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
326
323
  this.otherParams = otherParams;
327
324
  this.registerDiscountModules(options);
328
325
  this.logInfo('OrderModule initialized successfully');
329
- case 21:
326
+ case 20:
330
327
  case "end":
331
328
  return _context.stop();
332
329
  }
@@ -1231,6 +1228,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1231
1228
  value: function persistTempOrder() {
1232
1229
  // no-op: OrderModule 的刷新恢复不再依赖 localStorage。
1233
1230
  }
1231
+ }, {
1232
+ key: "notifyTempOrderChanged",
1233
+ value: function notifyTempOrderChanged() {
1234
+ if (!this.store.tempOrder) return;
1235
+ this.store.tempOrder = _objectSpread(_objectSpread({}, this.store.tempOrder), {}, {
1236
+ products: _toConsumableArray(this.store.tempOrder.products),
1237
+ bookings: this.store.tempOrder.bookings ? _toConsumableArray(this.store.tempOrder.bookings) : []
1238
+ });
1239
+ this.persistTempOrder();
1240
+ }
1234
1241
 
1235
1242
  // ─── TempOrder: 创建 & 获取 ───
1236
1243
  }, {
@@ -5235,7 +5242,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5235
5242
  var _syncPaymentsToOrder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(params) {
5236
5243
  var _this31 = this,
5237
5244
  _params$confirmPendin;
5238
- var tempOrder, needsPaymentNumber, devicePrefix, mappedPayments, shouldConfirmPendingVoucherPayments, effectivePayments, completion, orderPaidPaymentTotal, paymentStatus, paymentSyncIdempotencyToken, submitResult;
5245
+ var tempOrder, needsPaymentNumber, devicePrefix, mappedPayments, shouldConfirmPendingVoucherPayments, effectivePayments, completion, orderPaidPaymentTotal, paymentStatus, paymentSyncIdempotencyToken, submitParams, submitResult;
5239
5246
  return _regeneratorRuntime().wrap(function _callee36$(_context39) {
5240
5247
  while (1) switch (_context39.prev = _context39.next) {
5241
5248
  case 0:
@@ -5288,8 +5295,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5288
5295
  case 25:
5289
5296
  this.store.syncState = 'submitting';
5290
5297
  paymentSyncIdempotencyToken = this.buildPaymentSyncIdempotencyToken(tempOrder, effectivePayments);
5291
- _context39.next = 29;
5292
- return this.submitTempOrder({
5298
+ submitParams = {
5293
5299
  payments: effectivePayments,
5294
5300
  paymentStatus: paymentStatus,
5295
5301
  smallTicketDataFlag: params.smallTicketDataFlag,
@@ -5302,13 +5308,28 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5302
5308
  });
5303
5309
  return nextPayload;
5304
5310
  }
5305
- });
5306
- case 29:
5307
- submitResult = _context39.sent;
5311
+ };
5312
+ if (!(params.checkoutSyncTaskEnabled === false)) {
5313
+ _context39.next = 34;
5314
+ break;
5315
+ }
5316
+ _context39.next = 31;
5317
+ return this.submitTempOrderAsync(submitParams);
5318
+ case 31:
5319
+ _context39.t1 = _context39.sent;
5320
+ _context39.next = 37;
5321
+ break;
5322
+ case 34:
5323
+ _context39.next = 36;
5324
+ return this.submitTempOrder(submitParams);
5325
+ case 36:
5326
+ _context39.t1 = _context39.sent;
5327
+ case 37:
5328
+ submitResult = _context39.t1;
5308
5329
  return _context39.abrupt("return", _objectSpread(_objectSpread({}, completion), {}, {
5309
5330
  submitResult: submitResult
5310
5331
  }));
5311
- case 31:
5332
+ case 39:
5312
5333
  case "end":
5313
5334
  return _context39.stop();
5314
5335
  }
@@ -5322,6 +5343,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5322
5343
  }, {
5323
5344
  key: "createOrder",
5324
5345
  value: function createOrder(params) {
5346
+ var _this32 = this;
5325
5347
  var order = _objectSpread({
5326
5348
  type: (params === null || params === void 0 ? void 0 : params.type) || 'appointment_booking',
5327
5349
  // 要从外面拿,virtual
@@ -5333,11 +5355,13 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5333
5355
  schedule_date: '',
5334
5356
  is_deposit: 0,
5335
5357
  relation_products: [],
5336
- relation_forms: []
5358
+ relation_forms: [],
5359
+ business_code: params === null || params === void 0 ? void 0 : params.business_code
5337
5360
  }, (params === null || params === void 0 ? void 0 : params.extraData) || {});
5338
5361
  var is_deposit = 0; // 是否存在定金,0 不存在,1 存在
5339
5362
  if (params.cartItems.length > 0) {
5340
5363
  params.cartItems.forEach(function (item) {
5364
+ var _params$extraData;
5341
5365
  if (!item._origin.duration) {
5342
5366
  var _generateDuration = generateDuration(item),
5343
5367
  duration = _generateDuration.duration,
@@ -5349,6 +5373,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5349
5373
  var discountList = getAllDiscountList(item);
5350
5374
  item._origin.product.discount_list = discountList;
5351
5375
 
5376
+ // 为预约补齐 holder 信息
5377
+ if (params !== null && params !== void 0 && (_params$extraData = params.extraData) !== null && _params$extraData !== void 0 && _params$extraData.is_add_holder_info) {
5378
+ ensureCartItemOriginHolder(item, _this32.window);
5379
+ }
5380
+
5352
5381
  // 购物车是否为普通商品
5353
5382
  if (isNormalProduct(item._origin)) {
5354
5383
  var _order$relation_forms;
@@ -5759,7 +5788,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
5759
5788
  }
5760
5789
  _context46.next = 6;
5761
5790
  return this.request.get("/order/sales/".concat(encodeURIComponent(lookup)), _objectSpread({
5762
- with: ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info']
5791
+ with: ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info', 'refunds']
5763
5792
  }, params.forceRemote ? {
5764
5793
  forceRemote: true
5765
5794
  } : {}), {
@@ -6006,7 +6035,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6006
6035
  }, {
6007
6036
  key: "normalizeTempOrderForRuntime",
6008
6037
  value: function normalizeTempOrderForRuntime(raw, options) {
6009
- var _this32 = this;
6038
+ var _this33 = this;
6010
6039
  var runtimeRaw = this.withoutSyntheticDraftOrderIdForRuntime(raw);
6011
6040
  var nextTempOrder = _objectSpread(_objectSpread({}, this.createDefaultTempOrderInstance()), runtimeRaw || {});
6012
6041
  // ES 列表详情使用 id 表示订单主键;OS 详情态统一依赖 order_id 驱动操作按钮。
@@ -6030,12 +6059,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6030
6059
  nextTempOrder.holder = raw.holder && _typeof(raw.holder) === 'object' ? _objectSpread({}, raw.holder) : null;
6031
6060
  var rawProducts = Array.isArray(raw.products) ? raw.products : [];
6032
6061
  nextTempOrder.products = rawProducts.length > 0 ? rawProducts.map(function (p) {
6033
- return _this32.normalizeHydratedOrderProduct(p, {
6062
+ return _this33.normalizeHydratedOrderProduct(p, {
6034
6063
  makeEditMark: options === null || options === void 0 ? void 0 : options.makeEditMark
6035
6064
  });
6036
6065
  }) : [];
6037
6066
  nextTempOrder.bookings = Array.isArray(raw.bookings) ? raw.bookings.map(function (b) {
6038
- var booking = _this32.normalizeHydratedBookingHolder(b || {});
6067
+ var booking = _this33.normalizeHydratedBookingHolder(b || {});
6039
6068
  return _objectSpread(_objectSpread({}, booking), {}, {
6040
6069
  is_all: normalizeBookingIsAll(booking),
6041
6070
  sub_type: normalizeBookingSubType(booking)
@@ -6222,7 +6251,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6222
6251
  }, {
6223
6252
  key: "normalizeHydratedOrderProduct",
6224
6253
  value: function normalizeHydratedOrderProduct(product, options) {
6225
- var _this33 = this;
6254
+ var _this34 = this;
6226
6255
  var row = _objectSpread({}, product || {});
6227
6256
  if (row.num === undefined && row.product_quantity !== undefined) {
6228
6257
  row.num = row.product_quantity;
@@ -6230,7 +6259,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
6230
6259
  var productSku = ensureProductSku(row);
6231
6260
  row.product_sku = _objectSpread(_objectSpread({}, productSku), {}, {
6232
6261
  option: normalizeProductSkuOptions(productSku.option.map(function (optionItem) {
6233
- return _this33.normalizeHydratedProductOptionItem(optionItem || {});
6262
+ return _this34.normalizeHydratedProductOptionItem(optionItem || {});
6234
6263
  }))
6235
6264
  });
6236
6265
  delete row["product_".concat('option', "_item")];
@@ -394,6 +394,7 @@ export interface CommitOrderParams {
394
394
  type: 'virtual' | 'appointment_booking';
395
395
  platform?: string;
396
396
  extraData?: Record<string, any>;
397
+ business_code?: string;
397
398
  };
398
399
  }
399
400
  export interface OrderSubmitBooking {
@@ -569,6 +570,12 @@ export interface SyncPaymentsToOrderParams {
569
570
  payments: OrderPaymentSource[];
570
571
  paymentStatus?: SubmitSalesOrderParams['query']['payment_status'];
571
572
  submitWhenPaid?: boolean;
573
+ /**
574
+ * Whether the checkout should be queued as the local `sync_sales` task.
575
+ * Defaults to true to preserve the WebPOS retry path. Set to false when
576
+ * the caller must wait for the cloud checkout response before proceeding.
577
+ */
578
+ checkoutSyncTaskEnabled?: boolean;
572
579
  smallTicketDataFlag?: number;
573
580
  businessCode?: string;
574
581
  channel?: string;
@@ -731,6 +738,8 @@ export interface OrderModuleAPI {
731
738
  setEnableTempOrderPersist: (enabled: boolean) => void;
732
739
  /** 是否允许 saveDraft 写入 IndexedDB 草稿。 */
733
740
  isTempOrderPersistEnabled: () => boolean;
741
+ /** 提交 tempOrder 变更并触发 `{moduleName}:changed` 事件 */
742
+ notifyTempOrderChanged: () => void;
734
743
  submitTempOrder: <T = any>(params?: {
735
744
  cacheId?: string;
736
745
  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;
@@ -157,6 +157,10 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
157
157
  userPlugin,
158
158
  customer_id,
159
159
  _userPlugin$get,
160
+ channelMap,
161
+ rawApplicationCode,
162
+ mappedApplicationCode,
163
+ queryPayload,
160
164
  productsData,
161
165
  sortedList,
162
166
  _args4 = arguments;
@@ -185,8 +189,16 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
185
189
  console.error(error);
186
190
  }
187
191
  // 如果没传schedule_date,则从
188
- _context4.next = 7;
189
- return this.request.post("/product/query", {
192
+ channelMap = {
193
+ online_store: 'online-store',
194
+ scan_to_order: 'online-store',
195
+ 'scan-to-order': 'online-store',
196
+ scan_to_order_2: 'mobile_order',
197
+ scan_to_order_3: 'scantoorder3'
198
+ };
199
+ rawApplicationCode = (_this$otherParams = this.otherParams) === null || _this$otherParams === void 0 ? void 0 : _this$otherParams.channel;
200
+ mappedApplicationCode = typeof rawApplicationCode === 'string' ? channelMap[rawApplicationCode] || rawApplicationCode : rawApplicationCode;
201
+ queryPayload = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
190
202
  open_quotation: 1,
191
203
  open_bundle: 0,
192
204
  exclude_extension_type: ['product_party', 'product_event', 'product_series_event', 'product_package_ticket', 'ticket', 'event_item'],
@@ -194,28 +206,35 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
194
206
  status: status,
195
207
  num: 500,
196
208
  skip: 1,
197
- customer_id: customer_id,
198
- category_ids: category_ids,
199
- ids: product_ids,
200
- collection: collection,
201
- front_end_cache_id: cacheId,
202
- menu_list_ids: menu_list_ids,
209
+ customer_id: customer_id
210
+ }, Array.isArray(category_ids) && category_ids.length ? {
211
+ category_ids: category_ids
212
+ } : {}), Array.isArray(product_ids) && product_ids.length ? {
213
+ ids: product_ids
214
+ } : {}), Array.isArray(collection) && collection.length ? {
215
+ collection: collection
216
+ } : {}), {}, {
217
+ front_end_cache_id: cacheId
218
+ }, Array.isArray(menu_list_ids) && menu_list_ids.length ? {
219
+ menu_list_ids: menu_list_ids
220
+ } : {}), {}, {
203
221
  with_count: with_count,
204
222
  // client_schedule_ids: schedule_ids,
205
223
  schedule_date: schedule_date,
206
- application_code: (_this$otherParams = this.otherParams) === null || _this$otherParams === void 0 ? void 0 : _this$otherParams.channel,
224
+ application_code: mappedApplicationCode,
207
225
  is_eject: 1,
208
226
  with_schedule: with_schedule,
209
227
  schedule_datetime: schedule_datetime,
210
- extension_type: extension_type,
211
- strategy_context: strategy_context
212
- }, {
228
+ extension_type: extension_type
229
+ });
230
+ _context4.next = 11;
231
+ return this.request.post("/product/query", queryPayload, {
213
232
  osServer: true,
214
233
  callback: options === null || options === void 0 ? void 0 : options.callback,
215
234
  subscriberId: options === null || options === void 0 ? void 0 : options.subscriberId,
216
235
  customToast: function customToast() {}
217
236
  });
218
- case 7:
237
+ case 11:
219
238
  productsData = _context4.sent;
220
239
  sortedList = (productsData.data.list || []).slice().sort(function (a, b) {
221
240
  return Number(b.sort) - Number(a.sort);
@@ -228,7 +247,7 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
228
247
  // }
229
248
  this.addProduct(sortedList);
230
249
  return _context4.abrupt("return", sortedList);
231
- case 11:
250
+ case 15:
232
251
  case "end":
233
252
  return _context4.stop();
234
253
  }
@@ -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
  */
@@ -90,7 +90,7 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
90
90
  res = _context2.sent;
91
91
  list = (res === null || res === void 0 || (_data = res.data) === null || _data === void 0 ? void 0 : _data.list) || (res === null || res === void 0 ? void 0 : res.list) || [];
92
92
  list.sort(function (a, b) {
93
- return a.sort - b.sort;
93
+ return b.sort - a.sort;
94
94
  });
95
95
  this.store.list = list;
96
96
  case 9:
@@ -151,7 +151,7 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
151
151
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
152
152
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
153
153
  *
154
- * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
154
+ * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
155
155
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
156
156
  * the requested productId wins.
157
157
  */