@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.
- package/dist/modules/Discount/index.d.ts +4 -2
- package/dist/modules/Discount/index.js +90 -4
- package/dist/modules/Discount/types.d.ts +7 -0
- package/dist/modules/Order/index.d.ts +1 -0
- package/dist/modules/Order/index.js +16 -11
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/ShopDiscount/index.d.ts +1 -0
- package/dist/solution/ShopDiscount/index.js +23 -18
- package/dist/solution/VenueBooking/index.d.ts +1 -0
- package/lib/modules/Discount/index.d.ts +4 -2
- package/lib/modules/Discount/index.js +62 -3
- package/lib/modules/Discount/types.d.ts +7 -0
- package/lib/modules/Order/index.d.ts +1 -0
- package/lib/modules/Order/index.js +4 -2
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/ShopDiscount/index.d.ts +1 -0
- package/lib/solution/ShopDiscount/index.js +4 -2
- package/lib/solution/VenueBooking/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -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<
|
|
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,
|
|
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
|
-
|
|
205
|
-
return _context5.abrupt("return",
|
|
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
|
-
|
|
250
|
+
resultDiscountWithReason = _context3.t0;
|
|
251
|
+
resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
|
|
248
252
|
rulesModule = this.store.rules;
|
|
249
253
|
if (rulesModule) {
|
|
250
|
-
_context3.next =
|
|
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
|
|
263
|
+
case 10:
|
|
260
264
|
if (resultDiscountList.length) {
|
|
261
|
-
_context3.next =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 |
|
|
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
|
-
|
|
458
|
+
resultDiscountWithReason = _context6.t0;
|
|
459
|
+
resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
|
|
456
460
|
rulesModule = this.store.rules;
|
|
457
461
|
if (rulesModule) {
|
|
458
|
-
_context6.next =
|
|
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
|
|
472
|
+
case 11:
|
|
469
473
|
if (resultDiscountList.length) {
|
|
470
|
-
_context6.next =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
527
|
+
_context6.next = 25;
|
|
523
528
|
break;
|
|
524
529
|
}
|
|
525
|
-
_context6.next =
|
|
530
|
+
_context6.next = 25;
|
|
526
531
|
return this.getCustomerWallet(resultDiscountList[0].customer_id);
|
|
527
|
-
case
|
|
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
|
|
536
|
-
_context6.prev =
|
|
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
|
|
551
|
+
case 32:
|
|
547
552
|
case "end":
|
|
548
553
|
return _context6.stop();
|
|
549
554
|
}
|
|
550
|
-
}, _callee6, this, [[0,
|
|
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<
|
|
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
|
|
120
|
-
return
|
|
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
|
|
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 |
|
|
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
|
|
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[];
|