@pisell/pisellos 3.0.85 → 3.0.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/Discount/types.d.ts +8 -0
- package/dist/modules/Rules/index.js +45 -6
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/index.js +44 -42
- package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
- package/lib/modules/Discount/types.d.ts +8 -0
- package/lib/modules/Rules/index.js +20 -6
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/index.js +4 -2
- package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
- package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
- package/package.json +1 -1
|
@@ -18,6 +18,14 @@ interface Formattitle {
|
|
|
18
18
|
interface PackageSubItemUsageRules {
|
|
19
19
|
type: 'universal_discount' | 'package_exclusive' | 'single_item_promo' | 'custom_usage_rules';
|
|
20
20
|
rules: ("original_price" | "markup_price")[];
|
|
21
|
+
package_scope?: {
|
|
22
|
+
type: 'all_packages' | 'specific_packages';
|
|
23
|
+
exclude_bundle_product_ids: number[];
|
|
24
|
+
include_bundle_product_ids: number[];
|
|
25
|
+
filter: 0 | 1;
|
|
26
|
+
rule: any[];
|
|
27
|
+
rule_type: 'and' | 'or';
|
|
28
|
+
};
|
|
21
29
|
}
|
|
22
30
|
interface Limitedrelationproductdata {
|
|
23
31
|
id: number;
|
|
@@ -1790,6 +1790,16 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1790
1790
|
return true;
|
|
1791
1791
|
}
|
|
1792
1792
|
var ruleType = usageRules.type;
|
|
1793
|
+
// 套餐适用范围配置
|
|
1794
|
+
var packageScope = usageRules === null || usageRules === void 0 ? void 0 : usageRules.package_scope;
|
|
1795
|
+
var _ref8 = packageScope || {},
|
|
1796
|
+
scopeType = _ref8.type,
|
|
1797
|
+
_ref8$exclude_bundle_ = _ref8.exclude_bundle_product_ids,
|
|
1798
|
+
exclude_bundle_product_ids = _ref8$exclude_bundle_ === void 0 ? [] : _ref8$exclude_bundle_,
|
|
1799
|
+
_ref8$include_bundle_ = _ref8.include_bundle_product_ids,
|
|
1800
|
+
include_bundle_product_ids = _ref8$include_bundle_ === void 0 ? [] : _ref8$include_bundle_,
|
|
1801
|
+
_ref8$filter = _ref8.filter,
|
|
1802
|
+
filter = _ref8$filter === void 0 ? 0 : _ref8$filter;
|
|
1793
1803
|
var isMainProduct = flatItem.type === 'main'; // 单独购买
|
|
1794
1804
|
var isBundleItem = flatItem.type === 'bundle'; // 套餐中购买
|
|
1795
1805
|
|
|
@@ -1804,10 +1814,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1804
1814
|
return true; // 单独购买时可用
|
|
1805
1815
|
}
|
|
1806
1816
|
if (isBundleItem) {
|
|
1807
|
-
var _flatItem$bundleItem8, _flatItem$bundleItem9;
|
|
1817
|
+
var _flatItem$bundleItem8, _flatItem$bundleItem9, _flatItem$originProdu, _flatItem$parentProdu10;
|
|
1808
1818
|
// 套餐中购买时,判断是否为原价
|
|
1809
1819
|
var priceType = (_flatItem$bundleItem8 = flatItem.bundleItem) === null || _flatItem$bundleItem8 === void 0 ? void 0 : _flatItem$bundleItem8.price_type;
|
|
1810
1820
|
var priceTypeExt = (_flatItem$bundleItem9 = flatItem.bundleItem) === null || _flatItem$bundleItem9 === void 0 ? void 0 : _flatItem$bundleItem9.price_type_ext;
|
|
1821
|
+
// 主商品id
|
|
1822
|
+
var mainProductId = (flatItem === null || flatItem === void 0 || (_flatItem$originProdu = flatItem.originProduct) === null || _flatItem$originProdu === void 0 || (_flatItem$originProdu = _flatItem$originProdu._productOrigin) === null || _flatItem$originProdu === void 0 ? void 0 : _flatItem$originProdu.id) || (flatItem === null || flatItem === void 0 || (_flatItem$parentProdu10 = flatItem.parentProduct) === null || _flatItem$parentProdu10 === void 0 ? void 0 : _flatItem$parentProdu10.id) || 0;
|
|
1811
1823
|
// original_price 对应:
|
|
1812
1824
|
// 1. price_type: "markup" && price_type_ext: "product_price"
|
|
1813
1825
|
// markup_price 对应:
|
|
@@ -1819,16 +1831,43 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
1819
1831
|
|
|
1820
1832
|
// 检查 rules
|
|
1821
1833
|
if (rules.length > 0) {
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1834
|
+
var _isOriginalPrice = isOriginalPrice && rules.includes('original_price');
|
|
1835
|
+
var _isMarkupPrice = isMarkupPrice && rules.includes('markup_price');
|
|
1836
|
+
// 价格是否符合规则:原价或加价
|
|
1837
|
+
var isPriceValid = _isOriginalPrice || _isMarkupPrice;
|
|
1838
|
+
// 套餐适用范围校验
|
|
1839
|
+
var isScopeValid = false;
|
|
1840
|
+
|
|
1841
|
+
// 排除套餐判断
|
|
1842
|
+
if (scopeType === 'all_packages') {
|
|
1843
|
+
// 所有套餐可用
|
|
1844
|
+
if (!filter) {
|
|
1845
|
+
isScopeValid = true;
|
|
1846
|
+
} else {
|
|
1847
|
+
isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
|
|
1848
|
+
}
|
|
1825
1849
|
}
|
|
1826
1850
|
|
|
1827
|
-
//
|
|
1828
|
-
if (
|
|
1851
|
+
// 包含套餐判断
|
|
1852
|
+
if (scopeType === 'specific_packages') {
|
|
1853
|
+
isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
// 价格和套餐适用范围都符合,则可用
|
|
1857
|
+
if (isPriceValid && isScopeValid) {
|
|
1829
1858
|
return true;
|
|
1830
1859
|
}
|
|
1831
1860
|
|
|
1861
|
+
// 检查原价
|
|
1862
|
+
// if (isOriginalPrice && rules.includes('original_price')) {
|
|
1863
|
+
// return true;
|
|
1864
|
+
// }
|
|
1865
|
+
|
|
1866
|
+
// 检查加价
|
|
1867
|
+
// if (isMarkupPrice && rules.includes('markup_price')) {
|
|
1868
|
+
// return true;
|
|
1869
|
+
// }
|
|
1870
|
+
|
|
1832
1871
|
// 如果都不匹配,则不可用
|
|
1833
1872
|
return false;
|
|
1834
1873
|
}
|
|
@@ -310,7 +310,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
310
310
|
date: string;
|
|
311
311
|
status: string;
|
|
312
312
|
week: string;
|
|
313
|
-
weekNum: 0 | 2 | 1 |
|
|
313
|
+
weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
|
|
314
314
|
}[]>;
|
|
315
315
|
submitTimeSlot(timeSlots: TimeSliceItem): void;
|
|
316
316
|
private getScheduleDataByIds;
|
|
@@ -1998,7 +1998,7 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1998
1998
|
return n.code === resources_code;
|
|
1999
1999
|
})) === null || _productResources$fin === void 0 ? void 0 : _productResources$fin.renderList;
|
|
2000
2000
|
if (targetRenderList && targetRenderList.length > 0) {
|
|
2001
|
-
var _item$_origin$resourc2;
|
|
2001
|
+
var _item$_origin$resourc2, _dateRange$5, _item$duration2, _item$_productOrigin6;
|
|
2002
2002
|
// 如果购物车里已经有同类型的 form_id 的资源了,则不处理
|
|
2003
2003
|
if ((_item$_origin$resourc2 = item._origin.resources) !== null && _item$_origin$resourc2 !== void 0 && _item$_origin$resourc2.some(function (n) {
|
|
2004
2004
|
return n.form_id === targetRenderList[0].form_id;
|
|
@@ -2008,7 +2008,9 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2008
2008
|
var fastestResource = findFastestAvailableResource({
|
|
2009
2009
|
resources: targetRenderList,
|
|
2010
2010
|
currentCapacity: currentCapacity,
|
|
2011
|
-
countMap: selectResourcesMap
|
|
2011
|
+
countMap: selectResourcesMap,
|
|
2012
|
+
targetDate: dateRange === null || dateRange === void 0 || (_dateRange$5 = dateRange[0]) === null || _dateRange$5 === void 0 ? void 0 : _dateRange$5.date,
|
|
2013
|
+
durationMinutes: (item === null || item === void 0 || (_item$duration2 = item.duration) === null || _item$duration2 === void 0 ? void 0 : _item$duration2.value) || (item === null || item === void 0 || (_item$_productOrigin6 = item._productOrigin) === null || _item$_productOrigin6 === void 0 || (_item$_productOrigin6 = _item$_productOrigin6.duration) === null || _item$_productOrigin6 === void 0 ? void 0 : _item$_productOrigin6.value) || 10
|
|
2012
2014
|
});
|
|
2013
2015
|
var targetResource = fastestResource || targetRenderList[0];
|
|
2014
2016
|
targetResource.capacity = currentCapacity;
|
|
@@ -2074,8 +2076,8 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2074
2076
|
var maxCutOffTime = undefined;
|
|
2075
2077
|
var maxCutOffTimeValue = dayjs();
|
|
2076
2078
|
cartItems.forEach(function (item) {
|
|
2077
|
-
var _item$
|
|
2078
|
-
(_item$
|
|
2079
|
+
var _item$_productOrigin7, _item$_productOrigin8, _item$_productOrigin9, _item$_productOrigin10;
|
|
2080
|
+
(_item$_productOrigin7 = item._productOrigin) === null || _item$_productOrigin7 === void 0 || (_item$_productOrigin7 = _item$_productOrigin7.product_resource) === null || _item$_productOrigin7 === void 0 || (_item$_productOrigin7 = _item$_productOrigin7.resources) === null || _item$_productOrigin7 === void 0 || _item$_productOrigin7.forEach(function (n) {
|
|
2079
2081
|
// TODO: 少了个 status 的判断
|
|
2080
2082
|
if (n.code === resources_code) {
|
|
2081
2083
|
resources.push.apply(resources, _toConsumableArray(n.renderList || []));
|
|
@@ -2088,10 +2090,10 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2088
2090
|
if (item.resource_id && !resourceIds.includes(item.resource_id)) {
|
|
2089
2091
|
resourceIds.push(item.resource_id);
|
|
2090
2092
|
}
|
|
2091
|
-
resourcesTypeId = item === null || item === void 0 || (_item$
|
|
2093
|
+
resourcesTypeId = item === null || item === void 0 || (_item$_productOrigin8 = item._productOrigin) === null || _item$_productOrigin8 === void 0 || (_item$_productOrigin8 = _item$_productOrigin8.product_resource) === null || _item$_productOrigin8 === void 0 || (_item$_productOrigin8 = _item$_productOrigin8.resources) === null || _item$_productOrigin8 === void 0 || (_item$_productOrigin8 = _item$_productOrigin8.find(function (n) {
|
|
2092
2094
|
return n.code === resources_code;
|
|
2093
|
-
})) === null || _item$
|
|
2094
|
-
if ((_item$
|
|
2095
|
+
})) === null || _item$_productOrigin8 === void 0 ? void 0 : _item$_productOrigin8.id;
|
|
2096
|
+
if ((_item$_productOrigin9 = item._productOrigin) !== null && _item$_productOrigin9 !== void 0 && _item$_productOrigin9.cut_off_time && ((_item$_productOrigin10 = item._productOrigin) === null || _item$_productOrigin10 === void 0 ? void 0 : _item$_productOrigin10.cut_off_time.type) === 'advance') {
|
|
2095
2097
|
var currentCutOffTime = dayjs().add(item._productOrigin.cut_off_time.unit, item._productOrigin.cut_off_time.unit_type);
|
|
2096
2098
|
if (currentCutOffTime.isAfter(maxCutOffTimeValue, 'minute')) {
|
|
2097
2099
|
maxCutOffTimeValue = currentCutOffTime;
|
|
@@ -2141,13 +2143,13 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2141
2143
|
cartItems.forEach(function (item) {
|
|
2142
2144
|
// 单个预约累加账号 多个预约取最大值
|
|
2143
2145
|
if (isSingleResource) {
|
|
2144
|
-
var _item$_productOrigin10;
|
|
2145
|
-
accountDuration += ((_item$_productOrigin10 = item._productOrigin) === null || _item$_productOrigin10 === void 0 || (_item$_productOrigin10 = _item$_productOrigin10.duration) === null || _item$_productOrigin10 === void 0 ? void 0 : _item$_productOrigin10.value) || 10;
|
|
2146
|
-
} else {
|
|
2147
2146
|
var _item$_productOrigin11;
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2147
|
+
accountDuration += ((_item$_productOrigin11 = item._productOrigin) === null || _item$_productOrigin11 === void 0 || (_item$_productOrigin11 = _item$_productOrigin11.duration) === null || _item$_productOrigin11 === void 0 ? void 0 : _item$_productOrigin11.value) || 10;
|
|
2148
|
+
} else {
|
|
2149
|
+
var _item$_productOrigin12;
|
|
2150
|
+
if (accountDuration < (((_item$_productOrigin12 = item._productOrigin) === null || _item$_productOrigin12 === void 0 || (_item$_productOrigin12 = _item$_productOrigin12.duration) === null || _item$_productOrigin12 === void 0 ? void 0 : _item$_productOrigin12.value) || 10)) {
|
|
2151
|
+
var _item$_productOrigin13;
|
|
2152
|
+
accountDuration = ((_item$_productOrigin13 = item._productOrigin) === null || _item$_productOrigin13 === void 0 || (_item$_productOrigin13 = _item$_productOrigin13.duration) === null || _item$_productOrigin13 === void 0 ? void 0 : _item$_productOrigin13.value) || 10;
|
|
2151
2153
|
}
|
|
2152
2154
|
}
|
|
2153
2155
|
});
|
|
@@ -2184,8 +2186,8 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2184
2186
|
}
|
|
2185
2187
|
var resourcesUseableMap = {};
|
|
2186
2188
|
var hasFlexibleDuration = cartItems.some(function (item) {
|
|
2187
|
-
var _item$
|
|
2188
|
-
return ((_item$
|
|
2189
|
+
var _item$_productOrigin14;
|
|
2190
|
+
return ((_item$_productOrigin14 = item._productOrigin) === null || _item$_productOrigin14 === void 0 || (_item$_productOrigin14 = _item$_productOrigin14.duration) === null || _item$_productOrigin14 === void 0 ? void 0 : _item$_productOrigin14.type) === 'flexible';
|
|
2189
2191
|
});
|
|
2190
2192
|
var operating_day_boundary = (_this$shopStore$get = this.shopStore.get('core')) === null || _this$shopStore$get === void 0 || (_this$shopStore$get = _this$shopStore$get.core) === null || _this$shopStore$get === void 0 ? void 0 : _this$shopStore$get.operating_day_boundary;
|
|
2191
2193
|
|
|
@@ -2193,11 +2195,11 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2193
2195
|
var maxBlockThreshold = 0;
|
|
2194
2196
|
if (hasFlexibleDuration) {
|
|
2195
2197
|
maxBlockThreshold = cartItems.reduce(function (max, item) {
|
|
2196
|
-
var _item$
|
|
2198
|
+
var _item$_productOrigin15;
|
|
2197
2199
|
// 如果开启了灵活时长商品配置,则取 block_threshold 的值
|
|
2198
|
-
if ((_item$
|
|
2199
|
-
var _item$
|
|
2200
|
-
return Math.max(max, ((_item$
|
|
2200
|
+
if ((_item$_productOrigin15 = item._productOrigin) !== null && _item$_productOrigin15 !== void 0 && (_item$_productOrigin15 = _item$_productOrigin15.duration) !== null && _item$_productOrigin15 !== void 0 && (_item$_productOrigin15 = _item$_productOrigin15.flexible_config) !== null && _item$_productOrigin15 !== void 0 && _item$_productOrigin15.is_enable_minimum_duration) {
|
|
2201
|
+
var _item$_productOrigin16;
|
|
2202
|
+
return Math.max(max, ((_item$_productOrigin16 = item._productOrigin) === null || _item$_productOrigin16 === void 0 || (_item$_productOrigin16 = _item$_productOrigin16.duration) === null || _item$_productOrigin16 === void 0 || (_item$_productOrigin16 = _item$_productOrigin16.flexible_config) === null || _item$_productOrigin16 === void 0 ? void 0 : _item$_productOrigin16.block_threshold) || 0);
|
|
2201
2203
|
}
|
|
2202
2204
|
return 0;
|
|
2203
2205
|
}, 0);
|
|
@@ -2289,8 +2291,8 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2289
2291
|
maxCutOffTime = undefined;
|
|
2290
2292
|
maxCutOffTimeValue = dayjs();
|
|
2291
2293
|
cartItems.forEach(function (item) {
|
|
2292
|
-
var _item$
|
|
2293
|
-
(_item$
|
|
2294
|
+
var _item$_productOrigin17, _item$_productOrigin18, _item$_productOrigin19, _item$_productOrigin20;
|
|
2295
|
+
(_item$_productOrigin17 = item._productOrigin) === null || _item$_productOrigin17 === void 0 || (_item$_productOrigin17 = _item$_productOrigin17.product_resource) === null || _item$_productOrigin17 === void 0 || (_item$_productOrigin17 = _item$_productOrigin17.resources) === null || _item$_productOrigin17 === void 0 || _item$_productOrigin17.forEach(function (n) {
|
|
2294
2296
|
// TODO: 少了个 status 的判断
|
|
2295
2297
|
if (n.code === resources_code) {
|
|
2296
2298
|
resources.push.apply(resources, _toConsumableArray(n.renderList || []));
|
|
@@ -2303,10 +2305,10 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2303
2305
|
if (item.resource_id && !resourceIds.includes(item.resource_id)) {
|
|
2304
2306
|
resourceIds.push(item.resource_id);
|
|
2305
2307
|
}
|
|
2306
|
-
resourcesTypeId = item === null || item === void 0 || (_item$
|
|
2308
|
+
resourcesTypeId = item === null || item === void 0 || (_item$_productOrigin18 = item._productOrigin) === null || _item$_productOrigin18 === void 0 || (_item$_productOrigin18 = _item$_productOrigin18.product_resource) === null || _item$_productOrigin18 === void 0 || (_item$_productOrigin18 = _item$_productOrigin18.resources) === null || _item$_productOrigin18 === void 0 || (_item$_productOrigin18 = _item$_productOrigin18.find(function (n) {
|
|
2307
2309
|
return n.code === resources_code;
|
|
2308
|
-
})) === null || _item$
|
|
2309
|
-
if ((_item$
|
|
2310
|
+
})) === null || _item$_productOrigin18 === void 0 ? void 0 : _item$_productOrigin18.id;
|
|
2311
|
+
if ((_item$_productOrigin19 = item._productOrigin) !== null && _item$_productOrigin19 !== void 0 && _item$_productOrigin19.cut_off_time && ((_item$_productOrigin20 = item._productOrigin) === null || _item$_productOrigin20 === void 0 ? void 0 : _item$_productOrigin20.cut_off_time.type) === 'advance') {
|
|
2310
2312
|
var currentCutOffTime = dayjs().add(item._productOrigin.cut_off_time.unit, item._productOrigin.cut_off_time.unit_type);
|
|
2311
2313
|
if (currentCutOffTime.isAfter(maxCutOffTimeValue, 'minute')) {
|
|
2312
2314
|
maxCutOffTimeValue = currentCutOffTime;
|
|
@@ -2329,13 +2331,13 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2329
2331
|
cartItems.forEach(function (item) {
|
|
2330
2332
|
// 单个预约累加账号 多个预约取最大值
|
|
2331
2333
|
if (isSingleResource) {
|
|
2332
|
-
var _item$_productOrigin20;
|
|
2333
|
-
accountDuration += ((_item$_productOrigin20 = item._productOrigin) === null || _item$_productOrigin20 === void 0 || (_item$_productOrigin20 = _item$_productOrigin20.duration) === null || _item$_productOrigin20 === void 0 ? void 0 : _item$_productOrigin20.value) || 10;
|
|
2334
|
-
} else {
|
|
2335
2334
|
var _item$_productOrigin21;
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2335
|
+
accountDuration += ((_item$_productOrigin21 = item._productOrigin) === null || _item$_productOrigin21 === void 0 || (_item$_productOrigin21 = _item$_productOrigin21.duration) === null || _item$_productOrigin21 === void 0 ? void 0 : _item$_productOrigin21.value) || 10;
|
|
2336
|
+
} else {
|
|
2337
|
+
var _item$_productOrigin22;
|
|
2338
|
+
if (accountDuration < (((_item$_productOrigin22 = item._productOrigin) === null || _item$_productOrigin22 === void 0 || (_item$_productOrigin22 = _item$_productOrigin22.duration) === null || _item$_productOrigin22 === void 0 ? void 0 : _item$_productOrigin22.value) || 10)) {
|
|
2339
|
+
var _item$_productOrigin23;
|
|
2340
|
+
accountDuration = ((_item$_productOrigin23 = item._productOrigin) === null || _item$_productOrigin23 === void 0 || (_item$_productOrigin23 = _item$_productOrigin23.duration) === null || _item$_productOrigin23 === void 0 ? void 0 : _item$_productOrigin23.value) || 10;
|
|
2339
2341
|
}
|
|
2340
2342
|
}
|
|
2341
2343
|
});
|
|
@@ -2361,18 +2363,18 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2361
2363
|
case 20:
|
|
2362
2364
|
resourcesUseableMap = {};
|
|
2363
2365
|
hasFlexibleDuration = cartItems.some(function (item) {
|
|
2364
|
-
var _item$
|
|
2365
|
-
return ((_item$
|
|
2366
|
+
var _item$_productOrigin24;
|
|
2367
|
+
return ((_item$_productOrigin24 = item._productOrigin) === null || _item$_productOrigin24 === void 0 || (_item$_productOrigin24 = _item$_productOrigin24.duration) === null || _item$_productOrigin24 === void 0 ? void 0 : _item$_productOrigin24.type) === 'flexible';
|
|
2366
2368
|
});
|
|
2367
2369
|
operating_day_boundary = (_this$shopStore$get2 = this.shopStore.get('core')) === null || _this$shopStore$get2 === void 0 || (_this$shopStore$get2 = _this$shopStore$get2.core) === null || _this$shopStore$get2 === void 0 ? void 0 : _this$shopStore$get2.operating_day_boundary; // 如果有 hasFlexibleDuration,需要把动态时长商品(可能是多个,取最长的那个最低禁止购买时长)的最低禁止购买时长作为 split 的值
|
|
2368
2370
|
maxBlockThreshold = 0;
|
|
2369
2371
|
if (hasFlexibleDuration) {
|
|
2370
2372
|
maxBlockThreshold = cartItems.reduce(function (max, item) {
|
|
2371
|
-
var _item$
|
|
2373
|
+
var _item$_productOrigin25;
|
|
2372
2374
|
// 如果开启了灵活时长商品配置,则取 block_threshold 的值
|
|
2373
|
-
if ((_item$
|
|
2374
|
-
var _item$
|
|
2375
|
-
return Math.max(max, ((_item$
|
|
2375
|
+
if ((_item$_productOrigin25 = item._productOrigin) !== null && _item$_productOrigin25 !== void 0 && (_item$_productOrigin25 = _item$_productOrigin25.duration) !== null && _item$_productOrigin25 !== void 0 && (_item$_productOrigin25 = _item$_productOrigin25.flexible_config) !== null && _item$_productOrigin25 !== void 0 && _item$_productOrigin25.is_enable_minimum_duration) {
|
|
2376
|
+
var _item$_productOrigin26;
|
|
2377
|
+
return Math.max(max, ((_item$_productOrigin26 = item._productOrigin) === null || _item$_productOrigin26 === void 0 || (_item$_productOrigin26 = _item$_productOrigin26.duration) === null || _item$_productOrigin26 === void 0 || (_item$_productOrigin26 = _item$_productOrigin26.flexible_config) === null || _item$_productOrigin26 === void 0 ? void 0 : _item$_productOrigin26.block_threshold) || 0);
|
|
2376
2378
|
}
|
|
2377
2379
|
return 0;
|
|
2378
2380
|
}, 0);
|
|
@@ -2533,10 +2535,10 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2533
2535
|
var osWarnTips = [];
|
|
2534
2536
|
var newResources = cloneDeep(item._origin.resources);
|
|
2535
2537
|
newResources.forEach(function (resource) {
|
|
2536
|
-
var _item$
|
|
2538
|
+
var _item$_productOrigin27;
|
|
2537
2539
|
// 如果商品配置的是灵活时长,开始时间设置为提交的时间,结束时间从资源的可用最晚时间和店铺营业结束时间里取一个最早的
|
|
2538
|
-
if (((_item$
|
|
2539
|
-
var _allResources$find, _item$
|
|
2540
|
+
if (((_item$_productOrigin27 = item._productOrigin) === null || _item$_productOrigin27 === void 0 || (_item$_productOrigin27 = _item$_productOrigin27.duration) === null || _item$_productOrigin27 === void 0 ? void 0 : _item$_productOrigin27.type) === 'flexible') {
|
|
2541
|
+
var _allResources$find, _item$_productOrigin28, _item$_productOrigin29;
|
|
2540
2542
|
item.duration = {
|
|
2541
2543
|
type: 'minutes',
|
|
2542
2544
|
value: 10
|
|
@@ -2619,15 +2621,15 @@ export var BookingByStepImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2619
2621
|
resource.endTime = formattedEndTime.format('YYYY-MM-DD HH:mm');
|
|
2620
2622
|
// 如果是动态时长商品,并且当前选择的时间的结束时间小于了最低提示时长(warningThreshold),则追加一个提示
|
|
2621
2623
|
// 如果currentStartTime + warningThreshold 大于 currentEndTime,且 osWarnTips 没有pisell2.product.card.closing-soon.warning 这一项,则加入这一项
|
|
2622
|
-
if ((_item$
|
|
2624
|
+
if ((_item$_productOrigin28 = item._productOrigin) !== null && _item$_productOrigin28 !== void 0 && (_item$_productOrigin28 = _item$_productOrigin28.duration) !== null && _item$_productOrigin28 !== void 0 && (_item$_productOrigin28 = _item$_productOrigin28.flexible_config) !== null && _item$_productOrigin28 !== void 0 && _item$_productOrigin28.is_enable_minimum_duration && dayjs(currentStartTime).add(((_item$_productOrigin29 = item._productOrigin) === null || _item$_productOrigin29 === void 0 || (_item$_productOrigin29 = _item$_productOrigin29.duration) === null || _item$_productOrigin29 === void 0 || (_item$_productOrigin29 = _item$_productOrigin29.flexible_config) === null || _item$_productOrigin29 === void 0 ? void 0 : _item$_productOrigin29.warning_threshold) || 0, 'minutes').isAfter(dayjs(formattedEndTime))) {
|
|
2623
2625
|
if (!osWarnTips.includes('pisell2.product.card.closing-soon.warning')) {
|
|
2624
2626
|
osWarnTips.push('pisell2.product.card.closing-soon.warning');
|
|
2625
2627
|
}
|
|
2626
2628
|
}
|
|
2627
2629
|
} else {
|
|
2628
|
-
var _item$
|
|
2630
|
+
var _item$_productOrigin30;
|
|
2629
2631
|
resource.startTime = currentStartTime;
|
|
2630
|
-
resource.endTime = dayjs(currentStartTime).add(((_item$
|
|
2632
|
+
resource.endTime = dayjs(currentStartTime).add(((_item$_productOrigin30 = item._productOrigin) === null || _item$_productOrigin30 === void 0 || (_item$_productOrigin30 = _item$_productOrigin30.duration) === null || _item$_productOrigin30 === void 0 ? void 0 : _item$_productOrigin30.value) || 10, 'minutes').format('YYYY-MM-DD HH:mm');
|
|
2631
2633
|
}
|
|
2632
2634
|
// delete resource.times;
|
|
2633
2635
|
});
|
|
@@ -19,10 +19,12 @@ export declare function calculateResourceAvailableTime({ resource, timeSlots, cu
|
|
|
19
19
|
* @param countMap 已预约数量映射
|
|
20
20
|
* @returns 最快可用的资源
|
|
21
21
|
*/
|
|
22
|
-
export declare function findFastestAvailableResource({ resources, currentCapacity, countMap, }: {
|
|
22
|
+
export declare function findFastestAvailableResource({ resources, currentCapacity, countMap, targetDate, durationMinutes, }: {
|
|
23
23
|
resources: ResourceItem[];
|
|
24
24
|
currentCapacity?: number;
|
|
25
25
|
countMap?: Record<number, number>;
|
|
26
|
+
targetDate?: string | Dayjs;
|
|
27
|
+
durationMinutes?: number;
|
|
26
28
|
}): ResourceItem | null;
|
|
27
29
|
/**
|
|
28
30
|
* 给定一个时间列表,通过开始和结束时间过滤出符合条件的时间段
|
|
@@ -91,8 +91,14 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
91
91
|
_ref2$currentCapacity = _ref2.currentCapacity,
|
|
92
92
|
currentCapacity = _ref2$currentCapacity === void 0 ? 1 : _ref2$currentCapacity,
|
|
93
93
|
_ref2$countMap = _ref2.countMap,
|
|
94
|
-
countMap = _ref2$countMap === void 0 ? {} : _ref2$countMap
|
|
94
|
+
countMap = _ref2$countMap === void 0 ? {} : _ref2$countMap,
|
|
95
|
+
targetDate = _ref2.targetDate,
|
|
96
|
+
_ref2$durationMinutes = _ref2.durationMinutes,
|
|
97
|
+
durationMinutes = _ref2$durationMinutes === void 0 ? 30 : _ref2$durationMinutes;
|
|
95
98
|
var currentTime = dayjs();
|
|
99
|
+
var resolvedDuration = durationMinutes > 0 ? durationMinutes : 30;
|
|
100
|
+
var targetDay = targetDate ? dayjs(targetDate) : currentTime;
|
|
101
|
+
var isTargetDayToday = targetDay.isSame(currentTime, 'day');
|
|
96
102
|
var fastestTime = null;
|
|
97
103
|
var fastestResources = [];
|
|
98
104
|
console.log('[TimeslotUtils] 查找最快可用资源:', {
|
|
@@ -108,17 +114,18 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
108
114
|
try {
|
|
109
115
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
110
116
|
var _resource = _step2.value;
|
|
111
|
-
//
|
|
112
|
-
var
|
|
113
|
-
var
|
|
114
|
-
|
|
115
|
-
|
|
117
|
+
// 获取资源在目标日期且还在工作时间内的时间段
|
|
118
|
+
var targetDayTimes = _resource.times.filter(function (time) {
|
|
119
|
+
var isSameTargetDay = dayjs(time.start_at).isSame(targetDay, 'day');
|
|
120
|
+
if (!isSameTargetDay) return false;
|
|
121
|
+
if (!isTargetDayToday) return true;
|
|
122
|
+
return dayjs(time.end_at).isAfter(currentTime);
|
|
116
123
|
});
|
|
117
|
-
if (
|
|
124
|
+
if (targetDayTimes.length === 0) {
|
|
118
125
|
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, ") \u4ECA\u65E5\u65E0\u53EF\u7528\u65F6\u95F4\u6BB5"));
|
|
119
126
|
continue;
|
|
120
127
|
}
|
|
121
|
-
var _iterator4 = _createForOfIteratorHelper(
|
|
128
|
+
var _iterator4 = _createForOfIteratorHelper(targetDayTimes),
|
|
122
129
|
_step4;
|
|
123
130
|
try {
|
|
124
131
|
var _loop = function _loop() {
|
|
@@ -128,7 +135,7 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
128
135
|
var workEndTime = dayjs(time.end_at);
|
|
129
136
|
|
|
130
137
|
// 确定检查的起始时间(当前时间 vs 工作开始时间)
|
|
131
|
-
var nextAvailableTime = currentTime.
|
|
138
|
+
var nextAvailableTime = isTargetDayToday && currentTime.isAfter(workStartTime) ? currentTime : workStartTime;
|
|
132
139
|
console.log("[TimeslotUtils] \u68C0\u67E5\u8D44\u6E90 ".concat(_resource.id, "(").concat(_resource.main_field, "):"), {
|
|
133
140
|
workTime: "".concat(workStartTime.format('HH:mm'), "-").concat(workEndTime.format('HH:mm')),
|
|
134
141
|
checkStartTime: nextAvailableTime.format('HH:mm:ss'),
|
|
@@ -165,7 +172,7 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
165
172
|
// 检查资源类型和容量
|
|
166
173
|
if (_resource.resourceType === 'single' || (_resource.capacity || 1) === 1) {
|
|
167
174
|
// 单人预约资源:检查时间冲突
|
|
168
|
-
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(
|
|
175
|
+
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(resolvedDuration, 'minute'))) {
|
|
169
176
|
// 有冲突,使用事件结束时间
|
|
170
177
|
finalAvailableTime = _eventEnd;
|
|
171
178
|
console.log("[TimeslotUtils] \u53D1\u73B0\u65F6\u95F4\u51B2\u7A81\uFF0C\u8C03\u6574\u5230: ".concat(finalAvailableTime.format('HH:mm:ss')));
|
|
@@ -177,7 +184,7 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
177
184
|
var eventUsedCapacity = _event.pax || 1;
|
|
178
185
|
|
|
179
186
|
// 如果在事件时间范围内,检查容量是否足够
|
|
180
|
-
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(
|
|
187
|
+
if (finalAvailableTime.isBefore(_eventEnd) && _eventStart.isBefore(finalAvailableTime.add(resolvedDuration, 'minute'))) {
|
|
181
188
|
var totalRequiredCapacity = currentUsedCapacity + currentCapacity + eventUsedCapacity;
|
|
182
189
|
if (totalRequiredCapacity > totalCapacity) {
|
|
183
190
|
// 容量不足,使用事件结束时间
|
|
@@ -194,7 +201,7 @@ export function findFastestAvailableResource(_ref2) {
|
|
|
194
201
|
} finally {
|
|
195
202
|
_iterator5.f();
|
|
196
203
|
}
|
|
197
|
-
if (finalAvailableTime.isAfter(workEndTime)) {
|
|
204
|
+
if (finalAvailableTime.add(resolvedDuration, 'minute').isAfter(workEndTime)) {
|
|
198
205
|
console.log("[TimeslotUtils] \u8D44\u6E90 ".concat(_resource.id, " \u53EF\u7528\u65F6\u95F4\u8D85\u51FA\u5DE5\u4F5C\u65F6\u95F4\uFF0C\u8DF3\u8FC7"));
|
|
199
206
|
return 0; // continue
|
|
200
207
|
}
|
|
@@ -18,6 +18,14 @@ interface Formattitle {
|
|
|
18
18
|
interface PackageSubItemUsageRules {
|
|
19
19
|
type: 'universal_discount' | 'package_exclusive' | 'single_item_promo' | 'custom_usage_rules';
|
|
20
20
|
rules: ("original_price" | "markup_price")[];
|
|
21
|
+
package_scope?: {
|
|
22
|
+
type: 'all_packages' | 'specific_packages';
|
|
23
|
+
exclude_bundle_product_ids: number[];
|
|
24
|
+
include_bundle_product_ids: number[];
|
|
25
|
+
filter: 0 | 1;
|
|
26
|
+
rule: any[];
|
|
27
|
+
rule_type: 'and' | 'or';
|
|
28
|
+
};
|
|
21
29
|
}
|
|
22
30
|
interface Limitedrelationproductdata {
|
|
23
31
|
id: number;
|
|
@@ -1366,7 +1366,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
1366
1366
|
* @returns 是否可用
|
|
1367
1367
|
*/
|
|
1368
1368
|
checkPackageSubItemUsageRules(discount, flatItem) {
|
|
1369
|
-
var _a, _b, _c, _d;
|
|
1369
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1370
1370
|
const limitedData = discount.limited_relation_product_data;
|
|
1371
1371
|
const usageRules = limitedData == null ? void 0 : limitedData.package_sub_item_usage_rules;
|
|
1372
1372
|
const rules = ["original_price", ...(usageRules == null ? void 0 : usageRules.rules) || []];
|
|
@@ -1374,6 +1374,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
1374
1374
|
return true;
|
|
1375
1375
|
}
|
|
1376
1376
|
const ruleType = usageRules.type;
|
|
1377
|
+
const packageScope = usageRules == null ? void 0 : usageRules.package_scope;
|
|
1378
|
+
const { type: scopeType, exclude_bundle_product_ids = [], include_bundle_product_ids = [], filter = 0 } = packageScope || {};
|
|
1377
1379
|
const isMainProduct = flatItem.type === "main";
|
|
1378
1380
|
const isBundleItem = flatItem.type === "bundle";
|
|
1379
1381
|
if (isMainProduct) {
|
|
@@ -1386,13 +1388,25 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
1386
1388
|
if (isBundleItem) {
|
|
1387
1389
|
const priceType = (_a = flatItem.bundleItem) == null ? void 0 : _a.price_type;
|
|
1388
1390
|
const priceTypeExt = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type_ext;
|
|
1391
|
+
const mainProductId = ((_d = (_c = flatItem == null ? void 0 : flatItem.originProduct) == null ? void 0 : _c._productOrigin) == null ? void 0 : _d.id) || ((_e = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _e.id) || 0;
|
|
1389
1392
|
const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
|
|
1390
1393
|
const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
|
|
1391
1394
|
if (rules.length > 0) {
|
|
1392
|
-
|
|
1393
|
-
|
|
1395
|
+
const _isOriginalPrice = isOriginalPrice && rules.includes("original_price");
|
|
1396
|
+
const _isMarkupPrice = isMarkupPrice && rules.includes("markup_price");
|
|
1397
|
+
const isPriceValid = _isOriginalPrice || _isMarkupPrice;
|
|
1398
|
+
let isScopeValid = false;
|
|
1399
|
+
if (scopeType === "all_packages") {
|
|
1400
|
+
if (!filter) {
|
|
1401
|
+
isScopeValid = true;
|
|
1402
|
+
} else {
|
|
1403
|
+
isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
if (scopeType === "specific_packages") {
|
|
1407
|
+
isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
|
|
1394
1408
|
}
|
|
1395
|
-
if (
|
|
1409
|
+
if (isPriceValid && isScopeValid) {
|
|
1396
1410
|
return true;
|
|
1397
1411
|
}
|
|
1398
1412
|
return false;
|
|
@@ -1406,8 +1420,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
1406
1420
|
return false;
|
|
1407
1421
|
}
|
|
1408
1422
|
if (isBundleItem) {
|
|
1409
|
-
const priceType = (
|
|
1410
|
-
const priceTypeExt = (
|
|
1423
|
+
const priceType = (_f = flatItem.bundleItem) == null ? void 0 : _f.price_type;
|
|
1424
|
+
const priceTypeExt = (_g = flatItem.bundleItem) == null ? void 0 : _g.price_type_ext;
|
|
1411
1425
|
return priceType === "markup" && priceTypeExt === "product_price";
|
|
1412
1426
|
}
|
|
1413
1427
|
return false;
|
|
@@ -310,7 +310,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
|
|
|
310
310
|
date: string;
|
|
311
311
|
status: string;
|
|
312
312
|
week: string;
|
|
313
|
-
weekNum: 0 | 2 | 1 |
|
|
313
|
+
weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
|
|
314
314
|
}[]>;
|
|
315
315
|
submitTimeSlot(timeSlots: TimeSliceItem): void;
|
|
316
316
|
private getScheduleDataByIds;
|
|
@@ -1234,7 +1234,7 @@ var BookingByStepImpl = class extends import_BaseModule.BaseModule {
|
|
|
1234
1234
|
}
|
|
1235
1235
|
);
|
|
1236
1236
|
cartItems2.forEach((item, index) => {
|
|
1237
|
-
var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1237
|
+
var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
|
|
1238
1238
|
const { currentCapacity } = (0, import_capacity.getCapacityInfoByCartItem)(item);
|
|
1239
1239
|
const hasOriginTimeSlot = Boolean(item._origin.start_time) && Boolean(item._origin.end_time) && !(timeSlots == null ? void 0 : timeSlots.start_time);
|
|
1240
1240
|
if (hasOriginTimeSlot) {
|
|
@@ -1367,7 +1367,9 @@ var BookingByStepImpl = class extends import_BaseModule.BaseModule {
|
|
|
1367
1367
|
const fastestResource = (0, import_timeslots.findFastestAvailableResource)({
|
|
1368
1368
|
resources: targetRenderList,
|
|
1369
1369
|
currentCapacity,
|
|
1370
|
-
countMap: selectResourcesMap
|
|
1370
|
+
countMap: selectResourcesMap,
|
|
1371
|
+
targetDate: (_k = dateRange == null ? void 0 : dateRange[0]) == null ? void 0 : _k.date,
|
|
1372
|
+
durationMinutes: ((_l = item == null ? void 0 : item.duration) == null ? void 0 : _l.value) || ((_n = (_m = item == null ? void 0 : item._productOrigin) == null ? void 0 : _m.duration) == null ? void 0 : _n.value) || 10
|
|
1371
1373
|
});
|
|
1372
1374
|
const targetResource = fastestResource || targetRenderList[0];
|
|
1373
1375
|
targetResource.capacity = currentCapacity;
|
|
@@ -19,10 +19,12 @@ export declare function calculateResourceAvailableTime({ resource, timeSlots, cu
|
|
|
19
19
|
* @param countMap 已预约数量映射
|
|
20
20
|
* @returns 最快可用的资源
|
|
21
21
|
*/
|
|
22
|
-
export declare function findFastestAvailableResource({ resources, currentCapacity, countMap, }: {
|
|
22
|
+
export declare function findFastestAvailableResource({ resources, currentCapacity, countMap, targetDate, durationMinutes, }: {
|
|
23
23
|
resources: ResourceItem[];
|
|
24
24
|
currentCapacity?: number;
|
|
25
25
|
countMap?: Record<number, number>;
|
|
26
|
+
targetDate?: string | Dayjs;
|
|
27
|
+
durationMinutes?: number;
|
|
26
28
|
}): ResourceItem | null;
|
|
27
29
|
/**
|
|
28
30
|
* 给定一个时间列表,通过开始和结束时间过滤出符合条件的时间段
|
|
@@ -77,10 +77,15 @@ function calculateResourceAvailableTime({
|
|
|
77
77
|
function findFastestAvailableResource({
|
|
78
78
|
resources,
|
|
79
79
|
currentCapacity = 1,
|
|
80
|
-
countMap = {}
|
|
80
|
+
countMap = {},
|
|
81
|
+
targetDate,
|
|
82
|
+
durationMinutes = 30
|
|
81
83
|
}) {
|
|
82
84
|
var _a, _b, _c;
|
|
83
85
|
const currentTime = (0, import_dayjs.default)();
|
|
86
|
+
const resolvedDuration = durationMinutes > 0 ? durationMinutes : 30;
|
|
87
|
+
const targetDay = targetDate ? (0, import_dayjs.default)(targetDate) : currentTime;
|
|
88
|
+
const isTargetDayToday = targetDay.isSame(currentTime, "day");
|
|
84
89
|
let fastestTime = null;
|
|
85
90
|
let fastestResources = [];
|
|
86
91
|
console.log("[TimeslotUtils] 查找最快可用资源:", {
|
|
@@ -90,19 +95,22 @@ function findFastestAvailableResource({
|
|
|
90
95
|
countMap
|
|
91
96
|
});
|
|
92
97
|
for (const resource of resources) {
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
const targetDayTimes = resource.times.filter((time) => {
|
|
99
|
+
const isSameTargetDay = (0, import_dayjs.default)(time.start_at).isSame(targetDay, "day");
|
|
100
|
+
if (!isSameTargetDay)
|
|
101
|
+
return false;
|
|
102
|
+
if (!isTargetDayToday)
|
|
103
|
+
return true;
|
|
104
|
+
return (0, import_dayjs.default)(time.end_at).isAfter(currentTime);
|
|
97
105
|
});
|
|
98
|
-
if (
|
|
106
|
+
if (targetDayTimes.length === 0) {
|
|
99
107
|
console.log(`[TimeslotUtils] 资源 ${resource.id}(${resource.main_field}) 今日无可用时间段`);
|
|
100
108
|
continue;
|
|
101
109
|
}
|
|
102
|
-
for (const time of
|
|
110
|
+
for (const time of targetDayTimes) {
|
|
103
111
|
const workStartTime = (0, import_dayjs.default)(time.start_at);
|
|
104
112
|
const workEndTime = (0, import_dayjs.default)(time.end_at);
|
|
105
|
-
let nextAvailableTime = currentTime.
|
|
113
|
+
let nextAvailableTime = isTargetDayToday && currentTime.isAfter(workStartTime) ? currentTime : workStartTime;
|
|
106
114
|
console.log(`[TimeslotUtils] 检查资源 ${resource.id}(${resource.main_field}):`, {
|
|
107
115
|
workTime: `${workStartTime.format("HH:mm")}-${workEndTime.format("HH:mm")}`,
|
|
108
116
|
checkStartTime: nextAvailableTime.format("HH:mm:ss"),
|
|
@@ -126,7 +134,7 @@ function findFastestAvailableResource({
|
|
|
126
134
|
pax: event.pax || 1
|
|
127
135
|
});
|
|
128
136
|
if (resource.resourceType === "single" || (resource.capacity || 1) === 1) {
|
|
129
|
-
if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(
|
|
137
|
+
if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(resolvedDuration, "minute"))) {
|
|
130
138
|
finalAvailableTime = eventEnd;
|
|
131
139
|
console.log(`[TimeslotUtils] 发现时间冲突,调整到: ${finalAvailableTime.format("HH:mm:ss")}`);
|
|
132
140
|
}
|
|
@@ -134,7 +142,7 @@ function findFastestAvailableResource({
|
|
|
134
142
|
const totalCapacity = resource.capacity || 0;
|
|
135
143
|
const currentUsedCapacity = countMap[resource.id] || 0;
|
|
136
144
|
const eventUsedCapacity = event.pax || 1;
|
|
137
|
-
if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(
|
|
145
|
+
if (finalAvailableTime.isBefore(eventEnd) && eventStart.isBefore(finalAvailableTime.add(resolvedDuration, "minute"))) {
|
|
138
146
|
const totalRequiredCapacity = currentUsedCapacity + currentCapacity + eventUsedCapacity;
|
|
139
147
|
if (totalRequiredCapacity > totalCapacity) {
|
|
140
148
|
finalAvailableTime = eventEnd;
|
|
@@ -143,7 +151,7 @@ function findFastestAvailableResource({
|
|
|
143
151
|
}
|
|
144
152
|
}
|
|
145
153
|
}
|
|
146
|
-
if (finalAvailableTime.isAfter(workEndTime)) {
|
|
154
|
+
if (finalAvailableTime.add(resolvedDuration, "minute").isAfter(workEndTime)) {
|
|
147
155
|
console.log(`[TimeslotUtils] 资源 ${resource.id} 可用时间超出工作时间,跳过`);
|
|
148
156
|
continue;
|
|
149
157
|
}
|