@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,45 +1,25 @@
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/types.ts
20
- var types_exports = {};
21
- __export(types_exports, {
22
- DEFAULT_SLOT_CONFIG: () => DEFAULT_SLOT_CONFIG,
23
- VenueBookingHooks: () => VenueBookingHooks
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
24
5
  });
25
- module.exports = __toCommonJS(types_exports);
26
- var VenueBookingHooks = /* @__PURE__ */ ((VenueBookingHooks2) => {
27
- VenueBookingHooks2["onInited"] = "venueBooking:onInited";
28
- VenueBookingHooks2["onDestroy"] = "venueBooking:onDestroy";
29
- VenueBookingHooks2["onRetryInit"] = "venueBooking:onRetryInit";
30
- VenueBookingHooks2["onRefresh"] = "venueBooking:onRefresh";
31
- VenueBookingHooks2["onCartValidationChanged"] = "venueBooking:onCartValidationChanged";
32
- VenueBookingHooks2["onSmartPricingUpdated"] = "venueBooking:onSmartPricingUpdated";
33
- return VenueBookingHooks2;
34
- })(VenueBookingHooks || {});
35
- var DEFAULT_SLOT_CONFIG = {
6
+ exports.VenueBookingHooks = exports.DEFAULT_SLOT_CONFIG = void 0;
7
+ let VenueBookingHooks = exports.VenueBookingHooks = /*#__PURE__*/function (VenueBookingHooks) {
8
+ VenueBookingHooks["onInited"] = "venueBooking:onInited";
9
+ VenueBookingHooks["onDestroy"] = "venueBooking:onDestroy";
10
+ VenueBookingHooks["onRetryInit"] = "venueBooking:onRetryInit";
11
+ VenueBookingHooks["onRefresh"] = "venueBooking:onRefresh";
12
+ VenueBookingHooks["onCartValidationChanged"] = "venueBooking:onCartValidationChanged";
13
+ VenueBookingHooks["onSmartPricingUpdated"] = "venueBooking:onSmartPricingUpdated";
14
+ return VenueBookingHooks;
15
+ }({}); // ─── 场地预定核心类型 ───
16
+ const DEFAULT_SLOT_CONFIG = exports.DEFAULT_SLOT_CONFIG = {
36
17
  slotDurationMinutes: 30,
37
- businessStartTime: "09:00",
38
- businessEndTime: "23:00",
18
+ businessStartTime: '09:00',
19
+ businessEndTime: '23:00',
39
20
  fewLeftThreshold: 0.8
40
21
  };
41
- // Annotate the CommonJS export names for ESM import in node:
42
- 0 && (module.exports = {
43
- DEFAULT_SLOT_CONFIG,
44
- VenueBookingHooks
45
- });
22
+
23
+ // ─── 时段选择 & 合并 ───
24
+
25
+ // ─── Store 状态 ───
@@ -1,39 +1,12 @@
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/dateSummary.ts
30
- var dateSummary_exports = {};
31
- __export(dateSummary_exports, {
32
- buildDateRangeSummary: () => buildDateRangeSummary
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
33
5
  });
34
- module.exports = __toCommonJS(dateSummary_exports);
35
- var import_dayjs = __toESM(require("dayjs"));
36
- var import_timeSlot = require("./timeSlot");
6
+ exports.buildDateRangeSummary = buildDateRangeSummary;
7
+ var _dayjs = _interopRequireDefault(require("dayjs"));
8
+ var _timeSlot = require("./timeSlot");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
10
  function buildDateRangeSummary(params) {
38
11
  const {
39
12
  startDate,
@@ -45,14 +18,14 @@ function buildDateRangeSummary(params) {
45
18
  buildSlotPriceMap
46
19
  } = params;
47
20
  const result = [];
48
- const productIds = buildSlotPriceMap ? [...new Set([...resourceProductMap.values()].flat().map((m) => m.productId))] : [];
49
- let cursor = (0, import_dayjs.default)(startDate);
50
- const end = (0, import_dayjs.default)(endDate);
21
+ const productIds = buildSlotPriceMap ? [...new Set([...resourceProductMap.values()].flat().map(m => m.productId))] : [];
22
+ let cursor = (0, _dayjs.default)(startDate);
23
+ const end = (0, _dayjs.default)(endDate);
51
24
  while (!cursor.isAfter(end)) {
52
- const date = cursor.format("YYYY-MM-DD");
53
- const effectiveConfig = (resolveConfig == null ? void 0 : resolveConfig(date)) || config;
54
- const slotPriceMap = buildSlotPriceMap && productIds.length ? buildSlotPriceMap(date, effectiveConfig, productIds) : void 0;
55
- const grid = (0, import_timeSlot.buildTimeSlotGrid)({
25
+ const date = cursor.format('YYYY-MM-DD');
26
+ const effectiveConfig = resolveConfig?.(date) || config;
27
+ const slotPriceMap = buildSlotPriceMap && productIds.length ? buildSlotPriceMap(date, effectiveConfig, productIds) : undefined;
28
+ const grid = (0, _timeSlot.buildTimeSlotGrid)({
56
29
  date,
57
30
  config: effectiveConfig,
58
31
  rawResources,
@@ -64,10 +37,9 @@ function buildDateRangeSummary(params) {
64
37
  let lowestPrice = null;
65
38
  for (const resource of grid.resources) {
66
39
  for (const slot of resource.slots) {
67
- if (slot.status === "past" || slot.status === "unavailable")
68
- continue;
40
+ if (slot.status === 'past' || slot.status === 'unavailable') continue;
69
41
  totalSlots++;
70
- if (slot.status === "available" || slot.status === "partially_occupied") {
42
+ if (slot.status === 'available' || slot.status === 'partially_occupied') {
71
43
  availableSlots++;
72
44
  if (slot.price !== null) {
73
45
  const priceNum = Number(slot.price);
@@ -80,13 +52,13 @@ function buildDateRangeSummary(params) {
80
52
  }
81
53
  let status;
82
54
  if (totalSlots === 0) {
83
- status = "unavailable";
55
+ status = 'unavailable';
84
56
  } else if (availableSlots === 0) {
85
- status = "sold_out";
57
+ status = 'sold_out';
86
58
  } else if ((totalSlots - availableSlots) / totalSlots >= effectiveConfig.fewLeftThreshold) {
87
- status = "few_left";
59
+ status = 'few_left';
88
60
  } else {
89
- status = "available";
61
+ status = 'available';
90
62
  }
91
63
  result.push({
92
64
  date,
@@ -95,11 +67,7 @@ function buildDateRangeSummary(params) {
95
67
  totalSlots,
96
68
  availableSlots
97
69
  });
98
- cursor = cursor.add(1, "day");
70
+ cursor = cursor.add(1, 'day');
99
71
  }
100
72
  return result;
101
- }
102
- // Annotate the CommonJS export names for ESM import in node:
103
- 0 && (module.exports = {
104
- buildDateRangeSummary
105
- });
73
+ }
@@ -1,69 +1,51 @@
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/resource.ts
20
- var resource_exports = {};
21
- __export(resource_exports, {
22
- buildResourceProductMap: () => buildResourceProductMap,
23
- extractResourceIds: () => extractResourceIds
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
24
5
  });
25
- module.exports = __toCommonJS(resource_exports);
6
+ exports.buildResourceProductMap = buildResourceProductMap;
7
+ exports.extractResourceIds = extractResourceIds;
8
+ /**
9
+ * 从商品列表里抽取所有 resource_id:
10
+ * - 商品绑定的 default_resource / optional_resource
11
+ * - 以及这些资源上声明的 combined_resource.resource_ids(若可从 product_resource 读取)
12
+ * 用于一次性拉到子资源数据,判定组合资源的可用性。
13
+ */
26
14
  function extractResourceIds(products) {
27
- var _a;
28
- const ids = /* @__PURE__ */ new Set();
15
+ const ids = new Set();
29
16
  for (const product of products) {
30
- const resources = (_a = product.product_resource) == null ? void 0 : _a.resources;
31
- if (!Array.isArray(resources))
32
- continue;
17
+ const resources = product.product_resource?.resources;
18
+ if (!Array.isArray(resources)) continue;
33
19
  for (const resource of resources) {
34
- if (resource.status !== 1)
35
- continue;
20
+ if (resource.status !== 1) continue;
36
21
  const defaultRes = resource.default_resource || [];
37
22
  const optionalRes = resource.optional_resource || [];
38
23
  for (const id of [...defaultRes, ...optionalRes]) {
39
- if (typeof id === "number" && id > 0)
40
- ids.add(id);
24
+ if (typeof id === 'number' && id > 0) ids.add(id);
41
25
  }
42
26
  const combined = resource.combined_resource;
43
27
  if (combined && combined.status === 1 && Array.isArray(combined.resource_ids)) {
44
28
  for (const id of combined.resource_ids) {
45
- if (typeof id === "number" && id > 0)
46
- ids.add(id);
29
+ if (typeof id === 'number' && id > 0) ids.add(id);
47
30
  }
48
31
  }
49
32
  }
50
33
  }
51
34
  return Array.from(ids);
52
35
  }
36
+
37
+ /**
38
+ * 每个 resourceId 可以被多个商品共享(同一场地关联多种运动商品)。
39
+ * Map 的 value 改为 ResourceProductMapping[],按商品出现顺序保留。
40
+ */
53
41
  function buildResourceProductMap(products) {
54
- var _a;
55
- const map = /* @__PURE__ */ new Map();
42
+ const map = new Map();
56
43
  for (const product of products) {
57
- const resources = (_a = product.product_resource) == null ? void 0 : _a.resources;
58
- if (!Array.isArray(resources))
59
- continue;
44
+ const resources = product.product_resource?.resources;
45
+ if (!Array.isArray(resources)) continue;
60
46
  for (const resource of resources) {
61
- if (resource.status !== 1)
62
- continue;
63
- const allResourceIds = [
64
- ...resource.default_resource || [],
65
- ...resource.optional_resource || []
66
- ];
47
+ if (resource.status !== 1) continue;
48
+ const allResourceIds = [...(resource.default_resource || []), ...(resource.optional_resource || [])];
67
49
  for (const resId of allResourceIds) {
68
50
  const existing = map.get(resId);
69
51
  const mapping = {
@@ -72,21 +54,16 @@ function buildResourceProductMap(products) {
72
54
  formName: resource.title,
73
55
  resourceName: resource.title,
74
56
  formId: resource.id,
75
- price: product.price || "0.00",
76
- resourceType: resource.type || "single"
57
+ price: product.price || '0.00',
58
+ resourceType: resource.type || 'single'
77
59
  };
78
60
  if (!existing) {
79
61
  map.set(resId, [mapping]);
80
- } else if (!existing.some((m) => m.productId === mapping.productId)) {
62
+ } else if (!existing.some(m => m.productId === mapping.productId)) {
81
63
  existing.push(mapping);
82
64
  }
83
65
  }
84
66
  }
85
67
  }
86
68
  return map;
87
- }
88
- // Annotate the CommonJS export names for ESM import in node:
89
- 0 && (module.exports = {
90
- buildResourceProductMap,
91
- extractResourceIds
92
- });
69
+ }
@@ -1,62 +1,34 @@
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/slotMerge.ts
30
- var slotMerge_exports = {};
31
- __export(slotMerge_exports, {
32
- buildPriceBreakdown: () => buildPriceBreakdown,
33
- buildVenueBookingEntry: () => buildVenueBookingEntry,
34
- buildVenueIdentityKey: () => buildVenueIdentityKey,
35
- buildVenueResourceMetadata: () => buildVenueResourceMetadata,
36
- expandMergedSlotToIndividual: () => expandMergedSlotToIndividual,
37
- mergeConsecutiveSlots: () => mergeConsecutiveSlots
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
38
5
  });
39
- module.exports = __toCommonJS(slotMerge_exports);
40
- var import_decimal = __toESM(require("decimal.js"));
41
- var import_dayjs = __toESM(require("dayjs"));
42
- var import_utils = require("../../../modules/Order/utils");
6
+ exports.buildPriceBreakdown = buildPriceBreakdown;
7
+ exports.buildVenueBookingEntry = buildVenueBookingEntry;
8
+ exports.buildVenueIdentityKey = buildVenueIdentityKey;
9
+ exports.buildVenueResourceMetadata = buildVenueResourceMetadata;
10
+ exports.expandMergedSlotToIndividual = expandMergedSlotToIndividual;
11
+ exports.mergeConsecutiveSlots = mergeConsecutiveSlots;
12
+ var _decimal = _interopRequireDefault(require("decimal.js"));
13
+ var _dayjs = _interopRequireDefault(require("dayjs"));
14
+ var _utils = require("../../../modules/Order/utils");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
16
  function buildVenueIdentityKey(resourceId, groupIndex) {
44
- return `venue:${resourceId}:${groupIndex}:${(0, import_utils.createUuidV4)()}`;
17
+ return `venue:${resourceId}:${groupIndex}:${(0, _utils.createUuidV4)()}`;
45
18
  }
46
19
  function mergeConsecutiveSlots(slots) {
47
- if (!slots.length)
48
- return [];
20
+ if (!slots.length) return [];
49
21
  const sorted = [...slots].sort((a, b) => a.startTime.localeCompare(b.startTime));
50
22
  const groups = [];
51
23
  let currentSlots = [sorted[0]];
52
24
  let currentStart = sorted[0].startTime;
53
25
  let currentEnd = sorted[0].endTime;
54
- let totalPrice = new import_decimal.default(sorted[0].price || "0");
26
+ let totalPrice = new _decimal.default(sorted[0].price || '0');
55
27
  for (let i = 1; i < sorted.length; i++) {
56
28
  const slot = sorted[i];
57
29
  if (slot.startTime === currentEnd) {
58
30
  currentEnd = slot.endTime;
59
- totalPrice = totalPrice.add(new import_decimal.default(slot.price || "0"));
31
+ totalPrice = totalPrice.add(new _decimal.default(slot.price || '0'));
60
32
  currentSlots.push(slot);
61
33
  } else {
62
34
  groups.push({
@@ -69,7 +41,7 @@ function mergeConsecutiveSlots(slots) {
69
41
  currentSlots = [slot];
70
42
  currentStart = slot.startTime;
71
43
  currentEnd = slot.endTime;
72
- totalPrice = new import_decimal.default(slot.price || "0");
44
+ totalPrice = new _decimal.default(slot.price || '0');
73
45
  }
74
46
  }
75
47
  groups.push({
@@ -82,14 +54,15 @@ function mergeConsecutiveSlots(slots) {
82
54
  return groups;
83
55
  }
84
56
  function buildPriceBreakdown(params) {
85
- const { group } = params;
86
- if (!group.slots.length)
87
- return [];
57
+ const {
58
+ group
59
+ } = params;
60
+ if (!group.slots.length) return [];
88
61
  const entries = [];
89
62
  for (const slot of group.slots) {
90
- const unitPrice = Number(slot.price || "0");
91
- const startHm = (0, import_dayjs.default)(slot.startTime, "YYYY-MM-DD HH:mm").format("YYYY-MM-DD HH:mm");
92
- const endHm = (0, import_dayjs.default)(slot.endTime, "YYYY-MM-DD HH:mm").format("YYYY-MM-DD HH:mm");
63
+ const unitPrice = Number(slot.price || '0');
64
+ const startHm = (0, _dayjs.default)(slot.startTime, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DD HH:mm');
65
+ const endHm = (0, _dayjs.default)(slot.endTime, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DD HH:mm');
93
66
  const last = entries[entries.length - 1];
94
67
  if (last && last.unit_price === unitPrice && last.quotation_shelf_id === 0 && last.end_time === startHm) {
95
68
  last.end_time = endHm;
@@ -107,36 +80,50 @@ function buildPriceBreakdown(params) {
107
80
  return entries;
108
81
  }
109
82
  function buildVenueResourceMetadata(params) {
110
- const { mapping, rawResource } = params;
111
- const combined = rawResource == null ? void 0 : rawResource.combined_resource;
83
+ const {
84
+ mapping,
85
+ rawResource
86
+ } = params;
87
+ const combined = rawResource?.combined_resource;
112
88
  const isCombined = !!(combined && combined.status === 1 && Array.isArray(combined.resource_ids));
113
89
  return {
114
90
  form_name: mapping.formName ?? mapping.resourceName,
115
- resource_name: (rawResource == null ? void 0 : rawResource.main_field) ?? mapping.resourceName,
91
+ resource_name: rawResource?.main_field ?? mapping.resourceName,
116
92
  combined_resource: isCombined ? combined : null
117
93
  };
118
94
  }
119
95
  function buildVenueBookingEntry(params) {
120
- const { group, resourceId, mapping, rawResource, bookingUuid, productUid, childResources } = params;
121
- const startMoment = (0, import_dayjs.default)(group.startTime, "YYYY-MM-DD HH:mm");
122
- const endMoment = (0, import_dayjs.default)(group.endTime, "YYYY-MM-DD HH:mm");
123
- const duration = endMoment.diff(startMoment, "minute");
96
+ const {
97
+ group,
98
+ resourceId,
99
+ mapping,
100
+ rawResource,
101
+ bookingUuid,
102
+ productUid,
103
+ childResources
104
+ } = params;
105
+ const startMoment = (0, _dayjs.default)(group.startTime, 'YYYY-MM-DD HH:mm');
106
+ const endMoment = (0, _dayjs.default)(group.endTime, 'YYYY-MM-DD HH:mm');
107
+ const duration = endMoment.diff(startMoment, 'minute');
124
108
  const resourceEntry = {
125
- relation_type: "form",
126
- like_status: "common",
109
+ relation_type: 'form',
110
+ like_status: 'common',
127
111
  id: resourceId,
128
112
  main_field: mapping.resourceName,
129
- form_id: (rawResource == null ? void 0 : rawResource.form_id) ?? mapping.formId,
113
+ form_id: rawResource?.form_id ?? mapping.formId,
130
114
  relation_id: resourceId,
131
115
  capacity: 1,
132
- metadata: buildVenueResourceMetadata({ mapping, rawResource })
116
+ metadata: buildVenueResourceMetadata({
117
+ mapping,
118
+ rawResource
119
+ })
133
120
  };
134
121
  if (childResources && childResources.length) {
135
- resourceEntry.children = childResources.map((child) => ({
136
- relation_type: "form",
137
- like_status: "common",
122
+ resourceEntry.children = childResources.map(child => ({
123
+ relation_type: 'form',
124
+ like_status: 'common',
138
125
  id: child.resourceId,
139
- main_field: child.main_field || "",
126
+ main_field: child.main_field || '',
140
127
  form_id: child.form_id ?? child.formId,
141
128
  relation_id: child.resourceId,
142
129
  capacity: child.capacity ?? 1,
@@ -145,15 +132,15 @@ function buildVenueBookingEntry(params) {
145
132
  }
146
133
  return {
147
134
  schedule_event_id: null,
148
- appointment_status: "new",
149
- start_date: startMoment.format("YYYY-MM-DD"),
150
- start_time: startMoment.format("HH:mm"),
151
- end_date: endMoment.format("YYYY-MM-DD"),
152
- end_time: endMoment.format("HH:mm"),
153
- select_date: startMoment.format("YYYY-MM-DD"),
135
+ appointment_status: 'new',
136
+ start_date: startMoment.format('YYYY-MM-DD'),
137
+ start_time: startMoment.format('HH:mm'),
138
+ end_date: endMoment.format('YYYY-MM-DD'),
139
+ end_time: endMoment.format('HH:mm'),
140
+ select_date: startMoment.format('YYYY-MM-DD'),
154
141
  duration,
155
- sub_type: "minutes",
156
- like_status: "common",
142
+ sub_type: 'minutes',
143
+ like_status: 'common',
157
144
  number: 1,
158
145
  is_all: false,
159
146
  schedule_id: 0,
@@ -170,67 +157,62 @@ function buildVenueBookingEntry(params) {
170
157
  }
171
158
  };
172
159
  }
160
+
161
+ /**
162
+ * 从一条已合并的订单商品还原出独立的时段列表。
163
+ * 优先使用 metadata.price_breakdown 还原每个时段的精确价格,
164
+ * 回退到按 selling_price / slot_count 均分。
165
+ */
173
166
  function expandMergedSlotToIndividual(product, slotDurationMinutes) {
174
167
  const meta = product.metadata || {};
175
168
  const resourceId = meta.resource_id;
176
- if (resourceId == null)
177
- return [];
169
+ if (resourceId == null) return [];
178
170
  const startTime = meta.start_time;
179
171
  const endTime = meta.end_time;
180
- if (!startTime || !endTime)
181
- return [];
172
+ if (!startTime || !endTime) return [];
182
173
  const productId = Number(product.product_id);
183
174
  const breakdown = meta.price_breakdown;
184
175
  const result = [];
185
- let cursor = (0, import_dayjs.default)(startTime, "YYYY-MM-DD HH:mm");
186
- const end = (0, import_dayjs.default)(endTime, "YYYY-MM-DD HH:mm");
187
- if (breakdown == null ? void 0 : breakdown.length) {
188
- const priceMap = /* @__PURE__ */ new Map();
176
+ let cursor = (0, _dayjs.default)(startTime, 'YYYY-MM-DD HH:mm');
177
+ const end = (0, _dayjs.default)(endTime, 'YYYY-MM-DD HH:mm');
178
+ if (breakdown?.length) {
179
+ const priceMap = new Map();
189
180
  for (const entry of breakdown) {
190
- let entryCursor = (0, import_dayjs.default)(entry.start_time, "YYYY-MM-DD HH:mm");
191
- const entryEnd = (0, import_dayjs.default)(entry.end_time, "YYYY-MM-DD HH:mm");
181
+ let entryCursor = (0, _dayjs.default)(entry.start_time, 'YYYY-MM-DD HH:mm');
182
+ const entryEnd = (0, _dayjs.default)(entry.end_time, 'YYYY-MM-DD HH:mm');
192
183
  while (entryCursor.isBefore(entryEnd)) {
193
- priceMap.set(entryCursor.format("HH:mm"), entry.unit_price);
194
- entryCursor = entryCursor.add(slotDurationMinutes, "minute");
184
+ priceMap.set(entryCursor.format('HH:mm'), entry.unit_price);
185
+ entryCursor = entryCursor.add(slotDurationMinutes, 'minute');
195
186
  }
196
187
  }
197
188
  while (cursor.isBefore(end)) {
198
- const slotEnd = cursor.add(slotDurationMinutes, "minute");
199
- const hm = cursor.format("HH:mm");
189
+ const slotEnd = cursor.add(slotDurationMinutes, 'minute');
190
+ const hm = cursor.format('HH:mm');
200
191
  const price = priceMap.get(hm) ?? 0;
201
192
  result.push({
202
193
  resourceId,
203
194
  productId,
204
- startTime: cursor.format("YYYY-MM-DD HH:mm"),
205
- endTime: slotEnd.format("YYYY-MM-DD HH:mm"),
206
- price: new import_decimal.default(price).toFixed(2)
195
+ startTime: cursor.format('YYYY-MM-DD HH:mm'),
196
+ endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
197
+ price: new _decimal.default(price).toFixed(2)
207
198
  });
208
199
  cursor = slotEnd;
209
200
  }
210
201
  } else {
211
202
  const slotCount = meta.slot_count || 1;
212
- const totalPrice = new import_decimal.default(product.selling_price || "0");
203
+ const totalPrice = new _decimal.default(product.selling_price || '0');
213
204
  const perSlotPrice = slotCount > 0 ? totalPrice.div(slotCount).toFixed(2) : totalPrice.toFixed(2);
214
205
  while (cursor.isBefore(end)) {
215
- const slotEnd = cursor.add(slotDurationMinutes, "minute");
206
+ const slotEnd = cursor.add(slotDurationMinutes, 'minute');
216
207
  result.push({
217
208
  resourceId,
218
209
  productId,
219
- startTime: cursor.format("YYYY-MM-DD HH:mm"),
220
- endTime: slotEnd.format("YYYY-MM-DD HH:mm"),
210
+ startTime: cursor.format('YYYY-MM-DD HH:mm'),
211
+ endTime: slotEnd.format('YYYY-MM-DD HH:mm'),
221
212
  price: perSlotPrice
222
213
  });
223
214
  cursor = slotEnd;
224
215
  }
225
216
  }
226
217
  return result;
227
- }
228
- // Annotate the CommonJS export names for ESM import in node:
229
- 0 && (module.exports = {
230
- buildPriceBreakdown,
231
- buildVenueBookingEntry,
232
- buildVenueIdentityKey,
233
- buildVenueResourceMetadata,
234
- expandMergedSlotToIndividual,
235
- mergeConsecutiveSlots
236
- });
218
+ }