@pisell/pisellos 0.0.525 → 0.0.543

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.
@@ -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,10 +28,12 @@ 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
  batchSearchByProductIds(productIds: number[]): Promise<any>;
33
33
  filterEnabledDiscountList(discountList: Discount[]): Discount[];
34
34
  private checkUsageCreditsLimit;
35
+ filterEnabledDiscountListWithReason(discountList: Discount[]): DiscountWithReason;
36
+ private checkUsageCreditsLimitWithFailKey;
35
37
  uniqueByProductId(discountList: Discount[]): Discount[];
36
38
  filterDiscountListByProductIds(discountList: Discount[], productIds: number[]): Discount[];
37
39
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
@@ -179,7 +179,7 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
179
179
  key: "batchSearch",
180
180
  value: function () {
181
181
  var _batchSearch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(code, options) {
182
- var _ref, customerId, orderId, result, resultDiscountList;
182
+ var _ref, customerId, orderId, result, resultDiscountWithReason;
183
183
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
184
184
  while (1) switch (_context5.prev = _context5.next) {
185
185
  case 0:
@@ -201,8 +201,8 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
201
201
  }));
202
202
  case 3:
203
203
  result = _context5.sent;
204
- resultDiscountList = this.filterEnabledDiscountList((result === null || result === void 0 ? void 0 : result.data) || []) || [];
205
- return _context5.abrupt("return", resultDiscountList);
204
+ resultDiscountWithReason = this.filterEnabledDiscountListWithReason((result === null || result === void 0 ? void 0 : result.data) || []) || [];
205
+ return _context5.abrupt("return", resultDiscountWithReason);
206
206
  case 6:
207
207
  case "end":
208
208
  return _context5.stop();
@@ -311,6 +311,91 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
311
311
  return true;
312
312
  }
313
313
 
314
+ // 过滤启用且可用的优惠券,并返回校验失败原因
315
+ }, {
316
+ key: "filterEnabledDiscountListWithReason",
317
+ value: function filterEnabledDiscountListWithReason(discountList) {
318
+ var _this3 = this;
319
+ var lists = discountList.filter(function (discount) {
320
+ return discount.limit_status === 'enable';
321
+ }).filter(function (discount) {
322
+ var remaining = new Decimal((discount === null || discount === void 0 ? void 0 : discount.par_value) || 0).minus(new Decimal((discount === null || discount === void 0 ? void 0 : discount.used_par_value) || 0)).greaterThan(0);
323
+ return remaining;
324
+ }).map(function (discount) {
325
+ var limitFailKey = _this3.checkUsageCreditsLimitWithFailKey(discount);
326
+ return _objectSpread(_objectSpread({}, discount), {}, {
327
+ usageLimitFailKey: limitFailKey
328
+ });
329
+ });
330
+
331
+ // 可用的列表
332
+ var availableLists = lists.filter(function (item) {
333
+ return !item.usageLimitFailKey;
334
+ });
335
+ // 不可用数据
336
+ var currentFailDiscount = lists.find(function (item) {
337
+ return item.usageLimitFailKey;
338
+ });
339
+ return {
340
+ discountList: availableLists,
341
+ unavailableReasonKey: currentFailDiscount === null || currentFailDiscount === void 0 ? void 0 : currentFailDiscount.usageLimitFailKey
342
+ };
343
+ }
344
+
345
+ // 检查使用次数限制,并返回校验失败原因
346
+ }, {
347
+ key: "checkUsageCreditsLimitWithFailKey",
348
+ value: function checkUsageCreditsLimitWithFailKey(discount) {
349
+ if (!discount.extension_data || discount.extension_data.length === 0) {
350
+ return null;
351
+ }
352
+ var usageCreditsData = discount.extension_data.find(function (data) {
353
+ return data.field_key === 'usage_credits';
354
+ });
355
+ if (!usageCreditsData) {
356
+ return null;
357
+ }
358
+ var value = usageCreditsData.value;
359
+
360
+ // 总次数限制
361
+ if (value.total_credits && value.total_credits > 0) {
362
+ if ((discount.total_order_behavior_count || 0) >= value.total_credits) {
363
+ return 'total_credits';
364
+ }
365
+ }
366
+
367
+ // 单用户限制
368
+ if (value.per_user_limit && value.per_user_limit > 0) {
369
+ if ((discount.customer_order_behavior_count || 0) >= value.per_user_limit) {
370
+ return 'per_user_limit';
371
+ }
372
+ }
373
+
374
+ // 单日限制
375
+ if (value.max_per_day && value.max_per_day > 0) {
376
+ if ((discount.today_order_behavior_count || 0) >= value.max_per_day) {
377
+ return 'max_per_day';
378
+ }
379
+ }
380
+
381
+ // 单周限制
382
+ if (value.max_per_week && value.max_per_week > 0) {
383
+ if ((discount.week_order_behavior_count || 0) >= value.max_per_week) {
384
+ return 'max_per_week';
385
+ }
386
+ }
387
+
388
+ // 单月限制
389
+ if (value.max_per_month && value.max_per_month > 0) {
390
+ if ((discount.month_order_behavior_count || 0) >= value.max_per_month) {
391
+ return 'max_per_month';
392
+ }
393
+ }
394
+
395
+ // 全部通过
396
+ return null;
397
+ }
398
+
314
399
  // 根据productIds去重
315
400
  }, {
316
401
  key: "uniqueByProductId",
@@ -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;
@@ -149,6 +154,7 @@ export interface Discount {
149
154
  start_date?: string;
150
155
  start_time?: string;
151
156
  discount_rule_uncheck_flag?: boolean;
157
+ usageLimitFailKey?: string | null;
152
158
  }
153
159
  export interface DiscountState {
154
160
  discountList: Discount[];
@@ -47,6 +47,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
47
47
  discountList: Discount[];
48
48
  type: 'server' | 'clientCalc';
49
49
  unavailableReason?: UnavailableReason;
50
+ unavailableReasonKey?: string | null;
50
51
  }>;
51
52
  applyDiscount(): void;
52
53
  initTempOrder(params: {
@@ -82,7 +83,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
82
83
  enhancePayload?: SubmitPayloadEnhancer;
83
84
  }): Promise<T>;
84
85
  createOrder(params: CommitOrderParams['query']): {
85
- type: "appointment_booking" | "virtual";
86
+ type: "virtual" | "appointment_booking";
86
87
  platform: string;
87
88
  sales_channel: string;
88
89
  order_sales_channel: string;
@@ -225,7 +225,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
225
225
  value: function () {
226
226
  var _scanCode = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(code, customerId) {
227
227
  var _this$store$discount4, _tempOrder$holder, _tempOrder$holder2, _tempOrder$summary;
228
- var resultDiscountList, rulesModule, withScanList, currentSelected, tempOrder, holders, _ref, isAvailable, newDiscountList, unavailableReason, _this$store$discount5;
228
+ var resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelected, tempOrder, holders, _ref, isAvailable, newDiscountList, unavailableReason, _this$store$discount5;
229
229
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
230
230
  while (1) switch (_context3.prev = _context3.next) {
231
231
  case 0:
@@ -239,12 +239,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
239
239
  _context3.next = 5;
240
240
  break;
241
241
  }
242
- _context3.t0 = [];
242
+ _context3.t0 = {
243
+ discountList: [],
244
+ unavailableReasonKey: null
245
+ };
243
246
  case 5:
244
- resultDiscountList = _context3.t0;
247
+ resultDiscountWithReason = _context3.t0;
248
+ resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
245
249
  rulesModule = this.store.rules;
246
250
  if (rulesModule) {
247
- _context3.next = 9;
251
+ _context3.next = 10;
248
252
  break;
249
253
  }
250
254
  return _context3.abrupt("return", {
@@ -253,17 +257,18 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
253
257
  discountList: this.getDiscountList(),
254
258
  unavailableReason: UnavailableReason.Unknown
255
259
  });
256
- case 9:
260
+ case 10:
257
261
  if (resultDiscountList.length) {
258
- _context3.next = 11;
262
+ _context3.next = 12;
259
263
  break;
260
264
  }
261
265
  return _context3.abrupt("return", {
262
266
  type: 'server',
263
267
  isAvailable: false,
264
- discountList: this.getDiscountList()
268
+ discountList: this.getDiscountList(),
269
+ unavailableReasonKey: unavailableReasonKey
265
270
  });
266
- case 11:
271
+ case 12:
267
272
  withScanList = resultDiscountList.map(function (item) {
268
273
  return _objectSpread(_objectSpread({}, item), {}, {
269
274
  isScan: true
@@ -277,7 +282,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
277
282
  return m.id === n.id;
278
283
  });
279
284
  }))) {
280
- _context3.next = 15;
285
+ _context3.next = 16;
281
286
  break;
282
287
  }
283
288
  return _context3.abrupt("return", {
@@ -285,7 +290,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
285
290
  isAvailable: true,
286
291
  discountList: this.getDiscountList()
287
292
  });
288
- case 15:
293
+ case 16:
289
294
  tempOrder = this.store.tempOrder;
290
295
  holders = tempOrder !== null && tempOrder !== void 0 && (_tempOrder$holder = tempOrder.holder) !== null && _tempOrder$holder !== void 0 && _tempOrder$holder.form_record_id ? [{
291
296
  form_record_id: tempOrder.holder.form_record_id
@@ -311,7 +316,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
311
316
  discountList: newDiscountList || this.getDiscountList(),
312
317
  unavailableReason: unavailableReason
313
318
  });
314
- case 20:
319
+ case 21:
315
320
  case "end":
316
321
  return _context3.stop();
317
322
  }
@@ -311,7 +311,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
311
311
  date: string;
312
312
  status: string;
313
313
  week: string;
314
- weekNum: 0 | 2 | 1 | 3 | 5 | 4 | 6;
314
+ weekNum: 0 | 2 | 1 | 5 | 3 | 4 | 6;
315
315
  }[]>;
316
316
  submitTimeSlot(timeSlots: TimeSliceItem): void;
317
317
  private getScheduleDataByIds;
@@ -131,7 +131,7 @@ export declare class BookingTicketImpl extends BaseModule implements Module {
131
131
  * 获取当前的客户搜索条件
132
132
  * @returns 当前搜索条件
133
133
  */
134
- getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "skip" | "num">;
134
+ getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "num" | "skip">;
135
135
  /**
136
136
  * 获取客户列表状态(包含滚动加载相关状态)
137
137
  * @returns 客户状态
@@ -47,6 +47,7 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
47
47
  discountList: Discount[];
48
48
  type: "server" | "clientCalc";
49
49
  unavailableReason?: UnavailableReason;
50
+ unavailableReasonKey?: string | null;
50
51
  }>;
51
52
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
52
53
  private getCustomer;
@@ -444,7 +444,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
444
444
  key: "scanCode",
445
445
  value: function () {
446
446
  var _scanCode = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(code, customerId) {
447
- var _this$store$discount4, _this$store$bookingSu2, resultDiscountList, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, isAvailable, unavailableReason, _this$options$otherPa6;
447
+ var _this$store$discount4, _this$store$bookingSu2, resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, isAvailable, unavailableReason, _this$options$otherPa6;
448
448
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
449
449
  while (1) switch (_context6.prev = _context6.next) {
450
450
  case 0:
@@ -460,12 +460,16 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
460
460
  _context6.next = 6;
461
461
  break;
462
462
  }
463
- _context6.t0 = [];
463
+ _context6.t0 = {
464
+ discountList: [],
465
+ unavailableReasonKey: null
466
+ };
464
467
  case 6:
465
- resultDiscountList = _context6.t0;
468
+ resultDiscountWithReason = _context6.t0;
469
+ resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
466
470
  rulesModule = this.store.rules;
467
471
  if (rulesModule) {
468
- _context6.next = 10;
472
+ _context6.next = 11;
469
473
  break;
470
474
  }
471
475
  return _context6.abrupt("return", {
@@ -475,18 +479,19 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
475
479
  discountList: this.getDiscountList(),
476
480
  unavailableReason: UnavailableReason.Unknown
477
481
  });
478
- case 10:
482
+ case 11:
479
483
  if (resultDiscountList.length) {
480
- _context6.next = 12;
484
+ _context6.next = 13;
481
485
  break;
482
486
  }
483
487
  return _context6.abrupt("return", {
484
488
  type: "server",
485
489
  isAvailable: false,
486
490
  productList: this.store.productList || [],
487
- discountList: this.getDiscountList()
491
+ discountList: this.getDiscountList(),
492
+ unavailableReasonKey: unavailableReasonKey
488
493
  });
489
- case 12:
494
+ case 13:
490
495
  withScanList = resultDiscountList.map(function (item) {
491
496
  return _objectSpread(_objectSpread({}, item), {}, {
492
497
  isScan: true
@@ -500,7 +505,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
500
505
  return m.id === n.id;
501
506
  });
502
507
  }))) {
503
- _context6.next = 16;
508
+ _context6.next = 17;
504
509
  break;
505
510
  }
506
511
  return _context6.abrupt("return", {
@@ -509,7 +514,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
509
514
  productList: this.store.productList || [],
510
515
  discountList: this.getDiscountList()
511
516
  });
512
- case 16:
517
+ case 17:
513
518
  _ref2 = rulesModule.isDiscountListAvailable({
514
519
  productList: this.store.productList || [],
515
520
  oldDiscountList: this.getDiscountList(),
@@ -523,19 +528,19 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
523
528
  discountList: this.getDiscountList()
524
529
  }, newProductList = _ref2.productList, newDiscountList = _ref2.discountList, isAvailable = _ref2.isAvailable, unavailableReason = _ref2.unavailableReason;
525
530
  if (!isAvailable) {
526
- _context6.next = 24;
531
+ _context6.next = 25;
527
532
  break;
528
533
  }
529
534
  this.setDiscountList(newDiscountList || []);
530
535
  this.store.originalDiscountList = newDiscountList || [];
531
536
  this.setProductList(newProductList || []);
532
537
  if (!(this.isWalkIn() && resultDiscountList.length && ((_this$options$otherPa6 = this.options.otherParams) === null || _this$options$otherPa6 === void 0 ? void 0 : _this$options$otherPa6.platform) === 'shop')) {
533
- _context6.next = 24;
538
+ _context6.next = 25;
534
539
  break;
535
540
  }
536
- _context6.next = 24;
541
+ _context6.next = 25;
537
542
  return this.getCustomerWallet(resultDiscountList[0].customer_id);
538
- case 24:
543
+ case 25:
539
544
  return _context6.abrupt("return", {
540
545
  type: "clientCalc",
541
546
  isAvailable: isAvailable || false,
@@ -543,8 +548,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
543
548
  discountList: newDiscountList || this.getDiscountList(),
544
549
  unavailableReason: unavailableReason
545
550
  });
546
- case 27:
547
- _context6.prev = 27;
551
+ case 28:
552
+ _context6.prev = 28;
548
553
  _context6.t1 = _context6["catch"](0);
549
554
  console.error('[ShopDiscount] 扫码出错:', _context6.t1);
550
555
  return _context6.abrupt("return", {
@@ -554,11 +559,11 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
554
559
  discountList: this.getDiscountList(),
555
560
  unavailableReason: UnavailableReason.Unknown
556
561
  });
557
- case 31:
562
+ case 32:
558
563
  case "end":
559
564
  return _context6.stop();
560
565
  }
561
- }, _callee6, this, [[0, 27]]);
566
+ }, _callee6, this, [[0, 28]]);
562
567
  }));
563
568
  function scanCode(_x5, _x6) {
564
569
  return _scanCode.apply(this, arguments);
@@ -155,6 +155,7 @@ export declare class VenueBookingImpl extends BaseModule implements Module {
155
155
  discountList: import("../../modules/Discount").Discount[];
156
156
  type: "server" | "clientCalc";
157
157
  unavailableReason?: import("../../modules/Rules/types").UnavailableReason | undefined;
158
+ unavailableReasonKey?: string | null | undefined;
158
159
  }>;
159
160
  /** 获取当前折扣列表(包装 order.getDiscountList) */
160
161
  getDiscountList(): import("../../modules/Discount").Discount[];
@@ -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,10 +28,12 @@ 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
  batchSearchByProductIds(productIds: number[]): Promise<any>;
33
33
  filterEnabledDiscountList(discountList: Discount[]): Discount[];
34
34
  private checkUsageCreditsLimit;
35
+ filterEnabledDiscountListWithReason(discountList: Discount[]): DiscountWithReason;
36
+ private checkUsageCreditsLimitWithFailKey;
35
37
  uniqueByProductId(discountList: Discount[]): Discount[];
36
38
  filterDiscountListByProductIds(discountList: Discount[], productIds: number[]): Discount[];
37
39
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
@@ -116,8 +116,8 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
116
116
  ...orderId ? { order_behavior_count_order_id: orderId } : {},
117
117
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
118
118
  });
119
- const resultDiscountList = this.filterEnabledDiscountList((result == null ? void 0 : result.data) || []) || [];
120
- return resultDiscountList;
119
+ const resultDiscountWithReason = this.filterEnabledDiscountListWithReason((result == null ? void 0 : result.data) || []) || [];
120
+ return resultDiscountWithReason;
121
121
  }
122
122
  async batchSearchByProductIds(productIds) {
123
123
  const result = await this.request.get(`/machinecode/batch-search`, {
@@ -172,6 +172,64 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
172
172
  }
173
173
  return true;
174
174
  }
175
+ // 过滤启用且可用的优惠券,并返回校验失败原因
176
+ filterEnabledDiscountListWithReason(discountList) {
177
+ let lists = discountList.filter((discount) => discount.limit_status === "enable").filter((discount) => {
178
+ 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);
179
+ return remaining;
180
+ }).map((discount) => {
181
+ const limitFailKey = this.checkUsageCreditsLimitWithFailKey(discount);
182
+ return {
183
+ ...discount,
184
+ usageLimitFailKey: limitFailKey
185
+ };
186
+ });
187
+ const availableLists = lists.filter((item) => !item.usageLimitFailKey);
188
+ const currentFailDiscount = lists.find((item) => item.usageLimitFailKey);
189
+ return {
190
+ discountList: availableLists,
191
+ unavailableReasonKey: currentFailDiscount == null ? void 0 : currentFailDiscount.usageLimitFailKey
192
+ };
193
+ }
194
+ // 检查使用次数限制,并返回校验失败原因
195
+ checkUsageCreditsLimitWithFailKey(discount) {
196
+ if (!discount.extension_data || discount.extension_data.length === 0) {
197
+ return null;
198
+ }
199
+ const usageCreditsData = discount.extension_data.find(
200
+ (data) => data.field_key === "usage_credits"
201
+ );
202
+ if (!usageCreditsData) {
203
+ return null;
204
+ }
205
+ const value = usageCreditsData.value;
206
+ if (value.total_credits && value.total_credits > 0) {
207
+ if ((discount.total_order_behavior_count || 0) >= value.total_credits) {
208
+ return "total_credits";
209
+ }
210
+ }
211
+ if (value.per_user_limit && value.per_user_limit > 0) {
212
+ if ((discount.customer_order_behavior_count || 0) >= value.per_user_limit) {
213
+ return "per_user_limit";
214
+ }
215
+ }
216
+ if (value.max_per_day && value.max_per_day > 0) {
217
+ if ((discount.today_order_behavior_count || 0) >= value.max_per_day) {
218
+ return "max_per_day";
219
+ }
220
+ }
221
+ if (value.max_per_week && value.max_per_week > 0) {
222
+ if ((discount.week_order_behavior_count || 0) >= value.max_per_week) {
223
+ return "max_per_week";
224
+ }
225
+ }
226
+ if (value.max_per_month && value.max_per_month > 0) {
227
+ if ((discount.month_order_behavior_count || 0) >= value.max_per_month) {
228
+ return "max_per_month";
229
+ }
230
+ }
231
+ return null;
232
+ }
175
233
  // 根据productIds去重
176
234
  uniqueByProductId(discountList) {
177
235
  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;
@@ -149,6 +154,7 @@ export interface Discount {
149
154
  start_date?: string;
150
155
  start_time?: string;
151
156
  discount_rule_uncheck_flag?: boolean;
157
+ usageLimitFailKey?: string | null;
152
158
  }
153
159
  export interface DiscountState {
154
160
  discountList: Discount[];
@@ -47,6 +47,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
47
47
  discountList: Discount[];
48
48
  type: 'server' | 'clientCalc';
49
49
  unavailableReason?: UnavailableReason;
50
+ unavailableReasonKey?: string | null;
50
51
  }>;
51
52
  applyDiscount(): void;
52
53
  initTempOrder(params: {
@@ -185,7 +185,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
185
185
  }
186
186
  async scanCode(code, customerId) {
187
187
  var _a, _b, _c, _d, _e;
188
- const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId })) || [];
188
+ const resultDiscountWithReason = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId })) || { discountList: [], unavailableReasonKey: null };
189
+ const { discountList: resultDiscountList, unavailableReasonKey } = resultDiscountWithReason;
189
190
  const rulesModule = this.store.rules;
190
191
  if (!rulesModule) {
191
192
  return {
@@ -199,7 +200,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
199
200
  return {
200
201
  type: "server",
201
202
  isAvailable: false,
202
- discountList: this.getDiscountList()
203
+ discountList: this.getDiscountList(),
204
+ unavailableReasonKey
203
205
  };
204
206
  }
205
207
  const withScanList = resultDiscountList.map((item) => ({ ...item, isScan: true }));
@@ -311,7 +311,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
311
311
  date: string;
312
312
  status: string;
313
313
  week: string;
314
- weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
314
+ weekNum: 0 | 2 | 1 | 5 | 3 | 4 | 6;
315
315
  }[]>;
316
316
  submitTimeSlot(timeSlots: TimeSliceItem): void;
317
317
  private getScheduleDataByIds;
@@ -47,6 +47,7 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
47
47
  discountList: Discount[];
48
48
  type: "server" | "clientCalc";
49
49
  unavailableReason?: UnavailableReason;
50
+ unavailableReasonKey?: string | null;
50
51
  }>;
51
52
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
52
53
  private getCustomer;
@@ -288,7 +288,8 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
288
288
  async scanCode(code, customerId) {
289
289
  var _a, _b, _c;
290
290
  try {
291
- const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId, orderId: this.store.orderId })) || [];
291
+ const resultDiscountWithReason = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId, orderId: this.store.orderId })) || { discountList: [], unavailableReasonKey: null };
292
+ const { discountList: resultDiscountList, unavailableReasonKey } = resultDiscountWithReason;
292
293
  const rulesModule = this.store.rules;
293
294
  if (!rulesModule) {
294
295
  return {
@@ -304,7 +305,8 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
304
305
  type: "server",
305
306
  isAvailable: false,
306
307
  productList: this.store.productList || [],
307
- discountList: this.getDiscountList()
308
+ discountList: this.getDiscountList(),
309
+ unavailableReasonKey
308
310
  };
309
311
  }
310
312
  const withScanList = resultDiscountList.map((item) => {
@@ -155,6 +155,7 @@ export declare class VenueBookingImpl extends BaseModule implements Module {
155
155
  discountList: import("../../modules/Discount").Discount[];
156
156
  type: "server" | "clientCalc";
157
157
  unavailableReason?: import("../../modules/Rules/types").UnavailableReason | undefined;
158
+ unavailableReasonKey?: string | null | undefined;
158
159
  }>;
159
160
  /** 获取当前折扣列表(包装 order.getDiscountList) */
160
161
  getDiscountList(): import("../../modules/Discount").Discount[];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "0.0.525",
4
+ "version": "0.0.543",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",