@pisell/pisellos 2.3.49 → 2.3.51

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 (144) 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 +4 -2
  12. package/dist/modules/Order/index.js +54 -25
  13. package/dist/modules/Order/types.d.ts +9 -0
  14. package/dist/modules/Order/utils.d.ts +10 -0
  15. package/dist/modules/Order/utils.js +35 -3
  16. package/dist/modules/Product/types.d.ts +1 -0
  17. package/dist/modules/ProductList/index.js +33 -14
  18. package/dist/modules/Quotation/index.d.ts +1 -1
  19. package/dist/modules/Quotation/index.js +2 -2
  20. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  21. package/dist/modules/ResourcePlanner/index.js +181 -0
  22. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  23. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  24. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  25. package/dist/modules/ResourcePlanner/types.js +1 -0
  26. package/dist/modules/Rules/index.js +47 -13
  27. package/dist/modules/SalesSummary/index.js +12 -13
  28. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  29. package/dist/modules/ScanOrderLogger/index.js +15 -2
  30. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  31. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  32. package/dist/modules/Schedule/index.d.ts +3 -1
  33. package/dist/modules/Schedule/index.js +21 -16
  34. package/dist/modules/Summary/utils.js +38 -13
  35. package/dist/modules/index.d.ts +2 -0
  36. package/dist/modules/index.js +3 -1
  37. package/dist/plugins/window.d.ts +1 -0
  38. package/dist/server/index.d.ts +14 -0
  39. package/dist/server/index.js +907 -793
  40. package/dist/solution/BaseSales/index.d.ts +7 -0
  41. package/dist/solution/BaseSales/index.js +64 -42
  42. package/dist/solution/BookingByStep/index.d.ts +17 -2
  43. package/dist/solution/BookingByStep/index.js +294 -215
  44. package/dist/solution/BookingByStep/types.d.ts +2 -1
  45. package/dist/solution/BookingByStep/types.js +3 -1
  46. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  47. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  48. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  49. package/dist/solution/BookingTicket/index.js +2 -2
  50. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  51. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  52. package/dist/solution/ScanOrder/index.d.ts +26 -14
  53. package/dist/solution/ScanOrder/index.js +1142 -739
  54. package/dist/solution/ScanOrder/types.d.ts +21 -1
  55. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  56. package/dist/solution/ScanOrder/utils.js +66 -25
  57. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  58. package/dist/solution/ShopDiscount/index.js +125 -87
  59. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  60. package/dist/solution/UnifiedBookingSales/index.js +1891 -0
  61. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  62. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  63. package/dist/solution/VenueBooking/index.d.ts +39 -11
  64. package/dist/solution/VenueBooking/index.js +1167 -841
  65. package/dist/solution/VenueBooking/types.d.ts +3 -0
  66. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  67. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  68. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  69. package/dist/solution/index.d.ts +1 -0
  70. package/dist/solution/index.js +2 -1
  71. package/dist/types/index.d.ts +1 -0
  72. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  73. package/lib/modules/Discount/index.d.ts +1 -0
  74. package/lib/modules/Discount/index.js +9 -0
  75. package/lib/modules/Discount/types.d.ts +1 -0
  76. package/lib/modules/Holder/index.d.ts +48 -0
  77. package/lib/modules/Holder/index.js +402 -0
  78. package/lib/modules/Holder/types.d.ts +123 -0
  79. package/lib/modules/Holder/types.js +17 -0
  80. package/lib/modules/Holder/utils.d.ts +13 -0
  81. package/lib/modules/Holder/utils.js +71 -0
  82. package/lib/modules/OpenData/index.js +1 -1
  83. package/lib/modules/Order/index.d.ts +4 -2
  84. package/lib/modules/Order/index.js +26 -10
  85. package/lib/modules/Order/types.d.ts +9 -0
  86. package/lib/modules/Order/utils.d.ts +10 -0
  87. package/lib/modules/Order/utils.js +36 -5
  88. package/lib/modules/Product/types.d.ts +1 -0
  89. package/lib/modules/ProductList/index.js +40 -31
  90. package/lib/modules/Quotation/index.d.ts +1 -1
  91. package/lib/modules/Quotation/index.js +2 -2
  92. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  93. package/lib/modules/ResourcePlanner/index.js +148 -0
  94. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  95. package/lib/modules/ResourcePlanner/planner.js +933 -0
  96. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  97. package/lib/modules/ResourcePlanner/types.js +17 -0
  98. package/lib/modules/Rules/index.js +33 -16
  99. package/lib/modules/SalesSummary/index.js +6 -7
  100. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  101. package/lib/modules/ScanOrderLogger/index.js +13 -1
  102. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  103. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  104. package/lib/modules/Schedule/index.d.ts +3 -1
  105. package/lib/modules/Schedule/index.js +10 -8
  106. package/lib/modules/Summary/utils.js +21 -1
  107. package/lib/modules/index.d.ts +2 -0
  108. package/lib/modules/index.js +5 -1
  109. package/lib/plugins/window.d.ts +1 -0
  110. package/lib/server/index.d.ts +14 -0
  111. package/lib/server/index.js +72 -15
  112. package/lib/solution/BaseSales/index.d.ts +7 -0
  113. package/lib/solution/BaseSales/index.js +24 -8
  114. package/lib/solution/BookingByStep/index.d.ts +17 -2
  115. package/lib/solution/BookingByStep/index.js +60 -18
  116. package/lib/solution/BookingByStep/types.d.ts +2 -1
  117. package/lib/solution/BookingByStep/types.js +5 -0
  118. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  119. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  120. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  121. package/lib/solution/BookingTicket/index.js +10 -2
  122. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  123. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  124. package/lib/solution/ScanOrder/index.d.ts +26 -14
  125. package/lib/solution/ScanOrder/index.js +449 -182
  126. package/lib/solution/ScanOrder/types.d.ts +21 -1
  127. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  128. package/lib/solution/ScanOrder/utils.js +31 -0
  129. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  130. package/lib/solution/ShopDiscount/index.js +14 -0
  131. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  132. package/lib/solution/UnifiedBookingSales/index.js +1084 -0
  133. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  134. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  135. package/lib/solution/VenueBooking/index.d.ts +39 -11
  136. package/lib/solution/VenueBooking/index.js +322 -110
  137. package/lib/solution/VenueBooking/types.d.ts +3 -0
  138. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  139. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  140. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  141. package/lib/solution/index.d.ts +1 -0
  142. package/lib/solution/index.js +3 -1
  143. package/lib/types/index.d.ts +1 -0
  144. 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) => {
@@ -326,7 +327,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
326
327
  origin_total: new import_decimal.default(bundleItem.price || 0).mul(bundleItem.num || 1).toNumber(),
327
328
  original_price: bundleItem.original_price,
328
329
  // 继承主商品属性
329
- booking_id: product.booking_id,
330
+ booking_id: bundleItem.booking_id,
330
331
  discount_list: bundleItem.discount_list || []
331
332
  });
332
333
  });
@@ -688,7 +689,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
688
689
  discount_product_id: discount.product_id
689
690
  },
690
691
  metadata: {
691
- num
692
+ num,
693
+ discount_rule_uncheck_flag: discount == null ? void 0 : discount.discount_rule_uncheck_flag
692
694
  }
693
695
  };
694
696
  applicableProducts.push(productData);
@@ -1136,6 +1138,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1136
1138
  config: selectedDiscount2 == null ? void 0 : selectedDiscount2.config,
1137
1139
  metadata: {
1138
1140
  num: 1,
1141
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1139
1142
  // 🔥 order_level 分摊差值
1140
1143
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference },
1141
1144
  /** 仅主商品上的优惠金额(不含 option) */
@@ -1216,6 +1219,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1216
1219
  metadata: {
1217
1220
  // 🔥 使用拆分后的唯一 _id
1218
1221
  custom_product_bundle_map_id: uniqueId,
1222
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1219
1223
  num: 1
1220
1224
  },
1221
1225
  _num: 1,
@@ -1245,7 +1249,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1245
1249
  _id: `${flatItem._id}_split_rest`,
1246
1250
  num: normalNum,
1247
1251
  quantity: normalNum,
1248
- discount_list: [],
1252
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
1249
1253
  processed: true
1250
1254
  });
1251
1255
  }
@@ -1294,6 +1298,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1294
1298
  metadata: {
1295
1299
  // 🔥 使用唯一的 _id
1296
1300
  custom_product_bundle_map_id: uniqueId,
1301
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1297
1302
  num: product.num || 1,
1298
1303
  // 🔥 order_level 分摊差值
1299
1304
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
@@ -1308,7 +1313,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1308
1313
  ...flatItem,
1309
1314
  total: targetProductTotal,
1310
1315
  price: new import_decimal.default(productOriginTotal || 0).minus(fixedAmountPerItem).toNumber(),
1311
- discount_list: [discountDetail],
1316
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion").concat([discountDetail]),
1312
1317
  processed: true
1313
1318
  });
1314
1319
  }
@@ -1729,7 +1734,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1729
1734
  * @returns 是否可用
1730
1735
  */
1731
1736
  checkPackageSubItemUsageRules(discount, flatItem) {
1732
- var _a, _b, _c, _d, _e, _f, _g;
1737
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1733
1738
  const limitedData = discount.limited_relation_product_data;
1734
1739
  const usageRules = limitedData == null ? void 0 : limitedData.package_sub_item_usage_rules;
1735
1740
  const rules = ["original_price", ...(usageRules == null ? void 0 : usageRules.rules) || []];
@@ -1741,6 +1746,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1741
1746
  const { type: scopeType, exclude_bundle_product_ids = [], include_bundle_product_ids = [], filter = 0 } = packageScope || {};
1742
1747
  const isMainProduct = flatItem.type === "main";
1743
1748
  const isBundleItem = flatItem.type === "bundle";
1749
+ const bundleMainProductId = (_a = flatItem.product) == null ? void 0 : _a.product_id;
1744
1750
  if (isMainProduct) {
1745
1751
  return true;
1746
1752
  }
@@ -1749,9 +1755,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1749
1755
  return true;
1750
1756
  }
1751
1757
  if (isBundleItem) {
1752
- const priceType = (_a = flatItem.bundleItem) == null ? void 0 : _a.price_type;
1753
- const priceTypeExt = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type_ext;
1754
- 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;
1755
1761
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1756
1762
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1757
1763
  if (rules.length > 0) {
@@ -1763,11 +1769,11 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1763
1769
  if (!filter) {
1764
1770
  isScopeValid = true;
1765
1771
  } else {
1766
- isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
1772
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
1767
1773
  }
1768
1774
  }
1769
1775
  if (scopeType === "specific_packages" || scopeType === "products") {
1770
- isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
1776
+ isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
1771
1777
  }
1772
1778
  if (isPriceValid && isScopeValid) {
1773
1779
  return true;
@@ -1783,15 +1789,26 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1783
1789
  return false;
1784
1790
  }
1785
1791
  if (isBundleItem) {
1786
- const priceType = (_f = flatItem.bundleItem) == null ? void 0 : _f.price_type;
1787
- 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;
1788
1794
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1789
1795
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1790
1796
  if (rules.length > 0) {
1791
- if (isOriginalPrice && rules.includes("original_price")) {
1792
- 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
+ }
1793
1807
  }
1794
- 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) {
1795
1812
  return true;
1796
1813
  }
1797
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';
@@ -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 接口实现