@pisell/pisellos 0.0.234 → 0.0.236

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 (33) hide show
  1. package/dist/modules/Order/index.d.ts +1 -1
  2. package/dist/modules/Payment/index.d.ts +3 -3
  3. package/dist/modules/Payment/index.js +74 -10
  4. package/dist/modules/Payment/types.d.ts +24 -3
  5. package/dist/modules/Payment/types.js +9 -1
  6. package/dist/modules/Payment/utils.js +1 -1
  7. package/dist/modules/Payment/walletpass.d.ts +5 -2
  8. package/dist/modules/Payment/walletpass.js +63 -11
  9. package/dist/solution/BookingTicket/index.d.ts +8 -0
  10. package/dist/solution/BookingTicket/index.js +27 -3
  11. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +6 -0
  12. package/dist/solution/BookingTicket/utils/scan/handleScan.js +43 -28
  13. package/dist/solution/Checkout/index.d.ts +73 -8
  14. package/dist/solution/Checkout/index.js +1540 -926
  15. package/dist/solution/Checkout/types.d.ts +79 -3
  16. package/dist/solution/Checkout/types.js +6 -0
  17. package/lib/modules/Order/index.d.ts +1 -1
  18. package/lib/modules/Payment/index.d.ts +3 -3
  19. package/lib/modules/Payment/index.js +30 -5
  20. package/lib/modules/Payment/types.d.ts +24 -3
  21. package/lib/modules/Payment/types.js +1 -1
  22. package/lib/modules/Payment/utils.js +1 -1
  23. package/lib/modules/Payment/walletpass.d.ts +5 -2
  24. package/lib/modules/Payment/walletpass.js +30 -2
  25. package/lib/solution/BookingTicket/index.d.ts +8 -0
  26. package/lib/solution/BookingTicket/index.js +23 -2
  27. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +6 -0
  28. package/lib/solution/BookingTicket/utils/scan/handleScan.js +21 -14
  29. package/lib/solution/Checkout/index.d.ts +73 -8
  30. package/lib/solution/Checkout/index.js +582 -200
  31. package/lib/solution/Checkout/types.d.ts +79 -3
  32. package/lib/solution/Checkout/types.js +2 -0
  33. package/package.json +1 -1
@@ -96,6 +96,23 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
96
96
  await this.handlePaymentError(data);
97
97
  }
98
98
  });
99
+ this.core.effects.on(
100
+ import_types2.PaymentHooks.OnPaymentMethodsLoaded,
101
+ async (methods) => {
102
+ console.log("[Checkout] 收到支付方式加载完成事件:", methods.length);
103
+ this.store.paymentMethods = methods;
104
+ }
105
+ );
106
+ this.core.effects.on(
107
+ import_types2.PaymentHooks.OnPaymentMethodsChanged,
108
+ async (data) => {
109
+ console.log("[Checkout] 收到支付方式变更事件:", {
110
+ oldCount: data.oldMethods.length,
111
+ newCount: data.newMethods.length
112
+ });
113
+ this.store.paymentMethods = data.newMethods;
114
+ }
115
+ );
99
116
  }
100
117
  /**
101
118
  * 初始化结账流程
@@ -160,7 +177,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
160
177
  }
161
178
  /**
162
179
  * 创建本地订单 (前端模拟下单流程)
163
- *
180
+ *
164
181
  * 此方法用于在前端模拟整个下单流程,创建一个本地的虚拟订单。
165
182
  * 用户在购物车点击下单时,会把购物车参数传递给此方法,
166
183
  * 方法会记录参数并创建本地虚拟订单,然后用 Payment 模块管理支付流程。
@@ -168,6 +185,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
168
185
  async createLocalOrderAsync(params) {
169
186
  var _a, _b, _c, _d;
170
187
  try {
188
+ await this.resetStoreStateAsync();
171
189
  await this.setStatus(import_types.CheckoutStatus.CreatingOrder);
172
190
  const validation = await this.validateLocalOrderData(params.orderData);
173
191
  if (!validation.valid) {
@@ -233,7 +251,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
233
251
  });
234
252
  return paymentOrder;
235
253
  } catch (error) {
236
- await this.handleError(error, import_types.CheckoutErrorType.OrderCreationFailed);
254
+ await this.handleError(
255
+ error,
256
+ import_types.CheckoutErrorType.OrderCreationFailed
257
+ );
237
258
  await this.core.effects.emit(import_types.CheckoutHooks.OnOrderCreationFailed, {
238
259
  error: this.store.lastError,
239
260
  timestamp: Date.now()
@@ -243,7 +264,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
243
264
  }
244
265
  /**
245
266
  * 手动下单 (根据虚拟订单生成实际订单)
246
- *
267
+ *
247
268
  * 使用当前存储的本地订单数据调用 Order 模块创建真实订单
248
269
  */
249
270
  async placeOrderAsync(params = {}) {
@@ -310,7 +331,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
310
331
  errorMessage = error.message;
311
332
  }
312
333
  console.error("[Checkout] 手动下单失败:", errorMessage);
313
- await this.handleError(error, import_types.CheckoutErrorType.OrderCreationFailed);
334
+ await this.handleError(
335
+ error,
336
+ import_types.CheckoutErrorType.OrderCreationFailed
337
+ );
314
338
  return {
315
339
  success: false,
316
340
  error: errorMessage
@@ -359,7 +383,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
359
383
  console.log("[Checkout] 订单创建成功:", paymentOrder.id);
360
384
  return paymentOrder;
361
385
  } catch (error) {
362
- await this.handleError(error, import_types.CheckoutErrorType.OrderCreationFailed);
386
+ await this.handleError(
387
+ error,
388
+ import_types.CheckoutErrorType.OrderCreationFailed
389
+ );
363
390
  await this.core.effects.emit(import_types.CheckoutHooks.OnOrderCreationFailed, {
364
391
  error: this.store.lastError,
365
392
  timestamp: Date.now()
@@ -455,6 +482,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
455
482
  timestamp: Date.now()
456
483
  });
457
484
  console.log("[Checkout] 结账流程完成:", order.id);
485
+ await this.resetStoreStateAsync();
458
486
  return {
459
487
  success: true,
460
488
  orderId: String(order.id)
@@ -470,7 +498,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
470
498
  async cancelCheckoutAsync() {
471
499
  try {
472
500
  if (this.store.currentOrder) {
473
- await this.payment.deletePaymentOrderAsync(this.store.currentOrder.uuid);
501
+ await this.payment.deletePaymentOrderAsync(
502
+ this.store.currentOrder.uuid
503
+ );
474
504
  this.store.currentOrder = void 0;
475
505
  }
476
506
  this.store.localOrderData = void 0;
@@ -508,8 +538,8 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
508
538
  async getCheckoutSummaryAsync() {
509
539
  var _a, _b;
510
540
  const totalAmount = ((_a = this.store.currentOrder) == null ? void 0 : _a.total_amount) || "0.00";
511
- const paidAmount = this.calculatePaidAmount();
512
- const remainingAmount = this.calculateRemainingAmount();
541
+ const paidAmount = await this.calculatePaidAmountAsync();
542
+ const remainingAmount = await this.calculateRemainingAmountAsync();
513
543
  return {
514
544
  order: this.store.currentOrder,
515
545
  totalAmount,
@@ -523,21 +553,26 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
523
553
  * 获取可用支付方式
524
554
  */
525
555
  async getAvailablePaymentMethodsAsync() {
526
- if (this.store.paymentMethods.length === 0) {
527
- console.log("[Checkout] 支付方式缓存为空,重新加载...");
528
- await this.preloadPaymentMethods();
529
- }
530
- return this.store.paymentMethods;
556
+ return await this.getPaymentMethodsAsync();
531
557
  }
532
558
  /**
533
559
  * 刷新支付方式缓存
534
- *
560
+ *
535
561
  * 强制重新从服务器获取支付方式列表,更新本地缓存
536
562
  */
537
563
  async refreshPaymentMethodsAsync() {
538
564
  console.log("[Checkout] 强制刷新支付方式缓存...");
539
- await this.preloadPaymentMethods();
540
- return this.store.paymentMethods;
565
+ try {
566
+ const methods = await this.payment.getPayMethodListAsync();
567
+ this.store.paymentMethods = methods;
568
+ console.log(
569
+ `[Checkout] 强制刷新完成,获取到 ${methods.length} 种支付方式`
570
+ );
571
+ return methods;
572
+ } catch (error) {
573
+ console.error("[Checkout] 强制刷新支付方式失败:", error);
574
+ return this.store.paymentMethods;
575
+ }
541
576
  }
542
577
  /**
543
578
  * 获取订单原始数据
@@ -548,7 +583,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
548
583
  }
549
584
  /**
550
585
  * 获取当前订单基础信息
551
- *
586
+ *
552
587
  * 返回当前订单的基础信息,包括订单状态、金额、支付状态等
553
588
  */
554
589
  getCurrentOrderInfo() {
@@ -593,7 +628,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
593
628
  }
594
629
  /**
595
630
  * 获取当前订单的支付项
596
- *
631
+ *
597
632
  * 返回当前订单的所有支付项,包括活跃和已撤销的支付项
598
633
  */
599
634
  async getCurrentOrderPaymentItemsAsync() {
@@ -607,7 +642,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
607
642
  orderUuid: currentOrder.uuid,
608
643
  orderId: currentOrder.order_id
609
644
  });
610
- const paymentItems = await this.payment.getPaymentItemsAsync(currentOrder.uuid);
645
+ const paymentItems = await this.payment.getPaymentItemsAsync(
646
+ currentOrder.uuid
647
+ );
611
648
  console.log("[Checkout] 成功获取支付项:", {
612
649
  orderUuid: currentOrder.uuid,
613
650
  paymentItemCount: paymentItems.length,
@@ -662,7 +699,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
662
699
  }
663
700
  break;
664
701
  default:
665
- console.warn("[Checkout] 无法重试此类型的错误:", this.store.lastError.type);
702
+ console.warn(
703
+ "[Checkout] 无法重试此类型的错误:",
704
+ this.store.lastError.type
705
+ );
666
706
  }
667
707
  }
668
708
  } catch (error) {
@@ -695,9 +735,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
695
735
  }
696
736
  /**
697
737
  * 替换本地订单ID为真实订单ID
698
- *
738
+ *
699
739
  * 当后端订单创建完成后,调用此方法将本地虚拟订单ID替换为真实订单ID
700
- *
740
+ *
701
741
  * @param newOrderId 后端返回的真实订单ID
702
742
  * @returns 更新后的订单对象,如果当前没有订单则返回null
703
743
  */
@@ -733,9 +773,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
733
773
  }
734
774
  /**
735
775
  * 设置自定义支付金额
736
- *
776
+ *
737
777
  * 允许UI自定义本次支付的金额,通常用于部分支付或调整支付金额场景
738
- *
778
+ *
739
779
  * @param amount 自定义支付金额,必须是有效的数字字符串
740
780
  */
741
781
  async setStateAmountAsync(amount) {
@@ -771,7 +811,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
771
811
  }
772
812
  /**
773
813
  * 获取当前自定义支付金额
774
- *
814
+ *
775
815
  * @returns 当前设置的自定义支付金额
776
816
  */
777
817
  getStateAmount() {
@@ -779,7 +819,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
779
819
  }
780
820
  /**
781
821
  * 刷新 stateAmount 为当前剩余未支付金额
782
- *
822
+ *
783
823
  * UI 可以调用此方法来主动刷新支付金额状态
784
824
  */
785
825
  async refreshStateAmountAsync() {
@@ -787,9 +827,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
787
827
  }
788
828
  /**
789
829
  * 获取购物车小计数据
790
- *
830
+ *
791
831
  * 返回当前结账流程中的购物车小计项数据,包含各种费用明细
792
- *
832
+ *
793
833
  * @returns 购物车小计数据数组,如果没有则返回 null
794
834
  */
795
835
  getCartSummary() {
@@ -799,15 +839,19 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
799
839
  }
800
840
  console.log("[Checkout] 获取购物车小计数据:", {
801
841
  itemCount: this.store.cartSummary.length,
802
- items: this.store.cartSummary.map((item) => ({ key: item.key, value: item.value, label: item.label }))
842
+ items: this.store.cartSummary.map((item) => ({
843
+ key: item.key,
844
+ value: item.value,
845
+ label: item.label
846
+ }))
803
847
  });
804
848
  return [...this.store.cartSummary];
805
849
  }
806
850
  /**
807
851
  * 获取提取的金额详细信息
808
- *
852
+ *
809
853
  * 从当前的购物车小计数据中提取结构化的金额信息
810
- *
854
+ *
811
855
  * @returns 提取的金额信息对象,如果没有小计数据则返回 null
812
856
  */
813
857
  getExtractedAmountInfo() {
@@ -815,25 +859,45 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
815
859
  console.warn("[Checkout] 没有可用的购物车小计数据,无法提取金额信息");
816
860
  return null;
817
861
  }
818
- const extractedInfo = this.extractAmountFromCartSummary(this.store.cartSummary);
862
+ const extractedInfo = this.extractAmountFromCartSummary(
863
+ this.store.cartSummary
864
+ );
819
865
  console.log("[Checkout] 获取提取的金额信息:", extractedInfo);
820
866
  return extractedInfo;
821
867
  }
822
868
  /**
823
869
  * 获取支付方式列表
824
- *
825
- * 直接调用 Payment 模块的 getPayMethodListAsync 方法
826
- *
870
+ *
871
+ * 优先使用 store 中的缓存数据,避免重复接口调用。
872
+ * 如果 store 中没有数据,则调用 Payment 模块的方法获取。
873
+ *
827
874
  * @returns 支付方式列表
828
875
  */
829
876
  async getPaymentMethodsAsync() {
830
- return await this.payment.getPayMethodListAsync();
877
+ if (this.store.paymentMethods && this.store.paymentMethods.length > 0) {
878
+ console.log(
879
+ `[Checkout] 使用缓存的支付方式数据,共 ${this.store.paymentMethods.length} 种`
880
+ );
881
+ return this.store.paymentMethods;
882
+ }
883
+ console.log("[Checkout] store 中无缓存,从 Payment 模块获取支付方式...");
884
+ try {
885
+ const methods = await this.payment.getPayMethodListAsync();
886
+ this.store.paymentMethods = methods;
887
+ console.log(
888
+ `[Checkout] 从 Payment 模块获取到 ${methods.length} 种支付方式,已更新缓存`
889
+ );
890
+ return methods;
891
+ } catch (error) {
892
+ console.error("[Checkout] 获取支付方式失败:", error);
893
+ return [];
894
+ }
831
895
  }
832
896
  /**
833
897
  * 为当前订单添加支付项
834
- *
898
+ *
835
899
  * 向当前活跃订单添加一个支付项,支付项包含支付方式信息和金额
836
- *
900
+ *
837
901
  * @param paymentItem 支付项数据
838
902
  * @throws 当前没有活跃订单时抛出错误
839
903
  */
@@ -866,45 +930,6 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
866
930
  当前订单ID: currentOrderId,
867
931
  是否为真实ID: isCurrentOrderReal
868
932
  });
869
- const updatedOrder = await this.payment.getPaymentOrderByUuidAsync(this.store.currentOrder.uuid);
870
- if (updatedOrder) {
871
- if (isCurrentOrderReal && this.isVirtualOrderId(updatedOrder.order_id)) {
872
- console.warn("[Checkout] 检测到订单ID回退,保护真实订单ID:", {
873
- 当前真实ID: currentOrderId,
874
- 获取到的虚拟ID: updatedOrder.order_id
875
- });
876
- updatedOrder.order_id = currentOrderId;
877
- }
878
- this.store.currentOrder = updatedOrder;
879
- console.log("[Checkout] 订单数据已同步:", {
880
- 支付项数量: updatedOrder.payment.length,
881
- 最终订单ID: updatedOrder.order_id,
882
- 是否为虚拟ID: this.isVirtualOrderId(updatedOrder.order_id)
883
- });
884
- }
885
- const needsOrderSync = this.shouldSyncOrderForPayment(paymentItem.code, paymentItem.type);
886
- console.log("[Checkout] 支付项同步检查:", {
887
- paymentCode: paymentItem.code,
888
- paymentType: paymentItem.type,
889
- paymentAmount: paymentItem.amount,
890
- expectedCashCode: import_types2.PaymentMethodType.Cash,
891
- needsOrderSync,
892
- isOrderSynced: this.store.isOrderSynced
893
- });
894
- if (needsOrderSync) {
895
- console.log("[Checkout] 检测到非现金/自定义支付,开始同步订单到后端...", {
896
- 同步前订单ID: this.store.currentOrder.order_id,
897
- 是否为虚拟ID: this.isVirtualOrderId(this.store.currentOrder.order_id),
898
- 订单同步状态: this.store.isOrderSynced,
899
- 订单UUID: this.store.currentOrder.uuid
900
- });
901
- await this.syncOrderToBackend();
902
- console.log("[Checkout] addPaymentItemAsync 中的同步完成:", {
903
- 同步后订单ID: this.store.currentOrder.order_id,
904
- 是否为虚拟ID: this.isVirtualOrderId(this.store.currentOrder.order_id),
905
- 订单同步状态: this.store.isOrderSynced
906
- });
907
- }
908
933
  await this.updateStateAmountToRemaining();
909
934
  await this.core.effects.emit(import_types.CheckoutHooks.OnPaymentStarted, {
910
935
  orderUuid: this.store.currentOrder.uuid,
@@ -920,9 +945,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
920
945
  }
921
946
  /**
922
947
  * 删除当前订单的支付项
923
- *
948
+ *
924
949
  * 从当前活跃订单中删除指定的支付项,支付项将被标记为已撤销状态
925
- *
950
+ *
926
951
  * @param paymentUuid 要删除的支付项UUID
927
952
  * @throws 当前没有活跃订单时抛出错误
928
953
  * @throws 支付项不存在时抛出错误
@@ -939,7 +964,12 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
939
964
  orderUuid: this.store.currentOrder.uuid,
940
965
  paymentUuid
941
966
  });
942
- const paymentItem = this.store.currentOrder.payment.find((p) => p.uuid === paymentUuid);
967
+ const currentPayments = await this.payment.getPaymentItemsAsync(
968
+ this.store.currentOrder.uuid,
969
+ true
970
+ // 包括已撤销的支付项,因为我们需要验证是否存在
971
+ );
972
+ const paymentItem = currentPayments.find((p) => p.uuid === paymentUuid);
943
973
  if (!paymentItem) {
944
974
  throw (0, import_utils.createCheckoutError)(
945
975
  import_types.CheckoutErrorType.ValidationFailed,
@@ -959,17 +989,25 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
959
989
  console.log("[Checkout] Payment模块删除完成");
960
990
  const currentOrderId = this.store.currentOrder.order_id;
961
991
  const isCurrentOrderReal = currentOrderId && !this.isVirtualOrderId(currentOrderId);
962
- const updatedOrder = await this.payment.getPaymentOrderByUuidAsync(this.store.currentOrder.uuid);
992
+ const updatedOrder = await this.payment.getPaymentOrderByUuidAsync(
993
+ this.store.currentOrder.uuid
994
+ );
963
995
  if (updatedOrder) {
964
996
  if (isCurrentOrderReal && this.isVirtualOrderId(updatedOrder.order_id)) {
965
- console.warn("[Checkout] deletePaymentItemAsync: 检测到订单ID回退,保护真实订单ID:", {
966
- 当前真实ID: currentOrderId,
967
- 获取到的虚拟ID: updatedOrder.order_id
968
- });
997
+ console.warn(
998
+ "[Checkout] deletePaymentItemAsync: 检测到订单ID回退,保护真实订单ID:",
999
+ {
1000
+ 当前真实ID: currentOrderId,
1001
+ 获取到的虚拟ID: updatedOrder.order_id
1002
+ }
1003
+ );
969
1004
  updatedOrder.order_id = currentOrderId;
970
1005
  }
971
1006
  this.store.currentOrder = updatedOrder;
972
- console.log("[Checkout] 订单数据已同步,当前支付项数量:", updatedOrder.payment.length);
1007
+ console.log(
1008
+ "[Checkout] 订单数据已同步,当前支付项数量:",
1009
+ updatedOrder.payment.length
1010
+ );
973
1011
  }
974
1012
  await this.updateStateAmountToRemaining();
975
1013
  await this.core.effects.emit(import_types.CheckoutHooks.OnPaymentStarted, {
@@ -988,10 +1026,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
988
1026
  }
989
1027
  /**
990
1028
  * 批量更新当前订单的代金券支付项(覆盖更新)
991
- *
1029
+ *
992
1030
  * 删除所有现有的代金券支付项,然后添加新的代金券支付项。
993
1031
  * 这是一个覆盖式更新操作,确保代金券支付项的一致性。
994
- *
1032
+ *
995
1033
  * @param voucherPaymentItems 新的代金券支付项列表,每个都必须包含 voucher_id
996
1034
  * @throws 当前没有活跃订单时抛出错误
997
1035
  * @throws 支付项缺少 voucher_id 时抛出错误
@@ -1024,17 +1062,25 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1024
1062
  console.log("[Checkout] Payment模块批量更新完成");
1025
1063
  const currentOrderId = this.store.currentOrder.order_id;
1026
1064
  const isCurrentOrderReal = currentOrderId && !this.isVirtualOrderId(currentOrderId);
1027
- const updatedOrder = await this.payment.getPaymentOrderByUuidAsync(this.store.currentOrder.uuid);
1065
+ const updatedOrder = await this.payment.getPaymentOrderByUuidAsync(
1066
+ this.store.currentOrder.uuid
1067
+ );
1028
1068
  if (updatedOrder) {
1029
1069
  if (isCurrentOrderReal && this.isVirtualOrderId(updatedOrder.order_id)) {
1030
- console.warn("[Checkout] updateVoucherPaymentItemsAsync: 检测到订单ID回退,保护真实订单ID:", {
1031
- 当前真实ID: currentOrderId,
1032
- 获取到的虚拟ID: updatedOrder.order_id
1033
- });
1070
+ console.warn(
1071
+ "[Checkout] updateVoucherPaymentItemsAsync: 检测到订单ID回退,保护真实订单ID:",
1072
+ {
1073
+ 当前真实ID: currentOrderId,
1074
+ 获取到的虚拟ID: updatedOrder.order_id
1075
+ }
1076
+ );
1034
1077
  updatedOrder.order_id = currentOrderId;
1035
1078
  }
1036
1079
  this.store.currentOrder = updatedOrder;
1037
- console.log("[Checkout] 订单数据已同步,当前支付项数量:", updatedOrder.payment.length);
1080
+ console.log(
1081
+ "[Checkout] 订单数据已同步,当前支付项数量:",
1082
+ updatedOrder.payment.length
1083
+ );
1038
1084
  const voucherItems = updatedOrder.payment.filter(
1039
1085
  (payment) => payment.voucher_id && payment.status !== "voided"
1040
1086
  );
@@ -1064,9 +1110,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1064
1110
  }
1065
1111
  /**
1066
1112
  * 修改当前订单的定金状态
1067
- *
1113
+ *
1068
1114
  * 更新当前订单的 is_deposit 字段,用于标识订单是否为定金订单
1069
- *
1115
+ *
1070
1116
  * @param isDeposit 定金状态 (1: 定金订单, 0: 全款订单)
1071
1117
  * @throws 当前没有活跃订单时抛出错误
1072
1118
  */
@@ -1103,7 +1149,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1103
1149
  updateParams.deposit_amount = "0.00";
1104
1150
  console.log("[Checkout] 订单从定金改为全款,清空定金金额");
1105
1151
  }
1106
- await this.payment.updateOrderAsync(this.store.currentOrder.uuid, updateParams);
1152
+ await this.payment.updateOrderAsync(
1153
+ this.store.currentOrder.uuid,
1154
+ updateParams
1155
+ );
1107
1156
  this.store.currentOrder = {
1108
1157
  ...this.store.currentOrder,
1109
1158
  ...updateParams
@@ -1121,15 +1170,18 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1121
1170
  });
1122
1171
  } catch (error) {
1123
1172
  console.error("[Checkout] 更新订单定金状态失败:", error);
1124
- await this.handleError(error, import_types.CheckoutErrorType.ValidationFailed);
1173
+ await this.handleError(
1174
+ error,
1175
+ import_types.CheckoutErrorType.ValidationFailed
1176
+ );
1125
1177
  throw error;
1126
1178
  }
1127
1179
  }
1128
1180
  /**
1129
1181
  * 更新当前订单的客户信息
1130
- *
1182
+ *
1131
1183
  * 更新当前订单关联的客户信息,用于标识订单的所属客户
1132
- *
1184
+ *
1133
1185
  * @param customer 客户信息 (customer_id 和/或 customer_name)
1134
1186
  * @throws 当前没有活跃订单时抛出错误
1135
1187
  */
@@ -1154,57 +1206,74 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1154
1206
  this.store.localOrderData.customer_id = customer.customer_id;
1155
1207
  this.store.localOrderData.customer_name = customer.customer_name;
1156
1208
  }
1157
- console.log("[Checkout] 订单客户信息更新成功:", this.store.currentCustomer);
1209
+ console.log(
1210
+ "[Checkout] 订单客户信息更新成功:",
1211
+ this.store.currentCustomer
1212
+ );
1158
1213
  } catch (error) {
1159
1214
  console.error("[Checkout] 更新订单客户信息失败:", error);
1160
- await this.handleError(error, import_types.CheckoutErrorType.ValidationFailed);
1215
+ await this.handleError(
1216
+ error,
1217
+ import_types.CheckoutErrorType.ValidationFailed
1218
+ );
1161
1219
  throw error;
1162
1220
  }
1163
1221
  }
1164
1222
  /**
1165
1223
  * 获取当前订单的客户信息
1166
- *
1224
+ *
1167
1225
  * @returns 当前客户信息,如果没有则返回 null
1168
1226
  */
1169
1227
  getCurrentCustomer() {
1170
1228
  return this.store.currentCustomer || null;
1171
1229
  }
1172
1230
  /**
1173
- * 检查订单是否需要手动同步
1174
- *
1231
+ * 检查订单是否需要手动同步(异步版本)
1232
+ *
1175
1233
  * 返回订单是否为纯代金券支付且待付金额<=0但未同步的状态
1234
+ * 从 Payment 模块获取最新的支付项数据
1176
1235
  */
1177
- needsManualSync() {
1178
- var _a;
1236
+ async needsManualSyncAsync() {
1179
1237
  try {
1180
1238
  if (!this.store.currentOrder || this.store.isOrderSynced) {
1181
1239
  return false;
1182
1240
  }
1183
- const remainingAmount = this.calculateRemainingAmount();
1241
+ const remainingAmount = await this.calculateRemainingAmountAsync();
1184
1242
  const remainingValue = parseFloat(remainingAmount);
1185
1243
  if (remainingValue > 0) {
1186
1244
  return false;
1187
1245
  }
1188
- const allPaymentsHaveVoucherId = this.store.currentOrder.payment && this.store.currentOrder.payment.length > 0 && this.store.currentOrder.payment.every(
1246
+ const currentPayments = await this.payment.getPaymentItemsAsync(
1247
+ this.store.currentOrder.uuid,
1248
+ false
1249
+ // 不包括已撤销的支付项
1250
+ );
1251
+ const allPaymentsHaveVoucherId = currentPayments.length > 0 && currentPayments.every(
1189
1252
  (item) => item.status !== "voided" && item.voucher_id
1190
1253
  );
1191
- console.log("[Checkout] needsManualSync 检查结果:", {
1254
+ console.log("[Checkout] needsManualSyncAsync 检查结果:", {
1192
1255
  orderUuid: this.store.currentOrder.uuid,
1193
1256
  isOrderSynced: this.store.isOrderSynced,
1194
1257
  remainingAmount,
1195
- hasPayments: ((_a = this.store.currentOrder.payment) == null ? void 0 : _a.length) > 0,
1258
+ hasPayments: currentPayments.length > 0,
1196
1259
  allPaymentsHaveVoucherId,
1197
- needsManualSync: allPaymentsHaveVoucherId
1260
+ needsManualSync: allPaymentsHaveVoucherId,
1261
+ paymentItems: currentPayments.map((p) => ({
1262
+ code: p.code,
1263
+ amount: p.amount,
1264
+ status: p.status,
1265
+ hasVoucherId: !!p.voucher_id
1266
+ }))
1198
1267
  });
1199
1268
  return allPaymentsHaveVoucherId;
1200
1269
  } catch (error) {
1201
- console.error("[Checkout] needsManualSync 检查失败:", error);
1270
+ console.error("[Checkout] needsManualSyncAsync 检查失败:", error);
1202
1271
  return false;
1203
1272
  }
1204
1273
  }
1205
1274
  /**
1206
1275
  * 手动同步订单到后端
1207
- *
1276
+ *
1208
1277
  * 用于强制同步订单到后端,特别适用于纯代金券支付完成的订单
1209
1278
  */
1210
1279
  async manualSyncOrderAsync() {
@@ -1225,7 +1294,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1225
1294
  orderUuid,
1226
1295
  orderId: oldOrderId,
1227
1296
  totalAmount: this.store.currentOrder.total_amount,
1228
- remainingAmount: this.calculateRemainingAmount()
1297
+ remainingAmount: await this.calculateRemainingAmountAsync()
1229
1298
  });
1230
1299
  const realOrderId = await this.syncOrderToBackendWithReturn(true);
1231
1300
  console.log("[Checkout] 手动同步订单完成:", {
@@ -1247,7 +1316,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1247
1316
  console.error("[Checkout] 严重警告:手动同步完成后订单ID仍为虚拟ID!");
1248
1317
  }
1249
1318
  if (realOrderId !== finalOrderId) {
1250
- console.error("[Checkout] 严重警告:返回的订单ID与存储的订单ID不一致!");
1319
+ console.error(
1320
+ "[Checkout] 严重警告:返回的订单ID与存储的订单ID不一致!"
1321
+ );
1251
1322
  }
1252
1323
  return {
1253
1324
  success: true,
@@ -1268,7 +1339,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1268
1339
  }
1269
1340
  /**
1270
1341
  * 获取当前订单备注
1271
- *
1342
+ *
1272
1343
  * @returns 当前订单的备注内容,如果没有则返回空字符串
1273
1344
  */
1274
1345
  getOrderNote() {
@@ -1280,7 +1351,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1280
1351
  }
1281
1352
  /**
1282
1353
  * 获取当前订单ID
1283
- *
1354
+ *
1284
1355
  * @returns 当前订单的ID,如果没有订单则返回null
1285
1356
  */
1286
1357
  getCurrentOrderId() {
@@ -1289,9 +1360,109 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1289
1360
  }
1290
1361
  return this.store.currentOrder.order_id;
1291
1362
  }
1363
+ /**
1364
+ * 获取当前订单是否已同步到后端
1365
+ *
1366
+ * @returns 当前订单是否已同步状态,如果没有订单则返回false
1367
+ */
1368
+ isCurrentOrderSynced() {
1369
+ if (!this.store.currentOrder) {
1370
+ console.log("[Checkout] 没有当前订单,同步状态为false");
1371
+ return false;
1372
+ }
1373
+ const syncStatus = this.store.isOrderSynced;
1374
+ console.log("[Checkout] 当前订单同步状态:", {
1375
+ orderUuid: this.store.currentOrder.uuid,
1376
+ orderId: this.store.currentOrder.order_id,
1377
+ isOrderSynced: syncStatus
1378
+ });
1379
+ return syncStatus;
1380
+ }
1381
+ /**
1382
+ * 取消当前本地订单
1383
+ *
1384
+ * 只能取消未同步到后端的本地订单,如果订单已同步则不能取消
1385
+ *
1386
+ * @param cancelReason 取消原因(可选)
1387
+ * @returns 取消结果
1388
+ */
1389
+ async cancelCurrentOrderAsync(cancelReason) {
1390
+ var _a, _b;
1391
+ try {
1392
+ console.log("[Checkout] 开始取消当前本地订单:", {
1393
+ hasCurrentOrder: !!this.store.currentOrder,
1394
+ orderUuid: (_a = this.store.currentOrder) == null ? void 0 : _a.uuid,
1395
+ orderId: (_b = this.store.currentOrder) == null ? void 0 : _b.order_id,
1396
+ isOrderSynced: this.store.isOrderSynced,
1397
+ cancelReason
1398
+ });
1399
+ if (!this.store.currentOrder) {
1400
+ console.log("[Checkout] 没有当前订单,无需取消");
1401
+ return {
1402
+ success: false,
1403
+ message: "没有当前订单可取消"
1404
+ };
1405
+ }
1406
+ const currentOrderUuid = this.store.currentOrder.uuid;
1407
+ const currentOrderId = this.store.currentOrder.order_id;
1408
+ const isOrderSynced = this.store.isOrderSynced;
1409
+ if (isOrderSynced) {
1410
+ console.log("[Checkout] 订单已同步到后端,不能取消:", {
1411
+ orderId: currentOrderId,
1412
+ orderUuid: currentOrderUuid
1413
+ });
1414
+ return {
1415
+ success: false,
1416
+ message: "订单已同步到后端,无法取消",
1417
+ orderId: currentOrderId
1418
+ };
1419
+ }
1420
+ console.log("[Checkout] 订单尚未同步,可以取消");
1421
+ try {
1422
+ console.log("[Checkout] 删除本地订单数据");
1423
+ await this.payment.deletePaymentOrderAsync(currentOrderUuid);
1424
+ console.log("[Checkout] 本地订单数据删除成功");
1425
+ } catch (error) {
1426
+ console.warn("[Checkout] 删除本地订单数据失败,但继续执行:", error);
1427
+ }
1428
+ console.log("[Checkout] 清理订单相关状态");
1429
+ this.store.currentOrder = void 0;
1430
+ this.store.localOrderData = void 0;
1431
+ this.store.stateAmount = "0.00";
1432
+ this.store.isOrderSynced = false;
1433
+ this.store.currentCustomer = void 0;
1434
+ this.payment.wallet.clearAllCache();
1435
+ console.log("[Checkout] 订单状态清理完成,currentOrder已释放");
1436
+ await this.core.effects.emit(import_types.CheckoutHooks.OnOrderCancelled, {
1437
+ orderUuid: currentOrderUuid,
1438
+ orderId: currentOrderId,
1439
+ cancelReason,
1440
+ wasSynced: false,
1441
+ // 只有未同步订单可以被取消
1442
+ timestamp: Date.now()
1443
+ });
1444
+ console.log("[Checkout] 本地订单取消完成:", {
1445
+ orderUuid: currentOrderUuid,
1446
+ orderId: currentOrderId,
1447
+ cancelReason
1448
+ });
1449
+ return {
1450
+ success: true,
1451
+ message: "本地订单已成功取消",
1452
+ orderId: currentOrderId
1453
+ };
1454
+ } catch (error) {
1455
+ console.error("[Checkout] 取消本地订单失败:", error);
1456
+ const errorMessage = error instanceof Error ? error.message : "未知错误";
1457
+ return {
1458
+ success: false,
1459
+ message: `取消订单失败: ${errorMessage}`
1460
+ };
1461
+ }
1462
+ }
1292
1463
  /**
1293
1464
  * 保存订单并稍后支付
1294
- *
1465
+ *
1295
1466
  * 将当前订单保存到后端,但排除代金券类支付项(voucher_id),
1296
1467
  * 适用于用户想要保存订单但稍后完成支付的场景
1297
1468
  */
@@ -1311,7 +1482,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1311
1482
  orderId: currentOrderId,
1312
1483
  totalAmount: this.store.currentOrder.total_amount
1313
1484
  });
1314
- const allPaymentItems = await this.payment.getPaymentItemsAsync(this.store.currentOrder.uuid);
1485
+ const allPaymentItems = await this.payment.getPaymentItemsAsync(
1486
+ this.store.currentOrder.uuid
1487
+ );
1315
1488
  const filteredPaymentItems = allPaymentItems.filter(
1316
1489
  (payment) => !payment.voucher_id || payment.voucher_id.trim() === ""
1317
1490
  );
@@ -1334,7 +1507,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1334
1507
  amount: item.amount
1335
1508
  }))
1336
1509
  });
1337
- const realOrderId = await this.syncOrderToBackendWithReturn(false, filteredPaymentItems);
1510
+ const realOrderId = await this.syncOrderToBackendWithReturn(
1511
+ false,
1512
+ filteredPaymentItems
1513
+ );
1338
1514
  console.log("[Checkout] 保存订单完成:", {
1339
1515
  orderUuid,
1340
1516
  oldOrderId: currentOrderId,
@@ -1367,7 +1543,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1367
1543
  }
1368
1544
  /**
1369
1545
  * 获取当前商店折扣金额
1370
- *
1546
+ *
1371
1547
  * @returns 当前的商店折扣金额,如果没有则返回0
1372
1548
  */
1373
1549
  getShopDiscount() {
@@ -1376,7 +1552,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1376
1552
  return this.store.localOrderData.shop_discount;
1377
1553
  }
1378
1554
  if (this.store.cartSummary) {
1379
- const shopDiscountItem = this.store.cartSummary.find((item) => item.key === "shop_discount");
1555
+ const shopDiscountItem = this.store.cartSummary.find(
1556
+ (item) => item.key === "shop_discount"
1557
+ );
1380
1558
  if (shopDiscountItem) {
1381
1559
  return shopDiscountItem.value;
1382
1560
  }
@@ -1385,9 +1563,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1385
1563
  }
1386
1564
  /**
1387
1565
  * 更新订单商店折扣
1388
- *
1566
+ *
1389
1567
  * 同时更新cartSummary和localOrderData中的shop_discount值
1390
- *
1568
+ *
1391
1569
  * @param discountAmount 商店折扣金额
1392
1570
  */
1393
1571
  async updateShopDiscountAsync(discountAmount) {
@@ -1400,7 +1578,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1400
1578
  newDiscount: discountAmount
1401
1579
  });
1402
1580
  if (this.store.cartSummary) {
1403
- const shopDiscountItem = this.store.cartSummary.find((item) => item.key === "shop_discount");
1581
+ const shopDiscountItem = this.store.cartSummary.find(
1582
+ (item) => item.key === "shop_discount"
1583
+ );
1404
1584
  if (shopDiscountItem) {
1405
1585
  shopDiscountItem.value = discountAmount;
1406
1586
  console.log("[Checkout] cartSummary 中的商店折扣已更新");
@@ -1421,7 +1601,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1421
1601
  console.warn("[Checkout] localOrderData 不存在,无法更新商店折扣");
1422
1602
  }
1423
1603
  if (this.store.currentOrder && this.store.cartSummary) {
1424
- const updatedAmountInfo = this.extractAmountFromCartSummary(this.store.cartSummary);
1604
+ const updatedAmountInfo = this.extractAmountFromCartSummary(
1605
+ this.store.cartSummary
1606
+ );
1425
1607
  console.log("[Checkout] 重新计算订单金额:", updatedAmountInfo);
1426
1608
  this.store.currentOrder.total_amount = updatedAmountInfo.totalAmount;
1427
1609
  this.store.currentOrder.expect_amount = updatedAmountInfo.totalAmount;
@@ -1439,13 +1621,16 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1439
1621
  });
1440
1622
  } catch (error) {
1441
1623
  console.error("[Checkout] 更新商店折扣失败:", error);
1442
- await this.handleError(error, import_types.CheckoutErrorType.ValidationFailed);
1624
+ await this.handleError(
1625
+ error,
1626
+ import_types.CheckoutErrorType.ValidationFailed
1627
+ );
1443
1628
  throw error;
1444
1629
  }
1445
1630
  }
1446
1631
  /**
1447
1632
  * 更新订单备注
1448
- *
1633
+ *
1449
1634
  * @param note 订单备注内容
1450
1635
  */
1451
1636
  async updateOrderNoteAsync(note) {
@@ -1466,12 +1651,17 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1466
1651
  this.store.localOrderData.shop_note = note;
1467
1652
  if (this.store.currentOrder) {
1468
1653
  try {
1469
- const orderInPayment = await this.payment.getPaymentOrderByUuidAsync(this.store.currentOrder.uuid);
1654
+ const orderInPayment = await this.payment.getPaymentOrderByUuidAsync(
1655
+ this.store.currentOrder.uuid
1656
+ );
1470
1657
  if (orderInPayment && orderInPayment.note !== void 0) {
1471
1658
  console.log("[Checkout] 同步备注到Payment模块的订单数据中");
1472
1659
  }
1473
1660
  } catch (syncError) {
1474
- console.warn("[Checkout] 同步备注到Payment模块失败,但本地更新成功:", syncError);
1661
+ console.warn(
1662
+ "[Checkout] 同步备注到Payment模块失败,但本地更新成功:",
1663
+ syncError
1664
+ );
1475
1665
  }
1476
1666
  }
1477
1667
  await this.core.effects.emit(import_types.CheckoutHooks.OnOrderNoteChanged, {
@@ -1486,7 +1676,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1486
1676
  });
1487
1677
  } catch (error) {
1488
1678
  console.error("[Checkout] 更新订单备注失败:", error);
1489
- await this.handleError(error, import_types.CheckoutErrorType.ValidationFailed);
1679
+ await this.handleError(
1680
+ error,
1681
+ import_types.CheckoutErrorType.ValidationFailed
1682
+ );
1490
1683
  throw error;
1491
1684
  }
1492
1685
  }
@@ -1552,7 +1745,10 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1552
1745
  import_types.CheckoutErrorType.PaymentFailed,
1553
1746
  data.error || "支付同步失败"
1554
1747
  );
1555
- await this.handleError(error instanceof Error ? error : new Error(String(error)), import_types.CheckoutErrorType.PaymentFailed);
1748
+ await this.handleError(
1749
+ error instanceof Error ? error : new Error(String(error)),
1750
+ import_types.CheckoutErrorType.PaymentFailed
1751
+ );
1556
1752
  await this.core.effects.emit(import_types.CheckoutHooks.OnPaymentFailed, {
1557
1753
  orderUuid: data.orderUuid,
1558
1754
  paymentMethodCode: "",
@@ -1570,6 +1766,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1570
1766
  * 验证本地订单数据
1571
1767
  */
1572
1768
  async validateLocalOrderData(orderData) {
1769
+ var _a;
1573
1770
  const errors = [];
1574
1771
  if (!orderData.type) {
1575
1772
  errors.push("订单类型不能为空");
@@ -1577,7 +1774,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1577
1774
  if (!orderData.platform) {
1578
1775
  errors.push("平台信息不能为空");
1579
1776
  }
1580
- if (!orderData.bookings || orderData.bookings.length === 0) {
1777
+ if ((!orderData.bookings || orderData.bookings.length === 0) && !((_a = orderData == null ? void 0 : orderData.relation_products) == null ? void 0 : _a.length)) {
1581
1778
  errors.push("预订信息不能为空");
1582
1779
  }
1583
1780
  if (orderData.bookings) {
@@ -1608,7 +1805,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1608
1805
  }
1609
1806
  /**
1610
1807
  * 格式化日期时间为 YYYY-MM-DD hh:mm:ss 格式
1611
- *
1808
+ *
1612
1809
  * @param date 要格式化的日期对象
1613
1810
  * @returns 格式化后的日期时间字符串
1614
1811
  */
@@ -1700,45 +1897,54 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1700
1897
  return total.toFixed(2);
1701
1898
  }
1702
1899
  /**
1703
- * 计算已支付金额
1900
+ * 计算已支付金额(从 Payment 模块获取最新数据)
1704
1901
  */
1705
- calculatePaidAmount() {
1902
+ async calculatePaidAmountAsync() {
1706
1903
  if (!this.store.currentOrder) {
1707
- console.log("[Checkout] calculatePaidAmount: 没有当前订单");
1904
+ console.log("[Checkout] calculatePaidAmountAsync: 没有当前订单");
1905
+ return "0.00";
1906
+ }
1907
+ try {
1908
+ const payments = await this.payment.getPaymentItemsAsync(
1909
+ this.store.currentOrder.uuid,
1910
+ false
1911
+ // 不包括已撤销的支付项
1912
+ );
1913
+ console.log("[Checkout] calculatePaidAmountAsync: 支付项详情:", {
1914
+ paymentCount: payments.length,
1915
+ payments: payments.map((p) => ({
1916
+ uuid: p.uuid,
1917
+ amount: p.amount,
1918
+ code: p.code,
1919
+ status: p.status
1920
+ }))
1921
+ });
1922
+ const paidAmount = payments.filter((payment) => payment.status !== "voided").reduce((sum, payment) => {
1923
+ const amount = parseFloat(payment.amount || "0");
1924
+ console.log(`[Checkout] 计算支付项: ${payment.code} = ${amount}`);
1925
+ return sum + amount;
1926
+ }, 0);
1927
+ const result = paidAmount.toFixed(2);
1928
+ console.log("[Checkout] calculatePaidAmountAsync: 计算结果 =", result);
1929
+ return result;
1930
+ } catch (error) {
1931
+ console.error("[Checkout] calculatePaidAmountAsync 失败:", error);
1708
1932
  return "0.00";
1709
1933
  }
1710
- const payments = this.store.currentOrder.payment || [];
1711
- console.log("[Checkout] calculatePaidAmount: 支付项详情:", {
1712
- paymentCount: payments.length,
1713
- payments: payments.map((p) => ({
1714
- uuid: p.uuid,
1715
- amount: p.amount,
1716
- code: p.code,
1717
- status: p.status
1718
- }))
1719
- });
1720
- const paidAmount = payments.filter((payment) => payment.status !== "voided").reduce((sum, payment) => {
1721
- const amount = parseFloat(payment.amount || "0");
1722
- console.log(`[Checkout] 计算支付项: ${payment.code} = ${amount}`);
1723
- return sum + amount;
1724
- }, 0);
1725
- const result = paidAmount.toFixed(2);
1726
- console.log("[Checkout] calculatePaidAmount: 计算结果 =", result);
1727
- return result;
1728
1934
  }
1729
1935
  /**
1730
- * 计算剩余未支付金额
1936
+ * 计算剩余未支付金额(从 Payment 模块获取最新数据)
1731
1937
  */
1732
- calculateRemainingAmount() {
1938
+ async calculateRemainingAmountAsync() {
1733
1939
  if (!this.store.currentOrder) {
1734
- console.log("[Checkout] calculateRemainingAmount: 没有当前订单");
1940
+ console.log("[Checkout] calculateRemainingAmountAsync: 没有当前订单");
1735
1941
  return "0.00";
1736
1942
  }
1737
1943
  const totalAmount = parseFloat(this.store.currentOrder.total_amount || "0");
1738
- const paidAmount = parseFloat(this.calculatePaidAmount());
1944
+ const paidAmount = parseFloat(await this.calculatePaidAmountAsync());
1739
1945
  const remainingAmount = totalAmount - paidAmount;
1740
1946
  const result = Math.max(0, remainingAmount).toFixed(2);
1741
- console.log("[Checkout] calculateRemainingAmount: 计算详情:", {
1947
+ console.log("[Checkout] calculateRemainingAmountAsync: 计算详情:", {
1742
1948
  orderUuid: this.store.currentOrder.uuid,
1743
1949
  totalAmount: totalAmount.toFixed(2),
1744
1950
  paidAmount: paidAmount.toFixed(2),
@@ -1753,7 +1959,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1753
1959
  async updateStateAmountToRemaining() {
1754
1960
  var _a;
1755
1961
  try {
1756
- const remainingAmount = this.calculateRemainingAmount();
1962
+ const remainingAmount = await this.calculateRemainingAmountAsync();
1757
1963
  const currentStateAmount = this.store.stateAmount;
1758
1964
  console.log("[Checkout] updateStateAmountToRemaining: 状态检查:", {
1759
1965
  calculatedRemainingAmount: remainingAmount,
@@ -1785,20 +1991,19 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1785
1991
  }
1786
1992
  /**
1787
1993
  * 检查订单支付是否完成
1788
- *
1994
+ *
1789
1995
  * 当剩余待付款金额 <= 0 时,触发订单支付完成事件
1790
1996
  */
1791
1997
  async checkOrderPaymentCompletion() {
1792
- var _a, _b;
1793
1998
  try {
1794
1999
  if (!this.store.currentOrder) {
1795
2000
  return;
1796
2001
  }
1797
- const remainingAmount = this.calculateRemainingAmount();
2002
+ const remainingAmount = await this.calculateRemainingAmountAsync();
1798
2003
  const remainingValue = parseFloat(remainingAmount);
1799
2004
  if (remainingValue <= 0) {
1800
2005
  const totalAmount = this.store.currentOrder.total_amount;
1801
- const paidAmount = this.calculatePaidAmount();
2006
+ const paidAmount = await this.calculatePaidAmountAsync();
1802
2007
  console.log("[Checkout] 检测到订单支付完成:", {
1803
2008
  orderUuid: this.store.currentOrder.uuid,
1804
2009
  orderId: this.store.currentOrder.order_id,
@@ -1807,13 +2012,18 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1807
2012
  remainingAmount,
1808
2013
  isOrderSynced: this.store.isOrderSynced
1809
2014
  });
1810
- const allPaymentsHaveVoucherId = this.store.currentOrder.payment && this.store.currentOrder.payment.length > 0 && this.store.currentOrder.payment.every(
2015
+ const currentPayments = await this.payment.getPaymentItemsAsync(
2016
+ this.store.currentOrder.uuid,
2017
+ false
2018
+ // 不包括已撤销的支付项
2019
+ );
2020
+ const allPaymentsHaveVoucherId = currentPayments.length > 0 && currentPayments.every(
1811
2021
  (item) => item.status !== "voided" && item.voucher_id
1812
2022
  );
1813
2023
  console.log("[Checkout] 支付项voucher_id检查:", {
1814
- paymentCount: ((_a = this.store.currentOrder.payment) == null ? void 0 : _a.length) || 0,
2024
+ paymentCount: currentPayments.length,
1815
2025
  allHaveVoucherId: allPaymentsHaveVoucherId,
1816
- paymentItems: (_b = this.store.currentOrder.payment) == null ? void 0 : _b.map((p) => ({
2026
+ paymentItems: currentPayments.map((p) => ({
1817
2027
  uuid: p.uuid,
1818
2028
  code: p.code,
1819
2029
  amount: p.amount,
@@ -1821,13 +2031,11 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1821
2031
  status: p.status
1822
2032
  }))
1823
2033
  });
1824
- if (!this.store.isOrderSynced) {
1825
- if (allPaymentsHaveVoucherId) {
1826
- console.log("[Checkout] 所有支付项均为代金券类型,跳过订单同步");
1827
- } else {
1828
- console.log("[Checkout] 支付完成但订单未同步,开始同步订单到后端...");
1829
- await this.syncOrderToBackend();
1830
- }
2034
+ if (allPaymentsHaveVoucherId) {
2035
+ console.log("[Checkout] 所有支付项均为代金券类型,跳过订单同步");
2036
+ } else {
2037
+ console.log("[Checkout] 支付完成但订单未同步,开始同步订单到后端...");
2038
+ await this.syncOrderToBackend();
1831
2039
  }
1832
2040
  await this.core.effects.emit(import_types.CheckoutHooks.OnOrderPaymentCompleted, {
1833
2041
  orderUuid: this.store.currentOrder.uuid,
@@ -1844,18 +2052,20 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1844
2052
  }
1845
2053
  /**
1846
2054
  * 判断支付方式是否需要同步订单到后端
1847
- *
2055
+ *
1848
2056
  * 现金支付(CASHMANUAL)和自定义支付不需要同步,其他支付方式需要同步
1849
- *
2057
+ *
1850
2058
  * @param paymentCode 支付方式代码
1851
- * @param paymentType 支付方式类型
2059
+ * @param paymentType 支付方式类型
1852
2060
  * @returns 是否需要同步订单
1853
2061
  */
1854
2062
  shouldSyncOrderForPayment(paymentCode, paymentType) {
1855
2063
  const codeUpper = (paymentCode == null ? void 0 : paymentCode.toUpperCase()) || "";
1856
2064
  const typeUpper = (paymentType == null ? void 0 : paymentType.toUpperCase()) || "";
1857
2065
  const cashIdentifiers = ["CASHMANUAL", "CASH", "MANUAL"];
1858
- if (cashIdentifiers.some((id) => codeUpper.includes(id) || typeUpper.includes(id))) {
2066
+ if (cashIdentifiers.some(
2067
+ (id) => codeUpper.includes(id) || typeUpper.includes(id)
2068
+ )) {
1859
2069
  return false;
1860
2070
  }
1861
2071
  if (paymentCode === import_types2.PaymentMethodType.Cash || paymentType === import_types2.PaymentMethodType.Cash) {
@@ -1868,12 +2078,12 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1868
2078
  }
1869
2079
  /**
1870
2080
  * 同步订单到后端
1871
- *
2081
+ *
1872
2082
  * 调用后端 /order/checkout 接口创建真实订单
1873
2083
  */
1874
2084
  /**
1875
2085
  * 判断订单ID是否为本地生成的虚拟ID
1876
- *
2086
+ *
1877
2087
  * @param orderId 订单ID
1878
2088
  * @returns true 表示是虚拟ID,false 表示是真实的后端ID
1879
2089
  */
@@ -1882,7 +2092,7 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1882
2092
  }
1883
2093
  /**
1884
2094
  * 同步订单到后端并返回真实订单ID
1885
- *
2095
+ *
1886
2096
  * @param isManual 是否为手动同步,默认为 false
1887
2097
  * @param customPaymentItems 自定义支付项列表,如果提供则使用此列表而不是从数据库获取
1888
2098
  * @returns 后端返回的真实订单ID
@@ -1964,18 +2174,23 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
1964
2174
  // surcharge_fee: this.otherParams.surcharge_fee,
1965
2175
  // surcharges: ,
1966
2176
  note: this.store.localOrderData.shop_note
1967
- // deposit_amount:
2177
+ // deposit_amount:
1968
2178
  };
1969
2179
  if (isUpdateOperation) {
1970
2180
  if (this.isVirtualOrderId(currentOrderId)) {
1971
- console.error("[Checkout] 数据不一致警告:更新操作但订单ID仍为虚拟ID!", {
1972
- currentOrderId,
1973
- isOrderSynced: this.store.isOrderSynced,
1974
- reason,
1975
- orderUuid: this.store.currentOrder.uuid
1976
- });
2181
+ console.error(
2182
+ "[Checkout] 数据不一致警告:更新操作但订单ID仍为虚拟ID!",
2183
+ {
2184
+ currentOrderId,
2185
+ isOrderSynced: this.store.isOrderSynced,
2186
+ reason,
2187
+ orderUuid: this.store.currentOrder.uuid
2188
+ }
2189
+ );
1977
2190
  console.log("[Checkout] 尝试数据修复:暂时不包含order_id,让后端处理");
1978
- console.log("[Checkout] 注意:这次调用将作为创建操作处理,但后续会修复数据一致性");
2191
+ console.log(
2192
+ "[Checkout] 注意:这次调用将作为创建操作处理,但后续会修复数据一致性"
2193
+ );
1979
2194
  } else {
1980
2195
  orderParams.order_id = currentOrderId;
1981
2196
  console.log(`[Checkout] 更新订单操作,包含订单ID: ${currentOrderId}`);
@@ -2029,9 +2244,14 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2029
2244
  totalAmount: updatedOrder.total_amount
2030
2245
  });
2031
2246
  this.store.currentOrder = updatedOrder;
2032
- console.log("[Checkout] 订单ID替换成功,当前订单ID:", this.store.currentOrder.order_id);
2247
+ console.log(
2248
+ "[Checkout] 订单ID替换成功,当前订单ID:",
2249
+ this.store.currentOrder.order_id
2250
+ );
2033
2251
  } else {
2034
- console.error("[Checkout] Payment模块返回空订单,订单ID替换失败,开始手动替换");
2252
+ console.error(
2253
+ "[Checkout] Payment模块返回空订单,订单ID替换失败,开始手动替换"
2254
+ );
2035
2255
  const beforeManualUpdate = this.store.currentOrder.order_id;
2036
2256
  this.store.currentOrder.order_id = realOrderId;
2037
2257
  console.log("[Checkout] 手动设置订单ID:", {
@@ -2064,7 +2284,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2064
2284
  是否同步: this.store.isOrderSynced
2065
2285
  });
2066
2286
  if (finalIsVirtual && !isUpdateOperation) {
2067
- console.warn("[Checkout] 警告:订单创建后,当前订单ID仍然是虚拟ID,可能存在问题");
2287
+ console.warn(
2288
+ "[Checkout] 警告:订单创建后,当前订单ID仍然是虚拟ID,可能存在问题"
2289
+ );
2068
2290
  }
2069
2291
  return realOrderId;
2070
2292
  }
@@ -2074,7 +2296,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2074
2296
  } catch (error) {
2075
2297
  console.error("[Checkout] 同步订单到后端失败:", error);
2076
2298
  await this.handleError(
2077
- new Error(`订单同步失败: ${error instanceof Error ? error.message : String(error)}`),
2299
+ new Error(
2300
+ `订单同步失败: ${error instanceof Error ? error.message : String(error)}`
2301
+ ),
2078
2302
  import_types.CheckoutErrorType.OrderCreationFailed
2079
2303
  );
2080
2304
  }
@@ -2116,9 +2340,9 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2116
2340
  }
2117
2341
  /**
2118
2342
  * 通过订单ID编辑订单备注
2119
- *
2343
+ *
2120
2344
  * 用于修改已同步到后端的订单备注,通常在支付成功后的弹窗中使用
2121
- *
2345
+ *
2122
2346
  * @param orderId 后端订单ID
2123
2347
  * @param note 新的订单备注
2124
2348
  * @returns 修改结果
@@ -2137,9 +2361,12 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2137
2361
  orderId
2138
2362
  };
2139
2363
  }
2140
- const response = await this.request.put(`/shop/order/order/${orderId}/note`, {
2141
- note
2142
- });
2364
+ const response = await this.request.put(
2365
+ `/shop/order/order/${orderId}/note`,
2366
+ {
2367
+ note
2368
+ }
2369
+ );
2143
2370
  console.log("[Checkout] 订单备注编辑响应:", {
2144
2371
  orderId,
2145
2372
  status: response.status,
@@ -2185,6 +2412,100 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2185
2412
  };
2186
2413
  }
2187
2414
  }
2415
+ /**
2416
+ * 发送客户支付链接邮件
2417
+ *
2418
+ * 向指定邮箱发送订单支付提醒邮件
2419
+ *
2420
+ * @param params 发送参数
2421
+ * @returns 发送结果
2422
+ */
2423
+ async sendCustomerPayLinkAsync(params) {
2424
+ try {
2425
+ console.log("[Checkout] 开始发送客户支付链接邮件:", {
2426
+ orderIds: params.order_ids,
2427
+ emails: params.emails,
2428
+ notifyAction: params.notify_action || "order_payment_reminder"
2429
+ });
2430
+ if (!params.order_ids || params.order_ids.length === 0) {
2431
+ return {
2432
+ success: false,
2433
+ message: "订单ID列表不能为空"
2434
+ };
2435
+ }
2436
+ if (!params.emails || params.emails.length === 0) {
2437
+ return {
2438
+ success: false,
2439
+ message: "邮箱地址列表不能为空"
2440
+ };
2441
+ }
2442
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
2443
+ const invalidEmails = params.emails.filter(
2444
+ (email) => !emailRegex.test(email)
2445
+ );
2446
+ if (invalidEmails.length > 0) {
2447
+ return {
2448
+ success: false,
2449
+ message: `邮箱格式无效: ${invalidEmails.join(", ")}`
2450
+ };
2451
+ }
2452
+ const requestBody = {
2453
+ order_ids: params.order_ids,
2454
+ notify_action: params.notify_action || "order_payment_reminder",
2455
+ emails: params.emails
2456
+ };
2457
+ console.log("[Checkout] 发送支付链接邮件请求参数:", requestBody);
2458
+ const response = await this.request.post(
2459
+ "/order/batch-email",
2460
+ requestBody
2461
+ );
2462
+ console.log("[Checkout] 支付链接邮件发送响应:", {
2463
+ status: response.status,
2464
+ message: response.message,
2465
+ data: response.data,
2466
+ response
2467
+ });
2468
+ if (response.status === true || response.status === 200) {
2469
+ console.log("[Checkout] 支付链接邮件发送成功");
2470
+ return {
2471
+ success: true,
2472
+ message: response.message || "支付链接邮件发送成功"
2473
+ };
2474
+ } else {
2475
+ const errorMessage = response.message || "支付链接邮件发送失败";
2476
+ console.error("[Checkout] 支付链接邮件发送失败:", errorMessage);
2477
+ return {
2478
+ success: false,
2479
+ message: errorMessage
2480
+ };
2481
+ }
2482
+ } catch (error) {
2483
+ console.error("[Checkout] 发送客户支付链接邮件失败:", error);
2484
+ const errorMessage = error instanceof Error ? error.message : "网络错误或服务器异常";
2485
+ return {
2486
+ success: false,
2487
+ message: `发送支付链接邮件失败: ${errorMessage}`
2488
+ };
2489
+ }
2490
+ }
2491
+ /**
2492
+ * 金额舍入
2493
+ *
2494
+ * @param amount 原始金额
2495
+ * @returns 舍入结果详情,包含原始金额、舍入后金额和舍入差额
2496
+ */
2497
+ async roundAmountAsync(amount) {
2498
+ var _a, _b;
2499
+ const result = await this.payment.roundAmountAsync(
2500
+ amount,
2501
+ (_a = this.otherParams.order_rounding_setting) == null ? void 0 : _a.interval,
2502
+ (_b = this.otherParams.order_rounding_setting) == null ? void 0 : _b.type
2503
+ );
2504
+ console.log(
2505
+ `[Checkout] 金额舍入完成 - 原始: ${result.originalAmount}, 舍入后: ${result.roundedAmount}, 差额: ${result.roundingDifference}`
2506
+ );
2507
+ return result;
2508
+ }
2188
2509
  async destroy() {
2189
2510
  var _a, _b, _c, _d;
2190
2511
  this.payment.wallet.clearAllCache();
@@ -2194,6 +2515,67 @@ var CheckoutImpl = class extends import_BaseModule.BaseModule {
2194
2515
  this.core.unregisterModule(this);
2195
2516
  console.log("[Checkout] 已销毁");
2196
2517
  }
2518
+ /**
2519
+ * 重置 store 状态
2520
+ *
2521
+ * 在创建新订单前调用,确保状态完全干净
2522
+ */
2523
+ async resetStoreStateAsync() {
2524
+ try {
2525
+ const prevOrderInfo = this.store.currentOrder ? {
2526
+ uuid: this.store.currentOrder.uuid,
2527
+ orderId: this.store.currentOrder.order_id
2528
+ } : null;
2529
+ console.log("[Checkout] 重置 store 状态,准备创建新订单", prevOrderInfo);
2530
+ this.store.currentOrder = void 0;
2531
+ this.store.localOrderData = void 0;
2532
+ this.store.cartSummary = void 0;
2533
+ this.store.stateAmount = "0.00";
2534
+ this.store.isOrderSynced = false;
2535
+ this.store.currentCustomer = void 0;
2536
+ this.store.lastError = void 0;
2537
+ this.store.cartItems = [];
2538
+ await this.setStatus(import_types.CheckoutStatus.Ready);
2539
+ await this.setStep(import_types.CheckoutStep.OrderConfirmation);
2540
+ this.payment.wallet.clearAllCache();
2541
+ console.log("[Checkout] Store 状态重置完成");
2542
+ if (prevOrderInfo) {
2543
+ await this.core.effects.emit(import_types.CheckoutHooks.OnOrderCleared, {
2544
+ previousOrder: prevOrderInfo,
2545
+ timestamp: Date.now()
2546
+ });
2547
+ }
2548
+ } catch (error) {
2549
+ console.error("[Checkout] 重置 store 状态失败:", error);
2550
+ }
2551
+ }
2552
+ /**
2553
+ * 手动清理已完成的订单状态(公开方法)
2554
+ *
2555
+ * 供UI层调用的公开方法,用于手动清理订单状态
2556
+ *
2557
+ * @returns 清理结果
2558
+ */
2559
+ async clearCompletedOrderAsync() {
2560
+ try {
2561
+ const prevOrderInfo = this.store.currentOrder ? {
2562
+ uuid: this.store.currentOrder.uuid,
2563
+ orderId: this.store.currentOrder.order_id
2564
+ } : null;
2565
+ await this.resetStoreStateAsync();
2566
+ return {
2567
+ success: true,
2568
+ message: prevOrderInfo ? "订单状态已成功清理" : "没有需要清理的订单状态",
2569
+ clearedOrder: prevOrderInfo
2570
+ };
2571
+ } catch (error) {
2572
+ console.error("[Checkout] 手动清理订单状态失败:", error);
2573
+ return {
2574
+ success: false,
2575
+ message: error instanceof Error ? error.message : "清理失败"
2576
+ };
2577
+ }
2578
+ }
2197
2579
  };
2198
2580
  // Annotate the CommonJS export names for ESM import in node:
2199
2581
  0 && (module.exports = {