@pisell/pisellos 2.3.97 → 2.3.98
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/model/strategy/adapter/promotion/index.js +9 -0
- 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/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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// 导出评估器
|
|
2
|
+
export { PromotionEvaluator } from "./evaluator";
|
|
3
|
+
|
|
4
|
+
// 导出适配器
|
|
5
|
+
export { PromotionAdapter } from "./adapter";
|
|
6
|
+
export { default } from "./adapter";
|
|
7
|
+
|
|
8
|
+
// 导出策略配置示例常量
|
|
9
|
+
export { X_ITEMS_FOR_Y_PRICE_STRATEGY, BUY_X_GET_Y_FREE_STRATEGY, ITEM_REWARD_STRATEGY } from "./examples";
|
|
@@ -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);
|
|
@@ -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);
|