@pisell/pisellos 2.2.177 → 2.2.179

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 (183) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  2. package/dist/modules/Customer/index.d.ts +0 -6
  3. package/dist/modules/Customer/index.js +83 -129
  4. package/dist/modules/Customer/types.d.ts +0 -2
  5. package/dist/modules/Discount/index.d.ts +4 -2
  6. package/dist/modules/Discount/index.js +93 -8
  7. package/dist/modules/Discount/types.d.ts +7 -1
  8. package/dist/modules/Order/index.d.ts +18 -87
  9. package/dist/modules/Order/index.js +497 -1303
  10. package/dist/modules/Order/types.d.ts +19 -198
  11. package/dist/modules/Order/types.js +0 -31
  12. package/dist/modules/Order/utils.d.ts +1 -50
  13. package/dist/modules/Order/utils.js +32 -261
  14. package/dist/modules/Quotation/index.d.ts +1 -0
  15. package/dist/modules/Quotation/index.js +21 -23
  16. package/dist/modules/Rules/index.d.ts +0 -4
  17. package/dist/modules/Rules/index.js +10 -26
  18. package/dist/modules/SalesSummary/index.js +2 -4
  19. package/dist/modules/SalesSummary/utils.js +5 -18
  20. package/dist/modules/Schedule/index.js +2 -6
  21. package/dist/modules/index.d.ts +0 -1
  22. package/dist/modules/index.js +1 -2
  23. package/dist/server/index.js +29 -87
  24. package/dist/server/modules/order/index.d.ts +0 -23
  25. package/dist/server/modules/order/index.js +46 -123
  26. package/dist/server/modules/order/types.d.ts +2 -0
  27. package/dist/server/modules/order/utils/filterOrders.js +6 -20
  28. package/dist/server/modules/products/index.d.ts +1 -1
  29. package/dist/server/modules/products/index.js +113 -130
  30. package/dist/server/modules/schedule/index.js +6 -13
  31. package/dist/solution/BaseSales/index.d.ts +7 -89
  32. package/dist/solution/BaseSales/index.js +375 -1494
  33. package/dist/solution/BaseSales/types.d.ts +1 -67
  34. package/dist/solution/BaseSales/types.js +1 -3
  35. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -0
  36. package/dist/solution/BaseSales/utils/parseSalesResponse.js +1 -1
  37. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +16 -68
  38. package/dist/solution/BaseSales/utils.js +8 -46
  39. package/dist/solution/BookingByStep/index.d.ts +1 -1
  40. package/dist/solution/BookingTicket/index.d.ts +1 -133
  41. package/dist/solution/BookingTicket/index.js +175 -780
  42. package/dist/solution/BookingTicket/types.d.ts +0 -2
  43. package/dist/solution/BookingTicket/types.js +0 -3
  44. package/dist/solution/BookingTicket/utils/cartView.js +2 -4
  45. package/dist/solution/ScanOrder/index.d.ts +3 -9
  46. package/dist/solution/ScanOrder/index.js +128 -231
  47. package/dist/solution/ScanOrder/utils.js +8 -46
  48. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  49. package/dist/solution/ShopDiscount/index.js +23 -18
  50. package/dist/solution/VenueBooking/index.d.ts +9 -5
  51. package/dist/solution/VenueBooking/index.js +55 -103
  52. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +0 -4
  53. package/dist/solution/VenueBooking/utils/slotMerge.js +0 -10
  54. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  55. package/lib/modules/Customer/index.d.ts +0 -6
  56. package/lib/modules/Customer/index.js +11 -26
  57. package/lib/modules/Customer/types.d.ts +0 -2
  58. package/lib/modules/Discount/index.d.ts +4 -2
  59. package/lib/modules/Discount/index.js +63 -8
  60. package/lib/modules/Discount/types.d.ts +7 -1
  61. package/lib/modules/Order/index.d.ts +18 -87
  62. package/lib/modules/Order/index.js +146 -633
  63. package/lib/modules/Order/types.d.ts +19 -198
  64. package/lib/modules/Order/types.js +0 -1
  65. package/lib/modules/Order/utils.d.ts +1 -50
  66. package/lib/modules/Order/utils.js +22 -229
  67. package/lib/modules/Quotation/index.d.ts +1 -0
  68. package/lib/modules/Quotation/index.js +15 -18
  69. package/lib/modules/Rules/index.d.ts +0 -4
  70. package/lib/modules/Rules/index.js +14 -22
  71. package/lib/modules/SalesSummary/index.js +2 -4
  72. package/lib/modules/SalesSummary/utils.js +5 -18
  73. package/lib/modules/Schedule/index.js +1 -3
  74. package/lib/modules/index.d.ts +0 -1
  75. package/lib/modules/index.js +1 -3
  76. package/lib/server/index.js +4 -41
  77. package/lib/server/modules/order/index.d.ts +0 -23
  78. package/lib/server/modules/order/index.js +14 -46
  79. package/lib/server/modules/order/types.d.ts +2 -0
  80. package/lib/server/modules/order/utils/filterOrders.js +4 -12
  81. package/lib/server/modules/products/index.d.ts +1 -1
  82. package/lib/server/modules/products/index.js +20 -30
  83. package/lib/server/modules/schedule/index.js +1 -2
  84. package/lib/solution/BaseSales/index.d.ts +7 -89
  85. package/lib/solution/BaseSales/index.js +22 -736
  86. package/lib/solution/BaseSales/types.d.ts +1 -67
  87. package/lib/solution/BaseSales/types.js +1 -3
  88. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -0
  89. package/lib/solution/BaseSales/utils/parseSalesResponse.js +1 -0
  90. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +12 -71
  91. package/lib/solution/BaseSales/utils.js +6 -46
  92. package/lib/solution/BookingByStep/index.d.ts +1 -1
  93. package/lib/solution/BookingTicket/index.d.ts +1 -133
  94. package/lib/solution/BookingTicket/index.js +8 -352
  95. package/lib/solution/BookingTicket/types.d.ts +0 -2
  96. package/lib/solution/BookingTicket/types.js +0 -6
  97. package/lib/solution/BookingTicket/utils/cartView.js +2 -4
  98. package/lib/solution/ScanOrder/index.d.ts +3 -9
  99. package/lib/solution/ScanOrder/index.js +66 -147
  100. package/lib/solution/ScanOrder/utils.js +6 -46
  101. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  102. package/lib/solution/ShopDiscount/index.js +4 -2
  103. package/lib/solution/VenueBooking/index.d.ts +9 -5
  104. package/lib/solution/VenueBooking/index.js +14 -50
  105. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +0 -4
  106. package/lib/solution/VenueBooking/utils/slotMerge.js +0 -10
  107. package/package.json +2 -2
  108. package/dist/modules/BookingContext/index.d.ts +0 -37
  109. package/dist/modules/BookingContext/index.js +0 -436
  110. package/dist/modules/BookingContext/types.d.ts +0 -102
  111. package/dist/modules/BookingContext/types.js +0 -51
  112. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +0 -16
  113. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +0 -193
  114. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +0 -8
  115. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +0 -137
  116. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +0 -75
  117. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +0 -215
  118. package/dist/modules/BookingContext/utils/flexible.d.ts +0 -28
  119. package/dist/modules/BookingContext/utils/flexible.js +0 -56
  120. package/dist/modules/BookingContext/utils/formatResourceList.d.ts +0 -8
  121. package/dist/modules/BookingContext/utils/formatResourceList.js +0 -38
  122. package/dist/modules/BookingContext/utils/index.d.ts +0 -11
  123. package/dist/modules/BookingContext/utils/index.js +0 -11
  124. package/dist/modules/BookingContext/utils/noResource.d.ts +0 -13
  125. package/dist/modules/BookingContext/utils/noResource.js +0 -77
  126. package/dist/modules/BookingContext/utils/productExtend.d.ts +0 -72
  127. package/dist/modules/BookingContext/utils/productExtend.js +0 -339
  128. package/dist/modules/BookingContext/utils/resourceErrors.d.ts +0 -41
  129. package/dist/modules/BookingContext/utils/resourceErrors.js +0 -74
  130. package/dist/modules/BookingContext/utils/resourceSelection.d.ts +0 -7
  131. package/dist/modules/BookingContext/utils/resourceSelection.js +0 -24
  132. package/dist/modules/BookingContext/utils/resources.d.ts +0 -80
  133. package/dist/modules/BookingContext/utils/resources.js +0 -486
  134. package/dist/modules/BookingContext/utils/serviceTimes.d.ts +0 -55
  135. package/dist/modules/BookingContext/utils/serviceTimes.js +0 -151
  136. package/dist/modules/BookingContext/utils/timeSlices.d.ts +0 -42
  137. package/dist/modules/BookingContext/utils/timeSlices.js +0 -100
  138. package/dist/modules/Order/utils/manualProductDiscount.d.ts +0 -106
  139. package/dist/modules/Order/utils/manualProductDiscount.js +0 -212
  140. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +0 -275
  141. package/dist/solution/BaseSales/utils/cartPromotion.js +0 -1258
  142. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +0 -7
  143. package/dist/solution/BaseSales/utils/quotationPrice.js +0 -237
  144. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +0 -113
  145. package/dist/solution/BookingTicket/utils/addProductDecision.js +0 -346
  146. package/lib/modules/BookingContext/index.d.ts +0 -37
  147. package/lib/modules/BookingContext/index.js +0 -297
  148. package/lib/modules/BookingContext/types.d.ts +0 -102
  149. package/lib/modules/BookingContext/types.js +0 -34
  150. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +0 -16
  151. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +0 -207
  152. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +0 -8
  153. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +0 -141
  154. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +0 -75
  155. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +0 -198
  156. package/lib/modules/BookingContext/utils/flexible.d.ts +0 -28
  157. package/lib/modules/BookingContext/utils/flexible.js +0 -80
  158. package/lib/modules/BookingContext/utils/formatResourceList.d.ts +0 -8
  159. package/lib/modules/BookingContext/utils/formatResourceList.js +0 -50
  160. package/lib/modules/BookingContext/utils/index.d.ts +0 -11
  161. package/lib/modules/BookingContext/utils/index.js +0 -43
  162. package/lib/modules/BookingContext/utils/noResource.d.ts +0 -13
  163. package/lib/modules/BookingContext/utils/noResource.js +0 -90
  164. package/lib/modules/BookingContext/utils/productExtend.d.ts +0 -72
  165. package/lib/modules/BookingContext/utils/productExtend.js +0 -283
  166. package/lib/modules/BookingContext/utils/resourceErrors.d.ts +0 -41
  167. package/lib/modules/BookingContext/utils/resourceErrors.js +0 -80
  168. package/lib/modules/BookingContext/utils/resourceSelection.d.ts +0 -7
  169. package/lib/modules/BookingContext/utils/resourceSelection.js +0 -46
  170. package/lib/modules/BookingContext/utils/resources.d.ts +0 -80
  171. package/lib/modules/BookingContext/utils/resources.js +0 -377
  172. package/lib/modules/BookingContext/utils/serviceTimes.d.ts +0 -55
  173. package/lib/modules/BookingContext/utils/serviceTimes.js +0 -162
  174. package/lib/modules/BookingContext/utils/timeSlices.d.ts +0 -42
  175. package/lib/modules/BookingContext/utils/timeSlices.js +0 -124
  176. package/lib/modules/Order/utils/manualProductDiscount.d.ts +0 -106
  177. package/lib/modules/Order/utils/manualProductDiscount.js +0 -207
  178. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +0 -275
  179. package/lib/solution/BaseSales/utils/cartPromotion.js +0 -836
  180. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +0 -7
  181. package/lib/solution/BaseSales/utils/quotationPrice.js +0 -277
  182. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +0 -113
  183. package/lib/solution/BookingTicket/utils/addProductDecision.js +0 -318
@@ -12,10 +12,6 @@ export declare function buildPriceBreakdown(params: {
12
12
  }) => number;
13
13
  };
14
14
  }): PriceBreakdownEntry[];
15
- export declare function buildVenueResourceMetadata(params: {
16
- mapping: ResourceProductMapping;
17
- rawResource: VenueResourceRawData | undefined;
18
- }): Record<string, any>;
19
15
  export interface BuildVenueBookingParams {
20
16
  group: MergedSlotGroup;
21
17
  resourceId: number | string;
@@ -89,16 +89,6 @@ export function buildPriceBreakdown(params) {
89
89
  }
90
90
  return entries;
91
91
  }
92
- export function buildVenueResourceMetadata(params) {
93
- var _rawResource$form_nam, _ref, _rawResource$main_fie, _rawResource$combined;
94
- var mapping = params.mapping,
95
- rawResource = params.rawResource;
96
- return {
97
- form_name: (_rawResource$form_nam = rawResource === null || rawResource === void 0 ? void 0 : rawResource.form_name) !== null && _rawResource$form_nam !== void 0 ? _rawResource$form_nam : '',
98
- resource_name: (_ref = (_rawResource$main_fie = rawResource === null || rawResource === void 0 ? void 0 : rawResource.main_field) !== null && _rawResource$main_fie !== void 0 ? _rawResource$main_fie : mapping.resourceName) !== null && _ref !== void 0 ? _ref : '',
99
- combined_resource: (_rawResource$combined = rawResource === null || rawResource === void 0 ? void 0 : rawResource.combined_resource) !== null && _rawResource$combined !== void 0 ? _rawResource$combined : null
100
- };
101
- }
102
92
  export function buildVenueBookingEntry(params) {
103
93
  var _rawResource$form_id;
104
94
  var group = params.group,
@@ -0,0 +1,49 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/model/strategy/adapter/promotion/index.ts
30
+ var promotion_exports = {};
31
+ __export(promotion_exports, {
32
+ BUY_X_GET_Y_FREE_STRATEGY: () => import_examples.BUY_X_GET_Y_FREE_STRATEGY,
33
+ PromotionAdapter: () => import_adapter.PromotionAdapter,
34
+ PromotionEvaluator: () => import_evaluator.PromotionEvaluator,
35
+ X_ITEMS_FOR_Y_PRICE_STRATEGY: () => import_examples.X_ITEMS_FOR_Y_PRICE_STRATEGY,
36
+ default: () => import_adapter2.default
37
+ });
38
+ module.exports = __toCommonJS(promotion_exports);
39
+ var import_evaluator = require("./evaluator");
40
+ var import_adapter = require("./adapter");
41
+ var import_adapter2 = __toESM(require("./adapter"));
42
+ var import_examples = require("./examples");
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ BUY_X_GET_Y_FREE_STRATEGY,
46
+ PromotionAdapter,
47
+ PromotionEvaluator,
48
+ X_ITEMS_FOR_Y_PRICE_STRATEGY
49
+ });
@@ -24,12 +24,6 @@ export declare class CustomerModule extends BaseModule implements Module, Custom
24
24
  * @param operation 操作名称
25
25
  */
26
26
  private handleCustomerListError;
27
- /**
28
- * 查询客户列表但不写入 customerList / pagination 状态。
29
- *
30
- * 用于按 ID 补齐客户等内部查询,避免把临时的 num/searchParams 污染到滚动列表。
31
- */
32
- queryCustomerList(params?: ShopGetCustomerListParams): Promise<ICustomerListResponse>;
33
27
  /**
34
28
  * 获取客户列表
35
29
  * @param params 查询参数
@@ -75,7 +75,7 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
75
75
  } else {
76
76
  this.store.currentPage = 1;
77
77
  }
78
- if (typeof ((_e = options == null ? void 0 : options.initialState) == null ? void 0 : _e.pageSize) === "number" && options.initialState.pageSize > 1) {
78
+ if (typeof ((_e = options == null ? void 0 : options.initialState) == null ? void 0 : _e.pageSize) === "number") {
79
79
  this.store.pageSize = options.initialState.pageSize;
80
80
  } else {
81
81
  this.store.pageSize = import_constants.DEFAULT_PAGE_SIZE;
@@ -152,20 +152,6 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
152
152
  this.store.error
153
153
  );
154
154
  }
155
- /**
156
- * 查询客户列表但不写入 customerList / pagination 状态。
157
- *
158
- * 用于按 ID 补齐客户等内部查询,避免把临时的 num/searchParams 污染到滚动列表。
159
- */
160
- async queryCustomerList(params = {}) {
161
- const { customerList, total, page, pageSize } = await this.fetchCustomerListData(params);
162
- return {
163
- list: customerList,
164
- total,
165
- page,
166
- pageSize
167
- };
168
- }
169
155
  /**
170
156
  * 获取客户列表
171
157
  * @param params 查询参数
@@ -183,6 +169,10 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
183
169
  this.store.total = total;
184
170
  this.store.hasMore = page * pageSize < total;
185
171
  this.store.customerList = (0, import_lodash_es.cloneDeep)(customerList);
172
+ await this.core.effects.emit(
173
+ `${this.name}:onCustomerListUpdate`,
174
+ this.store
175
+ );
186
176
  this.triggerPaginationChange({
187
177
  page,
188
178
  pageSize,
@@ -202,10 +192,6 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
202
192
  } finally {
203
193
  this.store.loading = false;
204
194
  this.storeChange();
205
- await this.core.effects.emit(
206
- `${this.name}:onCustomerListUpdate`,
207
- this.store
208
- );
209
195
  }
210
196
  }
211
197
  /**
@@ -366,13 +352,12 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
366
352
  try {
367
353
  this.store.loadingMore = true;
368
354
  this.store.error = null;
369
- const loadMoreParams = {
355
+ const { customerList: newCustomers, total, page, pageSize } = await this.fetchCustomerListData({
370
356
  skip: nextPage,
371
357
  num: this.store.pageSize,
372
358
  ...this.store.searchParams
373
359
  // 使用存储的搜索条件
374
- };
375
- const { customerList: newCustomers, total, page, pageSize } = await this.fetchCustomerListData(loadMoreParams);
360
+ });
376
361
  const updatedCustomerList = [...this.store.customerList, ...(0, import_lodash_es.cloneDeep)(newCustomers)];
377
362
  this.store.customerList = updatedCustomerList;
378
363
  this.store.currentPage = page;
@@ -387,6 +372,10 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
387
372
  hasMore: this.store.hasMore
388
373
  }
389
374
  );
375
+ await this.core.effects.emit(
376
+ `${this.name}:onCustomerListUpdate`,
377
+ this.store
378
+ );
390
379
  this.triggerPaginationChange({
391
380
  page,
392
381
  pageSize,
@@ -407,10 +396,6 @@ var CustomerModule = class extends import_BaseModule.BaseModule {
407
396
  } finally {
408
397
  this.store.loadingMore = false;
409
398
  this.storeChange();
410
- await this.core.effects.emit(
411
- `${this.name}:onCustomerListUpdate`,
412
- this.store
413
- );
414
399
  }
415
400
  }
416
401
  /**
@@ -110,8 +110,6 @@ export interface CustomerState {
110
110
  export interface CustomerModuleAPI {
111
111
  /** 获取客户列表 */
112
112
  getCustomerList: (params?: ShopGetCustomerListParams) => Promise<ICustomerListResponse>;
113
- /** 查询客户列表但不更新列表分页状态 */
114
- queryCustomerList: (params?: ShopGetCustomerListParams) => Promise<ICustomerListResponse>;
115
113
  /** 设置客户列表 */
116
114
  setCustomerList: (customers: ShopCustomer[], total?: number) => void;
117
115
  /** 设置当前选择的客户 */
@@ -1,6 +1,6 @@
1
1
  import { Module, PisellCore, ModuleOptions } from '../../types';
2
2
  import { BaseModule } from '../BaseModule';
3
- import { Discount, DiscountModuleAPI } from './types';
3
+ import { Discount, DiscountModuleAPI, DiscountWithReason } from './types';
4
4
  export declare class DiscountModule extends BaseModule implements Module, DiscountModuleAPI {
5
5
  protected defaultName: string;
6
6
  protected defaultVersion: string;
@@ -28,9 +28,11 @@ export declare class DiscountModule extends BaseModule implements Module, Discou
28
28
  batchSearch(code: string, options?: {
29
29
  customerId?: number;
30
30
  orderId?: number;
31
- }): Promise<Discount[]>;
31
+ }): Promise<DiscountWithReason>;
32
32
  filterEnabledDiscountList(discountList: Discount[]): Discount[];
33
33
  private checkUsageCreditsLimit;
34
+ filterEnabledDiscountListWithReason(discountList: Discount[]): DiscountWithReason;
35
+ private checkUsageCreditsLimitWithFailKey;
34
36
  uniqueByProductId(discountList: Discount[]): Discount[];
35
37
  filterDiscountListByProductIds(discountList: Discount[], productIds: number[]): Discount[];
36
38
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
@@ -97,12 +97,8 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
97
97
  `/order/prepare/config`,
98
98
  params
99
99
  );
100
- const rawDiscountList = [
101
- ...((_a = prepareConfig == null ? void 0 : prepareConfig.data) == null ? void 0 : _a.good_pass_list) || [],
102
- ...((_b = prepareConfig == null ? void 0 : prepareConfig.data) == null ? void 0 : _b.discount_card_list) || []
103
- ];
104
100
  const goodPassList = this.filterEnabledDiscountList(
105
- rawDiscountList
101
+ [...((_a = prepareConfig == null ? void 0 : prepareConfig.data) == null ? void 0 : _a.good_pass_list) || [], ...((_b = prepareConfig == null ? void 0 : prepareConfig.data) == null ? void 0 : _b.discount_card_list) || []]
106
102
  ) || [];
107
103
  return goodPassList;
108
104
  }
@@ -112,16 +108,17 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
112
108
  code,
113
109
  translate_flag: 1,
114
110
  tags: ["good_pass", "product_discount_card"],
115
- available: 1,
111
+ // available: 1,
116
112
  relation_product: 1,
117
113
  with: ["extensionData", "customScheduleSnapshot", "holder.detail"],
118
114
  order_behavior_count: 1,
119
115
  order_behavior_count_customer_id: customerId || 1,
120
116
  ...orderId ? { order_behavior_count_order_id: orderId } : {},
117
+ unified_status_info_flag: 1,
121
118
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
122
119
  });
123
- const resultDiscountList = this.filterEnabledDiscountList((result == null ? void 0 : result.data) || []) || [];
124
- return resultDiscountList;
120
+ const resultDiscountWithReason = this.filterEnabledDiscountListWithReason((result == null ? void 0 : result.data) || []) || [];
121
+ return resultDiscountWithReason;
125
122
  }
126
123
  filterEnabledDiscountList(discountList) {
127
124
  return discountList.filter(
@@ -167,6 +164,64 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
167
164
  }
168
165
  return true;
169
166
  }
167
+ // 过滤启用且可用的优惠券,并返回校验失败原因
168
+ filterEnabledDiscountListWithReason(discountList) {
169
+ let lists = discountList.filter((discount) => discount.limit_status === "enable").filter((discount) => {
170
+ const remaining = new import_decimal.default((discount == null ? void 0 : discount.par_value) || 0).minus(new import_decimal.default((discount == null ? void 0 : discount.used_par_value) || 0)).greaterThan(0);
171
+ return remaining;
172
+ }).map((discount) => {
173
+ const limitFailKey = this.checkUsageCreditsLimitWithFailKey(discount);
174
+ return {
175
+ ...discount,
176
+ usageLimitFailKey: limitFailKey
177
+ };
178
+ });
179
+ const availableLists = lists.filter((item) => !item.usageLimitFailKey && item.unified_available_status !== 0);
180
+ const currentFailDiscount = lists.find((item) => item.usageLimitFailKey);
181
+ return {
182
+ discountList: availableLists,
183
+ unavailableReasonKey: currentFailDiscount == null ? void 0 : currentFailDiscount.usageLimitFailKey
184
+ };
185
+ }
186
+ // 检查使用次数限制,并返回校验失败原因
187
+ checkUsageCreditsLimitWithFailKey(discount) {
188
+ if (!discount.extension_data || discount.extension_data.length === 0) {
189
+ return null;
190
+ }
191
+ const usageCreditsData = discount.extension_data.find(
192
+ (data) => data.field_key === "usage_credits"
193
+ );
194
+ if (!usageCreditsData) {
195
+ return null;
196
+ }
197
+ const value = usageCreditsData.value;
198
+ if (value.total_credits && value.total_credits > 0) {
199
+ if ((discount.total_order_behavior_count || 0) >= value.total_credits) {
200
+ return "total_credits";
201
+ }
202
+ }
203
+ if (value.per_user_limit && value.per_user_limit > 0) {
204
+ if ((discount.customer_order_behavior_count || 0) >= value.per_user_limit) {
205
+ return "per_user_limit";
206
+ }
207
+ }
208
+ if (value.max_per_day && value.max_per_day > 0) {
209
+ if ((discount.today_order_behavior_count || 0) >= value.max_per_day) {
210
+ return "max_per_day";
211
+ }
212
+ }
213
+ if (value.max_per_week && value.max_per_week > 0) {
214
+ if ((discount.week_order_behavior_count || 0) >= value.max_per_week) {
215
+ return "max_per_week";
216
+ }
217
+ }
218
+ if (value.max_per_month && value.max_per_month > 0) {
219
+ if ((discount.month_order_behavior_count || 0) >= value.max_per_month) {
220
+ return "max_per_month";
221
+ }
222
+ }
223
+ return null;
224
+ }
170
225
  // 根据productIds去重
171
226
  uniqueByProductId(discountList) {
172
227
  return (0, import_utils.uniqueById)(discountList, "product_id");
@@ -63,6 +63,11 @@ interface UsageCreditsValue {
63
63
  max_per_week: number;
64
64
  max_per_month: number;
65
65
  }
66
+ export type DiscountFilterRejectKey = 'total_credits' | 'per_user_limit' | 'max_per_day' | 'max_per_week' | 'max_per_month';
67
+ export interface DiscountWithReason {
68
+ discountList: Discount[];
69
+ unavailableReasonKey: DiscountFilterRejectKey | null;
70
+ }
66
71
  interface ExtensionData {
67
72
  id: number;
68
73
  shop_id: number;
@@ -135,7 +140,6 @@ export interface Discount {
135
140
  appliedProductDetails: ApplicableProductDetails[];
136
141
  isDisabledForProductUsed?: boolean;
137
142
  amount?: number;
138
- customer_id?: number | string | null;
139
143
  extension_data?: ExtensionData[];
140
144
  total_order_behavior_count?: number;
141
145
  today_order_behavior_count?: number;
@@ -148,6 +152,8 @@ export interface Discount {
148
152
  num?: number;
149
153
  start_date?: string;
150
154
  start_time?: string;
155
+ usageLimitFailKey?: string | null;
156
+ unified_available_status?: number | undefined | null;
151
157
  }
152
158
  export interface DiscountState {
153
159
  discountList: Discount[];
@@ -1,11 +1,12 @@
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, UpdateProductInOrderParams, CheckoutOrderParams, CancelOrderParams, ChangeBookingStatusParams } from './types';
4
4
  import { CartItem } from '../Cart/types';
5
5
  import { type SubmitPayloadEnhancer } from './utils';
6
- import type { OrderAmountSnapshot, AddProductBookingInput, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, OrderScanCodeResult, ReplaceTempOrderOptions, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from './types';
6
+ import type { OrderAmountSnapshot, AddProductBookingInput, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView } from './types';
7
7
  import type { ICustomer } from '../AccountList/types';
8
8
  import type { Discount } from '../Discount/types';
9
+ import { UnavailableReason } from '../Rules/types';
9
10
  export declare class OrderModule extends BaseModule implements Module, OrderModuleAPI {
10
11
  protected defaultName: string;
11
12
  protected defaultVersion: string;
@@ -19,22 +20,11 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
19
20
  private rulesHooksOverride?;
20
21
  private orderHooks?;
21
22
  private otherParams?;
22
- /** 评估器引用;由 SalesSdkProvider 注入,未注入时 applyPromotion 静默跳过 */
23
- private promotionEvaluator;
24
- /** 赠品选择 resolver;由 SDK host bridge 注入 */
25
- private giftSelectResolver;
26
- /** applyPromotion 递归保护 flag(写路径同步调 applyPromotion,禁止重入) */
27
- private isApplyingPromotion;
28
- /** 最近一次 applyPromotion 的未满足促销提示 */
29
- private lastUnfulfilledPromotions;
30
- /** 最近一次 applyPromotion 的赠品操作 diff(debug / SDK 读取使用) */
31
- private lastGiftActions;
32
23
  /**
33
24
  * Populate `savedAmount` on each discount based on product-level discount details.
34
25
  * Only selected discounts get a non-zero value.
35
26
  */
36
27
  static populateSavedAmounts(productList: Array<Record<string, any>>, discountList: Array<Record<string, any>>): void;
37
- private applyProductDiscountPrices;
38
28
  constructor(name?: string, version?: string);
39
29
  initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
40
30
  /**
@@ -53,87 +43,43 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
53
43
  private createDefaultRulesHooks;
54
44
  loadDiscountConfig(params: {
55
45
  customerId: number;
56
- action?: 'create' | 'edit';
57
- orderId?: number;
58
- apply?: boolean;
59
- }): Promise<Discount[]>;
46
+ action?: 'create';
47
+ }): Promise<void>;
60
48
  getDiscountList(): Discount[];
61
- scanCode(code: string, customerId?: number): Promise<OrderScanCodeResult>;
49
+ scanCode(code: string, customerId?: number): Promise<{
50
+ isAvailable: boolean;
51
+ discountList: Discount[];
52
+ type: 'server' | 'clientCalc';
53
+ unavailableReason?: UnavailableReason;
54
+ unavailableReasonKey?: string | null;
55
+ }>;
62
56
  applyDiscount(): void;
63
- /**
64
- * 注入促销评估器。
65
- *
66
- * @example
67
- * order.setPromotionEvaluator(appHelper.utils.promotionEvaluator);
68
- */
69
- setPromotionEvaluator(evaluator: OrderPromotionEvaluator | null): void;
70
- /**
71
- * 注入赠品选择 resolver。OS 需要补赠品时会 await 调用 resolver;缺省时跳过新增并 console.warn。
72
- *
73
- * @example
74
- * order.setGiftSelectResolver(async (ctx) => {
75
- * // SDK 内部决定弹窗 or 自动选第一项,返回完整 OrderProduct[]
76
- * return giftSelectBridge.request(ctx);
77
- * });
78
- */
79
- setGiftSelectResolver(resolver: OrderGiftSelectResolver | null): void;
80
- /**
81
- * 为商品目录追加促销标签,供上层 Sales 门面复用。
82
- *
83
- * @example
84
- * const products = order.appendPromotionTags(catalogProducts);
85
- */
86
- appendPromotionTags<T extends Record<string, any>>(products: T[]): T[];
87
- /**
88
- * 应用购物车促销:计算 → 差异化赠品 → 写回 tempOrder.products → emit onPromotionApplied。
89
- *
90
- * 调用时机:写路径(add/update/remove/clear/setCustomer)末尾自动触发;外部一般无需手动调。
91
- *
92
- * 关键约束:
93
- * - 不调用任何公开 CRUD API(如 removeProductFromOrder),全部内部 mutate tempOrder.products,避免事件风暴;
94
- * - 用 `isApplyingPromotion` 防递归;
95
- * - 多选项赠品依赖 giftSelectResolver,未注入则跳过且 console.warn;
96
- * - 不主动调用 applyDiscount / recalculateSummary,调用方负责跟进。
97
- */
98
- applyPromotion(): Promise<void>;
99
- /** 最近一次 applyPromotion 输出的未满足促销列表 */
100
- getUnfulfilledPromotions(): OrderUnfulfilledPromotion[];
101
- /** 最近一次 applyPromotion 输出的赠品操作 diff */
102
- getLastGiftActions(): OrderLastGiftActions | null;
103
57
  initTempOrder(params: {
104
58
  cacheId?: string;
105
59
  salesSummaryModuleName?: string;
106
60
  }): void;
107
- /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
108
- setEnableTempOrderPersist(_enabled: boolean): void;
109
- /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
110
- isTempOrderPersistEnabled(): boolean;
111
- /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化;草稿保存请使用 IndexedDB saveDraft。 */
61
+ private getTempOrderStorageKey;
62
+ private restoreTempOrderFromStorage;
112
63
  persistTempOrder(): void;
113
64
  private createDefaultTempOrderInstance;
114
65
  private createExternalSaleNumber;
115
66
  private ensureExternalSaleNumber;
116
67
  private ensureRequestUniqueIdempotencyToken;
117
- private buildPaymentSyncIdempotencyToken;
118
68
  hasLocalDatabase(): boolean;
119
69
  private buildLocalOrderRecord;
120
70
  getLocalOrderByOrderId(orderId: number | string): Promise<Record<string, any> | null>;
121
71
  getLocalOrderByOrderNumber(orderNumber: string): Promise<Record<string, any> | null>;
122
72
  getLocalOrderByExternalSaleNumber(externalSaleNumber: string): Promise<Record<string, any> | null>;
123
73
  saveDraft(): Promise<void>;
124
- private saveDraftInBackground;
125
74
  private hydrateTempOrderFromLocalRecord;
126
75
  private extractOrderIdFromSubmitResult;
127
76
  private calculatePaymentTotal;
128
77
  private calculatePaidPaymentSummary;
129
78
  private calculatePaymentServiceFee;
130
- private formatSummaryMetadataMoney;
131
- private syncSummaryProductMetadata;
132
79
  private getPaymentTargetAmount;
133
80
  ensureTempOrder(): OrderTempOrder;
134
81
  restoreOrder(): OrderTempOrder;
135
82
  getTempOrder(): OrderTempOrder | null;
136
- replaceTempOrder(tempOrder: OrderTempOrder, options?: ReplaceTempOrderOptions): Promise<OrderTempOrder>;
137
83
  getOrderIdentity(): OrderIdentitySnapshot | null;
138
84
  getOrderSyncState(): OrderSyncState;
139
85
  getOrderAmountSnapshot(): OrderAmountSnapshot | null;
@@ -144,27 +90,20 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
144
90
  private ensureExtend;
145
91
  private captureProductRuntime;
146
92
  private createLinkedProductAndBooking;
147
- private getBookingUniqueIdentificationNumber;
148
- private findBookingIndexByUniqueIdentificationNumber;
149
- private removeLinkedBookingsForProduct;
150
93
  private getSalesSummary;
151
94
  recalculateSummary(options?: {
152
95
  createIfMissing?: boolean;
153
96
  }): Promise<OrderSummary | null>;
154
97
  getOrderSummary(): Promise<OrderSummary>;
155
98
  updateTempOrderNote(note: string): string;
156
- updateTempOrderNote(note: string, sync: true): Promise<string>;
157
- updateTempOrderNote(note: string, sync: boolean): string | Promise<string>;
158
- syncTempOrderNoteToRemote(orderId: number | string, note: string): Promise<string>;
159
99
  getTempOrderNote(): string;
160
100
  updateTempOrderShopDiscount(amount: string | number): string;
161
101
  updateTempOrderBuzzer(buzzer: string): string;
162
102
  updateTempOrderContactsInfo(contactsInfo: Record<string, any> | null): Record<string, any> | null;
163
- private buildTempOrderCustomer;
164
103
  /**
165
104
  * 更新当前 tempOrder 的客户协议字段。
166
105
  *
167
- * PaymentModal 只需要修改订单里的客户事实;如果外部还有客户模块需要同步,
106
+ * PaymentModal 只需要修改订单里的客户字段;如果外部还有客户模块需要同步,
168
107
  * 应由调用方通过回调处理,不能把外部 UI 状态写进 tempOrder。
169
108
  */
170
109
  updateTempOrderCustomer(customer: UpdateTempOrderCustomerInput): OrderSnapshot['customer'];
@@ -209,15 +148,8 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
209
148
  private shouldMergeProductToOrder;
210
149
  addProductToOrder(product: Partial<OrderProduct> & OrderProductIdentity, booking?: AddProductBookingInput): Promise<OrderProduct[]>;
211
150
  private hasGoodPassDiscount;
212
- updateOrderProduct(params: UpdateOrderProductParams): Promise<OrderProduct[]>;
213
- updateOrderProductQuantity(params: UpdateOrderProductQuantityParams): Promise<OrderProduct[]>;
214
- updateOrderBooking(params: UpdateOrderBookingParams): any[];
151
+ updateProductInOrder(params: UpdateProductInOrderParams): Promise<OrderProduct[]>;
215
152
  removeProductFromOrder(identity: OrderProductIdentity): Promise<OrderProduct[]>;
216
- /**
217
- * 仅清空购物车行(products / bookings),不重置整单。
218
- * 用于「仅清空商品」;客户、备注、支付等协议字段保持不变。
219
- */
220
- clearOrderCartLines(): Promise<OrderTempOrder>;
221
153
  /**
222
154
  * 提交当前 Sales tempOrder。
223
155
  *
@@ -242,7 +174,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
242
174
  private logSubmitBackendRejected;
243
175
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
244
176
  createOrder(params: CommitOrderParams['query']): {
245
- type: "virtual" | "appointment_booking";
177
+ type: "appointment_booking" | "virtual";
246
178
  platform: string;
247
179
  sales_channel: string;
248
180
  order_sales_channel: string;
@@ -289,9 +221,8 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
289
221
  hydrateTempOrderFromRecord(record: Record<string, any>, options?: {
290
222
  recalcOnHydrate?: boolean;
291
223
  }): Promise<OrderTempOrder>;
292
- private normalizeTempOrderForRuntime;
293
224
  private normalizeHydratedOrderProduct;
294
225
  getLastOrderInfo(): Record<string, any> | undefined;
295
226
  getOrderInfo(order_id: number): Promise<any>;
296
227
  }
297
- export type { UpdateOrderBookingParams, UpdateOrderProductParams, UpdateOrderProductQuantityParams, } from './types';
228
+ export type { UpdateProductInOrderParams } from './types';