@pisell/pisellos 2.2.272 → 2.2.274

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 (113) hide show
  1. package/dist/core/index.d.ts +0 -2
  2. package/dist/core/index.js +0 -7
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +0 -4
  4. package/dist/model/strategy/adapter/promotion/adapter.js +0 -23
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +6 -279
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +0 -86
  8. package/dist/model/strategy/adapter/promotion/examples.js +0 -99
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +2 -90
  12. package/dist/model/strategy/adapter/promotion/type.js +0 -45
  13. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +16 -12
  14. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +6 -3
  15. package/dist/modules/OpenData/index.d.ts +0 -2
  16. package/dist/modules/OpenData/index.js +0 -8
  17. package/dist/modules/Order/index.d.ts +12 -31
  18. package/dist/modules/Order/index.js +562 -778
  19. package/dist/modules/Order/types.d.ts +22 -36
  20. package/dist/modules/Order/types.js +11 -0
  21. package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
  22. package/dist/modules/Order/utils.js +6 -10
  23. package/dist/modules/Payment/index.d.ts +0 -2
  24. package/dist/modules/Payment/index.js +50 -79
  25. package/dist/modules/Payment/types.d.ts +27 -29
  26. package/dist/modules/Payment/types.js +3 -5
  27. package/dist/modules/Rules/index.d.ts +0 -1
  28. package/dist/modules/Rules/index.js +39 -55
  29. package/dist/modules/SalesSummary/utils.js +7 -1
  30. package/dist/server/index.d.ts +0 -16
  31. package/dist/server/index.js +1036 -1933
  32. package/dist/server/modules/order/index.d.ts +4 -49
  33. package/dist/server/modules/order/index.js +695 -1574
  34. package/dist/server/modules/order/types.d.ts +3 -11
  35. package/dist/server/modules/order/types.js +1 -1
  36. package/dist/solution/BaseSales/index.d.ts +25 -59
  37. package/dist/solution/BaseSales/index.js +490 -767
  38. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
  39. package/dist/solution/BaseSales/utils/cartPromotion.js +36 -93
  40. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  41. package/dist/solution/BookingByStep/index.d.ts +1 -1
  42. package/dist/solution/BookingTicket/index.d.ts +5 -21
  43. package/dist/solution/BookingTicket/index.js +49 -126
  44. package/dist/solution/BookingTicket/types.d.ts +3 -0
  45. package/dist/solution/BookingTicket/utils/addProductDecision.js +6 -0
  46. package/dist/solution/BookingTicket/utils/cartView.js +44 -32
  47. package/dist/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  48. package/dist/solution/BookingTicket/utils/weighingProductSku.js +45 -0
  49. package/dist/solution/Sales/index.d.ts +0 -1
  50. package/dist/solution/Sales/index.js +2 -10
  51. package/dist/solution/ScanOrder/index.js +20 -31
  52. package/dist/solution/VenueBooking/index.js +19 -30
  53. package/dist/types/index.d.ts +0 -1
  54. package/lib/core/index.d.ts +0 -2
  55. package/lib/core/index.js +0 -4
  56. package/lib/model/strategy/adapter/promotion/adapter.d.ts +0 -4
  57. package/lib/model/strategy/adapter/promotion/adapter.js +0 -20
  58. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +0 -17
  59. package/lib/model/strategy/adapter/promotion/evaluator.js +0 -235
  60. package/lib/model/strategy/adapter/promotion/examples.d.ts +0 -86
  61. package/lib/model/strategy/adapter/promotion/examples.js +0 -91
  62. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  63. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  64. package/lib/model/strategy/adapter/promotion/type.d.ts +2 -90
  65. package/lib/model/strategy/adapter/promotion/type.js +0 -2
  66. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +5 -2
  67. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +2 -1
  68. package/lib/modules/OpenData/index.d.ts +0 -2
  69. package/lib/modules/OpenData/index.js +0 -5
  70. package/lib/modules/Order/index.d.ts +12 -31
  71. package/lib/modules/Order/index.js +142 -201
  72. package/lib/modules/Order/types.d.ts +22 -36
  73. package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
  74. package/lib/modules/Order/utils.js +4 -11
  75. package/lib/modules/Payment/index.d.ts +0 -2
  76. package/lib/modules/Payment/index.js +13 -34
  77. package/lib/modules/Payment/types.d.ts +27 -29
  78. package/lib/modules/Payment/types.js +3 -3
  79. package/lib/modules/Rules/index.d.ts +0 -1
  80. package/lib/modules/Rules/index.js +22 -41
  81. package/lib/modules/SalesSummary/utils.js +5 -1
  82. package/lib/server/index.d.ts +0 -16
  83. package/lib/server/index.js +18 -670
  84. package/lib/server/modules/order/index.d.ts +4 -49
  85. package/lib/server/modules/order/index.js +66 -657
  86. package/lib/server/modules/order/types.d.ts +3 -11
  87. package/lib/solution/BaseSales/index.d.ts +25 -59
  88. package/lib/solution/BaseSales/index.js +79 -246
  89. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +1 -3
  90. package/lib/solution/BaseSales/utils/cartPromotion.js +17 -65
  91. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  92. package/lib/solution/BookingByStep/index.d.ts +1 -1
  93. package/lib/solution/BookingTicket/index.d.ts +5 -21
  94. package/lib/solution/BookingTicket/index.js +8 -59
  95. package/lib/solution/BookingTicket/types.d.ts +3 -0
  96. package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -0
  97. package/lib/solution/BookingTicket/utils/cartView.js +43 -30
  98. package/lib/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  99. package/lib/solution/BookingTicket/utils/weighingProductSku.js +63 -0
  100. package/lib/solution/Sales/index.d.ts +0 -1
  101. package/lib/solution/Sales/index.js +3 -5
  102. package/lib/solution/ScanOrder/index.js +0 -8
  103. package/lib/solution/VenueBooking/index.js +0 -8
  104. package/lib/types/index.d.ts +0 -1
  105. package/package.json +1 -1
  106. package/dist/modules/Order/payment-utils.d.ts +0 -26
  107. package/dist/modules/Order/payment-utils.js +0 -225
  108. package/dist/utils/payment-number.d.ts +0 -9
  109. package/dist/utils/payment-number.js +0 -69
  110. package/lib/modules/Order/payment-utils.d.ts +0 -26
  111. package/lib/modules/Order/payment-utils.js +0 -224
  112. package/lib/utils/payment-number.d.ts +0 -9
  113. package/lib/utils/payment-number.js +0 -64
@@ -41,10 +41,6 @@ import { composeLinePrice, createUuidV4, getProductSkuOptions, normalizeSubmitCo
41
41
  import dayjs from 'dayjs';
42
42
  import { ItemRuleEvaluator } from "../../model/strategy/adapter/itemRule";
43
43
  export * from "./types";
44
- function isItemRewardProductDiscount(discount) {
45
- var _discount$metadata, _discount$metadata2;
46
- return (discount === null || discount === void 0 ? void 0 : discount.type) === 'product' && (discount === null || discount === void 0 || (_discount$metadata = discount.metadata) === null || _discount$metadata === void 0 ? void 0 : _discount$metadata.source) === 'promotion' && (discount === null || discount === void 0 || (_discount$metadata2 = discount.metadata) === null || _discount$metadata2 === void 0 ? void 0 : _discount$metadata2.actionType) === 'ITEM_REWARD';
47
- }
48
44
  export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
49
45
  _inherits(ScanOrderImpl, _BaseModule);
50
46
  var _super = _createSuper(ScanOrderImpl);
@@ -1181,7 +1177,7 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1181
1177
  _iterator3.s();
1182
1178
  case 19:
1183
1179
  if ((_step3 = _iterator3.n()).done) {
1184
- _context15.next = 36;
1180
+ _context15.next = 33;
1185
1181
  break;
1186
1182
  }
1187
1183
  product = _step3.value;
@@ -1189,15 +1185,8 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1189
1185
  _context15.next = 23;
1190
1186
  break;
1191
1187
  }
1192
- return _context15.abrupt("continue", 34);
1188
+ return _context15.abrupt("continue", 31);
1193
1189
  case 23:
1194
- if (!(product.discount_list || []).some(isItemRewardProductDiscount)) {
1195
- _context15.next = 26;
1196
- break;
1197
- }
1198
- product.discount_list = (product.discount_list || []).filter(isItemRewardProductDiscount);
1199
- return _context15.abrupt("continue", 34);
1200
- case 26:
1201
1190
  product.discount_list = (product.discount_list || []).filter(function (pd) {
1202
1191
  var _pd$discount$resource, _pd$discount;
1203
1192
  var rid = (_pd$discount$resource = (_pd$discount = pd.discount) === null || _pd$discount === void 0 ? void 0 : _pd$discount.resource_id) !== null && _pd$discount$resource !== void 0 ? _pd$discount$resource : pd.id;
@@ -1221,47 +1210,47 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1221
1210
  mainPrice: newMainSellingPrice,
1222
1211
  bundle: product.product_bundle
1223
1212
  });
1224
- case 34:
1213
+ case 31:
1225
1214
  _context15.next = 19;
1226
1215
  break;
1227
- case 36:
1228
- _context15.next = 41;
1216
+ case 33:
1217
+ _context15.next = 38;
1229
1218
  break;
1230
- case 38:
1231
- _context15.prev = 38;
1219
+ case 35:
1220
+ _context15.prev = 35;
1232
1221
  _context15.t0 = _context15["catch"](17);
1233
1222
  _iterator3.e(_context15.t0);
1234
- case 41:
1235
- _context15.prev = 41;
1223
+ case 38:
1224
+ _context15.prev = 38;
1236
1225
  _iterator3.f();
1237
- return _context15.finish(41);
1238
- case 44:
1226
+ return _context15.finish(38);
1227
+ case 41:
1239
1228
  OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
1240
- _context15.next = 47;
1229
+ _context15.next = 44;
1241
1230
  return discountModule === null || discountModule === void 0 ? void 0 : discountModule.setDiscountList(nextDiscountList);
1242
- case 47:
1231
+ case 44:
1243
1232
  tempOrder.discount_list = (nextDiscountList || []).filter(function (d) {
1244
1233
  return d.isSelected;
1245
1234
  });
1246
- _context15.next = 50;
1235
+ _context15.next = 47;
1247
1236
  return this.store.order.recalculateSummary({
1248
1237
  createIfMissing: true
1249
1238
  });
1250
- case 50:
1239
+ case 47:
1251
1240
  this.store.order.persistTempOrder();
1252
1241
  this.logMethodSuccess('setDiscountSelected', params);
1253
- _context15.next = 58;
1242
+ _context15.next = 55;
1254
1243
  break;
1255
- case 54:
1256
- _context15.prev = 54;
1244
+ case 51:
1245
+ _context15.prev = 51;
1257
1246
  _context15.t1 = _context15["catch"](1);
1258
1247
  this.logMethodError('setDiscountSelected', _context15.t1);
1259
1248
  throw _context15.t1;
1260
- case 58:
1249
+ case 55:
1261
1250
  case "end":
1262
1251
  return _context15.stop();
1263
1252
  }
1264
- }, _callee15, this, [[1, 54], [17, 38, 41, 44]]);
1253
+ }, _callee15, this, [[1, 51], [17, 35, 38, 41]]);
1265
1254
  }));
1266
1255
  function setDiscountSelected(_x8) {
1267
1256
  return _setDiscountSelected.apply(this, arguments);
@@ -51,10 +51,6 @@ import { RegisterAndLoginHooks } from "../RegisterAndLogin/types";
51
51
  import Decimal from 'decimal.js';
52
52
  export * from "./types";
53
53
  var OPEN_DATA_SECTION_CODES = ['basic', 'fulfillment', 'reservation', 'sale', 'menu', 'availability', 'workflow', 'checkout'];
54
- function isItemRewardProductDiscount(discount) {
55
- var _discount$metadata, _discount$metadata2;
56
- return (discount === null || discount === void 0 ? void 0 : discount.type) === 'product' && (discount === null || discount === void 0 || (_discount$metadata = discount.metadata) === null || _discount$metadata === void 0 ? void 0 : _discount$metadata.source) === 'promotion' && (discount === null || discount === void 0 || (_discount$metadata2 = discount.metadata) === null || _discount$metadata2 === void 0 ? void 0 : _discount$metadata2.actionType) === 'ITEM_REWARD';
57
- }
58
54
  function cloneCustomDepositData(customDepositData) {
59
55
  if (!customDepositData || _typeof(customDepositData) !== 'object') return undefined;
60
56
  return _objectSpread(_objectSpread({}, customDepositData), {}, {
@@ -2167,7 +2163,7 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
2167
2163
  _iterator14.s();
2168
2164
  case 21:
2169
2165
  if ((_step14 = _iterator14.n()).done) {
2170
- _context21.next = 38;
2166
+ _context21.next = 35;
2171
2167
  break;
2172
2168
  }
2173
2169
  product = _step14.value;
@@ -2175,15 +2171,8 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
2175
2171
  _context21.next = 25;
2176
2172
  break;
2177
2173
  }
2178
- return _context21.abrupt("continue", 36);
2174
+ return _context21.abrupt("continue", 33);
2179
2175
  case 25:
2180
- if (!(product.discount_list || []).some(isItemRewardProductDiscount)) {
2181
- _context21.next = 28;
2182
- break;
2183
- }
2184
- product.discount_list = (product.discount_list || []).filter(isItemRewardProductDiscount);
2185
- return _context21.abrupt("continue", 36);
2186
- case 28:
2187
2176
  // 1. 把 product.discount_list 和当前选中的 discount 对齐(剔除已取消的券)
2188
2177
  product.discount_list = (product.discount_list || []).filter(function (pd) {
2189
2178
  var _pd$discount$resource, _pd$discount;
@@ -2208,36 +2197,36 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
2208
2197
  mainPrice: newMainSellingPrice,
2209
2198
  bundle: product.product_bundle
2210
2199
  });
2211
- case 36:
2200
+ case 33:
2212
2201
  _context21.next = 21;
2213
2202
  break;
2214
- case 38:
2215
- _context21.next = 43;
2203
+ case 35:
2204
+ _context21.next = 40;
2216
2205
  break;
2217
- case 40:
2218
- _context21.prev = 40;
2206
+ case 37:
2207
+ _context21.prev = 37;
2219
2208
  _context21.t0 = _context21["catch"](19);
2220
2209
  _iterator14.e(_context21.t0);
2221
- case 43:
2222
- _context21.prev = 43;
2210
+ case 40:
2211
+ _context21.prev = 40;
2223
2212
  _iterator14.f();
2224
- return _context21.finish(43);
2225
- case 46:
2213
+ return _context21.finish(40);
2214
+ case 43:
2226
2215
  OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
2227
- _context21.next = 49;
2216
+ _context21.next = 46;
2228
2217
  return discountModule === null || discountModule === void 0 ? void 0 : discountModule.setDiscountList(nextDiscountList);
2229
- case 49:
2218
+ case 46:
2230
2219
  tempOrder.discount_list = (nextDiscountList || []).filter(function (d) {
2231
2220
  return d.isSelected;
2232
2221
  });
2233
2222
  afterApplyTarget = this.store.order.getDiscountList().find(function (d) {
2234
2223
  return d.id === params.discountId;
2235
2224
  }) || null;
2236
- _context21.next = 53;
2225
+ _context21.next = 50;
2237
2226
  return this.store.order.recalculateSummary({
2238
2227
  createIfMissing: true
2239
2228
  });
2240
- case 53:
2229
+ case 50:
2241
2230
  this.store.order.persistTempOrder();
2242
2231
  finalSummary = ((_this$store$order$get = this.store.order.getTempOrder()) === null || _this$store$order$get === void 0 ? void 0 : _this$store$order$get.summary) || null;
2243
2232
  finalProduct = ((_this$store$order$get2 = this.store.order.getTempOrder()) === null || _this$store$order$get2 === void 0 || (_this$store$order$get2 = _this$store$order$get2.products) === null || _this$store$order$get2 === void 0 ? void 0 : _this$store$order$get2[0]) || null;
@@ -2246,16 +2235,16 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
2246
2235
  return d.id === params.discountId;
2247
2236
  }) || null;
2248
2237
  return _context21.abrupt("return", this.store.order.getDiscountList());
2249
- case 61:
2250
- _context21.prev = 61;
2238
+ case 58:
2239
+ _context21.prev = 58;
2251
2240
  _context21.t1 = _context21["catch"](1);
2252
2241
  this.logMethodError('setDiscountSelected', _context21.t1);
2253
2242
  throw _context21.t1;
2254
- case 65:
2243
+ case 62:
2255
2244
  case "end":
2256
2245
  return _context21.stop();
2257
2246
  }
2258
- }, _callee21, this, [[1, 61], [19, 40, 43, 46]]);
2247
+ }, _callee21, this, [[1, 58], [19, 37, 40, 43]]);
2259
2248
  }));
2260
2249
  function setDiscountSelected(_x15) {
2261
2250
  return _setDiscountSelected.apply(this, arguments);
@@ -47,7 +47,6 @@ export interface PisellCore {
47
47
  getModule: <T extends Module>(name: string) => T | null;
48
48
  getModuleExports: <T = any>(name: string) => T | null;
49
49
  hasModule: (name: string) => boolean;
50
- getModuleNames: () => string[];
51
50
  effects: {
52
51
  on: (event: string, callback: (payload: any) => void) => () => void;
53
52
  once: (event: string, callback: (payload: any) => void) => () => void;
@@ -28,8 +28,6 @@ declare class PisellOSCore implements PisellCore {
28
28
  getModule<T extends Module>(name: string): T | null;
29
29
  getModuleExports<T = any>(name: string): T | null;
30
30
  hasModule(name: string): boolean;
31
- /** 返回当前已注册模块名,供宿主在切换店铺等生命周期中定向清理运行态。 */
32
- getModuleNames(): string[];
33
31
  destroy(): Promise<void>;
34
32
  setContext(ctx: Partial<BusinessContext>): void;
35
33
  /**
package/lib/core/index.js CHANGED
@@ -210,10 +210,6 @@ var PisellOSCore = class {
210
210
  hasModule(name) {
211
211
  return this.modules.has(name);
212
212
  }
213
- /** 返回当前已注册模块名,供宿主在切换店铺等生命周期中定向清理运行态。 */
214
- getModuleNames() {
215
- return Array.from(this.modules.keys());
216
- }
217
213
  // 销毁方法
218
214
  async destroy() {
219
215
  for (const [name, module2] of this.modules.entries()) {
@@ -48,10 +48,6 @@ export declare class PromotionAdapter implements BusinessAdapter {
48
48
  * 解析 买X送Y Action
49
49
  */
50
50
  private parseBuyXGetYFreeAction;
51
- /**
52
- * 解析 商品奖励 Action
53
- */
54
- private parseItemRewardAction;
55
51
  /**
56
52
  * 获取适用的商品列表
57
53
  *
@@ -134,8 +134,6 @@ var PromotionAdapter = class {
134
134
  return this.parseXItemsForYPriceAction(action);
135
135
  case import_type.PROMOTION_ACTION_TYPES.BUY_X_GET_Y_FREE:
136
136
  return this.parseBuyXGetYFreeAction(action);
137
- case import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD:
138
- return this.parseItemRewardAction(action);
139
137
  default:
140
138
  return void 0;
141
139
  }
@@ -169,24 +167,6 @@ var PromotionAdapter = class {
169
167
  giftProducts: config.giftProducts || []
170
168
  };
171
169
  }
172
- /**
173
- * 解析 商品奖励 Action
174
- */
175
- parseItemRewardAction(action) {
176
- const value = action.value || {};
177
- const config = action.config || {};
178
- return {
179
- type: import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD,
180
- rewardMethod: value.rewardMethod || "free",
181
- rewardValue: Number(value.rewardValue || 0),
182
- quantityRule: value.quantityRule || "per_condition_quantity",
183
- triggerQuantity: Number(value.triggerQuantity || 1),
184
- rewardQuantity: Number(value.rewardQuantity || 1),
185
- maxRewardQuantity: value.maxRewardQuantity === void 0 || value.maxRewardQuantity === null ? void 0 : Number(value.maxRewardQuantity),
186
- rewardTargets: Array.isArray(config.rewardTargets) ? config.rewardTargets : [],
187
- targetSelection: config.targetSelection || "consumer_best"
188
- };
189
- }
190
170
  /**
191
171
  * 获取适用的商品列表
192
172
  *
@@ -169,21 +169,6 @@ export declare class PromotionEvaluator {
169
169
  * 支持 bundle 子商品的数量计算(主商品数量 × 子商品数量)
170
170
  */
171
171
  private processBuyXGetYFree;
172
- /**
173
- * 处理 商品奖励 促销
174
- *
175
- * 1. 使用 group.products 统计触发条件商品数量
176
- * 2. 按 quantityRule 计算最多奖励的目标商品数量
177
- * 3. 在全购物车商品中筛选 rewardTargets
178
- * 4. 按消费者最优(可节省金额从高到低)选择目标单位
179
- * 5. 对目标商品拆分并写入 finalPrice,触发商品本身不改价
180
- */
181
- private processItemReward;
182
- private normalizePositiveInteger;
183
- private getAvailablePromotionQuantity;
184
- private buildItemRewardTargetUnits;
185
- private resolveItemRewardFinalPrice;
186
- private resolveItemRewardLimit;
187
172
  /**
188
173
  * 获取未参与任何促销的商品
189
174
  */
@@ -209,8 +194,6 @@ export declare class PromotionEvaluator {
209
194
  * 检查商品是否在策略的适用范围内
210
195
  */
211
196
  private isProductInStrategy;
212
- private shouldSkipStrategyForProduct;
213
- private hasActionType;
214
197
  /**
215
198
  * 查找商品匹配规则
216
199
  */
@@ -133,9 +133,6 @@ var PromotionEvaluator = class {
133
133
  for (const product of products) {
134
134
  const applicablePromotions = [];
135
135
  for (const config of configs) {
136
- if (this.shouldSkipStrategyForProduct(product, config)) {
137
- continue;
138
- }
139
136
  const matchInfo = this.getProductMatchInfo(product, config);
140
137
  if (!matchInfo.isMatch) {
141
138
  continue;
@@ -299,16 +296,6 @@ var PromotionEvaluator = class {
299
296
  if (result.giftInfo) {
300
297
  gifts.push(result.giftInfo);
301
298
  }
302
- } else if (actionType === import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD) {
303
- const result = this.processItemReward(
304
- group,
305
- processedQuantityMap,
306
- products,
307
- matchedBundleIndexMap
308
- );
309
- pricedProducts.push(...result.products);
310
- totalOriginalAmount = totalOriginalAmount.plus(result.originalAmount);
311
- totalFinalAmount = totalFinalAmount.plus(result.finalAmount);
312
299
  }
313
300
  }
314
301
  const remainingProducts = this.getRemainingProducts(
@@ -392,9 +379,6 @@ var PromotionEvaluator = class {
392
379
  for (const product of products) {
393
380
  const applicableStrategies = [];
394
381
  for (const config of configs) {
395
- if (this.shouldSkipStrategyForProduct(product, config)) {
396
- continue;
397
- }
398
382
  let contextProduct = product;
399
383
  if (!matchVariant) {
400
384
  const productMatchRule = this.findProductMatchRule(config);
@@ -471,9 +455,6 @@ var PromotionEvaluator = class {
471
455
  } else if (actionType === "X_ITEMS_FOR_Y_PRICE") {
472
456
  const detail = actionDetail;
473
457
  requiredQuantity = detail.x || 0;
474
- } else if (actionType === "ITEM_REWARD") {
475
- const detail = actionDetail;
476
- requiredQuantity = detail.triggerQuantity || 1;
477
458
  }
478
459
  const productMatchRule = this.findProductMatchRule(config);
479
460
  const eligibleProducts = (productMatchRule == null ? void 0 : productMatchRule.value) || [];
@@ -787,213 +768,6 @@ var PromotionEvaluator = class {
787
768
  giftInfo
788
769
  };
789
770
  }
790
- /**
791
- * 处理 商品奖励 促销
792
- *
793
- * 1. 使用 group.products 统计触发条件商品数量
794
- * 2. 按 quantityRule 计算最多奖励的目标商品数量
795
- * 3. 在全购物车商品中筛选 rewardTargets
796
- * 4. 按消费者最优(可节省金额从高到低)选择目标单位
797
- * 5. 对目标商品拆分并写入 finalPrice,触发商品本身不改价
798
- */
799
- processItemReward(group, processedQuantityMap, allProducts, matchedBundleIndexMap) {
800
- const {
801
- strategyId,
802
- strategyMetadata,
803
- actionDetail,
804
- products: triggerProducts
805
- } = group;
806
- const detail = actionDetail;
807
- const triggerQuantity = this.normalizePositiveInteger(detail.triggerQuantity, 1);
808
- const rewardQuantity = this.normalizePositiveInteger(detail.rewardQuantity, 1);
809
- const conditionQuantity = this.getAvailablePromotionQuantity(
810
- triggerProducts,
811
- processedQuantityMap,
812
- matchedBundleIndexMap
813
- );
814
- if (conditionQuantity < triggerQuantity) {
815
- return { products: [], originalAmount: 0, finalAmount: 0 };
816
- }
817
- const targetProducts = allProducts.filter(
818
- (product) => this.isProductMatch(product, detail.rewardTargets || [])
819
- );
820
- const targetUnitCandidates = this.buildItemRewardTargetUnits(
821
- targetProducts,
822
- processedQuantityMap,
823
- detail
824
- );
825
- if (targetUnitCandidates.length === 0) {
826
- return { products: [], originalAmount: 0, finalAmount: 0 };
827
- }
828
- const rewardLimit = this.resolveItemRewardLimit(
829
- detail,
830
- conditionQuantity,
831
- triggerQuantity,
832
- rewardQuantity,
833
- targetUnitCandidates.length
834
- );
835
- if (rewardLimit <= 0) {
836
- return { products: [], originalAmount: 0, finalAmount: 0 };
837
- }
838
- const selectedUnits = [...targetUnitCandidates].sort((a, b) => {
839
- const discountDiff = b.discountAmount.minus(a.discountAmount).toNumber();
840
- if (discountDiff !== 0)
841
- return discountDiff;
842
- return b.originalPrice.minus(a.originalPrice).toNumber();
843
- }).slice(0, rewardLimit);
844
- const selectedByProductId = /* @__PURE__ */ new Map();
845
- for (const unit of selectedUnits) {
846
- const existing = selectedByProductId.get(unit.product.id);
847
- if (existing) {
848
- existing.quantity += 1;
849
- } else {
850
- selectedByProductId.set(unit.product.id, {
851
- quantity: 1,
852
- finalPrice: unit.finalPrice,
853
- originalPrice: unit.originalPrice
854
- });
855
- }
856
- }
857
- const result = [];
858
- let originalAmount = new import_decimal.default(0);
859
- let finalAmount = new import_decimal.default(0);
860
- for (const product of targetProducts) {
861
- const key = this.getProductKey(product);
862
- const processedQty = processedQuantityMap.get(key) || 0;
863
- const availableQty = product.quantity - processedQty;
864
- if (availableQty <= 0)
865
- continue;
866
- const selected = selectedByProductId.get(product.id);
867
- const selectedQty = (selected == null ? void 0 : selected.quantity) || 0;
868
- const remainingQty = availableQty - selectedQty;
869
- if (selectedQty <= 0)
870
- continue;
871
- if (selectedQty > 0) {
872
- result.push({
873
- ...product,
874
- id: selectedQty === availableQty ? product.id : this.generateRandomId(),
875
- originalId: product.id,
876
- quantity: selectedQty,
877
- finalPrice: this.formatPrice(selected.finalPrice),
878
- strategyId,
879
- strategyMetadata,
880
- inPromotion: true,
881
- isSplit: selectedQty !== product.quantity
882
- });
883
- originalAmount = originalAmount.plus(
884
- selected.originalPrice.mul(selectedQty)
885
- );
886
- finalAmount = finalAmount.plus(selected.finalPrice.mul(selectedQty));
887
- }
888
- if (remainingQty > 0) {
889
- result.push({
890
- ...product,
891
- quantity: remainingQty,
892
- finalPrice: this.formatPrice(product.price),
893
- strategyId: void 0,
894
- strategyMetadata: void 0,
895
- inPromotion: false,
896
- isSplit: selectedQty > 0
897
- });
898
- const remainingAmount = new import_decimal.default(product.price).mul(remainingQty);
899
- originalAmount = originalAmount.plus(remainingAmount);
900
- finalAmount = finalAmount.plus(remainingAmount);
901
- }
902
- processedQuantityMap.set(key, processedQty + availableQty);
903
- }
904
- return {
905
- products: result,
906
- originalAmount: originalAmount.toNumber(),
907
- finalAmount: finalAmount.toNumber()
908
- };
909
- }
910
- normalizePositiveInteger(value, fallback) {
911
- const n = Math.floor(Number(value));
912
- return Number.isFinite(n) && n > 0 ? n : fallback;
913
- }
914
- getAvailablePromotionQuantity(products, processedQuantityMap, matchedBundleIndexMap) {
915
- let total = 0;
916
- for (const product of products) {
917
- const key = this.getProductKey(product);
918
- const processedQty = processedQuantityMap.get(key) || 0;
919
- const availableQty = product.quantity - processedQty;
920
- if (availableQty <= 0)
921
- continue;
922
- const matchedBundleIndex = matchedBundleIndexMap == null ? void 0 : matchedBundleIndexMap.get(product.id);
923
- if (matchedBundleIndex !== void 0 && product.bundle) {
924
- const bundleItem = product.bundle[matchedBundleIndex];
925
- total += availableQty * ((bundleItem == null ? void 0 : bundleItem.quantity) || 1);
926
- } else {
927
- total += availableQty;
928
- }
929
- }
930
- return total;
931
- }
932
- buildItemRewardTargetUnits(products, processedQuantityMap, detail) {
933
- const units = [];
934
- for (const product of products) {
935
- const key = this.getProductKey(product);
936
- const processedQty = processedQuantityMap.get(key) || 0;
937
- const availableQty = product.quantity - processedQty;
938
- if (availableQty <= 0)
939
- continue;
940
- const originalPrice = new import_decimal.default(product.price || 0);
941
- const finalPrice = this.resolveItemRewardFinalPrice(originalPrice, detail);
942
- const discountAmount = originalPrice.minus(finalPrice);
943
- if (discountAmount.lte(0))
944
- continue;
945
- for (let i = 0; i < availableQty; i++) {
946
- units.push({
947
- product,
948
- originalPrice,
949
- finalPrice,
950
- discountAmount
951
- });
952
- }
953
- }
954
- return units;
955
- }
956
- resolveItemRewardFinalPrice(originalPrice, detail) {
957
- const rewardValue = new import_decimal.default(Number(detail.rewardValue) || 0);
958
- let finalPrice;
959
- switch (detail.rewardMethod) {
960
- case "percent_off": {
961
- const percent = import_decimal.default.min(100, import_decimal.default.max(0, rewardValue));
962
- finalPrice = originalPrice.mul(new import_decimal.default(100).minus(percent)).div(100);
963
- break;
964
- }
965
- case "amount_off":
966
- finalPrice = originalPrice.minus(import_decimal.default.max(0, rewardValue));
967
- break;
968
- case "fixed_price":
969
- finalPrice = import_decimal.default.max(0, rewardValue);
970
- break;
971
- case "free":
972
- default:
973
- finalPrice = new import_decimal.default(0);
974
- break;
975
- }
976
- return import_decimal.default.max(0, import_decimal.default.min(originalPrice, finalPrice)).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP);
977
- }
978
- resolveItemRewardLimit(detail, conditionQuantity, triggerQuantity, rewardQuantity, targetUnitCount) {
979
- let limit = 0;
980
- switch (detail.quantityRule) {
981
- case "all_targets":
982
- limit = targetUnitCount;
983
- break;
984
- case "max_per_order":
985
- limit = this.normalizePositiveInteger(
986
- detail.maxRewardQuantity ?? detail.rewardQuantity,
987
- rewardQuantity
988
- );
989
- break;
990
- case "per_condition_quantity":
991
- default:
992
- limit = Math.floor(conditionQuantity / triggerQuantity) * rewardQuantity;
993
- break;
994
- }
995
- return Math.min(Math.max(0, limit), targetUnitCount);
996
- }
997
771
  /**
998
772
  * 获取未参与任何促销的商品
999
773
  */
@@ -1065,17 +839,8 @@ var PromotionEvaluator = class {
1065
839
  * 检查商品是否在策略的适用范围内
1066
840
  */
1067
841
  isProductInStrategy(product, config) {
1068
- if (this.shouldSkipStrategyForProduct(product, config)) {
1069
- return false;
1070
- }
1071
842
  return this.getProductMatchInfo(product, config).isMatch;
1072
843
  }
1073
- shouldSkipStrategyForProduct(product, config) {
1074
- return Boolean(product._promotionOnlyForItemReward) && !this.hasActionType(config, import_type.PROMOTION_ACTION_TYPES.ITEM_REWARD);
1075
- }
1076
- hasActionType(config, actionType) {
1077
- return (config.actions || []).some((action) => (action == null ? void 0 : action.type) === actionType);
1078
- }
1079
844
  /**
1080
845
  * 查找商品匹配规则
1081
846
  */