@pisell/pisellos 2.1.119 → 2.1.121

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 (231) hide show
  1. package/dist/apis/picoding.d.ts +0 -0
  2. package/dist/apis/picoding.js +1 -0
  3. package/dist/model/index.d.ts +1 -0
  4. package/dist/model/index.js +1 -0
  5. package/dist/model/strategy/adapter/index.d.ts +7 -0
  6. package/dist/model/strategy/adapter/index.js +7 -0
  7. package/dist/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  8. package/dist/model/strategy/adapter/itemRule/adapter.js +439 -0
  9. package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  10. package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
  11. package/dist/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  12. package/dist/model/strategy/adapter/itemRule/examples.js +315 -0
  13. package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
  14. package/dist/model/strategy/adapter/itemRule/index.js +5 -0
  15. package/dist/model/strategy/adapter/itemRule/type.d.ts +206 -0
  16. package/dist/model/strategy/adapter/itemRule/type.js +101 -0
  17. package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  18. package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
  19. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  20. package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
  21. package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
  22. package/dist/model/strategy/adapter/promotion/examples.js +166 -0
  23. package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
  24. package/dist/model/strategy/adapter/promotion/index.js +0 -0
  25. package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
  26. package/dist/model/strategy/adapter/promotion/type.js +209 -0
  27. package/dist/model/strategy/adapter/type.d.ts +28 -0
  28. package/dist/model/strategy/adapter/type.js +1 -0
  29. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  30. package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
  31. package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
  32. package/dist/model/strategy/adapter/walletPass/example.js +258 -0
  33. package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
  34. package/dist/model/strategy/adapter/walletPass/index.js +182 -0
  35. package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  36. package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
  37. package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
  38. package/dist/model/strategy/adapter/walletPass/type.js +1 -0
  39. package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  40. package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
  41. package/dist/model/strategy/engine.d.ts +106 -0
  42. package/dist/model/strategy/engine.js +611 -0
  43. package/dist/model/strategy/index.d.ts +3 -0
  44. package/dist/model/strategy/index.js +8 -0
  45. package/dist/model/strategy/strategy-example.d.ts +5 -0
  46. package/dist/model/strategy/strategy-example.js +331 -0
  47. package/dist/model/strategy/type.d.ts +228 -0
  48. package/dist/model/strategy/type.js +94 -0
  49. package/dist/modules/Cart/utils/cartProduct.js +1 -0
  50. package/dist/modules/OpenData/index.d.ts +24 -0
  51. package/dist/modules/OpenData/index.js +173 -0
  52. package/dist/modules/OpenData/types.d.ts +73 -0
  53. package/dist/modules/OpenData/types.js +1 -0
  54. package/dist/modules/OpenData/utils.d.ts +2 -0
  55. package/dist/modules/OpenData/utils.js +75 -0
  56. package/dist/modules/Order/index.d.ts +58 -1
  57. package/dist/modules/Order/index.js +796 -29
  58. package/dist/modules/Order/types.d.ts +144 -12
  59. package/dist/modules/Order/utils.d.ts +28 -0
  60. package/dist/modules/Order/utils.js +250 -1
  61. package/dist/modules/Product/index.d.ts +1 -1
  62. package/dist/modules/Product/utils.js +2 -2
  63. package/dist/modules/ProductList/index.d.ts +1 -1
  64. package/dist/modules/ProductList/index.js +2 -1
  65. package/dist/modules/Quotation/index.d.ts +48 -0
  66. package/dist/modules/Quotation/index.js +245 -0
  67. package/dist/modules/Quotation/types.d.ts +42 -0
  68. package/dist/modules/Quotation/types.js +1 -0
  69. package/dist/modules/Rules/index.js +4 -1
  70. package/dist/modules/SalesSummary/index.d.ts +63 -0
  71. package/dist/modules/SalesSummary/index.js +174 -0
  72. package/dist/modules/SalesSummary/types.d.ts +59 -0
  73. package/dist/modules/SalesSummary/types.js +1 -0
  74. package/dist/modules/SalesSummary/utils.d.ts +30 -0
  75. package/dist/modules/SalesSummary/utils.js +513 -0
  76. package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
  77. package/dist/modules/ScanOrderLogger/index.js +161 -0
  78. package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  79. package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
  80. package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  81. package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
  82. package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
  83. package/dist/modules/ScanOrderLogger/types.js +1 -0
  84. package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
  85. package/dist/modules/Summary/utils.d.ts +3 -3
  86. package/dist/modules/Summary/utils.js +4 -4
  87. package/dist/modules/index.d.ts +4 -0
  88. package/dist/modules/index.js +5 -1
  89. package/dist/solution/BookingByStep/index.d.ts +1 -1
  90. package/dist/solution/BookingByStep/types.d.ts +3 -1
  91. package/dist/solution/BookingByStep/types.js +5 -1
  92. package/dist/solution/BookingTicket/index.d.ts +1 -1
  93. package/dist/solution/ScanOrder/index.d.ts +90 -0
  94. package/dist/solution/ScanOrder/index.js +1853 -0
  95. package/dist/solution/ScanOrder/types.d.ts +210 -0
  96. package/dist/solution/ScanOrder/types.js +16 -0
  97. package/dist/solution/ScanOrder/utils.d.ts +93 -0
  98. package/dist/solution/ScanOrder/utils.js +397 -0
  99. package/dist/solution/VenueBooking/index.d.ts +163 -0
  100. package/dist/solution/VenueBooking/index.js +2931 -0
  101. package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  102. package/dist/solution/VenueBooking/types.d.ts +130 -0
  103. package/dist/solution/VenueBooking/types.js +21 -0
  104. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  105. package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
  106. package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
  107. package/dist/solution/VenueBooking/utils/resource.js +94 -0
  108. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  109. package/dist/solution/VenueBooking/utils/slotMerge.js +203 -0
  110. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  111. package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
  112. package/dist/solution/VenueBooking/utils.d.ts +1 -0
  113. package/dist/solution/VenueBooking/utils.js +1 -0
  114. package/dist/solution/index.d.ts +2 -0
  115. package/dist/solution/index.js +3 -1
  116. package/lib/apis/picoding.d.ts +0 -0
  117. package/lib/apis/picoding.js +0 -0
  118. package/lib/model/index.d.ts +1 -0
  119. package/lib/model/index.js +23 -0
  120. package/lib/model/strategy/adapter/index.d.ts +7 -0
  121. package/lib/model/strategy/adapter/index.js +57 -0
  122. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  123. package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
  124. package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  125. package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
  126. package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  127. package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
  128. package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
  129. package/lib/model/strategy/adapter/itemRule/index.js +58 -0
  130. package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
  131. package/lib/model/strategy/adapter/itemRule/type.js +46 -0
  132. package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  133. package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
  134. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  135. package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
  136. package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
  137. package/lib/model/strategy/adapter/promotion/examples.js +192 -0
  138. package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
  139. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  140. package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
  141. package/lib/model/strategy/adapter/promotion/type.js +51 -0
  142. package/lib/model/strategy/adapter/type.d.ts +28 -0
  143. package/lib/model/strategy/adapter/type.js +17 -0
  144. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  145. package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
  146. package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
  147. package/lib/model/strategy/adapter/walletPass/example.js +207 -0
  148. package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
  149. package/lib/model/strategy/adapter/walletPass/index.js +142 -0
  150. package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  151. package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
  152. package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
  153. package/lib/model/strategy/adapter/walletPass/type.js +17 -0
  154. package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  155. package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
  156. package/lib/model/strategy/engine.d.ts +106 -0
  157. package/lib/model/strategy/engine.js +450 -0
  158. package/lib/model/strategy/index.d.ts +3 -0
  159. package/lib/model/strategy/index.js +38 -0
  160. package/lib/model/strategy/strategy-example.d.ts +5 -0
  161. package/lib/model/strategy/strategy-example.js +318 -0
  162. package/lib/model/strategy/type.d.ts +228 -0
  163. package/lib/model/strategy/type.js +44 -0
  164. package/lib/modules/Cart/utils/cartProduct.js +1 -0
  165. package/lib/modules/OpenData/index.d.ts +24 -0
  166. package/lib/modules/OpenData/index.js +119 -0
  167. package/lib/modules/OpenData/types.d.ts +73 -0
  168. package/lib/modules/OpenData/types.js +17 -0
  169. package/lib/modules/OpenData/utils.d.ts +2 -0
  170. package/lib/modules/OpenData/utils.js +111 -0
  171. package/lib/modules/Order/index.d.ts +58 -1
  172. package/lib/modules/Order/index.js +437 -1
  173. package/lib/modules/Order/types.d.ts +144 -12
  174. package/lib/modules/Order/utils.d.ts +28 -0
  175. package/lib/modules/Order/utils.js +250 -2
  176. package/lib/modules/Product/index.d.ts +1 -1
  177. package/lib/modules/Product/utils.js +2 -2
  178. package/lib/modules/ProductList/index.d.ts +1 -1
  179. package/lib/modules/ProductList/index.js +2 -1
  180. package/lib/modules/Quotation/index.d.ts +48 -0
  181. package/lib/modules/Quotation/index.js +149 -0
  182. package/lib/modules/Quotation/types.d.ts +42 -0
  183. package/lib/modules/Quotation/types.js +17 -0
  184. package/lib/modules/Rules/index.js +4 -1
  185. package/lib/modules/SalesSummary/index.d.ts +63 -0
  186. package/lib/modules/SalesSummary/index.js +105 -0
  187. package/lib/modules/SalesSummary/types.d.ts +59 -0
  188. package/lib/modules/SalesSummary/types.js +17 -0
  189. package/lib/modules/SalesSummary/utils.d.ts +30 -0
  190. package/lib/modules/SalesSummary/utils.js +452 -0
  191. package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
  192. package/lib/modules/ScanOrderLogger/index.js +135 -0
  193. package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  194. package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
  195. package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  196. package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
  197. package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
  198. package/lib/modules/ScanOrderLogger/types.js +17 -0
  199. package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
  200. package/lib/modules/Summary/utils.d.ts +3 -3
  201. package/lib/modules/Summary/utils.js +4 -4
  202. package/lib/modules/index.d.ts +4 -0
  203. package/lib/modules/index.js +9 -1
  204. package/lib/solution/BookingByStep/index.d.ts +1 -1
  205. package/lib/solution/BookingByStep/types.d.ts +3 -1
  206. package/lib/solution/BookingByStep/types.js +10 -0
  207. package/lib/solution/BookingTicket/index.d.ts +1 -1
  208. package/lib/solution/ScanOrder/index.d.ts +90 -0
  209. package/lib/solution/ScanOrder/index.js +1071 -0
  210. package/lib/solution/ScanOrder/types.d.ts +210 -0
  211. package/lib/solution/ScanOrder/types.js +36 -0
  212. package/lib/solution/ScanOrder/utils.d.ts +93 -0
  213. package/lib/solution/ScanOrder/utils.js +359 -0
  214. package/lib/solution/VenueBooking/index.d.ts +163 -0
  215. package/lib/solution/VenueBooking/index.js +1578 -0
  216. package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  217. package/lib/solution/VenueBooking/types.d.ts +130 -0
  218. package/lib/solution/VenueBooking/types.js +44 -0
  219. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  220. package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
  221. package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
  222. package/lib/solution/VenueBooking/utils/resource.js +80 -0
  223. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  224. package/lib/solution/VenueBooking/utils/slotMerge.js +208 -0
  225. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  226. package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
  227. package/lib/solution/VenueBooking/utils.d.ts +1 -0
  228. package/lib/solution/VenueBooking/utils.js +69 -0
  229. package/lib/solution/index.d.ts +2 -0
  230. package/lib/solution/index.js +5 -1
  231. package/package.json +1 -1
@@ -36,17 +36,54 @@ var import_BaseModule = require("../BaseModule");
36
36
  var import_utils = require("./utils");
37
37
  var import_utils2 = require("../Product/utils");
38
38
  var import_dayjs = __toESM(require("dayjs"));
39
+ var import_utils3 = require("../../solution/ScanOrder/utils");
40
+ var import_Discount = require("../Discount");
41
+ var import_Rules = require("../Rules");
42
+ var import_types = require("../Rules/types");
43
+ var import_decimal = __toESM(require("decimal.js"));
39
44
  var OrderModule = class extends import_BaseModule.BaseModule {
40
- // LoggerManager 实例
41
45
  constructor(name, version) {
42
46
  super(name || "order", version);
43
47
  this.defaultName = "order";
44
48
  this.defaultVersion = "1.0.0";
45
49
  }
50
+ /**
51
+ * Populate `savedAmount` on each discount based on product-level discount details.
52
+ * Only selected discounts get a non-zero value.
53
+ */
54
+ static populateSavedAmounts(productList, discountList) {
55
+ var _a, _b;
56
+ const savedMap = /* @__PURE__ */ new Map();
57
+ for (const product of productList) {
58
+ const qty = product.num || 1;
59
+ for (const pd of product.discount_list || []) {
60
+ const discountKey = ((_a = pd.discount) == null ? void 0 : _a.resource_id) || pd.id;
61
+ if (discountKey == null)
62
+ continue;
63
+ const amount = new import_decimal.default(pd.amount || 0).times(qty).plus(((_b = pd.metadata) == null ? void 0 : _b.product_discount_difference) || 0);
64
+ savedMap.set(discountKey, (savedMap.get(discountKey) || new import_decimal.default(0)).plus(amount));
65
+ }
66
+ }
67
+ for (const d of discountList) {
68
+ const key = d.id;
69
+ d.savedAmount = d.isSelected && key != null && savedMap.has(key) ? savedMap.get(key).toNumber() : 0;
70
+ }
71
+ }
46
72
  async initialize(core, options) {
73
+ var _a;
47
74
  this.core = core;
48
75
  this.store = options.store;
76
+ if (!this.store.tempOrder) {
77
+ this.store.tempOrder = null;
78
+ }
49
79
  this.request = this.core.getPlugin("request");
80
+ this.window = this.core.getPlugin("window");
81
+ const otherParams = options.otherParams || {};
82
+ this.cacheId = otherParams.cacheId;
83
+ this.salesSummaryModuleName = otherParams.salesSummaryModuleName;
84
+ this.rulesHooksOverride = (_a = otherParams.rules) == null ? void 0 : _a.hooks;
85
+ this.registerDiscountModules(options);
86
+ this.restoreTempOrderFromStorage();
50
87
  const appPlugin = this.core.getPlugin("app");
51
88
  if (!appPlugin) {
52
89
  throw new Error("Order 模块需要 app 插件支持");
@@ -91,6 +128,391 @@ var OrderModule = class extends import_BaseModule.BaseModule {
91
128
  });
92
129
  }
93
130
  }
131
+ // ─── Discount: 子模块注册 ───
132
+ registerDiscountModules(options) {
133
+ let targetCacheData = {};
134
+ if (this.cacheId && this.window) {
135
+ const sessionData = this.window.sessionStorage.getItem(this.name);
136
+ if (sessionData) {
137
+ try {
138
+ const data = JSON.parse(sessionData);
139
+ targetCacheData = (data == null ? void 0 : data[this.cacheId]) || {};
140
+ } catch {
141
+ }
142
+ }
143
+ }
144
+ const discount = new import_Discount.DiscountModule(`${this.name}_discount`);
145
+ this.core.registerModule(discount, {
146
+ initialState: targetCacheData == null ? void 0 : targetCacheData[discount.name],
147
+ otherParams: {
148
+ fatherModule: this.name,
149
+ openCache: !!this.cacheId,
150
+ cacheId: this.cacheId
151
+ }
152
+ });
153
+ this.store.discount = discount;
154
+ const rules = new import_Rules.RulesModule(`${this.name}_rules`);
155
+ this.core.registerModule(rules, {
156
+ hooks: this.rulesHooksOverride || this.createDefaultRulesHooks()
157
+ });
158
+ this.store.rules = rules;
159
+ }
160
+ createDefaultRulesHooks() {
161
+ return {
162
+ getProduct: (product) => {
163
+ var _a, _b, _c, _d;
164
+ return {
165
+ id: product.product_id,
166
+ _id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
167
+ price: product.selling_price,
168
+ total: new import_decimal.default(product.payment_price || product.selling_price || 0).times(product.num || 1).toNumber(),
169
+ origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
170
+ original_price: product.original_price,
171
+ quantity: product.num || 1,
172
+ num: product.num || 1,
173
+ discount_list: product.discount_list || [],
174
+ bundle: product.product_bundle || [],
175
+ booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
176
+ isClient: false,
177
+ isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
178
+ holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
179
+ startDate: (_d = product._origin) == null ? void 0 : _d.startDate
180
+ };
181
+ },
182
+ setProduct: (product, values) => ({
183
+ ...product,
184
+ selling_price: values.price !== void 0 ? String(values.price) : product.selling_price,
185
+ payment_price: values.total !== void 0 ? String(values.total) : product.payment_price,
186
+ original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
187
+ discount_list: values.discount_list ?? product.discount_list,
188
+ num: values.quantity ?? product.num,
189
+ product_bundle: values.bundle ?? product.product_bundle,
190
+ metadata: {
191
+ ...product.metadata || {},
192
+ ...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
193
+ }
194
+ })
195
+ };
196
+ }
197
+ // ─── Discount: 公共 API ───
198
+ async loadDiscountConfig(params) {
199
+ var _a, _b, _c, _d;
200
+ const discountList = await ((_a = this.store.discount) == null ? void 0 : _a.loadPrepareConfig({
201
+ customer_id: params.customerId,
202
+ action: params.action || "create",
203
+ with_good_pass: 1,
204
+ with_discount_card: 1,
205
+ with_wallet_pass_holder: 1,
206
+ request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
207
+ }));
208
+ if (discountList) {
209
+ (_b = this.store.discount) == null ? void 0 : _b.setDiscountList(discountList);
210
+ }
211
+ if ((_d = (_c = this.store.tempOrder) == null ? void 0 : _c.products) == null ? void 0 : _d.length) {
212
+ this.applyDiscount();
213
+ }
214
+ }
215
+ getDiscountList() {
216
+ var _a;
217
+ return ((_a = this.store.discount) == null ? void 0 : _a.getDiscountList()) || [];
218
+ }
219
+ async scanCode(code, customerId) {
220
+ var _a, _b, _c, _d;
221
+ const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, customerId)) || [];
222
+ const rulesModule = this.store.rules;
223
+ if (!rulesModule) {
224
+ return {
225
+ type: "clientCalc",
226
+ isAvailable: false,
227
+ discountList: this.getDiscountList(),
228
+ unavailableReason: import_types.UnavailableReason.Unknown
229
+ };
230
+ }
231
+ if (!resultDiscountList.length) {
232
+ return {
233
+ type: "server",
234
+ isAvailable: false,
235
+ discountList: this.getDiscountList()
236
+ };
237
+ }
238
+ const withScanList = resultDiscountList.map((item) => ({ ...item, isScan: true }));
239
+ const currentSelected = this.getDiscountList().filter((n) => n.isSelected);
240
+ if (currentSelected.length && currentSelected.some((n) => withScanList.some((m) => m.id === n.id))) {
241
+ return {
242
+ type: "clientCalc",
243
+ isAvailable: true,
244
+ discountList: this.getDiscountList()
245
+ };
246
+ }
247
+ const tempOrder = this.store.tempOrder;
248
+ const holders = ((_b = tempOrder == null ? void 0 : tempOrder.holder) == null ? void 0 : _b.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
249
+ const { isAvailable, discountList: newDiscountList, unavailableReason } = rulesModule.isDiscountListAvailable({
250
+ productList: (tempOrder == null ? void 0 : tempOrder.products) || [],
251
+ oldDiscountList: this.getDiscountList(),
252
+ newDiscountList: withScanList,
253
+ holders,
254
+ isFormSubject: !!((_c = tempOrder == null ? void 0 : tempOrder.holder) == null ? void 0 : _c.type) && tempOrder.holder.type === "form"
255
+ }) || { isAvailable: false, discountList: this.getDiscountList() };
256
+ if (isAvailable && newDiscountList) {
257
+ (_d = this.store.discount) == null ? void 0 : _d.setDiscountList(newDiscountList);
258
+ this.applyDiscount();
259
+ }
260
+ return {
261
+ type: "clientCalc",
262
+ isAvailable: isAvailable || false,
263
+ discountList: newDiscountList || this.getDiscountList(),
264
+ unavailableReason
265
+ };
266
+ }
267
+ applyDiscount() {
268
+ var _a, _b, _c, _d, _e;
269
+ const tempOrder = this.store.tempOrder;
270
+ if (!((_a = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _a.length))
271
+ return;
272
+ const rulesModule = this.store.rules;
273
+ if (!rulesModule)
274
+ return;
275
+ const discountList = ((_b = this.store.discount) == null ? void 0 : _b.getDiscountList()) || [];
276
+ const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
277
+ const result = rulesModule.calcDiscount({
278
+ productList: tempOrder.products,
279
+ discountList,
280
+ holders,
281
+ isFormSubject: !!((_d = tempOrder.holder) == null ? void 0 : _d.type) && tempOrder.holder.type === "form"
282
+ });
283
+ if (result == null ? void 0 : result.productList) {
284
+ tempOrder.products = result.productList;
285
+ }
286
+ if (result == null ? void 0 : result.discountList) {
287
+ OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
288
+ (_e = this.store.discount) == null ? void 0 : _e.setDiscountList(result.discountList);
289
+ tempOrder.discount_list = result.discountList.filter((d) => d.isSelected);
290
+ }
291
+ }
292
+ // ─── TempOrder: 初始化入口 ───
293
+ initTempOrder(params) {
294
+ if (params.cacheId !== void 0)
295
+ this.cacheId = params.cacheId;
296
+ if (params.salesSummaryModuleName !== void 0)
297
+ this.salesSummaryModuleName = params.salesSummaryModuleName;
298
+ this.restoreTempOrderFromStorage();
299
+ }
300
+ // ─── TempOrder: localStorage 持久化 ───
301
+ getTempOrderStorageKey() {
302
+ if (!this.cacheId)
303
+ return null;
304
+ return `scanOrder:tempOrder:${this.cacheId}`;
305
+ }
306
+ restoreTempOrderFromStorage() {
307
+ var _a, _b;
308
+ const key = this.getTempOrderStorageKey();
309
+ if (!key)
310
+ return;
311
+ if (!this.window)
312
+ return;
313
+ const cachedData = this.window.localStorage.getItem(key);
314
+ if (!cachedData)
315
+ return;
316
+ try {
317
+ const parsedData = JSON.parse(cachedData);
318
+ if (!(0, import_utils.isTempOrder)(parsedData)) {
319
+ this.window.localStorage.removeItem(key);
320
+ return;
321
+ }
322
+ this.store.tempOrder = parsedData;
323
+ } catch {
324
+ (_b = (_a = this.window) == null ? void 0 : _a.localStorage) == null ? void 0 : _b.removeItem(key);
325
+ }
326
+ }
327
+ persistTempOrder() {
328
+ const key = this.getTempOrderStorageKey();
329
+ if (!key || !this.store.tempOrder)
330
+ return;
331
+ if (!this.window)
332
+ return;
333
+ this.window.localStorage.setItem(key, JSON.stringify(this.store.tempOrder));
334
+ }
335
+ // ─── TempOrder: 创建 & 获取 ───
336
+ createDefaultTempOrderInstance() {
337
+ return (0, import_utils.createDefaultTempOrder)({
338
+ now: (0, import_utils.formatDateTime)(/* @__PURE__ */ new Date()),
339
+ summary: (0, import_utils.createEmptySummary)()
340
+ });
341
+ }
342
+ ensureTempOrder() {
343
+ if (this.store.tempOrder)
344
+ return this.store.tempOrder;
345
+ const newOrder = this.createDefaultTempOrderInstance();
346
+ this.store.tempOrder = newOrder;
347
+ this.persistTempOrder();
348
+ return newOrder;
349
+ }
350
+ getTempOrder() {
351
+ return this.store.tempOrder;
352
+ }
353
+ async addNewOrder() {
354
+ const tempOrder = this.ensureTempOrder();
355
+ await this.recalculateSummary({ createIfMissing: true });
356
+ this.persistTempOrder();
357
+ return tempOrder;
358
+ }
359
+ getOrderProducts() {
360
+ const tempOrder = this.ensureTempOrder();
361
+ return tempOrder.products;
362
+ }
363
+ // ─── TempOrder: 金额汇总 ───
364
+ getSalesSummary() {
365
+ if (!this.salesSummaryModuleName)
366
+ return null;
367
+ return this.core.getModule(this.salesSummaryModuleName);
368
+ }
369
+ async recalculateSummary(options) {
370
+ const tempOrder = (options == null ? void 0 : options.createIfMissing) ? this.ensureTempOrder() : this.store.tempOrder;
371
+ if (!tempOrder)
372
+ return null;
373
+ const salesSummary = this.getSalesSummary();
374
+ if (!salesSummary) {
375
+ tempOrder.summary = (0, import_utils.createEmptySummary)();
376
+ tempOrder.surcharge_fee = tempOrder.summary.surcharge_fee;
377
+ return tempOrder.summary;
378
+ }
379
+ const summary = await salesSummary.getSummary({
380
+ products: tempOrder.products
381
+ });
382
+ tempOrder.summary = summary;
383
+ if (summary.is_price_include_tax !== void 0) {
384
+ tempOrder.is_price_include_tax = summary.is_price_include_tax;
385
+ }
386
+ if (typeof summary.tax_title === "string") {
387
+ tempOrder.tax_title = summary.tax_title;
388
+ }
389
+ tempOrder.surcharge_fee = summary.surcharge_fee;
390
+ tempOrder.surcharges = summary.surcharges || [];
391
+ tempOrder.deposit_amount = summary.deposit_amount || "0.00";
392
+ tempOrder.is_deposit = summary.deposit_amount !== "0.00" ? 1 : 0;
393
+ tempOrder.shop_discount = summary.discount_amount || "0.00";
394
+ return tempOrder.summary;
395
+ }
396
+ async getScanOrderSummary() {
397
+ const summary = await this.recalculateSummary({ createIfMissing: true });
398
+ if (!summary)
399
+ return (0, import_utils.createEmptySummary)();
400
+ this.persistTempOrder();
401
+ return summary;
402
+ }
403
+ // ─── TempOrder: 备注 ───
404
+ updateTempOrderNote(note) {
405
+ const tempOrder = this.ensureTempOrder();
406
+ tempOrder.note = String(note || "");
407
+ this.persistTempOrder();
408
+ return tempOrder.note;
409
+ }
410
+ updateTempOrderContactsInfo(contactsInfo) {
411
+ const tempOrder = this.ensureTempOrder();
412
+ tempOrder.contacts_info = Array.isArray(contactsInfo) ? contactsInfo : [];
413
+ this.persistTempOrder();
414
+ return tempOrder.contacts_info;
415
+ }
416
+ // ─── TempOrder: 商品 CRUD ───
417
+ async addProductToOrder(product) {
418
+ const tempOrder = this.ensureTempOrder();
419
+ const normalizedProduct = (0, import_utils3.normalizeOrderProduct)(product);
420
+ const productIndex = (0, import_utils3.getProductIdentityIndex)(
421
+ tempOrder.products,
422
+ normalizedProduct
423
+ );
424
+ if (productIndex === -1) {
425
+ tempOrder.products.push(normalizedProduct);
426
+ } else {
427
+ const targetProduct = tempOrder.products[productIndex];
428
+ tempOrder.products[productIndex] = {
429
+ ...targetProduct,
430
+ ...normalizedProduct,
431
+ num: (0, import_utils3.getSafeProductNum)(targetProduct.num + normalizedProduct.num),
432
+ _origin: normalizedProduct._origin || targetProduct._origin
433
+ };
434
+ }
435
+ this.applyDiscount();
436
+ await this.recalculateSummary({ createIfMissing: true });
437
+ this.persistTempOrder();
438
+ return tempOrder.products;
439
+ }
440
+ async updateProductInOrder(params) {
441
+ const { product_id, product_variant_id, updates } = params;
442
+ const tempOrder = this.ensureTempOrder();
443
+ const productIndex = (0, import_utils3.getProductIdentityIndex)(tempOrder.products, {
444
+ product_id,
445
+ product_variant_id
446
+ });
447
+ if (productIndex === -1) {
448
+ throw new Error("[Order] 目标商品不存在,无法更新");
449
+ }
450
+ const targetProduct = tempOrder.products[productIndex];
451
+ const nextProduct = {
452
+ ...targetProduct,
453
+ ...updates,
454
+ product_id,
455
+ product_variant_id
456
+ };
457
+ nextProduct.num = (0, import_utils3.getSafeProductNum)(nextProduct.num);
458
+ tempOrder.products[productIndex] = nextProduct;
459
+ this.applyDiscount();
460
+ await this.recalculateSummary({ createIfMissing: true });
461
+ this.persistTempOrder();
462
+ return tempOrder.products;
463
+ }
464
+ async removeProductFromOrder(identity) {
465
+ const tempOrder = this.ensureTempOrder();
466
+ const beforeProducts = tempOrder.products;
467
+ tempOrder.products = tempOrder.products.filter(
468
+ (item) => !(0, import_utils3.isIdentityMatch)(item, identity)
469
+ );
470
+ const removedByStrictIdentity = beforeProducts.length - tempOrder.products.length;
471
+ if (removedByStrictIdentity === 0 && identity.identity_key) {
472
+ tempOrder.products = tempOrder.products.filter((item) => {
473
+ const isSameProduct = String(item.product_id) === String(identity.product_id) && String(item.product_variant_id) === String(identity.product_variant_id);
474
+ const hasNoIdentityKey = !item.identity_key;
475
+ return !(isSameProduct && hasNoIdentityKey);
476
+ });
477
+ }
478
+ this.applyDiscount();
479
+ await this.recalculateSummary({ createIfMissing: true });
480
+ this.persistTempOrder();
481
+ return tempOrder.products;
482
+ }
483
+ // ─── TempOrder: 提交 ───
484
+ async submitTempOrder(params) {
485
+ const tempOrder = this.ensureTempOrder();
486
+ this.persistTempOrder();
487
+ const effectiveCacheId = (params == null ? void 0 : params.cacheId) ?? this.cacheId;
488
+ const payload = (0, import_utils.buildSubmitPayload)({
489
+ tempOrder,
490
+ cacheId: effectiveCacheId
491
+ });
492
+ let result;
493
+ if (tempOrder.order_id) {
494
+ const products = (0, import_utils.formatV1Product)(payload.products);
495
+ const moreResult = await this.scanOrderMore({
496
+ query: {
497
+ order_id: tempOrder.order_id,
498
+ products,
499
+ request_unique_idempotency_token: payload.request_unique_idempotency_token
500
+ }
501
+ });
502
+ if (moreResult.code === 200) {
503
+ result = {
504
+ data: {
505
+ order_id: tempOrder.order_id
506
+ }
507
+ };
508
+ }
509
+ } else {
510
+ result = await this.submitScanOrder({
511
+ query: payload
512
+ });
513
+ }
514
+ return result;
515
+ }
94
516
  createOrder(params) {
95
517
  var _a;
96
518
  const order = {
@@ -292,6 +714,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
292
714
  throw error;
293
715
  }
294
716
  }
717
+ async submitScanOrder(params) {
718
+ const { url, query } = params;
719
+ const fetchUrl = url || "/order/sales/checkout";
720
+ return this.request.post(fetchUrl, query);
721
+ }
722
+ async scanOrderMore(params) {
723
+ const { url, query } = params;
724
+ const fetchUrl = url || `/order/order/product/${query.order_id}`;
725
+ const requestBody = {
726
+ products: query.products,
727
+ request_unique_idempotency_token: query.request_unique_idempotency_token
728
+ };
729
+ return this.request.put(fetchUrl, requestBody);
730
+ }
295
731
  };
296
732
  // Annotate the CommonJS export names for ESM import in node:
297
733
  0 && (module.exports = {
@@ -1,4 +1,8 @@
1
1
  import { CartItem } from '../Cart/types';
2
+ import type { ScanOrderTempOrder, ScanOrderOrderProduct, ScanOrderOrderProductIdentity, ScanOrderSummary } from '../../solution/ScanOrder/types';
3
+ import type { DiscountModule } from '../Discount';
4
+ import type { RulesModule } from '../Rules';
5
+ import type { Discount } from '../Discount/types';
2
6
  export declare enum OrderHooks {
3
7
  OnOrderCreate = "order:onOrderCreate",
4
8
  OnOrderUpdate = "order:onOrderUpdate",
@@ -6,6 +10,10 @@ export declare enum OrderHooks {
6
10
  OnOrderStatusChange = "order:onOrderStatusChange"
7
11
  }
8
12
  export interface OrderState {
13
+ tempOrder: ScanOrderTempOrder | null;
14
+ discountList: any[];
15
+ discount: DiscountModule | null;
16
+ rules: RulesModule | null;
9
17
  }
10
18
  /**
11
19
  * 订单信息
@@ -20,6 +28,109 @@ export interface CommitOrderParams {
20
28
  business_code?: string;
21
29
  };
22
30
  }
31
+ export interface SubmitScanOrderProduct {
32
+ order_detail_id: number | null;
33
+ product_id: number | null;
34
+ num: number;
35
+ product_variant_id: number;
36
+ product_option_item: any[];
37
+ selling_price: string;
38
+ original_price: string;
39
+ payment_price: string;
40
+ tax_fee: string;
41
+ is_charge_tax: number;
42
+ discount_list: any[];
43
+ product_bundle: any[];
44
+ metadata: Record<string, any>;
45
+ }
46
+ export interface SubmitScanOrderSummary {
47
+ product_quantity: number;
48
+ product_original_amount: string;
49
+ product_amount: string;
50
+ product_expect_amount: string;
51
+ product_tax_fee: string;
52
+ shipping_fee: string;
53
+ shipping_tax_fee: string;
54
+ tax_fee: string;
55
+ surcharge_fee: string;
56
+ discount_amount: string;
57
+ deposit_amount: string;
58
+ expect_amount: string;
59
+ total_amount: string;
60
+ amount_gap: string;
61
+ rounding_amount: string;
62
+ pay_service_charge_amount: string;
63
+ }
64
+ export interface SubmitScanOrderBooking {
65
+ relation_id?: string;
66
+ form_id?: string;
67
+ collect_pax?: number;
68
+ start_time?: string;
69
+ end_time?: string;
70
+ metadata?: Record<string, any>;
71
+ }
72
+ export interface SubmitScanOrderFormRecord {
73
+ form_id: number | string;
74
+ form_record_ids: Array<number | string>;
75
+ }
76
+ export interface SubmitScanOrderParams {
77
+ url?: string;
78
+ query: {
79
+ order_id: number | null;
80
+ relation_id?: string;
81
+ table_form_id?: string;
82
+ resource_id?: string;
83
+ order_number: string;
84
+ shop_order_number: string;
85
+ type: string;
86
+ business_code: string;
87
+ platform: 'H5' | 'PC';
88
+ request_unique_idempotency_token?: string;
89
+ sales_channel: string;
90
+ order_sales_channel: string;
91
+ status: string;
92
+ payment_status: string;
93
+ shipping_status: string;
94
+ customer_id: number | null;
95
+ customer_name: string;
96
+ country_calling_code: string;
97
+ phone: string;
98
+ email: string;
99
+ is_price_include_tax: number;
100
+ tax_title: string;
101
+ tax_country_code: string;
102
+ currency_code: string;
103
+ currency_symbol: string;
104
+ currency_format: string;
105
+ is_deposit: number;
106
+ deposit_amount: string;
107
+ shop_discount: string;
108
+ surcharge_fee: string;
109
+ note: string;
110
+ schedule_date: string;
111
+ created_at?: string;
112
+ products: SubmitScanOrderProduct[];
113
+ bookings: SubmitScanOrderBooking[];
114
+ payments: any[];
115
+ surcharges?: any[];
116
+ discount_list: any[];
117
+ relation_forms: any[];
118
+ form_record_ids?: SubmitScanOrderFormRecord[];
119
+ contacts: any[];
120
+ contacts_info: any[];
121
+ holder: Record<string, any> | null;
122
+ summary?: SubmitScanOrderSummary;
123
+ metadata: Record<string, any>;
124
+ };
125
+ }
126
+ export interface ScanOrderMoreParams {
127
+ url?: string;
128
+ query: {
129
+ order_id: number | string;
130
+ products: SubmitScanOrderProduct[];
131
+ request_unique_idempotency_token?: string;
132
+ };
133
+ }
23
134
  /**
24
135
  * 支付项数据
25
136
  */
@@ -63,23 +174,11 @@ export interface CheckoutOrderParams {
63
174
  * 订单模块 API
64
175
  */
65
176
  export interface OrderModuleAPI {
66
- /**
67
- * 创建订单
68
- * @param params 订单信息
69
- * @returns 订单信息
70
- */
71
177
  createOrder: (params: CommitOrderParams['query']) => any;
72
- /**
73
- * 检查购物车提交订单前是否符合条件
74
- */
75
178
  checkBeforeSubmitOrder: (params: {
76
179
  cartItems: CartItem[];
77
180
  type: 'holder' | 'account';
78
181
  }) => boolean;
79
- /**
80
- * 提交订单
81
- * @param params 订单信息
82
- */
83
182
  submitOrder: (params: CommitOrderParams) => Promise<void>;
84
183
  /**
85
184
  * Checkout 专用:创建订单到后端
@@ -87,4 +186,37 @@ export interface OrderModuleAPI {
87
186
  * @returns 后端返回的订单数据
88
187
  */
89
188
  createOrderByCheckout: (params: CheckoutOrderParams) => Promise<any>;
189
+ submitScanOrder: <T = any>(params: SubmitScanOrderParams) => Promise<T>;
190
+ scanOrderMore: <T = any>(params: ScanOrderMoreParams) => Promise<T>;
191
+ initTempOrder: (params: {
192
+ cacheId?: string;
193
+ salesSummaryModuleName?: string;
194
+ }) => void;
195
+ getTempOrder: () => ScanOrderTempOrder | null;
196
+ ensureTempOrder: () => ScanOrderTempOrder;
197
+ addNewOrder: () => Promise<ScanOrderTempOrder>;
198
+ getOrderProducts: () => ScanOrderOrderProduct[];
199
+ getScanOrderSummary: () => Promise<ScanOrderSummary>;
200
+ recalculateSummary: (options?: {
201
+ createIfMissing?: boolean;
202
+ }) => Promise<ScanOrderSummary | null>;
203
+ updateTempOrderNote: (note: string) => string;
204
+ updateTempOrderContactsInfo: (contactsInfo: any[]) => any[];
205
+ addProductToOrder: (product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity) => Promise<ScanOrderOrderProduct[]>;
206
+ updateProductInOrder: (params: {
207
+ product_id: number | null;
208
+ product_variant_id: number;
209
+ updates: Partial<ScanOrderOrderProduct>;
210
+ }) => Promise<ScanOrderOrderProduct[]>;
211
+ removeProductFromOrder: (identity: ScanOrderOrderProductIdentity) => Promise<ScanOrderOrderProduct[]>;
212
+ persistTempOrder: () => void;
213
+ submitTempOrder: <T = any>(params?: {
214
+ cacheId?: string;
215
+ }) => Promise<T>;
216
+ loadDiscountConfig: (params: {
217
+ customerId: number;
218
+ action?: 'create';
219
+ }) => Promise<void>;
220
+ getDiscountList: () => Discount[];
221
+ applyDiscount: () => void;
90
222
  }
@@ -1,4 +1,5 @@
1
1
  import { CartItem } from "../Cart";
2
+ import type { ScanOrderSubmitPayload, ScanOrderSubmitProduct, ScanOrderSummary, ScanOrderTempOrder } from '../../solution/ScanOrder/types';
2
3
  /**
3
4
  * 通过 session 类商品的开始时间结束时间生成商品的时长
4
5
  * @param {CartItem} cartItem
@@ -21,3 +22,30 @@ export declare const mergeRelationForms: (relationForms: {
21
22
  form_record_ids: number[];
22
23
  }[];
23
24
  export declare const getAllDiscountList: (cartItem: CartItem) => any;
25
+ export declare function createUuidV4(): string;
26
+ export declare function isTempOrder(data: any): data is ScanOrderTempOrder;
27
+ export declare function formatDateTime(date: Date): string;
28
+ export declare function normalizeSubmitBooking<T extends {
29
+ metadata?: Record<string, any>;
30
+ }>(booking: T): T;
31
+ export declare function createDefaultTempOrder(params: {
32
+ now: string;
33
+ summary?: ScanOrderSummary;
34
+ }): ScanOrderTempOrder;
35
+ export declare function buildSubmitPayload(params: {
36
+ tempOrder: ScanOrderTempOrder;
37
+ cacheId?: string;
38
+ now?: Date;
39
+ }): ScanOrderSubmitPayload;
40
+ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
41
+ bundle: any[];
42
+ key: number | null;
43
+ option: any[];
44
+ product_id: number | null;
45
+ product_variant_id: number;
46
+ quantity: number;
47
+ rowKey: number | null;
48
+ session: null;
49
+ unique: string;
50
+ }[];
51
+ export { createEmptySummary } from '../../solution/ScanOrder/utils';