@pisell/pisellos 2.3.42 → 2.3.44

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 (157) hide show
  1. package/dist/modules/Discount/index.d.ts +1 -0
  2. package/dist/modules/Discount/index.js +40 -11
  3. package/dist/modules/Discount/types.d.ts +1 -0
  4. package/dist/modules/Holder/index.d.ts +48 -0
  5. package/dist/modules/Holder/index.js +640 -0
  6. package/dist/modules/Holder/types.d.ts +123 -0
  7. package/dist/modules/Holder/types.js +1 -0
  8. package/dist/modules/Holder/utils.d.ts +13 -0
  9. package/dist/modules/Holder/utils.js +34 -0
  10. package/dist/modules/OpenData/index.js +2 -2
  11. package/dist/modules/Order/index.d.ts +5 -2
  12. package/dist/modules/Order/index.js +127 -53
  13. package/dist/modules/Order/types.d.ts +11 -0
  14. package/dist/modules/Order/utils.d.ts +10 -0
  15. package/dist/modules/Order/utils.js +35 -3
  16. package/dist/modules/Payment/walletpass.d.ts +10 -3
  17. package/dist/modules/Payment/walletpass.js +425 -282
  18. package/dist/modules/Product/types.d.ts +1 -0
  19. package/dist/modules/ProductList/index.js +33 -14
  20. package/dist/modules/Quotation/index.d.ts +1 -1
  21. package/dist/modules/Quotation/index.js +2 -2
  22. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  23. package/dist/modules/ResourcePlanner/index.js +181 -0
  24. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  25. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  26. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  27. package/dist/modules/ResourcePlanner/types.js +1 -0
  28. package/dist/modules/Rules/index.d.ts +2 -0
  29. package/dist/modules/Rules/index.js +106 -68
  30. package/dist/modules/SalesSummary/index.js +12 -13
  31. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  32. package/dist/modules/ScanOrderLogger/index.js +15 -2
  33. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  34. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  35. package/dist/modules/Schedule/index.d.ts +3 -1
  36. package/dist/modules/Schedule/index.js +21 -16
  37. package/dist/modules/Summary/utils.js +38 -13
  38. package/dist/modules/index.d.ts +2 -0
  39. package/dist/modules/index.js +3 -1
  40. package/dist/plugins/window.d.ts +1 -0
  41. package/dist/server/index.d.ts +14 -0
  42. package/dist/server/index.js +772 -657
  43. package/dist/solution/BaseSales/index.d.ts +7 -0
  44. package/dist/solution/BaseSales/index.js +70 -45
  45. package/dist/solution/BaseSales/types.d.ts +3 -1
  46. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +6 -3
  47. package/dist/solution/BookingByStep/index.d.ts +17 -2
  48. package/dist/solution/BookingByStep/index.js +294 -215
  49. package/dist/solution/BookingByStep/types.d.ts +2 -1
  50. package/dist/solution/BookingByStep/types.js +3 -1
  51. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  52. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  53. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  54. package/dist/solution/BookingTicket/index.js +8 -5
  55. package/dist/solution/BookingTicket/types.d.ts +1 -0
  56. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +3 -3
  57. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  58. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  59. package/dist/solution/ScanOrder/index.d.ts +26 -14
  60. package/dist/solution/ScanOrder/index.js +1142 -739
  61. package/dist/solution/ScanOrder/types.d.ts +21 -1
  62. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  63. package/dist/solution/ScanOrder/utils.js +66 -25
  64. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  65. package/dist/solution/ShopDiscount/index.js +125 -87
  66. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  67. package/dist/solution/UnifiedBookingSales/index.js +1891 -0
  68. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  69. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  70. package/dist/solution/VenueBooking/index.d.ts +40 -11
  71. package/dist/solution/VenueBooking/index.js +1167 -841
  72. package/dist/solution/VenueBooking/types.d.ts +3 -0
  73. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  74. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  75. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  76. package/dist/solution/index.d.ts +1 -0
  77. package/dist/solution/index.js +2 -1
  78. package/dist/types/index.d.ts +1 -0
  79. package/lib/modules/Discount/index.d.ts +1 -0
  80. package/lib/modules/Discount/index.js +9 -0
  81. package/lib/modules/Discount/types.d.ts +1 -0
  82. package/lib/modules/Holder/index.d.ts +48 -0
  83. package/lib/modules/Holder/index.js +402 -0
  84. package/lib/modules/Holder/types.d.ts +123 -0
  85. package/lib/modules/Holder/types.js +17 -0
  86. package/lib/modules/Holder/utils.d.ts +13 -0
  87. package/lib/modules/Holder/utils.js +71 -0
  88. package/lib/modules/OpenData/index.js +1 -1
  89. package/lib/modules/Order/index.d.ts +5 -2
  90. package/lib/modules/Order/index.js +72 -17
  91. package/lib/modules/Order/types.d.ts +11 -0
  92. package/lib/modules/Order/utils.d.ts +10 -0
  93. package/lib/modules/Order/utils.js +36 -5
  94. package/lib/modules/Payment/walletpass.d.ts +10 -3
  95. package/lib/modules/Payment/walletpass.js +218 -56
  96. package/lib/modules/Product/types.d.ts +1 -0
  97. package/lib/modules/ProductList/index.js +40 -31
  98. package/lib/modules/Quotation/index.d.ts +1 -1
  99. package/lib/modules/Quotation/index.js +2 -2
  100. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  101. package/lib/modules/ResourcePlanner/index.js +148 -0
  102. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  103. package/lib/modules/ResourcePlanner/planner.js +933 -0
  104. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  105. package/lib/modules/ResourcePlanner/types.js +17 -0
  106. package/lib/modules/Rules/index.d.ts +2 -0
  107. package/lib/modules/Rules/index.js +41 -19
  108. package/lib/modules/SalesSummary/index.js +6 -7
  109. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  110. package/lib/modules/ScanOrderLogger/index.js +13 -1
  111. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  112. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  113. package/lib/modules/Schedule/index.d.ts +3 -1
  114. package/lib/modules/Schedule/index.js +10 -8
  115. package/lib/modules/Summary/utils.js +21 -1
  116. package/lib/modules/index.d.ts +2 -0
  117. package/lib/modules/index.js +5 -1
  118. package/lib/plugins/window.d.ts +1 -0
  119. package/lib/server/index.d.ts +14 -0
  120. package/lib/server/index.js +65 -5
  121. package/lib/solution/BaseSales/index.d.ts +7 -0
  122. package/lib/solution/BaseSales/index.js +25 -8
  123. package/lib/solution/BaseSales/types.d.ts +3 -1
  124. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +3 -2
  125. package/lib/solution/BookingByStep/index.d.ts +17 -2
  126. package/lib/solution/BookingByStep/index.js +60 -18
  127. package/lib/solution/BookingByStep/types.d.ts +2 -1
  128. package/lib/solution/BookingByStep/types.js +5 -0
  129. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  130. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  131. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  132. package/lib/solution/BookingTicket/index.js +11 -2
  133. package/lib/solution/BookingTicket/types.d.ts +1 -0
  134. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +2 -2
  135. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  136. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  137. package/lib/solution/ScanOrder/index.d.ts +26 -14
  138. package/lib/solution/ScanOrder/index.js +449 -182
  139. package/lib/solution/ScanOrder/types.d.ts +21 -1
  140. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  141. package/lib/solution/ScanOrder/utils.js +31 -0
  142. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  143. package/lib/solution/ShopDiscount/index.js +14 -0
  144. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  145. package/lib/solution/UnifiedBookingSales/index.js +1084 -0
  146. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  147. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  148. package/lib/solution/VenueBooking/index.d.ts +40 -11
  149. package/lib/solution/VenueBooking/index.js +322 -110
  150. package/lib/solution/VenueBooking/types.d.ts +3 -0
  151. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  152. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  153. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  154. package/lib/solution/index.d.ts +1 -0
  155. package/lib/solution/index.js +3 -1
  156. package/lib/types/index.d.ts +1 -0
  157. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ export type ResourcePlannerMode = 'appointment' | 'scan_order' | 'venue_grid';
2
+ export type ResourcePlannerProductKind = 'normal' | 'duration' | 'session' | 'venue_slot';
3
+ export type ResourcePlannerResourceType = 'single' | 'multiple' | 'capacity';
4
+ export type ResourcePlannerStatus = 'available' | 'limited' | 'full' | 'conflict' | 'unavailable' | 'past';
5
+ export interface ResourcePlannerTimeRange {
6
+ start_at: string;
7
+ end_at: string;
8
+ }
9
+ export interface ResourcePlannerEvent extends ResourcePlannerTimeRange {
10
+ resourceId?: number | string;
11
+ resource_id?: number | string;
12
+ pax?: number;
13
+ product_uid?: string;
14
+ source?: 'remote' | 'cart' | 'selection';
15
+ [key: string]: any;
16
+ }
17
+ export interface ResourcePlannerResourceRequirement {
18
+ formId?: number | string;
19
+ resourceIds?: Array<number | string>;
20
+ resourceType?: ResourcePlannerResourceType;
21
+ capacityRequired?: number;
22
+ required?: boolean;
23
+ }
24
+ export interface ResourcePlannerProduct {
25
+ id: number | string;
26
+ title?: string;
27
+ kind: ResourcePlannerProductKind;
28
+ durationMinutes?: number;
29
+ schedule?: ResourcePlannerTimeRange[];
30
+ resourceRequirements?: ResourcePlannerResourceRequirement[];
31
+ capacityRequired?: number;
32
+ quantity?: number;
33
+ price?: string | number | null;
34
+ raw?: Record<string, any>;
35
+ }
36
+ export interface ResourcePlannerResource {
37
+ id: number | string;
38
+ formId?: number | string;
39
+ name?: string;
40
+ resourceType: ResourcePlannerResourceType;
41
+ capacity: number;
42
+ times: Array<ResourcePlannerTimeRange & {
43
+ event_list?: ResourcePlannerEvent[];
44
+ [key: string]: any;
45
+ }>;
46
+ childResourceIds?: Array<number | string>;
47
+ raw?: Record<string, any>;
48
+ }
49
+ export interface ResourcePlannerContextInput {
50
+ products?: ResourcePlannerProduct[];
51
+ resources?: ResourcePlannerResource[];
52
+ externalEvents?: ResourcePlannerEvent[];
53
+ slotDurationMinutes?: number;
54
+ businessStartTime?: string;
55
+ businessEndTime?: string;
56
+ }
57
+ export interface ResourcePlannerQuery {
58
+ mode?: ResourcePlannerMode;
59
+ productIds?: Array<number | string>;
60
+ date?: string;
61
+ dateRange?: {
62
+ start: string;
63
+ end: string;
64
+ };
65
+ startTime?: string;
66
+ endTime?: string;
67
+ resourceIds?: Array<number | string>;
68
+ serviceObjectIds?: Array<number | string>;
69
+ holderIds?: Array<number | string>;
70
+ pax?: number;
71
+ slotDurationMinutes?: number;
72
+ }
73
+ export interface ResourcePlannerSelection {
74
+ productIds: Array<number | string>;
75
+ date?: string;
76
+ startTime?: string;
77
+ endTime?: string;
78
+ resourceIds: Array<number | string>;
79
+ assignments: ResourcePlannerAssignment[];
80
+ mode?: ResourcePlannerMode;
81
+ }
82
+ export interface ResourcePlannerSelectionPatch extends Partial<ResourcePlannerSelection> {
83
+ replaceAssignments?: boolean;
84
+ }
85
+ export interface ResourcePlannerDemandInterval {
86
+ id: string;
87
+ productId: number | string;
88
+ source: Extract<ResourcePlannerProductKind, 'duration' | 'session' | 'venue_slot'>;
89
+ date: string;
90
+ start_at: string;
91
+ end_at: string;
92
+ durationMinutes: number;
93
+ quantity: number;
94
+ capacityRequired: number;
95
+ resourceRequirements: ResourcePlannerResourceRequirement[];
96
+ }
97
+ export interface ResourcePlannerConflict {
98
+ type: 'outside_resource_time' | 'remote_event_overlap' | 'cart_overlap' | 'capacity_full' | 'missing_time' | 'missing_resource' | 'missing_assignment' | 'past';
99
+ message: string;
100
+ event?: ResourcePlannerEvent;
101
+ resourceId?: number | string;
102
+ productId?: number | string;
103
+ }
104
+ export interface ResourcePlannerAvailabilityCell {
105
+ key: string;
106
+ productId: number | string;
107
+ resourceId?: number | string;
108
+ date?: string;
109
+ start_at: string;
110
+ end_at: string;
111
+ startTime?: string;
112
+ endTime?: string;
113
+ durationMinutes?: number;
114
+ cellType: 'availability_range' | 'fixed_interval' | 'unavailable';
115
+ status: ResourcePlannerStatus;
116
+ remainingCapacity?: number;
117
+ maxCapacity?: number;
118
+ reasonCodes: string[];
119
+ conflicts: ResourcePlannerConflict[];
120
+ }
121
+ export interface ResourcePlannerProductOption {
122
+ productId: number | string;
123
+ title?: string;
124
+ status: ResourcePlannerStatus;
125
+ reasonCodes: string[];
126
+ }
127
+ export interface ResourcePlannerResourceOption {
128
+ resourceId: number | string;
129
+ resourceName?: string;
130
+ resourceFormId?: number | string;
131
+ resourceType: ResourcePlannerResourceType;
132
+ status: ResourcePlannerStatus;
133
+ remainingCapacity?: number;
134
+ maxCapacity?: number;
135
+ reasonCodes: string[];
136
+ }
137
+ export interface ResourcePlannerDateSummary {
138
+ date: string;
139
+ status: ResourcePlannerStatus;
140
+ availableCount: number;
141
+ totalCount: number;
142
+ }
143
+ export interface ResourcePlannerTimeSlot {
144
+ startTime: string;
145
+ endTime: string;
146
+ status: ResourcePlannerStatus;
147
+ resourceId: number | string;
148
+ productId?: number | string;
149
+ remainingCapacity?: number;
150
+ maxCapacity?: number;
151
+ reasonCodes: string[];
152
+ }
153
+ export interface ResourcePlannerTimeGridRow {
154
+ resourceId: number | string;
155
+ resourceName?: string;
156
+ resourceFormId?: number | string;
157
+ slots: ResourcePlannerTimeSlot[];
158
+ }
159
+ export interface ResourcePlannerTimeGrid {
160
+ date?: string;
161
+ timeLabels: string[];
162
+ resources: ResourcePlannerTimeGridRow[];
163
+ }
164
+ export interface ResourcePlannerProjection {
165
+ query: ResourcePlannerQuery;
166
+ demandIntervals: ResourcePlannerDemandInterval[];
167
+ productOptions: ResourcePlannerProductOption[];
168
+ resourceOptions: ResourcePlannerResourceOption[];
169
+ dateSummary: ResourcePlannerDateSummary[];
170
+ timeGrid: ResourcePlannerTimeGrid;
171
+ cells: ResourcePlannerAvailabilityCell[];
172
+ }
173
+ export interface ResourcePlannerAssignment {
174
+ productId: number | string;
175
+ resourceId: number | string;
176
+ start_at: string;
177
+ end_at: string;
178
+ capacityRequired?: number;
179
+ }
180
+ export interface ResourcePlannerAssignableSlotResource {
181
+ resourceId: number | string;
182
+ resourceName?: string;
183
+ resourceFormId?: number | string;
184
+ resourceType?: ResourcePlannerResourceType;
185
+ capacityRequired?: number;
186
+ remainingCapacity?: number;
187
+ maxCapacity?: number;
188
+ }
189
+ export interface ResourcePlannerAssignableSlot {
190
+ key: string;
191
+ productId: number | string;
192
+ date: string;
193
+ start_at: string;
194
+ end_at: string;
195
+ startTime: string;
196
+ endTime: string;
197
+ durationMinutes: number;
198
+ status: ResourcePlannerStatus;
199
+ resources: ResourcePlannerAssignableSlotResource[];
200
+ assignments: ResourcePlannerAssignment[];
201
+ conflicts: ResourcePlannerConflict[];
202
+ }
203
+ export interface ResourcePlannerAssignableSlotResult {
204
+ projection: ResourcePlannerProjection;
205
+ slots: ResourcePlannerAssignableSlot[];
206
+ conflicts: ResourcePlannerConflict[];
207
+ }
208
+ export interface ResourcePlannerAssignmentResult {
209
+ assignments: ResourcePlannerAssignment[];
210
+ conflicts: ResourcePlannerConflict[];
211
+ }
212
+ export interface ResourcePlannerValidationResult {
213
+ ok: boolean;
214
+ conflicts: ResourcePlannerConflict[];
215
+ }
216
+ export interface ResourcePlannerSnapshot {
217
+ context: Required<ResourcePlannerContextInput>;
218
+ selection: ResourcePlannerSelection;
219
+ projection: ResourcePlannerProjection | null;
220
+ version: number;
221
+ }
222
+ export interface ResourcePlannerState {
223
+ context: Required<ResourcePlannerContextInput>;
224
+ selection: ResourcePlannerSelection;
225
+ projection: ResourcePlannerProjection | null;
226
+ version: number;
227
+ }
@@ -0,0 +1,17 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+
15
+ // src/modules/ResourcePlanner/types.ts
16
+ var types_exports = {};
17
+ module.exports = __toCommonJS(types_exports);
@@ -27,6 +27,8 @@ export declare class RulesModule extends BaseModule implements Module, RulesModu
27
27
  }): {
28
28
  isAvailable: boolean;
29
29
  discountList: Discount[];
30
+ /** 完整规则计算后的列表;调用方可用于保留暂时无适用商品的扫码卡券。 */
31
+ evaluatedDiscountList?: Discount[];
30
32
  productList: any[];
31
33
  unavailableReason?: UnavailableReason;
32
34
  };
@@ -94,7 +94,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
94
94
  productList
95
95
  };
96
96
  }
97
- if (productList.every((item) => {
97
+ if (productList.length > 0 && productList.every((item) => {
98
98
  var _a;
99
99
  const product = this.hooks.getProduct(item);
100
100
  return product.booking_id && (((_a = product.discount_list) == null ? void 0 : _a.length) || product.total == 0);
@@ -152,6 +152,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
152
152
  return {
153
153
  isAvailable: hasApplicableDiscount,
154
154
  discountList: hasApplicableDiscount ? result.discountList : oldDiscountList,
155
+ evaluatedDiscountList: result.discountList,
155
156
  productList: hasApplicableDiscount ? result.productList : productList,
156
157
  unavailableReason
157
158
  };
@@ -181,9 +182,13 @@ var RulesModule = class extends import_BaseModule.BaseModule {
181
182
  getUnavailableReason(discountList, productList) {
182
183
  var _a;
183
184
  for (const discount of discountList) {
184
- for (const item of productList) {
185
+ const bookingTimes = productList.length ? productList.map((item) => {
185
186
  const product = this.hooks.getProduct(item);
186
- const bookingTime = ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format("YYYY-MM-DD HH:mm:ss");
187
+ return ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format(
188
+ "YYYY-MM-DD HH:mm:ss"
189
+ );
190
+ }) : [(0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")];
191
+ for (const bookingTime of bookingTimes) {
187
192
  const filteredList = (0, import_utils.filterDiscountListByBookingTime)([discount], bookingTime);
188
193
  if (filteredList.length === 0) {
189
194
  return import_types.UnavailableReason.TimeLimit;
@@ -300,7 +305,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
300
305
  _id: product._id,
301
306
  parentId: product._id,
302
307
  quantity: product.quantity,
303
- num: product.num
308
+ num: product.num,
309
+ booking_id: product.booking_id
304
310
  });
305
311
  if (product.bundle && Array.isArray(product.bundle) && product.bundle.length > 0) {
306
312
  product.bundle.forEach((bundleItem, bundleIndex) => {
@@ -321,7 +327,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
321
327
  origin_total: new import_decimal.default(bundleItem.price || 0).mul(bundleItem.num || 1).toNumber(),
322
328
  original_price: bundleItem.original_price,
323
329
  // 继承主商品属性
324
- booking_id: product.booking_id,
330
+ booking_id: bundleItem.booking_id,
325
331
  discount_list: bundleItem.discount_list || []
326
332
  });
327
333
  });
@@ -683,7 +689,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
683
689
  discount_product_id: discount.product_id
684
690
  },
685
691
  metadata: {
686
- num
692
+ num,
693
+ discount_rule_uncheck_flag: discount == null ? void 0 : discount.discount_rule_uncheck_flag
687
694
  }
688
695
  };
689
696
  applicableProducts.push(productData);
@@ -1131,6 +1138,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1131
1138
  config: selectedDiscount2 == null ? void 0 : selectedDiscount2.config,
1132
1139
  metadata: {
1133
1140
  num: 1,
1141
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1134
1142
  // 🔥 order_level 分摊差值
1135
1143
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference },
1136
1144
  /** 仅主商品上的优惠金额(不含 option) */
@@ -1211,6 +1219,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1211
1219
  metadata: {
1212
1220
  // 🔥 使用拆分后的唯一 _id
1213
1221
  custom_product_bundle_map_id: uniqueId,
1222
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1214
1223
  num: 1
1215
1224
  },
1216
1225
  _num: 1,
@@ -1240,7 +1249,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1240
1249
  _id: `${flatItem._id}_split_rest`,
1241
1250
  num: normalNum,
1242
1251
  quantity: normalNum,
1243
- discount_list: [],
1252
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
1244
1253
  processed: true
1245
1254
  });
1246
1255
  }
@@ -1289,6 +1298,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1289
1298
  metadata: {
1290
1299
  // 🔥 使用唯一的 _id
1291
1300
  custom_product_bundle_map_id: uniqueId,
1301
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1292
1302
  num: product.num || 1,
1293
1303
  // 🔥 order_level 分摊差值
1294
1304
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
@@ -1303,7 +1313,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1303
1313
  ...flatItem,
1304
1314
  total: targetProductTotal,
1305
1315
  price: new import_decimal.default(productOriginTotal || 0).minus(fixedAmountPerItem).toNumber(),
1306
- discount_list: [discountDetail],
1316
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion").concat([discountDetail]),
1307
1317
  processed: true
1308
1318
  });
1309
1319
  }
@@ -1724,7 +1734,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1724
1734
  * @returns 是否可用
1725
1735
  */
1726
1736
  checkPackageSubItemUsageRules(discount, flatItem) {
1727
- var _a, _b, _c, _d, _e, _f, _g;
1737
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1728
1738
  const limitedData = discount.limited_relation_product_data;
1729
1739
  const usageRules = limitedData == null ? void 0 : limitedData.package_sub_item_usage_rules;
1730
1740
  const rules = ["original_price", ...(usageRules == null ? void 0 : usageRules.rules) || []];
@@ -1736,6 +1746,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1736
1746
  const { type: scopeType, exclude_bundle_product_ids = [], include_bundle_product_ids = [], filter = 0 } = packageScope || {};
1737
1747
  const isMainProduct = flatItem.type === "main";
1738
1748
  const isBundleItem = flatItem.type === "bundle";
1749
+ const bundleMainProductId = (_a = flatItem.product) == null ? void 0 : _a.product_id;
1739
1750
  if (isMainProduct) {
1740
1751
  return true;
1741
1752
  }
@@ -1744,9 +1755,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1744
1755
  return true;
1745
1756
  }
1746
1757
  if (isBundleItem) {
1747
- const priceType = (_a = flatItem.bundleItem) == null ? void 0 : _a.price_type;
1748
- const priceTypeExt = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type_ext;
1749
- const mainProductId = ((_d = (_c = flatItem == null ? void 0 : flatItem.originProduct) == null ? void 0 : _c._productOrigin) == null ? void 0 : _d.id) || ((_e = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _e.id) || 0;
1758
+ const priceType = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type;
1759
+ const priceTypeExt = (_c = flatItem.bundleItem) == null ? void 0 : _c.price_type_ext;
1760
+ const mainProductId = ((_e = (_d = flatItem == null ? void 0 : flatItem.originProduct) == null ? void 0 : _d._productOrigin) == null ? void 0 : _e.id) || ((_f = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _f.id) || 0;
1750
1761
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1751
1762
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1752
1763
  if (rules.length > 0) {
@@ -1758,11 +1769,11 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1758
1769
  if (!filter) {
1759
1770
  isScopeValid = true;
1760
1771
  } else {
1761
- isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
1772
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
1762
1773
  }
1763
1774
  }
1764
1775
  if (scopeType === "specific_packages" || scopeType === "products") {
1765
- isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
1776
+ isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
1766
1777
  }
1767
1778
  if (isPriceValid && isScopeValid) {
1768
1779
  return true;
@@ -1778,15 +1789,26 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1778
1789
  return false;
1779
1790
  }
1780
1791
  if (isBundleItem) {
1781
- const priceType = (_f = flatItem.bundleItem) == null ? void 0 : _f.price_type;
1782
- const priceTypeExt = (_g = flatItem.bundleItem) == null ? void 0 : _g.price_type_ext;
1792
+ const priceType = (_g = flatItem.bundleItem) == null ? void 0 : _g.price_type;
1793
+ const priceTypeExt = (_h = flatItem.bundleItem) == null ? void 0 : _h.price_type_ext;
1783
1794
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1784
1795
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1785
1796
  if (rules.length > 0) {
1786
- if (isOriginalPrice && rules.includes("original_price")) {
1787
- return true;
1797
+ const _isOriginalPrice = isOriginalPrice && rules.includes("original_price");
1798
+ const _isMarkupPrice = isMarkupPrice && rules.includes("markup_price");
1799
+ const isPriceValid = _isOriginalPrice || _isMarkupPrice;
1800
+ let isScopeValid = false;
1801
+ if (scopeType === "all_packages" || scopeType === "product_all") {
1802
+ if (!filter) {
1803
+ isScopeValid = true;
1804
+ } else {
1805
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
1806
+ }
1788
1807
  }
1789
- if (isMarkupPrice && rules.includes("markup_price")) {
1808
+ if (scopeType === "specific_packages" || scopeType === "products") {
1809
+ isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
1810
+ }
1811
+ if (isPriceValid && isScopeValid) {
1790
1812
  return true;
1791
1813
  }
1792
1814
  return false;
@@ -53,9 +53,6 @@ var SalesSummaryModule = class extends import_BaseModule.BaseModule {
53
53
  this.store.surchargeList = ((_a = options.initialState) == null ? void 0 : _a.surchargeList) || [];
54
54
  this.store.summary = ((_b = options.initialState) == null ? void 0 : _b.summary) || (0, import_utils.createEmptySalesSummary)();
55
55
  this.surchargeListModuleName = ((_c = this.otherParams) == null ? void 0 : _c.surchargeListModuleName) || "surchargeList";
56
- if (!this.appPlugin) {
57
- throw new Error("SalesSummaryModule 需要 app 插件支持");
58
- }
59
56
  if (!this.request) {
60
57
  throw new Error("SalesSummaryModule 需要 request 插件支持");
61
58
  }
@@ -109,12 +106,14 @@ var SalesSummaryModule = class extends import_BaseModule.BaseModule {
109
106
  }
110
107
  }
111
108
  getAppData(key) {
112
- var _a, _b, _c, _d, _e, _f;
113
- const getData = (_b = (_a = this.appPlugin).getData) == null ? void 0 : _b.call(_a);
109
+ var _a, _b, _c, _d, _e, _f, _g, _h;
110
+ const getData = (_b = (_a = this.appPlugin) == null ? void 0 : _a.getData) == null ? void 0 : _b.call(_a);
114
111
  if (typeof getData === "function")
115
112
  return getData(key);
116
- const app = this.appPlugin.getApp();
117
- const coreData = (_f = (_d = (_c = app == null ? void 0 : app.models) == null ? void 0 : _c.getStore) == null ? void 0 : (_e = _d.call(_c)).getDataByModel) == null ? void 0 : _f.call(_e, "core", "core");
113
+ const app = (_d = (_c = this.appPlugin) == null ? void 0 : _c.getApp) == null ? void 0 : _d.call(_c);
114
+ if (!app)
115
+ return void 0;
116
+ const coreData = (_h = (_f = (_e = app == null ? void 0 : app.models) == null ? void 0 : _e.getStore) == null ? void 0 : (_g = _f.call(_e)).getDataByModel) == null ? void 0 : _h.call(_g, "core", "core");
118
117
  return coreData == null ? void 0 : coreData[key];
119
118
  }
120
119
  getTaxConfig() {
@@ -11,10 +11,12 @@ export declare class ScanOrderLoggerModule extends BaseModule implements Module,
11
11
  protected defaultName: string;
12
12
  protected defaultVersion: string;
13
13
  private store;
14
+ private window?;
14
15
  initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
15
16
  setContext(context: ScanOrderLoggerContext): void;
16
17
  setProvider(provider: ScanOrderLoggerProviderType): void;
17
18
  setProviderConfig(providerConfig: ScanOrderLoggerProviderConfig): void;
19
+ private getCurrentHost;
18
20
  private buildRecord;
19
21
  addLog(params: ScanOrderLogInput): Promise<void>;
20
22
  }
@@ -60,6 +60,7 @@ var ScanOrderLoggerModule = class extends import_BaseModule.BaseModule {
60
60
  var _a, _b, _c;
61
61
  this.core = core;
62
62
  this.store = options.store;
63
+ this.window = core.getPlugin("window") || void 0;
63
64
  const provider = ((_a = options.otherParams) == null ? void 0 : _a.provider) || "feishu";
64
65
  const providerConfig = ((_b = options.otherParams) == null ? void 0 : _b.providerConfig) || {};
65
66
  const context = ((_c = options.otherParams) == null ? void 0 : _c.context) || {};
@@ -101,14 +102,25 @@ var ScanOrderLoggerModule = class extends import_BaseModule.BaseModule {
101
102
  }
102
103
  };
103
104
  }
105
+ getCurrentHost() {
106
+ var _a, _b;
107
+ const host = (_b = (_a = this.window) == null ? void 0 : _a.location) == null ? void 0 : _b.host;
108
+ if (typeof host === "string" && host.length > 0)
109
+ return host;
110
+ return void 0;
111
+ }
104
112
  buildRecord(params) {
113
+ const host = this.getCurrentHost();
105
114
  return {
106
115
  level: params.level || "info",
107
116
  title: params.title,
108
117
  timestamp: params.timestamp || (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss"),
109
118
  payload: params.payload || {},
110
119
  extra: params.extra || {},
111
- context: this.store.context || {}
120
+ context: {
121
+ ...this.store.context || {},
122
+ ...host ? { host } : {}
123
+ }
112
124
  };
113
125
  }
114
126
  async addLog(params) {
@@ -112,20 +112,29 @@ async function flushQueue() {
112
112
  }
113
113
  var feishuLoggerProvider = {
114
114
  async send(payload) {
115
- var _a, _b, _c, _d;
115
+ var _a, _b, _c, _d, _e, _f;
116
116
  cachedProviderConfig = payload.providerConfig;
117
117
  const webhook = (_b = (_a = payload.providerConfig) == null ? void 0 : _a.feishu) == null ? void 0 : _b.webhook;
118
+ const errorHook = (_d = (_c = payload.providerConfig) == null ? void 0 : _c.feishu) == null ? void 0 : _d.errorHook;
119
+ if (typeof fetch !== "function") {
120
+ console.warn("[ScanOrderLogger] 当前环境不支持 fetch,跳过 Feishu 日志上报");
121
+ return;
122
+ }
123
+ if (payload.record.level === "error" && isWebhookUsable(errorHook)) {
124
+ try {
125
+ await postToFeishu(errorHook, buildFeishuBody([payload.record]));
126
+ } catch (error) {
127
+ console.warn("[ScanOrderLogger] Feishu errorHook 上报失败", error);
128
+ }
129
+ return;
130
+ }
118
131
  if (!webhook) {
119
132
  console.warn("[ScanOrderLogger] Feishu webhook 未配置,跳过日志上报");
120
133
  return;
121
134
  }
122
135
  if (!isWebhookUsable(webhook))
123
136
  return;
124
- if (typeof fetch !== "function") {
125
- console.warn("[ScanOrderLogger] 当前环境不支持 fetch,跳过 Feishu 日志上报");
126
- return;
127
- }
128
- const throttleMs = ((_d = (_c = payload.providerConfig) == null ? void 0 : _c.feishu) == null ? void 0 : _d.throttleMs) ?? DEFAULT_THROTTLE_MS;
137
+ const throttleMs = ((_f = (_e = payload.providerConfig) == null ? void 0 : _e.feishu) == null ? void 0 : _f.throttleMs) ?? DEFAULT_THROTTLE_MS;
129
138
  if (throttleMs <= 0) {
130
139
  try {
131
140
  await postToFeishu(webhook, buildFeishuBody([payload.record]));
@@ -2,6 +2,7 @@ export type ScanOrderLogLevel = 'info' | 'warning' | 'error' | 'debug';
2
2
  export type ScanOrderLoggerProviderType = 'feishu' | 'grafana';
3
3
  export interface ScanOrderLoggerProviderFeishuConfig {
4
4
  webhook?: string;
5
+ errorHook?: string;
5
6
  /**
6
7
  * 节流窗口毫秒数,默认 3000ms
7
8
  * - >0:首条日志进入队列并启动定时器,窗口结束后合并成一条 Feishu post 统一发送
@@ -24,7 +24,9 @@ export declare class ScheduleModule extends BaseModule implements Module, Schedu
24
24
  *
25
25
  * @memberof ScheduleModule
26
26
  */
27
- loadAllSchedule(): Promise<void>;
27
+ loadAllSchedule(options?: {
28
+ useCache?: boolean;
29
+ }): Promise<void>;
28
30
  setScheduleList(list: ScheduleItem[]): void;
29
31
  private syncScheduleMap;
30
32
  getScheduleList(): ScheduleItem[];
@@ -95,12 +95,12 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
95
95
  *
96
96
  * @memberof ScheduleModule
97
97
  */
98
- async loadAllSchedule() {
98
+ async loadAllSchedule(options = {}) {
99
99
  var _a;
100
100
  const scheduleList = await this.request.get(
101
101
  `/schedule`,
102
102
  { num: 999 },
103
- { useCache: true }
103
+ { useCache: options.useCache ?? true }
104
104
  );
105
105
  this.setScheduleList(((_a = scheduleList.data) == null ? void 0 : _a.list) || []);
106
106
  }
@@ -126,7 +126,6 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
126
126
  custom_page_id,
127
127
  channel
128
128
  }) {
129
- var _a, _b, _c;
130
129
  if ((0, import_dayjs.default)(startDate).isBefore((0, import_dayjs.default)(), "day")) {
131
130
  startDate = (0, import_dayjs.default)().format("YYYY-MM-DD");
132
131
  }
@@ -144,17 +143,20 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
144
143
  channel
145
144
  }
146
145
  );
147
- this.setAvailabilityScheduleDateList(res.data.date_list);
148
- this.setOtherProductsIds(res.data.other_product_ids || []);
149
- if (!((_a = res.data.date_list) == null ? void 0 : _a.length) && !((_b = res.data.other_product_ids) == null ? void 0 : _b.length) || (0, import_dayjs.default)(endDate).isBefore((0, import_dayjs.default)(), "day")) {
146
+ const responseData = res.data || {};
147
+ const dateList = Array.isArray(responseData.date_list) ? responseData.date_list : [];
148
+ const otherProductIds = Array.isArray(responseData.other_product_ids) ? responseData.other_product_ids : [];
149
+ this.setAvailabilityScheduleDateList(dateList);
150
+ this.setOtherProductsIds(otherProductIds);
151
+ if (!dateList.length && !otherProductIds.length || (0, import_dayjs.default)(endDate).isBefore((0, import_dayjs.default)(), "day")) {
150
152
  return dates;
151
153
  }
152
- if ((_c = res.data.other_product_ids) == null ? void 0 : _c.length) {
154
+ if (otherProductIds.length) {
153
155
  dates.forEach((n) => {
154
156
  n.status = "available";
155
157
  });
156
158
  } else {
157
- res.data.date_list.forEach((n) => {
159
+ dateList.forEach((n) => {
158
160
  const index = dates.findIndex((m) => m.date === n.date);
159
161
  if (index !== -1) {
160
162
  dates[index].status = "available";
@@ -437,11 +437,31 @@ var getBundleItemIsDiscountPrice = (item) => {
437
437
  var getBundleItemIsMarkupOrDiscountPrice = (item) => {
438
438
  return getBundleItemIsMarkupPrice(item) || getBundleItemIsDiscountPrice(item);
439
439
  };
440
+ var getDiscountAmount = (discounts) => {
441
+ return (discounts || []).reduce((total, discount) => {
442
+ return total.add(new import_decimal.default(discount.amount || 0));
443
+ }, new import_decimal.default(0)).toNumber();
444
+ };
440
445
  var getMainProductTotal = (item) => {
441
- var _a, _b;
446
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
442
447
  let total = new import_decimal.default(
443
448
  (item == null ? void 0 : item.main_product_selling_price) ?? ((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.main_product_selling_price) ?? ((_b = item == null ? void 0 : item.metadata) == null ? void 0 : _b.main_product_original_price) ?? 0
444
449
  );
450
+ const hasMainProductPrice = (item == null ? void 0 : item.main_product_selling_price) != null || ((_c = item == null ? void 0 : item.metadata) == null ? void 0 : _c.main_product_selling_price) != null || ((_d = item == null ? void 0 : item.metadata) == null ? void 0 : _d.main_product_original_price) != null;
451
+ if (!hasMainProductPrice) {
452
+ total = new import_decimal.default((item == null ? void 0 : item.main_product_selling_price) ?? ((_e = item == null ? void 0 : item.metadata) == null ? void 0 : _e.main_product_selling_price) ?? item.price ?? 0);
453
+ const discount = ((_g = (_f = item == null ? void 0 : item._origin) == null ? void 0 : _f.product) == null ? void 0 : _g.discount_list) || ((_j = (_i = (_h = item == null ? void 0 : item._originData) == null ? void 0 : _h.product) == null ? void 0 : _i.discount_list) == null ? void 0 : _j.filter((item2) => {
454
+ var _a2;
455
+ return !((_a2 = item2 == null ? void 0 : item2.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
456
+ })) || [];
457
+ const mainProductDiscountAmount = getDiscountAmount(discount);
458
+ total = total.minus(mainProductDiscountAmount);
459
+ if ((item == null ? void 0 : item.option) && Array.isArray(item == null ? void 0 : item.option)) {
460
+ total = total.add(item == null ? void 0 : item.option.reduce((t, option) => {
461
+ return t.add(new import_decimal.default(option.price || 0).mul(option.num || 1));
462
+ }, new import_decimal.default(0)));
463
+ }
464
+ }
445
465
  for (let bundleItem of (item == null ? void 0 : item.bundle) || []) {
446
466
  if (getBundleItemIsMarkupOrDiscountPrice(bundleItem)) {
447
467
  const bundleItemTotal = new import_decimal.default(bundleItem.bundle_selling_price ?? bundleItem.price ?? 0);
@@ -18,3 +18,5 @@ export * from './Quotation';
18
18
  export * from './ScanOrderLogger';
19
19
  export * from './OpenData';
20
20
  export * from './BookingContext';
21
+ export * from './Holder';
22
+ export * from './ResourcePlanner';