@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.
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Payment/index.d.ts +3 -3
- package/dist/modules/Payment/index.js +74 -10
- package/dist/modules/Payment/types.d.ts +24 -3
- package/dist/modules/Payment/types.js +9 -1
- package/dist/modules/Payment/utils.js +1 -1
- package/dist/modules/Payment/walletpass.d.ts +5 -2
- package/dist/modules/Payment/walletpass.js +63 -11
- package/dist/solution/BookingTicket/index.d.ts +8 -0
- package/dist/solution/BookingTicket/index.js +27 -3
- package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +6 -0
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +43 -28
- package/dist/solution/Checkout/index.d.ts +73 -8
- package/dist/solution/Checkout/index.js +1540 -926
- package/dist/solution/Checkout/types.d.ts +79 -3
- package/dist/solution/Checkout/types.js +6 -0
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Payment/index.d.ts +3 -3
- package/lib/modules/Payment/index.js +30 -5
- package/lib/modules/Payment/types.d.ts +24 -3
- package/lib/modules/Payment/types.js +1 -1
- package/lib/modules/Payment/utils.js +1 -1
- package/lib/modules/Payment/walletpass.d.ts +5 -2
- package/lib/modules/Payment/walletpass.js +30 -2
- package/lib/solution/BookingTicket/index.d.ts +8 -0
- package/lib/solution/BookingTicket/index.js +23 -2
- package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +6 -0
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +21 -14
- package/lib/solution/Checkout/index.d.ts +73 -8
- package/lib/solution/Checkout/index.js +582 -200
- package/lib/solution/Checkout/types.d.ts +79 -3
- package/lib/solution/Checkout/types.js +2 -0
- 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(
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
|
512
|
-
const remainingAmount = this.
|
|
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
|
-
|
|
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
|
-
|
|
540
|
-
|
|
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(
|
|
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(
|
|
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) => ({
|
|
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(
|
|
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
|
-
*
|
|
826
|
-
*
|
|
870
|
+
*
|
|
871
|
+
* 优先使用 store 中的缓存数据,避免重复接口调用。
|
|
872
|
+
* 如果 store 中没有数据,则调用 Payment 模块的方法获取。
|
|
873
|
+
*
|
|
827
874
|
* @returns 支付方式列表
|
|
828
875
|
*/
|
|
829
876
|
async getPaymentMethodsAsync() {
|
|
830
|
-
|
|
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
|
|
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(
|
|
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(
|
|
966
|
-
|
|
967
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
1031
|
-
|
|
1032
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
1209
|
+
console.log(
|
|
1210
|
+
"[Checkout] 订单客户信息更新成功:",
|
|
1211
|
+
this.store.currentCustomer
|
|
1212
|
+
);
|
|
1158
1213
|
} catch (error) {
|
|
1159
1214
|
console.error("[Checkout] 更新订单客户信息失败:", error);
|
|
1160
|
-
await this.handleError(
|
|
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
|
-
|
|
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.
|
|
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
|
|
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]
|
|
1254
|
+
console.log("[Checkout] needsManualSyncAsync 检查结果:", {
|
|
1192
1255
|
orderUuid: this.store.currentOrder.uuid,
|
|
1193
1256
|
isOrderSynced: this.store.isOrderSynced,
|
|
1194
1257
|
remainingAmount,
|
|
1195
|
-
hasPayments:
|
|
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]
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
1902
|
+
async calculatePaidAmountAsync() {
|
|
1706
1903
|
if (!this.store.currentOrder) {
|
|
1707
|
-
console.log("[Checkout]
|
|
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
|
-
|
|
1938
|
+
async calculateRemainingAmountAsync() {
|
|
1733
1939
|
if (!this.store.currentOrder) {
|
|
1734
|
-
console.log("[Checkout]
|
|
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.
|
|
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]
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
|
2024
|
+
paymentCount: currentPayments.length,
|
|
1815
2025
|
allHaveVoucherId: allPaymentsHaveVoucherId,
|
|
1816
|
-
paymentItems:
|
|
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 (
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
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(
|
|
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(
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
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(
|
|
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(
|
|
2247
|
+
console.log(
|
|
2248
|
+
"[Checkout] 订单ID替换成功,当前订单ID:",
|
|
2249
|
+
this.store.currentOrder.order_id
|
|
2250
|
+
);
|
|
2033
2251
|
} else {
|
|
2034
|
-
console.error(
|
|
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(
|
|
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(
|
|
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(
|
|
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 = {
|