@pisell/pisellos 2.1.150 → 2.1.152

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:
@@ -189,7 +189,7 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
189
189
  code: code,
190
190
  translate_flag: 1,
191
191
  tags: ['good_pass', 'product_discount_card'],
192
- available: 1,
192
+ // available: 1,
193
193
  relation_product: 1,
194
194
  with: ['extensionData', 'customScheduleSnapshot', 'holder.detail'],
195
195
  order_behavior_count: 1,
@@ -197,12 +197,13 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
197
197
  }, orderId ? {
198
198
  order_behavior_count_order_id: orderId
199
199
  } : {}), {}, {
200
+ unified_status_info_flag: 1,
200
201
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
201
202
  }));
202
203
  case 3:
203
204
  result = _context5.sent;
204
- resultDiscountList = this.filterEnabledDiscountList((result === null || result === void 0 ? void 0 : result.data) || []) || [];
205
- return _context5.abrupt("return", resultDiscountList);
205
+ resultDiscountWithReason = this.filterEnabledDiscountListWithReason((result === null || result === void 0 ? void 0 : result.data) || []) || [];
206
+ return _context5.abrupt("return", resultDiscountWithReason);
206
207
  case 6:
207
208
  case "end":
208
209
  return _context5.stop();
@@ -311,6 +312,91 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
311
312
  return true;
312
313
  }
313
314
 
315
+ // 过滤启用且可用的优惠券,并返回校验失败原因
316
+ }, {
317
+ key: "filterEnabledDiscountListWithReason",
318
+ value: function filterEnabledDiscountListWithReason(discountList) {
319
+ var _this3 = this;
320
+ var lists = discountList.filter(function (discount) {
321
+ return discount.limit_status === 'enable';
322
+ }).filter(function (discount) {
323
+ 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);
324
+ return remaining;
325
+ }).map(function (discount) {
326
+ var limitFailKey = _this3.checkUsageCreditsLimitWithFailKey(discount);
327
+ return _objectSpread(_objectSpread({}, discount), {}, {
328
+ usageLimitFailKey: limitFailKey
329
+ });
330
+ });
331
+
332
+ // 可用的列表
333
+ var availableLists = lists.filter(function (item) {
334
+ return !item.usageLimitFailKey && item.unified_available_status !== 0;
335
+ });
336
+ // 不可用数据
337
+ var currentFailDiscount = lists.find(function (item) {
338
+ return item.usageLimitFailKey;
339
+ });
340
+ return {
341
+ discountList: availableLists,
342
+ unavailableReasonKey: currentFailDiscount === null || currentFailDiscount === void 0 ? void 0 : currentFailDiscount.usageLimitFailKey
343
+ };
344
+ }
345
+
346
+ // 检查使用次数限制,并返回校验失败原因
347
+ }, {
348
+ key: "checkUsageCreditsLimitWithFailKey",
349
+ value: function checkUsageCreditsLimitWithFailKey(discount) {
350
+ if (!discount.extension_data || discount.extension_data.length === 0) {
351
+ return null;
352
+ }
353
+ var usageCreditsData = discount.extension_data.find(function (data) {
354
+ return data.field_key === 'usage_credits';
355
+ });
356
+ if (!usageCreditsData) {
357
+ return null;
358
+ }
359
+ var value = usageCreditsData.value;
360
+
361
+ // 总次数限制
362
+ if (value.total_credits && value.total_credits > 0) {
363
+ if ((discount.total_order_behavior_count || 0) >= value.total_credits) {
364
+ return 'total_credits';
365
+ }
366
+ }
367
+
368
+ // 单用户限制
369
+ if (value.per_user_limit && value.per_user_limit > 0) {
370
+ if ((discount.customer_order_behavior_count || 0) >= value.per_user_limit) {
371
+ return 'per_user_limit';
372
+ }
373
+ }
374
+
375
+ // 单日限制
376
+ if (value.max_per_day && value.max_per_day > 0) {
377
+ if ((discount.today_order_behavior_count || 0) >= value.max_per_day) {
378
+ return 'max_per_day';
379
+ }
380
+ }
381
+
382
+ // 单周限制
383
+ if (value.max_per_week && value.max_per_week > 0) {
384
+ if ((discount.week_order_behavior_count || 0) >= value.max_per_week) {
385
+ return 'max_per_week';
386
+ }
387
+ }
388
+
389
+ // 单月限制
390
+ if (value.max_per_month && value.max_per_month > 0) {
391
+ if ((discount.month_order_behavior_count || 0) >= value.max_per_month) {
392
+ return 'max_per_month';
393
+ }
394
+ }
395
+
396
+ // 全部通过
397
+ return null;
398
+ }
399
+
314
400
  // 根据productIds去重
315
401
  }, {
316
402
  key: "uniqueByProductId",
@@ -61,6 +61,11 @@ interface UsageCreditsValue {
61
61
  max_per_week: number;
62
62
  max_per_month: number;
63
63
  }
64
+ export type DiscountFilterRejectKey = 'total_credits' | 'per_user_limit' | 'max_per_day' | 'max_per_week' | 'max_per_month';
65
+ export interface DiscountWithReason {
66
+ discountList: Discount[];
67
+ unavailableReasonKey: DiscountFilterRejectKey | null;
68
+ }
64
69
  interface ExtensionData {
65
70
  id: number;
66
71
  shop_id: number;
@@ -131,6 +136,8 @@ export interface Discount {
131
136
  start_date?: string;
132
137
  start_time?: string;
133
138
  discount_rule_uncheck_flag?: boolean;
139
+ usageLimitFailKey?: string | null;
140
+ unified_available_status?: number | undefined | null;
134
141
  }
135
142
  export interface DiscountState {
136
143
  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: {
@@ -228,7 +228,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
228
228
  value: function () {
229
229
  var _scanCode = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(code, customerId) {
230
230
  var _this$store$discount4, _tempOrder$holder, _tempOrder$holder2;
231
- var resultDiscountList, rulesModule, withScanList, currentSelected, tempOrder, holders, _ref, isAvailable, newDiscountList, unavailableReason, _this$store$discount5;
231
+ var resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelected, tempOrder, holders, _ref, isAvailable, newDiscountList, unavailableReason, _this$store$discount5;
232
232
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
233
233
  while (1) switch (_context3.prev = _context3.next) {
234
234
  case 0:
@@ -242,12 +242,16 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
242
242
  _context3.next = 5;
243
243
  break;
244
244
  }
245
- _context3.t0 = [];
245
+ _context3.t0 = {
246
+ discountList: [],
247
+ unavailableReasonKey: null
248
+ };
246
249
  case 5:
247
- resultDiscountList = _context3.t0;
250
+ resultDiscountWithReason = _context3.t0;
251
+ resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
248
252
  rulesModule = this.store.rules;
249
253
  if (rulesModule) {
250
- _context3.next = 9;
254
+ _context3.next = 10;
251
255
  break;
252
256
  }
253
257
  return _context3.abrupt("return", {
@@ -256,17 +260,18 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
256
260
  discountList: this.getDiscountList(),
257
261
  unavailableReason: UnavailableReason.Unknown
258
262
  });
259
- case 9:
263
+ case 10:
260
264
  if (resultDiscountList.length) {
261
- _context3.next = 11;
265
+ _context3.next = 12;
262
266
  break;
263
267
  }
264
268
  return _context3.abrupt("return", {
265
269
  type: 'server',
266
270
  isAvailable: false,
267
- discountList: this.getDiscountList()
271
+ discountList: this.getDiscountList(),
272
+ unavailableReasonKey: unavailableReasonKey
268
273
  });
269
- case 11:
274
+ case 12:
270
275
  withScanList = resultDiscountList.map(function (item) {
271
276
  return _objectSpread(_objectSpread({}, item), {}, {
272
277
  isScan: true
@@ -280,7 +285,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
280
285
  return m.id === n.id;
281
286
  });
282
287
  }))) {
283
- _context3.next = 15;
288
+ _context3.next = 16;
284
289
  break;
285
290
  }
286
291
  return _context3.abrupt("return", {
@@ -288,7 +293,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
288
293
  isAvailable: true,
289
294
  discountList: this.getDiscountList()
290
295
  });
291
- case 15:
296
+ case 16:
292
297
  tempOrder = this.store.tempOrder;
293
298
  holders = tempOrder !== null && tempOrder !== void 0 && (_tempOrder$holder = tempOrder.holder) !== null && _tempOrder$holder !== void 0 && _tempOrder$holder.form_record_id ? [{
294
299
  form_record_id: tempOrder.holder.form_record_id
@@ -313,7 +318,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
313
318
  discountList: newDiscountList || this.getDiscountList(),
314
319
  unavailableReason: unavailableReason
315
320
  });
316
- case 20:
321
+ case 21:
317
322
  case "end":
318
323
  return _context3.stop();
319
324
  }
@@ -310,7 +310,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
310
310
  date: string;
311
311
  status: string;
312
312
  week: string;
313
- weekNum: 0 | 2 | 1 | 5 | 4 | 3 | 6;
313
+ weekNum: 0 | 2 | 1 | 5 | 3 | 4 | 6;
314
314
  }[]>;
315
315
  submitTimeSlot(timeSlots: TimeSliceItem): void;
316
316
  private getScheduleDataByIds;
@@ -46,6 +46,7 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
46
46
  discountList: Discount[];
47
47
  type: "server" | "clientCalc";
48
48
  unavailableReason?: UnavailableReason;
49
+ unavailableReasonKey?: string | null;
49
50
  }>;
50
51
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
51
52
  private getCustomer;
@@ -434,7 +434,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
434
434
  key: "scanCode",
435
435
  value: function () {
436
436
  var _scanCode = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(code, customerId) {
437
- var _this$store$discount4, _this$store$bookingSu2, resultDiscountList, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, isAvailable, unavailableReason, _this$options$otherPa6;
437
+ var _this$store$discount4, _this$store$bookingSu2, resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, isAvailable, unavailableReason, _this$options$otherPa6;
438
438
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
439
439
  while (1) switch (_context6.prev = _context6.next) {
440
440
  case 0:
@@ -450,12 +450,16 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
450
450
  _context6.next = 6;
451
451
  break;
452
452
  }
453
- _context6.t0 = [];
453
+ _context6.t0 = {
454
+ discountList: [],
455
+ unavailableReasonKey: null
456
+ };
454
457
  case 6:
455
- resultDiscountList = _context6.t0;
458
+ resultDiscountWithReason = _context6.t0;
459
+ resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
456
460
  rulesModule = this.store.rules;
457
461
  if (rulesModule) {
458
- _context6.next = 10;
462
+ _context6.next = 11;
459
463
  break;
460
464
  }
461
465
  return _context6.abrupt("return", {
@@ -465,18 +469,19 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
465
469
  discountList: this.getDiscountList(),
466
470
  unavailableReason: UnavailableReason.Unknown
467
471
  });
468
- case 10:
472
+ case 11:
469
473
  if (resultDiscountList.length) {
470
- _context6.next = 12;
474
+ _context6.next = 13;
471
475
  break;
472
476
  }
473
477
  return _context6.abrupt("return", {
474
478
  type: "server",
475
479
  isAvailable: false,
476
480
  productList: this.store.productList || [],
477
- discountList: this.getDiscountList()
481
+ discountList: this.getDiscountList(),
482
+ unavailableReasonKey: unavailableReasonKey
478
483
  });
479
- case 12:
484
+ case 13:
480
485
  withScanList = resultDiscountList.map(function (item) {
481
486
  return _objectSpread(_objectSpread({}, item), {}, {
482
487
  isScan: true
@@ -490,7 +495,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
490
495
  return m.id === n.id;
491
496
  });
492
497
  }))) {
493
- _context6.next = 16;
498
+ _context6.next = 17;
494
499
  break;
495
500
  }
496
501
  return _context6.abrupt("return", {
@@ -499,7 +504,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
499
504
  productList: this.store.productList || [],
500
505
  discountList: this.getDiscountList()
501
506
  });
502
- case 16:
507
+ case 17:
503
508
  _ref2 = rulesModule.isDiscountListAvailable({
504
509
  productList: this.store.productList || [],
505
510
  oldDiscountList: this.getDiscountList(),
@@ -512,19 +517,19 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
512
517
  discountList: this.getDiscountList()
513
518
  }, newProductList = _ref2.productList, newDiscountList = _ref2.discountList, isAvailable = _ref2.isAvailable, unavailableReason = _ref2.unavailableReason;
514
519
  if (!isAvailable) {
515
- _context6.next = 24;
520
+ _context6.next = 25;
516
521
  break;
517
522
  }
518
523
  this.setDiscountList(newDiscountList || []);
519
524
  this.store.originalDiscountList = newDiscountList || [];
520
525
  this.setProductList(newProductList || []);
521
526
  if (!(this.isWalkIn() && resultDiscountList.length && ((_this$options$otherPa6 = this.options.otherParams) === null || _this$options$otherPa6 === void 0 ? void 0 : _this$options$otherPa6.platform) === 'shop')) {
522
- _context6.next = 24;
527
+ _context6.next = 25;
523
528
  break;
524
529
  }
525
- _context6.next = 24;
530
+ _context6.next = 25;
526
531
  return this.getCustomerWallet(resultDiscountList[0].customer_id);
527
- case 24:
532
+ case 25:
528
533
  return _context6.abrupt("return", {
529
534
  type: "clientCalc",
530
535
  isAvailable: isAvailable || false,
@@ -532,8 +537,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
532
537
  discountList: newDiscountList || this.getDiscountList(),
533
538
  unavailableReason: unavailableReason
534
539
  });
535
- case 27:
536
- _context6.prev = 27;
540
+ case 28:
541
+ _context6.prev = 28;
537
542
  _context6.t1 = _context6["catch"](0);
538
543
  console.error('[ShopDiscount] 扫码出错:', _context6.t1);
539
544
  return _context6.abrupt("return", {
@@ -543,11 +548,11 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
543
548
  discountList: this.getDiscountList(),
544
549
  unavailableReason: UnavailableReason.Unknown
545
550
  });
546
- case 31:
551
+ case 32:
547
552
  case "end":
548
553
  return _context6.stop();
549
554
  }
550
- }, _callee6, this, [[0, 27]]);
555
+ }, _callee6, this, [[0, 28]]);
551
556
  }));
552
557
  function scanCode(_x5, _x6) {
553
558
  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;
@@ -108,16 +108,17 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
108
108
  code,
109
109
  translate_flag: 1,
110
110
  tags: ["good_pass", "product_discount_card"],
111
- available: 1,
111
+ // available: 1,
112
112
  relation_product: 1,
113
113
  with: ["extensionData", "customScheduleSnapshot", "holder.detail"],
114
114
  order_behavior_count: 1,
115
115
  order_behavior_count_customer_id: customerId || 1,
116
116
  ...orderId ? { order_behavior_count_order_id: orderId } : {},
117
+ unified_status_info_flag: 1,
117
118
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
118
119
  });
119
- const resultDiscountList = this.filterEnabledDiscountList((result == null ? void 0 : result.data) || []) || [];
120
- return resultDiscountList;
120
+ const resultDiscountWithReason = this.filterEnabledDiscountListWithReason((result == null ? void 0 : result.data) || []) || [];
121
+ return resultDiscountWithReason;
121
122
  }
122
123
  async batchSearchByProductIds(productIds) {
123
124
  const result = await this.request.get(`/machinecode/batch-search`, {
@@ -172,6 +173,64 @@ var DiscountModule = class extends import_BaseModule.BaseModule {
172
173
  }
173
174
  return true;
174
175
  }
176
+ // 过滤启用且可用的优惠券,并返回校验失败原因
177
+ filterEnabledDiscountListWithReason(discountList) {
178
+ let lists = discountList.filter((discount) => discount.limit_status === "enable").filter((discount) => {
179
+ 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);
180
+ return remaining;
181
+ }).map((discount) => {
182
+ const limitFailKey = this.checkUsageCreditsLimitWithFailKey(discount);
183
+ return {
184
+ ...discount,
185
+ usageLimitFailKey: limitFailKey
186
+ };
187
+ });
188
+ const availableLists = lists.filter((item) => !item.usageLimitFailKey && item.unified_available_status !== 0);
189
+ const currentFailDiscount = lists.find((item) => item.usageLimitFailKey);
190
+ return {
191
+ discountList: availableLists,
192
+ unavailableReasonKey: currentFailDiscount == null ? void 0 : currentFailDiscount.usageLimitFailKey
193
+ };
194
+ }
195
+ // 检查使用次数限制,并返回校验失败原因
196
+ checkUsageCreditsLimitWithFailKey(discount) {
197
+ if (!discount.extension_data || discount.extension_data.length === 0) {
198
+ return null;
199
+ }
200
+ const usageCreditsData = discount.extension_data.find(
201
+ (data) => data.field_key === "usage_credits"
202
+ );
203
+ if (!usageCreditsData) {
204
+ return null;
205
+ }
206
+ const value = usageCreditsData.value;
207
+ if (value.total_credits && value.total_credits > 0) {
208
+ if ((discount.total_order_behavior_count || 0) >= value.total_credits) {
209
+ return "total_credits";
210
+ }
211
+ }
212
+ if (value.per_user_limit && value.per_user_limit > 0) {
213
+ if ((discount.customer_order_behavior_count || 0) >= value.per_user_limit) {
214
+ return "per_user_limit";
215
+ }
216
+ }
217
+ if (value.max_per_day && value.max_per_day > 0) {
218
+ if ((discount.today_order_behavior_count || 0) >= value.max_per_day) {
219
+ return "max_per_day";
220
+ }
221
+ }
222
+ if (value.max_per_week && value.max_per_week > 0) {
223
+ if ((discount.week_order_behavior_count || 0) >= value.max_per_week) {
224
+ return "max_per_week";
225
+ }
226
+ }
227
+ if (value.max_per_month && value.max_per_month > 0) {
228
+ if ((discount.month_order_behavior_count || 0) >= value.max_per_month) {
229
+ return "max_per_month";
230
+ }
231
+ }
232
+ return null;
233
+ }
175
234
  // 根据productIds去重
176
235
  uniqueByProductId(discountList) {
177
236
  return (0, import_utils.uniqueById)(discountList, "product_id");
@@ -61,6 +61,11 @@ interface UsageCreditsValue {
61
61
  max_per_week: number;
62
62
  max_per_month: number;
63
63
  }
64
+ export type DiscountFilterRejectKey = 'total_credits' | 'per_user_limit' | 'max_per_day' | 'max_per_week' | 'max_per_month';
65
+ export interface DiscountWithReason {
66
+ discountList: Discount[];
67
+ unavailableReasonKey: DiscountFilterRejectKey | null;
68
+ }
64
69
  interface ExtensionData {
65
70
  id: number;
66
71
  shop_id: number;
@@ -131,6 +136,8 @@ export interface Discount {
131
136
  start_date?: string;
132
137
  start_time?: string;
133
138
  discount_rule_uncheck_flag?: boolean;
139
+ usageLimitFailKey?: string | null;
140
+ unified_available_status?: number | undefined | null;
134
141
  }
135
142
  export interface DiscountState {
136
143
  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: {
@@ -184,7 +184,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
184
184
  }
185
185
  async scanCode(code, customerId) {
186
186
  var _a, _b, _c, _d;
187
- const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId })) || [];
187
+ const resultDiscountWithReason = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId })) || { discountList: [], unavailableReasonKey: null };
188
+ const { discountList: resultDiscountList, unavailableReasonKey } = resultDiscountWithReason;
188
189
  const rulesModule = this.store.rules;
189
190
  if (!rulesModule) {
190
191
  return {
@@ -198,7 +199,8 @@ var OrderModule = class extends import_BaseModule.BaseModule {
198
199
  return {
199
200
  type: "server",
200
201
  isAvailable: false,
201
- discountList: this.getDiscountList()
202
+ discountList: this.getDiscountList(),
203
+ unavailableReasonKey
202
204
  };
203
205
  }
204
206
  const withScanList = resultDiscountList.map((item) => ({ ...item, isScan: true }));
@@ -310,7 +310,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
310
310
  date: string;
311
311
  status: string;
312
312
  week: string;
313
- weekNum: 0 | 2 | 1 | 5 | 4 | 3 | 6;
313
+ weekNum: 0 | 2 | 1 | 5 | 3 | 4 | 6;
314
314
  }[]>;
315
315
  submitTimeSlot(timeSlots: TimeSliceItem): void;
316
316
  private getScheduleDataByIds;
@@ -46,6 +46,7 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
46
46
  discountList: Discount[];
47
47
  type: "server" | "clientCalc";
48
48
  unavailableReason?: UnavailableReason;
49
+ unavailableReasonKey?: string | null;
49
50
  }>;
50
51
  calcDiscountApplicableProductTotalPrice(discount: Discount): number | undefined;
51
52
  private getCustomer;
@@ -281,7 +281,8 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
281
281
  async scanCode(code, customerId) {
282
282
  var _a, _b, _c;
283
283
  try {
284
- const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId, orderId: this.store.orderId })) || [];
284
+ const resultDiscountWithReason = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, { customerId, orderId: this.store.orderId })) || { discountList: [], unavailableReasonKey: null };
285
+ const { discountList: resultDiscountList, unavailableReasonKey } = resultDiscountWithReason;
285
286
  const rulesModule = this.store.rules;
286
287
  if (!rulesModule) {
287
288
  return {
@@ -297,7 +298,8 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
297
298
  type: "server",
298
299
  isAvailable: false,
299
300
  productList: this.store.productList || [],
300
- discountList: this.getDiscountList()
301
+ discountList: this.getDiscountList(),
302
+ unavailableReasonKey
301
303
  };
302
304
  }
303
305
  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": "2.1.150",
4
+ "version": "2.1.152",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",