@pisell/pisellos 2.2.175 → 2.2.176

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 (172) hide show
  1. package/dist/modules/BookingContext/index.d.ts +37 -0
  2. package/dist/modules/BookingContext/index.js +436 -0
  3. package/dist/modules/BookingContext/types.d.ts +102 -0
  4. package/dist/modules/BookingContext/types.js +51 -0
  5. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  6. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +193 -0
  7. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  8. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +137 -0
  9. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +75 -0
  10. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +215 -0
  11. package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
  12. package/dist/modules/BookingContext/utils/flexible.js +56 -0
  13. package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  14. package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
  15. package/dist/modules/BookingContext/utils/index.d.ts +11 -0
  16. package/dist/modules/BookingContext/utils/index.js +11 -0
  17. package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
  18. package/dist/modules/BookingContext/utils/noResource.js +77 -0
  19. package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
  20. package/dist/modules/BookingContext/utils/productExtend.js +339 -0
  21. package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  22. package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
  23. package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  24. package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
  25. package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
  26. package/dist/modules/BookingContext/utils/resources.js +486 -0
  27. package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  28. package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
  29. package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  30. package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
  31. package/dist/modules/Customer/index.d.ts +6 -0
  32. package/dist/modules/Customer/index.js +129 -83
  33. package/dist/modules/Customer/types.d.ts +2 -0
  34. package/dist/modules/Discount/index.d.ts +2 -4
  35. package/dist/modules/Discount/index.js +8 -93
  36. package/dist/modules/Discount/types.d.ts +1 -7
  37. package/dist/modules/Order/index.d.ts +84 -17
  38. package/dist/modules/Order/index.js +1239 -495
  39. package/dist/modules/Order/types.d.ts +198 -18
  40. package/dist/modules/Order/types.js +31 -0
  41. package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  42. package/dist/modules/Order/utils/manualProductDiscount.js +212 -0
  43. package/dist/modules/Order/utils.d.ts +50 -1
  44. package/dist/modules/Order/utils.js +261 -31
  45. package/dist/modules/Quotation/index.d.ts +0 -1
  46. package/dist/modules/Quotation/index.js +23 -21
  47. package/dist/modules/Rules/index.d.ts +4 -0
  48. package/dist/modules/Rules/index.js +26 -10
  49. package/dist/modules/SalesSummary/index.js +4 -2
  50. package/dist/modules/SalesSummary/utils.js +3 -3
  51. package/dist/modules/Schedule/index.js +6 -2
  52. package/dist/modules/index.d.ts +1 -0
  53. package/dist/modules/index.js +2 -1
  54. package/dist/server/index.js +87 -29
  55. package/dist/server/modules/order/utils/filterOrders.js +20 -6
  56. package/dist/server/modules/products/index.d.ts +1 -1
  57. package/dist/server/modules/products/index.js +130 -113
  58. package/dist/server/modules/schedule/index.js +13 -6
  59. package/dist/solution/BaseSales/index.d.ts +89 -7
  60. package/dist/solution/BaseSales/index.js +1484 -365
  61. package/dist/solution/BaseSales/types.d.ts +67 -1
  62. package/dist/solution/BaseSales/types.js +3 -1
  63. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +275 -0
  64. package/dist/solution/BaseSales/utils/cartPromotion.js +1258 -0
  65. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
  66. package/dist/solution/BaseSales/utils/quotationPrice.js +237 -0
  67. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +68 -16
  68. package/dist/solution/BaseSales/utils.js +46 -8
  69. package/dist/solution/BookingByStep/index.d.ts +1 -1
  70. package/dist/solution/BookingTicket/index.d.ts +133 -1
  71. package/dist/solution/BookingTicket/index.js +780 -175
  72. package/dist/solution/BookingTicket/types.d.ts +2 -0
  73. package/dist/solution/BookingTicket/types.js +3 -0
  74. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +113 -0
  75. package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
  76. package/dist/solution/BookingTicket/utils/cartView.js +4 -2
  77. package/dist/solution/ScanOrder/index.d.ts +9 -3
  78. package/dist/solution/ScanOrder/index.js +231 -128
  79. package/dist/solution/ScanOrder/utils.js +46 -8
  80. package/dist/solution/ShopDiscount/index.d.ts +0 -1
  81. package/dist/solution/ShopDiscount/index.js +18 -23
  82. package/dist/solution/VenueBooking/index.d.ts +5 -9
  83. package/dist/solution/VenueBooking/index.js +103 -55
  84. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
  85. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -0
  86. package/lib/model/strategy/adapter/promotion/index.js +0 -49
  87. package/lib/modules/BookingContext/index.d.ts +37 -0
  88. package/lib/modules/BookingContext/index.js +297 -0
  89. package/lib/modules/BookingContext/types.d.ts +102 -0
  90. package/lib/modules/BookingContext/types.js +34 -0
  91. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  92. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +207 -0
  93. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  94. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +141 -0
  95. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +75 -0
  96. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +198 -0
  97. package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
  98. package/lib/modules/BookingContext/utils/flexible.js +80 -0
  99. package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  100. package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
  101. package/lib/modules/BookingContext/utils/index.d.ts +11 -0
  102. package/lib/modules/BookingContext/utils/index.js +43 -0
  103. package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
  104. package/lib/modules/BookingContext/utils/noResource.js +90 -0
  105. package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
  106. package/lib/modules/BookingContext/utils/productExtend.js +283 -0
  107. package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  108. package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
  109. package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  110. package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
  111. package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
  112. package/lib/modules/BookingContext/utils/resources.js +377 -0
  113. package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  114. package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
  115. package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  116. package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
  117. package/lib/modules/Customer/index.d.ts +6 -0
  118. package/lib/modules/Customer/index.js +26 -11
  119. package/lib/modules/Customer/types.d.ts +2 -0
  120. package/lib/modules/Discount/index.d.ts +2 -4
  121. package/lib/modules/Discount/index.js +8 -63
  122. package/lib/modules/Discount/types.d.ts +1 -7
  123. package/lib/modules/Order/index.d.ts +84 -17
  124. package/lib/modules/Order/index.js +588 -145
  125. package/lib/modules/Order/types.d.ts +198 -18
  126. package/lib/modules/Order/types.js +1 -0
  127. package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  128. package/lib/modules/Order/utils/manualProductDiscount.js +207 -0
  129. package/lib/modules/Order/utils.d.ts +50 -1
  130. package/lib/modules/Order/utils.js +229 -21
  131. package/lib/modules/Quotation/index.d.ts +0 -1
  132. package/lib/modules/Quotation/index.js +18 -15
  133. package/lib/modules/Rules/index.d.ts +4 -0
  134. package/lib/modules/Rules/index.js +22 -14
  135. package/lib/modules/SalesSummary/index.js +4 -2
  136. package/lib/modules/SalesSummary/utils.js +3 -3
  137. package/lib/modules/Schedule/index.js +3 -1
  138. package/lib/modules/index.d.ts +1 -0
  139. package/lib/modules/index.js +3 -1
  140. package/lib/server/index.js +41 -4
  141. package/lib/server/modules/order/utils/filterOrders.js +12 -4
  142. package/lib/server/modules/products/index.d.ts +1 -1
  143. package/lib/server/modules/products/index.js +30 -20
  144. package/lib/server/modules/schedule/index.js +2 -1
  145. package/lib/solution/BaseSales/index.d.ts +89 -7
  146. package/lib/solution/BaseSales/index.js +736 -22
  147. package/lib/solution/BaseSales/types.d.ts +67 -1
  148. package/lib/solution/BaseSales/types.js +3 -1
  149. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +275 -0
  150. package/lib/solution/BaseSales/utils/cartPromotion.js +836 -0
  151. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
  152. package/lib/solution/BaseSales/utils/quotationPrice.js +277 -0
  153. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +71 -12
  154. package/lib/solution/BaseSales/utils.js +46 -6
  155. package/lib/solution/BookingByStep/index.d.ts +1 -1
  156. package/lib/solution/BookingTicket/index.d.ts +133 -1
  157. package/lib/solution/BookingTicket/index.js +352 -8
  158. package/lib/solution/BookingTicket/types.d.ts +2 -0
  159. package/lib/solution/BookingTicket/types.js +6 -0
  160. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +113 -0
  161. package/lib/solution/BookingTicket/utils/addProductDecision.js +318 -0
  162. package/lib/solution/BookingTicket/utils/cartView.js +4 -2
  163. package/lib/solution/ScanOrder/index.d.ts +9 -3
  164. package/lib/solution/ScanOrder/index.js +147 -66
  165. package/lib/solution/ScanOrder/utils.js +46 -6
  166. package/lib/solution/ShopDiscount/index.d.ts +0 -1
  167. package/lib/solution/ShopDiscount/index.js +2 -4
  168. package/lib/solution/VenueBooking/index.d.ts +5 -9
  169. package/lib/solution/VenueBooking/index.js +50 -14
  170. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
  171. package/lib/solution/VenueBooking/utils/slotMerge.js +10 -0
  172. package/package.json +2 -2
@@ -159,6 +159,14 @@ var RulesModule = class extends import_BaseModule.BaseModule {
159
159
  filterDiscountListByType(discountList, type) {
160
160
  return (discountList || []).filter((item) => item.type === type || item.tag === type);
161
161
  }
162
+ /** 剔除指定 type/tag 的折扣项,保留手动改价(type=product) / 券等 */
163
+ excludeDiscountListByType(discountList, type) {
164
+ return (discountList || []).filter((item) => item.type !== type && item.tag !== type);
165
+ }
166
+ /** 手动改价场景:去掉 promotion,保留 type=product 等行内折扣 */
167
+ resolveDiscountListForManualOverride(discountList) {
168
+ return this.excludeDiscountListByType(discountList, "promotion");
169
+ }
162
170
  // 获取券不可用的原因
163
171
  getUnavailableReason(discountList, productList) {
164
172
  var _a;
@@ -673,7 +681,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
673
681
  }, 0);
674
682
  };
675
683
  sortedFlattenedList.forEach((flatItem, index) => {
676
- 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;
684
+ 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;
677
685
  let product, originProduct;
678
686
  if (flatItem.type === "main") {
679
687
  product = flatItem.product;
@@ -896,7 +904,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
896
904
  price: product.price,
897
905
  options: restoredOptions
898
906
  },
899
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
907
+ discount_list: isManualDiscount ? this.resolveDiscountListForManualOverride(product.discount_list) : this.filterDiscountListByType(product.discount_list, "promotion")
900
908
  })
901
909
  ]);
902
910
  } else {
@@ -918,14 +926,14 @@ var RulesModule = class extends import_BaseModule.BaseModule {
918
926
  main_product_selling_price,
919
927
  options: restoredOptions
920
928
  },
921
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
929
+ discount_list: isManualDiscount ? this.resolveDiscountListForManualOverride(product.discount_list) : this.filterDiscountListByType(product.discount_list, "promotion")
922
930
  })
923
931
  ]);
924
932
  }
925
933
  } else {
926
934
  processedFlatItemsMap.set(flatItem._id, [{
927
935
  ...flatItem,
928
- discount_list: this.filterDiscountListByType(((_v = flatItem.bundleItem) == null ? void 0 : _v.discount_list) || [], "promotion"),
936
+ discount_list: isManualDiscount ? this.resolveDiscountListForManualOverride(((_v = flatItem.bundleItem) == null ? void 0 : _v.discount_list) || []) : this.filterDiscountListByType(((_w = flatItem.bundleItem) == null ? void 0 : _w.discount_list) || [], "promotion"),
929
937
  price: isManualDiscount ? flatItem.bundleItem.price : flatItem.bundleItem.original_price,
930
938
  processed: true
931
939
  }]);
@@ -976,13 +984,13 @@ var RulesModule = class extends import_BaseModule.BaseModule {
976
984
  if (this.filterDiscountListByType(product.discount_list, "promotion").length && product.origin_total) {
977
985
  productOriginTotal = product.origin_total;
978
986
  }
979
- 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) {
987
+ 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) {
980
988
  productOriginTotal = product.total;
981
989
  }
982
990
  const isOrderLevel = (0, import_utils3.isOrderLevelFixedAmountDiscount)(selectedDiscount2);
983
991
  const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount2.id) : null;
984
992
  const productAllocation = orderLevelAllocation == null ? void 0 : orderLevelAllocation.get(flatItem._id);
985
- const isDeductOptionPrice = !!((_x = selectedDiscount2.config) == null ? void 0 : _x.deductOptionPrice);
993
+ const isDeductOptionPrice = !!((_y = selectedDiscount2.config) == null ? void 0 : _y.deductOptionPrice);
986
994
  let mainProductSellingPrice;
987
995
  let amount;
988
996
  let productDiscountDifference;
@@ -1000,7 +1008,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1000
1008
  );
1001
1009
  amount = new import_decimal.default(product.price).minus(new import_decimal.default(mainProductSellingPrice)).toNumber();
1002
1010
  }
1003
- if (isDeductOptionPrice && ((_y = product.options) == null ? void 0 : _y.length)) {
1011
+ if (isDeductOptionPrice && ((_z = product.options) == null ? void 0 : _z.length)) {
1004
1012
  const optionResult = applyDiscountToOptions(
1005
1013
  product.options,
1006
1014
  selectedDiscount2
@@ -1008,7 +1016,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1008
1016
  discountedOptions = optionResult.discountedOptions;
1009
1017
  optionDiscountAmount = optionResult.optionDiscountAmount;
1010
1018
  }
1011
- const optionsForLineTotal = isDeductOptionPrice && ((_z = product.options) == null ? void 0 : _z.length) ? discountedOptions : product.options;
1019
+ const optionsForLineTotal = isDeductOptionPrice && ((_A = product.options) == null ? void 0 : _A.length) ? discountedOptions : product.options;
1012
1020
  const optionsLineTotal = getOptionTotal(optionsForLineTotal || []);
1013
1021
  const total = new import_decimal.default(mainProductSellingPrice).plus(optionsLineTotal).toNumber();
1014
1022
  const mainProductDiscountAmount = amount;
@@ -1019,9 +1027,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1019
1027
  amount: lineDiscountAmount,
1020
1028
  type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : discountType,
1021
1029
  discount: {
1022
- discount_card_type: (_A = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _A.discount_card_type,
1030
+ discount_card_type: (_B = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _B.discount_card_type,
1023
1031
  fixed_amount: lineDiscountAmount,
1024
- discount_calculation_mode: (_B = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _B.discount_calculation_mode,
1032
+ discount_calculation_mode: (_C = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _C.discount_calculation_mode,
1025
1033
  resource_id: selectedDiscount2.id,
1026
1034
  title: selectedDiscount2.format_title,
1027
1035
  original_amount: product.price,
@@ -1103,7 +1111,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1103
1111
  type: "good_pass",
1104
1112
  discount: {
1105
1113
  fixed_amount: product.origin_total,
1106
- discount_calculation_mode: (_C = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _C.discount_calculation_mode,
1114
+ discount_calculation_mode: (_D = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _D.discount_calculation_mode,
1107
1115
  resource_id: selectedDiscount2.id,
1108
1116
  title: selectedDiscount2.format_title,
1109
1117
  original_amount: product.origin_total,
@@ -1177,9 +1185,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1177
1185
  amount: fixedAmountPerItem * (product.num || 1),
1178
1186
  type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : selectedDiscount2.tag,
1179
1187
  discount: {
1180
- discount_card_type: (_D = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _D.discount_card_type,
1188
+ discount_card_type: (_E = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _E.discount_card_type,
1181
1189
  fixed_amount: fixedAmountPerItem,
1182
- discount_calculation_mode: (_E = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _E.discount_calculation_mode,
1190
+ discount_calculation_mode: (_F = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _F.discount_calculation_mode,
1183
1191
  resource_id: selectedDiscount2.id,
1184
1192
  title: selectedDiscount2.format_title,
1185
1193
  original_amount: product.original_price,
@@ -1195,7 +1203,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1195
1203
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
1196
1204
  },
1197
1205
  config: selectedDiscount2 == null ? void 0 : selectedDiscount2.config,
1198
- _num: (product.num || 1) * (((_F = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _F.num) || 1)
1206
+ _num: (product.num || 1) * (((_G = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _G.num) || 1)
1199
1207
  };
1200
1208
  const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
1201
1209
  appliedProducts.push(discountDetail);
@@ -30,7 +30,8 @@ __reExport(SalesSummary_exports, require("./types"), module.exports);
30
30
  var salesSummaryDataKeys = {
31
31
  isPriceIncludeTax: "is_price_include_tax",
32
32
  taxRate: "tax_rate",
33
- taxTitle: "tax_title"
33
+ taxTitle: "tax_title",
34
+ taxCountryCode: "tax_country_code"
34
35
  };
35
36
  var SalesSummaryModule = class extends import_BaseModule.BaseModule {
36
37
  constructor(name, version) {
@@ -84,7 +85,8 @@ var SalesSummaryModule = class extends import_BaseModule.BaseModule {
84
85
  return {
85
86
  isPriceIncludeTax: this.getAppData(salesSummaryDataKeys.isPriceIncludeTax),
86
87
  taxRate: this.getAppData(salesSummaryDataKeys.taxRate),
87
- taxTitle: this.getAppData(salesSummaryDataKeys.taxTitle)
88
+ taxTitle: this.getAppData(salesSummaryDataKeys.taxTitle),
89
+ taxCountryCode: this.getAppData(salesSummaryDataKeys.taxCountryCode)
88
90
  };
89
91
  }
90
92
  async getSummary(params) {
@@ -393,8 +393,8 @@ function calculateSalesSummary(params) {
393
393
  );
394
394
  }
395
395
  const shopDiscountAmount = import_decimal.default.max(new import_decimal.default(Number(shopDiscount) || 0), 0);
396
- const expectAmount = import_decimal.default.max(0, productAmount.plus(surchargeAmount).minus(shopDiscountAmount));
397
- const totalAmount = isPriceIncludeTax === 1 ? expectAmount : expectAmount.plus(productTaxFee);
396
+ const preTaxExpectAmount = import_decimal.default.max(0, productAmount.plus(surchargeAmount).minus(shopDiscountAmount));
397
+ const totalAmount = isPriceIncludeTax === 1 ? preTaxExpectAmount : preTaxExpectAmount.plus(productTaxFee);
398
398
  const deposit = calculateProductsDeposit(products);
399
399
  return {
400
400
  product_quantity: productQuantity,
@@ -412,7 +412,7 @@ function calculateSalesSummary(params) {
412
412
  ),
413
413
  deposit_amount: deposit ? deposit.total : "0.00",
414
414
  deposit,
415
- expect_amount: toFixed2(expectAmount),
415
+ expect_amount: toFixed2(totalAmount),
416
416
  total_amount: toFixed2(totalAmount),
417
417
  total_refund_amount: "0.00",
418
418
  customer_paid_amount: "0.00",
@@ -135,7 +135,9 @@ var ScheduleModule = class extends import_BaseModule.BaseModule {
135
135
  return dates;
136
136
  }
137
137
  getScheduleListByIds(ids) {
138
- return this.store.scheduleList.filter((n) => ids.includes(n.id));
138
+ const idSet = new Set(ids.map((id) => String(id)));
139
+ const list = this.store.scheduleList.filter((n) => idSet.has(String(n.id)));
140
+ return list;
139
141
  }
140
142
  setAvailabilityScheduleDateList(list) {
141
143
  this.store.availabilityDateList = list;
@@ -16,3 +16,4 @@ export * from './Schedule';
16
16
  export * from './Quotation';
17
17
  export * from './ScanOrderLogger';
18
18
  export * from './OpenData';
19
+ export * from './BookingContext';
@@ -34,6 +34,7 @@ __reExport(modules_exports, require("./Schedule"), module.exports);
34
34
  __reExport(modules_exports, require("./Quotation"), module.exports);
35
35
  __reExport(modules_exports, require("./ScanOrderLogger"), module.exports);
36
36
  __reExport(modules_exports, require("./OpenData"), module.exports);
37
+ __reExport(modules_exports, require("./BookingContext"), module.exports);
37
38
  // Annotate the CommonJS export names for ESM import in node:
38
39
  0 && (module.exports = {
39
40
  ...require("./Product"),
@@ -53,5 +54,6 @@ __reExport(modules_exports, require("./OpenData"), module.exports);
53
54
  ...require("./Schedule"),
54
55
  ...require("./Quotation"),
55
56
  ...require("./ScanOrderLogger"),
56
- ...require("./OpenData")
57
+ ...require("./OpenData"),
58
+ ...require("./BookingContext")
57
59
  });
@@ -149,10 +149,11 @@ var Server = class {
149
149
  */
150
150
  this.handleProductQuery = async ({ url, method, data, config }) => {
151
151
  console.log("[Server] handleProductQuery:", url, method, data, config);
152
- const { menu_list_ids, schedule_datetime, schedule_date, customer_id } = data;
152
+ const { menu_list_ids, schedule_datetime, schedule_date, customer_id, ids } = data;
153
153
  const { callback, subscriberId } = config || {};
154
154
  this.logInfo("handleProductQuery: 开始处理商品查询请求", {
155
155
  menu_list_ids,
156
+ ids,
156
157
  schedule_datetime,
157
158
  schedule_date,
158
159
  customer_id
@@ -160,14 +161,14 @@ var Server = class {
160
161
  if (subscriberId && typeof callback === "function") {
161
162
  this.productQuerySubscribers.set(subscriberId, {
162
163
  callback,
163
- context: { menu_list_ids, schedule_date, schedule_datetime, customer_id }
164
+ context: { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id }
164
165
  });
165
166
  this.logInfo("handleProductQuery: 已注册订阅者", {
166
167
  subscriberId,
167
168
  totalSubscribers: this.productQuerySubscribers.size
168
169
  });
169
170
  }
170
- return this.computeProductQueryResult({ menu_list_ids, schedule_date, schedule_datetime, customer_id });
171
+ return this.computeProductQueryResult({ menu_list_ids, ids, schedule_date, schedule_datetime, customer_id });
171
172
  };
172
173
  /**
173
174
  * 按商品 id 查询单条(GET /shop/product/query/:productId)
@@ -931,6 +932,8 @@ var Server = class {
931
932
  return;
932
933
  }
933
934
  try {
935
+ await this.schedule.loadAllSchedule();
936
+ this.products.clearPriceCache();
934
937
  await this.products.setupQuotationPriceBridge({
935
938
  scheduleModule: this.schedule,
936
939
  channel: (_a = this.core.context) == null ? void 0 : _a.channel
@@ -2049,9 +2052,11 @@ var Server = class {
2049
2052
  */
2050
2053
  async computeProductQueryResult(context, options) {
2051
2054
  const tTotal = performance.now();
2052
- const { menu_list_ids, schedule_date, schedule_datetime, customer_id, product_id } = context;
2055
+ const { menu_list_ids, ids, schedule_date, schedule_datetime, customer_id, product_id } = context;
2056
+ const queryIds = Array.isArray(ids) ? ids.map((id) => Number(id)).filter((id) => Number.isFinite(id)) : [];
2053
2057
  this.logInfo("computeProductQueryResult 开始", {
2054
2058
  menuListIdsCount: (menu_list_ids == null ? void 0 : menu_list_ids.length) ?? 0,
2059
+ ids: queryIds,
2055
2060
  schedule_datetime,
2056
2061
  schedule_date,
2057
2062
  customer_id,
@@ -2062,6 +2067,38 @@ var Server = class {
2062
2067
  this.logError("computeProductQueryResult: Products 模块未注册");
2063
2068
  return { message: "Products 模块未注册", data: { list: [], count: 0 } };
2064
2069
  }
2070
+ if (queryIds.length > 0) {
2071
+ const uniqueIds = Array.from(new Set(queryIds));
2072
+ const tPrice2 = performance.now();
2073
+ const productsWithPrice = await this.products.getProductsWithPrice(schedule_date, {
2074
+ scheduleModule: this.getSchedule(),
2075
+ schedule_datetime,
2076
+ customer_id
2077
+ }, {
2078
+ changedIds: options == null ? void 0 : options.changedIds,
2079
+ productIds: uniqueIds
2080
+ });
2081
+ (0, import_product.perfMark)("computeQuery.getProductsWithPrice(ids)", performance.now() - tPrice2, {
2082
+ count: productsWithPrice.length,
2083
+ ids: uniqueIds
2084
+ });
2085
+ const filteredProducts2 = productsWithPrice.filter((p) => uniqueIds.includes(Number(p == null ? void 0 : p.id))).filter((p) => ((p == null ? void 0 : p.status) || "published") === "published");
2086
+ (0, import_product.perfMark)("computeProductQueryResult", performance.now() - tTotal, {
2087
+ mode: "ids",
2088
+ ids: uniqueIds,
2089
+ count: filteredProducts2.length
2090
+ });
2091
+ this.logInfo("computeProductQueryResult 完成(ids)", {
2092
+ ids: uniqueIds,
2093
+ count: filteredProducts2.length
2094
+ });
2095
+ return {
2096
+ code: 200,
2097
+ data: { list: filteredProducts2, count: filteredProducts2.length },
2098
+ message: "",
2099
+ status: true
2100
+ };
2101
+ }
2065
2102
  if (product_id != null && Number.isFinite(Number(product_id))) {
2066
2103
  const pid = Number(product_id);
2067
2104
  const tPrice2 = performance.now();
@@ -33,6 +33,13 @@ __export(filterOrders_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(filterOrders_exports);
35
35
  var import_dayjs = __toESM(require("dayjs"));
36
+ function getOrderPaymentCodes(order) {
37
+ const payments = order.payments;
38
+ if (!Array.isArray(payments) || payments.length === 0) {
39
+ return [];
40
+ }
41
+ return payments.map((item) => item == null ? void 0 : item.code).filter((code) => typeof code === "string" && code.length > 0);
42
+ }
36
43
  function filterOrders(orders, filters) {
37
44
  const safeFilters = filters || {};
38
45
  if (!orders || !Array.isArray(orders)) {
@@ -133,26 +140,27 @@ function filterOrders(orders, filters) {
133
140
  }
134
141
  }
135
142
  if (safeFilters.payment_methods && safeFilters.payment_methods.length > 0) {
136
- if (!order.payment_methods || !Array.isArray(order.payment_methods) || order.payment_methods.length === 0) {
143
+ const orderPaymentCodes = getOrderPaymentCodes(order);
144
+ if (orderPaymentCodes.length === 0) {
137
145
  rejected.push({
138
146
  order_id: order.order_id,
139
147
  order_number: order.order_number,
140
148
  reason: {
141
149
  field: "payment_methods",
142
- actual: order.payment_methods,
150
+ actual: order.payments,
143
151
  expected: safeFilters.payment_methods
144
152
  }
145
153
  });
146
154
  return false;
147
155
  }
148
- const hasMatch = order.payment_methods.some((pm) => safeFilters.payment_methods.includes(pm));
156
+ const hasMatch = orderPaymentCodes.some((code) => safeFilters.payment_methods.includes(code));
149
157
  if (!hasMatch) {
150
158
  rejected.push({
151
159
  order_id: order.order_id,
152
160
  order_number: order.order_number,
153
161
  reason: {
154
162
  field: "payment_methods",
155
- actual: order.payment_methods,
163
+ actual: orderPaymentCodes,
156
164
  expected: safeFilters.payment_methods
157
165
  }
158
166
  });
@@ -21,7 +21,7 @@ export declare class ProductsModule extends BaseModule implements Module {
21
21
  private isPriceFormatterRegistered;
22
22
  private quotationPriceBridge?;
23
23
  private quotationBridgeChannel?;
24
- private quotationBridgeCustomerId?;
24
+ private quotationBridgeLoadedKey?;
25
25
  private quotationBridgeRefreshPromise?;
26
26
  private quotationBridgeRefreshKey?;
27
27
  private productDataSource;
@@ -44,6 +44,7 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
44
44
  this.formatters = [];
45
45
  // 是否已注册内置价格格式化器
46
46
  this.isPriceFormatterRegistered = false;
47
+ this.quotationBridgeLoadedKey = "";
47
48
  this.pendingSyncMessages = [];
48
49
  }
49
50
  async initialize(core, options) {
@@ -177,7 +178,7 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
177
178
  * Server 层负责传入完整 schedule 模块,Products 只负责把报价单计算结果转成价格响应形状。
178
179
  */
179
180
  async setupQuotationPriceBridge(params) {
180
- var _a, _b, _c;
181
+ var _a;
181
182
  if (!this.core) {
182
183
  this.logWarning("setupQuotationPriceBridge: core 尚未初始化");
183
184
  return;
@@ -190,15 +191,25 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
190
191
  this.quotationPriceBridge = quotation;
191
192
  }
192
193
  if (params.scheduleModule) {
193
- const scheduleList = ((_c = (_b = params.scheduleModule).getScheduleList) == null ? void 0 : _c.call(_b)) || [];
194
- const scheduleMap = new Map(
195
- scheduleList.map((schedule) => [schedule.id, schedule])
196
- );
194
+ const scheduleCache = /* @__PURE__ */ new Map();
195
+ let hasLoadedScheduleList = false;
197
196
  this.quotationPriceBridge.setScheduleResolver((id) => {
198
- var _a2, _b2;
199
- if (scheduleMap.has(id))
200
- return scheduleMap.get(id);
201
- const schedules = ((_b2 = (_a2 = params.scheduleModule).getScheduleByIds) == null ? void 0 : _b2.call(_a2, [id])) || [];
197
+ var _a2, _b, _c, _d, _e, _f;
198
+ const scheduleId = String(id);
199
+ if (scheduleCache.has(scheduleId))
200
+ return scheduleCache.get(scheduleId);
201
+ if (!hasLoadedScheduleList) {
202
+ const scheduleList = ((_b = (_a2 = params.scheduleModule).getScheduleList) == null ? void 0 : _b.call(_a2)) || [];
203
+ for (const schedule of scheduleList) {
204
+ scheduleCache.set(String(schedule.id), schedule);
205
+ }
206
+ hasLoadedScheduleList = true;
207
+ }
208
+ if (scheduleCache.has(scheduleId))
209
+ return scheduleCache.get(scheduleId);
210
+ const schedules = ((_d = (_c = params.scheduleModule).getScheduleListByIds) == null ? void 0 : _d.call(_c, [id])) || ((_f = (_e = params.scheduleModule).getScheduleByIds) == null ? void 0 : _f.call(_e, [id])) || [];
211
+ if (schedules[0])
212
+ scheduleCache.set(scheduleId, schedules[0]);
202
213
  return schedules[0];
203
214
  });
204
215
  }
@@ -210,8 +221,7 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
210
221
  async refreshQuotationPriceBridge(params) {
211
222
  if (!this.quotationPriceBridge)
212
223
  return;
213
- const customerId = params && "customer_id" in params ? params.customer_id : this.quotationBridgeCustomerId;
214
- const refreshKey = this.getQuotationBridgeScopeKey(customerId);
224
+ const refreshKey = this.getQuotationBridgeScopeKey();
215
225
  if (this.quotationBridgeRefreshPromise && this.quotationBridgeRefreshKey === refreshKey) {
216
226
  await this.quotationBridgeRefreshPromise;
217
227
  return;
@@ -221,10 +231,9 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
221
231
  }
222
232
  this.quotationBridgeRefreshKey = refreshKey;
223
233
  this.quotationBridgeRefreshPromise = this.quotationPriceBridge.loadQuotations({
224
- channel: this.quotationBridgeChannel,
225
- customer_id: customerId
234
+ channel: this.quotationBridgeChannel
226
235
  }).then(() => {
227
- this.quotationBridgeCustomerId = customerId;
236
+ this.quotationBridgeLoadedKey = refreshKey;
228
237
  }).finally(() => {
229
238
  this.quotationBridgeRefreshPromise = void 0;
230
239
  this.quotationBridgeRefreshKey = void 0;
@@ -243,12 +252,12 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
243
252
  if (this.quotationBridgeRefreshPromise) {
244
253
  await this.quotationBridgeRefreshPromise;
245
254
  }
246
- if (this.getQuotationBridgeScopeKey(customerId) !== this.getQuotationBridgeScopeKey(this.quotationBridgeCustomerId)) {
255
+ if (this.getQuotationBridgeScopeKey() !== this.quotationBridgeLoadedKey) {
247
256
  await this.refreshQuotationPriceBridge({ customer_id: customerId });
248
257
  }
249
258
  }
250
- getQuotationBridgeScopeKey(customerId) {
251
- return `${this.quotationBridgeChannel || ""}:${customerId ?? ""}`;
259
+ getQuotationBridgeScopeKey() {
260
+ return this.quotationBridgeChannel || "";
252
261
  }
253
262
  buildPriceDataFromQuotation(product, datetime, customerId) {
254
263
  var _a;
@@ -258,10 +267,11 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
258
267
  customer_id: customerId
259
268
  });
260
269
  const productPrice = quotedPrice ?? product.price;
270
+ const productBasePrice = quotedPrice ?? product.base_price ?? product.price ?? 0;
261
271
  return {
262
272
  id: product.id,
263
273
  price: String(productPrice ?? 0),
264
- base_price: String(product.base_price ?? product.price ?? 0),
274
+ base_price: String(productBasePrice),
265
275
  variant: this.buildVariantPriceData(product, datetime, customerId),
266
276
  bundle_group: this.buildBundleGroupPriceData(product, datetime, customerId)
267
277
  };
@@ -278,7 +288,7 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
278
288
  customer_id: customerId
279
289
  });
280
290
  const price = quotedPrice ?? variant.price ?? product.price ?? 0;
281
- const basePrice = variant.base_price ?? variant.price ?? product.base_price ?? product.price ?? 0;
291
+ const basePrice = quotedPrice ?? variant.base_price ?? variant.price ?? product.base_price ?? product.price ?? 0;
282
292
  return {
283
293
  id: Number(variant.id),
284
294
  product_id: Number(variant.product_id ?? product.id),
@@ -303,7 +313,7 @@ var ProductsModule = class extends import_BaseModule.BaseModule {
303
313
  customer_id: customerId
304
314
  });
305
315
  const price = quotedPrice ?? item.price ?? 0;
306
- const basePrice = item.base_price ?? item.price ?? 0;
316
+ const basePrice = quotedPrice ?? item.base_price ?? item.price ?? 0;
307
317
  return {
308
318
  id: Number(item.id),
309
319
  product_id: Number(item.product_id ?? product.id),
@@ -183,8 +183,9 @@ var ScheduleModuleEx = class extends import_BaseModule.BaseModule {
183
183
  return [];
184
184
  }
185
185
  const result = [];
186
+ const scheduleList = this.store.scheduleList || [];
186
187
  for (const id of ids) {
187
- const schedule = this.store.map.get(id);
188
+ const schedule = this.store.map.get(id) || scheduleList.find((item) => String(item.id) === String(id));
188
189
  if (schedule) {
189
190
  result.push(schedule);
190
191
  }