@pisell/pisellos 2.3.53 → 2.3.55

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 (149) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  2. package/dist/modules/Discount/index.d.ts +1 -0
  3. package/dist/modules/Discount/index.js +40 -11
  4. package/dist/modules/Discount/types.d.ts +1 -0
  5. package/dist/modules/Holder/index.d.ts +48 -0
  6. package/dist/modules/Holder/index.js +640 -0
  7. package/dist/modules/Holder/types.d.ts +123 -0
  8. package/dist/modules/Holder/types.js +1 -0
  9. package/dist/modules/Holder/utils.d.ts +13 -0
  10. package/dist/modules/Holder/utils.js +34 -0
  11. package/dist/modules/OpenData/index.js +2 -2
  12. package/dist/modules/Order/index.d.ts +4 -2
  13. package/dist/modules/Order/index.js +66 -34
  14. package/dist/modules/Order/types.d.ts +9 -0
  15. package/dist/modules/Order/utils.d.ts +10 -0
  16. package/dist/modules/Order/utils.js +35 -3
  17. package/dist/modules/Product/types.d.ts +1 -0
  18. package/dist/modules/ProductList/index.js +34 -15
  19. package/dist/modules/Quotation/index.d.ts +1 -1
  20. package/dist/modules/Quotation/index.js +2 -2
  21. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  22. package/dist/modules/ResourcePlanner/index.js +181 -0
  23. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  24. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  25. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  26. package/dist/modules/ResourcePlanner/types.js +1 -0
  27. package/dist/modules/Rules/index.js +47 -13
  28. package/dist/modules/SalesSummary/index.js +12 -13
  29. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  30. package/dist/modules/ScanOrderLogger/index.js +15 -2
  31. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  32. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  33. package/dist/modules/Schedule/index.d.ts +3 -1
  34. package/dist/modules/Schedule/index.js +21 -16
  35. package/dist/modules/Summary/utils.js +38 -13
  36. package/dist/modules/index.d.ts +2 -0
  37. package/dist/modules/index.js +3 -1
  38. package/dist/plugins/window.d.ts +1 -0
  39. package/dist/server/index.d.ts +14 -0
  40. package/dist/server/index.js +907 -793
  41. package/dist/solution/BaseSales/index.d.ts +7 -0
  42. package/dist/solution/BaseSales/index.js +64 -42
  43. package/dist/solution/BaseSales/utils/cartPromotion.js +4 -1
  44. package/dist/solution/BookingByStep/index.d.ts +17 -2
  45. package/dist/solution/BookingByStep/index.js +294 -215
  46. package/dist/solution/BookingByStep/types.d.ts +2 -1
  47. package/dist/solution/BookingByStep/types.js +3 -1
  48. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  49. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  50. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  51. package/dist/solution/BookingTicket/index.d.ts +14 -2
  52. package/dist/solution/BookingTicket/index.js +2 -2
  53. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  54. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  55. package/dist/solution/ScanOrder/index.d.ts +26 -14
  56. package/dist/solution/ScanOrder/index.js +1142 -739
  57. package/dist/solution/ScanOrder/types.d.ts +21 -1
  58. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  59. package/dist/solution/ScanOrder/utils.js +66 -25
  60. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  61. package/dist/solution/ShopDiscount/index.js +125 -87
  62. package/dist/solution/UnifiedBookingSales/index.d.ts +179 -0
  63. package/dist/solution/UnifiedBookingSales/index.js +1892 -0
  64. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  65. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  66. package/dist/solution/VenueBooking/index.d.ts +39 -11
  67. package/dist/solution/VenueBooking/index.js +1167 -841
  68. package/dist/solution/VenueBooking/types.d.ts +3 -0
  69. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  70. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  71. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  72. package/dist/solution/index.d.ts +1 -0
  73. package/dist/solution/index.js +2 -1
  74. package/dist/types/index.d.ts +1 -0
  75. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  76. package/lib/modules/Discount/index.d.ts +1 -0
  77. package/lib/modules/Discount/index.js +9 -0
  78. package/lib/modules/Discount/types.d.ts +1 -0
  79. package/lib/modules/Holder/index.d.ts +48 -0
  80. package/lib/modules/Holder/index.js +402 -0
  81. package/lib/modules/Holder/types.d.ts +123 -0
  82. package/lib/modules/Holder/types.js +17 -0
  83. package/lib/modules/Holder/utils.d.ts +13 -0
  84. package/lib/modules/Holder/utils.js +71 -0
  85. package/lib/modules/OpenData/index.js +1 -1
  86. package/lib/modules/Order/index.d.ts +4 -2
  87. package/lib/modules/Order/index.js +30 -13
  88. package/lib/modules/Order/types.d.ts +9 -0
  89. package/lib/modules/Order/utils.d.ts +10 -0
  90. package/lib/modules/Order/utils.js +36 -5
  91. package/lib/modules/Product/types.d.ts +1 -0
  92. package/lib/modules/ProductList/index.js +48 -31
  93. package/lib/modules/Quotation/index.d.ts +1 -1
  94. package/lib/modules/Quotation/index.js +2 -2
  95. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  96. package/lib/modules/ResourcePlanner/index.js +148 -0
  97. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  98. package/lib/modules/ResourcePlanner/planner.js +933 -0
  99. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  100. package/lib/modules/ResourcePlanner/types.js +17 -0
  101. package/lib/modules/Rules/index.js +33 -16
  102. package/lib/modules/SalesSummary/index.js +6 -7
  103. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  104. package/lib/modules/ScanOrderLogger/index.js +13 -1
  105. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  106. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  107. package/lib/modules/Schedule/index.d.ts +3 -1
  108. package/lib/modules/Schedule/index.js +10 -8
  109. package/lib/modules/Summary/utils.js +21 -1
  110. package/lib/modules/index.d.ts +2 -0
  111. package/lib/modules/index.js +5 -1
  112. package/lib/plugins/window.d.ts +1 -0
  113. package/lib/server/index.d.ts +14 -0
  114. package/lib/server/index.js +72 -15
  115. package/lib/solution/BaseSales/index.d.ts +7 -0
  116. package/lib/solution/BaseSales/index.js +24 -8
  117. package/lib/solution/BaseSales/utils/cartPromotion.js +3 -0
  118. package/lib/solution/BookingByStep/index.d.ts +17 -2
  119. package/lib/solution/BookingByStep/index.js +60 -18
  120. package/lib/solution/BookingByStep/types.d.ts +2 -1
  121. package/lib/solution/BookingByStep/types.js +5 -0
  122. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  123. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  124. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  125. package/lib/solution/BookingTicket/index.d.ts +14 -2
  126. package/lib/solution/BookingTicket/index.js +10 -2
  127. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  128. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  129. package/lib/solution/ScanOrder/index.d.ts +26 -14
  130. package/lib/solution/ScanOrder/index.js +449 -182
  131. package/lib/solution/ScanOrder/types.d.ts +21 -1
  132. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  133. package/lib/solution/ScanOrder/utils.js +31 -0
  134. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  135. package/lib/solution/ShopDiscount/index.js +14 -0
  136. package/lib/solution/UnifiedBookingSales/index.d.ts +179 -0
  137. package/lib/solution/UnifiedBookingSales/index.js +1085 -0
  138. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  139. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  140. package/lib/solution/VenueBooking/index.d.ts +39 -11
  141. package/lib/solution/VenueBooking/index.js +322 -110
  142. package/lib/solution/VenueBooking/types.d.ts +3 -0
  143. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  144. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  145. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  146. package/lib/solution/index.d.ts +1 -0
  147. package/lib/solution/index.js +3 -1
  148. package/lib/types/index.d.ts +1 -0
  149. 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);
@@ -305,7 +305,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
305
305
  _id: product._id,
306
306
  parentId: product._id,
307
307
  quantity: product.quantity,
308
- num: product.num
308
+ num: product.num,
309
+ booking_id: product.booking_id
309
310
  });
310
311
  if (product.bundle && Array.isArray(product.bundle) && product.bundle.length > 0) {
311
312
  product.bundle.forEach((bundleItem, bundleIndex) => {
@@ -329,7 +330,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
329
330
  origin_total: new import_decimal.default(bundleItem.price || 0).mul(bundleItem.num || 1).toNumber(),
330
331
  original_price: bundleItem.original_price,
331
332
  // 继承主商品属性
332
- booking_id: product.booking_id,
333
+ booking_id: bundleItem.booking_id,
333
334
  discount_list: bundleItem.discount_list || []
334
335
  });
335
336
  });
@@ -691,7 +692,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
691
692
  discount_product_id: discount.product_id
692
693
  },
693
694
  metadata: {
694
- num
695
+ num,
696
+ discount_rule_uncheck_flag: discount == null ? void 0 : discount.discount_rule_uncheck_flag
695
697
  }
696
698
  };
697
699
  applicableProducts.push(productData);
@@ -1132,6 +1134,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1132
1134
  config: selectedDiscount2 == null ? void 0 : selectedDiscount2.config,
1133
1135
  metadata: {
1134
1136
  num: 1,
1137
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1135
1138
  // 🔥 order_level 分摊差值
1136
1139
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference },
1137
1140
  /** 仅主商品上的优惠金额(不含 option) */
@@ -1212,6 +1215,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1212
1215
  metadata: {
1213
1216
  // 🔥 使用拆分后的唯一 _id
1214
1217
  custom_product_bundle_map_id: uniqueId,
1218
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1215
1219
  num: 1
1216
1220
  },
1217
1221
  _num: 1,
@@ -1241,7 +1245,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1241
1245
  _id: `${flatItem._id}_split_rest`,
1242
1246
  num: normalNum,
1243
1247
  quantity: normalNum,
1244
- discount_list: [],
1248
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
1245
1249
  processed: true
1246
1250
  });
1247
1251
  }
@@ -1299,6 +1303,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1299
1303
  metadata: {
1300
1304
  // 🔥 使用唯一的 _id
1301
1305
  custom_product_bundle_map_id: uniqueId,
1306
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1302
1307
  num: product.num || 1,
1303
1308
  // 🔥 order_level 分摊差值
1304
1309
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
@@ -1313,7 +1318,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1313
1318
  ...flatItem,
1314
1319
  total: targetProductTotal,
1315
1320
  price: new import_decimal.default(productOriginTotal || 0).minus(fixedAmountPerItem).toNumber(),
1316
- discount_list: [discountDetail],
1321
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion").concat([discountDetail]),
1317
1322
  processed: true
1318
1323
  });
1319
1324
  }
@@ -1734,7 +1739,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1734
1739
  * @returns 是否可用
1735
1740
  */
1736
1741
  checkPackageSubItemUsageRules(discount, flatItem) {
1737
- var _a, _b, _c, _d, _e, _f, _g;
1742
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1738
1743
  const limitedData = discount.limited_relation_product_data;
1739
1744
  const usageRules = limitedData == null ? void 0 : limitedData.package_sub_item_usage_rules;
1740
1745
  const rules = ["original_price", ...(usageRules == null ? void 0 : usageRules.rules) || []];
@@ -1746,6 +1751,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1746
1751
  const { type: scopeType, exclude_bundle_product_ids = [], include_bundle_product_ids = [], filter = 0 } = packageScope || {};
1747
1752
  const isMainProduct = flatItem.type === "main";
1748
1753
  const isBundleItem = flatItem.type === "bundle";
1754
+ const bundleMainProductId = (_a = flatItem.product) == null ? void 0 : _a.product_id;
1749
1755
  if (isMainProduct) {
1750
1756
  return true;
1751
1757
  }
@@ -1754,9 +1760,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1754
1760
  return true;
1755
1761
  }
1756
1762
  if (isBundleItem) {
1757
- const priceType = (_a = flatItem.bundleItem) == null ? void 0 : _a.price_type;
1758
- const priceTypeExt = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type_ext;
1759
- 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;
1763
+ const priceType = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type;
1764
+ const priceTypeExt = (_c = flatItem.bundleItem) == null ? void 0 : _c.price_type_ext;
1765
+ 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;
1760
1766
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1761
1767
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1762
1768
  if (rules.length > 0) {
@@ -1768,11 +1774,11 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1768
1774
  if (!filter) {
1769
1775
  isScopeValid = true;
1770
1776
  } else {
1771
- isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
1777
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
1772
1778
  }
1773
1779
  }
1774
1780
  if (scopeType === "specific_packages" || scopeType === "products") {
1775
- isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
1781
+ isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
1776
1782
  }
1777
1783
  if (isPriceValid && isScopeValid) {
1778
1784
  return true;
@@ -1788,15 +1794,26 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1788
1794
  return false;
1789
1795
  }
1790
1796
  if (isBundleItem) {
1791
- const priceType = (_f = flatItem.bundleItem) == null ? void 0 : _f.price_type;
1792
- const priceTypeExt = (_g = flatItem.bundleItem) == null ? void 0 : _g.price_type_ext;
1797
+ const priceType = (_g = flatItem.bundleItem) == null ? void 0 : _g.price_type;
1798
+ const priceTypeExt = (_h = flatItem.bundleItem) == null ? void 0 : _h.price_type_ext;
1793
1799
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1794
1800
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1795
1801
  if (rules.length > 0) {
1796
- if (isOriginalPrice && rules.includes("original_price")) {
1797
- return true;
1802
+ const _isOriginalPrice = isOriginalPrice && rules.includes("original_price");
1803
+ const _isMarkupPrice = isMarkupPrice && rules.includes("markup_price");
1804
+ const isPriceValid = _isOriginalPrice || _isMarkupPrice;
1805
+ let isScopeValid = false;
1806
+ if (scopeType === "all_packages" || scopeType === "product_all") {
1807
+ if (!filter) {
1808
+ isScopeValid = true;
1809
+ } else {
1810
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
1811
+ }
1798
1812
  }
1799
- if (isMarkupPrice && rules.includes("markup_price")) {
1813
+ if (scopeType === "specific_packages" || scopeType === "products") {
1814
+ isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
1815
+ }
1816
+ if (isPriceValid && isScopeValid) {
1800
1817
  return true;
1801
1818
  }
1802
1819
  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';
@@ -36,6 +36,8 @@ __reExport(modules_exports, require("./Quotation"), module.exports);
36
36
  __reExport(modules_exports, require("./ScanOrderLogger"), module.exports);
37
37
  __reExport(modules_exports, require("./OpenData"), module.exports);
38
38
  __reExport(modules_exports, require("./BookingContext"), module.exports);
39
+ __reExport(modules_exports, require("./Holder"), module.exports);
40
+ __reExport(modules_exports, require("./ResourcePlanner"), module.exports);
39
41
  // Annotate the CommonJS export names for ESM import in node:
40
42
  0 && (module.exports = {
41
43
  ...require("./Product"),
@@ -57,5 +59,7 @@ __reExport(modules_exports, require("./BookingContext"), module.exports);
57
59
  ...require("./Quotation"),
58
60
  ...require("./ScanOrderLogger"),
59
61
  ...require("./OpenData"),
60
- ...require("./BookingContext")
62
+ ...require("./BookingContext"),
63
+ ...require("./Holder"),
64
+ ...require("./ResourcePlanner")
61
65
  });
@@ -16,6 +16,7 @@ export interface WindowPlugin extends Plugin {
16
16
  history: History;
17
17
  interaction?: any;
18
18
  getWalletPassEvaluator?: () => WalletPassEvaluator;
19
+ getLocalStorage?: (key: string) => string | null;
19
20
  }
20
21
  /**
21
22
  * 简单的 Storage 接口实现