@pisell/pisellos 2.1.119 → 2.1.120

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 +23 -0
  51. package/dist/modules/OpenData/index.js +167 -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 +780 -29
  58. package/dist/modules/Order/types.d.ts +144 -12
  59. package/dist/modules/Order/utils.d.ts +25 -0
  60. package/dist/modules/Order/utils.js +225 -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 +158 -0
  100. package/dist/solution/VenueBooking/index.js +2873 -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 +204 -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 +0 -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 +23 -0
  166. package/lib/modules/OpenData/index.js +116 -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 +423 -1
  173. package/lib/modules/Order/types.d.ts +144 -12
  174. package/lib/modules/Order/utils.d.ts +25 -0
  175. package/lib/modules/Order/utils.js +229 -0
  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 +158 -0
  215. package/lib/solution/VenueBooking/index.js +1545 -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 +209 -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,377 @@ var OrderModule = class extends import_BaseModule.BaseModule {
91
128
  });
92
129
  }
93
130
  }
131
+ // ─── Discount: 子模块注册 ───
132
+ registerDiscountModules(options) {
133
+ const discount = new import_Discount.DiscountModule(`${this.name}_discount`);
134
+ this.core.registerModule(discount, {
135
+ otherParams: {
136
+ fatherModule: this.name
137
+ }
138
+ });
139
+ this.store.discount = discount;
140
+ const rules = new import_Rules.RulesModule(`${this.name}_rules`);
141
+ this.core.registerModule(rules, {
142
+ hooks: this.rulesHooksOverride || this.createDefaultRulesHooks()
143
+ });
144
+ this.store.rules = rules;
145
+ }
146
+ createDefaultRulesHooks() {
147
+ return {
148
+ getProduct: (product) => {
149
+ var _a, _b, _c, _d;
150
+ return {
151
+ id: product.product_id,
152
+ _id: product.identity_key ? `${product.product_id}_${product.product_variant_id}_${product.identity_key}` : `${product.product_id}_${product.product_variant_id}`,
153
+ price: product.selling_price,
154
+ total: new import_decimal.default(product.payment_price || product.selling_price || 0).times(product.num || 1).toNumber(),
155
+ origin_total: new import_decimal.default(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
156
+ original_price: product.original_price,
157
+ quantity: product.num || 1,
158
+ num: product.num || 1,
159
+ discount_list: product.discount_list || [],
160
+ bundle: product.product_bundle || [],
161
+ booking_id: ((_a = product._origin) == null ? void 0 : _a.booking_id) || null,
162
+ isClient: false,
163
+ isManualDiscount: ((_b = product._origin) == null ? void 0 : _b.isManualDiscount) || false,
164
+ holder_id: (_c = product._origin) == null ? void 0 : _c.holder_id,
165
+ startDate: (_d = product._origin) == null ? void 0 : _d.startDate
166
+ };
167
+ },
168
+ setProduct: (product, values) => ({
169
+ ...product,
170
+ selling_price: values.price !== void 0 ? String(values.price) : product.selling_price,
171
+ payment_price: values.total !== void 0 ? String(values.total) : product.payment_price,
172
+ original_price: values.original_price !== void 0 ? String(values.original_price) : product.original_price,
173
+ discount_list: values.discount_list ?? product.discount_list,
174
+ num: values.quantity ?? product.num,
175
+ product_bundle: values.bundle ?? product.product_bundle,
176
+ metadata: {
177
+ ...product.metadata || {},
178
+ ...values.main_product_selling_price !== void 0 ? { main_product_selling_price: String(values.main_product_selling_price) } : {}
179
+ }
180
+ })
181
+ };
182
+ }
183
+ // ─── Discount: 公共 API ───
184
+ async loadDiscountConfig(params) {
185
+ var _a, _b, _c, _d;
186
+ const discountList = await ((_a = this.store.discount) == null ? void 0 : _a.loadPrepareConfig({
187
+ customer_id: params.customerId,
188
+ action: params.action || "create",
189
+ with_good_pass: 1,
190
+ with_discount_card: 1,
191
+ with_wallet_pass_holder: 1,
192
+ request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
193
+ }));
194
+ if (discountList) {
195
+ (_b = this.store.discount) == null ? void 0 : _b.setDiscountList(discountList);
196
+ }
197
+ if ((_d = (_c = this.store.tempOrder) == null ? void 0 : _c.products) == null ? void 0 : _d.length) {
198
+ this.applyDiscount();
199
+ }
200
+ }
201
+ getDiscountList() {
202
+ var _a;
203
+ return ((_a = this.store.discount) == null ? void 0 : _a.getDiscountList()) || [];
204
+ }
205
+ async scanCode(code, customerId) {
206
+ var _a, _b, _c, _d;
207
+ const resultDiscountList = await ((_a = this.store.discount) == null ? void 0 : _a.batchSearch(code, customerId)) || [];
208
+ const rulesModule = this.store.rules;
209
+ if (!rulesModule) {
210
+ return {
211
+ type: "clientCalc",
212
+ isAvailable: false,
213
+ discountList: this.getDiscountList(),
214
+ unavailableReason: import_types.UnavailableReason.Unknown
215
+ };
216
+ }
217
+ if (!resultDiscountList.length) {
218
+ return {
219
+ type: "server",
220
+ isAvailable: false,
221
+ discountList: this.getDiscountList()
222
+ };
223
+ }
224
+ const withScanList = resultDiscountList.map((item) => ({ ...item, isScan: true }));
225
+ const currentSelected = this.getDiscountList().filter((n) => n.isSelected);
226
+ if (currentSelected.length && currentSelected.some((n) => withScanList.some((m) => m.id === n.id))) {
227
+ return {
228
+ type: "clientCalc",
229
+ isAvailable: true,
230
+ discountList: this.getDiscountList()
231
+ };
232
+ }
233
+ const tempOrder = this.store.tempOrder;
234
+ const holders = ((_b = tempOrder == null ? void 0 : tempOrder.holder) == null ? void 0 : _b.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
235
+ const { isAvailable, discountList: newDiscountList, unavailableReason } = rulesModule.isDiscountListAvailable({
236
+ productList: (tempOrder == null ? void 0 : tempOrder.products) || [],
237
+ oldDiscountList: this.getDiscountList(),
238
+ newDiscountList: withScanList,
239
+ holders,
240
+ isFormSubject: !!((_c = tempOrder == null ? void 0 : tempOrder.holder) == null ? void 0 : _c.type) && tempOrder.holder.type === "form"
241
+ }) || { isAvailable: false, discountList: this.getDiscountList() };
242
+ if (isAvailable && newDiscountList) {
243
+ (_d = this.store.discount) == null ? void 0 : _d.setDiscountList(newDiscountList);
244
+ this.applyDiscount();
245
+ }
246
+ return {
247
+ type: "clientCalc",
248
+ isAvailable: isAvailable || false,
249
+ discountList: newDiscountList || this.getDiscountList(),
250
+ unavailableReason
251
+ };
252
+ }
253
+ applyDiscount() {
254
+ var _a, _b, _c, _d, _e;
255
+ const tempOrder = this.store.tempOrder;
256
+ if (!((_a = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _a.length))
257
+ return;
258
+ const rulesModule = this.store.rules;
259
+ if (!rulesModule)
260
+ return;
261
+ const discountList = ((_b = this.store.discount) == null ? void 0 : _b.getDiscountList()) || [];
262
+ const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
263
+ const result = rulesModule.calcDiscount({
264
+ productList: tempOrder.products,
265
+ discountList,
266
+ holders,
267
+ isFormSubject: !!((_d = tempOrder.holder) == null ? void 0 : _d.type) && tempOrder.holder.type === "form"
268
+ });
269
+ if (result == null ? void 0 : result.productList) {
270
+ tempOrder.products = result.productList;
271
+ }
272
+ if (result == null ? void 0 : result.discountList) {
273
+ OrderModule.populateSavedAmounts(result.productList || tempOrder.products, result.discountList);
274
+ (_e = this.store.discount) == null ? void 0 : _e.setDiscountList(result.discountList);
275
+ tempOrder.discount_list = result.discountList.filter((d) => d.isSelected);
276
+ }
277
+ }
278
+ // ─── TempOrder: 初始化入口 ───
279
+ initTempOrder(params) {
280
+ if (params.cacheId !== void 0)
281
+ this.cacheId = params.cacheId;
282
+ if (params.salesSummaryModuleName !== void 0)
283
+ this.salesSummaryModuleName = params.salesSummaryModuleName;
284
+ this.restoreTempOrderFromStorage();
285
+ }
286
+ // ─── TempOrder: localStorage 持久化 ───
287
+ getTempOrderStorageKey() {
288
+ if (!this.cacheId)
289
+ return null;
290
+ return `scanOrder:tempOrder:${this.cacheId}`;
291
+ }
292
+ restoreTempOrderFromStorage() {
293
+ var _a, _b;
294
+ const key = this.getTempOrderStorageKey();
295
+ if (!key)
296
+ return;
297
+ if (!this.window)
298
+ return;
299
+ const cachedData = this.window.localStorage.getItem(key);
300
+ if (!cachedData)
301
+ return;
302
+ try {
303
+ const parsedData = JSON.parse(cachedData);
304
+ if (!(0, import_utils.isTempOrder)(parsedData)) {
305
+ this.window.localStorage.removeItem(key);
306
+ return;
307
+ }
308
+ this.store.tempOrder = parsedData;
309
+ } catch {
310
+ (_b = (_a = this.window) == null ? void 0 : _a.localStorage) == null ? void 0 : _b.removeItem(key);
311
+ }
312
+ }
313
+ persistTempOrder() {
314
+ const key = this.getTempOrderStorageKey();
315
+ if (!key || !this.store.tempOrder)
316
+ return;
317
+ if (!this.window)
318
+ return;
319
+ this.window.localStorage.setItem(key, JSON.stringify(this.store.tempOrder));
320
+ }
321
+ // ─── TempOrder: 创建 & 获取 ───
322
+ createDefaultTempOrderInstance() {
323
+ return (0, import_utils.createDefaultTempOrder)({
324
+ now: (0, import_utils.formatDateTime)(/* @__PURE__ */ new Date()),
325
+ summary: (0, import_utils.createEmptySummary)()
326
+ });
327
+ }
328
+ ensureTempOrder() {
329
+ if (this.store.tempOrder)
330
+ return this.store.tempOrder;
331
+ const newOrder = this.createDefaultTempOrderInstance();
332
+ this.store.tempOrder = newOrder;
333
+ this.persistTempOrder();
334
+ return newOrder;
335
+ }
336
+ getTempOrder() {
337
+ return this.store.tempOrder;
338
+ }
339
+ async addNewOrder() {
340
+ const tempOrder = this.ensureTempOrder();
341
+ await this.recalculateSummary({ createIfMissing: true });
342
+ this.persistTempOrder();
343
+ return tempOrder;
344
+ }
345
+ getOrderProducts() {
346
+ const tempOrder = this.ensureTempOrder();
347
+ return tempOrder.products;
348
+ }
349
+ // ─── TempOrder: 金额汇总 ───
350
+ getSalesSummary() {
351
+ if (!this.salesSummaryModuleName)
352
+ return null;
353
+ return this.core.getModule(this.salesSummaryModuleName);
354
+ }
355
+ async recalculateSummary(options) {
356
+ const tempOrder = (options == null ? void 0 : options.createIfMissing) ? this.ensureTempOrder() : this.store.tempOrder;
357
+ if (!tempOrder)
358
+ return null;
359
+ const salesSummary = this.getSalesSummary();
360
+ if (!salesSummary) {
361
+ tempOrder.summary = (0, import_utils.createEmptySummary)();
362
+ tempOrder.surcharge_fee = tempOrder.summary.surcharge_fee;
363
+ return tempOrder.summary;
364
+ }
365
+ const summary = await salesSummary.getSummary({
366
+ products: tempOrder.products
367
+ });
368
+ tempOrder.summary = summary;
369
+ if (summary.is_price_include_tax !== void 0) {
370
+ tempOrder.is_price_include_tax = summary.is_price_include_tax;
371
+ }
372
+ if (typeof summary.tax_title === "string") {
373
+ tempOrder.tax_title = summary.tax_title;
374
+ }
375
+ tempOrder.surcharge_fee = summary.surcharge_fee;
376
+ tempOrder.surcharges = summary.surcharges || [];
377
+ tempOrder.deposit_amount = summary.deposit_amount || "0.00";
378
+ tempOrder.is_deposit = summary.deposit_amount !== "0.00" ? 1 : 0;
379
+ tempOrder.shop_discount = summary.discount_amount || "0.00";
380
+ return tempOrder.summary;
381
+ }
382
+ async getScanOrderSummary() {
383
+ const summary = await this.recalculateSummary({ createIfMissing: true });
384
+ if (!summary)
385
+ return (0, import_utils.createEmptySummary)();
386
+ this.persistTempOrder();
387
+ return summary;
388
+ }
389
+ // ─── TempOrder: 备注 ───
390
+ updateTempOrderNote(note) {
391
+ const tempOrder = this.ensureTempOrder();
392
+ tempOrder.note = String(note || "");
393
+ this.persistTempOrder();
394
+ return tempOrder.note;
395
+ }
396
+ updateTempOrderContactsInfo(contactsInfo) {
397
+ const tempOrder = this.ensureTempOrder();
398
+ tempOrder.contacts_info = Array.isArray(contactsInfo) ? contactsInfo : [];
399
+ this.persistTempOrder();
400
+ return tempOrder.contacts_info;
401
+ }
402
+ // ─── TempOrder: 商品 CRUD ───
403
+ async addProductToOrder(product) {
404
+ const tempOrder = this.ensureTempOrder();
405
+ const normalizedProduct = (0, import_utils3.normalizeOrderProduct)(product);
406
+ const productIndex = (0, import_utils3.getProductIdentityIndex)(
407
+ tempOrder.products,
408
+ normalizedProduct
409
+ );
410
+ if (productIndex === -1) {
411
+ tempOrder.products.push(normalizedProduct);
412
+ } else {
413
+ const targetProduct = tempOrder.products[productIndex];
414
+ tempOrder.products[productIndex] = {
415
+ ...targetProduct,
416
+ ...normalizedProduct,
417
+ num: (0, import_utils3.getSafeProductNum)(targetProduct.num + normalizedProduct.num),
418
+ _origin: normalizedProduct._origin || targetProduct._origin
419
+ };
420
+ }
421
+ this.applyDiscount();
422
+ await this.recalculateSummary({ createIfMissing: true });
423
+ this.persistTempOrder();
424
+ return tempOrder.products;
425
+ }
426
+ async updateProductInOrder(params) {
427
+ const { product_id, product_variant_id, updates } = params;
428
+ const tempOrder = this.ensureTempOrder();
429
+ const productIndex = (0, import_utils3.getProductIdentityIndex)(tempOrder.products, {
430
+ product_id,
431
+ product_variant_id
432
+ });
433
+ if (productIndex === -1) {
434
+ throw new Error("[Order] 目标商品不存在,无法更新");
435
+ }
436
+ const targetProduct = tempOrder.products[productIndex];
437
+ const nextProduct = {
438
+ ...targetProduct,
439
+ ...updates,
440
+ product_id,
441
+ product_variant_id
442
+ };
443
+ nextProduct.num = (0, import_utils3.getSafeProductNum)(nextProduct.num);
444
+ tempOrder.products[productIndex] = nextProduct;
445
+ this.applyDiscount();
446
+ await this.recalculateSummary({ createIfMissing: true });
447
+ this.persistTempOrder();
448
+ return tempOrder.products;
449
+ }
450
+ async removeProductFromOrder(identity) {
451
+ const tempOrder = this.ensureTempOrder();
452
+ const beforeProducts = tempOrder.products;
453
+ tempOrder.products = tempOrder.products.filter(
454
+ (item) => !(0, import_utils3.isIdentityMatch)(item, identity)
455
+ );
456
+ const removedByStrictIdentity = beforeProducts.length - tempOrder.products.length;
457
+ if (removedByStrictIdentity === 0 && identity.identity_key) {
458
+ tempOrder.products = tempOrder.products.filter((item) => {
459
+ const isSameProduct = String(item.product_id) === String(identity.product_id) && String(item.product_variant_id) === String(identity.product_variant_id);
460
+ const hasNoIdentityKey = !item.identity_key;
461
+ return !(isSameProduct && hasNoIdentityKey);
462
+ });
463
+ }
464
+ this.applyDiscount();
465
+ await this.recalculateSummary({ createIfMissing: true });
466
+ this.persistTempOrder();
467
+ return tempOrder.products;
468
+ }
469
+ // ─── TempOrder: 提交 ───
470
+ async submitTempOrder(params) {
471
+ const tempOrder = this.ensureTempOrder();
472
+ this.persistTempOrder();
473
+ const effectiveCacheId = (params == null ? void 0 : params.cacheId) ?? this.cacheId;
474
+ const payload = (0, import_utils.buildSubmitPayload)({
475
+ tempOrder,
476
+ cacheId: effectiveCacheId
477
+ });
478
+ let result;
479
+ if (tempOrder.order_id) {
480
+ const products = (0, import_utils.formatV1Product)(payload.products);
481
+ const moreResult = await this.scanOrderMore({
482
+ query: {
483
+ order_id: tempOrder.order_id,
484
+ products,
485
+ request_unique_idempotency_token: payload.request_unique_idempotency_token
486
+ }
487
+ });
488
+ if (moreResult.code === 200) {
489
+ result = {
490
+ data: {
491
+ order_id: tempOrder.order_id
492
+ }
493
+ };
494
+ }
495
+ } else {
496
+ result = await this.submitScanOrder({
497
+ query: payload
498
+ });
499
+ }
500
+ return result;
501
+ }
94
502
  createOrder(params) {
95
503
  var _a;
96
504
  const order = {
@@ -292,6 +700,20 @@ var OrderModule = class extends import_BaseModule.BaseModule {
292
700
  throw error;
293
701
  }
294
702
  }
703
+ async submitScanOrder(params) {
704
+ const { url, query } = params;
705
+ const fetchUrl = url || "/order/sales/checkout";
706
+ return this.request.post(fetchUrl, query);
707
+ }
708
+ async scanOrderMore(params) {
709
+ const { url, query } = params;
710
+ const fetchUrl = url || `/order/order/product/${query.order_id}`;
711
+ const requestBody = {
712
+ products: query.products,
713
+ request_unique_idempotency_token: query.request_unique_idempotency_token
714
+ };
715
+ return this.request.put(fetchUrl, requestBody);
716
+ }
295
717
  };
296
718
  // Annotate the CommonJS export names for ESM import in node:
297
719
  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,27 @@ 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 createDefaultTempOrder(params: {
29
+ now: string;
30
+ summary?: ScanOrderSummary;
31
+ }): ScanOrderTempOrder;
32
+ export declare function buildSubmitPayload(params: {
33
+ tempOrder: ScanOrderTempOrder;
34
+ cacheId?: string;
35
+ now?: Date;
36
+ }): ScanOrderSubmitPayload;
37
+ export declare function formatV1Product(products: ScanOrderSubmitProduct[]): {
38
+ bundle: any[];
39
+ key: number | null;
40
+ option: any[];
41
+ product_id: number | null;
42
+ product_variant_id: number;
43
+ quantity: number;
44
+ rowKey: number | null;
45
+ session: null;
46
+ unique: string;
47
+ }[];
48
+ export { createEmptySummary } from '../../solution/ScanOrder/utils';