@pisell/pisellos 2.1.114 → 2.1.116

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 (102) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.js +0 -1
  3. package/dist/modules/Cart/types.d.ts +0 -2
  4. package/dist/modules/Cart/utils/cartProduct.js +24 -56
  5. package/dist/modules/Discount/types.d.ts +8 -18
  6. package/dist/modules/Payment/index.d.ts +1 -2
  7. package/dist/modules/Payment/index.js +7 -10
  8. package/dist/modules/Payment/utils.js +0 -3
  9. package/dist/modules/Payment/walletpass.d.ts +0 -23
  10. package/dist/modules/Payment/walletpass.js +95 -191
  11. package/dist/modules/Product/index.d.ts +1 -1
  12. package/dist/modules/Rules/index.d.ts +5 -9
  13. package/dist/modules/Rules/index.js +202 -675
  14. package/dist/modules/Rules/types.d.ts +0 -2
  15. package/dist/modules/Summary/types.d.ts +0 -2
  16. package/dist/modules/Summary/utils.d.ts +0 -6
  17. package/dist/modules/Summary/utils.js +0 -21
  18. package/dist/plugins/window.d.ts +0 -2
  19. package/dist/solution/BookingByStep/index.d.ts +1 -2
  20. package/dist/solution/BookingTicket/index.d.ts +1 -1
  21. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +1 -1
  22. package/dist/solution/Checkout/index.js +0 -2
  23. package/dist/solution/ShopDiscount/index.d.ts +0 -1
  24. package/dist/solution/ShopDiscount/index.js +7 -23
  25. package/dist/solution/ShopDiscount/types.d.ts +0 -1
  26. package/dist/solution/ShopDiscount/types.js +1 -2
  27. package/dist/solution/ShopDiscount/utils.js +12 -26
  28. package/lib/index.d.ts +0 -1
  29. package/lib/index.js +1 -3
  30. package/lib/modules/Cart/types.d.ts +0 -2
  31. package/lib/modules/Cart/utils/cartProduct.js +11 -39
  32. package/lib/modules/Discount/types.d.ts +8 -18
  33. package/lib/modules/Payment/index.d.ts +1 -2
  34. package/lib/modules/Payment/index.js +0 -1
  35. package/lib/modules/Payment/utils.js +0 -3
  36. package/lib/modules/Payment/walletpass.d.ts +0 -23
  37. package/lib/modules/Payment/walletpass.js +17 -94
  38. package/lib/modules/Product/index.d.ts +1 -1
  39. package/lib/modules/Rules/index.d.ts +5 -9
  40. package/lib/modules/Rules/index.js +304 -785
  41. package/lib/modules/Rules/types.d.ts +0 -2
  42. package/lib/modules/Summary/types.d.ts +0 -2
  43. package/lib/modules/Summary/utils.d.ts +0 -6
  44. package/lib/modules/Summary/utils.js +0 -15
  45. package/lib/plugins/window.d.ts +0 -2
  46. package/lib/solution/BookingByStep/index.d.ts +1 -2
  47. package/lib/solution/BookingTicket/index.d.ts +1 -1
  48. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +1 -1
  49. package/lib/solution/Checkout/index.js +0 -2
  50. package/lib/solution/ShopDiscount/index.d.ts +0 -1
  51. package/lib/solution/ShopDiscount/index.js +8 -22
  52. package/lib/solution/ShopDiscount/types.d.ts +0 -1
  53. package/lib/solution/ShopDiscount/utils.js +6 -10
  54. package/package.json +1 -1
  55. package/dist/model/index.d.ts +0 -1
  56. package/dist/model/index.js +0 -1
  57. package/dist/model/strategy/adapter/index.d.ts +0 -3
  58. package/dist/model/strategy/adapter/index.js +0 -4
  59. package/dist/model/strategy/adapter/type.d.ts +0 -28
  60. package/dist/model/strategy/adapter/type.js +0 -1
  61. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +0 -84
  62. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -499
  63. package/dist/model/strategy/adapter/walletPass/example.d.ts +0 -4
  64. package/dist/model/strategy/adapter/walletPass/example.js +0 -258
  65. package/dist/model/strategy/adapter/walletPass/index.d.ts +0 -32
  66. package/dist/model/strategy/adapter/walletPass/index.js +0 -182
  67. package/dist/model/strategy/adapter/walletPass/locales.d.ts +0 -1
  68. package/dist/model/strategy/adapter/walletPass/locales.js +0 -26
  69. package/dist/model/strategy/adapter/walletPass/type.d.ts +0 -187
  70. package/dist/model/strategy/adapter/walletPass/type.js +0 -1
  71. package/dist/model/strategy/adapter/walletPass/utils.d.ts +0 -50
  72. package/dist/model/strategy/adapter/walletPass/utils.js +0 -1104
  73. package/dist/model/strategy/index.d.ts +0 -94
  74. package/dist/model/strategy/index.js +0 -551
  75. package/dist/model/strategy/strategy-example.d.ts +0 -5
  76. package/dist/model/strategy/strategy-example.js +0 -331
  77. package/dist/model/strategy/type.d.ts +0 -228
  78. package/dist/model/strategy/type.js +0 -94
  79. package/lib/model/index.d.ts +0 -1
  80. package/lib/model/index.js +0 -23
  81. package/lib/model/strategy/adapter/index.d.ts +0 -3
  82. package/lib/model/strategy/adapter/index.js +0 -45
  83. package/lib/model/strategy/adapter/type.d.ts +0 -28
  84. package/lib/model/strategy/adapter/type.js +0 -17
  85. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +0 -84
  86. package/lib/model/strategy/adapter/walletPass/evaluator.js +0 -423
  87. package/lib/model/strategy/adapter/walletPass/example.d.ts +0 -4
  88. package/lib/model/strategy/adapter/walletPass/example.js +0 -207
  89. package/lib/model/strategy/adapter/walletPass/index.d.ts +0 -32
  90. package/lib/model/strategy/adapter/walletPass/index.js +0 -142
  91. package/lib/model/strategy/adapter/walletPass/locales.d.ts +0 -1
  92. package/lib/model/strategy/adapter/walletPass/locales.js +0 -54
  93. package/lib/model/strategy/adapter/walletPass/type.d.ts +0 -187
  94. package/lib/model/strategy/adapter/walletPass/type.js +0 -17
  95. package/lib/model/strategy/adapter/walletPass/utils.d.ts +0 -50
  96. package/lib/model/strategy/adapter/walletPass/utils.js +0 -791
  97. package/lib/model/strategy/index.d.ts +0 -94
  98. package/lib/model/strategy/index.js +0 -413
  99. package/lib/model/strategy/strategy-example.d.ts +0 -5
  100. package/lib/model/strategy/strategy-example.js +0 -318
  101. package/lib/model/strategy/type.d.ts +0 -228
  102. package/lib/model/strategy/type.js +0 -44
@@ -50,7 +50,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
50
50
  this.core = core;
51
51
  this.hooks = options == null ? void 0 : options.hooks;
52
52
  this.store = options == null ? void 0 : options.store;
53
- this.window = core.getPlugin("window");
54
53
  }
55
54
  async setRulesList(rulesList) {
56
55
  this.store.rulesList = rulesList;
@@ -72,16 +71,11 @@ var RulesModule = class extends import_BaseModule.BaseModule {
72
71
  return false;
73
72
  return (productHolderId || orderHolderId) === discount.holder.holder_id;
74
73
  }
75
- getWalletPassEvaluator() {
76
- var _a, _b;
77
- return (_b = (_a = this.window).getWalletPassEvaluator) == null ? void 0 : _b.call(_a);
78
- }
79
74
  // 判断discountList 是否可以对当前productList生效
80
75
  isDiscountListAvailable({
81
76
  oldDiscountList,
82
77
  newDiscountList,
83
78
  productList,
84
- orderTotalAmount,
85
79
  holders,
86
80
  isFormSubject
87
81
  }) {
@@ -114,7 +108,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
114
108
  const result = this.calcDiscount({
115
109
  discountList: mergedDiscountList,
116
110
  productList: [...productList],
117
- orderTotalAmount,
118
111
  holders,
119
112
  isFormSubject
120
113
  }, {
@@ -190,8 +183,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
190
183
  discountList,
191
184
  productList,
192
185
  holders,
193
- isFormSubject,
194
- orderTotalAmount
186
+ isFormSubject
195
187
  }, options) {
196
188
  const editModeDiscount = [];
197
189
  const addModeDiscount = [];
@@ -370,63 +362,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
370
362
  }
371
363
  return priceB.minus(priceA).toNumber();
372
364
  });
373
- const evaluator = this.getWalletPassEvaluator();
374
- if (evaluator) {
375
- addModeDiscount.forEach((discount) => {
376
- var _a, _b;
377
- const discountType = discount.tag || discount.type;
378
- if (["good_pass", "discount_card", "product_discount_card"].includes(
379
- discountType
380
- )) {
381
- const voucher = {
382
- id: discount.id,
383
- amount: Number(discount.par_value || 0),
384
- balance: Number(discount.balance || 0),
385
- type: discountType,
386
- product_id: discount.product_id,
387
- unified_available_status: 1,
388
- available_product_type: (_a = discount.limited_relation_product_data) == null ? void 0 : _a.type,
389
- available_product_ids: (_b = discount.limited_relation_product_data) == null ? void 0 : _b.product_ids
390
- };
391
- const productsForEvaluate = sortedFlattenedList.map((item) => {
392
- var _a2;
393
- return {
394
- product_id: item.id,
395
- price: item.price || 0,
396
- quantity: item.quantity || item.num || 1,
397
- selling_price: item.price || 0,
398
- product_options: item.type === "main" ? (_a2 = item.product) == null ? void 0 : _a2.options : void 0
399
- };
400
- });
401
- const result = evaluator.checkVoucherAvailability({
402
- orderTotalAmount,
403
- products: productsForEvaluate,
404
- vouchers: [voucher]
405
- });
406
- if (result.isAvailable) {
407
- discount.config = {
408
- ...result.config,
409
- isAvailable: true
410
- };
411
- } else {
412
- discount.config = {
413
- isAvailable: false
414
- };
415
- }
416
- }
417
- });
418
- }
419
365
  const usedDiscounts = /* @__PURE__ */ new Map();
420
- const usedProductIdCounts = /* @__PURE__ */ new Map();
421
- const usedDiscountCardLimitCounts = /* @__PURE__ */ new Map();
422
- editModeDiscount.forEach((discount) => {
423
- var _a;
424
- const discountType = discount.tag || discount.type;
425
- if (["discount_card", "product_discount_card"].includes(discountType)) {
426
- const currentCount = usedDiscountCardLimitCounts.get(discount.id) || 0;
427
- usedDiscountCardLimitCounts.set(discount.id, currentCount + (((_a = discount.metadata) == null ? void 0 : _a.num) || 1));
428
- }
429
- });
430
366
  const discountApplicability = /* @__PURE__ */ new Map();
431
367
  const discountApplicableProducts = /* @__PURE__ */ new Map();
432
368
  addModeDiscount.forEach((discount) => {
@@ -566,7 +502,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
566
502
  originProduct = flatItem.originProduct;
567
503
  } else {
568
504
  product = {
569
- startDate: (_a = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _a.startDate,
570
505
  _id: flatItem._id,
571
506
  id: flatItem.id,
572
507
  price: flatItem.price,
@@ -575,12 +510,13 @@ var RulesModule = class extends import_BaseModule.BaseModule {
575
510
  total: flatItem.total,
576
511
  origin_total: flatItem.origin_total,
577
512
  booking_id: flatItem.booking_id,
578
- discount_list: flatItem.discount_list || []
513
+ discount_list: flatItem.discount_list || [],
514
+ startDate: (_a = flatItem.parentProduct) == null ? void 0 : _a.startDate
579
515
  };
580
516
  originProduct = flatItem.originProduct;
581
517
  }
582
518
  addModeDiscount.forEach((discount) => {
583
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j;
519
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
584
520
  const limitedData = discount == null ? void 0 : discount.limited_relation_product_data;
585
521
  const _tempVar = (flatItem == null ? void 0 : flatItem.type) === "bundle" ? flatItem == null ? void 0 : flatItem.parentProduct : flatItem == null ? void 0 : flatItem.product;
586
522
  const isHolderMatch = this.checkHolderMatch(
@@ -593,7 +529,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
593
529
  );
594
530
  let timeLimit = true;
595
531
  timeLimit = !!(0, import_utils.filterDiscountListByBookingTime)([discount], ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format("YYYY-MM-DD HH:mm:ss")).length;
596
- const isLimitedProduct = (limitedData.type === "product_all" && limitedData.filter !== 1 || limitedData.type === "product_all" && limitedData.filter === 1 && !limitedData.exclude_product_ids.includes(product.id) || limitedData.product_ids && limitedData.product_ids.includes(product.id)) && isHolderMatch;
532
+ const isLimitedProduct = (limitedData.type === "product_all" || limitedData.product_ids && limitedData.product_ids.includes(product.id)) && isHolderMatch;
597
533
  const isAvailableProduct = flatItem.type === "main" ? !((product == null ? void 0 : product.booking_id) && ((_a2 = product == null ? void 0 : product.discount_list) == null ? void 0 : _a2.length) && ((_b = product == null ? void 0 : product.discount_list) == null ? void 0 : _b.every(
598
534
  (discount2) => discount2.id && [
599
535
  "good_pass",
@@ -602,8 +538,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
602
538
  ].includes(discount2.tag || discount2.type)
603
539
  ))) : !((flatItem == null ? void 0 : flatItem.booking_id) && !!((_d = (_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.discount_list) == null ? void 0 : _d.length) && ((_f = (_e = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _e.discount_list) == null ? void 0 : _f.every((discount2) => discount2.id)));
604
540
  const isBundleAvailable = this.checkPackageSubItemUsageRules(discount, flatItem);
605
- if (isAvailableProduct && isLimitedProduct && timeLimit && isBundleAvailable && ((_g = discount.config) == null ? void 0 : _g.isAvailable)) {
606
- (_h = discountApplicability.get(discount.id)) == null ? void 0 : _h.push(product.id);
541
+ if (isAvailableProduct && isLimitedProduct && timeLimit && isBundleAvailable) {
542
+ (_g = discountApplicability.get(discount.id)) == null ? void 0 : _g.push(product.id);
607
543
  const applicableProducts = discountApplicableProducts.get(discount.id) || [];
608
544
  const discountType = discount.tag || discount.type;
609
545
  const isGoodPass = discountType === "good_pass";
@@ -613,15 +549,14 @@ var RulesModule = class extends import_BaseModule.BaseModule {
613
549
  type: discountType,
614
550
  tag: discountType,
615
551
  discount: {
616
- discount_card_type: (_i = discount == null ? void 0 : discount.metadata) == null ? void 0 : _i.discount_card_type,
552
+ discount_card_type: (_h = discount == null ? void 0 : discount.metadata) == null ? void 0 : _h.discount_card_type,
617
553
  fixed_amount: product.price,
618
- discount_calculation_mode: (_j = discount == null ? void 0 : discount.metadata) == null ? void 0 : _j.discount_calculation_mode,
554
+ discount_calculation_mode: (_i = discount == null ? void 0 : discount.metadata) == null ? void 0 : _i.discount_calculation_mode,
619
555
  resource_id: discount.id,
620
556
  title: discount.format_title,
621
557
  original_amount: product.price || product.origin_total,
622
558
  pre_value: discount.par_value,
623
- product_id: originProduct.id,
624
- discount_product_id: discount.product_id
559
+ product_id: originProduct.id
625
560
  },
626
561
  metadata: {
627
562
  num,
@@ -634,102 +569,44 @@ var RulesModule = class extends import_BaseModule.BaseModule {
634
569
  });
635
570
  });
636
571
  const processedFlatItemsMap = /* @__PURE__ */ new Map();
637
- const applyDiscountToOptions = (options2, discount) => {
638
- if (!(options2 == null ? void 0 : options2.length))
639
- return { discountedOptions: options2, optionDiscountAmount: 0 };
640
- let optionDiscountAmount = 0;
641
- const discountedOptions = options2.map((option) => {
642
- const rawUnit = option._original_price ?? option._original_add_price ?? option.price ?? option.add_price;
643
- const baseUnitNum = Number(rawUnit ?? 0);
644
- if (baseUnitNum <= 0)
645
- return option;
646
- const discountedPrice = (0, import_utils.getDiscountAmount)(discount, baseUnitNum, baseUnitNum);
647
- const optQty = Number(option.num ?? option.quantity ?? 1);
648
- optionDiscountAmount = new import_decimal.default(optionDiscountAmount).plus(new import_decimal.default(baseUnitNum).minus(discountedPrice).mul(optQty)).toNumber();
649
- const { _original_add_price, ...rest } = option;
650
- const tmpl = rest.price ?? rest.add_price;
651
- const nextPrice = typeof tmpl === "string" ? String(discountedPrice) : discountedPrice;
652
- return {
653
- ...rest,
654
- _original_price: option._original_price ?? (_original_add_price !== void 0 ? _original_add_price : rawUnit),
655
- price: nextPrice
656
- };
657
- });
658
- return { discountedOptions, optionDiscountAmount };
659
- };
660
- const restoreOptionPrices = (options2) => {
661
- if (!(options2 == null ? void 0 : options2.length))
662
- return options2;
663
- return options2.map((option) => {
664
- const orig = option._original_price !== void 0 ? option._original_price : option._original_add_price;
665
- if (orig !== void 0) {
666
- const { _original_price, _original_add_price, ...rest } = option;
667
- return { ...rest, price: orig };
668
- }
669
- return option;
670
- });
671
- };
672
- const getOptionTotal = (options2) => {
673
- if (!(options2 == null ? void 0 : options2.length))
674
- return 0;
675
- return options2.reduce((sum, opt) => {
676
- const unit = Number(opt.price ?? opt.add_price ?? 0);
677
- const n = Number(opt.num ?? opt.quantity ?? 1);
678
- return new import_decimal.default(sum).plus(new import_decimal.default(unit).mul(n)).toNumber();
679
- }, 0);
680
- };
681
572
  sortedFlattenedList.forEach((flatItem, index) => {
682
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M;
573
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C;
683
574
  let product, originProduct;
684
575
  if (flatItem.type === "main") {
685
576
  product = flatItem.product;
686
577
  originProduct = flatItem.originProduct;
687
578
  } else {
688
579
  product = {
689
- startDate: (_a = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _a.startDate,
690
580
  _id: flatItem._id,
691
581
  id: flatItem.id,
692
582
  price: flatItem.price,
693
583
  quantity: flatItem.quantity,
694
584
  num: flatItem.num,
695
585
  total: flatItem.total,
696
- original_price: (_b = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _b.original_price,
697
- origin_total: (_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.original_price,
586
+ original_price: (_a = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _a.original_price,
587
+ origin_total: (_b = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _b.original_price,
698
588
  booking_id: flatItem.booking_id,
699
- discount_list: ((_d = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _d.discount_list) || []
589
+ discount_list: ((_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.discount_list) || [],
590
+ startDate: (_d = flatItem.parentProduct) == null ? void 0 : _d.startDate
700
591
  };
701
592
  originProduct = flatItem.originProduct;
702
593
  }
703
- if ((product == null ? void 0 : product.booking_id) && ((_e = product.discount_list) == null ? void 0 : _e.length) && ((_f = product == null ? void 0 : product.discount_list) == null ? void 0 : _f.every(
704
- (discount) => discount.id && ["good_pass", "discount_card", "product_discount_card"].includes(
705
- discount.tag || discount.type
706
- )
707
- ))) {
594
+ if ((product == null ? void 0 : product.booking_id) && ((_e = product.discount_list) == null ? void 0 : _e.length) && ((_f = product == null ? void 0 : product.discount_list) == null ? void 0 : _f.every((discount) => discount.id && ["good_pass", "discount_card", "product_discount_card"].includes(discount.tag || discount.type)))) {
708
595
  if (flatItem.type === "main") {
709
596
  processedProductsMap.set(product._id, [originProduct]);
710
597
  } else {
711
- processedFlatItemsMap.set(flatItem._id, [
712
- {
713
- ...flatItem,
714
- processed: true
715
- }
716
- ]);
598
+ processedFlatItemsMap.set(flatItem._id, [{
599
+ ...flatItem,
600
+ processed: true
601
+ }]);
717
602
  }
718
603
  return;
719
604
  }
720
605
  const applicableDiscounts = sortedDiscountList.filter((discount) => {
721
- var _a2, _b2, _c2, _d2, _e2;
722
- const discountType2 = discount.tag || discount.type;
723
- if (["good_pass", "discount_card", "product_discount_card"].includes(
724
- discountType2
725
- )) {
726
- if (discount.config === void 0 || !((_a2 = discount == null ? void 0 : discount.config) == null ? void 0 : _a2.isAvailable)) {
727
- return false;
728
- }
729
- }
730
- if ((Number(product.price) <= 0 || !product.price) && !((_b2 = product.discount_list) == null ? void 0 : _b2.length) && (discount.tag || discount.type) === "good_pass")
606
+ var _a2, _b2;
607
+ if ((Number(product.price) <= 0 || !product.price) && !((_a2 = product.discount_list) == null ? void 0 : _a2.length) && (discount.tag || discount.type) === "good_pass")
731
608
  return false;
732
- if ((Number(product.total) <= 0 || !product.total) && !((_c2 = product.discount_list) == null ? void 0 : _c2.find((n) => {
609
+ if ((Number(product.price) <= 0 || !product.price) && !((_b2 = product.discount_list) == null ? void 0 : _b2.find((n) => {
733
610
  var _a3;
734
611
  return ((_a3 = n.discount) == null ? void 0 : _a3.resource_id) === discount.id;
735
612
  })) && (discount.tag || discount.type) !== "good_pass")
@@ -737,25 +614,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
737
614
  const targetUsedDiscounts = usedDiscounts.get(discount.id);
738
615
  if (targetUsedDiscounts && (discount.tag || discount.type) === "good_pass")
739
616
  return false;
740
- if ((discount.tag || discount.type) === "good_pass") {
741
- const maxUsagePerOrder = (_d2 = discount.config) == null ? void 0 : _d2.maxUsagePerOrder;
742
- if (maxUsagePerOrder && maxUsagePerOrder > 0) {
743
- const currentUsedCount = usedProductIdCounts.get(discount.product_id) || 0;
744
- if (currentUsedCount >= maxUsagePerOrder) {
745
- return false;
746
- }
747
- }
748
- }
749
- const discountTypeForLimit = discount.tag || discount.type;
750
- if (["discount_card", "product_discount_card"].includes(discountTypeForLimit)) {
751
- const applicableProductLimitConfig = ((_e2 = discount.config) == null ? void 0 : _e2.applicableProductLimit) || 0;
752
- if (applicableProductLimitConfig > 0) {
753
- const currentUsedLimitCount = usedDiscountCardLimitCounts.get(discount.id) || 0;
754
- if (currentUsedLimitCount >= applicableProductLimitConfig) {
755
- return false;
756
- }
757
- }
758
- }
759
617
  const limitedData = discount.limited_relation_product_data;
760
618
  const _tempVar = (flatItem == null ? void 0 : flatItem.type) === "bundle" ? flatItem == null ? void 0 : flatItem.parentProduct : flatItem == null ? void 0 : flatItem.product;
761
619
  const isHolderMatch = this.checkHolderMatch(
@@ -774,9 +632,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
774
632
  return false;
775
633
  }
776
634
  if (limitedData.type === "product_all") {
777
- if (limitedData.filter === 1 && limitedData.exclude_product_ids.includes(product.id)) {
778
- return false;
779
- }
780
635
  if (!this.checkPackageSubItemUsageRules(discount, flatItem)) {
781
636
  return false;
782
637
  }
@@ -789,36 +644,21 @@ var RulesModule = class extends import_BaseModule.BaseModule {
789
644
  }
790
645
  return false;
791
646
  });
792
- const selectedDiscountCard = applicableDiscounts.find(
793
- (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
794
- );
647
+ const selectedDiscountCard = applicableDiscounts.find((n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass");
795
648
  const selectedDiscount = selectedDiscountCard || applicableDiscounts[0];
796
649
  let isManualDiscount = false;
797
650
  if (flatItem.type === "main") {
798
- isManualDiscount = typeof product.isManualDiscount === "boolean" ? product.isManualDiscount : product.total != product.origin_total && (product.bundle || []).every(
799
- (item) => {
800
- var _a2;
801
- return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
802
- }
803
- ) && (!((_g = product.discount_list) == null ? void 0 : _g.length) || ((_i = (_h = product == null ? void 0 : product.discount_list) == null ? void 0 : _h.every) == null ? void 0 : _i.call(
804
- _h,
805
- (item) => item.type === "product"
806
- )));
807
- if (product.inPromotion) {
808
- isManualDiscount = false;
809
- }
651
+ isManualDiscount = typeof product.isManualDiscount === "boolean" ? product.isManualDiscount : product.total != product.origin_total && (product.bundle || []).every((item) => {
652
+ var _a2;
653
+ return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
654
+ }) && (!((_g = product.discount_list) == null ? void 0 : _g.length) || ((_i = (_h = product == null ? void 0 : product.discount_list) == null ? void 0 : _h.every) == null ? void 0 : _i.call(_h, (item) => item.type === "product")));
810
655
  } else {
811
656
  const parentProduct = flatItem.parentProduct;
812
657
  if (parentProduct) {
813
- isManualDiscount = typeof parentProduct.isManualDiscount === "boolean" ? parentProduct.isManualDiscount : parentProduct.total != parentProduct.origin_total && (parentProduct.bundle || []).every(
814
- (item) => {
815
- var _a2;
816
- return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
817
- }
818
- ) && (!((_j = parentProduct.discount_list) == null ? void 0 : _j.length) || ((_l = (_k = parentProduct == null ? void 0 : parentProduct.discount_list) == null ? void 0 : _k.every) == null ? void 0 : _l.call(
819
- _k,
820
- (item) => item.type === "product"
821
- )));
658
+ isManualDiscount = typeof parentProduct.isManualDiscount === "boolean" ? parentProduct.isManualDiscount : parentProduct.total != parentProduct.origin_total && (parentProduct.bundle || []).every((item) => {
659
+ var _a2;
660
+ return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
661
+ }) && (!((_j = parentProduct.discount_list) == null ? void 0 : _j.length) || ((_l = (_k = parentProduct == null ? void 0 : parentProduct.discount_list) == null ? void 0 : _k.every) == null ? void 0 : _l.call(_k, (item) => item.type === "product")));
822
662
  }
823
663
  }
824
664
  if (options == null ? void 0 : options.discountId) {
@@ -870,17 +710,17 @@ var RulesModule = class extends import_BaseModule.BaseModule {
870
710
  }
871
711
  if (applicableDiscounts.length === 0 || isManualDiscount || (0, import_lodash_es.isBoolean)(product.vouchersApplicable) && !product.vouchersApplicable) {
872
712
  if (flatItem.type === "main") {
873
- const restoredOptions = restoreOptionPrices(product.options);
874
713
  if (product.isClient) {
875
- processedProductsMap.set(product._id, [
876
- this.hooks.setProduct(originProduct, {
714
+ processedProductsMap.set(
715
+ product._id,
716
+ [this.hooks.setProduct(originProduct, {
877
717
  ...isManualDiscount ? {} : {
878
718
  origin_total: (0, import_utils2.getProductOriginTotalPrice)({
879
719
  product: {
880
720
  original_price: product.original_price
881
721
  },
882
722
  bundle: product.bundle,
883
- options: restoredOptions
723
+ options: product.options
884
724
  }),
885
725
  variant: originProduct._productInit.variant,
886
726
  original_price: originProduct._productInit.original_price,
@@ -889,14 +729,13 @@ var RulesModule = class extends import_BaseModule.BaseModule {
889
729
  price: product.price
890
730
  },
891
731
  bundle: product.bundle,
892
- options: restoredOptions
732
+ options: product.options
893
733
  }),
894
- price: product.price,
895
- options: restoredOptions
734
+ price: product.price
896
735
  },
897
736
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
898
- })
899
- ]);
737
+ })]
738
+ );
900
739
  } else {
901
740
  let total = product.inPromotion ? ((_u = product == null ? void 0 : product._promotion) == null ? void 0 : _u.finalPrice) ?? product.origin_total ?? product.total : product.origin_total ?? product.total;
902
741
  let main_product_selling_price = product.price ?? product.main_product_selling_price;
@@ -906,20 +745,17 @@ var RulesModule = class extends import_BaseModule.BaseModule {
906
745
  }
907
746
  processedProductsMap.set(
908
747
  product._id,
909
- [
910
- this.hooks.setProduct(originProduct, {
911
- ...isManualDiscount ? {
912
- price: product.price
913
- } : {
914
- _id: product._id.split("___")[0] + "___" + index,
915
- total,
916
- price: product.price,
917
- main_product_selling_price,
918
- options: restoredOptions
919
- },
920
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
921
- })
922
- ]
748
+ [this.hooks.setProduct(originProduct, {
749
+ ...isManualDiscount ? {
750
+ price: product.price
751
+ } : {
752
+ _id: product._id.split("___")[0] + "___" + index,
753
+ total,
754
+ price: product.price,
755
+ main_product_selling_price
756
+ },
757
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
758
+ })]
923
759
  );
924
760
  }
925
761
  } else {
@@ -935,166 +771,104 @@ var RulesModule = class extends import_BaseModule.BaseModule {
935
771
  if (applicableDiscounts.length && product.booking_id && typeof selectedDiscount.isManualSelect === "undefined" && !(options == null ? void 0 : options.scan) && !isEditModeAddNewProduct) {
936
772
  return;
937
773
  }
938
- const discountType = selectedDiscount.tag || selectedDiscount.type;
939
- const isGoodPass = discountType === "good_pass";
940
- const isDiscountCard = ["discount_card", "product_discount_card"].includes(discountType);
941
- const applicableProductLimit = ((_w = selectedDiscount.config) == null ? void 0 : _w.applicableProductLimit) || 0;
942
- const isNeedSplit = isGoodPass || isDiscountCard && applicableProductLimit > 0;
774
+ const isNeedSplit = (selectedDiscount.tag || selectedDiscount.type) === "good_pass";
943
775
  const totalQuantity = product.quantity || product.num || 1;
944
- const availableGoodPassCount = applicableDiscounts.filter(
945
- (item) => (item.tag || item.type) === "good_pass"
946
- ).length;
947
- let maxUsageLimit;
948
- if (isGoodPass) {
949
- maxUsageLimit = availableGoodPassCount;
950
- if (selectedDiscount.config && selectedDiscount.config.maxUsagePerOrder) {
951
- maxUsageLimit = Math.min(
952
- availableGoodPassCount,
953
- selectedDiscount.config.maxUsagePerOrder
954
- );
955
- }
956
- } else if (isDiscountCard && applicableProductLimit > 0) {
957
- const usedLimitCount = usedDiscountCardLimitCounts.get(selectedDiscount.id) || 0;
958
- maxUsageLimit = Math.max(0, applicableProductLimit - usedLimitCount);
959
- } else {
960
- maxUsageLimit = 1;
961
- }
962
- const splitCount = isNeedSplit ? Math.min(product.quantity || product.num || 1, maxUsageLimit) : 1;
776
+ const availableGoodPassCount = applicableDiscounts.filter((item) => (item.tag || item.type) === "good_pass").length;
777
+ const splitCount = isNeedSplit ? Math.min(totalQuantity, availableGoodPassCount) : 1;
963
778
  const arr = [];
964
779
  if (flatItem.type === "main") {
965
780
  if (splitCount < totalQuantity && isNeedSplit) {
966
- let total = product.origin_total ?? product.total;
967
- if ((product.discount_list || []).some((item) => item.type === "promotion")) {
968
- total = product.total ?? product.origin_total;
969
- }
970
- arr.push(
971
- this.hooks.setProduct(originProduct, {
972
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
973
- quantity: totalQuantity - splitCount,
974
- _id: product._id.split("___")[0],
975
- total
976
- })
977
- );
781
+ arr.push(this.hooks.setProduct(originProduct, {
782
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
783
+ quantity: totalQuantity - splitCount,
784
+ _id: product._id.split("___")[0]
785
+ }));
978
786
  }
979
787
  for (let i = 0; i < splitCount; i++) {
980
- const currentSelectedDiscount = isGoodPass ? selectedDiscountCard || applicableDiscounts[i] : selectedDiscountCard || applicableDiscounts[0];
981
- usedDiscounts.set(currentSelectedDiscount.id, true);
982
- if ((currentSelectedDiscount.tag || currentSelectedDiscount.type) === "good_pass") {
983
- const currentCount = usedProductIdCounts.get(currentSelectedDiscount.product_id) || 0;
984
- usedProductIdCounts.set(currentSelectedDiscount.product_id, currentCount + 1);
985
- }
986
- const currentDiscountTypeForCount = currentSelectedDiscount.tag || currentSelectedDiscount.type;
987
- if (["discount_card", "product_discount_card"].includes(currentDiscountTypeForCount)) {
988
- const currentLimitCount = usedDiscountCardLimitCounts.get(currentSelectedDiscount.id) || 0;
989
- usedDiscountCardLimitCounts.set(currentSelectedDiscount.id, currentLimitCount + 1);
990
- }
991
- const appliedProducts = appliedDiscountProducts.get(currentSelectedDiscount.id) || [];
788
+ const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[i];
789
+ usedDiscounts.set(selectedDiscount2.id, true);
790
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
992
791
  let productOriginTotal = product.origin_total || product.total || 0;
993
792
  if (this.filterDiscountListByType(product.discount_list, "promotion").length && product.origin_total) {
994
793
  productOriginTotal = product.origin_total;
995
794
  }
996
- if (Number(((_x = originProduct == null ? void 0 : originProduct._productInit) == null ? void 0 : _x.original_price) || 0) > 0 && product.origin_total && product.total && product.origin_total !== product.total) {
795
+ if (Number(((_w = originProduct == null ? void 0 : originProduct._productInit) == null ? void 0 : _w.original_price) || 0) > 0 && product.origin_total && product.total && product.origin_total !== product.total) {
997
796
  productOriginTotal = product.total;
998
797
  }
999
- const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount);
1000
- const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount.id) : null;
798
+ const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount2);
799
+ const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount2.id) : null;
1001
800
  const productAllocation = orderLevelAllocation == null ? void 0 : orderLevelAllocation.get(flatItem._id);
1002
- const isDeductOptionPrice = !!((_y = selectedDiscount.config) == null ? void 0 : _y.deductOptionPrice);
1003
- let mainProductSellingPrice;
801
+ let targetProductTotal;
1004
802
  let amount;
1005
803
  let productDiscountDifference;
1006
- let discountedOptions = product.options;
1007
- let optionDiscountAmount = 0;
1008
804
  if (isOrderLevel && productAllocation) {
1009
805
  amount = productAllocation.discountAmount;
1010
806
  productDiscountDifference = productAllocation.difference;
1011
- mainProductSellingPrice = Math.max(new import_decimal.default(product.price).minus(amount).toNumber(), 0);
807
+ targetProductTotal = Math.max(new import_decimal.default(product.price).minus(amount).toNumber(), 0);
1012
808
  } else {
1013
- mainProductSellingPrice = (0, import_utils.getDiscountAmount)(
1014
- currentSelectedDiscount,
1015
- product.price,
1016
- product.price
1017
- );
1018
- amount = new import_decimal.default(product.price).minus(new import_decimal.default(mainProductSellingPrice)).toNumber();
809
+ targetProductTotal = (0, import_utils.getDiscountAmount)(selectedDiscount2, product.price, product.price);
810
+ amount = new import_decimal.default(product.price).minus(new import_decimal.default(targetProductTotal)).toNumber();
1019
811
  }
1020
- if (isDeductOptionPrice && ((_z = product.options) == null ? void 0 : _z.length)) {
1021
- const optionResult = applyDiscountToOptions(
1022
- product.options,
1023
- currentSelectedDiscount
1024
- );
1025
- discountedOptions = optionResult.discountedOptions;
1026
- optionDiscountAmount = optionResult.optionDiscountAmount;
1027
- }
1028
- const optionsForLineTotal = isDeductOptionPrice && ((_A = product.options) == null ? void 0 : _A.length) ? discountedOptions : product.options;
1029
- const optionsLineTotal = getOptionTotal(optionsForLineTotal || []);
1030
- const total = new import_decimal.default(mainProductSellingPrice).plus(optionsLineTotal).toNumber();
1031
- const mainProductDiscountAmount = amount;
1032
- const lineDiscountAmount = new import_decimal.default(mainProductDiscountAmount).plus(optionDiscountAmount).toNumber();
1033
- const currentDiscountType = currentSelectedDiscount.tag === "product_discount_card" ? "discount_card" : currentSelectedDiscount.tag;
1034
- const discountType2 = selectedDiscount.tag || selectedDiscount.type;
1035
- const currentIsGoodPass = currentDiscountType === "good_pass";
812
+ const discountType = selectedDiscount2.tag || selectedDiscount2.type;
813
+ const isGoodPass = discountType === "good_pass";
1036
814
  const discountDetail = {
1037
- amount: lineDiscountAmount,
1038
- type: selectedDiscount.tag === "product_discount_card" ? "discount_card" : discountType2,
815
+ amount,
816
+ type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : discountType,
1039
817
  discount: {
1040
- discount_card_type: (_B = selectedDiscount == null ? void 0 : selectedDiscount.metadata) == null ? void 0 : _B.discount_card_type,
1041
- fixed_amount: lineDiscountAmount,
1042
- discount_calculation_mode: (_C = selectedDiscount == null ? void 0 : selectedDiscount.metadata) == null ? void 0 : _C.discount_calculation_mode,
1043
- resource_id: selectedDiscount.id,
1044
- title: selectedDiscount.format_title,
818
+ discount_card_type: (_x = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _x.discount_card_type,
819
+ fixed_amount: amount,
820
+ discount_calculation_mode: (_y = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _y.discount_calculation_mode,
821
+ resource_id: selectedDiscount2.id,
822
+ title: selectedDiscount2.format_title,
1045
823
  original_amount: product.price,
1046
824
  product_id: originProduct.id,
1047
- percent: currentSelectedDiscount.par_value,
1048
- discount_product_id: currentSelectedDiscount.product_id
825
+ percent: selectedDiscount2.par_value
1049
826
  },
1050
- // 前端使用的num数量,为了计算优惠金额(拆分时为1)
1051
- _num: isNeedSplit ? 1 : product.num,
1052
- config: currentSelectedDiscount == null ? void 0 : currentSelectedDiscount.config,
827
+ // 前端使用的num数量,为了计算优惠金额
828
+ _num: isGoodPass ? 1 : product.num,
1053
829
  metadata: {
1054
830
  num: 1,
1055
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
831
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1056
832
  // 🔥 order_level 分摊差值
1057
- ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference },
1058
- /** 仅主商品上的优惠金额(不含 option) */
1059
- mainProductDiscountAmount,
1060
- optionDiscountAmount
833
+ ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
1061
834
  }
1062
835
  };
1063
836
  appliedProducts.push(discountDetail);
1064
- appliedDiscountProducts.set(currentSelectedDiscount.id, appliedProducts);
837
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
838
+ let total = targetProductTotal;
839
+ if (product.options) {
840
+ total = product.options.reduce((accumulator, currentValue) => {
841
+ const currentPrice = new import_decimal.default(currentValue.price || 0);
842
+ const currentNum = new import_decimal.default(currentValue.num || 0);
843
+ return accumulator.add(currentPrice.mul(currentNum));
844
+ }, new import_decimal.default(total)).toNumber();
845
+ }
1065
846
  if (product.isClient) {
1066
- arr.push(
1067
- this.hooks.setProduct(originProduct, {
1068
- discount_list: [discountDetail],
1069
- // good_pass:主商品价以折后价为准;勿用 product.price - amount(amount 含 option 优惠时会算错)
1070
- price: currentIsGoodPass ? mainProductSellingPrice : product.price,
1071
- quantity: isNeedSplit ? 1 : product.quantity,
1072
- origin_total: (0, import_utils2.getProductOriginTotalPrice)({
1073
- product: {
1074
- original_price: product.original_price
1075
- },
1076
- bundle: product.bundle,
1077
- options: restoreOptionPrices(product.options)
1078
- }),
1079
- variant: originProduct._productInit.variant,
1080
- original_price: new import_decimal.default(product.price || 0).toNumber(),
1081
- total,
1082
- options: discountedOptions
1083
- })
1084
- );
847
+ arr.push(this.hooks.setProduct(originProduct, {
848
+ discount_list: [discountDetail],
849
+ price: selectedDiscount2.tag === "good_pass" ? 0 : product.price,
850
+ quantity: isNeedSplit ? 1 : product.quantity,
851
+ origin_total: (0, import_utils2.getProductOriginTotalPrice)({
852
+ product: {
853
+ original_price: product.original_price
854
+ },
855
+ bundle: product.bundle,
856
+ options: product.options
857
+ }),
858
+ variant: originProduct._productInit.variant,
859
+ original_price: new import_decimal.default(product.price || 0).toNumber(),
860
+ total
861
+ }));
1085
862
  } else {
1086
- arr.push(
1087
- this.hooks.setProduct(originProduct, {
1088
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion").concat([discountDetail]),
1089
- _id: product._id.split("___")[0] + "___" + currentSelectedDiscount.id + "_" + i + "_" + index,
1090
- price: currentIsGoodPass ? 0 : product.price,
1091
- quantity: isNeedSplit ? 1 : product.quantity,
1092
- total,
1093
- origin_total: productOriginTotal,
1094
- main_product_selling_price: mainProductSellingPrice,
1095
- options: discountedOptions
1096
- })
1097
- );
863
+ arr.push(this.hooks.setProduct(originProduct, {
864
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion").concat([discountDetail]),
865
+ _id: product._id.split("___")[0] + "___" + selectedDiscount2.id + index,
866
+ price: selectedDiscount2.tag === "good_pass" ? 0 : product.price,
867
+ quantity: isNeedSplit ? 1 : product.quantity,
868
+ total,
869
+ origin_total: productOriginTotal,
870
+ main_product_selling_price: targetProductTotal
871
+ }));
1098
872
  }
1099
873
  }
1100
874
  processedProductsMap.set(product._id, arr);
@@ -1104,298 +878,62 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1104
878
  const discountNum = splitCount;
1105
879
  const normalNum = totalQuantity - discountNum;
1106
880
  for (let i = 0; i < discountNum; i++) {
1107
- const currentBundleDiscount = isGoodPass ? selectedDiscountCard || applicableDiscounts[i] : selectedDiscountCard || applicableDiscounts[0];
1108
- usedDiscounts.set(currentBundleDiscount.id, true);
1109
- if ((currentBundleDiscount.tag || currentBundleDiscount.type) === "good_pass") {
1110
- const currentCount = usedProductIdCounts.get(currentBundleDiscount.product_id) || 0;
1111
- usedProductIdCounts.set(currentBundleDiscount.product_id, currentCount + 1);
1112
- }
1113
- const bundleDiscountTypeForCount = currentBundleDiscount.tag || currentBundleDiscount.type;
1114
- if (["discount_card", "product_discount_card"].includes(bundleDiscountTypeForCount)) {
1115
- const currentBundleLimitCount = usedDiscountCardLimitCounts.get(currentBundleDiscount.id) || 0;
1116
- usedDiscountCardLimitCounts.set(currentBundleDiscount.id, currentBundleLimitCount + 1);
1117
- }
881
+ const selectedDiscount2 = applicableDiscounts[i];
882
+ usedDiscounts.set(selectedDiscount2.id, true);
1118
883
  const uniqueId = `${flatItem._id}_split_${i}`;
1119
- const discountedPrice = (0, import_utils.getDiscountAmount)(
1120
- currentBundleDiscount,
1121
- product.origin_total,
1122
- product.origin_total
1123
- );
1124
- const bundleDiscountAmount = new import_decimal.default(product.origin_total || 0).minus(discountedPrice).toNumber();
1125
- const bundleDiscountType = currentBundleDiscount.tag === "product_discount_card" ? "discount_card" : currentBundleDiscount.tag;
1126
884
  const discountDetail = {
1127
- amount: bundleDiscountAmount,
1128
- type: bundleDiscountType,
885
+ amount: product.origin_total,
886
+ type: "good_pass",
1129
887
  discount: {
1130
- discount_card_type: (_D = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _D.discount_card_type,
1131
- discount_calculation_mode: (_E = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _E.discount_calculation_mode,
1132
- fixed_amount: bundleDiscountAmount,
1133
- resource_id: currentBundleDiscount.id,
1134
- title: currentBundleDiscount.format_title,
888
+ fixed_amount: product.origin_total,
889
+ discount_calculation_mode: (_z = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _z.discount_calculation_mode,
890
+ resource_id: selectedDiscount2.id,
891
+ title: selectedDiscount2.format_title,
1135
892
  original_amount: product.origin_total,
1136
- product_id: product.id,
1137
- percent: currentBundleDiscount.par_value,
1138
- discount_product_id: currentBundleDiscount.product_id
893
+ product_id: product.id
1139
894
  },
1140
895
  metadata: {
1141
896
  // 🔥 使用拆分后的唯一 _id
1142
897
  custom_product_bundle_map_id: uniqueId,
1143
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
898
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1144
899
  num: 1
1145
900
  },
1146
- _num: 1,
1147
- config: currentBundleDiscount == null ? void 0 : currentBundleDiscount.config
901
+ _num: 1
1148
902
  };
1149
- const appliedProducts = appliedDiscountProducts.get(currentBundleDiscount.id) || [];
903
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
1150
904
  appliedProducts.push(discountDetail);
1151
- appliedDiscountProducts.set(currentBundleDiscount.id, appliedProducts);
905
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
1152
906
  processedItems.push({
1153
907
  ...flatItem,
1154
908
  // 🔥 使用唯一的 _id
1155
909
  _id: uniqueId,
1156
910
  num: 1,
1157
911
  quantity: 1,
1158
- price: discountedPrice,
1159
- // 折扣后的价格
1160
- total: discountedPrice,
912
+ price: 0,
913
+ // 商品券价格为0
914
+ total: 0,
1161
915
  discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion").concat([discountDetail]),
1162
916
  processed: true,
1163
- _discountId: currentBundleDiscount.id
917
+ _discountId: selectedDiscount2.id
1164
918
  });
1165
919
  }
1166
- let remainingNum = normalNum;
1167
- let continueSplitIndex = discountNum;
1168
- while (remainingNum > 0) {
1169
- const nextApplicableDiscounts = sortedDiscountList.filter((nextDiscount) => {
1170
- var _a2, _b2, _c2, _d2;
1171
- const nextDiscountType = nextDiscount.tag || nextDiscount.type;
1172
- if (["good_pass", "discount_card", "product_discount_card"].includes(nextDiscountType)) {
1173
- if (nextDiscount.config === void 0 || !((_a2 = nextDiscount == null ? void 0 : nextDiscount.config) == null ? void 0 : _a2.isAvailable)) {
1174
- return false;
1175
- }
1176
- }
1177
- if ((Number(product.total) <= 0 || !product.total) && !((_b2 = product.discount_list) == null ? void 0 : _b2.find(
1178
- (n) => {
1179
- var _a3;
1180
- return ((_a3 = n.discount) == null ? void 0 : _a3.resource_id) === nextDiscount.id;
1181
- }
1182
- )) && nextDiscountType !== "good_pass")
1183
- return false;
1184
- if (usedDiscounts.get(nextDiscount.id) && nextDiscountType === "good_pass")
1185
- return false;
1186
- if (nextDiscountType === "good_pass") {
1187
- const maxUsagePerOrder = (_c2 = nextDiscount.config) == null ? void 0 : _c2.maxUsagePerOrder;
1188
- if (maxUsagePerOrder && maxUsagePerOrder > 0) {
1189
- const currentUsedCount = usedProductIdCounts.get(nextDiscount.product_id) || 0;
1190
- if (currentUsedCount >= maxUsagePerOrder) {
1191
- return false;
1192
- }
1193
- }
1194
- }
1195
- if (["discount_card", "product_discount_card"].includes(nextDiscountType)) {
1196
- const limitConfig = ((_d2 = nextDiscount.config) == null ? void 0 : _d2.applicableProductLimit) || 0;
1197
- if (limitConfig > 0) {
1198
- const currentUsedLimitCount = usedDiscountCardLimitCounts.get(nextDiscount.id) || 0;
1199
- if (currentUsedLimitCount >= limitConfig) {
1200
- return false;
1201
- }
1202
- }
1203
- }
1204
- const limitedData = nextDiscount.limited_relation_product_data;
1205
- if (limitedData.type === "product_all") {
1206
- if (limitedData.filter === 1 && limitedData.exclude_product_ids.includes(product.id)) {
1207
- return false;
1208
- }
1209
- if (!this.checkPackageSubItemUsageRules(nextDiscount, flatItem)) {
1210
- return false;
1211
- }
1212
- return true;
1213
- } else if (limitedData.product_ids && limitedData.product_ids.includes(product.id)) {
1214
- if (!this.checkPackageSubItemUsageRules(nextDiscount, flatItem)) {
1215
- return false;
1216
- }
1217
- return true;
1218
- }
1219
- return false;
920
+ if (normalNum > 0) {
921
+ processedItems.push({
922
+ ...flatItem,
923
+ // 🔥 为剩余商品生成唯一的 _id
924
+ _id: `${flatItem._id}_split_rest`,
925
+ num: normalNum,
926
+ quantity: normalNum,
927
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
928
+ processed: true
1220
929
  });
1221
- if (nextApplicableDiscounts.length === 0) {
1222
- processedItems.push({
1223
- ...flatItem,
1224
- _id: `${flatItem._id}_split_rest`,
1225
- num: remainingNum,
1226
- quantity: remainingNum,
1227
- discount_list: [],
1228
- processed: true
1229
- });
1230
- break;
1231
- }
1232
- const nextSelectedDiscountCard = nextApplicableDiscounts.find(
1233
- (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
1234
- );
1235
- const nextSelectedDiscount = nextSelectedDiscountCard || nextApplicableDiscounts[0];
1236
- const nextDiscType = nextSelectedDiscount.tag || nextSelectedDiscount.type;
1237
- const nextIsGoodPass = nextDiscType === "good_pass";
1238
- const nextIsDiscountCard = ["discount_card", "product_discount_card"].includes(nextDiscType);
1239
- const nextApplicableProductLimit = ((_F = nextSelectedDiscount.config) == null ? void 0 : _F.applicableProductLimit) || 0;
1240
- const nextIsNeedSplit = nextIsGoodPass || nextIsDiscountCard && nextApplicableProductLimit > 0;
1241
- if (!nextIsNeedSplit) {
1242
- const nextBundleDiscount = nextSelectedDiscountCard || nextApplicableDiscounts[0];
1243
- usedDiscounts.set(nextBundleDiscount.id, true);
1244
- if ((nextBundleDiscount.tag || nextBundleDiscount.type) === "good_pass") {
1245
- const curCount = usedProductIdCounts.get(nextBundleDiscount.product_id) || 0;
1246
- usedProductIdCounts.set(nextBundleDiscount.product_id, curCount + 1);
1247
- }
1248
- const nextNoSplitType = nextBundleDiscount.tag || nextBundleDiscount.type;
1249
- if (["discount_card", "product_discount_card"].includes(nextNoSplitType)) {
1250
- const curCount = usedDiscountCardLimitCounts.get(nextBundleDiscount.id) || 0;
1251
- usedDiscountCardLimitCounts.set(nextBundleDiscount.id, curCount + remainingNum);
1252
- }
1253
- const nextOriginTotal = product.original_price || product.price || 0;
1254
- const nextTargetTotal = (0, import_utils.getDiscountAmount)(nextBundleDiscount, nextOriginTotal, nextOriginTotal);
1255
- const nextDiscountAmount = new import_decimal.default(nextOriginTotal).minus(nextTargetTotal).toNumber();
1256
- const nextUniqueId = `${flatItem._id}_split_${continueSplitIndex}`;
1257
- const nextBundleDiscType = nextBundleDiscount.tag === "product_discount_card" ? "discount_card" : nextBundleDiscount.tag;
1258
- const nextDiscountDetail = {
1259
- amount: nextDiscountAmount * remainingNum,
1260
- type: nextBundleDiscType,
1261
- discount: {
1262
- discount_card_type: (_G = nextBundleDiscount == null ? void 0 : nextBundleDiscount.metadata) == null ? void 0 : _G.discount_card_type,
1263
- fixed_amount: nextDiscountAmount,
1264
- resource_id: nextBundleDiscount.id,
1265
- title: nextBundleDiscount.format_title,
1266
- original_amount: product.original_price,
1267
- product_id: product.id,
1268
- percent: nextBundleDiscount.par_value,
1269
- discount_product_id: nextBundleDiscount.product_id
1270
- },
1271
- metadata: {
1272
- custom_product_bundle_map_id: nextUniqueId,
1273
- num: remainingNum
1274
- },
1275
- config: nextBundleDiscount == null ? void 0 : nextBundleDiscount.config,
1276
- _num: remainingNum * (((_H = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _H.num) || 1)
1277
- };
1278
- const nextAppliedProducts = appliedDiscountProducts.get(nextBundleDiscount.id) || [];
1279
- nextAppliedProducts.push(nextDiscountDetail);
1280
- appliedDiscountProducts.set(nextBundleDiscount.id, nextAppliedProducts);
1281
- processedItems.push({
1282
- ...flatItem,
1283
- _id: nextUniqueId,
1284
- num: remainingNum,
1285
- quantity: remainingNum,
1286
- total: nextTargetTotal,
1287
- price: new import_decimal.default(nextOriginTotal || 0).minus(nextDiscountDetail.discount.fixed_amount).toNumber(),
1288
- discount_list: [nextDiscountDetail],
1289
- processed: true
1290
- });
1291
- remainingNum = 0;
1292
- break;
1293
- }
1294
- let nextMaxUsageLimit;
1295
- if (nextIsGoodPass) {
1296
- const nextGoodPassCount = nextApplicableDiscounts.filter(
1297
- (item) => (item.tag || item.type) === "good_pass"
1298
- ).length;
1299
- nextMaxUsageLimit = nextGoodPassCount;
1300
- if ((_I = nextSelectedDiscount.config) == null ? void 0 : _I.maxUsagePerOrder) {
1301
- const usedCount = usedProductIdCounts.get(nextSelectedDiscount.product_id) || 0;
1302
- nextMaxUsageLimit = Math.min(
1303
- nextGoodPassCount,
1304
- Math.max(0, nextSelectedDiscount.config.maxUsagePerOrder - usedCount)
1305
- );
1306
- }
1307
- } else if (nextIsDiscountCard && nextApplicableProductLimit > 0) {
1308
- const usedLimitCount = usedDiscountCardLimitCounts.get(nextSelectedDiscount.id) || 0;
1309
- nextMaxUsageLimit = Math.max(0, nextApplicableProductLimit - usedLimitCount);
1310
- } else {
1311
- nextMaxUsageLimit = 1;
1312
- }
1313
- const nextSplitCount = Math.min(remainingNum, nextMaxUsageLimit);
1314
- if (nextSplitCount === 0) {
1315
- processedItems.push({
1316
- ...flatItem,
1317
- _id: `${flatItem._id}_split_rest`,
1318
- num: remainingNum,
1319
- quantity: remainingNum,
1320
- discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
1321
- processed: true
1322
- });
1323
- break;
1324
- }
1325
- for (let j = 0; j < nextSplitCount; j++) {
1326
- const nextBundleDiscount = nextIsGoodPass ? nextSelectedDiscountCard || nextApplicableDiscounts[j] : nextSelectedDiscountCard || nextApplicableDiscounts[0];
1327
- usedDiscounts.set(nextBundleDiscount.id, true);
1328
- if ((nextBundleDiscount.tag || nextBundleDiscount.type) === "good_pass") {
1329
- const curCount = usedProductIdCounts.get(nextBundleDiscount.product_id) || 0;
1330
- usedProductIdCounts.set(nextBundleDiscount.product_id, curCount + 1);
1331
- }
1332
- const nextBundleDiscTypeForCount = nextBundleDiscount.tag || nextBundleDiscount.type;
1333
- if (["discount_card", "product_discount_card"].includes(nextBundleDiscTypeForCount)) {
1334
- const curLimitCount = usedDiscountCardLimitCounts.get(nextBundleDiscount.id) || 0;
1335
- usedDiscountCardLimitCounts.set(nextBundleDiscount.id, curLimitCount + 1);
1336
- }
1337
- const nextUniqueId = `${flatItem._id}_split_${continueSplitIndex}`;
1338
- const nextDiscountedPrice = (0, import_utils.getDiscountAmount)(
1339
- nextBundleDiscount,
1340
- product.origin_total,
1341
- product.origin_total
1342
- );
1343
- const nextBundleDiscAmount = new import_decimal.default(product.origin_total || 0).minus(nextDiscountedPrice).toNumber();
1344
- const nextBundleDiscTypeStr = nextBundleDiscount.tag === "product_discount_card" ? "discount_card" : nextBundleDiscount.tag;
1345
- const nextDiscountDetail = {
1346
- amount: nextBundleDiscAmount,
1347
- type: nextBundleDiscTypeStr,
1348
- discount: {
1349
- discount_card_type: (_J = nextBundleDiscount == null ? void 0 : nextBundleDiscount.metadata) == null ? void 0 : _J.discount_card_type,
1350
- fixed_amount: nextBundleDiscAmount,
1351
- resource_id: nextBundleDiscount.id,
1352
- title: nextBundleDiscount.format_title,
1353
- original_amount: product.origin_total,
1354
- product_id: product.id,
1355
- percent: nextBundleDiscount.par_value,
1356
- discount_product_id: nextBundleDiscount.product_id
1357
- },
1358
- metadata: {
1359
- custom_product_bundle_map_id: nextUniqueId,
1360
- num: 1
1361
- },
1362
- _num: 1,
1363
- config: nextBundleDiscount == null ? void 0 : nextBundleDiscount.config
1364
- };
1365
- const nextAppliedProducts = appliedDiscountProducts.get(nextBundleDiscount.id) || [];
1366
- nextAppliedProducts.push(nextDiscountDetail);
1367
- appliedDiscountProducts.set(nextBundleDiscount.id, nextAppliedProducts);
1368
- processedItems.push({
1369
- ...flatItem,
1370
- _id: nextUniqueId,
1371
- num: 1,
1372
- quantity: 1,
1373
- price: nextDiscountedPrice,
1374
- total: nextDiscountedPrice,
1375
- discount_list: [nextDiscountDetail],
1376
- processed: true,
1377
- _discountId: nextBundleDiscount.id
1378
- });
1379
- continueSplitIndex++;
1380
- }
1381
- remainingNum -= nextSplitCount;
1382
930
  }
1383
931
  } else {
1384
- const currentBundleDiscount = selectedDiscountCard || applicableDiscounts[0];
1385
- usedDiscounts.set(currentBundleDiscount.id, true);
1386
- if ((currentBundleDiscount.tag || currentBundleDiscount.type) === "good_pass") {
1387
- const currentCount = usedProductIdCounts.get(currentBundleDiscount.product_id) || 0;
1388
- usedProductIdCounts.set(currentBundleDiscount.product_id, currentCount + 1);
1389
- }
1390
- const noSplitDiscountType = currentBundleDiscount.tag || currentBundleDiscount.type;
1391
- if (["discount_card", "product_discount_card"].includes(noSplitDiscountType)) {
1392
- const bundleQuantity = product.num || 1;
1393
- const currentNoSplitCount = usedDiscountCardLimitCounts.get(currentBundleDiscount.id) || 0;
1394
- usedDiscountCardLimitCounts.set(currentBundleDiscount.id, currentNoSplitCount + bundleQuantity);
1395
- }
932
+ const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[0];
933
+ usedDiscounts.set(selectedDiscount2.id, true);
1396
934
  const productOriginTotal = product.original_price || product.price || 0;
1397
- const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount);
1398
- const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount.id) : null;
935
+ const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount2);
936
+ const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount2.id) : null;
1399
937
  const productAllocation = orderLevelAllocation == null ? void 0 : orderLevelAllocation.get(flatItem._id);
1400
938
  let targetProductTotal;
1401
939
  let fixedAmountPerItem;
@@ -1406,42 +944,39 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1406
944
  targetProductTotal = Math.max(new import_decimal.default(productOriginTotal).minus(fixedAmountPerItem).toNumber(), 0);
1407
945
  } else {
1408
946
  targetProductTotal = (0, import_utils.getDiscountAmount)(
1409
- currentBundleDiscount,
947
+ selectedDiscount2,
1410
948
  productOriginTotal,
1411
949
  productOriginTotal
1412
950
  );
1413
951
  fixedAmountPerItem = new import_decimal.default(productOriginTotal).minus(targetProductTotal).toNumber();
1414
952
  }
1415
- const bundleActualDiscountAmount = new import_decimal.default(productOriginTotal).minus(targetProductTotal).toNumber();
1416
953
  const uniqueId = flatItem._id;
1417
954
  const discountDetail = {
1418
- amount: bundleActualDiscountAmount * (product.num || 1),
1419
- type: currentBundleDiscount.tag === "product_discount_card" ? "discount_card" : currentBundleDiscount.tag,
955
+ amount: fixedAmountPerItem * (product.num || 1),
956
+ type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : selectedDiscount2.tag,
1420
957
  discount: {
1421
- discount_card_type: (_K = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _K.discount_card_type,
1422
- fixed_amount: bundleActualDiscountAmount,
1423
- discount_calculation_mode: (_L = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _L.discount_calculation_mode,
1424
- resource_id: currentBundleDiscount.id,
1425
- title: currentBundleDiscount.format_title,
958
+ discount_card_type: (_A = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _A.discount_card_type,
959
+ fixed_amount: fixedAmountPerItem,
960
+ discount_calculation_mode: (_B = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _B.discount_calculation_mode,
961
+ resource_id: selectedDiscount2.id,
962
+ title: selectedDiscount2.format_title,
1426
963
  original_amount: product.original_price,
1427
964
  product_id: product.id,
1428
- percent: currentBundleDiscount.par_value,
1429
- discount_product_id: currentBundleDiscount.product_id
965
+ percent: selectedDiscount2.par_value
1430
966
  },
1431
967
  metadata: {
1432
968
  // 🔥 使用唯一的 _id
1433
969
  custom_product_bundle_map_id: uniqueId,
1434
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
970
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1435
971
  num: product.num || 1,
1436
972
  // 🔥 order_level 分摊差值
1437
973
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
1438
974
  },
1439
- config: currentBundleDiscount == null ? void 0 : currentBundleDiscount.config,
1440
- _num: (product.num || 1) * (((_M = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _M.num) || 1)
975
+ _num: (product.num || 1) * (((_C = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _C.num) || 1)
1441
976
  };
1442
- const appliedProducts = appliedDiscountProducts.get(currentBundleDiscount.id) || [];
977
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
1443
978
  appliedProducts.push(discountDetail);
1444
- appliedDiscountProducts.set(currentBundleDiscount.id, appliedProducts);
979
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
1445
980
  processedItems.push({
1446
981
  ...flatItem,
1447
982
  total: targetProductTotal,
@@ -1460,7 +995,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1460
995
  const mainProductArr = processedProductsMap2.get(product._id);
1461
996
  if (!mainProductArr || mainProductArr.length === 0) {
1462
997
  const getDefaultProduct = () => {
1463
- const restoredOptions = restoreOptionPrices(product.options);
1464
998
  if (product.isClient) {
1465
999
  return this.hooks.setProduct(originProduct, {
1466
1000
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
@@ -1470,7 +1004,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1470
1004
  original_price: product.original_price
1471
1005
  },
1472
1006
  bundle: product.bundle,
1473
- options: restoredOptions
1007
+ options: product.options
1474
1008
  }),
1475
1009
  variant: originProduct._productInit.variant,
1476
1010
  original_price: originProduct._productInit.original_price,
@@ -1479,17 +1013,15 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1479
1013
  price: product.price
1480
1014
  },
1481
1015
  bundle: product.bundle,
1482
- options: restoredOptions
1483
- }),
1484
- options: restoredOptions
1016
+ options: product.options
1017
+ })
1485
1018
  });
1486
1019
  } else {
1487
1020
  return this.hooks.setProduct(originProduct, {
1488
1021
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
1489
1022
  total: product.total,
1490
1023
  origin_total: product.origin_total,
1491
- price: product.price,
1492
- options: restoreOptionPrices(product.options)
1024
+ price: product.price
1493
1025
  });
1494
1026
  }
1495
1027
  };
@@ -1529,92 +1061,80 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1529
1061
  const mainProduct = mainProductArr[0];
1530
1062
  const mainProductData = this.hooks.getProduct(mainProduct);
1531
1063
  const newBundleWithDiscount = [];
1532
- (product.bundle || []).forEach(
1533
- (bundleItem, bundleIndex) => {
1534
- const processedItems = bundleProcessingInfo.get(
1535
- bundleIndex
1536
- ) || [bundleItem];
1537
- if (processedItems.length > 1) {
1538
- processedItems.forEach((item) => {
1539
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1540
- var _a;
1541
- return {
1542
- ...discount,
1543
- metadata: {
1544
- ...discount.metadata,
1545
- num: item.num,
1546
- custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1547
- }
1548
- // num: item.num, // 使用拆分后的 num
1549
- };
1550
- });
1551
- newBundleWithDiscount.push({
1552
- ...bundleItem,
1553
- _id: item._id,
1554
- product_id: bundleItem.product_id,
1555
- price: item.price,
1556
- num: item.num,
1557
- quantity: item.num,
1558
- discount_list: updatedDiscountList2
1559
- });
1064
+ (product.bundle || []).forEach((bundleItem, bundleIndex) => {
1065
+ const processedItems = bundleProcessingInfo.get(bundleIndex) || [bundleItem];
1066
+ if (processedItems.length > 1) {
1067
+ processedItems.forEach((item) => {
1068
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1069
+ var _a;
1070
+ return {
1071
+ ...discount,
1072
+ metadata: {
1073
+ ...discount.metadata,
1074
+ num: item.num,
1075
+ custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1076
+ }
1077
+ // num: item.num, // 使用拆分后的 num
1078
+ };
1079
+ });
1080
+ newBundleWithDiscount.push({
1081
+ ...bundleItem,
1082
+ _id: item._id,
1083
+ product_id: bundleItem.product_id,
1084
+ price: item.price,
1085
+ num: item.num,
1086
+ discount_list: updatedDiscountList2
1087
+ });
1088
+ });
1089
+ } else {
1090
+ const item = processedItems[0];
1091
+ if (item.processed) {
1092
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1093
+ var _a;
1094
+ return {
1095
+ ...discount,
1096
+ metadata: {
1097
+ ...discount.metadata,
1098
+ num: item.num,
1099
+ custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1100
+ }
1101
+ // num: item.num, // 使用当前的 num
1102
+ };
1103
+ });
1104
+ newBundleWithDiscount.push({
1105
+ ...bundleItem,
1106
+ _id: item._id,
1107
+ product_id: bundleItem.product_id,
1108
+ price: item.price,
1109
+ num: item.num,
1110
+ discount_list: updatedDiscountList2
1560
1111
  });
1561
1112
  } else {
1562
- const item = processedItems[0];
1563
- if (item.processed) {
1564
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1565
- var _a;
1566
- return {
1567
- ...discount,
1568
- metadata: {
1569
- ...discount.metadata,
1570
- num: item.num,
1571
- custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1572
- }
1573
- // num: item.num, // 使用当前的 num
1574
- };
1575
- });
1576
- newBundleWithDiscount.push({
1577
- ...bundleItem,
1578
- _id: item._id,
1579
- product_id: bundleItem.product_id,
1580
- price: item.price,
1581
- num: item.num,
1582
- quantity: item.num,
1583
- discount_list: updatedDiscountList2
1584
- });
1585
- } else {
1586
- newBundleWithDiscount.push(item);
1587
- }
1113
+ newBundleWithDiscount.push(item);
1588
1114
  }
1589
1115
  }
1590
- );
1116
+ });
1591
1117
  let newTotalWithDiscount = Number(mainProductData.price || 0);
1592
- let newOriginTotalWithDiscount = Number(
1593
- mainProductData.original_price || mainProductData.price || 0
1594
- );
1595
- const updatedMainDiscountList = mainProductData.discount_list.map(
1596
- (discount) => {
1597
- var _a, _b;
1598
- if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
1599
- return discount;
1600
- }
1601
- return {
1602
- ...discount,
1603
- // num: 1,
1604
- metadata: {
1605
- ...discount.metadata,
1606
- custom_product_bundle_map_id: (_b = discount == null ? void 0 : discount.metadata) == null ? void 0 : _b.custom_product_bundle_map_id,
1607
- num: 1
1608
- }
1609
- };
1610
- }
1611
- );
1612
- const mainDiscountList = updatedMainDiscountList.filter(
1613
- (item) => {
1614
- var _a;
1615
- return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1118
+ let newOriginTotalWithDiscount = Number(mainProductData.original_price || mainProductData.price || 0);
1119
+ const updatedMainDiscountList = mainProductData.discount_list.map((discount) => {
1120
+ var _a, _b;
1121
+ if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
1122
+ return discount;
1616
1123
  }
1617
- );
1124
+ return {
1125
+ ...discount,
1126
+ // num: 1,
1127
+ metadata: {
1128
+ ...discount.metadata,
1129
+ custom_product_bundle_map_id: (_b = discount == null ? void 0 : discount.metadata) == null ? void 0 : _b.custom_product_bundle_map_id,
1130
+ num: 1
1131
+ }
1132
+ };
1133
+ });
1134
+ const mainDiscountList = updatedMainDiscountList.filter((item) => {
1135
+ var _a;
1136
+ return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1137
+ });
1618
1138
  if (mainDiscountList && mainDiscountList.length > 0) {
1619
1139
  const allDiscountAmount = (0, import_utils.getDiscountListAmountTotal)(mainDiscountList);
1620
1140
  newTotalWithDiscount = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotalWithDiscount;
@@ -1644,24 +1164,20 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1644
1164
  quantity: 1,
1645
1165
  discount_list: updatedMainDiscountList,
1646
1166
  bundle: newBundleWithDiscount,
1647
- total: newTotalWithDiscount,
1648
- origin_total: newOriginTotalWithDiscount
1167
+ total: new import_decimal.default(newTotalWithDiscount).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber(),
1168
+ origin_total: new import_decimal.default(newOriginTotalWithDiscount).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber()
1649
1169
  })
1650
1170
  );
1651
1171
  if (mainProductQuantity > 1) {
1652
1172
  const newBundleOriginal = [];
1653
- (product.bundle || []).forEach(
1654
- (bundleItem, bundleIndex) => {
1655
- newBundleOriginal.push({
1656
- ...bundleItem,
1657
- discount_list: []
1658
- });
1659
- }
1660
- );
1173
+ (product.bundle || []).forEach((bundleItem, bundleIndex) => {
1174
+ newBundleOriginal.push({
1175
+ ...bundleItem,
1176
+ discount_list: []
1177
+ });
1178
+ });
1661
1179
  let newTotalOriginal = Number(mainProductData.price || 0);
1662
- let newOriginTotalOriginal = Number(
1663
- mainProductData.original_price || mainProductData.price || 0
1664
- );
1180
+ let newOriginTotalOriginal = Number(mainProductData.original_price || mainProductData.price || 0);
1665
1181
  const updatedMainDiscountListOriginal = mainProductData.discount_list.map((discount) => {
1666
1182
  var _a, _b;
1667
1183
  if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
@@ -1677,16 +1193,12 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1677
1193
  // num: mainProductQuantity - 1,
1678
1194
  };
1679
1195
  });
1680
- const mainDiscountListOriginal = updatedMainDiscountListOriginal.filter(
1681
- (item) => {
1682
- var _a;
1683
- return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1684
- }
1685
- );
1196
+ const mainDiscountListOriginal = updatedMainDiscountListOriginal.filter((item) => {
1197
+ var _a;
1198
+ return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1199
+ });
1686
1200
  if (mainDiscountListOriginal && mainDiscountListOriginal.length > 0) {
1687
- const allDiscountAmount = (0, import_utils.getDiscountListAmount)(
1688
- mainDiscountListOriginal
1689
- );
1201
+ const allDiscountAmount = (0, import_utils.getDiscountListAmount)(mainDiscountListOriginal);
1690
1202
  newTotalOriginal = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotalOriginal;
1691
1203
  newOriginTotalOriginal = mainProductData.origin_total ?? newOriginTotalOriginal;
1692
1204
  }
@@ -1723,59 +1235,48 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1723
1235
  const mainProductData = this.hooks.getProduct(mainProduct);
1724
1236
  const newBundle = [];
1725
1237
  if (product.bundle && Array.isArray(product.bundle)) {
1726
- product.bundle.forEach(
1727
- (bundleItem, bundleIndex) => {
1728
- const bundleItemId = `${product._id}_bundle_${bundleIndex}`;
1729
- const processedBundleItems = processedFlatItemsMap2.get(bundleItemId);
1730
- if (!processedBundleItems || processedBundleItems.length === 0) {
1731
- newBundle.push(bundleItem);
1732
- } else {
1733
- processedBundleItems.forEach((item) => {
1734
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1735
- var _a2;
1736
- return {
1737
- ...discount,
1738
- metadata: {
1739
- ...discount.metadata,
1740
- num: item.num,
1741
- custom_product_bundle_map_id: (_a2 = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id
1742
- }
1743
- // num: item.num, // 使用拆分后的 num
1744
- };
1745
- });
1746
- newBundle.push({
1747
- ...bundleItem,
1748
- _id: item._id,
1749
- product_id: bundleItem.product_id,
1750
- price: item.price,
1751
- num: item.num,
1752
- quantity: item.num,
1753
- discount_list: updatedDiscountList2,
1754
- bundle_selling_price: bundleItem.bundle_selling_price !== void 0 ? item.price : void 0
1755
- });
1238
+ product.bundle.forEach((bundleItem, bundleIndex) => {
1239
+ const bundleItemId = `${product._id}_bundle_${bundleIndex}`;
1240
+ const processedBundleItems = processedFlatItemsMap2.get(bundleItemId);
1241
+ if (!processedBundleItems || processedBundleItems.length === 0) {
1242
+ newBundle.push(bundleItem);
1243
+ } else {
1244
+ processedBundleItems.forEach((item) => {
1245
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1246
+ var _a2;
1247
+ return {
1248
+ ...discount,
1249
+ metadata: {
1250
+ ...discount.metadata,
1251
+ num: item.num,
1252
+ custom_product_bundle_map_id: (_a2 = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id
1253
+ }
1254
+ // num: item.num, // 使用拆分后的 num
1255
+ };
1256
+ });
1257
+ newBundle.push({
1258
+ ...bundleItem,
1259
+ _id: item._id,
1260
+ product_id: bundleItem.product_id,
1261
+ price: item.price,
1262
+ num: item.num,
1263
+ discount_list: updatedDiscountList2
1756
1264
  });
1757
- }
1265
+ });
1758
1266
  }
1759
- );
1267
+ });
1760
1268
  }
1761
1269
  let newTotal = Number(mainProductData.price || 0);
1762
- let newOriginTotal = Number(
1763
- mainProductData.original_price || mainProductData.price || 0
1764
- );
1765
- const isManualDiscount = typeof mainProductData.isManualDiscount === "boolean" ? mainProductData.isManualDiscount : mainProductData.total != mainProductData.origin_total && (!((_a = mainProductData.discount_list) == null ? void 0 : _a.length) || ((_c = (_b = mainProductData == null ? void 0 : mainProductData.discount_list) == null ? void 0 : _b.every) == null ? void 0 : _c.call(
1766
- _b,
1767
- (item) => item.type === "product"
1768
- )));
1270
+ let newOriginTotal = Number(mainProductData.original_price || mainProductData.price || 0);
1271
+ const isManualDiscount = typeof mainProductData.isManualDiscount === "boolean" ? mainProductData.isManualDiscount : mainProductData.total != mainProductData.origin_total && (!((_a = mainProductData.discount_list) == null ? void 0 : _a.length) || ((_c = (_b = mainProductData == null ? void 0 : mainProductData.discount_list) == null ? void 0 : _b.every) == null ? void 0 : _c.call(_b, (item) => item.type === "product")));
1769
1272
  if (isManualDiscount) {
1770
1273
  newTotal = mainProductData.total ?? newTotal;
1771
1274
  newOriginTotal = mainProductData.origin_total ?? newOriginTotal;
1772
1275
  } else {
1773
- const mainDiscountList = mainProductData.discount_list.filter(
1774
- (item) => {
1775
- var _a2;
1776
- return !((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
1777
- }
1778
- );
1276
+ const mainDiscountList = mainProductData.discount_list.filter((item) => {
1277
+ var _a2;
1278
+ return !((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
1279
+ });
1779
1280
  if (mainDiscountList && mainDiscountList.length > 0) {
1780
1281
  const allDiscountAmount = (0, import_utils.getDiscountListAmount)(mainDiscountList);
1781
1282
  newTotal = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotal;
@@ -1783,8 +1284,10 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1783
1284
  }
1784
1285
  if (newBundle.length > 0) {
1785
1286
  newBundle.forEach((item) => {
1786
- var _a2, _b2, _c2;
1787
1287
  newTotal += Number(item.price) * Number(item.num);
1288
+ });
1289
+ newBundle.forEach((item) => {
1290
+ var _a2, _b2, _c2;
1788
1291
  const originalPrice = ((_c2 = (_b2 = (_a2 = item.discount_list) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.discount) == null ? void 0 : _c2.original_amount) || item.price;
1789
1292
  newOriginTotal += Number(originalPrice) * Number(item.num);
1790
1293
  });
@@ -1797,6 +1300,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1797
1300
  return accumulator.add(currentPrice.mul(currentNum));
1798
1301
  }, new import_decimal.default(newTotal)).toNumber();
1799
1302
  }
1303
+ newTotal = new import_decimal.default(newTotal).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber();
1304
+ newOriginTotal = new import_decimal.default(newOriginTotal).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber();
1800
1305
  result.push(
1801
1306
  this.hooks.setProduct(mainProduct, {
1802
1307
  ...mainProductData,
@@ -1883,7 +1388,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1883
1388
  * @returns 是否可用
1884
1389
  */
1885
1390
  checkPackageSubItemUsageRules(discount, flatItem) {
1886
- var _a, _b, _c, _d;
1391
+ var _a, _b, _c, _d, _e, _f;
1887
1392
  const limitedData = discount.limited_relation_product_data;
1888
1393
  const usageRules = limitedData == null ? void 0 : limitedData.package_sub_item_usage_rules;
1889
1394
  const rules = ["original_price", ...(usageRules == null ? void 0 : usageRules.rules) || []];
@@ -1891,6 +1396,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1891
1396
  return true;
1892
1397
  }
1893
1398
  const ruleType = usageRules.type;
1399
+ const packageScope = usageRules == null ? void 0 : usageRules.package_scope;
1400
+ const { type: scopeType, exclude_bundle_product_ids = [], include_bundle_product_ids = [], filter = 0 } = packageScope || {};
1894
1401
  const isMainProduct = flatItem.type === "main";
1895
1402
  const isBundleItem = flatItem.type === "bundle";
1896
1403
  if (isMainProduct) {
@@ -1903,13 +1410,25 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1903
1410
  if (isBundleItem) {
1904
1411
  const priceType = (_a = flatItem.bundleItem) == null ? void 0 : _a.price_type;
1905
1412
  const priceTypeExt = (_b = flatItem.bundleItem) == null ? void 0 : _b.price_type_ext;
1413
+ const mainProductId = ((_c = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _c.id) || ((_d = flatItem == null ? void 0 : flatItem.originProduct) == null ? void 0 : _d.product_id) || 0;
1906
1414
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1907
1415
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1908
1416
  if (rules.length > 0) {
1909
- if (isOriginalPrice && rules.includes("original_price")) {
1910
- return true;
1417
+ const _isOriginalPrice = isOriginalPrice && rules.includes("original_price");
1418
+ const _isMarkupPrice = isMarkupPrice && rules.includes("markup_price");
1419
+ const isPriceValid = _isOriginalPrice || _isMarkupPrice;
1420
+ let isScopeValid = false;
1421
+ if (scopeType === "all_packages") {
1422
+ if (!filter) {
1423
+ isScopeValid = true;
1424
+ } else {
1425
+ isScopeValid = !exclude_bundle_product_ids.includes(Number(mainProductId));
1426
+ }
1911
1427
  }
1912
- if (isMarkupPrice && rules.includes("markup_price")) {
1428
+ if (scopeType === "specific_packages") {
1429
+ isScopeValid = include_bundle_product_ids.includes(Number(mainProductId));
1430
+ }
1431
+ if (isPriceValid && isScopeValid) {
1913
1432
  return true;
1914
1433
  }
1915
1434
  return false;
@@ -1923,8 +1442,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1923
1442
  return false;
1924
1443
  }
1925
1444
  if (isBundleItem) {
1926
- const priceType = (_c = flatItem.bundleItem) == null ? void 0 : _c.price_type;
1927
- const priceTypeExt = (_d = flatItem.bundleItem) == null ? void 0 : _d.price_type_ext;
1445
+ const priceType = (_e = flatItem.bundleItem) == null ? void 0 : _e.price_type;
1446
+ const priceTypeExt = (_f = flatItem.bundleItem) == null ? void 0 : _f.price_type_ext;
1928
1447
  const isOriginalPrice = priceType === "markup" && priceTypeExt === "product_price";
1929
1448
  const isMarkupPrice = priceType === "markup" && (priceTypeExt === "" || !priceTypeExt);
1930
1449
  if (rules.length > 0) {