@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.
- package/dist/modules/Discount/index.d.ts +4 -2
- package/dist/modules/Discount/index.js +88 -3
- package/dist/modules/Discount/types.d.ts +6 -0
- package/dist/modules/Order/index.d.ts +2 -1
- package/dist/modules/Order/index.js +16 -11
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/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 +60 -2
- package/lib/modules/Discount/types.d.ts +6 -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:
|
|
@@ -201,8 +201,8 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
201
201
|
}));
|
|
202
202
|
case 3:
|
|
203
203
|
result = _context5.sent;
|
|
204
|
-
|
|
205
|
-
return _context5.abrupt("return",
|
|
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: "
|
|
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
|
-
|
|
247
|
+
resultDiscountWithReason = _context3.t0;
|
|
248
|
+
resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
|
|
245
249
|
rulesModule = this.store.rules;
|
|
246
250
|
if (rulesModule) {
|
|
247
|
-
_context3.next =
|
|
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
|
|
260
|
+
case 10:
|
|
257
261
|
if (resultDiscountList.length) {
|
|
258
|
-
_context3.next =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 |
|
|
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, "
|
|
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
|
-
|
|
468
|
+
resultDiscountWithReason = _context6.t0;
|
|
469
|
+
resultDiscountList = resultDiscountWithReason.discountList, unavailableReasonKey = resultDiscountWithReason.unavailableReasonKey;
|
|
466
470
|
rulesModule = this.store.rules;
|
|
467
471
|
if (rulesModule) {
|
|
468
|
-
_context6.next =
|
|
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
|
|
482
|
+
case 11:
|
|
479
483
|
if (resultDiscountList.length) {
|
|
480
|
-
_context6.next =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
538
|
+
_context6.next = 25;
|
|
534
539
|
break;
|
|
535
540
|
}
|
|
536
|
-
_context6.next =
|
|
541
|
+
_context6.next = 25;
|
|
537
542
|
return this.getCustomerWallet(resultDiscountList[0].customer_id);
|
|
538
|
-
case
|
|
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
|
|
547
|
-
_context6.prev =
|
|
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
|
|
562
|
+
case 32:
|
|
558
563
|
case "end":
|
|
559
564
|
return _context6.stop();
|
|
560
565
|
}
|
|
561
|
-
}, _callee6, this, [[0,
|
|
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<
|
|
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
|
|
120
|
-
return
|
|
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
|
|
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 |
|
|
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
|
|
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[];
|