@pisell/pisellos 2.3.97 → 2.3.99
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/solution/BaseSales/index.js +16 -15
- package/dist/solution/BookingByStep/index.d.ts +2 -2
- package/dist/solution/Sales/index.d.ts +7 -0
- package/dist/solution/Sales/index.js +87 -31
- package/lib/model/strategy/adapter/promotion/index.js +1 -46
- package/lib/solution/BaseSales/index.js +3 -1
- package/lib/solution/BookingByStep/index.d.ts +2 -2
- package/lib/solution/Sales/index.d.ts +7 -0
- package/lib/solution/Sales/index.js +48 -3
- package/package.json +1 -1
|
@@ -2410,7 +2410,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2410
2410
|
key: "restoreOrder",
|
|
2411
2411
|
value: function () {
|
|
2412
2412
|
var _restoreOrder = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21() {
|
|
2413
|
-
var _this$store$payment, tempOrder, wallet;
|
|
2413
|
+
var _this$store$payment, tempOrder, appDataChanged, wallet;
|
|
2414
2414
|
return _regeneratorRuntime().wrap(function _callee21$(_context21) {
|
|
2415
2415
|
while (1) switch (_context21.prev = _context21.next) {
|
|
2416
2416
|
case 0:
|
|
@@ -2422,43 +2422,44 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2422
2422
|
throw new Error('scanOrder 解决方案需要 order 模块支持');
|
|
2423
2423
|
case 3:
|
|
2424
2424
|
// this.store.resource = null;
|
|
2425
|
-
tempOrder = this.store.order.restoreOrder();
|
|
2425
|
+
tempOrder = this.store.order.restoreOrder(); // 先补齐店铺级订单字段,再通知监听方,避免发布带空税区/币种的中间快照。
|
|
2426
|
+
appDataChanged = this.syncAppDataToTempOrder(tempOrder);
|
|
2426
2427
|
this.currentSalesDetail = null;
|
|
2427
2428
|
this.discountConfigCacheKey = null;
|
|
2428
2429
|
this.hasManualDiscountSelection = false;
|
|
2429
2430
|
wallet = (_this$store$payment = this.store.payment) === null || _this$store$payment === void 0 ? void 0 : _this$store$payment.wallet;
|
|
2430
2431
|
if (!wallet) {
|
|
2431
|
-
_context21.next =
|
|
2432
|
+
_context21.next = 14;
|
|
2432
2433
|
break;
|
|
2433
2434
|
}
|
|
2434
2435
|
this.walletAssetsRefreshSequence += 1;
|
|
2435
2436
|
wallet.clearAllCache();
|
|
2436
|
-
_context21.next =
|
|
2437
|
+
_context21.next = 14;
|
|
2437
2438
|
return this.publishWalletAssetsState(wallet.getWalletAssetsState());
|
|
2438
|
-
case
|
|
2439
|
-
_context21.next =
|
|
2439
|
+
case 14:
|
|
2440
|
+
_context21.next = 16;
|
|
2440
2441
|
return this.effectsEmit('onTempOrderReplaced', {
|
|
2441
2442
|
tempOrder: tempOrder
|
|
2442
2443
|
});
|
|
2443
|
-
case
|
|
2444
|
-
if (!(
|
|
2445
|
-
_context21.next =
|
|
2444
|
+
case 16:
|
|
2445
|
+
if (!(appDataChanged && this.isTempOrderPersistEnabled())) {
|
|
2446
|
+
_context21.next = 20;
|
|
2446
2447
|
break;
|
|
2447
2448
|
}
|
|
2448
2449
|
this.store.order.persistTempOrder();
|
|
2449
|
-
_context21.next =
|
|
2450
|
+
_context21.next = 20;
|
|
2450
2451
|
return this.store.order.saveDraft();
|
|
2451
|
-
case
|
|
2452
|
+
case 20:
|
|
2452
2453
|
return _context21.abrupt("return", tempOrder);
|
|
2453
|
-
case
|
|
2454
|
-
_context21.prev =
|
|
2454
|
+
case 23:
|
|
2455
|
+
_context21.prev = 23;
|
|
2455
2456
|
_context21.t0 = _context21["catch"](0);
|
|
2456
2457
|
throw _context21.t0;
|
|
2457
|
-
case
|
|
2458
|
+
case 26:
|
|
2458
2459
|
case "end":
|
|
2459
2460
|
return _context21.stop();
|
|
2460
2461
|
}
|
|
2461
|
-
}, _callee21, this, [[0,
|
|
2462
|
+
}, _callee21, this, [[0, 23]]);
|
|
2462
2463
|
}));
|
|
2463
2464
|
function restoreOrder() {
|
|
2464
2465
|
return _restoreOrder.apply(this, arguments);
|
|
@@ -326,7 +326,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
326
326
|
date: string;
|
|
327
327
|
status: string;
|
|
328
328
|
week: string;
|
|
329
|
-
weekNum: 0 |
|
|
329
|
+
weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
|
|
330
330
|
}[]>;
|
|
331
331
|
submitTimeSlot(timeSlots: TimeSliceItem): void;
|
|
332
332
|
private getScheduleDataByIds;
|
|
@@ -345,7 +345,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
345
345
|
count: number;
|
|
346
346
|
left: number;
|
|
347
347
|
summaryCount: number;
|
|
348
|
-
status: "
|
|
348
|
+
status: "lots_of_space" | "filling_up_fast" | "sold_out";
|
|
349
349
|
}[];
|
|
350
350
|
/**
|
|
351
351
|
* 找到多个资源的公共可用时间段
|
|
@@ -90,6 +90,13 @@ export declare class SalesImpl extends BaseModule implements Module, SalesModule
|
|
|
90
90
|
private groupBookingsByResource;
|
|
91
91
|
private isBookingMatchedResource;
|
|
92
92
|
private sortMatchedBookings;
|
|
93
|
+
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
94
|
+
private sortUnpaidBookings;
|
|
95
|
+
/**
|
|
96
|
+
* 构造资源详情的 Unpaid 列表:复用旧版当前/未来订单的展示计算,再补齐被预约状态/时间漏掉的欠款订单。
|
|
97
|
+
* Unpaid 的成员资格由调用方按付款状态筛好;这里仅负责展示字段与顺序。
|
|
98
|
+
*/
|
|
99
|
+
private buildUnpaidBookings;
|
|
93
100
|
/**
|
|
94
101
|
* 资源下 bookings 的返回裁剪策略:
|
|
95
102
|
* 1) 优先返回当前时刻正在进行中的预约(允许并发返回多条)
|
|
@@ -485,6 +485,64 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
485
485
|
});
|
|
486
486
|
}
|
|
487
487
|
|
|
488
|
+
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
489
|
+
}, {
|
|
490
|
+
key: "sortUnpaidBookings",
|
|
491
|
+
value: function sortUnpaidBookings(bookings, currentBookings) {
|
|
492
|
+
var _this4 = this;
|
|
493
|
+
var currentOrderIndexes = new Map(currentBookings.map(function (booking, index) {
|
|
494
|
+
return [String(booking.order.order_id), index];
|
|
495
|
+
}));
|
|
496
|
+
return _toConsumableArray(bookings).sort(function (left, right) {
|
|
497
|
+
var leftIndex = currentOrderIndexes.get(String(left.order.order_id));
|
|
498
|
+
var rightIndex = currentOrderIndexes.get(String(right.order.order_id));
|
|
499
|
+
if (leftIndex !== undefined || rightIndex !== undefined) {
|
|
500
|
+
if (leftIndex === undefined) return 1;
|
|
501
|
+
if (rightIndex === undefined) return -1;
|
|
502
|
+
return leftIndex - rightIndex;
|
|
503
|
+
}
|
|
504
|
+
var leftStartAt = _this4.toBookingDateTime(left.start_date, left.start_time).valueOf();
|
|
505
|
+
var rightStartAt = _this4.toBookingDateTime(right.start_date, right.start_time).valueOf();
|
|
506
|
+
return rightStartAt - leftStartAt;
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/**
|
|
511
|
+
* 构造资源详情的 Unpaid 列表:复用旧版当前/未来订单的展示计算,再补齐被预约状态/时间漏掉的欠款订单。
|
|
512
|
+
* Unpaid 的成员资格由调用方按付款状态筛好;这里仅负责展示字段与顺序。
|
|
513
|
+
*/
|
|
514
|
+
}, {
|
|
515
|
+
key: "buildUnpaidBookings",
|
|
516
|
+
value: function buildUnpaidBookings(current, deviceCurrent, unpaidBookingList, currentBookings) {
|
|
517
|
+
var _this5 = this;
|
|
518
|
+
var legacyPrioritizedBookings = this.pickBookingsForCurrentPoint(current, this.normalizeResourceBookings(current, deviceCurrent, unpaidBookingList), {
|
|
519
|
+
includeAllFuture: true
|
|
520
|
+
});
|
|
521
|
+
var allBookings = this.sortMatchedBookings(unpaidBookingList.map(function (booking) {
|
|
522
|
+
var normalized = _this5.normalizeMatchedBooking(current, deviceCurrent, booking, {
|
|
523
|
+
includeCompleted: true
|
|
524
|
+
});
|
|
525
|
+
if (normalized) return normalized;
|
|
526
|
+
var appointmentStatus = _this5.getBookingAppointmentStatus(booking);
|
|
527
|
+
var status = appointmentStatus === 'started' ? 'occupied' : appointmentStatus === 'completed' ? 'completed' : 'reserved';
|
|
528
|
+
return _objectSpread(_objectSpread({}, booking), {}, {
|
|
529
|
+
status: status,
|
|
530
|
+
isTimeout: false,
|
|
531
|
+
timeoutTime: undefined,
|
|
532
|
+
progressPercent: undefined,
|
|
533
|
+
lateTime: undefined,
|
|
534
|
+
reserved_status: undefined,
|
|
535
|
+
remainingReserveTime: undefined
|
|
536
|
+
});
|
|
537
|
+
}));
|
|
538
|
+
var legacyOrderIds = new Set(legacyPrioritizedBookings.map(function (booking) {
|
|
539
|
+
return String(booking.order.order_id);
|
|
540
|
+
}));
|
|
541
|
+
return this.sortUnpaidBookings([].concat(_toConsumableArray(legacyPrioritizedBookings), _toConsumableArray(allBookings.filter(function (booking) {
|
|
542
|
+
return !legacyOrderIds.has(String(booking.order.order_id));
|
|
543
|
+
}))), currentBookings);
|
|
544
|
+
}
|
|
545
|
+
|
|
488
546
|
/**
|
|
489
547
|
* 资源下 bookings 的返回裁剪策略:
|
|
490
548
|
* 1) 优先返回当前时刻正在进行中的预约(允许并发返回多条)
|
|
@@ -496,7 +554,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
496
554
|
}, {
|
|
497
555
|
key: "pickBookingsForCurrentPoint",
|
|
498
556
|
value: function pickBookingsForCurrentPoint(current, bookings) {
|
|
499
|
-
var
|
|
557
|
+
var _this6 = this;
|
|
500
558
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
501
559
|
if (bookings.length === 0) return [];
|
|
502
560
|
var _this$getOperatingDay = this.getOperatingDayRange(current),
|
|
@@ -505,17 +563,17 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
505
563
|
|
|
506
564
|
// 仅保留与 current 所属营业日窗口有时间交集的预约,避免跨营业日误命中
|
|
507
565
|
var dayScopedBookings = bookings.filter(function (booking) {
|
|
508
|
-
var startAt =
|
|
509
|
-
var endAt =
|
|
566
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
567
|
+
var endAt = _this6.toBookingDateTime(booking.end_date, booking.end_time);
|
|
510
568
|
if (!startAt.isValid() || !endAt.isValid()) return false;
|
|
511
|
-
return startAt.isBefore(operatingDayEndExclusive) &&
|
|
569
|
+
return startAt.isBefore(operatingDayEndExclusive) && _this6.isSameOrAfter(endAt, operatingDayStart);
|
|
512
570
|
});
|
|
513
571
|
if (dayScopedBookings.length === 0) return [];
|
|
514
572
|
var appendNextStartGroupIfNeeded = function appendNextStartGroupIfNeeded(selectedBookings) {
|
|
515
573
|
if (selectedBookings.length === 0) return selectedBookings;
|
|
516
574
|
if (options.includeAllFuture) {
|
|
517
575
|
var allFutureBookings = dayScopedBookings.filter(function (booking) {
|
|
518
|
-
var startAt =
|
|
576
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
519
577
|
return startAt.isValid() && startAt.isAfter(current);
|
|
520
578
|
});
|
|
521
579
|
return [].concat(_toConsumableArray(selectedBookings), _toConsumableArray(allFutureBookings));
|
|
@@ -525,21 +583,21 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
525
583
|
});
|
|
526
584
|
if (!shouldAppendNextGroup) return selectedBookings;
|
|
527
585
|
var selectedStartValues = new Set(selectedBookings.map(function (booking) {
|
|
528
|
-
return
|
|
586
|
+
return _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
529
587
|
}).filter(function (startAt) {
|
|
530
588
|
return startAt.isValid();
|
|
531
589
|
}).map(function (startAt) {
|
|
532
590
|
return startAt.valueOf();
|
|
533
591
|
}));
|
|
534
592
|
var futureCandidates = dayScopedBookings.filter(function (booking) {
|
|
535
|
-
var startAt =
|
|
593
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
536
594
|
if (!startAt.isValid()) return false;
|
|
537
595
|
return startAt.isAfter(current) && !selectedStartValues.has(startAt.valueOf());
|
|
538
596
|
});
|
|
539
597
|
if (futureCandidates.length === 0) return selectedBookings;
|
|
540
|
-
var nextStartAt =
|
|
598
|
+
var nextStartAt = _this6.toBookingDateTime(futureCandidates[0].start_date, futureCandidates[0].start_time).valueOf();
|
|
541
599
|
var nextStartGroup = futureCandidates.filter(function (booking) {
|
|
542
|
-
var startAt =
|
|
600
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
543
601
|
return startAt.isValid() && startAt.valueOf() === nextStartAt;
|
|
544
602
|
});
|
|
545
603
|
if (nextStartGroup.length === 0) return selectedBookings;
|
|
@@ -551,10 +609,10 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
551
609
|
|
|
552
610
|
// active: current 处于 [startAt, endAt] 区间
|
|
553
611
|
var activeBookings = dayScopedBookings.filter(function (booking) {
|
|
554
|
-
var startAt =
|
|
555
|
-
var endAt =
|
|
612
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
613
|
+
var endAt = _this6.toBookingDateTime(booking.end_date, booking.end_time);
|
|
556
614
|
if (!startAt.isValid() || !endAt.isValid()) return false;
|
|
557
|
-
return
|
|
615
|
+
return _this6.isSameOrAfter(current, startAt) && _this6.isSameOrBefore(current, endAt);
|
|
558
616
|
});
|
|
559
617
|
if (activeBookings.length > 0) return appendNextStartGroupIfNeeded(activeBookings);
|
|
560
618
|
|
|
@@ -566,14 +624,14 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
566
624
|
|
|
567
625
|
// upcoming: 从未来预约里只取最早那一组(同 start_time)
|
|
568
626
|
var upcoming = dayScopedBookings.filter(function (booking) {
|
|
569
|
-
var startAt =
|
|
627
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
570
628
|
return startAt.isValid() && startAt.isAfter(current);
|
|
571
629
|
});
|
|
572
630
|
if (upcoming.length > 0) {
|
|
573
631
|
if (options.includeAllFuture) return upcoming;
|
|
574
632
|
var firstStartAt = this.toBookingDateTime(upcoming[0].start_date, upcoming[0].start_time).valueOf();
|
|
575
633
|
var upcomingStartGroup = upcoming.filter(function (booking) {
|
|
576
|
-
var startAt =
|
|
634
|
+
var startAt = _this6.toBookingDateTime(booking.start_date, booking.start_time);
|
|
577
635
|
return startAt.valueOf() === firstStartAt;
|
|
578
636
|
});
|
|
579
637
|
return appendNextStartGroupIfNeeded(upcomingStartGroup);
|
|
@@ -626,10 +684,10 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
626
684
|
}, {
|
|
627
685
|
key: "normalizeResourceBookings",
|
|
628
686
|
value: function normalizeResourceBookings(current, deviceCurrent, bookingList) {
|
|
629
|
-
var
|
|
687
|
+
var _this7 = this;
|
|
630
688
|
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
631
689
|
var normalizedBookings = bookingList.map(function (booking) {
|
|
632
|
-
return
|
|
690
|
+
return _this7.normalizeMatchedBooking(current, deviceCurrent, booking, options);
|
|
633
691
|
}).filter(function (booking) {
|
|
634
692
|
return Boolean(booking);
|
|
635
693
|
}).filter(function (booking) {
|
|
@@ -759,7 +817,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
759
817
|
var _getResourceBookingList = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(currentTime) {
|
|
760
818
|
var _resourceResponse$dat,
|
|
761
819
|
_resourceResponse$dat2,
|
|
762
|
-
|
|
820
|
+
_this8 = this;
|
|
763
821
|
var bookingList,
|
|
764
822
|
deviceTime,
|
|
765
823
|
current,
|
|
@@ -815,16 +873,16 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
815
873
|
rawBookingMap = this.groupBookingsByResource(bookingList);
|
|
816
874
|
bookingMap = this.groupBookingsByResource(normalizedBookings); // 输出:每个资源都返回;bookings 可能是 0 / 1 / 多条(并发场景)
|
|
817
875
|
list = resourceList.map(function (resource) {
|
|
818
|
-
var resourceId =
|
|
876
|
+
var resourceId = _this8.getResourceId(resource);
|
|
819
877
|
var rawMatchedBookings = rawBookingMap.get(String(resourceId)) || [];
|
|
820
878
|
var matchedBookings = bookingMap.get(String(resourceId)) || [];
|
|
821
879
|
var statsBookings = rawMatchedBookings.filter(function (booking) {
|
|
822
|
-
return
|
|
880
|
+
return _this8.isBookingIncludedInStats(booking);
|
|
823
881
|
});
|
|
824
|
-
var orderCount =
|
|
882
|
+
var orderCount = _this8.countBookingOrders(statsBookings);
|
|
825
883
|
var bookingCount = statsBookings.length;
|
|
826
|
-
var compeleteBookingCount =
|
|
827
|
-
var bookings =
|
|
884
|
+
var compeleteBookingCount = _this8.countCompletedBookings(statsBookings);
|
|
885
|
+
var bookings = _this8.pickBookingsForCurrentPoint(current, matchedBookings);
|
|
828
886
|
return _objectSpread(_objectSpread({}, resource), {}, {
|
|
829
887
|
resource_id: resourceId,
|
|
830
888
|
orderCount: orderCount,
|
|
@@ -861,7 +919,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
861
919
|
var _getResourceBookingItem = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(params) {
|
|
862
920
|
var _resourceResponse$dat3,
|
|
863
921
|
_resourceResponse$dat4,
|
|
864
|
-
|
|
922
|
+
_this9 = this,
|
|
865
923
|
_params$bookingList;
|
|
866
924
|
var current, deviceCurrent, resourceResponse, resourceList, targetResource, resourceId, matchedBookingList, statsBookingList, completedBookingList, unpaidBookingList, bookings, completedBookings, unpaidBookings, orderCount, bookingCount, compeleteBookingCount;
|
|
867
925
|
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
|
|
@@ -901,7 +959,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
901
959
|
return _context6.abrupt("return", null);
|
|
902
960
|
case 12:
|
|
903
961
|
targetResource = resourceList.find(function (resource) {
|
|
904
|
-
return String(
|
|
962
|
+
return String(_this9.getResourceId(resource)) === String(params.resourceId);
|
|
905
963
|
});
|
|
906
964
|
if (targetResource) {
|
|
907
965
|
_context6.next = 15;
|
|
@@ -911,18 +969,18 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
911
969
|
case 15:
|
|
912
970
|
resourceId = this.getResourceId(targetResource);
|
|
913
971
|
matchedBookingList = params.bookingList.filter(function (booking) {
|
|
914
|
-
return
|
|
972
|
+
return _this9.isBookingMatchedResource(booking, resourceId);
|
|
915
973
|
});
|
|
916
974
|
statsBookingList = matchedBookingList.filter(function (booking) {
|
|
917
|
-
return
|
|
975
|
+
return _this9.isBookingIncludedInStats(booking);
|
|
918
976
|
});
|
|
919
977
|
completedBookingList = matchedBookingList.filter(function (booking) {
|
|
920
|
-
return
|
|
978
|
+
return _this9.getBookingAppointmentStatus(booking) === 'completed';
|
|
921
979
|
}); // const unpaidBookingList = matchedBookingList.filter(
|
|
922
980
|
// (booking) => this.getBookingOrderPaymentStatus(booking) === 'unpaid' || this.getBookingOrderPaymentStatus(booking) === 'payment_processing',
|
|
923
981
|
// );
|
|
924
982
|
unpaidBookingList = matchedBookingList.filter(function (booking) {
|
|
925
|
-
return
|
|
983
|
+
return _this9.isUnpaidBooking(booking);
|
|
926
984
|
});
|
|
927
985
|
bookings = this.pickBookingsForCurrentPoint(current, this.normalizeResourceBookings(current, deviceCurrent, matchedBookingList), {
|
|
928
986
|
includeAllFuture: true
|
|
@@ -938,9 +996,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
938
996
|
remainingReserveTime: undefined
|
|
939
997
|
});
|
|
940
998
|
});
|
|
941
|
-
unpaidBookings = this.
|
|
942
|
-
includeAllFuture: true
|
|
943
|
-
});
|
|
999
|
+
unpaidBookings = this.buildUnpaidBookings(current, deviceCurrent, unpaidBookingList, bookings);
|
|
944
1000
|
orderCount = this.countBookingOrders(statsBookingList);
|
|
945
1001
|
bookingCount = statsBookingList.length;
|
|
946
1002
|
compeleteBookingCount = this.countCompletedBookings(statsBookingList);
|
|
@@ -1,46 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "BUY_X_GET_Y_FREE_STRATEGY", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function () {
|
|
9
|
-
return _examples.BUY_X_GET_Y_FREE_STRATEGY;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
Object.defineProperty(exports, "ITEM_REWARD_STRATEGY", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () {
|
|
15
|
-
return _examples.ITEM_REWARD_STRATEGY;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "PromotionAdapter", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () {
|
|
21
|
-
return _adapter.PromotionAdapter;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(exports, "PromotionEvaluator", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () {
|
|
27
|
-
return _evaluator.PromotionEvaluator;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(exports, "X_ITEMS_FOR_Y_PRICE_STRATEGY", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
get: function () {
|
|
33
|
-
return _examples.X_ITEMS_FOR_Y_PRICE_STRATEGY;
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
Object.defineProperty(exports, "default", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
get: function () {
|
|
39
|
-
return _adapter.default;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
var _evaluator = require("./evaluator");
|
|
43
|
-
var _adapter = _interopRequireWildcard(require("./adapter"));
|
|
44
|
-
var _examples = require("./examples");
|
|
45
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
46
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
1
|
+
"use strict";
|
|
@@ -1600,6 +1600,8 @@ class BaseSalesImpl extends _BaseModule.BaseModule {
|
|
|
1600
1600
|
}
|
|
1601
1601
|
// this.store.resource = null;
|
|
1602
1602
|
const tempOrder = this.store.order.restoreOrder();
|
|
1603
|
+
// 先补齐店铺级订单字段,再通知监听方,避免发布带空税区/币种的中间快照。
|
|
1604
|
+
const appDataChanged = this.syncAppDataToTempOrder(tempOrder);
|
|
1603
1605
|
this.currentSalesDetail = null;
|
|
1604
1606
|
this.discountConfigCacheKey = null;
|
|
1605
1607
|
this.hasManualDiscountSelection = false;
|
|
@@ -1612,7 +1614,7 @@ class BaseSalesImpl extends _BaseModule.BaseModule {
|
|
|
1612
1614
|
await this.effectsEmit('onTempOrderReplaced', {
|
|
1613
1615
|
tempOrder
|
|
1614
1616
|
});
|
|
1615
|
-
if (
|
|
1617
|
+
if (appDataChanged && this.isTempOrderPersistEnabled()) {
|
|
1616
1618
|
this.store.order.persistTempOrder();
|
|
1617
1619
|
await this.store.order.saveDraft();
|
|
1618
1620
|
}
|
|
@@ -326,7 +326,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
326
326
|
date: string;
|
|
327
327
|
status: string;
|
|
328
328
|
week: string;
|
|
329
|
-
weekNum: 0 |
|
|
329
|
+
weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
|
|
330
330
|
}[]>;
|
|
331
331
|
submitTimeSlot(timeSlots: TimeSliceItem): void;
|
|
332
332
|
private getScheduleDataByIds;
|
|
@@ -345,7 +345,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
345
345
|
count: number;
|
|
346
346
|
left: number;
|
|
347
347
|
summaryCount: number;
|
|
348
|
-
status: "
|
|
348
|
+
status: "lots_of_space" | "filling_up_fast" | "sold_out";
|
|
349
349
|
}[];
|
|
350
350
|
/**
|
|
351
351
|
* 找到多个资源的公共可用时间段
|
|
@@ -90,6 +90,13 @@ export declare class SalesImpl extends BaseModule implements Module, SalesModule
|
|
|
90
90
|
private groupBookingsByResource;
|
|
91
91
|
private isBookingMatchedResource;
|
|
92
92
|
private sortMatchedBookings;
|
|
93
|
+
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
94
|
+
private sortUnpaidBookings;
|
|
95
|
+
/**
|
|
96
|
+
* 构造资源详情的 Unpaid 列表:复用旧版当前/未来订单的展示计算,再补齐被预约状态/时间漏掉的欠款订单。
|
|
97
|
+
* Unpaid 的成员资格由调用方按付款状态筛好;这里仅负责展示字段与顺序。
|
|
98
|
+
*/
|
|
99
|
+
private buildUnpaidBookings;
|
|
93
100
|
/**
|
|
94
101
|
* 资源下 bookings 的返回裁剪策略:
|
|
95
102
|
* 1) 优先返回当前时刻正在进行中的预约(允许并发返回多条)
|
|
@@ -340,6 +340,53 @@ class SalesImpl extends _BaseModule.BaseModule {
|
|
|
340
340
|
});
|
|
341
341
|
}
|
|
342
342
|
|
|
343
|
+
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
344
|
+
sortUnpaidBookings(bookings, currentBookings) {
|
|
345
|
+
const currentOrderIndexes = new Map(currentBookings.map((booking, index) => [String(booking.order.order_id), index]));
|
|
346
|
+
return [...bookings].sort((left, right) => {
|
|
347
|
+
const leftIndex = currentOrderIndexes.get(String(left.order.order_id));
|
|
348
|
+
const rightIndex = currentOrderIndexes.get(String(right.order.order_id));
|
|
349
|
+
if (leftIndex !== undefined || rightIndex !== undefined) {
|
|
350
|
+
if (leftIndex === undefined) return 1;
|
|
351
|
+
if (rightIndex === undefined) return -1;
|
|
352
|
+
return leftIndex - rightIndex;
|
|
353
|
+
}
|
|
354
|
+
const leftStartAt = this.toBookingDateTime(left.start_date, left.start_time).valueOf();
|
|
355
|
+
const rightStartAt = this.toBookingDateTime(right.start_date, right.start_time).valueOf();
|
|
356
|
+
return rightStartAt - leftStartAt;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* 构造资源详情的 Unpaid 列表:复用旧版当前/未来订单的展示计算,再补齐被预约状态/时间漏掉的欠款订单。
|
|
362
|
+
* Unpaid 的成员资格由调用方按付款状态筛好;这里仅负责展示字段与顺序。
|
|
363
|
+
*/
|
|
364
|
+
buildUnpaidBookings(current, deviceCurrent, unpaidBookingList, currentBookings) {
|
|
365
|
+
const legacyPrioritizedBookings = this.pickBookingsForCurrentPoint(current, this.normalizeResourceBookings(current, deviceCurrent, unpaidBookingList), {
|
|
366
|
+
includeAllFuture: true
|
|
367
|
+
});
|
|
368
|
+
const allBookings = this.sortMatchedBookings(unpaidBookingList.map(booking => {
|
|
369
|
+
const normalized = this.normalizeMatchedBooking(current, deviceCurrent, booking, {
|
|
370
|
+
includeCompleted: true
|
|
371
|
+
});
|
|
372
|
+
if (normalized) return normalized;
|
|
373
|
+
const appointmentStatus = this.getBookingAppointmentStatus(booking);
|
|
374
|
+
const status = appointmentStatus === 'started' ? 'occupied' : appointmentStatus === 'completed' ? 'completed' : 'reserved';
|
|
375
|
+
return {
|
|
376
|
+
...booking,
|
|
377
|
+
status,
|
|
378
|
+
isTimeout: false,
|
|
379
|
+
timeoutTime: undefined,
|
|
380
|
+
progressPercent: undefined,
|
|
381
|
+
lateTime: undefined,
|
|
382
|
+
reserved_status: undefined,
|
|
383
|
+
remainingReserveTime: undefined
|
|
384
|
+
};
|
|
385
|
+
}));
|
|
386
|
+
const legacyOrderIds = new Set(legacyPrioritizedBookings.map(booking => String(booking.order.order_id)));
|
|
387
|
+
return this.sortUnpaidBookings([...legacyPrioritizedBookings, ...allBookings.filter(booking => !legacyOrderIds.has(String(booking.order.order_id)))], currentBookings);
|
|
388
|
+
}
|
|
389
|
+
|
|
343
390
|
/**
|
|
344
391
|
* 资源下 bookings 的返回裁剪策略:
|
|
345
392
|
* 1) 优先返回当前时刻正在进行中的预约(允许并发返回多条)
|
|
@@ -679,9 +726,7 @@ class SalesImpl extends _BaseModule.BaseModule {
|
|
|
679
726
|
remainingReserveTime: undefined
|
|
680
727
|
};
|
|
681
728
|
});
|
|
682
|
-
const unpaidBookings = this.
|
|
683
|
-
includeAllFuture: true
|
|
684
|
-
});
|
|
729
|
+
const unpaidBookings = this.buildUnpaidBookings(current, deviceCurrent, unpaidBookingList, bookings);
|
|
685
730
|
const orderCount = this.countBookingOrders(statsBookingList);
|
|
686
731
|
const bookingCount = statsBookingList.length;
|
|
687
732
|
const compeleteBookingCount = this.countCompletedBookings(statsBookingList);
|