@pisell/pisellos 2.1.119 → 2.1.121
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/apis/picoding.d.ts +0 -0
- package/dist/apis/picoding.js +1 -0
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.js +1 -0
- package/dist/model/strategy/adapter/index.d.ts +7 -0
- package/dist/model/strategy/adapter/index.js +7 -0
- package/dist/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
- package/dist/model/strategy/adapter/itemRule/adapter.js +439 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
- package/dist/model/strategy/adapter/itemRule/examples.d.ts +64 -0
- package/dist/model/strategy/adapter/itemRule/examples.js +315 -0
- package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/dist/model/strategy/adapter/itemRule/index.js +5 -0
- package/dist/model/strategy/adapter/itemRule/type.d.ts +206 -0
- package/dist/model/strategy/adapter/itemRule/type.js +101 -0
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
- package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/dist/model/strategy/adapter/promotion/examples.js +166 -0
- package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/dist/model/strategy/adapter/promotion/index.js +0 -0
- package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/dist/model/strategy/adapter/promotion/type.js +209 -0
- package/dist/model/strategy/adapter/type.d.ts +28 -0
- package/dist/model/strategy/adapter/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
- package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/dist/model/strategy/adapter/walletPass/example.js +258 -0
- package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/dist/model/strategy/adapter/walletPass/index.js +182 -0
- package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
- package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/dist/model/strategy/adapter/walletPass/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
- package/dist/model/strategy/engine.d.ts +106 -0
- package/dist/model/strategy/engine.js +611 -0
- package/dist/model/strategy/index.d.ts +3 -0
- package/dist/model/strategy/index.js +8 -0
- package/dist/model/strategy/strategy-example.d.ts +5 -0
- package/dist/model/strategy/strategy-example.js +331 -0
- package/dist/model/strategy/type.d.ts +228 -0
- package/dist/model/strategy/type.js +94 -0
- package/dist/modules/Cart/utils/cartProduct.js +1 -0
- package/dist/modules/OpenData/index.d.ts +24 -0
- package/dist/modules/OpenData/index.js +173 -0
- package/dist/modules/OpenData/types.d.ts +73 -0
- package/dist/modules/OpenData/types.js +1 -0
- package/dist/modules/OpenData/utils.d.ts +2 -0
- package/dist/modules/OpenData/utils.js +75 -0
- package/dist/modules/Order/index.d.ts +58 -1
- package/dist/modules/Order/index.js +796 -29
- package/dist/modules/Order/types.d.ts +144 -12
- package/dist/modules/Order/utils.d.ts +28 -0
- package/dist/modules/Order/utils.js +250 -1
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Product/utils.js +2 -2
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +2 -1
- package/dist/modules/Quotation/index.d.ts +48 -0
- package/dist/modules/Quotation/index.js +245 -0
- package/dist/modules/Quotation/types.d.ts +42 -0
- package/dist/modules/Quotation/types.js +1 -0
- package/dist/modules/Rules/index.js +4 -1
- package/dist/modules/SalesSummary/index.d.ts +63 -0
- package/dist/modules/SalesSummary/index.js +174 -0
- package/dist/modules/SalesSummary/types.d.ts +59 -0
- package/dist/modules/SalesSummary/types.js +1 -0
- package/dist/modules/SalesSummary/utils.d.ts +30 -0
- package/dist/modules/SalesSummary/utils.js +513 -0
- package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
- package/dist/modules/ScanOrderLogger/index.js +161 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
- package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
- package/dist/modules/ScanOrderLogger/types.js +1 -0
- package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
- package/dist/modules/Summary/utils.d.ts +3 -3
- package/dist/modules/Summary/utils.js +4 -4
- package/dist/modules/index.d.ts +4 -0
- package/dist/modules/index.js +5 -1
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/types.d.ts +3 -1
- package/dist/solution/BookingByStep/types.js +5 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/ScanOrder/index.d.ts +90 -0
- package/dist/solution/ScanOrder/index.js +1853 -0
- package/dist/solution/ScanOrder/types.d.ts +210 -0
- package/dist/solution/ScanOrder/types.js +16 -0
- package/dist/solution/ScanOrder/utils.d.ts +93 -0
- package/dist/solution/ScanOrder/utils.js +397 -0
- package/dist/solution/VenueBooking/index.d.ts +163 -0
- package/dist/solution/VenueBooking/index.js +2931 -0
- package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/dist/solution/VenueBooking/types.d.ts +130 -0
- package/dist/solution/VenueBooking/types.js +21 -0
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
- package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
- package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
- package/dist/solution/VenueBooking/utils/resource.js +94 -0
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +203 -0
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
- package/dist/solution/VenueBooking/utils.d.ts +1 -0
- package/dist/solution/VenueBooking/utils.js +1 -0
- package/dist/solution/index.d.ts +2 -0
- package/dist/solution/index.js +3 -1
- package/lib/apis/picoding.d.ts +0 -0
- package/lib/apis/picoding.js +0 -0
- package/lib/model/index.d.ts +1 -0
- package/lib/model/index.js +23 -0
- package/lib/model/strategy/adapter/index.d.ts +7 -0
- package/lib/model/strategy/adapter/index.js +57 -0
- package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
- package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
- package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
- package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
- package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/lib/model/strategy/adapter/itemRule/index.js +58 -0
- package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
- package/lib/model/strategy/adapter/itemRule/type.js +46 -0
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
- package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/lib/model/strategy/adapter/promotion/examples.js +192 -0
- package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/lib/model/strategy/adapter/promotion/index.js +49 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/lib/model/strategy/adapter/promotion/type.js +51 -0
- package/lib/model/strategy/adapter/type.d.ts +28 -0
- package/lib/model/strategy/adapter/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
- package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/lib/model/strategy/adapter/walletPass/example.js +207 -0
- package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/lib/model/strategy/adapter/walletPass/index.js +142 -0
- package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
- package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/lib/model/strategy/adapter/walletPass/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
- package/lib/model/strategy/engine.d.ts +106 -0
- package/lib/model/strategy/engine.js +450 -0
- package/lib/model/strategy/index.d.ts +3 -0
- package/lib/model/strategy/index.js +38 -0
- package/lib/model/strategy/strategy-example.d.ts +5 -0
- package/lib/model/strategy/strategy-example.js +318 -0
- package/lib/model/strategy/type.d.ts +228 -0
- package/lib/model/strategy/type.js +44 -0
- package/lib/modules/Cart/utils/cartProduct.js +1 -0
- package/lib/modules/OpenData/index.d.ts +24 -0
- package/lib/modules/OpenData/index.js +119 -0
- package/lib/modules/OpenData/types.d.ts +73 -0
- package/lib/modules/OpenData/types.js +17 -0
- package/lib/modules/OpenData/utils.d.ts +2 -0
- package/lib/modules/OpenData/utils.js +111 -0
- package/lib/modules/Order/index.d.ts +58 -1
- package/lib/modules/Order/index.js +437 -1
- package/lib/modules/Order/types.d.ts +144 -12
- package/lib/modules/Order/utils.d.ts +28 -0
- package/lib/modules/Order/utils.js +250 -2
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Product/utils.js +2 -2
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +2 -1
- package/lib/modules/Quotation/index.d.ts +48 -0
- package/lib/modules/Quotation/index.js +149 -0
- package/lib/modules/Quotation/types.d.ts +42 -0
- package/lib/modules/Quotation/types.js +17 -0
- package/lib/modules/Rules/index.js +4 -1
- package/lib/modules/SalesSummary/index.d.ts +63 -0
- package/lib/modules/SalesSummary/index.js +105 -0
- package/lib/modules/SalesSummary/types.d.ts +59 -0
- package/lib/modules/SalesSummary/types.js +17 -0
- package/lib/modules/SalesSummary/utils.d.ts +30 -0
- package/lib/modules/SalesSummary/utils.js +452 -0
- package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
- package/lib/modules/ScanOrderLogger/index.js +135 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
- package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
- package/lib/modules/ScanOrderLogger/types.js +17 -0
- package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
- package/lib/modules/Summary/utils.d.ts +3 -3
- package/lib/modules/Summary/utils.js +4 -4
- package/lib/modules/index.d.ts +4 -0
- package/lib/modules/index.js +9 -1
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/types.d.ts +3 -1
- package/lib/solution/BookingByStep/types.js +10 -0
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/ScanOrder/index.d.ts +90 -0
- package/lib/solution/ScanOrder/index.js +1071 -0
- package/lib/solution/ScanOrder/types.d.ts +210 -0
- package/lib/solution/ScanOrder/types.js +36 -0
- package/lib/solution/ScanOrder/utils.d.ts +93 -0
- package/lib/solution/ScanOrder/utils.js +359 -0
- package/lib/solution/VenueBooking/index.d.ts +163 -0
- package/lib/solution/VenueBooking/index.js +1578 -0
- package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/lib/solution/VenueBooking/types.d.ts +130 -0
- package/lib/solution/VenueBooking/types.js +44 -0
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
- package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
- package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
- package/lib/solution/VenueBooking/utils/resource.js +80 -0
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +208 -0
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
- package/lib/solution/VenueBooking/utils.d.ts +1 -0
- package/lib/solution/VenueBooking/utils.js +69 -0
- package/lib/solution/index.d.ts +2 -0
- package/lib/solution/index.js +5 -1
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
4
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
5
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
6
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
8
|
+
export function extractResourceIds(products) {
|
|
9
|
+
var ids = new Set();
|
|
10
|
+
var _iterator = _createForOfIteratorHelper(products),
|
|
11
|
+
_step;
|
|
12
|
+
try {
|
|
13
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
14
|
+
var _product$product_reso;
|
|
15
|
+
var product = _step.value;
|
|
16
|
+
var resources = (_product$product_reso = product.product_resource) === null || _product$product_reso === void 0 ? void 0 : _product$product_reso.resources;
|
|
17
|
+
if (!Array.isArray(resources)) continue;
|
|
18
|
+
var _iterator2 = _createForOfIteratorHelper(resources),
|
|
19
|
+
_step2;
|
|
20
|
+
try {
|
|
21
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
22
|
+
var resource = _step2.value;
|
|
23
|
+
if (resource.status !== 1) continue;
|
|
24
|
+
var defaultRes = resource.default_resource || [];
|
|
25
|
+
var optionalRes = resource.optional_resource || [];
|
|
26
|
+
for (var _i = 0, _arr = [].concat(_toConsumableArray(defaultRes), _toConsumableArray(optionalRes)); _i < _arr.length; _i++) {
|
|
27
|
+
var id = _arr[_i];
|
|
28
|
+
if (typeof id === 'number' && id > 0) ids.add(id);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} catch (err) {
|
|
32
|
+
_iterator2.e(err);
|
|
33
|
+
} finally {
|
|
34
|
+
_iterator2.f();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch (err) {
|
|
38
|
+
_iterator.e(err);
|
|
39
|
+
} finally {
|
|
40
|
+
_iterator.f();
|
|
41
|
+
}
|
|
42
|
+
return Array.from(ids);
|
|
43
|
+
}
|
|
44
|
+
export function buildResourceProductMap(products) {
|
|
45
|
+
var map = new Map();
|
|
46
|
+
var _iterator3 = _createForOfIteratorHelper(products),
|
|
47
|
+
_step3;
|
|
48
|
+
try {
|
|
49
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
50
|
+
var _product$product_reso2;
|
|
51
|
+
var product = _step3.value;
|
|
52
|
+
var resources = (_product$product_reso2 = product.product_resource) === null || _product$product_reso2 === void 0 ? void 0 : _product$product_reso2.resources;
|
|
53
|
+
if (!Array.isArray(resources)) continue;
|
|
54
|
+
var _iterator4 = _createForOfIteratorHelper(resources),
|
|
55
|
+
_step4;
|
|
56
|
+
try {
|
|
57
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
58
|
+
var resource = _step4.value;
|
|
59
|
+
if (resource.status !== 1) continue;
|
|
60
|
+
var allResourceIds = [].concat(_toConsumableArray(resource.default_resource || []), _toConsumableArray(resource.optional_resource || []));
|
|
61
|
+
var _iterator5 = _createForOfIteratorHelper(allResourceIds),
|
|
62
|
+
_step5;
|
|
63
|
+
try {
|
|
64
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
65
|
+
var resId = _step5.value;
|
|
66
|
+
if (map.has(resId)) continue;
|
|
67
|
+
map.set(resId, {
|
|
68
|
+
productId: product.id,
|
|
69
|
+
productTitle: product.title,
|
|
70
|
+
resourceName: resource.title,
|
|
71
|
+
formId: resource.id,
|
|
72
|
+
price: product.price || '0.00',
|
|
73
|
+
resourceType: resource.type || 'single'
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
} catch (err) {
|
|
77
|
+
_iterator5.e(err);
|
|
78
|
+
} finally {
|
|
79
|
+
_iterator5.f();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} catch (err) {
|
|
83
|
+
_iterator4.e(err);
|
|
84
|
+
} finally {
|
|
85
|
+
_iterator4.f();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
_iterator3.e(err);
|
|
90
|
+
} finally {
|
|
91
|
+
_iterator3.f();
|
|
92
|
+
}
|
|
93
|
+
return map;
|
|
94
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { VenueSlotSelection, MergedSlotGroup, PriceBreakdownEntry, ResourceProductMapping, VenueResourceRawData } from '../types';
|
|
2
|
+
import type { ScanOrderOrderProduct } from '../../ScanOrder/types';
|
|
3
|
+
export declare function buildVenueIdentityKey(resourceId: number | string, groupIndex: number): string;
|
|
4
|
+
export declare function mergeConsecutiveSlots(slots: VenueSlotSelection[]): MergedSlotGroup[];
|
|
5
|
+
export declare function buildPriceBreakdown(params: {
|
|
6
|
+
group: MergedSlotGroup;
|
|
7
|
+
productId: number;
|
|
8
|
+
quotation?: {
|
|
9
|
+
getQuotationShelfId: (p: {
|
|
10
|
+
productId: number;
|
|
11
|
+
datetime: string;
|
|
12
|
+
}) => number;
|
|
13
|
+
};
|
|
14
|
+
}): PriceBreakdownEntry[];
|
|
15
|
+
export interface BuildVenueBookingParams {
|
|
16
|
+
group: MergedSlotGroup;
|
|
17
|
+
resourceId: number | string;
|
|
18
|
+
mapping: ResourceProductMapping;
|
|
19
|
+
rawResource: VenueResourceRawData | undefined;
|
|
20
|
+
bookingUuid: string;
|
|
21
|
+
productUid: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function buildVenueBookingEntry(params: BuildVenueBookingParams): Record<string, any>;
|
|
24
|
+
/**
|
|
25
|
+
* 从一条已合并的订单商品还原出独立的时段列表。
|
|
26
|
+
* 优先使用 metadata.price_breakdown 还原每个时段的精确价格,
|
|
27
|
+
* 回退到按 selling_price / slot_count 均分。
|
|
28
|
+
*/
|
|
29
|
+
export declare function expandMergedSlotToIndividual(product: ScanOrderOrderProduct, slotDurationMinutes: number): VenueSlotSelection[];
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
8
|
+
import Decimal from 'decimal.js';
|
|
9
|
+
import dayjs from 'dayjs';
|
|
10
|
+
import { createUuidV4 } from "../../../modules/Order/utils";
|
|
11
|
+
export function buildVenueIdentityKey(resourceId, groupIndex) {
|
|
12
|
+
return "venue:".concat(resourceId, ":").concat(groupIndex, ":").concat(createUuidV4());
|
|
13
|
+
}
|
|
14
|
+
export function mergeConsecutiveSlots(slots) {
|
|
15
|
+
if (!slots.length) return [];
|
|
16
|
+
var sorted = _toConsumableArray(slots).sort(function (a, b) {
|
|
17
|
+
return a.startTime.localeCompare(b.startTime);
|
|
18
|
+
});
|
|
19
|
+
var groups = [];
|
|
20
|
+
var currentSlots = [sorted[0]];
|
|
21
|
+
var currentStart = sorted[0].startTime;
|
|
22
|
+
var currentEnd = sorted[0].endTime;
|
|
23
|
+
var totalPrice = new Decimal(sorted[0].price || '0');
|
|
24
|
+
for (var i = 1; i < sorted.length; i++) {
|
|
25
|
+
var slot = sorted[i];
|
|
26
|
+
if (slot.startTime === currentEnd) {
|
|
27
|
+
currentEnd = slot.endTime;
|
|
28
|
+
totalPrice = totalPrice.add(new Decimal(slot.price || '0'));
|
|
29
|
+
currentSlots.push(slot);
|
|
30
|
+
} else {
|
|
31
|
+
groups.push({
|
|
32
|
+
startTime: currentStart,
|
|
33
|
+
endTime: currentEnd,
|
|
34
|
+
totalPrice: totalPrice.toFixed(2),
|
|
35
|
+
slotCount: currentSlots.length,
|
|
36
|
+
slots: currentSlots
|
|
37
|
+
});
|
|
38
|
+
currentSlots = [slot];
|
|
39
|
+
currentStart = slot.startTime;
|
|
40
|
+
currentEnd = slot.endTime;
|
|
41
|
+
totalPrice = new Decimal(slot.price || '0');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
groups.push({
|
|
45
|
+
startTime: currentStart,
|
|
46
|
+
endTime: currentEnd,
|
|
47
|
+
totalPrice: totalPrice.toFixed(2),
|
|
48
|
+
slotCount: currentSlots.length,
|
|
49
|
+
slots: currentSlots
|
|
50
|
+
});
|
|
51
|
+
return groups;
|
|
52
|
+
}
|
|
53
|
+
export function buildPriceBreakdown(params) {
|
|
54
|
+
var group = params.group,
|
|
55
|
+
productId = params.productId,
|
|
56
|
+
quotation = params.quotation;
|
|
57
|
+
if (!group.slots.length) return [];
|
|
58
|
+
var entries = [];
|
|
59
|
+
var _iterator = _createForOfIteratorHelper(group.slots),
|
|
60
|
+
_step;
|
|
61
|
+
try {
|
|
62
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
63
|
+
var slot = _step.value;
|
|
64
|
+
var unitPrice = Number(slot.price || '0');
|
|
65
|
+
var shelfId = quotation ? quotation.getQuotationShelfId({
|
|
66
|
+
productId: productId,
|
|
67
|
+
datetime: slot.startTime
|
|
68
|
+
}) : 0;
|
|
69
|
+
var startHm = dayjs(slot.startTime, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DD HH:mm');
|
|
70
|
+
var endHm = dayjs(slot.endTime, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DD HH:mm');
|
|
71
|
+
var last = entries[entries.length - 1];
|
|
72
|
+
if (last && last.unit_price === unitPrice && last.quotation_shelf_id === shelfId && last.end_time === startHm) {
|
|
73
|
+
last.end_time = endHm;
|
|
74
|
+
last.quantity += 1;
|
|
75
|
+
} else {
|
|
76
|
+
entries.push({
|
|
77
|
+
start_time: startHm,
|
|
78
|
+
end_time: endHm,
|
|
79
|
+
unit_price: unitPrice,
|
|
80
|
+
quotation_shelf_id: shelfId,
|
|
81
|
+
quantity: 1
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
_iterator.e(err);
|
|
87
|
+
} finally {
|
|
88
|
+
_iterator.f();
|
|
89
|
+
}
|
|
90
|
+
return entries;
|
|
91
|
+
}
|
|
92
|
+
export function buildVenueBookingEntry(params) {
|
|
93
|
+
var _rawResource$form_id;
|
|
94
|
+
var group = params.group,
|
|
95
|
+
resourceId = params.resourceId,
|
|
96
|
+
mapping = params.mapping,
|
|
97
|
+
rawResource = params.rawResource,
|
|
98
|
+
bookingUuid = params.bookingUuid,
|
|
99
|
+
productUid = params.productUid;
|
|
100
|
+
var startMoment = dayjs(group.startTime, 'YYYY-MM-DD HH:mm');
|
|
101
|
+
var endMoment = dayjs(group.endTime, 'YYYY-MM-DD HH:mm');
|
|
102
|
+
var duration = endMoment.diff(startMoment, 'minute');
|
|
103
|
+
return {
|
|
104
|
+
schedule_event_id: null,
|
|
105
|
+
appointment_status: 'new',
|
|
106
|
+
start_date: startMoment.format('YYYY-MM-DD'),
|
|
107
|
+
start_time: startMoment.format('HH:mm'),
|
|
108
|
+
end_date: endMoment.format('YYYY-MM-DD'),
|
|
109
|
+
end_time: endMoment.format('HH:mm'),
|
|
110
|
+
select_date: startMoment.format('YYYY-MM-DD'),
|
|
111
|
+
duration: duration,
|
|
112
|
+
sub_type: 'minutes',
|
|
113
|
+
like_status: 'common',
|
|
114
|
+
number: 1,
|
|
115
|
+
is_all: false,
|
|
116
|
+
schedule_id: 0,
|
|
117
|
+
product_uid: productUid,
|
|
118
|
+
resources: [{
|
|
119
|
+
relation_type: 'form',
|
|
120
|
+
like_status: 'common',
|
|
121
|
+
id: resourceId,
|
|
122
|
+
main_field: mapping.resourceName,
|
|
123
|
+
form_id: (_rawResource$form_id = rawResource === null || rawResource === void 0 ? void 0 : rawResource.form_id) !== null && _rawResource$form_id !== void 0 ? _rawResource$form_id : mapping.formId,
|
|
124
|
+
relation_id: resourceId,
|
|
125
|
+
capacity: 1,
|
|
126
|
+
metadata: {}
|
|
127
|
+
}],
|
|
128
|
+
relation_products: [],
|
|
129
|
+
relation_forms: [],
|
|
130
|
+
holder: null,
|
|
131
|
+
metadata: {
|
|
132
|
+
unique_identification_number: bookingUuid,
|
|
133
|
+
venue_booking: true,
|
|
134
|
+
resource_id: resourceId
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 从一条已合并的订单商品还原出独立的时段列表。
|
|
141
|
+
* 优先使用 metadata.price_breakdown 还原每个时段的精确价格,
|
|
142
|
+
* 回退到按 selling_price / slot_count 均分。
|
|
143
|
+
*/
|
|
144
|
+
export function expandMergedSlotToIndividual(product, slotDurationMinutes) {
|
|
145
|
+
var meta = product.metadata || {};
|
|
146
|
+
var resourceId = meta.resource_id;
|
|
147
|
+
if (resourceId == null) return [];
|
|
148
|
+
var startTime = meta.start_time;
|
|
149
|
+
var endTime = meta.end_time;
|
|
150
|
+
if (!startTime || !endTime) return [];
|
|
151
|
+
var breakdown = meta.price_breakdown;
|
|
152
|
+
var result = [];
|
|
153
|
+
var cursor = dayjs(startTime, 'YYYY-MM-DD HH:mm');
|
|
154
|
+
var end = dayjs(endTime, 'YYYY-MM-DD HH:mm');
|
|
155
|
+
if (breakdown !== null && breakdown !== void 0 && breakdown.length) {
|
|
156
|
+
var priceMap = new Map();
|
|
157
|
+
var _iterator2 = _createForOfIteratorHelper(breakdown),
|
|
158
|
+
_step2;
|
|
159
|
+
try {
|
|
160
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
161
|
+
var entry = _step2.value;
|
|
162
|
+
var entryCursor = dayjs(entry.start_time, 'YYYY-MM-DD HH:mm');
|
|
163
|
+
var entryEnd = dayjs(entry.end_time, 'YYYY-MM-DD HH:mm');
|
|
164
|
+
while (entryCursor.isBefore(entryEnd)) {
|
|
165
|
+
priceMap.set(entryCursor.format('HH:mm'), entry.unit_price);
|
|
166
|
+
entryCursor = entryCursor.add(slotDurationMinutes, 'minute');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
} catch (err) {
|
|
170
|
+
_iterator2.e(err);
|
|
171
|
+
} finally {
|
|
172
|
+
_iterator2.f();
|
|
173
|
+
}
|
|
174
|
+
while (cursor.isBefore(end)) {
|
|
175
|
+
var _priceMap$get;
|
|
176
|
+
var slotEnd = cursor.add(slotDurationMinutes, 'minute');
|
|
177
|
+
var hm = cursor.format('HH:mm');
|
|
178
|
+
var price = (_priceMap$get = priceMap.get(hm)) !== null && _priceMap$get !== void 0 ? _priceMap$get : 0;
|
|
179
|
+
result.push({
|
|
180
|
+
resourceId: resourceId,
|
|
181
|
+
startTime: cursor.format('YYYY-MM-DD HH:mm'),
|
|
182
|
+
endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
|
|
183
|
+
price: new Decimal(price).toFixed(2)
|
|
184
|
+
});
|
|
185
|
+
cursor = slotEnd;
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
var slotCount = meta.slot_count || 1;
|
|
189
|
+
var totalPrice = new Decimal(product.selling_price || '0');
|
|
190
|
+
var perSlotPrice = slotCount > 0 ? totalPrice.div(slotCount).toFixed(2) : totalPrice.toFixed(2);
|
|
191
|
+
while (cursor.isBefore(end)) {
|
|
192
|
+
var _slotEnd = cursor.add(slotDurationMinutes, 'minute');
|
|
193
|
+
result.push({
|
|
194
|
+
resourceId: resourceId,
|
|
195
|
+
startTime: cursor.format('YYYY-MM-DD HH:mm'),
|
|
196
|
+
endTime: _slotEnd.format('YYYY-MM-DD HH:mm'),
|
|
197
|
+
price: perSlotPrice
|
|
198
|
+
});
|
|
199
|
+
cursor = _slotEnd;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import type { VenueBookingSlotConfig, VenueResourceRawData, VenueTimeSlotGrid, ResourceProductMapping } from '../types';
|
|
3
|
+
export declare function isBusinessHoursCrossDay(config: VenueBookingSlotConfig): boolean;
|
|
4
|
+
export declare function generateTimeLabels(config: VenueBookingSlotConfig): string[];
|
|
5
|
+
export declare function isSlotOccupied(slotStart: dayjs.Dayjs, slotEnd: dayjs.Dayjs, occupiedTimes: Array<{
|
|
6
|
+
start_at: string;
|
|
7
|
+
end_at: string;
|
|
8
|
+
}>): boolean;
|
|
9
|
+
interface SlotEvent {
|
|
10
|
+
start_at: string;
|
|
11
|
+
end_at: string;
|
|
12
|
+
pax: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function collectEventsForDate(resource: VenueResourceRawData, date: string, config: VenueBookingSlotConfig): SlotEvent[];
|
|
15
|
+
export declare function computeSlotStatus(params: {
|
|
16
|
+
slotStart: dayjs.Dayjs;
|
|
17
|
+
slotEnd: dayjs.Dayjs;
|
|
18
|
+
events: SlotEvent[];
|
|
19
|
+
resourceType: 'single' | 'multiple' | 'capacity';
|
|
20
|
+
capacity: number;
|
|
21
|
+
}): {
|
|
22
|
+
status: 'available' | 'occupied' | 'partially_occupied';
|
|
23
|
+
remainingCapacity: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function buildTimeSlotGrid(params: {
|
|
26
|
+
date: string;
|
|
27
|
+
config: VenueBookingSlotConfig;
|
|
28
|
+
rawResources: VenueResourceRawData[];
|
|
29
|
+
resourceProductMap: Map<number | string, ResourceProductMapping>;
|
|
30
|
+
quotationPriceMap?: Map<string, string | null>;
|
|
31
|
+
}): VenueTimeSlotGrid;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
6
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
7
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
8
|
+
import dayjs from 'dayjs';
|
|
9
|
+
export function isBusinessHoursCrossDay(config) {
|
|
10
|
+
var _config$businessStart = config.businessStartTime.split(':').map(Number),
|
|
11
|
+
_config$businessStart2 = _slicedToArray(_config$businessStart, 2),
|
|
12
|
+
startH = _config$businessStart2[0],
|
|
13
|
+
startM = _config$businessStart2[1];
|
|
14
|
+
var _config$businessEndTi = config.businessEndTime.split(':').map(Number),
|
|
15
|
+
_config$businessEndTi2 = _slicedToArray(_config$businessEndTi, 2),
|
|
16
|
+
endH = _config$businessEndTi2[0],
|
|
17
|
+
endM = _config$businessEndTi2[1];
|
|
18
|
+
return endH < startH || endH === startH && endM <= startM;
|
|
19
|
+
}
|
|
20
|
+
export function generateTimeLabels(config) {
|
|
21
|
+
var slotDurationMinutes = config.slotDurationMinutes,
|
|
22
|
+
businessStartTime = config.businessStartTime,
|
|
23
|
+
businessEndTime = config.businessEndTime;
|
|
24
|
+
var labels = [];
|
|
25
|
+
var baseDate = '2000-01-01';
|
|
26
|
+
var cursor = dayjs("".concat(baseDate, " ").concat(businessStartTime));
|
|
27
|
+
var crossDay = isBusinessHoursCrossDay(config);
|
|
28
|
+
var endBase = crossDay ? '2000-01-02' : baseDate;
|
|
29
|
+
var end = dayjs("".concat(endBase, " ").concat(businessEndTime));
|
|
30
|
+
while (cursor.isBefore(end)) {
|
|
31
|
+
labels.push(cursor.format('HH:mm'));
|
|
32
|
+
cursor = cursor.add(slotDurationMinutes, 'minute');
|
|
33
|
+
}
|
|
34
|
+
return labels;
|
|
35
|
+
}
|
|
36
|
+
export function isSlotOccupied(slotStart, slotEnd, occupiedTimes) {
|
|
37
|
+
var _iterator = _createForOfIteratorHelper(occupiedTimes),
|
|
38
|
+
_step;
|
|
39
|
+
try {
|
|
40
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
41
|
+
var occupied = _step.value;
|
|
42
|
+
var occStart = dayjs(occupied.start_at);
|
|
43
|
+
var occEnd = dayjs(occupied.end_at);
|
|
44
|
+
if (slotStart.isBefore(occEnd) && slotEnd.isAfter(occStart)) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
} catch (err) {
|
|
49
|
+
_iterator.e(err);
|
|
50
|
+
} finally {
|
|
51
|
+
_iterator.f();
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
function isSlotWithinResourceTimes(slotStart, slotEnd, resourceTimes) {
|
|
56
|
+
var _iterator2 = _createForOfIteratorHelper(resourceTimes),
|
|
57
|
+
_step2;
|
|
58
|
+
try {
|
|
59
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
60
|
+
var t = _step2.value;
|
|
61
|
+
var tStart = dayjs(t.start_at);
|
|
62
|
+
var tEnd = dayjs(t.end_at);
|
|
63
|
+
if (slotStart.isBefore(tEnd) && slotEnd.isAfter(tStart)) return true;
|
|
64
|
+
}
|
|
65
|
+
} catch (err) {
|
|
66
|
+
_iterator2.e(err);
|
|
67
|
+
} finally {
|
|
68
|
+
_iterator2.f();
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
function getResourceTimesForDate(resource, date, config) {
|
|
73
|
+
var crossDay = isBusinessHoursCrossDay(config);
|
|
74
|
+
var dayStart = dayjs("".concat(date, " ").concat(config.businessStartTime));
|
|
75
|
+
var dayEnd = crossDay ? dayjs("".concat(date, " ").concat(config.businessEndTime)).add(1, 'day') : dayjs("".concat(date, " ").concat(config.businessEndTime));
|
|
76
|
+
return resource.times.filter(function (t) {
|
|
77
|
+
var tStart = dayjs(t.start_at);
|
|
78
|
+
var tEnd = dayjs(t.end_at);
|
|
79
|
+
return tStart.isBefore(dayEnd) && tEnd.isAfter(dayStart);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export function collectEventsForDate(resource, date, config) {
|
|
83
|
+
var timesForDate = getResourceTimesForDate(resource, date, config);
|
|
84
|
+
var events = [];
|
|
85
|
+
var _iterator3 = _createForOfIteratorHelper(timesForDate),
|
|
86
|
+
_step3;
|
|
87
|
+
try {
|
|
88
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
89
|
+
var t = _step3.value;
|
|
90
|
+
if (Array.isArray(t.event_list)) {
|
|
91
|
+
var _iterator4 = _createForOfIteratorHelper(t.event_list),
|
|
92
|
+
_step4;
|
|
93
|
+
try {
|
|
94
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
95
|
+
var _evt$pax;
|
|
96
|
+
var evt = _step4.value;
|
|
97
|
+
events.push({
|
|
98
|
+
start_at: evt.start_at,
|
|
99
|
+
end_at: evt.end_at,
|
|
100
|
+
pax: (_evt$pax = evt.pax) !== null && _evt$pax !== void 0 ? _evt$pax : 1
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
} catch (err) {
|
|
104
|
+
_iterator4.e(err);
|
|
105
|
+
} finally {
|
|
106
|
+
_iterator4.f();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
_iterator3.e(err);
|
|
112
|
+
} finally {
|
|
113
|
+
_iterator3.f();
|
|
114
|
+
}
|
|
115
|
+
return events;
|
|
116
|
+
}
|
|
117
|
+
export function computeSlotStatus(params) {
|
|
118
|
+
var slotStart = params.slotStart,
|
|
119
|
+
slotEnd = params.slotEnd,
|
|
120
|
+
events = params.events,
|
|
121
|
+
resourceType = params.resourceType,
|
|
122
|
+
capacity = params.capacity;
|
|
123
|
+
var overlapping = events.filter(function (evt) {
|
|
124
|
+
var evtStart = dayjs(evt.start_at);
|
|
125
|
+
var evtEnd = dayjs(evt.end_at);
|
|
126
|
+
return slotStart.isBefore(evtEnd) && slotEnd.isAfter(evtStart);
|
|
127
|
+
});
|
|
128
|
+
if (resourceType === 'single') {
|
|
129
|
+
if (overlapping.length > 0) return {
|
|
130
|
+
status: 'occupied',
|
|
131
|
+
remainingCapacity: 0
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
status: 'available',
|
|
135
|
+
remainingCapacity: 1
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
var usedCapacity = overlapping.reduce(function (sum, evt) {
|
|
139
|
+
return sum + evt.pax;
|
|
140
|
+
}, 0);
|
|
141
|
+
var remaining = Math.max(0, capacity - usedCapacity);
|
|
142
|
+
if (remaining <= 0) return {
|
|
143
|
+
status: 'occupied',
|
|
144
|
+
remainingCapacity: 0
|
|
145
|
+
};
|
|
146
|
+
if (remaining < capacity) return {
|
|
147
|
+
status: 'partially_occupied',
|
|
148
|
+
remainingCapacity: remaining
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
status: 'available',
|
|
152
|
+
remainingCapacity: remaining
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function buildTimeSlotGrid(params) {
|
|
156
|
+
var date = params.date,
|
|
157
|
+
config = params.config,
|
|
158
|
+
rawResources = params.rawResources,
|
|
159
|
+
resourceProductMap = params.resourceProductMap,
|
|
160
|
+
quotationPriceMap = params.quotationPriceMap;
|
|
161
|
+
var timeLabels = generateTimeLabels(config);
|
|
162
|
+
var now = dayjs();
|
|
163
|
+
var crossDay = isBusinessHoursCrossDay(config);
|
|
164
|
+
var resources = [];
|
|
165
|
+
var _iterator5 = _createForOfIteratorHelper(rawResources),
|
|
166
|
+
_step5;
|
|
167
|
+
try {
|
|
168
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
169
|
+
var _resource$capacity;
|
|
170
|
+
var resource = _step5.value;
|
|
171
|
+
var mapping = resourceProductMap.get(resource.resourceId);
|
|
172
|
+
if (!mapping) continue;
|
|
173
|
+
var timesForDate = getResourceTimesForDate(resource, date, config);
|
|
174
|
+
var events = collectEventsForDate(resource, date, config);
|
|
175
|
+
var resCapacity = (_resource$capacity = resource.capacity) !== null && _resource$capacity !== void 0 ? _resource$capacity : 1;
|
|
176
|
+
var slots = [];
|
|
177
|
+
var _iterator6 = _createForOfIteratorHelper(timeLabels),
|
|
178
|
+
_step6;
|
|
179
|
+
try {
|
|
180
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
181
|
+
var _quotationPriceMap$ge;
|
|
182
|
+
var label = _step6.value;
|
|
183
|
+
var _label$split$map = label.split(':').map(Number),
|
|
184
|
+
_label$split$map2 = _slicedToArray(_label$split$map, 2),
|
|
185
|
+
h = _label$split$map2[0],
|
|
186
|
+
m = _label$split$map2[1];
|
|
187
|
+
var isNextDay = crossDay && h < Number(config.businessStartTime.split(':')[0]);
|
|
188
|
+
var slotDate = isNextDay ? dayjs(date).add(1, 'day').format('YYYY-MM-DD') : date;
|
|
189
|
+
var slotStart = dayjs("".concat(slotDate, " ").concat(label));
|
|
190
|
+
var slotEnd = slotStart.add(config.slotDurationMinutes, 'minute');
|
|
191
|
+
var status = void 0;
|
|
192
|
+
var remainingCapacity = null;
|
|
193
|
+
if (slotStart.isBefore(now)) {
|
|
194
|
+
status = 'past';
|
|
195
|
+
} else if (!isSlotWithinResourceTimes(slotStart, slotEnd, timesForDate)) {
|
|
196
|
+
status = 'unavailable';
|
|
197
|
+
} else {
|
|
198
|
+
var result = computeSlotStatus({
|
|
199
|
+
slotStart: slotStart,
|
|
200
|
+
slotEnd: slotEnd,
|
|
201
|
+
events: events,
|
|
202
|
+
resourceType: mapping.resourceType,
|
|
203
|
+
capacity: resCapacity
|
|
204
|
+
});
|
|
205
|
+
status = result.status;
|
|
206
|
+
remainingCapacity = result.remainingCapacity;
|
|
207
|
+
}
|
|
208
|
+
var isBookable = status === 'available' || status === 'partially_occupied';
|
|
209
|
+
var slotStartStr = slotStart.format('YYYY-MM-DD HH:mm');
|
|
210
|
+
slots.push({
|
|
211
|
+
startTime: slotStartStr,
|
|
212
|
+
endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
|
|
213
|
+
status: status,
|
|
214
|
+
price: isBookable ? (_quotationPriceMap$ge = quotationPriceMap === null || quotationPriceMap === void 0 ? void 0 : quotationPriceMap.get("".concat(mapping.productId, ":").concat(slotStartStr))) !== null && _quotationPriceMap$ge !== void 0 ? _quotationPriceMap$ge : mapping.price : null,
|
|
215
|
+
resourceId: resource.resourceId,
|
|
216
|
+
resourceFormId: resource.formId,
|
|
217
|
+
capacity: status === 'past' || status === 'unavailable' ? null : resCapacity,
|
|
218
|
+
remainingCapacity: remainingCapacity
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
} catch (err) {
|
|
222
|
+
_iterator6.e(err);
|
|
223
|
+
} finally {
|
|
224
|
+
_iterator6.f();
|
|
225
|
+
}
|
|
226
|
+
resources.push({
|
|
227
|
+
resourceId: resource.resourceId,
|
|
228
|
+
resourceFormId: resource.formId,
|
|
229
|
+
resourceName: resource.main_field || mapping.resourceName,
|
|
230
|
+
productId: mapping.productId,
|
|
231
|
+
productTitle: mapping.productTitle,
|
|
232
|
+
slots: slots
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// 按 productId 分组排序,确保同一商品的场地连续排列
|
|
237
|
+
} catch (err) {
|
|
238
|
+
_iterator5.e(err);
|
|
239
|
+
} finally {
|
|
240
|
+
_iterator5.f();
|
|
241
|
+
}
|
|
242
|
+
var productOrder = new Map();
|
|
243
|
+
for (var _i = 0, _resources = resources; _i < _resources.length; _i++) {
|
|
244
|
+
var row = _resources[_i];
|
|
245
|
+
if (!productOrder.has(row.productId)) productOrder.set(row.productId, productOrder.size);
|
|
246
|
+
}
|
|
247
|
+
resources.sort(function (a, b) {
|
|
248
|
+
var _productOrder$get, _productOrder$get2;
|
|
249
|
+
return ((_productOrder$get = productOrder.get(a.productId)) !== null && _productOrder$get !== void 0 ? _productOrder$get : 0) - ((_productOrder$get2 = productOrder.get(b.productId)) !== null && _productOrder$get2 !== void 0 ? _productOrder$get2 : 0);
|
|
250
|
+
});
|
|
251
|
+
return {
|
|
252
|
+
date: date,
|
|
253
|
+
timeLabels: timeLabels,
|
|
254
|
+
resources: resources
|
|
255
|
+
};
|
|
256
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createEmptySummary, getSafeProductNum, toBoolean, toPositiveString, normalizeEnabledItemRuleIds, extractStrategyModelIdsFromTableConfig, normalizeItemRuleStrategies, toNonNegativeNumber, toNonNegativeInt, toPriceString, buildProductKey, getTopLevelProductId, getTopLevelVariantId, buildQuantityLimitIndex, resolveSkuMatchedQuantityLimits, aggregateItemRuleLimit, buildItemRuleBusinessData, attachItemRuleLimitsToTopLevelProducts, getProductIdentityIndex, isIdentityMatch, normalizeOrderProduct, } from '../ScanOrder/utils';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createEmptySummary, getSafeProductNum, toBoolean, toPositiveString, normalizeEnabledItemRuleIds, extractStrategyModelIdsFromTableConfig, normalizeItemRuleStrategies, toNonNegativeNumber, toNonNegativeInt, toPriceString, buildProductKey, getTopLevelProductId, getTopLevelVariantId, buildQuantityLimitIndex, resolveSkuMatchedQuantityLimits, aggregateItemRuleLimit, buildItemRuleBusinessData, attachItemRuleLimitsToTopLevelProducts, getProductIdentityIndex, isIdentityMatch, normalizeOrderProduct } from "../ScanOrder/utils";
|
package/dist/solution/index.d.ts
CHANGED
package/dist/solution/index.js
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './strategy';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/model/index.ts
|
|
17
|
+
var model_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(model_exports);
|
|
19
|
+
__reExport(model_exports, require("./strategy"), module.exports);
|
|
20
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
21
|
+
0 && (module.exports = {
|
|
22
|
+
...require("./strategy")
|
|
23
|
+
});
|