@pisell/pisellos 2.2.162 → 2.2.164
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/BookingContext/index.d.ts +37 -0
- package/dist/modules/BookingContext/index.js +436 -0
- package/dist/modules/BookingContext/types.d.ts +102 -0
- package/dist/modules/BookingContext/types.js +51 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +157 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +107 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +65 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +191 -0
- package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/dist/modules/BookingContext/utils/flexible.js +56 -0
- package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
- package/dist/modules/BookingContext/utils/index.d.ts +11 -0
- package/dist/modules/BookingContext/utils/index.js +11 -0
- package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/dist/modules/BookingContext/utils/noResource.js +77 -0
- package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/dist/modules/BookingContext/utils/productExtend.js +339 -0
- package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
- package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
- package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
- package/dist/modules/BookingContext/utils/resources.js +486 -0
- package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
- package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
- package/dist/modules/Customer/index.js +23 -22
- package/dist/modules/Discount/index.js +4 -3
- package/dist/modules/Order/index.d.ts +17 -6
- package/dist/modules/Order/index.js +474 -287
- package/dist/modules/Order/types.d.ts +32 -12
- package/dist/modules/Order/utils.js +9 -8
- package/dist/modules/SalesSummary/index.js +4 -2
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +2 -1
- package/dist/solution/BaseSales/index.d.ts +38 -7
- package/dist/solution/BaseSales/index.js +797 -310
- package/dist/solution/BaseSales/types.d.ts +48 -1
- package/dist/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/dist/solution/BaseSales/utils/quotationPrice.js +159 -0
- package/dist/solution/BookingByStep/index.d.ts +2 -2
- package/dist/solution/BookingTicket/index.d.ts +121 -1
- package/dist/solution/BookingTicket/index.js +401 -72
- package/dist/solution/BookingTicket/types.d.ts +2 -0
- package/dist/solution/BookingTicket/types.js +3 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +111 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.js +326 -0
- package/dist/solution/ScanOrder/index.d.ts +9 -3
- package/dist/solution/ScanOrder/index.js +231 -128
- package/dist/solution/VenueBooking/index.d.ts +4 -2
- package/dist/solution/VenueBooking/index.js +103 -55
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/lib/model/strategy/adapter/promotion/index.js +0 -49
- package/lib/modules/BookingContext/index.d.ts +37 -0
- package/lib/modules/BookingContext/index.js +297 -0
- package/lib/modules/BookingContext/types.d.ts +102 -0
- package/lib/modules/BookingContext/types.js +34 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +174 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +115 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +65 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +177 -0
- package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/lib/modules/BookingContext/utils/flexible.js +80 -0
- package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
- package/lib/modules/BookingContext/utils/index.d.ts +11 -0
- package/lib/modules/BookingContext/utils/index.js +43 -0
- package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/lib/modules/BookingContext/utils/noResource.js +90 -0
- package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/lib/modules/BookingContext/utils/productExtend.js +283 -0
- package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
- package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
- package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
- package/lib/modules/BookingContext/utils/resources.js +377 -0
- package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
- package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
- package/lib/modules/Customer/index.js +8 -8
- package/lib/modules/Discount/index.js +5 -1
- package/lib/modules/Order/index.d.ts +17 -6
- package/lib/modules/Order/index.js +164 -68
- package/lib/modules/Order/types.d.ts +32 -12
- package/lib/modules/Order/utils.js +8 -6
- package/lib/modules/SalesSummary/index.js +4 -2
- package/lib/modules/index.d.ts +1 -0
- package/lib/modules/index.js +3 -1
- package/lib/solution/BaseSales/index.d.ts +38 -7
- package/lib/solution/BaseSales/index.js +304 -14
- package/lib/solution/BaseSales/types.d.ts +48 -1
- package/lib/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/lib/solution/BaseSales/utils/quotationPrice.js +201 -0
- package/lib/solution/BookingByStep/index.d.ts +2 -2
- package/lib/solution/BookingTicket/index.d.ts +121 -1
- package/lib/solution/BookingTicket/index.js +207 -2
- package/lib/solution/BookingTicket/types.d.ts +2 -0
- package/lib/solution/BookingTicket/types.js +6 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +111 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.js +300 -0
- package/lib/solution/ScanOrder/index.d.ts +9 -3
- package/lib/solution/ScanOrder/index.js +147 -66
- package/lib/solution/VenueBooking/index.d.ts +4 -2
- package/lib/solution/VenueBooking/index.js +50 -14
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/package.json +1 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Dayjs } from 'dayjs';
|
|
2
|
+
import { getDurationValue } from './flexible';
|
|
3
|
+
/**
|
|
4
|
+
* 判断商品是否为跨日预约(duration.type === 'days')。与 info2 isMultiDayProduct 等价。
|
|
5
|
+
*/
|
|
6
|
+
export declare function isMultiDayProduct(product: any): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* 判断 cacheItem 是否为 session 商品(extension_type ∈ session_product / session_ticket)。
|
|
9
|
+
*/
|
|
10
|
+
export declare function isSessionProduct(cacheItem: any): boolean;
|
|
11
|
+
/** 从 catalog `cartDetailValue` 或 `_extend.other` 取 session 快照。 */
|
|
12
|
+
export declare function getSessionFromItem(item: any): Record<string, any> | null;
|
|
13
|
+
/**
|
|
14
|
+
* 将 cartDetailValue.session 写入 _extend 的起止时间(与 info2 getServiceStartTimeAndEndTime 的 session 分支一致)。
|
|
15
|
+
* 日历日优先用 ctx.date,时分取自 session.start_at / end_at 或 session.start_time / end_time。
|
|
16
|
+
*/
|
|
17
|
+
export declare function applySessionTimesToExtend(item: any, extend: Record<string, any>, ctx?: {
|
|
18
|
+
date?: string | Dayjs | null;
|
|
19
|
+
}): Record<string, any>;
|
|
20
|
+
/**
|
|
21
|
+
* 是否应写入 booking(与 Product.utils isNormalProduct 对齐,并覆盖 session_ticket / cartDetailValue.session)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function isBookingProduct(item: any): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 处理 'now' 时间占位:'now' → 当前 HH:mm;其他原样返回。
|
|
26
|
+
* 与 info2 `getServeStartTime` 等价。
|
|
27
|
+
*/
|
|
28
|
+
export declare function getServeStartTime(startTime: string | undefined | null): string;
|
|
29
|
+
/**
|
|
30
|
+
* 计算商品的开始结束时间(统一为 dayjs 实例)。
|
|
31
|
+
* 与 info2 `getServiceTimes` 行为等价:
|
|
32
|
+
* - 跨日商品:startDate = start_date + start_time,endDate = _extend.end_date 原样
|
|
33
|
+
* - session 商品:从 _extend.other.session 取 start_at / end_at
|
|
34
|
+
* - 普通商品:startDate + duration(含 flexible 处理)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getServiceTimes(service: any): {
|
|
37
|
+
startDate: Dayjs;
|
|
38
|
+
endDate: Dayjs;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* 跨日预约相关:把 _extend.start_date / end_date 都对齐到 dayjs startOf('day')。
|
|
42
|
+
* 与 info2 `formatDayDate` 等价。
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatDayDate(_extend: any): {
|
|
45
|
+
start_date: Dayjs;
|
|
46
|
+
end_date: Dayjs;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 计算跨日预约时长:
|
|
50
|
+
* - type='days' → end - start 的天数
|
|
51
|
+
* - type='minutes' → end - start 的分钟数
|
|
52
|
+
* 与 info2 `getDays` 等价。
|
|
53
|
+
*/
|
|
54
|
+
export declare function getDays(cacheItem: any, type: 'minutes' | 'days'): number;
|
|
55
|
+
export { getDurationValue };
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
5
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
7
|
+
import dayjs from 'dayjs';
|
|
8
|
+
import { flexibleObj, getDurationValue } from "./flexible";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 判断商品是否为跨日预约(duration.type === 'days')。与 info2 isMultiDayProduct 等价。
|
|
12
|
+
*/
|
|
13
|
+
export function isMultiDayProduct(product) {
|
|
14
|
+
var _product$duration;
|
|
15
|
+
return (product === null || product === void 0 || (_product$duration = product.duration) === null || _product$duration === void 0 ? void 0 : _product$duration.type) === 'days';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 判断 cacheItem 是否为 session 商品(extension_type ∈ session_product / session_ticket)。
|
|
20
|
+
*/
|
|
21
|
+
export function isSessionProduct(cacheItem) {
|
|
22
|
+
return ['session_product', 'session_ticket'].includes(cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.extension_type);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** 从 catalog `cartDetailValue` 或 `_extend.other` 取 session 快照。 */
|
|
26
|
+
export function getSessionFromItem(item) {
|
|
27
|
+
var _item$cartDetailValue, _item$cartDetailValue2, _item$_extend;
|
|
28
|
+
var session = (_item$cartDetailValue = item === null || item === void 0 || (_item$cartDetailValue2 = item.cartDetailValue) === null || _item$cartDetailValue2 === void 0 ? void 0 : _item$cartDetailValue2.session) !== null && _item$cartDetailValue !== void 0 ? _item$cartDetailValue : item === null || item === void 0 || (_item$_extend = item._extend) === null || _item$_extend === void 0 || (_item$_extend = _item$_extend.other) === null || _item$_extend === void 0 ? void 0 : _item$_extend.session;
|
|
29
|
+
return session && _typeof(session) === 'object' ? session : null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 将 cartDetailValue.session 写入 _extend 的起止时间(与 info2 getServiceStartTimeAndEndTime 的 session 分支一致)。
|
|
34
|
+
* 日历日优先用 ctx.date,时分取自 session.start_at / end_at 或 session.start_time / end_time。
|
|
35
|
+
*/
|
|
36
|
+
export function applySessionTimesToExtend(item, extend, ctx) {
|
|
37
|
+
var _extend$other$session, _extend$other, _session$start_time, _session$end_time;
|
|
38
|
+
var session = (_extend$other$session = extend === null || extend === void 0 || (_extend$other = extend.other) === null || _extend$other === void 0 ? void 0 : _extend$other.session) !== null && _extend$other$session !== void 0 ? _extend$other$session : getSessionFromItem(item);
|
|
39
|
+
if (!session || !isSessionProduct(item)) {
|
|
40
|
+
return extend;
|
|
41
|
+
}
|
|
42
|
+
var baseDate = ctx !== null && ctx !== void 0 && ctx.date ? dayjs(ctx.date) : dayjs();
|
|
43
|
+
var startAt = dayjs("".concat(baseDate.format('YYYY-MM-DD'), " ").concat(dayjs(session.start_at).format('HH:mm:ss')));
|
|
44
|
+
var endAt = dayjs("".concat(baseDate.format('YYYY-MM-DD'), " ").concat(dayjs(session.end_at).format('HH:mm:ss')));
|
|
45
|
+
var nextExtend = _objectSpread(_objectSpread({}, extend), {}, {
|
|
46
|
+
other: _objectSpread(_objectSpread({}, extend.other || {}), {}, {
|
|
47
|
+
session: session
|
|
48
|
+
}),
|
|
49
|
+
start_date: startAt,
|
|
50
|
+
startDate: startAt,
|
|
51
|
+
start_time: (_session$start_time = session.start_time) !== null && _session$start_time !== void 0 ? _session$start_time : dayjs(session.start_at).format('HH:mm'),
|
|
52
|
+
end_date: endAt,
|
|
53
|
+
endDate: endAt,
|
|
54
|
+
end_time: (_session$end_time = session.end_time) !== null && _session$end_time !== void 0 ? _session$end_time : dayjs(session.end_at).format('HH:mm')
|
|
55
|
+
});
|
|
56
|
+
return _objectSpread(_objectSpread({}, nextExtend), {}, {
|
|
57
|
+
duration: getDays({
|
|
58
|
+
_extend: nextExtend
|
|
59
|
+
}, 'minutes')
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 是否应写入 booking(与 Product.utils isNormalProduct 对齐,并覆盖 session_ticket / cartDetailValue.session)。
|
|
65
|
+
*/
|
|
66
|
+
export function isBookingProduct(item) {
|
|
67
|
+
var _item$schedules, _item$scheduleIds;
|
|
68
|
+
if (!item) return false;
|
|
69
|
+
if (item.duration) return true;
|
|
70
|
+
if (item !== null && item !== void 0 && (_item$schedules = item.schedules) !== null && _item$schedules !== void 0 && _item$schedules.length) return true;
|
|
71
|
+
if (item !== null && item !== void 0 && (_item$scheduleIds = item['schedule.ids']) !== null && _item$scheduleIds !== void 0 && _item$scheduleIds.length) return true;
|
|
72
|
+
if (isSessionProduct(item)) return true;
|
|
73
|
+
if (getSessionFromItem(item)) return true;
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 处理 'now' 时间占位:'now' → 当前 HH:mm;其他原样返回。
|
|
79
|
+
* 与 info2 `getServeStartTime` 等价。
|
|
80
|
+
*/
|
|
81
|
+
export function getServeStartTime(startTime) {
|
|
82
|
+
if (startTime === 'now') return dayjs().format('HH:mm');
|
|
83
|
+
return startTime || '';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 计算商品的开始结束时间(统一为 dayjs 实例)。
|
|
88
|
+
* 与 info2 `getServiceTimes` 行为等价:
|
|
89
|
+
* - 跨日商品:startDate = start_date + start_time,endDate = _extend.end_date 原样
|
|
90
|
+
* - session 商品:从 _extend.other.session 取 start_at / end_at
|
|
91
|
+
* - 普通商品:startDate + duration(含 flexible 处理)
|
|
92
|
+
*/
|
|
93
|
+
export function getServiceTimes(service) {
|
|
94
|
+
var _service$_extend, _service$_extend2, _service$_extend6, _service$_extend7;
|
|
95
|
+
var startDate = dayjs("".concat(dayjs(service === null || service === void 0 || (_service$_extend = service._extend) === null || _service$_extend === void 0 ? void 0 : _service$_extend.start_date).format('YYYY-MM-DD'), " ").concat(getServeStartTime(service === null || service === void 0 || (_service$_extend2 = service._extend) === null || _service$_extend2 === void 0 ? void 0 : _service$_extend2.start_time)));
|
|
96
|
+
if (isMultiDayProduct(service)) {
|
|
97
|
+
var _service$_extend3, _service$_extend$end_, _service$_extend4, _service$_extend5;
|
|
98
|
+
var startTime = getServeStartTime(service === null || service === void 0 || (_service$_extend3 = service._extend) === null || _service$_extend3 === void 0 ? void 0 : _service$_extend3.start_time);
|
|
99
|
+
var endDateRaw = (_service$_extend$end_ = service === null || service === void 0 || (_service$_extend4 = service._extend) === null || _service$_extend4 === void 0 ? void 0 : _service$_extend4.end_date) !== null && _service$_extend$end_ !== void 0 ? _service$_extend$end_ : service === null || service === void 0 || (_service$_extend5 = service._extend) === null || _service$_extend5 === void 0 ? void 0 : _service$_extend5.endDate;
|
|
100
|
+
var endBase = dayjs(endDateRaw);
|
|
101
|
+
// 跨日结束日保留与开始相同的时刻(如 11:24),避免 end_date 仅日期时被解析为 00:00
|
|
102
|
+
var _endDate = endBase.isValid() ? dayjs("".concat(endBase.format('YYYY-MM-DD'), " ").concat(startTime)) : endBase;
|
|
103
|
+
return {
|
|
104
|
+
startDate: startDate,
|
|
105
|
+
endDate: _endDate
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
var session = service === null || service === void 0 || (_service$_extend6 = service._extend) === null || _service$_extend6 === void 0 || (_service$_extend6 = _service$_extend6.other) === null || _service$_extend6 === void 0 ? void 0 : _service$_extend6.session;
|
|
109
|
+
if (isSessionProduct(service) && session) {
|
|
110
|
+
return {
|
|
111
|
+
startDate: dayjs(session.start_at),
|
|
112
|
+
endDate: dayjs(session.end_at)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
var endDate = startDate.add(flexibleObj.getValue(service === null || service === void 0 || (_service$_extend7 = service._extend) === null || _service$_extend7 === void 0 ? void 0 : _service$_extend7.duration), 'minute');
|
|
116
|
+
return {
|
|
117
|
+
startDate: startDate,
|
|
118
|
+
endDate: endDate
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 跨日预约相关:把 _extend.start_date / end_date 都对齐到 dayjs startOf('day')。
|
|
124
|
+
* 与 info2 `formatDayDate` 等价。
|
|
125
|
+
*/
|
|
126
|
+
export function formatDayDate(_extend) {
|
|
127
|
+
return {
|
|
128
|
+
start_date: dayjs(_extend === null || _extend === void 0 ? void 0 : _extend.start_date).startOf('day'),
|
|
129
|
+
end_date: dayjs(_extend === null || _extend === void 0 ? void 0 : _extend.end_date).startOf('day')
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 计算跨日预约时长:
|
|
135
|
+
* - type='days' → end - start 的天数
|
|
136
|
+
* - type='minutes' → end - start 的分钟数
|
|
137
|
+
* 与 info2 `getDays` 等价。
|
|
138
|
+
*/
|
|
139
|
+
export function getDays(cacheItem, type) {
|
|
140
|
+
var _cacheItem$_extend, _cacheItem$_extend2;
|
|
141
|
+
if (type === 'days') {
|
|
142
|
+
var _formatDayDate = formatDayDate(cacheItem._extend),
|
|
143
|
+
start_date = _formatDayDate.start_date,
|
|
144
|
+
end_date = _formatDayDate.end_date;
|
|
145
|
+
return end_date.diff(start_date, 'day');
|
|
146
|
+
}
|
|
147
|
+
var startDate = dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend = cacheItem._extend) === null || _cacheItem$_extend === void 0 ? void 0 : _cacheItem$_extend.start_date);
|
|
148
|
+
var endDate = dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend2 = cacheItem._extend) === null || _cacheItem$_extend2 === void 0 ? void 0 : _cacheItem$_extend2.end_date);
|
|
149
|
+
return endDate.diff(startDate, type);
|
|
150
|
+
}
|
|
151
|
+
export { getDurationValue };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { getDurationValue } from './flexible';
|
|
3
|
+
export interface TimeSlice {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DurationSlice {
|
|
8
|
+
label: string;
|
|
9
|
+
value: number;
|
|
10
|
+
}
|
|
11
|
+
export interface TimeSlicesResult {
|
|
12
|
+
timeSlices: TimeSlice[];
|
|
13
|
+
durationSlicesBasedOnTime: DurationSlice[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 把一天切成等长时间槽,输出 timeSlices(开始时间标签)与 durationSlicesBasedOnTime(基于切片的时长选项)。
|
|
17
|
+
*
|
|
18
|
+
* 与 info2 `sliceDayIntoFiveMinutes` 行为等价;为了不依赖 `locales`,label 输出原始时间字符串('08:00 AM' / '90'),
|
|
19
|
+
* UI 侧需要本地化展示时可基于 value 自行包装。
|
|
20
|
+
*
|
|
21
|
+
* @param config booking config `basic.service_time`,{ value: minutes }
|
|
22
|
+
* @param isDay 是否跨日预约(true 时按 1~30 天切片)
|
|
23
|
+
*/
|
|
24
|
+
export declare function sliceDayIntoFiveMinutes(config: {
|
|
25
|
+
value?: number;
|
|
26
|
+
} | undefined | null, isDay?: boolean): TimeSlicesResult;
|
|
27
|
+
/**
|
|
28
|
+
* 取「下一个 duration 选项」:优先用 defaultValue;否则在 array 中找匹配的;找不到取第一个。
|
|
29
|
+
* 与 info2 `findNextDuration` 等价。
|
|
30
|
+
*/
|
|
31
|
+
export declare function findNextDuration(current: {
|
|
32
|
+
value?: number;
|
|
33
|
+
} | undefined, array: DurationSlice[], defaultValue?: number): number | undefined;
|
|
34
|
+
/** 取首选 time slice:若指定 date(HH:mm)则找第一个 >= date 的;否则第一个。 */
|
|
35
|
+
export declare function findNextSlice(params: {
|
|
36
|
+
timeSlices: TimeSlice[];
|
|
37
|
+
index?: number;
|
|
38
|
+
date?: string;
|
|
39
|
+
}): string | undefined;
|
|
40
|
+
/** 取 endDate;duration='flexible' 时取 endDate 与店铺营业时间的较小值,否则 startDate + duration 分钟。 */
|
|
41
|
+
export declare function getEndDate(startDate: dayjs.Dayjs, duration: string | number, endDate: any, shopOpeningHours?: string): dayjs.Dayjs;
|
|
42
|
+
export { getDurationValue };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { getDurationValue } from "./flexible";
|
|
3
|
+
/**
|
|
4
|
+
* 把一天切成等长时间槽,输出 timeSlices(开始时间标签)与 durationSlicesBasedOnTime(基于切片的时长选项)。
|
|
5
|
+
*
|
|
6
|
+
* 与 info2 `sliceDayIntoFiveMinutes` 行为等价;为了不依赖 `locales`,label 输出原始时间字符串('08:00 AM' / '90'),
|
|
7
|
+
* UI 侧需要本地化展示时可基于 value 自行包装。
|
|
8
|
+
*
|
|
9
|
+
* @param config booking config `basic.service_time`,{ value: minutes }
|
|
10
|
+
* @param isDay 是否跨日预约(true 时按 1~30 天切片)
|
|
11
|
+
*/
|
|
12
|
+
export function sliceDayIntoFiveMinutes(config, isDay) {
|
|
13
|
+
var startTime = dayjs().startOf('day');
|
|
14
|
+
var endTime = dayjs().endOf('day');
|
|
15
|
+
var timeSlice = config && config.value || 5;
|
|
16
|
+
var timeSlices = [];
|
|
17
|
+
var durationSlicesBasedOnTime = [];
|
|
18
|
+
var currentTime = startTime;
|
|
19
|
+
if (isDay) {
|
|
20
|
+
var currentDay = 1;
|
|
21
|
+
while (currentDay <= 30) {
|
|
22
|
+
timeSlices.push({
|
|
23
|
+
label: currentTime.format('hh:mm A'),
|
|
24
|
+
value: currentTime.format('HH:mm')
|
|
25
|
+
});
|
|
26
|
+
durationSlicesBasedOnTime.push({
|
|
27
|
+
label: String(currentDay),
|
|
28
|
+
value: currentDay
|
|
29
|
+
});
|
|
30
|
+
currentDay += 1;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
timeSlices: timeSlices,
|
|
34
|
+
durationSlicesBasedOnTime: durationSlicesBasedOnTime
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
while (currentTime.isBefore(endTime)) {
|
|
38
|
+
timeSlices.push({
|
|
39
|
+
label: currentTime.format('hh:mm A'),
|
|
40
|
+
value: currentTime.format('HH:mm')
|
|
41
|
+
});
|
|
42
|
+
var nextTime = currentTime.add(timeSlice, 'minute');
|
|
43
|
+
var durationValue = nextTime.diff(startTime, 'minute');
|
|
44
|
+
durationSlicesBasedOnTime.push({
|
|
45
|
+
label: String(durationValue),
|
|
46
|
+
value: durationValue
|
|
47
|
+
});
|
|
48
|
+
currentTime = nextTime;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
timeSlices: timeSlices,
|
|
52
|
+
durationSlicesBasedOnTime: durationSlicesBasedOnTime
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 取「下一个 duration 选项」:优先用 defaultValue;否则在 array 中找匹配的;找不到取第一个。
|
|
58
|
+
* 与 info2 `findNextDuration` 等价。
|
|
59
|
+
*/
|
|
60
|
+
export function findNextDuration(current, array, defaultValue) {
|
|
61
|
+
if (defaultValue !== undefined && defaultValue !== null) return defaultValue;
|
|
62
|
+
if (!array || array.length === 0) return undefined;
|
|
63
|
+
for (var i = 0; i < array.length; i += 1) {
|
|
64
|
+
if (array[i].value === (current === null || current === void 0 ? void 0 : current.value)) return array[i].value;
|
|
65
|
+
}
|
|
66
|
+
return array[0].value;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** 取首选 time slice:若指定 date(HH:mm)则找第一个 >= date 的;否则第一个。 */
|
|
70
|
+
export function findNextSlice(params) {
|
|
71
|
+
var _timeSlices$index;
|
|
72
|
+
var timeSlices = params.timeSlices,
|
|
73
|
+
_params$index = params.index,
|
|
74
|
+
index = _params$index === void 0 ? 0 : _params$index,
|
|
75
|
+
_params$date = params.date,
|
|
76
|
+
date = _params$date === void 0 ? '' : _params$date;
|
|
77
|
+
var currentTimeValue = date || dayjs().format('HH:mm');
|
|
78
|
+
for (var i = 0; i < timeSlices.length; i += 1) {
|
|
79
|
+
if (timeSlices[i].value !== 'now' && timeSlices[i].value >= currentTimeValue) {
|
|
80
|
+
return timeSlices[i].value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return (_timeSlices$index = timeSlices[index]) === null || _timeSlices$index === void 0 ? void 0 : _timeSlices$index.value;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** 取 endDate;duration='flexible' 时取 endDate 与店铺营业时间的较小值,否则 startDate + duration 分钟。 */
|
|
87
|
+
export function getEndDate(startDate, duration, endDate, shopOpeningHours) {
|
|
88
|
+
if (duration === 'flexible') {
|
|
89
|
+
var openingDate = dayjs("".concat(startDate.format('YYYY-MM-DD'), " ").concat(shopOpeningHours || '23:59'));
|
|
90
|
+
if (dayjs(startDate).isAfter(openingDate)) {
|
|
91
|
+
openingDate = openingDate.add(1, 'day');
|
|
92
|
+
}
|
|
93
|
+
if (!endDate) return openingDate;
|
|
94
|
+
var endDateObj = dayjs(endDate);
|
|
95
|
+
if (endDateObj.isAfter(openingDate)) return openingDate;
|
|
96
|
+
return endDateObj;
|
|
97
|
+
}
|
|
98
|
+
return startDate.add(Number(duration), 'minute');
|
|
99
|
+
}
|
|
100
|
+
export { getDurationValue };
|
|
@@ -286,9 +286,7 @@ export var CustomerModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
286
286
|
|
|
287
287
|
// 设置客户列表(替换模式)
|
|
288
288
|
this.store.customerList = cloneDeep(customerList);
|
|
289
|
-
|
|
290
|
-
return this.core.effects.emit("".concat(this.name, ":onCustomerListUpdate"), this.store);
|
|
291
|
-
case 20:
|
|
289
|
+
|
|
292
290
|
// 触发分页变化事件
|
|
293
291
|
this.triggerPaginationChange({
|
|
294
292
|
page: page,
|
|
@@ -303,23 +301,26 @@ export var CustomerModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
303
301
|
pageSize: pageSize
|
|
304
302
|
};
|
|
305
303
|
return _context4.abrupt("return", response);
|
|
306
|
-
case
|
|
307
|
-
_context4.prev =
|
|
304
|
+
case 23:
|
|
305
|
+
_context4.prev = 23;
|
|
308
306
|
_context4.t0 = _context4["catch"](1);
|
|
309
|
-
_context4.next =
|
|
307
|
+
_context4.next = 27;
|
|
310
308
|
return this.handleCustomerListError(_context4.t0, 'fetch customer list');
|
|
311
|
-
case
|
|
309
|
+
case 27:
|
|
312
310
|
throw _context4.t0;
|
|
313
|
-
case
|
|
314
|
-
_context4.prev =
|
|
311
|
+
case 28:
|
|
312
|
+
_context4.prev = 28;
|
|
315
313
|
this.store.loading = false;
|
|
316
314
|
this.storeChange();
|
|
317
|
-
|
|
315
|
+
_context4.next = 33;
|
|
316
|
+
return this.core.effects.emit("".concat(this.name, ":onCustomerListUpdate"), this.store);
|
|
317
|
+
case 33:
|
|
318
|
+
return _context4.finish(28);
|
|
318
319
|
case 34:
|
|
319
320
|
case "end":
|
|
320
321
|
return _context4.stop();
|
|
321
322
|
}
|
|
322
|
-
}, _callee4, this, [[1,
|
|
323
|
+
}, _callee4, this, [[1, 23, 28, 34]]);
|
|
323
324
|
}));
|
|
324
325
|
function getCustomerList() {
|
|
325
326
|
return _getCustomerList.apply(this, arguments);
|
|
@@ -580,9 +581,6 @@ export var CustomerModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
580
581
|
hasMore: this.store.hasMore
|
|
581
582
|
});
|
|
582
583
|
case 20:
|
|
583
|
-
_context6.next = 22;
|
|
584
|
-
return this.core.effects.emit("".concat(this.name, ":onCustomerListUpdate"), this.store);
|
|
585
|
-
case 22:
|
|
586
584
|
// 触发分页变化事件
|
|
587
585
|
this.triggerPaginationChange({
|
|
588
586
|
page: page,
|
|
@@ -598,23 +596,26 @@ export var CustomerModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
598
596
|
pageSize: pageSize
|
|
599
597
|
};
|
|
600
598
|
return _context6.abrupt("return", response);
|
|
601
|
-
case
|
|
602
|
-
_context6.prev =
|
|
599
|
+
case 25:
|
|
600
|
+
_context6.prev = 25;
|
|
603
601
|
_context6.t0 = _context6["catch"](3);
|
|
604
|
-
_context6.next =
|
|
602
|
+
_context6.next = 29;
|
|
605
603
|
return this.handleCustomerListError(_context6.t0, 'load more customers');
|
|
606
|
-
case
|
|
604
|
+
case 29:
|
|
607
605
|
throw _context6.t0;
|
|
608
|
-
case
|
|
609
|
-
_context6.prev =
|
|
606
|
+
case 30:
|
|
607
|
+
_context6.prev = 30;
|
|
610
608
|
this.store.loadingMore = false;
|
|
611
609
|
this.storeChange();
|
|
612
|
-
|
|
610
|
+
_context6.next = 35;
|
|
611
|
+
return this.core.effects.emit("".concat(this.name, ":onCustomerListUpdate"), this.store);
|
|
612
|
+
case 35:
|
|
613
|
+
return _context6.finish(30);
|
|
613
614
|
case 36:
|
|
614
615
|
case "end":
|
|
615
616
|
return _context6.stop();
|
|
616
617
|
}
|
|
617
|
-
}, _callee6, this, [[3,
|
|
618
|
+
}, _callee6, this, [[3, 25, 30, 36]]);
|
|
618
619
|
}));
|
|
619
620
|
function loadMoreCustomers() {
|
|
620
621
|
return _loadMoreCustomers.apply(this, arguments);
|
|
@@ -154,7 +154,7 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
154
154
|
value: function () {
|
|
155
155
|
var _loadPrepareConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(params) {
|
|
156
156
|
var _prepareConfig$data, _prepareConfig$data2;
|
|
157
|
-
var prepareConfig, goodPassList;
|
|
157
|
+
var prepareConfig, rawDiscountList, goodPassList;
|
|
158
158
|
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
159
159
|
while (1) switch (_context4.prev = _context4.next) {
|
|
160
160
|
case 0:
|
|
@@ -162,9 +162,10 @@ export var DiscountModule = /*#__PURE__*/function (_BaseModule) {
|
|
|
162
162
|
return this.request.post("/order/prepare/config", params);
|
|
163
163
|
case 2:
|
|
164
164
|
prepareConfig = _context4.sent;
|
|
165
|
-
|
|
165
|
+
rawDiscountList = [].concat(_toConsumableArray((prepareConfig === null || prepareConfig === void 0 || (_prepareConfig$data = prepareConfig.data) === null || _prepareConfig$data === void 0 ? void 0 : _prepareConfig$data.good_pass_list) || []), _toConsumableArray((prepareConfig === null || prepareConfig === void 0 || (_prepareConfig$data2 = prepareConfig.data) === null || _prepareConfig$data2 === void 0 ? void 0 : _prepareConfig$data2.discount_card_list) || []));
|
|
166
|
+
goodPassList = this.filterEnabledDiscountList(rawDiscountList) || []; // this.setDiscountList(goodPassList);
|
|
166
167
|
return _context4.abrupt("return", goodPassList);
|
|
167
|
-
case
|
|
168
|
+
case 6:
|
|
168
169
|
case "end":
|
|
169
170
|
return _context4.stop();
|
|
170
171
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Module, PisellCore, ModuleOptions } from '../../types';
|
|
2
2
|
import { BaseModule } from '../BaseModule';
|
|
3
|
-
import { OrderModuleAPI, CommitOrderParams,
|
|
3
|
+
import { OrderModuleAPI, CommitOrderParams, UpdateOrderBookingParams, UpdateOrderProductParams, CheckoutOrderParams, CancelOrderParams, ChangeBookingStatusParams } from './types';
|
|
4
4
|
import { CartItem } from '../Cart/types';
|
|
5
5
|
import { type SubmitPayloadEnhancer } from './utils';
|
|
6
|
-
import type { OrderAmountSnapshot, AddProductBookingInput, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView } from './types';
|
|
6
|
+
import type { OrderAmountSnapshot, AddProductBookingInput, OrderIdentitySnapshot, OrderPaymentSource, OrderSnapshot, OrderSyncState, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, SubmitSalesOrderParams, OrderProduct, OrderProductIdentity, OrderSummary, OrderTempOrder, OrderPaymentData, SendCustomerPayLinkParams, UpdateTempOrderCustomerInput, OrderCustomerPatch, OrderCustomerView, ReplaceTempOrderOptions } from './types';
|
|
7
7
|
import type { ICustomer } from '../AccountList/types';
|
|
8
8
|
import type { Discount } from '../Discount/types';
|
|
9
9
|
import { UnavailableReason } from '../Rules/types';
|
|
@@ -43,8 +43,10 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
43
43
|
private createDefaultRulesHooks;
|
|
44
44
|
loadDiscountConfig(params: {
|
|
45
45
|
customerId: number;
|
|
46
|
-
action?: 'create';
|
|
47
|
-
|
|
46
|
+
action?: 'create' | 'edit';
|
|
47
|
+
orderId?: number;
|
|
48
|
+
apply?: boolean;
|
|
49
|
+
}): Promise<Discount[]>;
|
|
48
50
|
getDiscountList(): Discount[];
|
|
49
51
|
scanCode(code: string, customerId?: number): Promise<{
|
|
50
52
|
isAvailable: boolean;
|
|
@@ -79,6 +81,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
79
81
|
ensureTempOrder(): OrderTempOrder;
|
|
80
82
|
restoreOrder(): OrderTempOrder;
|
|
81
83
|
getTempOrder(): OrderTempOrder | null;
|
|
84
|
+
replaceTempOrder(tempOrder: OrderTempOrder, options?: ReplaceTempOrderOptions): Promise<OrderTempOrder>;
|
|
82
85
|
getOrderIdentity(): OrderIdentitySnapshot | null;
|
|
83
86
|
getOrderSyncState(): OrderSyncState;
|
|
84
87
|
getOrderAmountSnapshot(): OrderAmountSnapshot | null;
|
|
@@ -89,12 +92,18 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
89
92
|
private ensureExtend;
|
|
90
93
|
private captureProductRuntime;
|
|
91
94
|
private createLinkedProductAndBooking;
|
|
95
|
+
private getBookingUniqueIdentificationNumber;
|
|
96
|
+
private findBookingIndexByUniqueIdentificationNumber;
|
|
97
|
+
private removeLinkedBookingsForProduct;
|
|
92
98
|
private getSalesSummary;
|
|
93
99
|
recalculateSummary(options?: {
|
|
94
100
|
createIfMissing?: boolean;
|
|
95
101
|
}): Promise<OrderSummary | null>;
|
|
96
102
|
getOrderSummary(): Promise<OrderSummary>;
|
|
97
103
|
updateTempOrderNote(note: string): string;
|
|
104
|
+
updateTempOrderNote(note: string, sync: true): Promise<string>;
|
|
105
|
+
updateTempOrderNote(note: string, sync: boolean): string | Promise<string>;
|
|
106
|
+
private syncTempOrderNoteToRemote;
|
|
98
107
|
getTempOrderNote(): string;
|
|
99
108
|
updateTempOrderShopDiscount(amount: string | number): string;
|
|
100
109
|
updateTempOrderBuzzer(buzzer: string): string;
|
|
@@ -147,7 +156,8 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
147
156
|
private shouldMergeProductToOrder;
|
|
148
157
|
addProductToOrder(product: Partial<OrderProduct> & OrderProductIdentity, booking?: AddProductBookingInput): Promise<OrderProduct[]>;
|
|
149
158
|
private hasGoodPassDiscount;
|
|
150
|
-
|
|
159
|
+
updateOrderProduct(params: UpdateOrderProductParams): Promise<OrderProduct[]>;
|
|
160
|
+
updateOrderBooking(params: UpdateOrderBookingParams): any[];
|
|
151
161
|
removeProductFromOrder(identity: OrderProductIdentity): Promise<OrderProduct[]>;
|
|
152
162
|
/**
|
|
153
163
|
* 提交当前 Sales tempOrder。
|
|
@@ -220,8 +230,9 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
|
|
|
220
230
|
hydrateTempOrderFromRecord(record: Record<string, any>, options?: {
|
|
221
231
|
recalcOnHydrate?: boolean;
|
|
222
232
|
}): Promise<OrderTempOrder>;
|
|
233
|
+
private normalizeTempOrderForRuntime;
|
|
223
234
|
private normalizeHydratedOrderProduct;
|
|
224
235
|
getLastOrderInfo(): Record<string, any> | undefined;
|
|
225
236
|
getOrderInfo(order_id: number): Promise<any>;
|
|
226
237
|
}
|
|
227
|
-
export type {
|
|
238
|
+
export type { UpdateOrderBookingParams, UpdateOrderProductParams } from './types';
|