diff --git a/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go index 6f0a30f..dc6c170 100644 --- a/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go +++ b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go @@ -18,11 +18,14 @@ import ( ) const ( - PaymentPlatformAlipay = "alipay" - PaymentPlatformWechat = "wechat" - PaymentPlatformEasyPay = "easypay_alipay" - OrderStatusPaid = "paid" - RefundNoPrefix = "refund-" + PaymentPlatformAlipay = "alipay" + PaymentPlatformWechat = "wechat" + PaymentPlatformEasyPay = "easypay_alipay" + PaymentPlatformYunYinSignPay = "yunyinSignPay" + PaymentPlatformYunYinSignPayWechat = "yunyinSignPay_wechat" + PaymentPlatformYunYinSignPayAlipay = "yunyinSignPay_alipay" + OrderStatusPaid = "paid" + RefundNoPrefix = "refund-" ) type AdminRefundOrderLogic struct { @@ -53,6 +56,8 @@ func (l *AdminRefundOrderLogic) AdminRefundOrder(req *types.AdminRefundOrderReq) return l.handleWechatRefund(order, req) case PaymentPlatformEasyPay: return l.handleEasyPayRefund(order, req) + case PaymentPlatformYunYinSignPay, PaymentPlatformYunYinSignPayWechat, PaymentPlatformYunYinSignPayAlipay: + return l.handleYunYinSignPayRefund(order, req) default: return nil, errors.Wrapf(xerr.NewErrMsg("不支持的支付平台"), "AdminRefundOrder, 不支持的支付平台: %s", order.PaymentPlatform) } @@ -167,6 +172,80 @@ func (l *AdminRefundOrderLogic) handleEasyPayRefund(order *model.Order, req *typ }, nil } +// handleYunYinSignPayRefund 处理云印签支付退款 +func (l *AdminRefundOrderLogic) handleYunYinSignPayRefund(order *model.Order, req *types.AdminRefundOrderReq) (*types.AdminRefundOrderResp, error) { + // 检查云印签支付服务是否启用 + if l.svcCtx.YunYinSignPayService == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 云印签支付服务未启用") + } + + // 查询云印签订单获取参与方ID + yunyinOrder, err := l.svcCtx.YunyinSignPayOrderModel.FindOneByOrderId(l.ctx, order.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminRefundOrder, 查询云印签订单失败, 订单ID: %s, 错误: %v", order.Id, err) + } + + // 获取参与方ID(ParticipantId 是 string 类型,需要转换为 int64) + var participateId int64 + if yunyinOrder.ParticipantId != "" { + // 尝试将字符串转换为int64 + if _, parseErr := fmt.Sscanf(yunyinOrder.ParticipantId, "%d", &participateId); parseErr != nil { + logx.Errorf("解析参与方ID失败,订单ID: %s, ParticipantId: %s, 错误: %v", order.Id, yunyinOrder.ParticipantId, parseErr) + // 如果解析失败,participateId 保持为 0,使用订单号退款 + } else { + logx.Infof("成功解析参与方ID,订单ID: %s, ParticipantId: %s, participateId: %d", order.Id, yunyinOrder.ParticipantId, participateId) + } + } + + // 调用云印签退款接口 + refundErr := l.svcCtx.YunYinSignPayService.RefundPayeeBill( + l.ctx, + order.OrderNo, + participateId, + req.RefundAmount, + req.RefundReason, + ) + if refundErr != nil { + // 云印签退款失败,创建失败记录但不更新订单状态 + refundNo := l.generateRefundNo(order.OrderNo) + createErr := l.createRefundRecordOnly(order, req, refundNo, "", model.OrderRefundStatusFailed) + if createErr != nil { + logx.Errorf("创建云印签退款失败记录时出错: %v", createErr) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 云印签退款失败 err: %v", refundErr) + } + + // 云印签退款成功,创建成功记录 + refundNo := l.generateRefundNo(order.OrderNo) + // 检查是否全额退款 + isFullRefund := req.RefundAmount >= order.Amount-0.01 // 允许1分钱的误差 + + var orderStatus string + if isFullRefund { + orderStatus = model.OrderStatusRefunded + // 更新云印签订单表的支付状态为已退款(2) + yunyinOrder.PayStatus = 2 + if _, updateErr := l.svcCtx.YunyinSignPayOrderModel.Update(l.ctx, nil, yunyinOrder); updateErr != nil { + logx.Errorf("更新云印签订单状态失败: %v", updateErr) + } + } else { + // 部分退款保持已支付状态 + orderStatus = model.OrderStatusPaid + } + + // 云印签退款是异步的,但API返回成功表示申请已提交,标记为成功 + err = l.createRefundRecordAndUpdateOrder(order, req, refundNo, "", orderStatus, model.OrderRefundStatusSuccess) + if err != nil { + return nil, err + } + + return &types.AdminRefundOrderResp{ + Status: orderStatus, + RefundNo: refundNo, + Amount: req.RefundAmount, + }, nil +} + // createRefundRecordAndUpdateOrder 创建退款记录并更新订单状态 func (l *AdminRefundOrderLogic) createRefundRecordAndUpdateOrder(order *model.Order, req *types.AdminRefundOrderReq, refundNo, platformRefundId, orderStatus, refundStatus string) error { return l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {