f
This commit is contained in:
@@ -21,6 +21,9 @@ const (
|
|||||||
PaymentPlatformAlipay = "alipay"
|
PaymentPlatformAlipay = "alipay"
|
||||||
PaymentPlatformWechat = "wechat"
|
PaymentPlatformWechat = "wechat"
|
||||||
PaymentPlatformEasyPay = "easypay_alipay"
|
PaymentPlatformEasyPay = "easypay_alipay"
|
||||||
|
PaymentPlatformYunYinSignPay = "yunyinSignPay"
|
||||||
|
PaymentPlatformYunYinSignPayWechat = "yunyinSignPay_wechat"
|
||||||
|
PaymentPlatformYunYinSignPayAlipay = "yunyinSignPay_alipay"
|
||||||
OrderStatusPaid = "paid"
|
OrderStatusPaid = "paid"
|
||||||
RefundNoPrefix = "refund-"
|
RefundNoPrefix = "refund-"
|
||||||
)
|
)
|
||||||
@@ -53,6 +56,8 @@ func (l *AdminRefundOrderLogic) AdminRefundOrder(req *types.AdminRefundOrderReq)
|
|||||||
return l.handleWechatRefund(order, req)
|
return l.handleWechatRefund(order, req)
|
||||||
case PaymentPlatformEasyPay:
|
case PaymentPlatformEasyPay:
|
||||||
return l.handleEasyPayRefund(order, req)
|
return l.handleEasyPayRefund(order, req)
|
||||||
|
case PaymentPlatformYunYinSignPay, PaymentPlatformYunYinSignPayWechat, PaymentPlatformYunYinSignPayAlipay:
|
||||||
|
return l.handleYunYinSignPayRefund(order, req)
|
||||||
default:
|
default:
|
||||||
return nil, errors.Wrapf(xerr.NewErrMsg("不支持的支付平台"), "AdminRefundOrder, 不支持的支付平台: %s", order.PaymentPlatform)
|
return nil, errors.Wrapf(xerr.NewErrMsg("不支持的支付平台"), "AdminRefundOrder, 不支持的支付平台: %s", order.PaymentPlatform)
|
||||||
}
|
}
|
||||||
@@ -167,6 +172,80 @@ func (l *AdminRefundOrderLogic) handleEasyPayRefund(order *model.Order, req *typ
|
|||||||
}, nil
|
}, 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 创建退款记录并更新订单状态
|
// createRefundRecordAndUpdateOrder 创建退款记录并更新订单状态
|
||||||
func (l *AdminRefundOrderLogic) createRefundRecordAndUpdateOrder(order *model.Order, req *types.AdminRefundOrderReq, refundNo, platformRefundId, orderStatus, refundStatus string) error {
|
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 {
|
return l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user