@pisell/pisellos 1.0.64 → 1.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Rules/index.js +5 -5
- package/dist/solution/BookingByStep/utils/timeslots.js +88 -38
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Rules/index.js +5 -5
- package/lib/solution/BookingByStep/utils/timeslots.js +38 -3
- package/package.json +1 -1
|
@@ -49,5 +49,5 @@ export declare class Product extends BaseModule implements Module {
|
|
|
49
49
|
getCategories(): ProductCategory[];
|
|
50
50
|
setOtherParams(key: string, value: any): void;
|
|
51
51
|
getOtherParams(): any;
|
|
52
|
-
getProductType(): "
|
|
52
|
+
getProductType(): "duration" | "session" | "normal";
|
|
53
53
|
}
|
|
@@ -349,7 +349,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
349
349
|
console.log(sortedProductList, 'sortedProductListsortedProductList');
|
|
350
350
|
|
|
351
351
|
// 然后再处理应用哪些优惠券,此时只考虑filteredDiscountList中的优惠券
|
|
352
|
-
sortedProductList.forEach(function (originProduct,
|
|
352
|
+
sortedProductList.forEach(function (originProduct, index) {
|
|
353
353
|
var _product$discount_lis4, _product$discount_lis5, _product$discount_lis7, _product$discount_lis8, _product$discount_lis9, _product$discount_lis10, _product$discount_lis11;
|
|
354
354
|
var product = _this3.hooks.getProduct(originProduct);
|
|
355
355
|
if (product !== null && product !== void 0 && product.booking_id && (_product$discount_lis4 = product.discount_list) !== null && _product$discount_lis4 !== void 0 && _product$discount_lis4.length && product !== null && product !== void 0 && (_product$discount_lis5 = product.discount_list) !== null && _product$discount_lis5 !== void 0 && _product$discount_lis5.every(function (discount) {
|
|
@@ -441,7 +441,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
441
441
|
}))]);
|
|
442
442
|
} else {
|
|
443
443
|
processedProductsMap.set(product._id, [_this3.hooks.setProduct(originProduct, _objectSpread(_objectSpread({}, isManualDiscount ? {} : {
|
|
444
|
-
_id: product._id.split('___')[0] + '___' +
|
|
444
|
+
_id: product._id.split('___')[0] + '___' + index,
|
|
445
445
|
total: product.origin_total || product.total,
|
|
446
446
|
price: product.price
|
|
447
447
|
}), {}, {
|
|
@@ -469,10 +469,10 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
469
469
|
_id: product._id.split('___')[0]
|
|
470
470
|
}));
|
|
471
471
|
}
|
|
472
|
-
for (var
|
|
472
|
+
for (var i = 0; i < splitCount; i++) {
|
|
473
473
|
var _product$discount_lis12, _originProduct$_produ, _selectedDiscount$met;
|
|
474
474
|
// 如果用过折扣卡,也就不存在拆分的情况了,这里直接使用上面计算出来的折扣卡
|
|
475
|
-
var _selectedDiscount = selectedDiscountCard || applicableDiscounts[
|
|
475
|
+
var _selectedDiscount = selectedDiscountCard || applicableDiscounts[i];
|
|
476
476
|
// 标记优惠券为已使用
|
|
477
477
|
usedDiscounts.set(_selectedDiscount.id, true);
|
|
478
478
|
|
|
@@ -534,7 +534,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
534
534
|
} else {
|
|
535
535
|
arr.push(_this3.hooks.setProduct(originProduct, {
|
|
536
536
|
discount_list: [discountDetail],
|
|
537
|
-
_id: product._id.split('___')[0] + "___" + _selectedDiscount.id,
|
|
537
|
+
_id: product._id.split('___')[0] + "___" + _selectedDiscount.id + index,
|
|
538
538
|
price: _selectedDiscount.tag === 'good_pass' ? 0 : product.price,
|
|
539
539
|
quantity: isNeedSplit ? 1 : product.quantity,
|
|
540
540
|
total: targetProductTotal,
|
|
@@ -107,29 +107,29 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
107
107
|
_step2;
|
|
108
108
|
try {
|
|
109
109
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
110
|
-
var
|
|
110
|
+
var _resource = _step2.value;
|
|
111
111
|
// 获取资源当天且还在工作时间内的时间段
|
|
112
|
-
var todayTimes =
|
|
112
|
+
var todayTimes = _resource.times.filter(function (time) {
|
|
113
113
|
var isToday = dayjs(time.start_at).isSame(currentTime, 'day');
|
|
114
114
|
var isStillWorking = dayjs(time.end_at).isAfter(currentTime);
|
|
115
115
|
return isToday && isStillWorking;
|
|
116
116
|
});
|
|
117
117
|
if (todayTimes.length === 0) {
|
|
118
|
-
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(
|
|
118
|
+
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, ") \u4ECA\u65E5\u65E0\u53EF\u7528\u65F6\u95F4\u6BB5"));
|
|
119
119
|
continue;
|
|
120
120
|
}
|
|
121
|
-
var
|
|
122
|
-
|
|
121
|
+
var _iterator4 = _createForOfIteratorHelper(todayTimes),
|
|
122
|
+
_step4;
|
|
123
123
|
try {
|
|
124
124
|
var _loop = function _loop() {
|
|
125
125
|
var _time$event_list, _time$event_list2;
|
|
126
|
-
var time =
|
|
126
|
+
var time = _step4.value;
|
|
127
127
|
var workStartTime = dayjs(time.start_at);
|
|
128
128
|
var workEndTime = dayjs(time.end_at);
|
|
129
129
|
|
|
130
130
|
// 确定检查的起始时间(当前时间 vs 工作开始时间)
|
|
131
131
|
var nextAvailableTime = currentTime.isBefore(workStartTime) ? workStartTime : currentTime;
|
|
132
|
-
console.log("[TimeslotUtils] \u68C0\u67E5\u8D44\u6E90 ".concat(
|
|
132
|
+
console.log("[TimeslotUtils] \u68C0\u67E5\u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, "):"), {
|
|
133
133
|
workTime: "".concat(workStartTime.format('HH:mm'), "-").concat(workEndTime.format('HH:mm')),
|
|
134
134
|
checkStartTime: nextAvailableTime.format('HH:mm:ss'),
|
|
135
135
|
eventCount: ((_time$event_list = time.event_list) === null || _time$event_list === void 0 ? void 0 : _time$event_list.length) || 0
|
|
@@ -148,40 +148,40 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
148
148
|
|
|
149
149
|
// 检查从 nextAvailableTime 开始的可用性
|
|
150
150
|
var finalAvailableTime = nextAvailableTime;
|
|
151
|
-
var
|
|
152
|
-
|
|
151
|
+
var _iterator5 = _createForOfIteratorHelper(relevantEvents),
|
|
152
|
+
_step5;
|
|
153
153
|
try {
|
|
154
|
-
for (
|
|
155
|
-
var
|
|
156
|
-
var
|
|
157
|
-
var
|
|
154
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
155
|
+
var _event = _step5.value;
|
|
156
|
+
var _eventStart = dayjs(_event.start_at);
|
|
157
|
+
var _eventEnd = dayjs(_event.end_at);
|
|
158
158
|
console.log("[TimeslotUtils] \u68C0\u67E5\u4E8B\u4EF6\u51B2\u7A81:", {
|
|
159
|
-
resourceId:
|
|
160
|
-
eventTime: "".concat(
|
|
159
|
+
resourceId: _resource.id,
|
|
160
|
+
eventTime: "".concat(_eventStart.format('HH:mm'), "-").concat(_eventEnd.format('HH:mm')),
|
|
161
161
|
checkTime: finalAvailableTime.format('HH:mm:ss'),
|
|
162
|
-
pax:
|
|
162
|
+
pax: _event.pax || 1
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
// 检查资源类型和容量
|
|
166
|
-
if (
|
|
166
|
+
if (_resource.resourceType === 'single' || (_resource.capacity || 1) === 1) {
|
|
167
167
|
// 单人预约资源:检查时间冲突
|
|
168
|
-
if (finalAvailableTime.isBefore(
|
|
168
|
+
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
|
|
169
169
|
// 有冲突,使用事件结束时间
|
|
170
|
-
finalAvailableTime =
|
|
170
|
+
finalAvailableTime = _eventEnd;
|
|
171
171
|
console.log("[TimeslotUtils] \u53D1\u73B0\u65F6\u95F4\u51B2\u7A81\uFF0C\u8C03\u6574\u5230: ".concat(finalAvailableTime.format('HH:mm:ss')));
|
|
172
172
|
}
|
|
173
173
|
} else {
|
|
174
174
|
// 多人预约资源:检查容量
|
|
175
|
-
var totalCapacity =
|
|
176
|
-
var currentUsedCapacity = countMap[
|
|
177
|
-
var eventUsedCapacity =
|
|
175
|
+
var totalCapacity = _resource.capacity || 0;
|
|
176
|
+
var currentUsedCapacity = countMap[_resource.id] || 0;
|
|
177
|
+
var eventUsedCapacity = _event.pax || 1;
|
|
178
178
|
|
|
179
179
|
// 如果在事件时间范围内,检查容量是否足够
|
|
180
|
-
if (finalAvailableTime.isBefore(
|
|
180
|
+
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(30, 'minute'))) {
|
|
181
181
|
var totalRequiredCapacity = currentUsedCapacity + currentCapacity + eventUsedCapacity;
|
|
182
182
|
if (totalRequiredCapacity > totalCapacity) {
|
|
183
183
|
// 容量不足,使用事件结束时间
|
|
184
|
-
finalAvailableTime =
|
|
184
|
+
finalAvailableTime = _eventEnd;
|
|
185
185
|
console.log("[TimeslotUtils] \u5BB9\u91CF\u4E0D\u8DB3\uFF0C\u8C03\u6574\u5230: ".concat(finalAvailableTime.format('HH:mm:ss')));
|
|
186
186
|
}
|
|
187
187
|
}
|
|
@@ -190,38 +190,38 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
190
190
|
|
|
191
191
|
// 确保可用时间在工作时间内
|
|
192
192
|
} catch (err) {
|
|
193
|
-
|
|
193
|
+
_iterator5.e(err);
|
|
194
194
|
} finally {
|
|
195
|
-
|
|
195
|
+
_iterator5.f();
|
|
196
196
|
}
|
|
197
197
|
if (finalAvailableTime.isAfter(workEndTime)) {
|
|
198
|
-
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(
|
|
198
|
+
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, " \u53EF\u7528\u65F6\u95F4\u8D85\u51FA\u5DE5\u4F5C\u65F6\u95F4\uFF0C\u8DF3\u8FC7"));
|
|
199
199
|
return 0; // continue
|
|
200
200
|
}
|
|
201
|
-
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(
|
|
201
|
+
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, ") \u6700\u5FEB\u53EF\u7528\u65F6\u95F4: ").concat(finalAvailableTime.format('HH:mm:ss')));
|
|
202
202
|
|
|
203
203
|
// 更新最快可用时间和资源
|
|
204
204
|
if (!fastestTime || finalAvailableTime.isBefore(fastestTime)) {
|
|
205
205
|
fastestTime = finalAvailableTime;
|
|
206
|
-
fastestResources = [
|
|
207
|
-
console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u5FEB\u65F6\u95F4: ".concat(fastestTime.format('HH:mm:ss'), ", \u8D44\u6E90: ").concat(
|
|
206
|
+
fastestResources = [_resource];
|
|
207
|
+
console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u5FEB\u65F6\u95F4: ".concat(fastestTime.format('HH:mm:ss'), ", \u8D44\u6E90: ").concat(_resource.main_field));
|
|
208
208
|
} else if (finalAvailableTime.isSame(fastestTime)) {
|
|
209
|
-
fastestResources.push(
|
|
210
|
-
console.log("[TimeslotUtils] \u6DFB\u52A0\u76F8\u540C\u65F6\u95F4\u8D44\u6E90: ".concat(
|
|
209
|
+
fastestResources.push(_resource);
|
|
210
|
+
console.log("[TimeslotUtils] \u6DFB\u52A0\u76F8\u540C\u65F6\u95F4\u8D44\u6E90: ".concat(_resource.main_field));
|
|
211
211
|
}
|
|
212
212
|
return 1; // break
|
|
213
213
|
// 每个资源只需要计算一次
|
|
214
214
|
},
|
|
215
215
|
_ret;
|
|
216
|
-
for (
|
|
216
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
217
217
|
_ret = _loop();
|
|
218
218
|
if (_ret === 0) continue;
|
|
219
219
|
if (_ret === 1) break;
|
|
220
220
|
}
|
|
221
221
|
} catch (err) {
|
|
222
|
-
|
|
222
|
+
_iterator4.e(err);
|
|
223
223
|
} finally {
|
|
224
|
-
|
|
224
|
+
_iterator4.f();
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
|
|
@@ -243,10 +243,60 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
243
243
|
return fastestResources[0];
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
//
|
|
247
|
-
// 这里简化处理,直接返回第一个
|
|
246
|
+
// 如果有多个最快可用的资源,选择空闲时间最长的资源
|
|
248
247
|
var selectedResource = fastestResources[0];
|
|
249
|
-
|
|
248
|
+
var maxIdleTime = 0;
|
|
249
|
+
console.log("[TimeslotUtils] \u6BD4\u8F83 ".concat(fastestResources.length, " \u4E2A\u8D44\u6E90\u7684\u7A7A\u95F2\u65F6\u95F4:"));
|
|
250
|
+
for (var _i2 = 0, _fastestResources = fastestResources; _i2 < _fastestResources.length; _i2++) {
|
|
251
|
+
var _workingTime$event_li;
|
|
252
|
+
var resource = _fastestResources[_i2];
|
|
253
|
+
// 找到该资源当天且还在工作的时间段
|
|
254
|
+
var workingTime = resource.times.find(function (time) {
|
|
255
|
+
var isToday = dayjs(time.start_at).isSame(fastestTime, 'day');
|
|
256
|
+
var isStillWorking = dayjs(time.end_at).isAfter(fastestTime);
|
|
257
|
+
return isToday && isStillWorking;
|
|
258
|
+
});
|
|
259
|
+
if (!workingTime) continue;
|
|
260
|
+
var workEndTime = dayjs(workingTime.end_at);
|
|
261
|
+
|
|
262
|
+
// 计算从最快可用时间到工作结束时间的空闲时长(分钟)
|
|
263
|
+
var totalIdleTime = workEndTime.diff(fastestTime, 'minute');
|
|
264
|
+
|
|
265
|
+
// 减去已有预约占用的时间
|
|
266
|
+
var relevantEvents = ((_workingTime$event_li = workingTime.event_list) === null || _workingTime$event_li === void 0 ? void 0 : _workingTime$event_li.filter(function (event) {
|
|
267
|
+
var eventStart = dayjs(event.start_at);
|
|
268
|
+
var eventEnd = dayjs(event.end_at);
|
|
269
|
+
// 只计算在最快可用时间之后的预约
|
|
270
|
+
return eventEnd.isAfter(fastestTime) && eventStart.isAfter(fastestTime);
|
|
271
|
+
})) || [];
|
|
272
|
+
var _iterator3 = _createForOfIteratorHelper(relevantEvents),
|
|
273
|
+
_step3;
|
|
274
|
+
try {
|
|
275
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
276
|
+
var event = _step3.value;
|
|
277
|
+
var eventStart = dayjs(event.start_at);
|
|
278
|
+
var eventEnd = dayjs(event.end_at);
|
|
279
|
+
var eventDuration = eventEnd.diff(eventStart, 'minute');
|
|
280
|
+
totalIdleTime -= eventDuration;
|
|
281
|
+
}
|
|
282
|
+
} catch (err) {
|
|
283
|
+
_iterator3.e(err);
|
|
284
|
+
} finally {
|
|
285
|
+
_iterator3.f();
|
|
286
|
+
}
|
|
287
|
+
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(resource.id, "(").concat(resource.main_field, "):"), {
|
|
288
|
+
工作结束时间: workEndTime.format('HH:mm'),
|
|
289
|
+
总工作时长: workEndTime.diff(fastestTime, 'minute') + '分钟',
|
|
290
|
+
预约占用时长: workEndTime.diff(fastestTime, 'minute') - totalIdleTime + '分钟',
|
|
291
|
+
实际空闲时长: totalIdleTime + '分钟'
|
|
292
|
+
});
|
|
293
|
+
if (totalIdleTime > maxIdleTime) {
|
|
294
|
+
maxIdleTime = totalIdleTime;
|
|
295
|
+
selectedResource = resource;
|
|
296
|
+
console.log("[TimeslotUtils] \u66F4\u65B0\u6700\u4F73\u9009\u62E9: ".concat(resource.main_field, " (\u7A7A\u95F2").concat(totalIdleTime, "\u5206\u949F)"));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
console.log("[TimeslotUtils] \u6700\u7EC8\u9009\u62E9\u8D44\u6E90: ".concat(selectedResource.main_field, " (\u6700\u957F\u7A7A\u95F2").concat(maxIdleTime, "\u5206\u949F)"));
|
|
250
300
|
return selectedResource;
|
|
251
301
|
}
|
|
252
302
|
|
|
@@ -49,5 +49,5 @@ export declare class Product extends BaseModule implements Module {
|
|
|
49
49
|
getCategories(): ProductCategory[];
|
|
50
50
|
setOtherParams(key: string, value: any): void;
|
|
51
51
|
getOtherParams(): any;
|
|
52
|
-
getProductType(): "
|
|
52
|
+
getProductType(): "duration" | "session" | "normal";
|
|
53
53
|
}
|
|
@@ -228,7 +228,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
228
228
|
});
|
|
229
229
|
});
|
|
230
230
|
console.log(sortedProductList, "sortedProductListsortedProductList");
|
|
231
|
-
sortedProductList.forEach((originProduct,
|
|
231
|
+
sortedProductList.forEach((originProduct, index) => {
|
|
232
232
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
233
233
|
const product = this.hooks.getProduct(originProduct);
|
|
234
234
|
if ((product == null ? void 0 : product.booking_id) && ((_a = product.discount_list) == null ? void 0 : _a.length) && ((_b = product == null ? void 0 : product.discount_list) == null ? void 0 : _b.every((discount) => discount.id && ["good_pass", "discount_card", "product_discount_card"].includes(discount.tag || discount.type)))) {
|
|
@@ -305,7 +305,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
305
305
|
product._id,
|
|
306
306
|
[this.hooks.setProduct(originProduct, {
|
|
307
307
|
...isManualDiscount ? {} : {
|
|
308
|
-
_id: product._id.split("___")[0] + "___" +
|
|
308
|
+
_id: product._id.split("___")[0] + "___" + index,
|
|
309
309
|
total: product.origin_total || product.total,
|
|
310
310
|
price: product.price
|
|
311
311
|
},
|
|
@@ -328,8 +328,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
328
328
|
_id: product._id.split("___")[0]
|
|
329
329
|
}));
|
|
330
330
|
}
|
|
331
|
-
for (let
|
|
332
|
-
const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[
|
|
331
|
+
for (let i = 0; i < splitCount; i++) {
|
|
332
|
+
const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[i];
|
|
333
333
|
usedDiscounts.set(selectedDiscount2.id, true);
|
|
334
334
|
const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
|
|
335
335
|
let productOriginTotal = product.origin_total || product.total || 0;
|
|
@@ -377,7 +377,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
377
377
|
} else {
|
|
378
378
|
arr.push(this.hooks.setProduct(originProduct, {
|
|
379
379
|
discount_list: [discountDetail],
|
|
380
|
-
_id: product._id.split("___")[0] + "___" + selectedDiscount2.id,
|
|
380
|
+
_id: product._id.split("___")[0] + "___" + selectedDiscount2.id + index,
|
|
381
381
|
price: selectedDiscount2.tag === "good_pass" ? 0 : product.price,
|
|
382
382
|
quantity: isNeedSplit ? 1 : product.quantity,
|
|
383
383
|
total: targetProductTotal,
|
|
@@ -79,7 +79,7 @@ function findFastestAvailableResource({
|
|
|
79
79
|
currentCapacity = 1,
|
|
80
80
|
countMap = {}
|
|
81
81
|
}) {
|
|
82
|
-
var _a, _b;
|
|
82
|
+
var _a, _b, _c;
|
|
83
83
|
const currentTime = (0, import_dayjs.default)();
|
|
84
84
|
let fastestTime = null;
|
|
85
85
|
let fastestResources = [];
|
|
@@ -168,8 +168,43 @@ function findFastestAvailableResource({
|
|
|
168
168
|
console.log(`[TimeslotUtils] 返回唯一最快资源: ${fastestResources[0].main_field}`);
|
|
169
169
|
return fastestResources[0];
|
|
170
170
|
}
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
let selectedResource = fastestResources[0];
|
|
172
|
+
let maxIdleTime = 0;
|
|
173
|
+
console.log(`[TimeslotUtils] 比较 ${fastestResources.length} 个资源的空闲时间:`);
|
|
174
|
+
for (const resource of fastestResources) {
|
|
175
|
+
const workingTime = resource.times.find((time) => {
|
|
176
|
+
const isToday = (0, import_dayjs.default)(time.start_at).isSame(fastestTime, "day");
|
|
177
|
+
const isStillWorking = (0, import_dayjs.default)(time.end_at).isAfter(fastestTime);
|
|
178
|
+
return isToday && isStillWorking;
|
|
179
|
+
});
|
|
180
|
+
if (!workingTime)
|
|
181
|
+
continue;
|
|
182
|
+
const workEndTime = (0, import_dayjs.default)(workingTime.end_at);
|
|
183
|
+
let totalIdleTime = workEndTime.diff(fastestTime, "minute");
|
|
184
|
+
const relevantEvents = ((_c = workingTime.event_list) == null ? void 0 : _c.filter((event) => {
|
|
185
|
+
const eventStart = (0, import_dayjs.default)(event.start_at);
|
|
186
|
+
const eventEnd = (0, import_dayjs.default)(event.end_at);
|
|
187
|
+
return eventEnd.isAfter(fastestTime) && eventStart.isAfter(fastestTime);
|
|
188
|
+
})) || [];
|
|
189
|
+
for (const event of relevantEvents) {
|
|
190
|
+
const eventStart = (0, import_dayjs.default)(event.start_at);
|
|
191
|
+
const eventEnd = (0, import_dayjs.default)(event.end_at);
|
|
192
|
+
const eventDuration = eventEnd.diff(eventStart, "minute");
|
|
193
|
+
totalIdleTime -= eventDuration;
|
|
194
|
+
}
|
|
195
|
+
console.log(`[TimeslotUtils] 资源 ${resource.id}(${resource.main_field}):`, {
|
|
196
|
+
工作结束时间: workEndTime.format("HH:mm"),
|
|
197
|
+
总工作时长: workEndTime.diff(fastestTime, "minute") + "分钟",
|
|
198
|
+
预约占用时长: workEndTime.diff(fastestTime, "minute") - totalIdleTime + "分钟",
|
|
199
|
+
实际空闲时长: totalIdleTime + "分钟"
|
|
200
|
+
});
|
|
201
|
+
if (totalIdleTime > maxIdleTime) {
|
|
202
|
+
maxIdleTime = totalIdleTime;
|
|
203
|
+
selectedResource = resource;
|
|
204
|
+
console.log(`[TimeslotUtils] 更新最佳选择: ${resource.main_field} (空闲${totalIdleTime}分钟)`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
console.log(`[TimeslotUtils] 最终选择资源: ${selectedResource.main_field} (最长空闲${maxIdleTime}分钟)`);
|
|
173
208
|
return selectedResource;
|
|
174
209
|
}
|
|
175
210
|
function filterConditionTimeSlots(times, startTime, endTime) {
|