@pisell/pisellos 2.3.50 → 2.3.53

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 (177) hide show
  1. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +12 -10
  2. package/dist/modules/Discount/index.d.ts +0 -1
  3. package/dist/modules/Discount/index.js +11 -40
  4. package/dist/modules/Discount/types.d.ts +0 -1
  5. package/dist/modules/OpenData/index.js +2 -2
  6. package/dist/modules/Order/index.d.ts +6 -8
  7. package/dist/modules/Order/index.js +165 -140
  8. package/dist/modules/Order/types.d.ts +21 -12
  9. package/dist/modules/Order/types.js +11 -0
  10. package/dist/modules/Order/utils.d.ts +0 -10
  11. package/dist/modules/Order/utils.js +3 -35
  12. package/dist/modules/Payment/types.d.ts +8 -0
  13. package/dist/modules/Payment/walletpass.d.ts +7 -1
  14. package/dist/modules/Payment/walletpass.js +155 -45
  15. package/dist/modules/Product/types.d.ts +0 -1
  16. package/dist/modules/ProductList/index.js +14 -33
  17. package/dist/modules/Quotation/index.d.ts +1 -1
  18. package/dist/modules/Quotation/index.js +2 -2
  19. package/dist/modules/Rules/index.js +32 -56
  20. package/dist/modules/SalesSummary/index.js +13 -12
  21. package/dist/modules/SalesSummary/utils.js +7 -1
  22. package/dist/modules/ScanOrderLogger/index.d.ts +0 -2
  23. package/dist/modules/ScanOrderLogger/index.js +2 -15
  24. package/dist/modules/ScanOrderLogger/providers/feishu.js +27 -45
  25. package/dist/modules/ScanOrderLogger/types.d.ts +0 -1
  26. package/dist/modules/Schedule/index.d.ts +1 -3
  27. package/dist/modules/Schedule/index.js +16 -21
  28. package/dist/modules/Summary/utils.js +13 -38
  29. package/dist/modules/index.d.ts +0 -2
  30. package/dist/modules/index.js +1 -3
  31. package/dist/plugins/window.d.ts +0 -1
  32. package/dist/server/index.d.ts +0 -14
  33. package/dist/server/index.js +793 -907
  34. package/dist/server/modules/index.d.ts +1 -1
  35. package/dist/server/modules/order/index.d.ts +16 -0
  36. package/dist/server/modules/order/index.js +964 -776
  37. package/dist/server/modules/order/types.d.ts +14 -0
  38. package/dist/server/modules/order/types.js +6 -0
  39. package/dist/solution/BaseSales/index.d.ts +18 -13
  40. package/dist/solution/BaseSales/index.js +202 -178
  41. package/dist/solution/BaseSales/utils/cartPromotion.js +5 -3
  42. package/dist/solution/BookingByStep/index.d.ts +2 -17
  43. package/dist/solution/BookingByStep/index.js +215 -294
  44. package/dist/solution/BookingByStep/types.d.ts +1 -2
  45. package/dist/solution/BookingByStep/types.js +1 -3
  46. package/dist/solution/BookingByStep/utils/capacity.js +1 -17
  47. package/dist/solution/BookingByStep/utils/timeslots.d.ts +1 -3
  48. package/dist/solution/BookingByStep/utils/timeslots.js +12 -19
  49. package/dist/solution/BookingTicket/index.d.ts +1 -13
  50. package/dist/solution/BookingTicket/index.js +2 -2
  51. package/dist/solution/BookingTicket/types.d.ts +3 -0
  52. package/dist/solution/BookingTicket/utils/cartView.js +44 -32
  53. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +1 -3
  54. package/dist/solution/BookingTicket/utils/scan/handleScan.js +2 -10
  55. package/dist/solution/Sales/index.d.ts +1 -0
  56. package/dist/solution/Sales/index.js +16 -2
  57. package/dist/solution/ScanOrder/index.d.ts +14 -26
  58. package/dist/solution/ScanOrder/index.js +739 -1142
  59. package/dist/solution/ScanOrder/types.d.ts +1 -21
  60. package/dist/solution/ScanOrder/utils.d.ts +0 -8
  61. package/dist/solution/ScanOrder/utils.js +25 -66
  62. package/dist/solution/ShopDiscount/index.d.ts +0 -1
  63. package/dist/solution/ShopDiscount/index.js +87 -125
  64. package/dist/solution/VenueBooking/index.d.ts +11 -39
  65. package/dist/solution/VenueBooking/index.js +841 -1167
  66. package/dist/solution/VenueBooking/types.d.ts +0 -3
  67. package/dist/solution/VenueBooking/utils/resource.js +0 -1
  68. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  69. package/dist/solution/VenueBooking/utils/slotMerge.js +5 -10
  70. package/dist/solution/index.d.ts +0 -1
  71. package/dist/solution/index.js +1 -2
  72. package/dist/types/index.d.ts +0 -1
  73. package/lib/model/strategy/adapter/promotion/index.js +0 -51
  74. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +3 -1
  75. package/lib/modules/Discount/index.d.ts +0 -1
  76. package/lib/modules/Discount/index.js +0 -9
  77. package/lib/modules/Discount/types.d.ts +0 -1
  78. package/lib/modules/OpenData/index.js +1 -1
  79. package/lib/modules/Order/index.d.ts +6 -8
  80. package/lib/modules/Order/index.js +89 -38
  81. package/lib/modules/Order/types.d.ts +21 -12
  82. package/lib/modules/Order/utils.d.ts +0 -10
  83. package/lib/modules/Order/utils.js +5 -36
  84. package/lib/modules/Payment/types.d.ts +8 -0
  85. package/lib/modules/Payment/walletpass.d.ts +7 -1
  86. package/lib/modules/Payment/walletpass.js +107 -9
  87. package/lib/modules/Product/types.d.ts +0 -1
  88. package/lib/modules/ProductList/index.js +31 -40
  89. package/lib/modules/Quotation/index.d.ts +1 -1
  90. package/lib/modules/Quotation/index.js +2 -2
  91. package/lib/modules/Rules/index.js +32 -44
  92. package/lib/modules/SalesSummary/index.js +7 -6
  93. package/lib/modules/SalesSummary/utils.js +5 -1
  94. package/lib/modules/ScanOrderLogger/index.d.ts +0 -2
  95. package/lib/modules/ScanOrderLogger/index.js +1 -13
  96. package/lib/modules/ScanOrderLogger/providers/feishu.js +6 -15
  97. package/lib/modules/ScanOrderLogger/types.d.ts +0 -1
  98. package/lib/modules/Schedule/index.d.ts +1 -3
  99. package/lib/modules/Schedule/index.js +8 -10
  100. package/lib/modules/Summary/utils.js +1 -21
  101. package/lib/modules/index.d.ts +0 -2
  102. package/lib/modules/index.js +1 -5
  103. package/lib/plugins/window.d.ts +0 -1
  104. package/lib/server/index.d.ts +0 -14
  105. package/lib/server/index.js +15 -72
  106. package/lib/server/modules/index.d.ts +1 -1
  107. package/lib/server/modules/order/index.d.ts +16 -0
  108. package/lib/server/modules/order/index.js +140 -4
  109. package/lib/server/modules/order/types.d.ts +14 -0
  110. package/lib/server/modules/order/types.js +1 -0
  111. package/lib/solution/BaseSales/index.d.ts +18 -13
  112. package/lib/solution/BaseSales/index.js +58 -35
  113. package/lib/solution/BaseSales/utils/cartPromotion.js +5 -2
  114. package/lib/solution/BookingByStep/index.d.ts +2 -17
  115. package/lib/solution/BookingByStep/index.js +18 -60
  116. package/lib/solution/BookingByStep/types.d.ts +1 -2
  117. package/lib/solution/BookingByStep/types.js +0 -5
  118. package/lib/solution/BookingByStep/utils/capacity.js +1 -20
  119. package/lib/solution/BookingByStep/utils/timeslots.d.ts +1 -3
  120. package/lib/solution/BookingByStep/utils/timeslots.js +11 -19
  121. package/lib/solution/BookingTicket/index.d.ts +1 -13
  122. package/lib/solution/BookingTicket/index.js +2 -10
  123. package/lib/solution/BookingTicket/types.d.ts +3 -0
  124. package/lib/solution/BookingTicket/utils/cartView.js +43 -30
  125. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +1 -3
  126. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  127. package/lib/solution/Sales/index.d.ts +1 -0
  128. package/lib/solution/Sales/index.js +15 -3
  129. package/lib/solution/ScanOrder/index.d.ts +14 -26
  130. package/lib/solution/ScanOrder/index.js +182 -449
  131. package/lib/solution/ScanOrder/types.d.ts +1 -21
  132. package/lib/solution/ScanOrder/utils.d.ts +0 -8
  133. package/lib/solution/ScanOrder/utils.js +0 -31
  134. package/lib/solution/ShopDiscount/index.d.ts +0 -1
  135. package/lib/solution/ShopDiscount/index.js +0 -14
  136. package/lib/solution/VenueBooking/index.d.ts +11 -39
  137. package/lib/solution/VenueBooking/index.js +110 -322
  138. package/lib/solution/VenueBooking/types.d.ts +0 -3
  139. package/lib/solution/VenueBooking/utils/resource.js +0 -1
  140. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  141. package/lib/solution/VenueBooking/utils/slotMerge.js +4 -6
  142. package/lib/solution/index.d.ts +0 -1
  143. package/lib/solution/index.js +1 -3
  144. package/lib/types/index.d.ts +0 -1
  145. package/package.json +1 -1
  146. package/dist/modules/Holder/index.d.ts +0 -48
  147. package/dist/modules/Holder/index.js +0 -640
  148. package/dist/modules/Holder/types.d.ts +0 -123
  149. package/dist/modules/Holder/types.js +0 -1
  150. package/dist/modules/Holder/utils.d.ts +0 -13
  151. package/dist/modules/Holder/utils.js +0 -34
  152. package/dist/modules/ResourcePlanner/index.d.ts +0 -24
  153. package/dist/modules/ResourcePlanner/index.js +0 -181
  154. package/dist/modules/ResourcePlanner/planner.d.ts +0 -14
  155. package/dist/modules/ResourcePlanner/planner.js +0 -1069
  156. package/dist/modules/ResourcePlanner/types.d.ts +0 -227
  157. package/dist/modules/ResourcePlanner/types.js +0 -1
  158. package/dist/solution/UnifiedBookingSales/index.d.ts +0 -183
  159. package/dist/solution/UnifiedBookingSales/index.js +0 -1891
  160. package/dist/solution/UnifiedBookingSales/types.d.ts +0 -143
  161. package/dist/solution/UnifiedBookingSales/types.js +0 -11
  162. package/lib/modules/Holder/index.d.ts +0 -48
  163. package/lib/modules/Holder/index.js +0 -402
  164. package/lib/modules/Holder/types.d.ts +0 -123
  165. package/lib/modules/Holder/types.js +0 -17
  166. package/lib/modules/Holder/utils.d.ts +0 -13
  167. package/lib/modules/Holder/utils.js +0 -71
  168. package/lib/modules/ResourcePlanner/index.d.ts +0 -24
  169. package/lib/modules/ResourcePlanner/index.js +0 -148
  170. package/lib/modules/ResourcePlanner/planner.d.ts +0 -14
  171. package/lib/modules/ResourcePlanner/planner.js +0 -933
  172. package/lib/modules/ResourcePlanner/types.d.ts +0 -227
  173. package/lib/modules/ResourcePlanner/types.js +0 -17
  174. package/lib/solution/UnifiedBookingSales/index.d.ts +0 -183
  175. package/lib/solution/UnifiedBookingSales/index.js +0 -1084
  176. package/lib/solution/UnifiedBookingSales/types.d.ts +0 -143
  177. package/lib/solution/UnifiedBookingSales/types.js +0 -33
@@ -157,10 +157,6 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
157
157
  userPlugin,
158
158
  customer_id,
159
159
  _userPlugin$get,
160
- channelMap,
161
- rawApplicationCode,
162
- mappedApplicationCode,
163
- queryPayload,
164
160
  productsData,
165
161
  sortedList,
166
162
  _args4 = arguments;
@@ -189,16 +185,8 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
189
185
  console.error(error);
190
186
  }
191
187
  // 如果没传schedule_date,则从
192
- channelMap = {
193
- online_store: 'online-store',
194
- scan_to_order: 'online-store',
195
- 'scan-to-order': 'online-store',
196
- scan_to_order_2: 'mobile_order',
197
- scan_to_order_3: 'scantoorder3'
198
- };
199
- rawApplicationCode = (_this$otherParams = this.otherParams) === null || _this$otherParams === void 0 ? void 0 : _this$otherParams.channel;
200
- mappedApplicationCode = typeof rawApplicationCode === 'string' ? channelMap[rawApplicationCode] || rawApplicationCode : rawApplicationCode;
201
- queryPayload = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
188
+ _context4.next = 7;
189
+ return this.request.post("/product/query", {
202
190
  open_quotation: 1,
203
191
  open_bundle: 0,
204
192
  exclude_extension_type: ['product_party', 'product_event', 'product_series_event', 'product_package_ticket', 'ticket', 'event_item'],
@@ -206,35 +194,28 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
206
194
  status: status,
207
195
  num: 500,
208
196
  skip: 1,
209
- customer_id: customer_id
210
- }, Array.isArray(category_ids) && category_ids.length ? {
211
- category_ids: category_ids
212
- } : {}), Array.isArray(product_ids) && product_ids.length ? {
213
- ids: product_ids
214
- } : {}), Array.isArray(collection) && collection.length ? {
215
- collection: collection
216
- } : {}), {}, {
217
- front_end_cache_id: cacheId
218
- }, Array.isArray(menu_list_ids) && menu_list_ids.length ? {
219
- menu_list_ids: menu_list_ids
220
- } : {}), {}, {
197
+ customer_id: customer_id,
198
+ category_ids: category_ids,
199
+ ids: product_ids,
200
+ collection: collection,
201
+ front_end_cache_id: cacheId,
202
+ menu_list_ids: menu_list_ids,
221
203
  with_count: with_count,
222
204
  // client_schedule_ids: schedule_ids,
223
205
  schedule_date: schedule_date,
224
- application_code: mappedApplicationCode,
206
+ application_code: (_this$otherParams = this.otherParams) === null || _this$otherParams === void 0 ? void 0 : _this$otherParams.channel,
225
207
  is_eject: 1,
226
208
  with_schedule: with_schedule,
227
209
  schedule_datetime: schedule_datetime,
228
- extension_type: extension_type
229
- });
230
- _context4.next = 11;
231
- return this.request.post("/product/query", queryPayload, {
210
+ extension_type: extension_type,
211
+ strategy_context: strategy_context
212
+ }, {
232
213
  osServer: true,
233
214
  callback: options === null || options === void 0 ? void 0 : options.callback,
234
215
  subscriberId: options === null || options === void 0 ? void 0 : options.subscriberId,
235
216
  customToast: function customToast() {}
236
217
  });
237
- case 11:
218
+ case 7:
238
219
  productsData = _context4.sent;
239
220
  sortedList = (productsData.data.list || []).slice().sort(function (a, b) {
240
221
  return Number(b.sort) - Number(a.sort);
@@ -247,7 +228,7 @@ export var ProductList = /*#__PURE__*/function (_BaseModule) {
247
228
  // }
248
229
  this.addProduct(sortedList);
249
230
  return _context4.abrupt("return", sortedList);
250
- case 15:
231
+ case 11:
251
232
  case "end":
252
233
  return _context4.stop();
253
234
  }
@@ -21,7 +21,7 @@ export declare class QuotationModule extends BaseModule implements Module {
21
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
22
22
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
23
23
  *
24
- * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
24
+ * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
25
25
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
26
26
  * the requested productId wins.
27
27
  */
@@ -90,7 +90,7 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
90
90
  res = _context2.sent;
91
91
  list = (res === null || res === void 0 || (_data = res.data) === null || _data === void 0 ? void 0 : _data.list) || (res === null || res === void 0 ? void 0 : res.list) || [];
92
92
  list.sort(function (a, b) {
93
- return b.sort - a.sort;
93
+ return a.sort - b.sort;
94
94
  });
95
95
  this.store.list = list;
96
96
  case 9:
@@ -151,7 +151,7 @@ export var QuotationModule = /*#__PURE__*/function (_BaseModule) {
151
151
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
152
152
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
153
153
  *
154
- * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
154
+ * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
155
155
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
156
156
  * the requested productId wins.
157
157
  */
@@ -366,7 +366,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
366
366
  var discountType = selectedDiscount.tag || selectedDiscount.type;
367
367
  return selectedDiscount.isEditMode === true && selectedDiscount.isSelected === true && ['good_pass', 'discount_card', 'product_discount_card'].includes(discountType);
368
368
  };
369
- var resolveReapplyEditModeDiscountPercent = function resolveReapplyEditModeDiscountPercent(originProduct, selectedDiscount) {
369
+ var resolveReapplyBookingDiscountPercent = function resolveReapplyBookingDiscountPercent(originProduct, selectedDiscount) {
370
370
  var _discount2;
371
371
  if (!shouldReapplyBookingDiscount(originProduct, selectedDiscount)) return undefined;
372
372
  var discountType = (selectedDiscount === null || selectedDiscount === void 0 ? void 0 : selectedDiscount.tag) || (selectedDiscount === null || selectedDiscount === void 0 ? void 0 : selectedDiscount.type);
@@ -438,8 +438,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
438
438
  _id: product._id,
439
439
  parentId: product._id,
440
440
  quantity: product.quantity,
441
- num: product.num,
442
- booking_id: product.booking_id
441
+ num: product.num
443
442
  });
444
443
 
445
444
  // 2. 展开 bundle 子商品
@@ -454,6 +453,9 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
454
453
  bundleIndex: bundleIndex,
455
454
  // 虚拟商品属性
456
455
  price: Number(bundleItem.price || 0),
456
+ // 新增商品运行态通常带 _bundle_product_id;订单 hydrate 后只有
457
+ // bundle_product_id。Change time 必须兼容两种结构,否则 bundle
458
+ // 子项无法命中折扣卡的 limited_relation_product_data.product_ids。
457
459
  id: (_ref3 = (_bundleItem$bundle_pr = bundleItem.bundle_product_id) !== null && _bundleItem$bundle_pr !== void 0 ? _bundleItem$bundle_pr : bundleItem._bundle_product_id) !== null && _ref3 !== void 0 ? _ref3 : bundleItem.product_id,
458
460
  _id: "".concat(product._id, "_bundle_").concat(bundleIndex),
459
461
  parentId: product._id,
@@ -463,7 +465,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
463
465
  origin_total: new Decimal(bundleItem.price || 0).mul(bundleItem.num || 1).toNumber(),
464
466
  original_price: bundleItem.original_price,
465
467
  // 继承主商品属性
466
- booking_id: bundleItem.booking_id,
468
+ booking_id: product.booking_id,
467
469
  discount_list: bundleItem.discount_list || []
468
470
  });
469
471
  });
@@ -988,8 +990,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
988
990
  discount_product_id: discount.product_id
989
991
  },
990
992
  metadata: {
991
- num: num,
992
- discount_rule_uncheck_flag: discount === null || discount === void 0 ? void 0 : discount.discount_rule_uncheck_flag
993
+ num: num
993
994
  }
994
995
  };
995
996
  applicableProducts.push(productData);
@@ -1095,11 +1096,10 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1095
1096
  if (isPersistedProduct && hasExistingWalletDiscount) {
1096
1097
  if (flatItem.type === 'main') {
1097
1098
  processedProductsMap.set(product._id, [originProduct]);
1098
- } else {
1099
- processedFlatItemsMap.set(flatItem._id, [_objectSpread(_objectSpread({}, flatItem), {}, {
1100
- processed: true
1101
- })]);
1102
1099
  }
1100
+ // bundle 虚拟项没有携带完整的历史价格字段。这里不写入 processed map,
1101
+ // 重组阶段会直接保留原始 bundleItem,避免把 bundle_selling_price
1102
+ // 覆盖为未折扣的 price,导致已支付金额再次进入应付。
1103
1103
  return;
1104
1104
  }
1105
1105
 
@@ -1440,9 +1440,9 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1440
1440
  amount = productAllocation.discountAmount;
1441
1441
  productDiscountDifference = productAllocation.difference;
1442
1442
  mainProductSellingPrice = Math.max(new Decimal(product.price).minus(amount).toNumber(), 0);
1443
- } else if (resolveReapplyEditModeDiscountPercent(originProduct, _selectedDiscount) !== undefined) {
1443
+ } else if (resolveReapplyBookingDiscountPercent(originProduct, _selectedDiscount) !== undefined) {
1444
1444
  // Change time 重套编辑态折扣卡时,历史 par_value 不是运行时折扣口径,优先使用后端快照里的 percent。
1445
- var percent = resolveReapplyEditModeDiscountPercent(originProduct, _selectedDiscount);
1445
+ var percent = resolveReapplyBookingDiscountPercent(originProduct, _selectedDiscount);
1446
1446
  reapplyDiscountPercent = new Decimal(percent).toFixed(2);
1447
1447
  mainProductSellingPrice = new Decimal(product.price || 0).mul(new Decimal(100).minus(percent)).div(100).toDecimalPlaces(2).toNumber();
1448
1448
  amount = new Decimal(product.price).minus(mainProductSellingPrice).toNumber();
@@ -1485,8 +1485,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1485
1485
  _num: isGoodPass ? 1 : product.num,
1486
1486
  config: _selectedDiscount === null || _selectedDiscount === void 0 ? void 0 : _selectedDiscount.config,
1487
1487
  metadata: _objectSpread(_objectSpread({
1488
- num: 1,
1489
- discount_rule_uncheck_flag: _selectedDiscount === null || _selectedDiscount === void 0 ? void 0 : _selectedDiscount.discount_rule_uncheck_flag
1488
+ num: 1
1490
1489
  }, productDiscountDifference !== undefined && {
1491
1490
  product_discount_difference: productDiscountDifference
1492
1491
  }), {}, {
@@ -1573,7 +1572,6 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1573
1572
  metadata: {
1574
1573
  // 🔥 使用拆分后的唯一 _id
1575
1574
  custom_product_bundle_map_id: uniqueId,
1576
- discount_rule_uncheck_flag: _selectedDiscount2 === null || _selectedDiscount2 === void 0 ? void 0 : _selectedDiscount2.discount_rule_uncheck_flag,
1577
1575
  num: 1
1578
1576
  },
1579
1577
  _num: 1,
@@ -1605,12 +1603,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1605
1603
  _id: "".concat(flatItem._id, "_split_rest"),
1606
1604
  num: normalNum,
1607
1605
  quantity: normalNum,
1608
- discount_list: _this4.filterDiscountListByType(flatItem.discount_list, 'promotion'),
1606
+ discount_list: [],
1609
1607
  processed: true
1610
1608
  }));
1611
1609
  }
1612
1610
  } else {
1613
- var _selectedDiscount3$me, _selectedDiscount3$me2, _flatItem$parentProdu9;
1611
+ var _selectedDiscount3$me, _selectedDiscount3$me2, _reapplyDiscountPerce2, _flatItem$parentProdu9;
1614
1612
  // 折扣卡:不拆分数量,直接应用
1615
1613
  var _selectedDiscount3 = selectedDiscountCard || applicableDiscounts[0];
1616
1614
  usedDiscounts.set(_selectedDiscount3.id, true);
@@ -1628,11 +1626,19 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1628
1626
  var targetProductTotal;
1629
1627
  var fixedAmountPerItem;
1630
1628
  var _productDiscountDifference;
1629
+ var _reapplyDiscountPercent;
1631
1630
  if (_isOrderLevel && _productAllocation) {
1632
1631
  // order_level:使用预计算的单价折扣金额(已经是单价,无需再除以数量)
1633
1632
  fixedAmountPerItem = _productAllocation.discountAmount;
1634
1633
  _productDiscountDifference = _productAllocation.difference;
1635
1634
  targetProductTotal = Math.max(new Decimal(_productOriginTotal).minus(fixedAmountPerItem).toNumber(), 0);
1635
+ } else if (resolveReapplyBookingDiscountPercent(originProduct, _selectedDiscount3) !== undefined) {
1636
+ // hydrate 后 par_value 可能是余额/原值(例如 3500),百分比口径以
1637
+ // 后端折扣快照 discount.percent 为准,与主商品重套逻辑保持一致。
1638
+ var _percent = resolveReapplyBookingDiscountPercent(originProduct, _selectedDiscount3);
1639
+ _reapplyDiscountPercent = new Decimal(_percent).toFixed(2);
1640
+ targetProductTotal = new Decimal(_productOriginTotal).mul(new Decimal(100).minus(_percent)).div(100).toDecimalPlaces(2).toNumber();
1641
+ fixedAmountPerItem = new Decimal(_productOriginTotal).minus(targetProductTotal).toNumber();
1636
1642
  } else {
1637
1643
  // item_level 或其他类型:使用原有逻辑
1638
1644
  targetProductTotal = getDiscountAmount(_selectedDiscount3, _productOriginTotal, _productOriginTotal);
@@ -1653,13 +1659,12 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1653
1659
  title: _selectedDiscount3.format_title,
1654
1660
  original_amount: product.original_price,
1655
1661
  product_id: product.id || product.product_id,
1656
- percent: _selectedDiscount3.par_value,
1662
+ percent: (_reapplyDiscountPerce2 = _reapplyDiscountPercent) !== null && _reapplyDiscountPerce2 !== void 0 ? _reapplyDiscountPerce2 : _selectedDiscount3.par_value,
1657
1663
  discount_product_id: _selectedDiscount3.product_id
1658
1664
  },
1659
1665
  metadata: _objectSpread({
1660
1666
  // 🔥 使用唯一的 _id
1661
1667
  custom_product_bundle_map_id: _uniqueId,
1662
- discount_rule_uncheck_flag: _selectedDiscount3 === null || _selectedDiscount3 === void 0 ? void 0 : _selectedDiscount3.discount_rule_uncheck_flag,
1663
1668
  num: product.num || 1
1664
1669
  }, _productDiscountDifference !== undefined && {
1665
1670
  product_discount_difference: _productDiscountDifference
@@ -1675,7 +1680,7 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
1675
1680
  processedItems.push(_objectSpread(_objectSpread({}, flatItem), {}, {
1676
1681
  total: targetProductTotal,
1677
1682
  price: new Decimal(_productOriginTotal || 0).minus(fixedAmountPerItem).toNumber(),
1678
- discount_list: _this4.filterDiscountListByType(flatItem.discount_list, 'promotion').concat([_discountDetail2]),
1683
+ discount_list: [_discountDetail2],
1679
1684
  processed: true
1680
1685
  }));
1681
1686
  }
@@ -2150,7 +2155,6 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
2150
2155
  }, {
2151
2156
  key: "checkPackageSubItemUsageRules",
2152
2157
  value: function checkPackageSubItemUsageRules(discount, flatItem) {
2153
- var _flatItem$product;
2154
2158
  var limitedData = discount.limited_relation_product_data;
2155
2159
  var usageRules = limitedData === null || limitedData === void 0 ? void 0 : limitedData.package_sub_item_usage_rules;
2156
2160
  var rules = ['original_price'].concat(_toConsumableArray((usageRules === null || usageRules === void 0 ? void 0 : usageRules.rules) || []));
@@ -2172,7 +2176,6 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
2172
2176
  filter = _ref17$filter === void 0 ? 0 : _ref17$filter;
2173
2177
  var isMainProduct = flatItem.type === 'main'; // 单独购买
2174
2178
  var isBundleItem = flatItem.type === 'bundle'; // 套餐中购买
2175
- var bundleMainProductId = (_flatItem$product = flatItem.product) === null || _flatItem$product === void 0 ? void 0 : _flatItem$product.product_id;
2176
2179
 
2177
2180
  // 主商品直接可用
2178
2181
  if (isMainProduct) {
@@ -2215,13 +2218,13 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
2215
2218
  if (!filter) {
2216
2219
  isScopeValid = true;
2217
2220
  } else {
2218
- isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
2221
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
2219
2222
  }
2220
2223
  }
2221
2224
 
2222
2225
  // 包含套餐判断, products值兼容旧数据
2223
2226
  if (scopeType === 'specific_packages' || scopeType === 'products') {
2224
- isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
2227
+ isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
2225
2228
  }
2226
2229
 
2227
2230
  // 价格和套餐适用范围都符合,则可用
@@ -2271,42 +2274,15 @@ export var RulesModule = /*#__PURE__*/function (_BaseModule) {
2271
2274
 
2272
2275
  // 检查 rules
2273
2276
  if (rules.length > 0) {
2274
- var _isOriginalPrice3 = _isOriginalPrice2 && rules.includes('original_price');
2275
- var _isMarkupPrice3 = _isMarkupPrice2 && rules.includes('markup_price');
2276
- // 价格是否符合规则:原价或加价
2277
- var _isPriceValid = _isOriginalPrice3 || _isMarkupPrice3;
2278
- // 套餐适用范围校验
2279
- var _isScopeValid = false;
2280
-
2281
- // 排除套餐判断, product_all值兼容旧数据
2282
- if (scopeType === 'all_packages' || scopeType === 'product_all') {
2283
- // 所有套餐可用
2284
- if (!filter) {
2285
- _isScopeValid = true;
2286
- } else {
2287
- _isScopeValid = !exclude_bundle_product_ids.includes(Number(bundleMainProductId));
2288
- }
2289
- }
2290
-
2291
- // 包含套餐判断, products值兼容旧数据
2292
- if (scopeType === 'specific_packages' || scopeType === 'products') {
2293
- _isScopeValid = include_bundle_product_ids.includes(Number(bundleMainProductId));
2294
- }
2295
-
2296
- // 价格和套餐适用范围都符合,则可用
2297
- if (_isPriceValid && _isScopeValid) {
2277
+ // 检查原价
2278
+ if (_isOriginalPrice2 && rules.includes('original_price')) {
2298
2279
  return true;
2299
2280
  }
2300
2281
 
2301
- // 检查原价
2302
- // if (isOriginalPrice && rules.includes('original_price')) {
2303
- // return true;
2304
- // }
2305
-
2306
2282
  // 检查加价
2307
- // if (isMarkupPrice && rules.includes('markup_price')) {
2308
- // return true;
2309
- // }
2283
+ if (_isMarkupPrice2 && rules.includes('markup_price')) {
2284
+ return true;
2285
+ }
2310
2286
 
2311
2287
  // 如果都不匹配,则不可用
2312
2288
  return false;
@@ -64,19 +64,21 @@ export var SalesSummaryModule = /*#__PURE__*/function (_BaseModule) {
64
64
  this.store.surchargeList = ((_options$initialState = options.initialState) === null || _options$initialState === void 0 ? void 0 : _options$initialState.surchargeList) || [];
65
65
  this.store.summary = ((_options$initialState2 = options.initialState) === null || _options$initialState2 === void 0 ? void 0 : _options$initialState2.summary) || createEmptySalesSummary();
66
66
  this.surchargeListModuleName = ((_this$otherParams = this.otherParams) === null || _this$otherParams === void 0 ? void 0 : _this$otherParams.surchargeListModuleName) || 'surchargeList';
67
-
68
- // if (!this.appPlugin) {
69
- // throw new Error('SalesSummaryModule 需要 app 插件支持');
70
- // }
71
- if (this.request) {
67
+ if (this.appPlugin) {
72
68
  _context.next = 10;
73
69
  break;
74
70
  }
75
- throw new Error('SalesSummaryModule 需要 request 插件支持');
71
+ throw new Error('SalesSummaryModule 需要 app 插件支持');
76
72
  case 10:
77
- _context.next = 12;
78
- return this.getSurchargeList();
73
+ if (this.request) {
74
+ _context.next = 12;
75
+ break;
76
+ }
77
+ throw new Error('SalesSummaryModule 需要 request 插件支持');
79
78
  case 12:
79
+ _context.next = 14;
80
+ return this.getSurchargeList();
81
+ case 14:
80
82
  case "end":
81
83
  return _context.stop();
82
84
  }
@@ -190,11 +192,10 @@ export var SalesSummaryModule = /*#__PURE__*/function (_BaseModule) {
190
192
  }, {
191
193
  key: "getAppData",
192
194
  value: function getAppData(key) {
193
- var _this$appPlugin, _this$appPlugin$getDa, _this$appPlugin2, _this$appPlugin2$getA, _app$models, _app$models$getStore, _app$models$getStore$, _app$models$getStore$2;
194
- var getData = (_this$appPlugin = this.appPlugin) === null || _this$appPlugin === void 0 || (_this$appPlugin$getDa = _this$appPlugin.getData) === null || _this$appPlugin$getDa === void 0 ? void 0 : _this$appPlugin$getDa.call(_this$appPlugin);
195
+ var _this$appPlugin$getDa, _this$appPlugin, _app$models, _app$models$getStore, _app$models$getStore$, _app$models$getStore$2;
196
+ var getData = (_this$appPlugin$getDa = (_this$appPlugin = this.appPlugin).getData) === null || _this$appPlugin$getDa === void 0 ? void 0 : _this$appPlugin$getDa.call(_this$appPlugin);
195
197
  if (typeof getData === 'function') return getData(key);
196
- var app = (_this$appPlugin2 = this.appPlugin) === null || _this$appPlugin2 === void 0 || (_this$appPlugin2$getA = _this$appPlugin2.getApp) === null || _this$appPlugin2$getA === void 0 ? void 0 : _this$appPlugin2$getA.call(_this$appPlugin2);
197
- if (!app) return undefined;
198
+ var app = this.appPlugin.getApp();
198
199
  var coreData = app === null || app === void 0 || (_app$models = app.models) === null || _app$models === void 0 || (_app$models$getStore = _app$models.getStore) === null || _app$models$getStore === void 0 || (_app$models$getStore$ = (_app$models$getStore$2 = _app$models$getStore.call(_app$models)).getDataByModel) === null || _app$models$getStore$ === void 0 ? void 0 : _app$models$getStore$.call(_app$models$getStore$2, 'core', 'core');
199
200
  return coreData === null || coreData === void 0 ? void 0 : coreData[key];
200
201
  }
@@ -87,7 +87,13 @@ function getUnitOriginalTotal(product) {
87
87
  function isGeneratedVoucherProduct(product) {
88
88
  var record = product;
89
89
  var metadata = (record === null || record === void 0 ? void 0 : record.metadata) || {};
90
- return (record === null || record === void 0 ? void 0 : record.extension_type) === 'product_voucher' || metadata.parent_order_detail_id !== undefined || metadata.gift_card_type !== undefined;
90
+ var isGeneratedChild = metadata.parent_order_detail_id !== undefined || metadata.gift_card_type !== undefined;
91
+ if (isGeneratedChild) return true;
92
+
93
+ // `product_voucher` 既可能是当前购物车生成的零价子券,也可能是独立售卖的
94
+ // gift card。已有 order_detail_id 且没有 parent 标记的是后者,必须继续计价。
95
+ var isPersisted = (record === null || record === void 0 ? void 0 : record.order_detail_id) !== undefined && (record === null || record === void 0 ? void 0 : record.order_detail_id) !== null;
96
+ return (record === null || record === void 0 ? void 0 : record.extension_type) === 'product_voucher' && !isPersisted;
91
97
  }
92
98
  function buildSurchargeServiceItems(products) {
93
99
  return products.map(function (product) {
@@ -11,12 +11,10 @@ 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?;
15
14
  initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
16
15
  setContext(context: ScanOrderLoggerContext): void;
17
16
  setProvider(provider: ScanOrderLoggerProviderType): void;
18
17
  setProviderConfig(providerConfig: ScanOrderLoggerProviderConfig): void;
19
- private getCurrentHost;
20
18
  private buildRecord;
21
19
  addLog(params: ScanOrderLogInput): Promise<void>;
22
20
  }
@@ -46,7 +46,6 @@ export var ScanOrderLoggerModule = /*#__PURE__*/function (_BaseModule) {
46
46
  _defineProperty(_assertThisInitialized(_this), "defaultName", 'scanOrderLogger');
47
47
  _defineProperty(_assertThisInitialized(_this), "defaultVersion", '1.0.0');
48
48
  _defineProperty(_assertThisInitialized(_this), "store", void 0);
49
- _defineProperty(_assertThisInitialized(_this), "window", void 0);
50
49
  return _this;
51
50
  }
52
51
  _createClass(ScanOrderLoggerModule, [{
@@ -65,7 +64,6 @@ export var ScanOrderLoggerModule = /*#__PURE__*/function (_BaseModule) {
65
64
  options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
66
65
  this.core = core;
67
66
  this.store = options.store;
68
- this.window = core.getPlugin('window') || undefined;
69
67
  provider = ((_options$otherParams = options.otherParams) === null || _options$otherParams === void 0 ? void 0 : _options$otherParams.provider) || 'feishu';
70
68
  providerConfig = ((_options$otherParams2 = options.otherParams) === null || _options$otherParams2 === void 0 ? void 0 : _options$otherParams2.providerConfig) || {};
71
69
  context = ((_options$otherParams3 = options.otherParams) === null || _options$otherParams3 === void 0 ? void 0 : _options$otherParams3.context) || {};
@@ -75,7 +73,7 @@ export var ScanOrderLoggerModule = /*#__PURE__*/function (_BaseModule) {
75
73
  grafana: _objectSpread(_objectSpread({}, defaultProviderConfig.grafana), providerConfig.grafana || {})
76
74
  });
77
75
  this.store.context = context;
78
- case 10:
76
+ case 9:
79
77
  case "end":
80
78
  return _context.stop();
81
79
  }
@@ -104,27 +102,16 @@ export var ScanOrderLoggerModule = /*#__PURE__*/function (_BaseModule) {
104
102
  grafana: _objectSpread(_objectSpread({}, this.store.providerConfig.grafana || {}), providerConfig.grafana || {})
105
103
  });
106
104
  }
107
- }, {
108
- key: "getCurrentHost",
109
- value: function getCurrentHost() {
110
- var _this$window;
111
- var host = (_this$window = this.window) === null || _this$window === void 0 || (_this$window = _this$window.location) === null || _this$window === void 0 ? void 0 : _this$window.host;
112
- if (typeof host === 'string' && host.length > 0) return host;
113
- return undefined;
114
- }
115
105
  }, {
116
106
  key: "buildRecord",
117
107
  value: function buildRecord(params) {
118
- var host = this.getCurrentHost();
119
108
  return {
120
109
  level: params.level || 'info',
121
110
  title: params.title,
122
111
  timestamp: params.timestamp || dayjs().format('YYYY-MM-DD HH:mm:ss'),
123
112
  payload: params.payload || {},
124
113
  extra: params.extra || {},
125
- context: _objectSpread(_objectSpread({}, this.store.context || {}), host ? {
126
- host: host
127
- } : {})
114
+ context: this.store.context || {}
128
115
  };
129
116
  }
130
117
  }, {
@@ -142,80 +142,62 @@ function _flushQueue() {
142
142
  export var feishuLoggerProvider = {
143
143
  send: function send(payload) {
144
144
  return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
145
- var _payload$providerConf, _payload$providerConf2, _payload$providerConf3, _payload$providerConf4;
146
- var webhook, errorHook, throttleMs;
145
+ var _payload$providerConf, _payload$providerConf2, _payload$providerConf3;
146
+ var webhook, throttleMs;
147
147
  return _regeneratorRuntime().wrap(function _callee$(_context) {
148
148
  while (1) switch (_context.prev = _context.next) {
149
149
  case 0:
150
150
  cachedProviderConfig = payload.providerConfig;
151
151
  webhook = (_payload$providerConf = payload.providerConfig) === null || _payload$providerConf === void 0 || (_payload$providerConf = _payload$providerConf.feishu) === null || _payload$providerConf === void 0 ? void 0 : _payload$providerConf.webhook;
152
- errorHook = (_payload$providerConf2 = payload.providerConfig) === null || _payload$providerConf2 === void 0 || (_payload$providerConf2 = _payload$providerConf2.feishu) === null || _payload$providerConf2 === void 0 ? void 0 : _payload$providerConf2.errorHook;
153
- if (!(typeof fetch !== 'function')) {
154
- _context.next = 6;
155
- break;
156
- }
157
- console.warn('[ScanOrderLogger] 当前环境不支持 fetch,跳过 Feishu 日志上报');
158
- return _context.abrupt("return");
159
- case 6:
160
- if (!(payload.record.level === 'error' && isWebhookUsable(errorHook))) {
161
- _context.next = 16;
162
- break;
163
- }
164
- _context.prev = 7;
165
- _context.next = 10;
166
- return postToFeishu(errorHook, buildFeishuBody([payload.record]));
167
- case 10:
168
- _context.next = 15;
169
- break;
170
- case 12:
171
- _context.prev = 12;
172
- _context.t0 = _context["catch"](7);
173
- console.warn('[ScanOrderLogger] Feishu errorHook 上报失败', _context.t0);
174
- case 15:
175
- return _context.abrupt("return");
176
- case 16:
177
152
  if (webhook) {
178
- _context.next = 19;
153
+ _context.next = 5;
179
154
  break;
180
155
  }
181
156
  console.warn('[ScanOrderLogger] Feishu webhook 未配置,跳过日志上报');
182
157
  return _context.abrupt("return");
183
- case 19:
158
+ case 5:
184
159
  if (isWebhookUsable(webhook)) {
185
- _context.next = 21;
160
+ _context.next = 7;
186
161
  break;
187
162
  }
188
163
  return _context.abrupt("return");
189
- case 21:
190
- throttleMs = (_payload$providerConf3 = (_payload$providerConf4 = payload.providerConfig) === null || _payload$providerConf4 === void 0 || (_payload$providerConf4 = _payload$providerConf4.feishu) === null || _payload$providerConf4 === void 0 ? void 0 : _payload$providerConf4.throttleMs) !== null && _payload$providerConf3 !== void 0 ? _payload$providerConf3 : DEFAULT_THROTTLE_MS;
164
+ case 7:
165
+ if (!(typeof fetch !== 'function')) {
166
+ _context.next = 10;
167
+ break;
168
+ }
169
+ console.warn('[ScanOrderLogger] 当前环境不支持 fetch,跳过 Feishu 日志上报');
170
+ return _context.abrupt("return");
171
+ case 10:
172
+ throttleMs = (_payload$providerConf2 = (_payload$providerConf3 = payload.providerConfig) === null || _payload$providerConf3 === void 0 || (_payload$providerConf3 = _payload$providerConf3.feishu) === null || _payload$providerConf3 === void 0 ? void 0 : _payload$providerConf3.throttleMs) !== null && _payload$providerConf2 !== void 0 ? _payload$providerConf2 : DEFAULT_THROTTLE_MS;
191
173
  if (!(throttleMs <= 0)) {
192
- _context.next = 32;
174
+ _context.next = 21;
193
175
  break;
194
176
  }
195
- _context.prev = 23;
196
- _context.next = 26;
177
+ _context.prev = 12;
178
+ _context.next = 15;
197
179
  return postToFeishu(webhook, buildFeishuBody([payload.record]));
198
- case 26:
199
- _context.next = 31;
180
+ case 15:
181
+ _context.next = 20;
200
182
  break;
201
- case 28:
202
- _context.prev = 28;
203
- _context.t1 = _context["catch"](23);
204
- console.warn('[ScanOrderLogger] Feishu 日志上报失败', _context.t1);
205
- case 31:
183
+ case 17:
184
+ _context.prev = 17;
185
+ _context.t0 = _context["catch"](12);
186
+ console.warn('[ScanOrderLogger] Feishu 日志上报失败', _context.t0);
187
+ case 20:
206
188
  return _context.abrupt("return");
207
- case 32:
189
+ case 21:
208
190
  pendingQueue.push(payload.record);
209
191
  if (!flushTimer) {
210
192
  flushTimer = setTimeout(function () {
211
193
  void flushQueue();
212
194
  }, throttleMs);
213
195
  }
214
- case 34:
196
+ case 23:
215
197
  case "end":
216
198
  return _context.stop();
217
199
  }
218
- }, _callee, null, [[7, 12], [23, 28]]);
200
+ }, _callee, null, [[12, 17]]);
219
201
  }))();
220
202
  }
221
203
  };
@@ -2,7 +2,6 @@ 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;
6
5
  /**
7
6
  * 节流窗口毫秒数,默认 3000ms
8
7
  * - >0:首条日志进入队列并启动定时器,窗口结束后合并成一条 Feishu post 统一发送
@@ -24,9 +24,7 @@ export declare class ScheduleModule extends BaseModule implements Module, Schedu
24
24
  *
25
25
  * @memberof ScheduleModule
26
26
  */
27
- loadAllSchedule(options?: {
28
- useCache?: boolean;
29
- }): Promise<void>;
27
+ loadAllSchedule(): Promise<void>;
30
28
  setScheduleList(list: ScheduleItem[]): void;
31
29
  private syncScheduleMap;
32
30
  getScheduleList(): ScheduleItem[];