@pisell/pisellos 2.1.127 → 2.1.129

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.
@@ -1,9 +0,0 @@
1
- // 导出评估器
2
- export { PromotionEvaluator } from "./evaluator";
3
-
4
- // 导出适配器
5
- export { PromotionAdapter } from "./adapter";
6
- export { default } from "./adapter";
7
-
8
- // 导出策略配置示例常量
9
- export { X_ITEMS_FOR_Y_PRICE_STRATEGY, BUY_X_GET_Y_FREE_STRATEGY } from "./examples";
@@ -325,9 +325,12 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
325
325
  }, {
326
326
  key: "applyDiscount",
327
327
  value: function applyDiscount() {
328
- var _tempOrder$products, _this$store$discount6, _tempOrder$holder3, _tempOrder$holder4;
328
+ var _this$store$discount6, _tempOrder$holder3, _tempOrder$holder4;
329
329
  var tempOrder = this.store.tempOrder;
330
- if (!(tempOrder !== null && tempOrder !== void 0 && (_tempOrder$products = tempOrder.products) !== null && _tempOrder$products !== void 0 && _tempOrder$products.length)) return;
330
+ // 任意 products CRUD 后都应当重算 discount 状态;即使 products 为空,
331
+ // 也需要让 Rules.calcDiscount 把 DiscountModule 的 isSelected / isAvailable /
332
+ // appliedProductDetails / savedAmount 以及 tempOrder.discount_list 复位。
333
+ if (!tempOrder) return;
331
334
  var rulesModule = this.store.rules;
332
335
  if (!rulesModule) return;
333
336
  var discountList = ((_this$store$discount6 = this.store.discount) === null || _this$store$discount6 === void 0 ? void 0 : _this$store$discount6.getDiscountList()) || [];
@@ -71,7 +71,7 @@ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
71
71
  option: any[];
72
72
  product_id: number | null;
73
73
  product_variant_id: number;
74
- quantity: number;
74
+ num: number;
75
75
  rowKey: number | null;
76
76
  session: null;
77
77
  unique: string;
@@ -382,7 +382,7 @@ export function formatV1Product(products) {
382
382
  option: product.product_option_item,
383
383
  product_id: product.product_id,
384
384
  product_variant_id: product.product_variant_id,
385
- quantity: product.num,
385
+ num: product.num,
386
386
  rowKey: product.product_id,
387
387
  session: null,
388
388
  unique: createUuidV4()
@@ -1248,7 +1248,7 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1248
1248
  break;
1249
1249
  }
1250
1250
  sellingPrice = toPriceString((_sourceItem$price = sourceItem === null || sourceItem === void 0 ? void 0 : sourceItem.price) !== null && _sourceItem$price !== void 0 ? _sourceItem$price : sourceItem === null || sourceItem === void 0 ? void 0 : sourceItem.selling_price, '0.00');
1251
- tempOrder.products.push(normalizeOrderProduct({
1251
+ tempOrder.products.push(normalizeOrderProduct(_objectSpread(_objectSpread({}, sourceItem), {}, {
1252
1252
  product_id: productId,
1253
1253
  product_variant_id: productVariantId,
1254
1254
  num: targetQuantity,
@@ -1262,7 +1262,7 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1262
1262
  item_rule_prefill: true,
1263
1263
  item_rule_id: prefillItem.ruleId
1264
1264
  })
1265
- }));
1265
+ })));
1266
1266
  hasChanges = true;
1267
1267
  return _context20.abrupt("continue", 45);
1268
1268
  case 38:
@@ -1300,25 +1300,27 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
1300
1300
  return _context20.finish(52);
1301
1301
  case 55:
1302
1302
  if (!hasChanges) {
1303
- _context20.next = 59;
1303
+ _context20.next = 60;
1304
1304
  break;
1305
1305
  }
1306
- _context20.next = 58;
1306
+ // Prefill 属于 products CRUD 的一种形式:新增后让 Rules 重算,以支持自动应用可用优惠券。
1307
+ this.store.order.applyDiscount();
1308
+ _context20.next = 59;
1307
1309
  return this.store.order.recalculateSummary({
1308
1310
  createIfMissing: true
1309
1311
  });
1310
- case 58:
1311
- this.store.order.persistTempOrder();
1312
1312
  case 59:
1313
- _context20.next = 61;
1313
+ this.store.order.persistTempOrder();
1314
+ case 60:
1315
+ _context20.next = 62;
1314
1316
  return this.refreshItemRuleQuantityLimits();
1315
- case 61:
1317
+ case 62:
1316
1318
  this.itemRulePrefillApplied = true;
1317
1319
  this.logMethodSuccess('applyPrefillByItemRule', {
1318
1320
  prefillCount: prefillItems.length,
1319
1321
  hasChanges: hasChanges
1320
1322
  });
1321
- case 63:
1323
+ case 64:
1322
1324
  case "end":
1323
1325
  return _context20.stop();
1324
1326
  }
@@ -1792,7 +1792,7 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
1792
1792
  key: "setDiscountSelected",
1793
1793
  value: (function () {
1794
1794
  var _setDiscountSelected = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(params) {
1795
- var _tempOrder$holder, _this$store$order$get, _this$store$order$get2, list, beforeTarget, updated, updatedTarget, tempOrder, orderStore, discountModule, rulesModule, holders, nextDiscountList, _tempOrder$holder2, result, beforeSelectedIds, _iterator9, _step9, d, selectedResourceIds, _iterator10, _step10, _product$discount_lis, product, before, totalPerUnitDiscount, newSellingPrice, afterApplyTarget, finalSummary, finalProduct, finalTarget;
1795
+ var _tempOrder$holder, _this$store$order$get, _this$store$order$get2, list, beforeTarget, updated, updatedTarget, tempOrder, orderStore, discountModule, rulesModule, holders, nextDiscountList, _tempOrder$holder2, result, beforeSelectedIds, _iterator9, _step9, d, selectedResourceIds, _iterator10, _step10, _product$_origin, product, totalPerUnitDiscount, newSellingPrice, afterApplyTarget, finalSummary, finalProduct, finalTarget;
1796
1796
  return _regeneratorRuntime().wrap(function _callee21$(_context21) {
1797
1797
  while (1) switch (_context21.prev = _context21.next) {
1798
1798
  case 0:
@@ -1872,70 +1872,71 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
1872
1872
  return d.isSelected;
1873
1873
  }).map(function (d) {
1874
1874
  return d.id;
1875
- }));
1875
+ })); // 无条件归一化:不论 Rules 是否清空 discount_list、长度是否变化,
1876
+ // 都以 original_price - Σ (当前选中 discount_list.amount) 重算 selling_price。
1877
+ // 目的:避免 unselect 后 selling_price 残留、reselect 时把残留价带进下一轮 Rules 造成双折扣。
1878
+ // 手动改价商品(_origin.isManualDiscount=true)不参与券流程归一化,保留手工价。
1876
1879
  _iterator10 = _createForOfIteratorHelper(tempOrder.products);
1877
1880
  _context21.prev = 19;
1878
1881
  _iterator10.s();
1879
1882
  case 21:
1880
1883
  if ((_step10 = _iterator10.n()).done) {
1881
- _context21.next = 30;
1884
+ _context21.next = 32;
1882
1885
  break;
1883
1886
  }
1884
1887
  product = _step10.value;
1885
- if ((_product$discount_lis = product.discount_list) !== null && _product$discount_lis !== void 0 && _product$discount_lis.length) {
1888
+ if (!((_product$_origin = product._origin) !== null && _product$_origin !== void 0 && _product$_origin.isManualDiscount)) {
1886
1889
  _context21.next = 25;
1887
1890
  break;
1888
1891
  }
1889
- return _context21.abrupt("continue", 28);
1892
+ return _context21.abrupt("continue", 30);
1890
1893
  case 25:
1891
- before = product.discount_list.length;
1892
- product.discount_list = product.discount_list.filter(function (pd) {
1894
+ // 1. product.discount_list 和当前选中的 discount 对齐(剔除已取消的券)
1895
+ product.discount_list = (product.discount_list || []).filter(function (pd) {
1893
1896
  var _pd$discount$resource, _pd$discount;
1894
1897
  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;
1895
1898
  return rid != null && selectedResourceIds.has(rid);
1896
1899
  });
1897
- if (product.discount_list.length < before) {
1898
- // 基于剩余的 discount_list 重算 selling_price
1899
- // 约定:pd.amount per-unit 折扣额,remaining 加总即单品券后总折扣。
1900
- totalPerUnitDiscount = product.discount_list.reduce(function (sum, pd) {
1901
- return sum + (pd.amount || 0);
1902
- }, 0);
1903
- newSellingPrice = new Decimal(product.original_price || product.selling_price || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
1904
- product.selling_price = newSellingPrice;
1905
- if (product.metadata) {
1906
- product.metadata.main_product_selling_price = newSellingPrice;
1907
- }
1900
+
1901
+ // 2. original_price 为基准重算 selling_price
1902
+ totalPerUnitDiscount = (product.discount_list || []).reduce(function (sum, pd) {
1903
+ return sum + (pd.amount || 0);
1904
+ }, 0);
1905
+ newSellingPrice = new Decimal(product.original_price || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
1906
+ product.selling_price = newSellingPrice;
1907
+ if (product.metadata) {
1908
+ product.metadata.main_product_selling_price = newSellingPrice;
1908
1909
  }
1909
- case 28:
1910
- _context21.next = 21;
1911
- break;
1912
1910
  case 30:
1913
- _context21.next = 35;
1911
+ _context21.next = 21;
1914
1912
  break;
1915
1913
  case 32:
1916
- _context21.prev = 32;
1914
+ _context21.next = 37;
1915
+ break;
1916
+ case 34:
1917
+ _context21.prev = 34;
1917
1918
  _context21.t0 = _context21["catch"](19);
1918
1919
  _iterator10.e(_context21.t0);
1919
- case 35:
1920
- _context21.prev = 35;
1920
+ case 37:
1921
+ _context21.prev = 37;
1921
1922
  _iterator10.f();
1922
- return _context21.finish(35);
1923
- case 38:
1923
+ return _context21.finish(37);
1924
+ case 40:
1924
1925
  OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
1925
- _context21.next = 41;
1926
+ _context21.next = 43;
1926
1927
  return discountModule === null || discountModule === void 0 ? void 0 : discountModule.setDiscountList(nextDiscountList);
1927
- case 41:
1928
+ case 43:
1928
1929
  tempOrder.discount_list = (nextDiscountList || []).filter(function (d) {
1929
1930
  return d.isSelected;
1930
1931
  });
1931
1932
  afterApplyTarget = this.store.order.getDiscountList().find(function (d) {
1932
1933
  return d.id === params.discountId;
1933
1934
  }) || null;
1934
- _context21.next = 45;
1935
+ _context21.next = 47;
1935
1936
  return this.store.order.recalculateSummary({
1936
1937
  createIfMissing: true
1937
1938
  });
1938
- case 45:
1939
+ case 47:
1939
1940
  this.store.order.persistTempOrder();
1940
1941
  finalSummary = ((_this$store$order$get = this.store.order.getTempOrder()) === null || _this$store$order$get === void 0 ? void 0 : _this$store$order$get.summary) || null;
1941
1942
  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;
@@ -1944,16 +1945,16 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
1944
1945
  return d.id === params.discountId;
1945
1946
  }) || null;
1946
1947
  return _context21.abrupt("return", this.store.order.getDiscountList());
1947
- case 53:
1948
- _context21.prev = 53;
1948
+ case 55:
1949
+ _context21.prev = 55;
1949
1950
  _context21.t1 = _context21["catch"](1);
1950
1951
  this.logMethodError('setDiscountSelected', _context21.t1);
1951
1952
  throw _context21.t1;
1952
- case 57:
1953
+ case 59:
1953
1954
  case "end":
1954
1955
  return _context21.stop();
1955
1956
  }
1956
- }, _callee21, this, [[1, 53], [19, 32, 35, 38]]);
1957
+ }, _callee21, this, [[1, 55], [19, 34, 37, 40]]);
1957
1958
  }));
1958
1959
  function setDiscountSelected(_x14) {
1959
1960
  return _setDiscountSelected.apply(this, arguments);
@@ -2747,25 +2748,27 @@ export var VenueBookingImpl = /*#__PURE__*/function (_BaseModule) {
2747
2748
  return _context36.finish(50);
2748
2749
  case 53:
2749
2750
  if (!hasChanges) {
2750
- _context36.next = 57;
2751
+ _context36.next = 58;
2751
2752
  break;
2752
2753
  }
2753
- _context36.next = 56;
2754
+ // Prefill 属于 products CRUD 的一种形式:新增后让 Rules 重算,以支持自动应用可用优惠券。
2755
+ this.store.order.applyDiscount();
2756
+ _context36.next = 57;
2754
2757
  return this.store.order.recalculateSummary({
2755
2758
  createIfMissing: true
2756
2759
  });
2757
- case 56:
2758
- this.store.order.persistTempOrder();
2759
2760
  case 57:
2760
- _context36.next = 59;
2761
+ this.store.order.persistTempOrder();
2762
+ case 58:
2763
+ _context36.next = 60;
2761
2764
  return this.refreshItemRuleQuantityLimits();
2762
- case 59:
2765
+ case 60:
2763
2766
  this.itemRulePrefillApplied = true;
2764
2767
  this.logMethodSuccess('applyPrefillByItemRule', {
2765
2768
  prefillCount: prefillItems.length,
2766
2769
  hasChanges: hasChanges
2767
2770
  });
2768
- case 61:
2771
+ case 62:
2769
2772
  case "end":
2770
2773
  return _context36.stop();
2771
2774
  }
@@ -231,27 +231,27 @@ var OrderModule = class extends import_BaseModule.BaseModule {
231
231
  };
232
232
  }
233
233
  applyDiscount() {
234
- var _a, _b, _c, _d, _e;
234
+ var _a, _b, _c, _d;
235
235
  const tempOrder = this.store.tempOrder;
236
- if (!((_a = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _a.length))
236
+ if (!tempOrder)
237
237
  return;
238
238
  const rulesModule = this.store.rules;
239
239
  if (!rulesModule)
240
240
  return;
241
- const discountList = ((_b = this.store.discount) == null ? void 0 : _b.getDiscountList()) || [];
242
- const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
241
+ const discountList = ((_a = this.store.discount) == null ? void 0 : _a.getDiscountList()) || [];
242
+ const holders = ((_b = tempOrder.holder) == null ? void 0 : _b.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
243
243
  const result = rulesModule.calcDiscount({
244
244
  productList: tempOrder.products,
245
245
  discountList,
246
246
  holders,
247
- isFormSubject: !!((_d = tempOrder.holder) == null ? void 0 : _d.type) && tempOrder.holder.type === "form"
247
+ isFormSubject: !!((_c = tempOrder.holder) == null ? void 0 : _c.type) && tempOrder.holder.type === "form"
248
248
  });
249
249
  if (result == null ? void 0 : result.productList) {
250
250
  tempOrder.products = result.productList;
251
251
  }
252
252
  if (result == null ? void 0 : result.discountList) {
253
253
  OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
254
- (_e = this.store.discount) == null ? void 0 : _e.setDiscountList(result.discountList);
254
+ (_d = this.store.discount) == null ? void 0 : _d.setDiscountList(result.discountList);
255
255
  tempOrder.discount_list = result.discountList.filter((d) => d.isSelected);
256
256
  }
257
257
  }
@@ -71,7 +71,7 @@ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
71
71
  option: any[];
72
72
  product_id: number | null;
73
73
  product_variant_id: number;
74
- quantity: number;
74
+ num: number;
75
75
  rowKey: number | null;
76
76
  session: null;
77
77
  unique: string;
@@ -364,7 +364,7 @@ function formatV1Product(products) {
364
364
  option: product.product_option_item,
365
365
  product_id: product.product_id,
366
366
  product_variant_id: product.product_variant_id,
367
- quantity: product.num,
367
+ num: product.num,
368
368
  rowKey: product.product_id,
369
369
  session: null,
370
370
  unique: createUuidV4()
@@ -707,6 +707,7 @@ var ScanOrderImpl = class extends import_BaseModule.BaseModule {
707
707
  );
708
708
  tempOrder.products.push(
709
709
  (0, import_utils.normalizeOrderProduct)({
710
+ ...sourceItem,
710
711
  product_id: productId,
711
712
  product_variant_id: productVariantId,
712
713
  num: targetQuantity,
@@ -752,6 +753,7 @@ var ScanOrderImpl = class extends import_BaseModule.BaseModule {
752
753
  }
753
754
  }
754
755
  if (hasChanges) {
756
+ this.store.order.applyDiscount();
755
757
  await this.store.order.recalculateSummary({ createIfMissing: true });
756
758
  this.store.order.persistTempOrder();
757
759
  }
@@ -1152,24 +1152,21 @@ var _VenueBookingImpl = class extends import_BaseModule.BaseModule {
1152
1152
  nextDiscountList.filter((d) => d.isSelected).map((d) => d.id)
1153
1153
  );
1154
1154
  for (const product of tempOrder.products) {
1155
- if (!((_c = product.discount_list) == null ? void 0 : _c.length))
1155
+ if ((_c = product._origin) == null ? void 0 : _c.isManualDiscount)
1156
1156
  continue;
1157
- const before = product.discount_list.length;
1158
- product.discount_list = product.discount_list.filter((pd) => {
1157
+ product.discount_list = (product.discount_list || []).filter((pd) => {
1159
1158
  var _a2;
1160
1159
  const rid = ((_a2 = pd.discount) == null ? void 0 : _a2.resource_id) ?? pd.id;
1161
1160
  return rid != null && selectedResourceIds.has(rid);
1162
1161
  });
1163
- if (product.discount_list.length < before) {
1164
- const totalPerUnitDiscount = product.discount_list.reduce(
1165
- (sum, pd) => sum + (pd.amount || 0),
1166
- 0
1167
- );
1168
- const newSellingPrice = new import_decimal.default(product.original_price || product.selling_price || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
1169
- product.selling_price = newSellingPrice;
1170
- if (product.metadata) {
1171
- product.metadata.main_product_selling_price = newSellingPrice;
1172
- }
1162
+ const totalPerUnitDiscount = (product.discount_list || []).reduce(
1163
+ (sum, pd) => sum + (pd.amount || 0),
1164
+ 0
1165
+ );
1166
+ const newSellingPrice = new import_decimal.default(product.original_price || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
1167
+ product.selling_price = newSellingPrice;
1168
+ if (product.metadata) {
1169
+ product.metadata.main_product_selling_price = newSellingPrice;
1173
1170
  }
1174
1171
  }
1175
1172
  import_Order.OrderModule.populateSavedAmounts(tempOrder.products, nextDiscountList);
@@ -1541,6 +1538,7 @@ var _VenueBookingImpl = class extends import_BaseModule.BaseModule {
1541
1538
  }
1542
1539
  }
1543
1540
  if (hasChanges) {
1541
+ this.store.order.applyDiscount();
1544
1542
  await this.store.order.recalculateSummary({ createIfMissing: true });
1545
1543
  this.store.order.persistTempOrder();
1546
1544
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "2.1.127",
4
+ "version": "2.1.129",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",