@pisell/pisellos 2.2.244 → 2.2.246

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 (316) hide show
  1. package/dist/model/strategy/adapter/promotion/evaluator.js +3 -2
  2. package/dist/model/strategy/adapter/walletPass/utils.js +7 -4
  3. package/dist/modules/BookingContext/index.d.ts +48 -0
  4. package/dist/modules/BookingContext/index.js +566 -0
  5. package/dist/modules/BookingContext/types.d.ts +102 -0
  6. package/dist/modules/BookingContext/types.js +51 -0
  7. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  8. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +284 -0
  9. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  10. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +148 -0
  11. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  12. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +218 -0
  13. package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
  14. package/dist/modules/BookingContext/utils/flexible.js +56 -0
  15. package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  16. package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
  17. package/dist/modules/BookingContext/utils/index.d.ts +11 -0
  18. package/dist/modules/BookingContext/utils/index.js +11 -0
  19. package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
  20. package/dist/modules/BookingContext/utils/noResource.js +77 -0
  21. package/dist/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  22. package/dist/modules/BookingContext/utils/orderLineDisplay.js +36 -0
  23. package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
  24. package/dist/modules/BookingContext/utils/productExtend.js +339 -0
  25. package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  26. package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
  27. package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  28. package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
  29. package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
  30. package/dist/modules/BookingContext/utils/resources.js +486 -0
  31. package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  32. package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
  33. package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  34. package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
  35. package/dist/modules/Cart/utils/cartProduct.js +24 -3
  36. package/dist/modules/Cart/utils/changePrice.js +11 -11
  37. package/dist/modules/Customer/index.d.ts +20 -0
  38. package/dist/modules/Customer/index.js +172 -83
  39. package/dist/modules/Customer/types.d.ts +2 -0
  40. package/dist/modules/Discount/index.d.ts +1 -1
  41. package/dist/modules/Discount/index.js +13 -6
  42. package/dist/modules/Discount/types.d.ts +1 -0
  43. package/dist/modules/OpenData/index.d.ts +8 -0
  44. package/dist/modules/OpenData/index.js +37 -17
  45. package/dist/modules/Order/index.d.ts +277 -18
  46. package/dist/modules/Order/index.js +3581 -779
  47. package/dist/modules/Order/types.d.ts +286 -31
  48. package/dist/modules/Order/types.js +38 -0
  49. package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  50. package/dist/modules/Order/utils/manualProductDiscount.js +210 -0
  51. package/dist/modules/Order/utils.d.ts +147 -5
  52. package/dist/modules/Order/utils.js +750 -104
  53. package/dist/modules/Payment/index.d.ts +10 -13
  54. package/dist/modules/Payment/index.js +467 -837
  55. package/dist/modules/Payment/types.d.ts +2 -0
  56. package/dist/modules/Payment/utils.js +2 -1
  57. package/dist/modules/Payment/walletpass.js +41 -25
  58. package/dist/modules/ProductList/index.d.ts +16 -12
  59. package/dist/modules/ProductList/index.js +133 -59
  60. package/dist/modules/ProductList/types.d.ts +14 -0
  61. package/dist/modules/Quotation/index.d.ts +0 -1
  62. package/dist/modules/Quotation/index.js +25 -22
  63. package/dist/modules/Rules/index.d.ts +4 -0
  64. package/dist/modules/Rules/index.js +97 -70
  65. package/dist/modules/Rules/types.d.ts +1 -0
  66. package/dist/modules/SalesSummary/index.d.ts +8 -25
  67. package/dist/modules/SalesSummary/index.js +86 -35
  68. package/dist/modules/SalesSummary/types.d.ts +4 -1
  69. package/dist/modules/SalesSummary/utils.d.ts +2 -25
  70. package/dist/modules/SalesSummary/utils.js +794 -162
  71. package/dist/modules/Schedule/index.d.ts +7 -0
  72. package/dist/modules/Schedule/index.js +24 -2
  73. package/dist/modules/Summary/index.js +4 -3
  74. package/dist/modules/SurchargeList/index.d.ts +16 -0
  75. package/dist/modules/SurchargeList/index.js +162 -0
  76. package/dist/modules/SurchargeList/types.d.ts +11 -0
  77. package/dist/modules/SurchargeList/types.js +1 -0
  78. package/dist/modules/index.d.ts +2 -0
  79. package/dist/modules/index.js +3 -1
  80. package/dist/plugins/request.d.ts +1 -0
  81. package/dist/server/index.d.ts +204 -1
  82. package/dist/server/index.js +3654 -922
  83. package/dist/server/modules/index.d.ts +2 -0
  84. package/dist/server/modules/index.js +2 -0
  85. package/dist/server/modules/order/index.d.ts +120 -3
  86. package/dist/server/modules/order/index.js +1762 -448
  87. package/dist/server/modules/order/types.d.ts +32 -3
  88. package/dist/server/modules/order/types.js +8 -0
  89. package/dist/server/modules/order/utils/filterBookings.js +26 -3
  90. package/dist/server/modules/order/utils/filterOrders.js +23 -8
  91. package/dist/server/modules/payment/index.d.ts +28 -0
  92. package/dist/server/modules/payment/index.js +305 -0
  93. package/dist/server/modules/payment/types.d.ts +9 -0
  94. package/dist/server/modules/payment/types.js +1 -0
  95. package/dist/server/modules/products/index.d.ts +34 -7
  96. package/dist/server/modules/products/index.js +631 -317
  97. package/dist/server/modules/resource/index.d.ts +2 -0
  98. package/dist/server/modules/resource/index.js +29 -3
  99. package/dist/server/modules/schedule/index.d.ts +4 -4
  100. package/dist/server/modules/schedule/index.js +111 -88
  101. package/dist/server/test.json +713 -0
  102. package/dist/server/utils/small-ticket.d.ts +71 -0
  103. package/dist/server/utils/small-ticket.js +840 -0
  104. package/dist/solution/BaseSales/index.d.ts +133 -10
  105. package/dist/solution/BaseSales/index.js +1950 -447
  106. package/dist/solution/BaseSales/types.d.ts +82 -6
  107. package/dist/solution/BaseSales/types.js +5 -4
  108. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  109. package/dist/solution/BaseSales/utils/cartPromotion.js +1438 -0
  110. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
  111. package/dist/solution/BaseSales/utils/quotationPrice.js +237 -0
  112. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +1 -0
  113. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +105 -24
  114. package/dist/solution/BaseSales/utils.d.ts +1 -1
  115. package/dist/solution/BaseSales/utils.js +62 -21
  116. package/dist/solution/BookingByStep/index.d.ts +1 -1
  117. package/dist/solution/BookingTicket/index.d.ts +271 -11
  118. package/dist/solution/BookingTicket/index.js +1777 -242
  119. package/dist/solution/BookingTicket/types.d.ts +118 -1
  120. package/dist/solution/BookingTicket/types.js +41 -2
  121. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  122. package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
  123. package/dist/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  124. package/dist/solution/BookingTicket/utils/addTimeAvailability.js +95 -0
  125. package/dist/solution/BookingTicket/utils/bookingStatus.d.ts +40 -0
  126. package/dist/solution/BookingTicket/utils/bookingStatus.js +70 -0
  127. package/dist/solution/BookingTicket/utils/cartView.d.ts +9 -1
  128. package/dist/solution/BookingTicket/utils/cartView.js +94 -7
  129. package/dist/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  130. package/dist/solution/BookingTicket/utils/exampleData.js +183 -0
  131. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  132. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.js +438 -0
  133. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  134. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +400 -0
  135. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  136. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +56 -0
  137. package/dist/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  138. package/dist/solution/BookingTicket/utils/scan/index.js +20 -8
  139. package/dist/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  140. package/dist/solution/BookingTicket/utils/scan/scanProductValues.js +150 -0
  141. package/dist/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  142. package/dist/solution/BookingTicket/utils/sessionCatalogStale.js +78 -0
  143. package/dist/solution/Checkout/index.d.ts +1 -0
  144. package/dist/solution/Checkout/index.js +10 -9
  145. package/dist/solution/RegisterAndLogin/config.js +2 -10
  146. package/dist/solution/ScanOrder/index.d.ts +9 -3
  147. package/dist/solution/ScanOrder/index.js +241 -134
  148. package/dist/solution/ScanOrder/types.d.ts +9 -5
  149. package/dist/solution/ScanOrder/types.js +2 -3
  150. package/dist/solution/ScanOrder/utils.d.ts +1 -1
  151. package/dist/solution/ScanOrder/utils.js +84 -22
  152. package/dist/solution/VenueBooking/index.d.ts +5 -2
  153. package/dist/solution/VenueBooking/index.js +110 -59
  154. package/dist/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  155. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
  156. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -0
  157. package/dist/types/index.d.ts +10 -0
  158. package/lib/model/strategy/adapter/promotion/evaluator.js +2 -1
  159. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  160. package/lib/model/strategy/adapter/walletPass/utils.js +3 -2
  161. package/lib/modules/BookingContext/index.d.ts +48 -0
  162. package/lib/modules/BookingContext/index.js +368 -0
  163. package/lib/modules/BookingContext/types.d.ts +102 -0
  164. package/lib/modules/BookingContext/types.js +34 -0
  165. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  166. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +276 -0
  167. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  168. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +154 -0
  169. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  170. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +201 -0
  171. package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
  172. package/lib/modules/BookingContext/utils/flexible.js +80 -0
  173. package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  174. package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
  175. package/lib/modules/BookingContext/utils/index.d.ts +11 -0
  176. package/lib/modules/BookingContext/utils/index.js +43 -0
  177. package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
  178. package/lib/modules/BookingContext/utils/noResource.js +90 -0
  179. package/lib/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  180. package/lib/modules/BookingContext/utils/orderLineDisplay.js +56 -0
  181. package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
  182. package/lib/modules/BookingContext/utils/productExtend.js +283 -0
  183. package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  184. package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
  185. package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  186. package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
  187. package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
  188. package/lib/modules/BookingContext/utils/resources.js +377 -0
  189. package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  190. package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
  191. package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  192. package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
  193. package/lib/modules/Cart/utils/cartProduct.js +20 -3
  194. package/lib/modules/Cart/utils/changePrice.js +12 -20
  195. package/lib/modules/Customer/index.d.ts +20 -0
  196. package/lib/modules/Customer/index.js +64 -11
  197. package/lib/modules/Customer/types.d.ts +2 -0
  198. package/lib/modules/Discount/index.d.ts +1 -1
  199. package/lib/modules/Discount/index.js +9 -1
  200. package/lib/modules/Discount/types.d.ts +1 -0
  201. package/lib/modules/OpenData/index.d.ts +8 -0
  202. package/lib/modules/OpenData/index.js +19 -5
  203. package/lib/modules/Order/index.d.ts +277 -18
  204. package/lib/modules/Order/index.js +2317 -337
  205. package/lib/modules/Order/types.d.ts +286 -31
  206. package/lib/modules/Order/types.js +1 -0
  207. package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  208. package/lib/modules/Order/utils/manualProductDiscount.js +206 -0
  209. package/lib/modules/Order/utils.d.ts +147 -5
  210. package/lib/modules/Order/utils.js +615 -46
  211. package/lib/modules/Payment/index.d.ts +10 -13
  212. package/lib/modules/Payment/index.js +18 -150
  213. package/lib/modules/Payment/types.d.ts +2 -0
  214. package/lib/modules/Payment/utils.js +2 -1
  215. package/lib/modules/Payment/walletpass.js +16 -3
  216. package/lib/modules/ProductList/index.d.ts +16 -12
  217. package/lib/modules/ProductList/index.js +41 -4
  218. package/lib/modules/ProductList/types.d.ts +14 -0
  219. package/lib/modules/Quotation/index.d.ts +0 -1
  220. package/lib/modules/Quotation/index.js +19 -16
  221. package/lib/modules/Rules/index.d.ts +4 -0
  222. package/lib/modules/Rules/index.js +137 -120
  223. package/lib/modules/Rules/types.d.ts +1 -0
  224. package/lib/modules/SalesSummary/index.d.ts +8 -25
  225. package/lib/modules/SalesSummary/index.js +30 -4
  226. package/lib/modules/SalesSummary/types.d.ts +4 -1
  227. package/lib/modules/SalesSummary/utils.d.ts +2 -25
  228. package/lib/modules/SalesSummary/utils.js +645 -91
  229. package/lib/modules/Schedule/index.d.ts +7 -0
  230. package/lib/modules/Schedule/index.js +17 -1
  231. package/lib/modules/Summary/index.js +5 -4
  232. package/lib/modules/SurchargeList/index.d.ts +16 -0
  233. package/lib/modules/SurchargeList/index.js +89 -0
  234. package/lib/modules/SurchargeList/types.d.ts +11 -0
  235. package/lib/modules/SurchargeList/types.js +17 -0
  236. package/lib/modules/index.d.ts +2 -0
  237. package/lib/modules/index.js +5 -1
  238. package/lib/plugins/request.d.ts +1 -0
  239. package/lib/server/index.d.ts +204 -1
  240. package/lib/server/index.js +1891 -59
  241. package/lib/server/modules/index.d.ts +2 -0
  242. package/lib/server/modules/index.js +3 -0
  243. package/lib/server/modules/order/index.d.ts +120 -3
  244. package/lib/server/modules/order/index.js +887 -94
  245. package/lib/server/modules/order/types.d.ts +32 -3
  246. package/lib/server/modules/order/utils/filterBookings.js +24 -5
  247. package/lib/server/modules/order/utils/filterOrders.js +15 -6
  248. package/lib/server/modules/payment/index.d.ts +28 -0
  249. package/lib/server/modules/payment/index.js +192 -0
  250. package/lib/server/modules/payment/types.d.ts +9 -0
  251. package/lib/server/modules/payment/types.js +17 -0
  252. package/lib/server/modules/products/index.d.ts +34 -7
  253. package/lib/server/modules/products/index.js +189 -54
  254. package/lib/server/modules/resource/index.d.ts +2 -0
  255. package/lib/server/modules/resource/index.js +27 -3
  256. package/lib/server/modules/schedule/index.d.ts +4 -4
  257. package/lib/server/modules/schedule/index.js +47 -40
  258. package/lib/server/test.json +713 -0
  259. package/lib/server/utils/small-ticket.d.ts +71 -0
  260. package/lib/server/utils/small-ticket.js +800 -0
  261. package/lib/solution/BaseSales/index.d.ts +133 -10
  262. package/lib/solution/BaseSales/index.js +1111 -63
  263. package/lib/solution/BaseSales/types.d.ts +82 -6
  264. package/lib/solution/BaseSales/types.js +3 -1
  265. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  266. package/lib/solution/BaseSales/utils/cartPromotion.js +992 -0
  267. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
  268. package/lib/solution/BaseSales/utils/quotationPrice.js +277 -0
  269. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +1 -0
  270. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +106 -18
  271. package/lib/solution/BaseSales/utils.d.ts +1 -1
  272. package/lib/solution/BaseSales/utils.js +54 -10
  273. package/lib/solution/BookingByStep/index.d.ts +1 -1
  274. package/lib/solution/BookingTicket/index.d.ts +271 -11
  275. package/lib/solution/BookingTicket/index.js +922 -29
  276. package/lib/solution/BookingTicket/types.d.ts +118 -1
  277. package/lib/solution/BookingTicket/types.js +11 -0
  278. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  279. package/lib/solution/BookingTicket/utils/addProductDecision.js +318 -0
  280. package/lib/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  281. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +125 -0
  282. package/lib/solution/BookingTicket/utils/bookingStatus.d.ts +40 -0
  283. package/lib/solution/BookingTicket/utils/bookingStatus.js +44 -2
  284. package/lib/solution/BookingTicket/utils/cartView.d.ts +9 -1
  285. package/lib/solution/BookingTicket/utils/cartView.js +61 -6
  286. package/lib/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  287. package/lib/solution/BookingTicket/utils/exampleData.js +0 -0
  288. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  289. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +254 -0
  290. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  291. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +169 -0
  292. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  293. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +51 -0
  294. package/lib/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  295. package/lib/solution/BookingTicket/utils/scan/index.js +17 -3
  296. package/lib/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  297. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +127 -0
  298. package/lib/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  299. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +85 -0
  300. package/lib/solution/Checkout/index.d.ts +1 -0
  301. package/lib/solution/Checkout/index.js +1 -2
  302. package/lib/solution/RegisterAndLogin/config.js +2 -10
  303. package/lib/solution/ScanOrder/index.d.ts +9 -3
  304. package/lib/solution/ScanOrder/index.js +153 -70
  305. package/lib/solution/ScanOrder/types.d.ts +9 -5
  306. package/lib/solution/ScanOrder/utils.d.ts +1 -1
  307. package/lib/solution/ScanOrder/utils.js +83 -17
  308. package/lib/solution/VenueBooking/index.d.ts +5 -2
  309. package/lib/solution/VenueBooking/index.js +54 -17
  310. package/lib/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  311. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
  312. package/lib/solution/VenueBooking/utils/slotMerge.js +10 -0
  313. package/lib/types/index.d.ts +10 -0
  314. package/package.json +1 -1
  315. package/dist/solution/Checkout/appointmentDemo.json +0 -1
  316. package/lib/solution/Checkout/appointmentDemo.json +0 -1
@@ -0,0 +1,106 @@
1
+ /** 解析商品行数量(checkout 协议 product_num 语义 = 当前行 num) */
2
+ export declare function resolveSafeProductNum(num?: number | null): number;
3
+ /**
4
+ * 将 discount_list 中 type=product 项的 product_num 同步为当前商品数量。
5
+ *
6
+ * @example
7
+ * syncManualProductDiscountProductNum(line.discount_list, line.num);
8
+ */
9
+ export declare function syncManualProductDiscountProductNum(discountList: any[] | undefined | null, productNum?: number | null): any[];
10
+ /** 从多源解析改价前行总价(与 cacheItem._extend.origin_total 语义一致) */
11
+ export declare function resolveManualDiscountOriginTotal(sources: {
12
+ originTotal?: unknown;
13
+ extendOriginTotal?: unknown;
14
+ originExtendOriginTotal?: unknown;
15
+ sourceExtendOriginTotal?: unknown;
16
+ catalogUnitPrice?: unknown;
17
+ quantity?: number;
18
+ }): number;
19
+ /** 从 payload / extend / origin 解析手动折扣原因 */
20
+ export declare function resolveManualDiscountReasonFromSources(sources: {
21
+ discountReason?: unknown;
22
+ extendDiscountReason?: unknown;
23
+ originExtendDiscountReason?: unknown;
24
+ }): string;
25
+ /** 是否带手动改价标记(price_override / is_manual_discount) */
26
+ export declare function hasManualProductDiscountFlag(metadata?: Record<string, any> | null): boolean;
27
+ /**
28
+ * normalize 兜底:手动改价但 discount_list 缺 type=product 时,按行级原价/折后价补写。
29
+ *
30
+ * @example
31
+ * ensureManualProductDiscountList({
32
+ * discountList: [],
33
+ * metadata: { price_override: '5', is_manual_discount: 1 },
34
+ * originalPrice: '11.00',
35
+ * sellingPrice: '5.00',
36
+ * quantity: 1,
37
+ * });
38
+ */
39
+ export declare function ensureManualProductDiscountList(params: {
40
+ discountList?: any[] | null;
41
+ metadata?: Record<string, any> | null;
42
+ originalPrice: string | number;
43
+ sellingPrice: string | number;
44
+ quantity?: number;
45
+ }): any[];
46
+ /** 商品手动折扣 discount_list 项(checkout 协议,type = product) */
47
+ export interface ManualProductDiscountItem {
48
+ amount: number;
49
+ type: 'product';
50
+ discount: {
51
+ message: string;
52
+ discountway: string;
53
+ product_num: number;
54
+ discount_per: string;
55
+ discount_type: 'discount' | 'change_price';
56
+ };
57
+ }
58
+ /**
59
+ * 从 discount_list 中取手动改价项(type = product)。
60
+ *
61
+ * @example
62
+ * const manual = findManualProductDiscountItem(product.discount_list);
63
+ * manual?.discount.message; // 折扣原因
64
+ */
65
+ export declare function findManualProductDiscountItem(discountList?: any[] | null): ManualProductDiscountItem | undefined;
66
+ /**
67
+ * 解析折扣原因:优先 discount_list[type=product].discount.message。
68
+ *
69
+ * @example
70
+ * resolveManualDiscountMessage(line.discount_list, line.metadata?.legacy_reason);
71
+ */
72
+ export declare function resolveManualDiscountMessage(discountList?: any[] | null, fallback?: string): string;
73
+ /** 去掉 discount_list 中已有的手动改价项,避免重复叠加 */
74
+ export declare function stripManualProductDiscountItems(discountList?: any[] | null): any[];
75
+ /**
76
+ * 由改价前后行总价构建手动折扣项;amount = |originTotal - sellingTotal|(行级差额)。
77
+ *
78
+ * @example
79
+ * buildManualProductDiscountItem({
80
+ * originTotal: 11,
81
+ * sellingTotal: 4,
82
+ * quantity: 1,
83
+ * message: 'VIP',
84
+ * });
85
+ */
86
+ export declare function buildManualProductDiscountItem(params: {
87
+ originTotal: number;
88
+ sellingTotal: number;
89
+ quantity?: number;
90
+ message?: string;
91
+ discountway?: string;
92
+ discount_per?: string;
93
+ }): ManualProductDiscountItem;
94
+ /**
95
+ * 将手动改价项合并进 discount_list(替换已有 type=product 项)。
96
+ *
97
+ * @example
98
+ * mergeManualProductDiscountIntoList(coupons, manualItem);
99
+ */
100
+ export declare function mergeManualProductDiscountIntoList(discountList: any[] | undefined | null, manualItem: ManualProductDiscountItem | null | undefined): any[];
101
+ /** 是否应写入手动改价 discount_list 项 */
102
+ export declare function shouldBuildManualProductDiscount(params: {
103
+ hasPriceOverride?: boolean;
104
+ originTotal?: number;
105
+ sellingTotal?: number;
106
+ }): boolean;
@@ -0,0 +1,210 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
5
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
6
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
12
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ import Decimal from 'decimal.js';
14
+
15
+ /** 解析商品行数量(checkout 协议 product_num 语义 = 当前行 num) */
16
+ export function resolveSafeProductNum(num) {
17
+ var parsed = Number(num);
18
+ if (!Number.isFinite(parsed) || parsed <= 0) return 1;
19
+ return Math.floor(parsed);
20
+ }
21
+
22
+ /**
23
+ * 将 discount_list 中 type=product 项的 product_num 同步为当前商品数量。
24
+ *
25
+ * @example
26
+ * syncManualProductDiscountProductNum(line.discount_list, line.num);
27
+ */
28
+ export function syncManualProductDiscountProductNum(discountList, productNum) {
29
+ var quantity = resolveSafeProductNum(productNum);
30
+ return (discountList || []).map(function (item) {
31
+ if ((item === null || item === void 0 ? void 0 : item.type) !== 'product') return item;
32
+ return _objectSpread(_objectSpread({}, item), {}, {
33
+ discount: _objectSpread(_objectSpread({}, item.discount || {}), {}, {
34
+ product_num: quantity
35
+ })
36
+ });
37
+ });
38
+ }
39
+
40
+ /** 从多源解析改价前行总价(与 cacheItem._extend.origin_total 语义一致) */
41
+ export function resolveManualDiscountOriginTotal(sources) {
42
+ var _sources$quantity;
43
+ var candidates = [sources.originTotal, sources.extendOriginTotal, sources.originExtendOriginTotal, sources.sourceExtendOriginTotal];
44
+ for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) {
45
+ var candidate = _candidates[_i];
46
+ if (candidate === undefined || candidate === null || candidate === '') continue;
47
+ var parsed = Number(candidate);
48
+ if (Number.isFinite(parsed)) return parsed;
49
+ }
50
+ var unit = Number(sources.catalogUnitPrice);
51
+ var quantity = (_sources$quantity = sources.quantity) !== null && _sources$quantity !== void 0 ? _sources$quantity : 1;
52
+ if (Number.isFinite(unit) && unit > 0) {
53
+ return new Decimal(unit).mul(quantity).toNumber();
54
+ }
55
+ return NaN;
56
+ }
57
+
58
+ /** 从 payload / extend / origin 解析手动折扣原因 */
59
+ export function resolveManualDiscountReasonFromSources(sources) {
60
+ for (var _i2 = 0, _arr = [sources.discountReason, sources.extendDiscountReason, sources.originExtendDiscountReason]; _i2 < _arr.length; _i2++) {
61
+ var candidate = _arr[_i2];
62
+ if (candidate != null && String(candidate).trim() !== '') {
63
+ return String(candidate);
64
+ }
65
+ }
66
+ return '';
67
+ }
68
+
69
+ /** 是否带手动改价标记(price_override / is_manual_discount) */
70
+ export function hasManualProductDiscountFlag(metadata) {
71
+ if (!metadata) return false;
72
+ var override = metadata.price_override;
73
+ if (override !== undefined && override !== null && override !== '') {
74
+ return true;
75
+ }
76
+ return metadata.is_manual_discount === 1 || metadata.is_manual_discount === true;
77
+ }
78
+
79
+ /**
80
+ * normalize 兜底:手动改价但 discount_list 缺 type=product 时,按行级原价/折后价补写。
81
+ *
82
+ * @example
83
+ * ensureManualProductDiscountList({
84
+ * discountList: [],
85
+ * metadata: { price_override: '5', is_manual_discount: 1 },
86
+ * originalPrice: '11.00',
87
+ * sellingPrice: '5.00',
88
+ * quantity: 1,
89
+ * });
90
+ */
91
+ export function ensureManualProductDiscountList(params) {
92
+ var _metadata$origin, _metadata$origin2, _metadata$origin3, _metadata$origin4;
93
+ var list = params.discountList || [];
94
+ var quantity = resolveSafeProductNum(params.quantity);
95
+ if (findManualProductDiscountItem(list)) {
96
+ return syncManualProductDiscountProductNum(list, quantity);
97
+ }
98
+ var metadata = params.metadata || {};
99
+ var originalNum = Number(params.originalPrice);
100
+ var sellingNum = Number(params.sellingPrice);
101
+ var hasPriceOverride = hasManualProductDiscountFlag(metadata);
102
+ var shouldBuild = shouldBuildManualProductDiscount({
103
+ hasPriceOverride: hasPriceOverride,
104
+ originTotal: originalNum,
105
+ sellingTotal: sellingNum
106
+ });
107
+ if (!shouldBuild) {
108
+ return list;
109
+ }
110
+ if (!Number.isFinite(originalNum) || !Number.isFinite(sellingNum) || originalNum === sellingNum) {
111
+ return list;
112
+ }
113
+ var message = resolveManualDiscountMessage(list, resolveManualDiscountReasonFromSources({
114
+ extendDiscountReason: (_metadata$origin = metadata.origin) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin._extend) === null || _metadata$origin === void 0 ? void 0 : _metadata$origin.discount_reason,
115
+ originExtendDiscountReason: (_metadata$origin2 = metadata.origin) === null || _metadata$origin2 === void 0 || (_metadata$origin2 = _metadata$origin2._extend) === null || _metadata$origin2 === void 0 ? void 0 : _metadata$origin2.discount_reason
116
+ }));
117
+ return mergeManualProductDiscountIntoList(list, buildManualProductDiscountItem({
118
+ originTotal: originalNum,
119
+ sellingTotal: sellingNum,
120
+ quantity: quantity,
121
+ message: message,
122
+ discountway: (_metadata$origin3 = metadata.origin) === null || _metadata$origin3 === void 0 || (_metadata$origin3 = _metadata$origin3._extend) === null || _metadata$origin3 === void 0 ? void 0 : _metadata$origin3.discountway,
123
+ discount_per: (_metadata$origin4 = metadata.origin) === null || _metadata$origin4 === void 0 || (_metadata$origin4 = _metadata$origin4._extend) === null || _metadata$origin4 === void 0 ? void 0 : _metadata$origin4.discount_per
124
+ }));
125
+ }
126
+
127
+ /** 商品手动折扣 discount_list 项(checkout 协议,type = product) */
128
+
129
+ /**
130
+ * 从 discount_list 中取手动改价项(type = product)。
131
+ *
132
+ * @example
133
+ * const manual = findManualProductDiscountItem(product.discount_list);
134
+ * manual?.discount.message; // 折扣原因
135
+ */
136
+ export function findManualProductDiscountItem(discountList) {
137
+ return (discountList || []).find(function (item) {
138
+ return (item === null || item === void 0 ? void 0 : item.type) === 'product';
139
+ });
140
+ }
141
+
142
+ /**
143
+ * 解析折扣原因:优先 discount_list[type=product].discount.message。
144
+ *
145
+ * @example
146
+ * resolveManualDiscountMessage(line.discount_list, line.metadata?.legacy_reason);
147
+ */
148
+ export function resolveManualDiscountMessage(discountList, fallback) {
149
+ var _findManualProductDis;
150
+ var message = (_findManualProductDis = findManualProductDiscountItem(discountList)) === null || _findManualProductDis === void 0 || (_findManualProductDis = _findManualProductDis.discount) === null || _findManualProductDis === void 0 ? void 0 : _findManualProductDis.message;
151
+ if (message != null && String(message).trim() !== '') {
152
+ return String(message);
153
+ }
154
+ return fallback !== null && fallback !== void 0 ? fallback : '';
155
+ }
156
+
157
+ /** 去掉 discount_list 中已有的手动改价项,避免重复叠加 */
158
+ export function stripManualProductDiscountItems(discountList) {
159
+ return (discountList || []).filter(function (item) {
160
+ return (item === null || item === void 0 ? void 0 : item.type) !== 'product';
161
+ });
162
+ }
163
+
164
+ /**
165
+ * 由改价前后行总价构建手动折扣项;amount = |originTotal - sellingTotal|(行级差额)。
166
+ *
167
+ * @example
168
+ * buildManualProductDiscountItem({
169
+ * originTotal: 11,
170
+ * sellingTotal: 4,
171
+ * quantity: 1,
172
+ * message: 'VIP',
173
+ * });
174
+ */
175
+ export function buildManualProductDiscountItem(params) {
176
+ var _params$message, _params$discountway, _params$discount_per;
177
+ var origin = new Decimal(Number(params.originTotal) || 0);
178
+ var selling = new Decimal(Number(params.sellingTotal) || 0);
179
+ var diff = origin.minus(selling);
180
+ var quantity = resolveSafeProductNum(params.quantity);
181
+ return {
182
+ amount: diff.toDecimalPlaces(2).toNumber(),
183
+ type: 'product',
184
+ discount: {
185
+ message: (_params$message = params.message) !== null && _params$message !== void 0 ? _params$message : '',
186
+ discountway: (_params$discountway = params.discountway) !== null && _params$discountway !== void 0 ? _params$discountway : 'num',
187
+ product_num: quantity,
188
+ discount_per: (_params$discount_per = params.discount_per) !== null && _params$discount_per !== void 0 ? _params$discount_per : '',
189
+ discount_type: diff.isNegative() ? 'change_price' : 'discount'
190
+ }
191
+ };
192
+ }
193
+
194
+ /**
195
+ * 将手动改价项合并进 discount_list(替换已有 type=product 项)。
196
+ *
197
+ * @example
198
+ * mergeManualProductDiscountIntoList(coupons, manualItem);
199
+ */
200
+ export function mergeManualProductDiscountIntoList(discountList, manualItem) {
201
+ var base = stripManualProductDiscountItems(discountList);
202
+ if (!manualItem) return base;
203
+ if (manualItem.amount === 0 && !manualItem.discount.message) return base;
204
+ return [].concat(_toConsumableArray(base), [manualItem]);
205
+ }
206
+
207
+ /** 是否应写入手动改价 discount_list 项 */
208
+ export function shouldBuildManualProductDiscount(params) {
209
+ return Boolean(params.hasPriceOverride);
210
+ }
@@ -1,8 +1,19 @@
1
1
  import Decimal from 'decimal.js';
2
- import { CartItem } from "../Cart";
3
- import type { OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
2
+ import type { CartItem } from "../Cart";
3
+ import type { OrderProductDiscountItem, OrderProduct, OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
4
4
  import type { RulesParamsHooks } from '../Rules/types';
5
5
  import type { MapOrderPaymentsOptions, OrderPaymentData, OrderPaymentSource } from './types';
6
+ export interface OrderProductsDepositProtocol {
7
+ id: number;
8
+ title: string;
9
+ }
10
+ export interface OrderProductsDepositSummary {
11
+ total: number;
12
+ totalText: string;
13
+ protocols: OrderProductsDepositProtocol[];
14
+ deposit_policy_ids: number[];
15
+ hasDeposit: boolean;
16
+ }
6
17
  /**
7
18
  * 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
8
19
  *
@@ -21,21 +32,68 @@ export declare function composeLinePrice(params: {
21
32
  bundle?: Array<{
22
33
  bundle_selling_price?: any;
23
34
  price?: any;
35
+ custom_price?: any;
24
36
  num?: any;
25
37
  quantity?: any;
26
38
  original_price?: any;
27
39
  product_price?: any;
40
+ price_type?: any;
41
+ price_type_ext?: any;
42
+ custom_price_type?: any;
43
+ custom_price_type_ext?: any;
44
+ option?: Array<{
45
+ add_price?: any;
46
+ price?: any;
47
+ num?: any;
48
+ }>;
28
49
  }> | null;
29
50
  useOriginalBundle?: boolean;
30
51
  }): string;
52
+ export declare function normalizeProductSkuOptions(options?: unknown): Record<string, any>[];
53
+ export declare function ensureProductSku(product?: Record<string, any> | null): Record<string, any> & {
54
+ option: Record<string, any>[];
55
+ };
56
+ export declare function getProductSkuOptions(product?: Record<string, any> | null): Record<string, any>[];
31
57
  /**
32
- * 计算 option 单价合计:Σ(option.price × option.num)。
58
+ * 计算 option 单价合计:Σ(option.add_price × option.num)。
59
+ * 兼容入参仍带旧 `price` 的调用方,但运行时归一化后只维护 `add_price`。
33
60
  * 在新语义 v2 下,main_product_original_price = source_product_price + 本函数结果。
34
61
  */
35
62
  export declare function sumOptionUnitPrice(options?: Array<{
63
+ add_price?: any;
36
64
  price?: any;
37
65
  num?: any;
38
66
  }> | null): Decimal;
67
+ /**
68
+ * 仅基于 tempOrder.products 重算整单定金。
69
+ *
70
+ * 对齐 Checkout relation_products 分支:商品定金先按商品规则计算,
71
+ * 再扣减商品券/折扣卡抵扣金额;tempOrder.bookings 不参与这里的计算。
72
+ */
73
+ export declare function calculateOrderProductsDeposit(products?: OrderProduct[], options?: {
74
+ productsByUid?: Record<string, Record<string, any>>;
75
+ }): OrderProductsDepositSummary;
76
+ /**
77
+ * 判定套餐子商品是否为 markdown(减价)类型。
78
+ * 与后端口径一致:price_type='markdown' 且 price_type_ext 非 'product_price'(原价子商品)。
79
+ */
80
+ export declare function isMarkdownBundle(bundle: Record<string, any> | null | undefined): boolean;
81
+ /**
82
+ * 套餐子商品对「行价」的带符号单位贡献(与后端 markdown 口径对齐)。
83
+ *
84
+ * - markdown(减价):净额 = |catalog 毛价| − Σ(option.add_price×num),**取负**(行内减)。
85
+ * catalog 毛价优先 `price`/`custom_price`(避免读已落净额的 `bundle_selling_price` 造成 option 二次扣减);
86
+ * 仅当毛价缺失(历史/hydrate 仅剩净额)时退回 `bundle_selling_price`,且此时不再扣 option。
87
+ * - markup(加价)/原价子商品:维持 `+(bundle_selling_price ?? price)`,行为不变。
88
+ */
89
+ export declare function getBundleSignedUnit(bundle: Record<string, any> | null | undefined, options?: {
90
+ useOriginal?: boolean;
91
+ }): Decimal;
92
+ /**
93
+ * 套餐子商品 `bundle_selling_price` 的存储净额(正值幅度)。
94
+ * markdown 取净额绝对值(3.70);markup/原价维持原值。
95
+ */
96
+ export declare function getBundleSellingMagnitude(bundle: Record<string, any> | null | undefined): Decimal;
39
97
  /**
40
98
  * OrderModule 默认 Rules 钩子工厂。
41
99
  *
@@ -48,7 +106,7 @@ export declare function sumOptionUnitPrice(options?: Array<{
48
106
  * 不含折扣。**权威源**。
49
107
  * - `metadata.main_product_original_price` = source + Σ(option.price × option.num)(含 option、不含折扣)。
50
108
  * - `metadata.main_product_selling_price` = main_original − 主商品券 per-unit amount(含 option、含折扣)。
51
- * - `payment_price`:出站 payload 中由 `selling_price` 派生以兼容后端(composite)。
109
+ * - `payment_price`:出站 payload 中为行 composite 已减整单折扣均摊价(无折扣时与 `selling_price` 同义)。
52
110
  *
53
111
  * Rules 钩子契约(hook_adapt 方案,Rules 内部保持不变):
54
112
  * - `getProduct.price` / `getProduct.original_price` 回传 **source-level 主价**
@@ -65,6 +123,37 @@ export declare function sumOptionUnitPrice(options?: Array<{
65
123
  *
66
124
  * 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
67
125
  */
126
+ /** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
127
+ export declare function resolveRulesManualDiscountFlag(metadata: Record<string, any> | null | undefined): boolean | undefined;
128
+ /**
129
+ * 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
130
+ * Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
131
+ */
132
+ export declare function normalizeOrderProductDiscountList(discountList?: unknown[] | null): OrderProductDiscountItem[];
133
+ /**
134
+ * 手动改价(price_override)时行级 original_price(composite 单价):
135
+ * 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
136
+ * 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice(如 30)。
137
+ *
138
+ * origin_total 与 SkuDetailModal / cacheItem._extend 一致,为单价语义,不再除以 num。
139
+ */
140
+ export declare function resolveManualOverrideLineOriginalPrice(params: {
141
+ num?: number;
142
+ metadata?: Record<string, any> | null;
143
+ /** 已有行级 original_price(origin 被裁剪时兜底划线价) */
144
+ lineOriginalPrice?: string | number | null;
145
+ }, fallbackCompositeOriginal: string): string;
146
+ /**
147
+ * 计算商品行「每单位有效折扣」:discount_list 合计 + 被 Rules 剥离但仍 inPromotion 的差额。
148
+ *
149
+ * Rules.calcDiscount 会把 type=promotion 从 discount_list 去掉,但 metadata._promotion 仍保留;
150
+ * applyProductDiscountPrices 必须回读 _promotion,否则抬价/降价都会在第二步被 source 原价覆盖。
151
+ *
152
+ * @example
153
+ * resolveEffectivePerUnitDiscount({ metadata: { _promotion: { inPromotion: true, originalPrice: 1, finalPrice: 5 } }, discount_list: [] });
154
+ * // => -4
155
+ */
156
+ export declare function resolveEffectivePerUnitDiscount(product: Record<string, any>): number;
68
157
  export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
69
158
  /**
70
159
  * 通过 session 类商品的开始时间结束时间生成商品的时长
@@ -118,6 +207,8 @@ export declare function buildSubmitPayload(params: {
118
207
  businessCode?: string;
119
208
  channel?: string;
120
209
  type?: string;
210
+ summary?: OrderSummary | null;
211
+ request_unique_idempotency_token?: string;
121
212
  enhance?: SubmitPayloadEnhancer;
122
213
  }): OrderSubmitPayload;
123
214
  export declare function mapPaymentItemToOrderPayment(paymentItem: OrderPaymentSource): OrderPaymentData;
@@ -131,7 +222,7 @@ export declare function mapPaymentItemsToOrderPayments(paymentItems: OrderPaymen
131
222
  export declare function formatV1Product(products: OrderSubmitProduct[]): {
132
223
  bundle: any[];
133
224
  key: number | null;
134
- option: any;
225
+ option: any[];
135
226
  product_id: number | null;
136
227
  product_variant_id: number;
137
228
  num: number;
@@ -140,4 +231,55 @@ export declare function formatV1Product(products: OrderSubmitProduct[]): {
140
231
  session: null;
141
232
  unique: string;
142
233
  }[];
234
+ /**
235
+ * 判断 holder_id 是否已分配(非空)。
236
+ *
237
+ * @example
238
+ * hasAssignedHolderId(12); // true
239
+ * hasAssignedHolderId([]); // false
240
+ */
241
+ export declare function hasAssignedHolderId(value: unknown): boolean;
242
+ /**
243
+ * 清空 tempOrder 购物车行上的 holder 分配(products / bookings / runtime origin)。
244
+ * 移除或更换下单客户时调用,与 booking 页换客户清 holder 行为对齐。
245
+ *
246
+ * @example
247
+ * clearTempOrderHolderAssignments(tempOrder);
248
+ */
249
+ export declare function clearTempOrderHolderAssignments(tempOrder: OrderTempOrder): boolean;
250
+ /**
251
+ * 读取购物车行的 stable uid(优先 metadata.unique_identification_number)。
252
+ *
253
+ * @example
254
+ * getOrderProductLineUid({ metadata: { unique_identification_number: 'line-1' } }); // 'line-1'
255
+ */
256
+ export declare function getOrderProductLineUid(product: Record<string, any> | null | undefined): string | null;
257
+ /**
258
+ * 判断展示字段是否为空(含 i18n 对象全空)。
259
+ *
260
+ * @example
261
+ * isEmptyOrderProductDisplayValue(''); // true
262
+ * isEmptyOrderProductDisplayValue({ auto: '桌台费' }); // false
263
+ */
264
+ export declare function isEmptyOrderProductDisplayValue(value: unknown): boolean;
265
+ /**
266
+ * calcDiscount / applyDiscount 回写时 Rules 往往不带 product_title 等展示字段;
267
+ * 用旧行补齐,避免编辑态 hydrate 后标题被冲掉。
268
+ *
269
+ * @example
270
+ * mergeOrderProductDisplayFields(
271
+ * { product_title: { auto: '桌台费' }, metadata: { unique_identification_number: 'u1' } },
272
+ * { selling_price: '10.00', metadata: { unique_identification_number: 'u1' } },
273
+ * );
274
+ */
275
+ export declare function mergeOrderProductDisplayFields(previous: Record<string, any>, next: Record<string, any>): Record<string, any>;
276
+ /**
277
+ * 按 uid 索引 tempOrder.products,供 applyDiscount 合并展示字段。
278
+ *
279
+ * @example
280
+ * indexOrderProductsByUid([{ metadata: { unique_identification_number: 'u1' } }]);
281
+ */
282
+ export declare function indexOrderProductsByUid(products: Array<Record<string, any>> | null | undefined): Map<string, Record<string, any>>;
143
283
  export { createEmptySummary } from '../../solution/ScanOrder/utils';
284
+ export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems, } from './utils/manualProductDiscount';
285
+ export type { ManualProductDiscountItem } from './utils/manualProductDiscount';