@pisell/pisellos 2.3.74 → 2.3.76
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/core/index.js +6 -10
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Order/index.js +75 -91
- package/dist/modules/Order/types.d.ts +3 -1
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.js +97 -129
- package/dist/server/modules/menu/index.js +32 -41
- package/dist/server/modules/order/index.js +2 -4
- package/dist/server/modules/products/index.js +24 -42
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +3 -4
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +100 -72
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +15 -6
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.js +134 -134
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Order/index.js +1733 -2121
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.d.ts +3 -1
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.js +81 -118
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.js +3050 -2665
- package/lib/server/modules/floor-plan/index.js +118 -134
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +142 -122
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.js +784 -1002
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.js +583 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +220 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1220 -1412
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +5 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +652 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,47 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
-
|
|
29
|
-
// src/server/modules/schedule/utils.ts
|
|
30
|
-
var utils_exports = {};
|
|
31
|
-
__export(utils_exports, {
|
|
32
|
-
getDateIsInSchedule: () => getDateIsInSchedule,
|
|
33
|
-
getScheduleStartEndTimePoints: () => getScheduleStartEndTimePoints
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
34
5
|
});
|
|
35
|
-
|
|
36
|
-
var
|
|
37
|
-
|
|
6
|
+
exports.getScheduleStartEndTimePoints = exports.getDateIsInSchedule = void 0;
|
|
7
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
// 获取时间是否在日程范围内
|
|
10
|
+
const getDateIsInSchedule = (dateTime, scheduleList) => {
|
|
38
11
|
if (!dateTime || !scheduleList || scheduleList.length === 0) {
|
|
39
12
|
return false;
|
|
40
13
|
}
|
|
41
|
-
const targetDate = (0,
|
|
14
|
+
const targetDate = (0, _dayjs.default)(dateTime);
|
|
42
15
|
if (!targetDate.isValid()) {
|
|
43
16
|
return false;
|
|
44
17
|
}
|
|
18
|
+
|
|
19
|
+
// 遍历所有日程项
|
|
45
20
|
for (const schedule of scheduleList) {
|
|
46
21
|
if (isTimeInScheduleItem(dateTime, schedule)) {
|
|
47
22
|
return true;
|
|
@@ -49,175 +24,270 @@ var getDateIsInSchedule = (dateTime, scheduleList) => {
|
|
|
49
24
|
}
|
|
50
25
|
return false;
|
|
51
26
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
27
|
+
|
|
28
|
+
// 判断时间是否在单个日程项范围内
|
|
29
|
+
exports.getDateIsInSchedule = getDateIsInSchedule;
|
|
30
|
+
const isTimeInScheduleItem = (dateTime, schedule) => {
|
|
31
|
+
const targetDate = (0, _dayjs.default)(dateTime);
|
|
32
|
+
const targetDateString = dateTime.split(' ')[0]; // YYYY-MM-DD
|
|
33
|
+
const targetTimeString = dateTime.split(' ')[1] || '00:00:00'; // HH:mm:ss
|
|
34
|
+
|
|
56
35
|
switch (schedule.type) {
|
|
57
|
-
case
|
|
36
|
+
case 'standard':
|
|
58
37
|
return isInStandardSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
59
|
-
case
|
|
38
|
+
case 'time-slots':
|
|
60
39
|
return isInTimeSlotsSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
61
|
-
case
|
|
40
|
+
case 'designation':
|
|
62
41
|
return isInDesignationSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
63
42
|
default:
|
|
64
43
|
return false;
|
|
65
44
|
}
|
|
66
45
|
};
|
|
67
|
-
|
|
46
|
+
|
|
47
|
+
// 处理标准类型日程
|
|
48
|
+
const isInStandardSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
68
49
|
if (!schedule.start_time || !schedule.end_time) {
|
|
69
50
|
return false;
|
|
70
51
|
}
|
|
71
|
-
const startDate = (0,
|
|
72
|
-
const endDate = (0,
|
|
52
|
+
const startDate = (0, _dayjs.default)(schedule.start_time);
|
|
53
|
+
const endDate = (0, _dayjs.default)(schedule.end_time);
|
|
54
|
+
|
|
55
|
+
// 先检查是否在基础时间范围内(不考虑重复)
|
|
73
56
|
const isInBasicRange = targetDate.isSameOrAfter(startDate) && targetDate.isSameOrBefore(endDate);
|
|
74
|
-
if (schedule.repeat_type ===
|
|
57
|
+
if (schedule.repeat_type === 'none') {
|
|
75
58
|
return isInBasicRange;
|
|
76
59
|
}
|
|
60
|
+
|
|
61
|
+
// 处理重复日程
|
|
77
62
|
return isInRepeatingSchedule(targetDate, targetDateString, targetTimeString, schedule, startDate, endDate);
|
|
78
63
|
};
|
|
79
|
-
|
|
64
|
+
|
|
65
|
+
// 处理时间段类型日程
|
|
66
|
+
const isInTimeSlotsSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
80
67
|
if (!schedule.start_time) {
|
|
81
68
|
return false;
|
|
82
69
|
}
|
|
83
|
-
const scheduleDate = schedule.start_time.split(
|
|
70
|
+
const scheduleDate = schedule.start_time.split(' ')[0];
|
|
71
|
+
|
|
72
|
+
// 检查日期是否匹配
|
|
84
73
|
if (targetDateString !== scheduleDate) {
|
|
85
74
|
return false;
|
|
86
75
|
}
|
|
76
|
+
|
|
77
|
+
// 检查是否在任一时间段内
|
|
87
78
|
for (const timeSlot of schedule.time_slot) {
|
|
88
79
|
const slotStart = `${scheduleDate} ${timeSlot.start_time}:00`;
|
|
89
80
|
const slotEnd = `${scheduleDate} ${timeSlot.end_time}:00`;
|
|
90
|
-
const slotStartDate = (0,
|
|
91
|
-
const slotEndDate = (0,
|
|
81
|
+
const slotStartDate = (0, _dayjs.default)(slotStart);
|
|
82
|
+
const slotEndDate = (0, _dayjs.default)(slotEnd);
|
|
92
83
|
if (targetDate.isSameOrAfter(slotStartDate) && targetDate.isSameOrBefore(slotEndDate)) {
|
|
93
84
|
return true;
|
|
94
85
|
}
|
|
95
86
|
}
|
|
96
87
|
return false;
|
|
97
88
|
};
|
|
98
|
-
|
|
89
|
+
|
|
90
|
+
// 处理指定类型日程
|
|
91
|
+
const isInDesignationSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
99
92
|
if (!schedule.designation) {
|
|
100
93
|
return false;
|
|
101
94
|
}
|
|
95
|
+
|
|
96
|
+
// @ts-ignore
|
|
102
97
|
for (const designation of schedule.designation) {
|
|
103
98
|
const startDateTime = `${designation.start_date} ${designation.start_time}:00`;
|
|
104
99
|
const endDateTime = `${designation.end_date} ${designation.end_time}:00`;
|
|
105
|
-
const startDate = (0,
|
|
106
|
-
const endDate = (0,
|
|
100
|
+
const startDate = (0, _dayjs.default)(startDateTime);
|
|
101
|
+
const endDate = (0, _dayjs.default)(endDateTime);
|
|
107
102
|
if (targetDate.isSameOrAfter(startDate) && targetDate.isSameOrBefore(endDate)) {
|
|
108
103
|
return true;
|
|
109
104
|
}
|
|
110
105
|
}
|
|
111
106
|
return false;
|
|
112
107
|
};
|
|
113
|
-
|
|
108
|
+
|
|
109
|
+
// 处理重复日程逻辑
|
|
110
|
+
const isInRepeatingSchedule = (targetDate, targetDateString, targetTimeString, schedule, startDate, endDate) => {
|
|
114
111
|
if (!schedule.repeat_rule) {
|
|
115
112
|
return false;
|
|
116
113
|
}
|
|
117
|
-
const {
|
|
118
|
-
|
|
114
|
+
const {
|
|
115
|
+
repeat_rule,
|
|
116
|
+
repeat_type
|
|
117
|
+
} = schedule;
|
|
118
|
+
const targetDateOnly = (0, _dayjs.default)(targetDateString); // 只取日期部分
|
|
119
|
+
|
|
120
|
+
// 首先检查是否在包含日期中(包含日期是额外增加的有效日期)
|
|
119
121
|
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
120
122
|
for (const includedDate of repeat_rule.included_date) {
|
|
121
|
-
const includeStartDate = (0,
|
|
122
|
-
const includeEndDate = (0,
|
|
123
|
-
if (targetDateOnly.isSameOrAfter(includeStartDate,
|
|
123
|
+
const includeStartDate = (0, _dayjs.default)(includedDate.start);
|
|
124
|
+
const includeEndDate = (0, _dayjs.default)(includedDate.end);
|
|
125
|
+
if (targetDateOnly.isSameOrAfter(includeStartDate, 'day') && targetDateOnly.isSameOrBefore(includeEndDate, 'day')) {
|
|
126
|
+
// 在包含日期中,直接返回true,无需检查其他条件
|
|
124
127
|
return true;
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
130
|
}
|
|
131
|
+
|
|
132
|
+
// 检查是否在排除日期中
|
|
128
133
|
for (const excludedDate of repeat_rule.excluded_date) {
|
|
129
|
-
const excludeStartDate = (0,
|
|
130
|
-
const excludeEndDate = (0,
|
|
131
|
-
|
|
134
|
+
const excludeStartDate = (0, _dayjs.default)(excludedDate.start);
|
|
135
|
+
const excludeEndDate = (0, _dayjs.default)(excludedDate.end);
|
|
136
|
+
// 检查目标日期是否在排除范围内(包含边界)
|
|
137
|
+
if (targetDateOnly.isSameOrAfter(excludeStartDate, 'day') && targetDateOnly.isSameOrBefore(excludeEndDate, 'day')) {
|
|
132
138
|
return false;
|
|
133
139
|
}
|
|
134
140
|
}
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
|
|
142
|
+
// 检查重复规则的结束条件
|
|
143
|
+
if (repeat_rule.end.type === 'date' && repeat_rule.end.end_date) {
|
|
144
|
+
const ruleEndDate = (0, _dayjs.default)(repeat_rule.end.end_date);
|
|
137
145
|
if (targetDate.isAfter(ruleEndDate)) {
|
|
138
146
|
return false;
|
|
139
147
|
}
|
|
140
148
|
}
|
|
149
|
+
|
|
150
|
+
// 根据重复类型检查
|
|
141
151
|
switch (repeat_type) {
|
|
142
|
-
case
|
|
152
|
+
case 'daily':
|
|
143
153
|
return isInDailyRepeat(targetDate, startDate, endDate, repeat_rule);
|
|
144
|
-
case
|
|
154
|
+
case 'weekly':
|
|
145
155
|
return isInWeeklyRepeat(targetDate, startDate, endDate, repeat_rule);
|
|
146
156
|
default:
|
|
147
157
|
return false;
|
|
158
|
+
// 不支持月和年重复
|
|
148
159
|
}
|
|
149
160
|
};
|
|
150
|
-
|
|
151
|
-
|
|
161
|
+
|
|
162
|
+
// 每日重复逻辑
|
|
163
|
+
const isInDailyRepeat = (targetDate, startDate, endDate, repeatRule) => {
|
|
164
|
+
const daysDiff = targetDate.diff(startDate, 'day');
|
|
152
165
|
if (daysDiff < 0) {
|
|
153
166
|
return false;
|
|
154
167
|
}
|
|
168
|
+
|
|
169
|
+
// 检查频率
|
|
155
170
|
if (daysDiff % repeatRule.frequency !== 0) {
|
|
156
171
|
return false;
|
|
157
172
|
}
|
|
173
|
+
|
|
174
|
+
// 检查时间是否在日程的时间范围内
|
|
158
175
|
const targetTimeOfDay = targetDate.hour() * 3600 + targetDate.minute() * 60 + targetDate.second();
|
|
159
176
|
const startTimeOfDay = startDate.hour() * 3600 + startDate.minute() * 60 + startDate.second();
|
|
160
177
|
const endTimeOfDay = endDate.hour() * 3600 + endDate.minute() * 60 + endDate.second();
|
|
178
|
+
|
|
179
|
+
// 每日重复:每天都在相同的时间段内有效
|
|
180
|
+
// 例如:01:00:00 - 16:00:00,每天都是这个时间段
|
|
161
181
|
return targetTimeOfDay >= startTimeOfDay && targetTimeOfDay <= endTimeOfDay;
|
|
162
182
|
};
|
|
163
|
-
|
|
164
|
-
|
|
183
|
+
|
|
184
|
+
// 每周重复逻辑
|
|
185
|
+
const isInWeeklyRepeat = (targetDate, startDate, endDate, repeatRule) => {
|
|
186
|
+
const targetDayOfWeek = targetDate.day(); // 0=周日, 1=周一, ..., 6=周六
|
|
187
|
+
|
|
188
|
+
// 检查是否在指定的星期几内
|
|
165
189
|
if (!repeatRule.frequency_date.includes(targetDayOfWeek)) {
|
|
166
190
|
return false;
|
|
167
191
|
}
|
|
168
|
-
|
|
192
|
+
|
|
193
|
+
// 计算周差
|
|
194
|
+
const weeksDiff = targetDate.diff(startDate, 'week');
|
|
169
195
|
if (weeksDiff < 0) {
|
|
170
196
|
return false;
|
|
171
197
|
}
|
|
198
|
+
|
|
199
|
+
// 检查频率
|
|
172
200
|
if (weeksDiff % repeatRule.frequency !== 0) {
|
|
173
201
|
return false;
|
|
174
202
|
}
|
|
203
|
+
|
|
204
|
+
// 检查时间是否在日程的时间范围内
|
|
175
205
|
const targetTimeOfDay = targetDate.hour() * 3600 + targetDate.minute() * 60 + targetDate.second();
|
|
176
206
|
const startTimeOfDay = startDate.hour() * 3600 + startDate.minute() * 60 + startDate.second();
|
|
177
207
|
const endTimeOfDay = endDate.hour() * 3600 + endDate.minute() * 60 + endDate.second();
|
|
178
208
|
return targetTimeOfDay >= startTimeOfDay && targetTimeOfDay <= endTimeOfDay;
|
|
179
209
|
};
|
|
180
|
-
|
|
210
|
+
|
|
211
|
+
// 日程时间段类型
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* 获取当前日期日程时间点
|
|
215
|
+
* @param date 日期 YYYY-MM-DD
|
|
216
|
+
* @param scheduleList 日程列表
|
|
217
|
+
* @returns 当前日期日程时间点 结构,数组 [{
|
|
218
|
+
*
|
|
219
|
+
* // HH:mm
|
|
220
|
+
* end_time: string,
|
|
221
|
+
* // HH:mm
|
|
222
|
+
* start_time: string,
|
|
223
|
+
* // 日期时间
|
|
224
|
+
* // YYYY-MM-DD HH:mm:ss
|
|
225
|
+
* end_at: Dayjs,
|
|
226
|
+
* // YYYY-MM-DD HH:mm:ss
|
|
227
|
+
* start_at: Dayjs,
|
|
228
|
+
*
|
|
229
|
+
* }]
|
|
230
|
+
*/
|
|
231
|
+
const getScheduleStartEndTimePoints = (date, scheduleList) => {
|
|
181
232
|
if (!date || !scheduleList || scheduleList.length === 0) {
|
|
182
233
|
return [];
|
|
183
234
|
}
|
|
184
|
-
const targetDate = (0,
|
|
235
|
+
const targetDate = (0, _dayjs.default)(date);
|
|
185
236
|
if (!targetDate.isValid()) {
|
|
186
237
|
return [];
|
|
187
238
|
}
|
|
188
239
|
const timeSlots = [];
|
|
240
|
+
|
|
241
|
+
// 遍历所有日程
|
|
189
242
|
for (const schedule of scheduleList) {
|
|
190
243
|
const slots = extractTimeSlotsFromSchedule(date, schedule);
|
|
191
244
|
timeSlots.push(...slots);
|
|
192
245
|
}
|
|
246
|
+
|
|
247
|
+
// 去重并排序时间段
|
|
193
248
|
return mergeAndSortTimeSlots(timeSlots);
|
|
194
249
|
};
|
|
195
|
-
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* 从单个日程中提取指定日期的时间段
|
|
253
|
+
*/
|
|
254
|
+
exports.getScheduleStartEndTimePoints = getScheduleStartEndTimePoints;
|
|
255
|
+
const extractTimeSlotsFromSchedule = (date, schedule) => {
|
|
196
256
|
switch (schedule.type) {
|
|
197
|
-
case
|
|
257
|
+
case 'standard':
|
|
198
258
|
return extractStandardScheduleTimeSlots(date, schedule);
|
|
199
|
-
case
|
|
259
|
+
case 'time-slots':
|
|
200
260
|
return extractTimeSlotsScheduleTimeSlots(date, schedule);
|
|
201
|
-
case
|
|
261
|
+
case 'designation':
|
|
202
262
|
return extractDesignationScheduleTimeSlots(date, schedule);
|
|
203
263
|
default:
|
|
204
264
|
return [];
|
|
205
265
|
}
|
|
206
266
|
};
|
|
207
|
-
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* 提取标准类型日程的时间段
|
|
270
|
+
*/
|
|
271
|
+
const extractStandardScheduleTimeSlots = (date, schedule) => {
|
|
208
272
|
if (!schedule.start_time || !schedule.end_time) {
|
|
209
273
|
return [];
|
|
210
274
|
}
|
|
211
|
-
const targetDate = (0,
|
|
212
|
-
const startDate = (0,
|
|
213
|
-
const endDate = (0,
|
|
275
|
+
const targetDate = (0, _dayjs.default)(date);
|
|
276
|
+
const startDate = (0, _dayjs.default)(schedule.start_time);
|
|
277
|
+
const endDate = (0, _dayjs.default)(schedule.end_time);
|
|
278
|
+
|
|
279
|
+
// 检查日期是否在日程范围内
|
|
214
280
|
if (!isDateInStandardSchedule(targetDate, schedule, startDate, endDate)) {
|
|
215
281
|
return [];
|
|
216
282
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const
|
|
220
|
-
const
|
|
283
|
+
|
|
284
|
+
// 提取时间部分
|
|
285
|
+
const startTime = startDate.format('HH:mm');
|
|
286
|
+
const endTime = endDate.format('HH:mm');
|
|
287
|
+
|
|
288
|
+
// 构造完整的日期时间
|
|
289
|
+
const startAt = (0, _dayjs.default)(`${date} ${startTime}:00`);
|
|
290
|
+
const endAt = (0, _dayjs.default)(`${date} ${endTime}:00`);
|
|
221
291
|
return [{
|
|
222
292
|
start_time: startTime,
|
|
223
293
|
end_time: endTime,
|
|
@@ -225,22 +295,30 @@ var extractStandardScheduleTimeSlots = (date, schedule) => {
|
|
|
225
295
|
end_at: endAt
|
|
226
296
|
}];
|
|
227
297
|
};
|
|
228
|
-
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* 提取时间段类型日程的时间段
|
|
301
|
+
*/
|
|
302
|
+
const extractTimeSlotsScheduleTimeSlots = (date, schedule) => {
|
|
229
303
|
if (!schedule.start_time || !schedule.time_slot || schedule.time_slot.length === 0) {
|
|
230
304
|
return [];
|
|
231
305
|
}
|
|
232
|
-
const targetDate = (0,
|
|
233
|
-
const scheduleStartDate = (0,
|
|
306
|
+
const targetDate = (0, _dayjs.default)(date);
|
|
307
|
+
const scheduleStartDate = (0, _dayjs.default)(schedule.start_time.split(' ')[0]);
|
|
308
|
+
|
|
309
|
+
// 检查日期是否在日程的有效范围内(考虑重复规则)
|
|
234
310
|
if (!isDateInTimeSlotsSchedule(targetDate, schedule, scheduleStartDate)) {
|
|
235
311
|
return [];
|
|
236
312
|
}
|
|
237
313
|
const slots = [];
|
|
314
|
+
|
|
315
|
+
// 提取所有时间段
|
|
238
316
|
for (const timeSlot of schedule.time_slot) {
|
|
239
317
|
if (!timeSlot.start_time || !timeSlot.end_time) {
|
|
240
318
|
continue;
|
|
241
319
|
}
|
|
242
|
-
const startAt = (0,
|
|
243
|
-
const endAt = (0,
|
|
320
|
+
const startAt = (0, _dayjs.default)(`${date} ${timeSlot.start_time}:00`);
|
|
321
|
+
const endAt = (0, _dayjs.default)(`${date} ${timeSlot.end_time}:00`);
|
|
244
322
|
slots.push({
|
|
245
323
|
start_time: timeSlot.start_time,
|
|
246
324
|
end_time: timeSlot.end_time,
|
|
@@ -250,63 +328,90 @@ var extractTimeSlotsScheduleTimeSlots = (date, schedule) => {
|
|
|
250
328
|
}
|
|
251
329
|
return slots;
|
|
252
330
|
};
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* 检查日期是否在时间段类型日程范围内
|
|
334
|
+
*/
|
|
335
|
+
const isDateInTimeSlotsSchedule = (targetDate, schedule, scheduleStartDate) => {
|
|
336
|
+
// 不重复的日程
|
|
337
|
+
if (schedule.repeat_type === 'none') {
|
|
338
|
+
// 只在 start_time 的日期有效
|
|
339
|
+
return targetDate.isSame(scheduleStartDate, 'day');
|
|
256
340
|
}
|
|
341
|
+
|
|
342
|
+
// 重复的日程,需要检查重复规则
|
|
257
343
|
if (!schedule.repeat_rule) {
|
|
258
344
|
return false;
|
|
259
345
|
}
|
|
260
|
-
const {
|
|
346
|
+
const {
|
|
347
|
+
repeat_rule,
|
|
348
|
+
repeat_type
|
|
349
|
+
} = schedule;
|
|
350
|
+
|
|
351
|
+
// 检查是否在包含日期中(优先级最高)
|
|
261
352
|
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
262
353
|
for (const includedDate of repeat_rule.included_date) {
|
|
263
|
-
const includeStartDate = (0,
|
|
264
|
-
const includeEndDate = (0,
|
|
265
|
-
if (targetDate.isSameOrAfter(includeStartDate,
|
|
354
|
+
const includeStartDate = (0, _dayjs.default)(includedDate.start);
|
|
355
|
+
const includeEndDate = (0, _dayjs.default)(includedDate.end);
|
|
356
|
+
if (targetDate.isSameOrAfter(includeStartDate, 'day') && targetDate.isSameOrBefore(includeEndDate, 'day')) {
|
|
266
357
|
return true;
|
|
267
358
|
}
|
|
268
359
|
}
|
|
269
360
|
}
|
|
361
|
+
|
|
362
|
+
// 检查是否在排除日期中
|
|
270
363
|
if (repeat_rule.excluded_date && repeat_rule.excluded_date.length > 0) {
|
|
271
364
|
for (const excludedDate of repeat_rule.excluded_date) {
|
|
272
|
-
const excludeStartDate = (0,
|
|
273
|
-
const excludeEndDate = (0,
|
|
274
|
-
if (targetDate.isSameOrAfter(excludeStartDate,
|
|
365
|
+
const excludeStartDate = (0, _dayjs.default)(excludedDate.start);
|
|
366
|
+
const excludeEndDate = (0, _dayjs.default)(excludedDate.end);
|
|
367
|
+
if (targetDate.isSameOrAfter(excludeStartDate, 'day') && targetDate.isSameOrBefore(excludeEndDate, 'day')) {
|
|
275
368
|
return false;
|
|
276
369
|
}
|
|
277
370
|
}
|
|
278
371
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
372
|
+
|
|
373
|
+
// 检查重复规则的结束条件
|
|
374
|
+
if (repeat_rule.end.type === 'date' && repeat_rule.end.end_date) {
|
|
375
|
+
const ruleEndDate = (0, _dayjs.default)(repeat_rule.end.end_date);
|
|
376
|
+
if (targetDate.isAfter(ruleEndDate, 'day')) {
|
|
282
377
|
return false;
|
|
283
378
|
}
|
|
284
379
|
}
|
|
285
|
-
|
|
380
|
+
|
|
381
|
+
// 检查是否在开始日期之前
|
|
382
|
+
if (targetDate.isBefore(scheduleStartDate, 'day')) {
|
|
286
383
|
return false;
|
|
287
384
|
}
|
|
385
|
+
|
|
386
|
+
// 根据重复类型检查
|
|
288
387
|
switch (repeat_type) {
|
|
289
|
-
case
|
|
388
|
+
case 'daily':
|
|
290
389
|
return isDateInDailyRepeat(targetDate, scheduleStartDate, repeat_rule);
|
|
291
|
-
case
|
|
390
|
+
case 'weekly':
|
|
292
391
|
return isDateInWeeklyRepeat(targetDate, scheduleStartDate, repeat_rule);
|
|
293
392
|
default:
|
|
294
393
|
return false;
|
|
295
394
|
}
|
|
296
395
|
};
|
|
297
|
-
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* 提取指定日期类型日程的时间段
|
|
399
|
+
*/
|
|
400
|
+
const extractDesignationScheduleTimeSlots = (date, schedule) => {
|
|
298
401
|
if (!schedule.designation) {
|
|
299
402
|
return [];
|
|
300
403
|
}
|
|
301
|
-
const targetDate = (0,
|
|
404
|
+
const targetDate = (0, _dayjs.default)(date);
|
|
302
405
|
const designations = Array.isArray(schedule.designation) ? schedule.designation : [schedule.designation];
|
|
303
406
|
const slots = [];
|
|
304
407
|
for (const designation of designations) {
|
|
305
|
-
const startDate = (0,
|
|
306
|
-
const endDate = (0,
|
|
408
|
+
const startDate = (0, _dayjs.default)(designation.start_date);
|
|
409
|
+
const endDate = (0, _dayjs.default)(designation.end_date);
|
|
410
|
+
|
|
411
|
+
// 检查日期是否在指定范围内(考虑重复规则)
|
|
307
412
|
if (isDateInDesignationSchedule(targetDate, schedule, designation, startDate, endDate)) {
|
|
308
|
-
const startAt = (0,
|
|
309
|
-
const endAt = (0,
|
|
413
|
+
const startAt = (0, _dayjs.default)(`${date} ${designation.start_time}:00`);
|
|
414
|
+
const endAt = (0, _dayjs.default)(`${date} ${designation.end_time}:00`);
|
|
310
415
|
slots.push({
|
|
311
416
|
start_time: designation.start_time,
|
|
312
417
|
end_time: designation.end_time,
|
|
@@ -317,125 +422,196 @@ var extractDesignationScheduleTimeSlots = (date, schedule) => {
|
|
|
317
422
|
}
|
|
318
423
|
return slots;
|
|
319
424
|
};
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* 检查日期是否在指定日期类型日程范围内
|
|
428
|
+
*/
|
|
429
|
+
const isDateInDesignationSchedule = (targetDate, schedule, designation, startDate, endDate) => {
|
|
430
|
+
// 不重复的日程
|
|
431
|
+
if (schedule.repeat_type === 'none') {
|
|
432
|
+
// 检查日期是否在指定的日期范围内
|
|
433
|
+
return targetDate.isSameOrAfter(startDate, 'day') && targetDate.isSameOrBefore(endDate, 'day');
|
|
323
434
|
}
|
|
435
|
+
|
|
436
|
+
// 重复的日程,需要检查重复规则
|
|
324
437
|
if (!schedule.repeat_rule) {
|
|
325
438
|
return false;
|
|
326
439
|
}
|
|
327
|
-
const {
|
|
440
|
+
const {
|
|
441
|
+
repeat_rule,
|
|
442
|
+
repeat_type
|
|
443
|
+
} = schedule;
|
|
444
|
+
|
|
445
|
+
// 检查是否在包含日期中(优先级最高)
|
|
328
446
|
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
329
447
|
for (const includedDate of repeat_rule.included_date) {
|
|
330
|
-
const includeStartDate = (0,
|
|
331
|
-
const includeEndDate = (0,
|
|
332
|
-
if (targetDate.isSameOrAfter(includeStartDate,
|
|
448
|
+
const includeStartDate = (0, _dayjs.default)(includedDate.start);
|
|
449
|
+
const includeEndDate = (0, _dayjs.default)(includedDate.end);
|
|
450
|
+
if (targetDate.isSameOrAfter(includeStartDate, 'day') && targetDate.isSameOrBefore(includeEndDate, 'day')) {
|
|
333
451
|
return true;
|
|
334
452
|
}
|
|
335
453
|
}
|
|
336
454
|
}
|
|
455
|
+
|
|
456
|
+
// 检查是否在排除日期中
|
|
337
457
|
if (repeat_rule.excluded_date && repeat_rule.excluded_date.length > 0) {
|
|
338
458
|
for (const excludedDate of repeat_rule.excluded_date) {
|
|
339
|
-
const excludeStartDate = (0,
|
|
340
|
-
const excludeEndDate = (0,
|
|
341
|
-
if (targetDate.isSameOrAfter(excludeStartDate,
|
|
459
|
+
const excludeStartDate = (0, _dayjs.default)(excludedDate.start);
|
|
460
|
+
const excludeEndDate = (0, _dayjs.default)(excludedDate.end);
|
|
461
|
+
if (targetDate.isSameOrAfter(excludeStartDate, 'day') && targetDate.isSameOrBefore(excludeEndDate, 'day')) {
|
|
342
462
|
return false;
|
|
343
463
|
}
|
|
344
464
|
}
|
|
345
465
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
466
|
+
|
|
467
|
+
// 检查重复规则的结束条件
|
|
468
|
+
if (repeat_rule.end.type === 'date' && repeat_rule.end.end_date) {
|
|
469
|
+
const ruleEndDate = (0, _dayjs.default)(repeat_rule.end.end_date);
|
|
470
|
+
if (targetDate.isAfter(ruleEndDate, 'day')) {
|
|
349
471
|
return false;
|
|
350
472
|
}
|
|
351
473
|
}
|
|
352
|
-
|
|
353
|
-
|
|
474
|
+
|
|
475
|
+
// 检查是否在基本日期范围内
|
|
476
|
+
if (!targetDate.isSameOrAfter(startDate, 'day') || !targetDate.isSameOrBefore(endDate, 'day')) {
|
|
477
|
+
// 对于重复日程,如果不在基本范围内,还需要检查是否符合重复规则
|
|
478
|
+
// 只要在 startDate 之后,并且符合重复规则即可
|
|
479
|
+
if (targetDate.isBefore(startDate, 'day')) {
|
|
354
480
|
return false;
|
|
355
481
|
}
|
|
356
482
|
}
|
|
483
|
+
|
|
484
|
+
// 根据重复类型检查
|
|
357
485
|
switch (repeat_type) {
|
|
358
|
-
case
|
|
486
|
+
case 'daily':
|
|
359
487
|
return isDateInDailyRepeat(targetDate, startDate, repeat_rule);
|
|
360
|
-
case
|
|
488
|
+
case 'weekly':
|
|
361
489
|
return isDateInWeeklyRepeat(targetDate, startDate, repeat_rule);
|
|
362
490
|
default:
|
|
363
491
|
return false;
|
|
364
492
|
}
|
|
365
493
|
};
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* 检查日期是否在标准日程范围内
|
|
497
|
+
*/
|
|
498
|
+
const isDateInStandardSchedule = (targetDate, schedule, startDate, endDate) => {
|
|
499
|
+
const targetDateString = targetDate.format('YYYY-MM-DD');
|
|
500
|
+
|
|
501
|
+
// 不重复的日程
|
|
502
|
+
if (schedule.repeat_type === 'none') {
|
|
503
|
+
// 检查日期是否在范围内
|
|
504
|
+
const scheduleStartDate = startDate.format('YYYY-MM-DD');
|
|
505
|
+
const scheduleEndDate = endDate.format('YYYY-MM-DD');
|
|
506
|
+
return targetDate.isSameOrAfter(scheduleStartDate, 'day') && targetDate.isSameOrBefore(scheduleEndDate, 'day');
|
|
372
507
|
}
|
|
508
|
+
|
|
509
|
+
// 重复的日程,需要检查重复规则
|
|
373
510
|
if (!schedule.repeat_rule) {
|
|
374
511
|
return false;
|
|
375
512
|
}
|
|
376
|
-
const {
|
|
513
|
+
const {
|
|
514
|
+
repeat_rule,
|
|
515
|
+
repeat_type
|
|
516
|
+
} = schedule;
|
|
517
|
+
|
|
518
|
+
// 检查是否在包含日期中
|
|
377
519
|
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
378
520
|
for (const includedDate of repeat_rule.included_date) {
|
|
379
|
-
const includeStartDate = (0,
|
|
380
|
-
const includeEndDate = (0,
|
|
381
|
-
if (targetDate.isSameOrAfter(includeStartDate,
|
|
521
|
+
const includeStartDate = (0, _dayjs.default)(includedDate.start);
|
|
522
|
+
const includeEndDate = (0, _dayjs.default)(includedDate.end);
|
|
523
|
+
if (targetDate.isSameOrAfter(includeStartDate, 'day') && targetDate.isSameOrBefore(includeEndDate, 'day')) {
|
|
382
524
|
return true;
|
|
383
525
|
}
|
|
384
526
|
}
|
|
385
527
|
}
|
|
528
|
+
|
|
529
|
+
// 检查是否在排除日期中
|
|
386
530
|
for (const excludedDate of repeat_rule.excluded_date) {
|
|
387
|
-
const excludeStartDate = (0,
|
|
388
|
-
const excludeEndDate = (0,
|
|
389
|
-
if (targetDate.isSameOrAfter(excludeStartDate,
|
|
531
|
+
const excludeStartDate = (0, _dayjs.default)(excludedDate.start);
|
|
532
|
+
const excludeEndDate = (0, _dayjs.default)(excludedDate.end);
|
|
533
|
+
if (targetDate.isSameOrAfter(excludeStartDate, 'day') && targetDate.isSameOrBefore(excludeEndDate, 'day')) {
|
|
390
534
|
return false;
|
|
391
535
|
}
|
|
392
536
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
537
|
+
|
|
538
|
+
// 检查重复规则的结束条件
|
|
539
|
+
if (repeat_rule.end.type === 'date' && repeat_rule.end.end_date) {
|
|
540
|
+
const ruleEndDate = (0, _dayjs.default)(repeat_rule.end.end_date);
|
|
541
|
+
if (targetDate.isAfter(ruleEndDate, 'day')) {
|
|
396
542
|
return false;
|
|
397
543
|
}
|
|
398
544
|
}
|
|
399
|
-
|
|
545
|
+
|
|
546
|
+
// 检查是否在开始日期之前
|
|
547
|
+
if (targetDate.isBefore(startDate, 'day')) {
|
|
400
548
|
return false;
|
|
401
549
|
}
|
|
550
|
+
|
|
551
|
+
// 根据重复类型检查
|
|
402
552
|
switch (repeat_type) {
|
|
403
|
-
case
|
|
553
|
+
case 'daily':
|
|
404
554
|
return isDateInDailyRepeat(targetDate, startDate, repeat_rule);
|
|
405
|
-
case
|
|
555
|
+
case 'weekly':
|
|
406
556
|
return isDateInWeeklyRepeat(targetDate, startDate, repeat_rule);
|
|
407
557
|
default:
|
|
408
558
|
return false;
|
|
409
559
|
}
|
|
410
560
|
};
|
|
411
|
-
|
|
412
|
-
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* 检查日期是否符合每日重复规则
|
|
564
|
+
*/
|
|
565
|
+
const isDateInDailyRepeat = (targetDate, startDate, repeatRule) => {
|
|
566
|
+
const daysDiff = targetDate.diff(startDate, 'day');
|
|
413
567
|
if (daysDiff < 0) {
|
|
414
568
|
return false;
|
|
415
569
|
}
|
|
570
|
+
|
|
571
|
+
// 检查频率
|
|
416
572
|
return daysDiff % repeatRule.frequency === 0;
|
|
417
573
|
};
|
|
418
|
-
|
|
419
|
-
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* 检查日期是否符合每周重复规则
|
|
577
|
+
*/
|
|
578
|
+
const isDateInWeeklyRepeat = (targetDate, startDate, repeatRule) => {
|
|
579
|
+
const targetDayOfWeek = targetDate.day(); // 0=周日, 1=周一, ..., 6=周六
|
|
580
|
+
|
|
581
|
+
// 检查是否在指定的星期几内
|
|
420
582
|
if (!repeatRule.frequency_date.includes(targetDayOfWeek)) {
|
|
421
583
|
return false;
|
|
422
584
|
}
|
|
423
|
-
|
|
585
|
+
|
|
586
|
+
// 计算周差
|
|
587
|
+
const weeksDiff = targetDate.diff(startDate, 'week');
|
|
424
588
|
if (weeksDiff < 0) {
|
|
425
589
|
return false;
|
|
426
590
|
}
|
|
591
|
+
|
|
592
|
+
// 检查频率
|
|
427
593
|
return weeksDiff % repeatRule.frequency === 0;
|
|
428
594
|
};
|
|
429
|
-
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* 对时间段去重并排序
|
|
598
|
+
* 只移除开始时间和结束时间完全相同的重复时间段
|
|
599
|
+
*/
|
|
600
|
+
const mergeAndSortTimeSlots = slots => {
|
|
430
601
|
if (slots.length === 0) {
|
|
431
602
|
return [];
|
|
432
603
|
}
|
|
604
|
+
|
|
605
|
+
// 按开始时间排序
|
|
433
606
|
const sorted = [...slots].sort((a, b) => {
|
|
434
607
|
return a.start_at.valueOf() - b.start_at.valueOf();
|
|
435
608
|
});
|
|
609
|
+
|
|
610
|
+
// 去重:移除开始和结束时间完全相同的时间段
|
|
436
611
|
const unique = [];
|
|
437
|
-
const seenKeys =
|
|
612
|
+
const seenKeys = new Set();
|
|
438
613
|
for (const slot of sorted) {
|
|
614
|
+
// 使用开始时间和结束时间作为唯一键
|
|
439
615
|
const key = `${slot.start_time}-${slot.end_time}`;
|
|
440
616
|
if (!seenKeys.has(key)) {
|
|
441
617
|
seenKeys.add(key);
|
|
@@ -443,9 +619,4 @@ var mergeAndSortTimeSlots = (slots) => {
|
|
|
443
619
|
}
|
|
444
620
|
}
|
|
445
621
|
return unique;
|
|
446
|
-
};
|
|
447
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
448
|
-
0 && (module.exports = {
|
|
449
|
-
getDateIsInSchedule,
|
|
450
|
-
getScheduleStartEndTimePoints
|
|
451
|
-
});
|
|
622
|
+
};
|