@pisell/pisellos 0.0.567 → 0.0.568

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.
Files changed (228) hide show
  1. package/dist/core/index.js +6 -9
  2. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -2
  3. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  4. package/dist/model/strategy/adapter/walletPass/utils.js +0 -3
  5. package/dist/model/strategy/strategy-example.js +5 -19
  6. package/dist/modules/Cart/index.js +0 -3
  7. package/dist/modules/Cart/utils/cartProduct.js +0 -1
  8. package/dist/modules/Date/index.js +1 -5
  9. package/dist/modules/Discount/index.js +1 -4
  10. package/dist/modules/OpenData/index.js +0 -2
  11. package/dist/modules/Order/index.d.ts +1 -1
  12. package/dist/modules/Order/index.js +14 -41
  13. package/dist/modules/Payment/index.js +142 -270
  14. package/dist/modules/Payment/walletpass.js +4 -5
  15. package/dist/modules/Rules/index.js +0 -7
  16. package/dist/modules/Schedule/utils.js +0 -1
  17. package/dist/modules/Step/index.js +0 -1
  18. package/dist/plugins/request.js +1 -4
  19. package/dist/plugins/window.js +2 -6
  20. package/dist/server/index.js +88 -121
  21. package/dist/server/modules/menu/index.js +32 -41
  22. package/dist/server/modules/products/index.js +29 -49
  23. package/dist/server/modules/quotation/index.js +29 -38
  24. package/dist/server/modules/resource/index.js +3 -4
  25. package/dist/server/modules/schedule/index.js +32 -40
  26. package/dist/server/utils/product.js +0 -1
  27. package/dist/solution/BookingByStep/index.d.ts +1 -1
  28. package/dist/solution/BookingByStep/index.js +7 -59
  29. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  30. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  31. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  32. package/dist/solution/BookingTicket/index.d.ts +1 -1
  33. package/dist/solution/BookingTicket/index.js +5 -7
  34. package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
  35. package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
  36. package/dist/solution/BuyTickets/index.js +9 -12
  37. package/dist/solution/Checkout/index.js +177 -246
  38. package/dist/solution/Checkout/utils/index.js +4 -16
  39. package/dist/solution/RegisterAndLogin/index.js +30 -76
  40. package/dist/solution/ScanOrder/index.js +50 -60
  41. package/dist/solution/ShopDiscount/index.js +2 -7
  42. package/dist/solution/VenueBooking/index.d.ts +5 -0
  43. package/dist/solution/VenueBooking/index.js +364 -327
  44. package/dist/utils/task.js +15 -18
  45. package/dist/utils/watch.js +0 -1
  46. package/lib/apis/picoding.js +2 -0
  47. package/lib/core/index.js +130 -131
  48. package/lib/effects/index.js +46 -57
  49. package/lib/index.js +92 -53
  50. package/lib/model/index.js +14 -21
  51. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  52. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  53. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  54. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  55. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  56. package/lib/model/strategy/adapter/index.js +100 -64
  57. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  58. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  59. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  60. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  61. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  62. package/lib/model/strategy/adapter/promotion/adapter.js +84 -63
  63. package/lib/model/strategy/adapter/promotion/evaluator.js +381 -231
  64. package/lib/model/strategy/adapter/promotion/examples.js +139 -159
  65. package/lib/model/strategy/adapter/promotion/index.js +1 -49
  66. package/lib/model/strategy/adapter/promotion/type.js +199 -35
  67. package/lib/model/strategy/adapter/type.js +4 -16
  68. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -152
  69. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  70. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  71. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  72. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  73. package/lib/model/strategy/adapter/walletPass/utils.js +652 -402
  74. package/lib/model/strategy/engine.js +270 -168
  75. package/lib/model/strategy/index.js +49 -34
  76. package/lib/model/strategy/strategy-example.js +243 -239
  77. package/lib/model/strategy/type.js +100 -40
  78. package/lib/modules/Account/index.js +39 -53
  79. package/lib/modules/Account/types.js +20 -33
  80. package/lib/modules/AccountList/index.js +116 -154
  81. package/lib/modules/AccountList/types.js +30 -31
  82. package/lib/modules/AccountList/utils.js +18 -30
  83. package/lib/modules/BaseModule.js +22 -45
  84. package/lib/modules/Cart/index.js +170 -124
  85. package/lib/modules/Cart/types.js +46 -51
  86. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  87. package/lib/modules/Cart/utils/cartDate.js +56 -61
  88. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  89. package/lib/modules/Cart/utils/cartNote.js +27 -32
  90. package/lib/modules/Cart/utils/cartProduct.js +306 -241
  91. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  92. package/lib/modules/Cart/utils/cartResource.js +72 -78
  93. package/lib/modules/Cart/utils/changePrice.js +26 -62
  94. package/lib/modules/Cart/utils/index.js +106 -48
  95. package/lib/modules/Customer/constants.js +13 -34
  96. package/lib/modules/Customer/index.js +216 -153
  97. package/lib/modules/Customer/types.js +38 -35
  98. package/lib/modules/Date/index.js +116 -115
  99. package/lib/modules/Date/types.js +16 -28
  100. package/lib/modules/Date/utils.js +174 -123
  101. package/lib/modules/Discount/index.js +117 -113
  102. package/lib/modules/Discount/types.js +9 -31
  103. package/lib/modules/Guests/index.js +30 -56
  104. package/lib/modules/Guests/types.js +23 -33
  105. package/lib/modules/Holder/index.js +209 -189
  106. package/lib/modules/Holder/types.js +4 -16
  107. package/lib/modules/Holder/utils.js +20 -49
  108. package/lib/modules/OpenData/index.js +63 -74
  109. package/lib/modules/OpenData/types.js +4 -16
  110. package/lib/modules/OpenData/utils.js +44 -78
  111. package/lib/modules/Order/index.d.ts +1 -1
  112. package/lib/modules/Order/index.js +332 -320
  113. package/lib/modules/Order/types.js +24 -33
  114. package/lib/modules/Order/utils.js +350 -284
  115. package/lib/modules/Payment/cash.js +20 -33
  116. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  117. package/lib/modules/Payment/eftpos.js +16 -30
  118. package/lib/modules/Payment/index.js +566 -432
  119. package/lib/modules/Payment/mx51.js +1 -0
  120. package/lib/modules/Payment/types.js +216 -107
  121. package/lib/modules/Payment/utils.js +50 -47
  122. package/lib/modules/Payment/walletpass.js +221 -203
  123. package/lib/modules/Product/index.js +51 -46
  124. package/lib/modules/Product/types.js +4 -16
  125. package/lib/modules/Product/utils.js +32 -33
  126. package/lib/modules/ProductList/index.js +111 -110
  127. package/lib/modules/ProductList/types.js +9 -31
  128. package/lib/modules/Quotation/index.js +60 -82
  129. package/lib/modules/Quotation/types.js +4 -16
  130. package/lib/modules/Resource/index.js +27 -59
  131. package/lib/modules/Resource/types.js +22 -32
  132. package/lib/modules/Resource/utils.js +30 -38
  133. package/lib/modules/Rules/index.js +1172 -872
  134. package/lib/modules/Rules/types.js +17 -40
  135. package/lib/modules/SalesSummary/index.js +59 -68
  136. package/lib/modules/SalesSummary/types.js +4 -16
  137. package/lib/modules/SalesSummary/utils.js +176 -193
  138. package/lib/modules/ScanOrderLogger/index.js +59 -79
  139. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  140. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  141. package/lib/modules/ScanOrderLogger/types.js +4 -16
  142. package/lib/modules/Schedule/getDateIsInSchedule.js +334 -167
  143. package/lib/modules/Schedule/index.js +97 -107
  144. package/lib/modules/Schedule/type.js +4 -16
  145. package/lib/modules/Schedule/types.js +4 -16
  146. package/lib/modules/Schedule/utils.js +433 -291
  147. package/lib/modules/Step/index.js +40 -52
  148. package/lib/modules/Step/tyeps.js +4 -16
  149. package/lib/modules/Summary/index.js +66 -70
  150. package/lib/modules/Summary/types.js +4 -16
  151. package/lib/modules/Summary/utils.js +782 -429
  152. package/lib/modules/index.js +212 -57
  153. package/lib/plugins/app.js +4 -16
  154. package/lib/plugins/index.js +36 -25
  155. package/lib/plugins/request.js +137 -126
  156. package/lib/plugins/shopStore.js +4 -16
  157. package/lib/plugins/user.js +4 -16
  158. package/lib/plugins/window.js +171 -179
  159. package/lib/server/index.js +882 -623
  160. package/lib/server/modules/index.js +85 -59
  161. package/lib/server/modules/menu/index.js +146 -122
  162. package/lib/server/modules/menu/types.js +18 -31
  163. package/lib/server/modules/order/index.js +195 -231
  164. package/lib/server/modules/order/types.js +107 -32
  165. package/lib/server/modules/order/utils/filterBookings.js +174 -140
  166. package/lib/server/modules/order/utils/filterOrders.js +89 -60
  167. package/lib/server/modules/products/index.js +430 -335
  168. package/lib/server/modules/products/types.js +41 -34
  169. package/lib/server/modules/quotation/index.js +76 -77
  170. package/lib/server/modules/quotation/types.js +21 -31
  171. package/lib/server/modules/resource/index.js +216 -187
  172. package/lib/server/modules/resource/types.js +42 -33
  173. package/lib/server/modules/schedule/index.js +134 -119
  174. package/lib/server/modules/schedule/types.js +14 -21
  175. package/lib/server/modules/schedule/utils.js +334 -163
  176. package/lib/server/types.js +4 -16
  177. package/lib/server/utils/index.js +25 -23
  178. package/lib/server/utils/product.js +196 -139
  179. package/lib/server/utils/schedule.js +34 -41
  180. package/lib/server/utils/time.js +40 -49
  181. package/lib/solution/BookingByStep/index.d.ts +1 -1
  182. package/lib/solution/BookingByStep/index.js +1530 -1343
  183. package/lib/solution/BookingByStep/types.js +40 -99
  184. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  185. package/lib/solution/BookingByStep/utils/products.js +42 -52
  186. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  187. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  188. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  189. package/lib/solution/BookingTicket/index.d.ts +1 -1
  190. package/lib/solution/BookingTicket/index.js +147 -122
  191. package/lib/solution/BookingTicket/types.js +38 -64
  192. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +64 -80
  193. package/lib/solution/BookingTicket/utils/scan/handleScan.js +82 -80
  194. package/lib/solution/BookingTicket/utils/scan/index.js +90 -94
  195. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  196. package/lib/solution/BuyTickets/index.js +67 -70
  197. package/lib/solution/BuyTickets/types.js +22 -38
  198. package/lib/solution/Checkout/index.js +1451 -1158
  199. package/lib/solution/Checkout/types.js +91 -61
  200. package/lib/solution/Checkout/utils/index.js +227 -158
  201. package/lib/solution/PlaceOrder/index.js +55 -0
  202. package/lib/solution/RegisterAndLogin/config.js +493 -460
  203. package/lib/solution/RegisterAndLogin/index.js +633 -630
  204. package/lib/solution/RegisterAndLogin/types.js +189 -76
  205. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  206. package/lib/solution/Sales/index.js +218 -200
  207. package/lib/solution/Sales/types.js +27 -33
  208. package/lib/solution/ScanOrder/index.js +803 -840
  209. package/lib/solution/ScanOrder/types.js +34 -34
  210. package/lib/solution/ScanOrder/utils.js +372 -331
  211. package/lib/solution/ShopDiscount/index.js +230 -236
  212. package/lib/solution/ShopDiscount/types.js +15 -37
  213. package/lib/solution/ShopDiscount/utils.js +309 -172
  214. package/lib/solution/VenueBooking/index.d.ts +5 -0
  215. package/lib/solution/VenueBooking/index.js +886 -929
  216. package/lib/solution/VenueBooking/types.js +20 -40
  217. package/lib/solution/VenueBooking/utils/dateSummary.js +22 -54
  218. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  219. package/lib/solution/VenueBooking/utils/slotMerge.js +88 -106
  220. package/lib/solution/VenueBooking/utils/smartPricing.js +112 -100
  221. package/lib/solution/VenueBooking/utils/timeSlot.js +133 -132
  222. package/lib/solution/VenueBooking/utils.js +130 -67
  223. package/lib/solution/index.js +102 -37
  224. package/lib/store/createStore.js +32 -29
  225. package/lib/types/index.js +4 -16
  226. package/lib/utils/task.js +36 -36
  227. package/lib/utils/watch.js +81 -47
  228. package/package.json +2 -1
@@ -1,67 +1,44 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ "use strict";
28
2
 
29
- // src/solution/VenueBooking/utils/timeSlot.ts
30
- var timeSlot_exports = {};
31
- __export(timeSlot_exports, {
32
- buildTimeSlotGrid: () => buildTimeSlotGrid,
33
- collectEventsForDate: () => collectEventsForDate,
34
- computeSlotStatus: () => computeSlotStatus,
35
- generateTimeLabels: () => generateTimeLabels,
36
- isBusinessHoursCrossDay: () => isBusinessHoursCrossDay,
37
- isSlotOccupied: () => isSlotOccupied
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
38
5
  });
39
- module.exports = __toCommonJS(timeSlot_exports);
40
- var import_dayjs = __toESM(require("dayjs"));
41
- var import_decimal = __toESM(require("decimal.js"));
6
+ exports.buildTimeSlotGrid = buildTimeSlotGrid;
7
+ exports.collectEventsForDate = collectEventsForDate;
8
+ exports.computeSlotStatus = computeSlotStatus;
9
+ exports.generateTimeLabels = generateTimeLabels;
10
+ exports.isBusinessHoursCrossDay = isBusinessHoursCrossDay;
11
+ exports.isSlotOccupied = isSlotOccupied;
12
+ var _dayjs = _interopRequireDefault(require("dayjs"));
13
+ var _decimal = _interopRequireDefault(require("decimal.js"));
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
15
  function isBusinessHoursCrossDay(config) {
43
- const [startH, startM] = config.businessStartTime.split(":").map(Number);
44
- const [endH, endM] = config.businessEndTime.split(":").map(Number);
16
+ const [startH, startM] = config.businessStartTime.split(':').map(Number);
17
+ const [endH, endM] = config.businessEndTime.split(':').map(Number);
45
18
  return endH < startH || endH === startH && endM <= startM;
46
19
  }
47
20
  function generateTimeLabels(config) {
48
- const { slotDurationMinutes, businessStartTime, businessEndTime } = config;
21
+ const {
22
+ slotDurationMinutes,
23
+ businessStartTime,
24
+ businessEndTime
25
+ } = config;
49
26
  const labels = [];
50
- const baseDate = "2000-01-01";
51
- let cursor = (0, import_dayjs.default)(`${baseDate} ${businessStartTime}`);
27
+ const baseDate = '2000-01-01';
28
+ let cursor = (0, _dayjs.default)(`${baseDate} ${businessStartTime}`);
52
29
  const crossDay = isBusinessHoursCrossDay(config);
53
- const endBase = crossDay ? "2000-01-02" : baseDate;
54
- const end = (0, import_dayjs.default)(`${endBase} ${businessEndTime}`);
30
+ const endBase = crossDay ? '2000-01-02' : baseDate;
31
+ const end = (0, _dayjs.default)(`${endBase} ${businessEndTime}`);
55
32
  while (cursor.isBefore(end)) {
56
- labels.push(cursor.format("HH:mm"));
57
- cursor = cursor.add(slotDurationMinutes, "minute");
33
+ labels.push(cursor.format('HH:mm'));
34
+ cursor = cursor.add(slotDurationMinutes, 'minute');
58
35
  }
59
36
  return labels;
60
37
  }
61
38
  function isSlotOccupied(slotStart, slotEnd, occupiedTimes) {
62
39
  for (const occupied of occupiedTimes) {
63
- const occStart = (0, import_dayjs.default)(occupied.start_at);
64
- const occEnd = (0, import_dayjs.default)(occupied.end_at);
40
+ const occStart = (0, _dayjs.default)(occupied.start_at);
41
+ const occEnd = (0, _dayjs.default)(occupied.end_at);
65
42
  if (slotStart.isBefore(occEnd) && slotEnd.isAfter(occStart)) {
66
43
  return true;
67
44
  }
@@ -70,20 +47,19 @@ function isSlotOccupied(slotStart, slotEnd, occupiedTimes) {
70
47
  }
71
48
  function isSlotWithinResourceTimes(slotStart, slotEnd, resourceTimes) {
72
49
  for (const t of resourceTimes) {
73
- const tStart = (0, import_dayjs.default)(t.start_at);
74
- const tEnd = (0, import_dayjs.default)(t.end_at);
75
- if (slotStart.isBefore(tEnd) && slotEnd.isAfter(tStart))
76
- return true;
50
+ const tStart = (0, _dayjs.default)(t.start_at);
51
+ const tEnd = (0, _dayjs.default)(t.end_at);
52
+ if (slotStart.isBefore(tEnd) && slotEnd.isAfter(tStart)) return true;
77
53
  }
78
54
  return false;
79
55
  }
80
56
  function getResourceTimesForDate(resource, date, config) {
81
57
  const crossDay = isBusinessHoursCrossDay(config);
82
- const dayStart = (0, import_dayjs.default)(`${date} ${config.businessStartTime}`);
83
- const dayEnd = crossDay ? (0, import_dayjs.default)(`${date} ${config.businessEndTime}`).add(1, "day") : (0, import_dayjs.default)(`${date} ${config.businessEndTime}`);
84
- return resource.times.filter((t) => {
85
- const tStart = (0, import_dayjs.default)(t.start_at);
86
- const tEnd = (0, import_dayjs.default)(t.end_at);
58
+ const dayStart = (0, _dayjs.default)(`${date} ${config.businessStartTime}`);
59
+ const dayEnd = crossDay ? (0, _dayjs.default)(`${date} ${config.businessEndTime}`).add(1, 'day') : (0, _dayjs.default)(`${date} ${config.businessEndTime}`);
60
+ return resource.times.filter(t => {
61
+ const tStart = (0, _dayjs.default)(t.start_at);
62
+ const tEnd = (0, _dayjs.default)(t.end_at);
87
63
  return tStart.isBefore(dayEnd) && tEnd.isAfter(dayStart);
88
64
  });
89
65
  }
@@ -104,25 +80,50 @@ function collectEventsForDate(resource, date, config) {
104
80
  return events;
105
81
  }
106
82
  function computeSlotStatus(params) {
107
- const { slotStart, slotEnd, events, resourceType, capacity } = params;
108
- const overlapping = events.filter((evt) => {
109
- const evtStart = (0, import_dayjs.default)(evt.start_at);
110
- const evtEnd = (0, import_dayjs.default)(evt.end_at);
83
+ const {
84
+ slotStart,
85
+ slotEnd,
86
+ events,
87
+ resourceType,
88
+ capacity
89
+ } = params;
90
+ const overlapping = events.filter(evt => {
91
+ const evtStart = (0, _dayjs.default)(evt.start_at);
92
+ const evtEnd = (0, _dayjs.default)(evt.end_at);
111
93
  return slotStart.isBefore(evtEnd) && slotEnd.isAfter(evtStart);
112
94
  });
113
- if (resourceType === "single") {
114
- if (overlapping.length > 0)
115
- return { status: "occupied", remainingCapacity: 0 };
116
- return { status: "available", remainingCapacity: 1 };
95
+ if (resourceType === 'single') {
96
+ if (overlapping.length > 0) return {
97
+ status: 'occupied',
98
+ remainingCapacity: 0
99
+ };
100
+ return {
101
+ status: 'available',
102
+ remainingCapacity: 1
103
+ };
117
104
  }
118
105
  const usedCapacity = overlapping.reduce((sum, evt) => sum + evt.pax, 0);
119
106
  const remaining = Math.max(0, capacity - usedCapacity);
120
- if (remaining <= 0)
121
- return { status: "occupied", remainingCapacity: 0 };
122
- if (remaining < capacity)
123
- return { status: "partially_occupied", remainingCapacity: remaining };
124
- return { status: "available", remainingCapacity: remaining };
107
+ if (remaining <= 0) return {
108
+ status: 'occupied',
109
+ remainingCapacity: 0
110
+ };
111
+ if (remaining < capacity) return {
112
+ status: 'partially_occupied',
113
+ remainingCapacity: remaining
114
+ };
115
+ return {
116
+ status: 'available',
117
+ remainingCapacity: remaining
118
+ };
125
119
  }
120
+
121
+ /**
122
+ * 合并多个子商品的同一个时段为一个"外层 slot"。
123
+ * - status 取优先级最高的(available > partially_occupied > occupied > unavailable / past)
124
+ * - price 取非空子 slot 中最小的那个
125
+ * - 其它字段使用第一个参考子 slot(外层 slot 不带 productId)
126
+ */
126
127
  function mergeSubSlots(subSlots) {
127
128
  const priority = {
128
129
  available: 5,
@@ -133,16 +134,13 @@ function mergeSubSlots(subSlots) {
133
134
  };
134
135
  let best = subSlots[0];
135
136
  for (const slot of subSlots) {
136
- if ((priority[slot.status] ?? 0) > (priority[best.status] ?? 0))
137
- best = slot;
137
+ if ((priority[slot.status] ?? 0) > (priority[best.status] ?? 0)) best = slot;
138
138
  }
139
139
  let minPrice = null;
140
140
  for (const slot of subSlots) {
141
- if (slot.price == null)
142
- continue;
143
- const decimal = new import_decimal.default(slot.price || "0");
144
- if (!minPrice || decimal.lt(minPrice))
145
- minPrice = decimal;
141
+ if (slot.price == null) continue;
142
+ const decimal = new _decimal.default(slot.price || '0');
143
+ if (!minPrice || decimal.lt(minPrice)) minPrice = decimal;
146
144
  }
147
145
  return {
148
146
  startTime: best.startTime,
@@ -176,17 +174,17 @@ function buildProductSlots(params) {
176
174
  } = params;
177
175
  const slots = [];
178
176
  for (const label of timeLabels) {
179
- const [h] = label.split(":").map(Number);
177
+ const [h] = label.split(':').map(Number);
180
178
  const isNextDay = crossDay && h < config_businessStartHour;
181
- const slotDate = isNextDay ? (0, import_dayjs.default)(date).add(1, "day").format("YYYY-MM-DD") : date;
182
- const slotStart = (0, import_dayjs.default)(`${slotDate} ${label}`);
183
- const slotEnd = slotStart.add(config.slotDurationMinutes, "minute");
179
+ const slotDate = isNextDay ? (0, _dayjs.default)(date).add(1, 'day').format('YYYY-MM-DD') : date;
180
+ const slotStart = (0, _dayjs.default)(`${slotDate} ${label}`);
181
+ const slotEnd = slotStart.add(config.slotDurationMinutes, 'minute');
184
182
  let status;
185
183
  let remainingCapacity = null;
186
184
  if (slotStart.isBefore(now)) {
187
- status = "past";
185
+ status = 'past';
188
186
  } else if (!isSlotWithinResourceTimes(slotStart, slotEnd, timesForDate)) {
189
- status = "unavailable";
187
+ status = 'unavailable';
190
188
  } else {
191
189
  const result = computeSlotStatus({
192
190
  slotStart,
@@ -197,17 +195,17 @@ function buildProductSlots(params) {
197
195
  });
198
196
  status = result.status;
199
197
  remainingCapacity = result.remainingCapacity;
200
- if (status !== "occupied" && childRawResources && childRawResources.length) {
198
+ if (status !== 'occupied' && childRawResources && childRawResources.length) {
201
199
  for (let i = 0; i < childRawResources.length; i++) {
202
200
  const child = childRawResources[i];
203
- const childTimes = (childTimesCache == null ? void 0 : childTimesCache[i]) ?? getResourceTimesForDate(child, date, config);
204
- const childEvents = (childEventsCache == null ? void 0 : childEventsCache[i]) ?? collectEventsForDate(child, date, config);
201
+ const childTimes = childTimesCache?.[i] ?? getResourceTimesForDate(child, date, config);
202
+ const childEvents = childEventsCache?.[i] ?? collectEventsForDate(child, date, config);
205
203
  if (!isSlotWithinResourceTimes(slotStart, slotEnd, childTimes)) {
206
- status = "unavailable";
204
+ status = 'unavailable';
207
205
  remainingCapacity = null;
208
206
  break;
209
207
  }
210
- const childType = child.type || "single";
208
+ const childType = child.type || 'single';
211
209
  const childResult = computeSlotStatus({
212
210
  slotStart,
213
211
  slotEnd,
@@ -215,32 +213,29 @@ function buildProductSlots(params) {
215
213
  resourceType: childType,
216
214
  capacity: child.capacity ?? 1
217
215
  });
218
- if (childResult.status === "occupied") {
219
- status = "occupied";
216
+ if (childResult.status === 'occupied') {
217
+ status = 'occupied';
220
218
  remainingCapacity = 0;
221
219
  break;
222
220
  }
223
- if (childResult.status === "partially_occupied" && status === "available") {
224
- status = "partially_occupied";
225
- remainingCapacity = Math.min(
226
- remainingCapacity ?? childResult.remainingCapacity,
227
- childResult.remainingCapacity
228
- );
221
+ if (childResult.status === 'partially_occupied' && status === 'available') {
222
+ status = 'partially_occupied';
223
+ remainingCapacity = Math.min(remainingCapacity ?? childResult.remainingCapacity, childResult.remainingCapacity);
229
224
  }
230
225
  }
231
226
  }
232
227
  }
233
- const isBookable = status === "available" || status === "partially_occupied";
234
- const slotStartStr = slotStart.format("YYYY-MM-DD HH:mm");
228
+ const isBookable = status === 'available' || status === 'partially_occupied';
229
+ const slotStartStr = slotStart.format('YYYY-MM-DD HH:mm');
235
230
  const resolvedPriceMap = slotPriceMap ?? quotationPriceMap;
236
231
  slots.push({
237
232
  startTime: slotStartStr,
238
- endTime: slotEnd.format("YYYY-MM-DD HH:mm"),
233
+ endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
239
234
  status,
240
- price: isBookable ? (resolvedPriceMap == null ? void 0 : resolvedPriceMap.get(`${mapping.productId}:${slotStartStr}`)) ?? mapping.price : null,
235
+ price: isBookable ? resolvedPriceMap?.get(`${mapping.productId}:${slotStartStr}`) ?? mapping.price : null,
241
236
  resourceId: resource.resourceId,
242
237
  resourceFormId: resource.formId,
243
- capacity: status === "past" || status === "unavailable" ? null : resCapacity,
238
+ capacity: status === 'past' || status === 'unavailable' ? null : resCapacity,
244
239
  remainingCapacity,
245
240
  productId: mapping.productId
246
241
  });
@@ -248,29 +243,34 @@ function buildProductSlots(params) {
248
243
  return slots;
249
244
  }
250
245
  function buildTimeSlotGrid(params) {
251
- const { date, config, rawResources, resourceProductMap, quotationPriceMap, slotPriceMap } = params;
246
+ const {
247
+ date,
248
+ config,
249
+ rawResources,
250
+ resourceProductMap,
251
+ quotationPriceMap,
252
+ slotPriceMap
253
+ } = params;
252
254
  const resolvedPriceMap = slotPriceMap ?? quotationPriceMap;
253
255
  const timeLabels = generateTimeLabels(config);
254
- const now = (0, import_dayjs.default)();
256
+ const now = (0, _dayjs.default)();
255
257
  const crossDay = isBusinessHoursCrossDay(config);
256
- const config_businessStartHour = Number(config.businessStartTime.split(":")[0]);
257
- const rawResourceById = /* @__PURE__ */ new Map();
258
- for (const item of rawResources)
259
- rawResourceById.set(item.resourceId, item);
258
+ const config_businessStartHour = Number(config.businessStartTime.split(':')[0]);
259
+ const rawResourceById = new Map();
260
+ for (const item of rawResources) rawResourceById.set(item.resourceId, item);
260
261
  const resources = [];
261
262
  for (const resource of rawResources) {
262
263
  const mappings = resourceProductMap.get(resource.resourceId);
263
- if (!mappings || !mappings.length)
264
- continue;
264
+ if (!mappings || !mappings.length) continue;
265
265
  const timesForDate = getResourceTimesForDate(resource, date, config);
266
266
  const events = collectEventsForDate(resource, date, config);
267
267
  const resCapacity = resource.capacity ?? 1;
268
268
  const combined = resource.combined_resource;
269
269
  const isCombined = !!(combined && combined.status === 1 && Array.isArray(combined.resource_ids) && combined.resource_ids.length);
270
- const childRawResources = isCombined ? combined.resource_ids.map((id) => rawResourceById.get(id)).filter((r) => !!r) : void 0;
271
- const childTimesCache = childRawResources == null ? void 0 : childRawResources.map((child) => getResourceTimesForDate(child, date, config));
272
- const childEventsCache = childRawResources == null ? void 0 : childRawResources.map((child) => collectEventsForDate(child, date, config));
273
- const subRows = mappings.map((mapping) => {
270
+ const childRawResources = isCombined ? combined.resource_ids.map(id => rawResourceById.get(id)).filter(r => !!r) : undefined;
271
+ const childTimesCache = childRawResources?.map(child => getResourceTimesForDate(child, date, config));
272
+ const childEventsCache = childRawResources?.map(child => collectEventsForDate(child, date, config));
273
+ const subRows = mappings.map(mapping => {
274
274
  const productSlots = buildProductSlots({
275
275
  date,
276
276
  config,
@@ -301,11 +301,14 @@ function buildTimeSlotGrid(params) {
301
301
  let outerSlots;
302
302
  if (hasMultipleProducts) {
303
303
  outerSlots = timeLabels.map((_label, slotIndex) => {
304
- const group = subRows.map((row2) => row2.slots[slotIndex]);
304
+ const group = subRows.map(row => row.slots[slotIndex]);
305
305
  return mergeSubSlots(group);
306
306
  });
307
307
  } else {
308
- outerSlots = subRows[0].slots.map((slot) => ({ ...slot, productId: void 0 }));
308
+ outerSlots = subRows[0].slots.map(slot => ({
309
+ ...slot,
310
+ productId: undefined
311
+ }));
309
312
  }
310
313
  const row = {
311
314
  resourceId: resource.resourceId,
@@ -320,24 +323,22 @@ function buildTimeSlotGrid(params) {
320
323
  row.hasMultipleProducts = true;
321
324
  }
322
325
  if (isCombined && combined) {
323
- row.combinedResource = { resourceIds: [...combined.resource_ids] };
326
+ row.combinedResource = {
327
+ resourceIds: [...combined.resource_ids]
328
+ };
324
329
  }
325
330
  resources.push(row);
326
331
  }
327
- const productOrder = /* @__PURE__ */ new Map();
332
+
333
+ // 按 productId 分组排序,确保同一商品的场地连续排列
334
+ const productOrder = new Map();
328
335
  for (const row of resources) {
329
- if (!productOrder.has(row.productId))
330
- productOrder.set(row.productId, productOrder.size);
336
+ if (!productOrder.has(row.productId)) productOrder.set(row.productId, productOrder.size);
331
337
  }
332
338
  resources.sort((a, b) => (productOrder.get(a.productId) ?? 0) - (productOrder.get(b.productId) ?? 0));
333
- return { date, timeLabels, resources };
334
- }
335
- // Annotate the CommonJS export names for ESM import in node:
336
- 0 && (module.exports = {
337
- buildTimeSlotGrid,
338
- collectEventsForDate,
339
- computeSlotStatus,
340
- generateTimeLabels,
341
- isBusinessHoursCrossDay,
342
- isSlotOccupied
343
- });
339
+ return {
340
+ date,
341
+ timeLabels,
342
+ resources
343
+ };
344
+ }
@@ -1,69 +1,132 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ "use strict";
18
2
 
19
- // src/solution/VenueBooking/utils.ts
20
- var utils_exports = {};
21
- __export(utils_exports, {
22
- aggregateItemRuleLimit: () => import_utils.aggregateItemRuleLimit,
23
- attachItemRuleLimitsToTopLevelProducts: () => import_utils.attachItemRuleLimitsToTopLevelProducts,
24
- buildItemRuleBusinessData: () => import_utils.buildItemRuleBusinessData,
25
- buildProductKey: () => import_utils.buildProductKey,
26
- buildQuantityLimitIndex: () => import_utils.buildQuantityLimitIndex,
27
- createEmptySummary: () => import_utils.createEmptySummary,
28
- extractStrategyModelIdsFromTableConfig: () => import_utils.extractStrategyModelIdsFromTableConfig,
29
- getProductIdentityIndex: () => import_utils.getProductIdentityIndex,
30
- getSafeProductNum: () => import_utils.getSafeProductNum,
31
- getTopLevelProductId: () => import_utils.getTopLevelProductId,
32
- getTopLevelVariantId: () => import_utils.getTopLevelVariantId,
33
- isIdentityMatch: () => import_utils.isIdentityMatch,
34
- normalizeEnabledItemRuleIds: () => import_utils.normalizeEnabledItemRuleIds,
35
- normalizeItemRuleStrategies: () => import_utils.normalizeItemRuleStrategies,
36
- normalizeOrderProduct: () => import_utils.normalizeOrderProduct,
37
- resolveSkuMatchedQuantityLimits: () => import_utils.resolveSkuMatchedQuantityLimits,
38
- toBoolean: () => import_utils.toBoolean,
39
- toNonNegativeInt: () => import_utils.toNonNegativeInt,
40
- toNonNegativeNumber: () => import_utils.toNonNegativeNumber,
41
- toPositiveString: () => import_utils.toPositiveString,
42
- toPriceString: () => import_utils.toPriceString
43
- });
44
- module.exports = __toCommonJS(utils_exports);
45
- var import_utils = require("../ScanOrder/utils");
46
- // Annotate the CommonJS export names for ESM import in node:
47
- 0 && (module.exports = {
48
- aggregateItemRuleLimit,
49
- attachItemRuleLimitsToTopLevelProducts,
50
- buildItemRuleBusinessData,
51
- buildProductKey,
52
- buildQuantityLimitIndex,
53
- createEmptySummary,
54
- extractStrategyModelIdsFromTableConfig,
55
- getProductIdentityIndex,
56
- getSafeProductNum,
57
- getTopLevelProductId,
58
- getTopLevelVariantId,
59
- isIdentityMatch,
60
- normalizeEnabledItemRuleIds,
61
- normalizeItemRuleStrategies,
62
- normalizeOrderProduct,
63
- resolveSkuMatchedQuantityLimits,
64
- toBoolean,
65
- toNonNegativeInt,
66
- toNonNegativeNumber,
67
- toPositiveString,
68
- toPriceString
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
69
5
  });
6
+ Object.defineProperty(exports, "aggregateItemRuleLimit", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _utils.aggregateItemRuleLimit;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "attachItemRuleLimitsToTopLevelProducts", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _utils.attachItemRuleLimitsToTopLevelProducts;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "buildItemRuleBusinessData", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _utils.buildItemRuleBusinessData;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "buildProductKey", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _utils.buildProductKey;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "buildQuantityLimitIndex", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _utils.buildQuantityLimitIndex;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "createEmptySummary", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _utils.createEmptySummary;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "extractStrategyModelIdsFromTableConfig", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _utils.extractStrategyModelIdsFromTableConfig;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "getProductIdentityIndex", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _utils.getProductIdentityIndex;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "getSafeProductNum", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _utils.getSafeProductNum;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "getTopLevelProductId", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _utils.getTopLevelProductId;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "getTopLevelVariantId", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _utils.getTopLevelVariantId;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "isIdentityMatch", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _utils.isIdentityMatch;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "normalizeEnabledItemRuleIds", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _utils.normalizeEnabledItemRuleIds;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "normalizeItemRuleStrategies", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _utils.normalizeItemRuleStrategies;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "normalizeOrderProduct", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _utils.normalizeOrderProduct;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "resolveSkuMatchedQuantityLimits", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _utils.resolveSkuMatchedQuantityLimits;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "toBoolean", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _utils.toBoolean;
106
+ }
107
+ });
108
+ Object.defineProperty(exports, "toNonNegativeInt", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _utils.toNonNegativeInt;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "toNonNegativeNumber", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _utils.toNonNegativeNumber;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "toPositiveString", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _utils.toPositiveString;
124
+ }
125
+ });
126
+ Object.defineProperty(exports, "toPriceString", {
127
+ enumerable: true,
128
+ get: function () {
129
+ return _utils.toPriceString;
130
+ }
131
+ });
132
+ var _utils = require("../ScanOrder/utils");