fix
This commit is contained in:
@@ -72,6 +72,11 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "whitelist":
|
||||
paymentTypeResp, err = l.WhitelistOrderPayment(req, session)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 开发环境测试支付模式:跳过实际支付流程
|
||||
@@ -182,6 +187,37 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
||||
} else {
|
||||
logx.Infof("开发测试模式,代理升级成功,订单号: %s, 代理ID: %s", paymentTypeResp.outTradeNo, upgradeRecord.AgentId)
|
||||
}
|
||||
} else if strings.HasPrefix(paymentTypeResp.outTradeNo, "W_") {
|
||||
// 白名单订单:更新白名单订单状态并处理白名单记录
|
||||
whitelistOrder, findWhitelistErr := l.svcCtx.WhitelistOrderModel.FindOneByOrderNo(context.Background(), paymentTypeResp.outTradeNo)
|
||||
if findWhitelistErr != nil {
|
||||
logx.Errorf("开发测试模式,查找白名单订单失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, findWhitelistErr)
|
||||
return
|
||||
}
|
||||
|
||||
// 更新白名单订单状态为已支付并处理白名单记录
|
||||
err := l.svcCtx.WhitelistOrderModel.Trans(context.Background(), func(transCtx context.Context, session sqlx.Session) error {
|
||||
// 更新白名单订单状态为已支付
|
||||
whitelistOrder.Status = 2 // 已支付
|
||||
now := time.Now()
|
||||
whitelistOrder.PayTime = sql.NullTime{Time: now, Valid: true}
|
||||
if updateErr := l.svcCtx.WhitelistOrderModel.UpdateWithVersion(transCtx, session, whitelistOrder); updateErr != nil {
|
||||
return errors.Wrapf(updateErr, "更新白名单订单状态失败")
|
||||
}
|
||||
|
||||
// 调用 WhitelistService 处理白名单记录
|
||||
if processErr := l.svcCtx.WhitelistService.ProcessPaidWhitelistOrder(transCtx, session, order, whitelistOrder); processErr != nil {
|
||||
return errors.Wrapf(processErr, "处理白名单订单失败")
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
logx.Errorf("开发测试模式,处理白名单订单失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, err)
|
||||
} else {
|
||||
logx.Infof("开发测试模式,白名单订单支付成功,订单号: %s", paymentTypeResp.outTradeNo)
|
||||
}
|
||||
} else {
|
||||
// 查询订单:发送支付成功通知任务,触发后续流程(生成报告和代理处理)
|
||||
if sendErr := l.svcCtx.AsynqService.SendQueryTask(finalOrderID); sendErr != nil {
|
||||
@@ -202,6 +238,181 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
||||
}
|
||||
}
|
||||
|
||||
// WhitelistOrderPayment 白名单下架支付订单
|
||||
// PaymentReq.Id 支持两种格式:
|
||||
// 1. "{idCard}|{featureApiId}" - 单个模块下架(创建新订单)
|
||||
// 2. 订单号(以 W_ 开头) - 批量订单支付(使用已存在的订单)
|
||||
func (l *PaymentLogic) WhitelistOrderPayment(req *types.PaymentReq, session sqlx.Session) (resp *PaymentTypeResp, err error) {
|
||||
userID, err := ctxdata.GetUidFromCtx(l.ctx)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成白名单订单, 获取用户信息失败, %v", err)
|
||||
}
|
||||
|
||||
// 判断是订单号还是 "{idCard}|{featureApiId}" 格式
|
||||
var whitelistOrder *model.WhitelistOrder
|
||||
var orderNo string
|
||||
var amount float64
|
||||
var description string
|
||||
|
||||
if strings.HasPrefix(req.Id, "W_") {
|
||||
// 格式2:订单号,使用已存在的批量订单
|
||||
orderNo = req.Id
|
||||
whitelistOrder, err = l.svcCtx.WhitelistOrderModel.FindOneByOrderNo(l.ctx, orderNo)
|
||||
if err != nil {
|
||||
if errors.Is(err, model.ErrNotFound) {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("白名单订单不存在"), "")
|
||||
}
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询白名单订单失败: %v", err)
|
||||
}
|
||||
|
||||
// 验证订单状态和用户
|
||||
if whitelistOrder.Status != 1 {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("订单状态不正确,无法支付"), "")
|
||||
}
|
||||
if whitelistOrder.UserId != userID {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("无权支付此订单"), "")
|
||||
}
|
||||
|
||||
amount = whitelistOrder.TotalAmount
|
||||
description = "模块屏蔽(批量)"
|
||||
|
||||
// 获取用户信息(用于内部用户测试金额)
|
||||
user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取用户信息失败: %v", err)
|
||||
}
|
||||
if user.Inside == 1 {
|
||||
amount = 0.01
|
||||
}
|
||||
|
||||
// 检查是否已存在支付订单(Order表)
|
||||
existingOrder, findErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, orderNo)
|
||||
if findErr == nil && existingOrder != nil {
|
||||
// 已存在支付订单,直接使用
|
||||
return &PaymentTypeResp{
|
||||
amount: amount,
|
||||
outTradeNo: orderNo,
|
||||
description: description,
|
||||
orderID: existingOrder.Id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 创建主订单记录(用于支付系统)
|
||||
order := model.Order{
|
||||
Id: uuid.NewString(),
|
||||
OrderNo: orderNo,
|
||||
UserId: userID,
|
||||
ProductId: "", // 白名单订单没有具体产品ID
|
||||
PaymentPlatform: req.PayMethod,
|
||||
PaymentScene: "app", // 白名单订单,使用简短标识
|
||||
Amount: amount,
|
||||
Status: "pending",
|
||||
}
|
||||
if _, insertOrderErr := l.svcCtx.OrderModel.Insert(l.ctx, session, &order); insertOrderErr != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建支付订单失败: %+v", insertOrderErr)
|
||||
}
|
||||
|
||||
return &PaymentTypeResp{
|
||||
amount: amount,
|
||||
outTradeNo: orderNo,
|
||||
description: description,
|
||||
orderID: order.Id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 格式1:"{idCard}|{featureApiId}" - 单个模块下架
|
||||
parts := strings.SplitN(req.Id, "|", 2)
|
||||
if len(parts) != 2 {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("参数错误:id 格式不正确,应为订单号(W_开头)或 {idCard}|{featureApiId}"), "")
|
||||
}
|
||||
idCard := parts[0]
|
||||
featureApiId := parts[1]
|
||||
|
||||
if idCard == "" || featureApiId == "" {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("参数错误:身份证号或模块标识为空"), "")
|
||||
}
|
||||
|
||||
// 查询 feature 信息
|
||||
feature, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, featureApiId)
|
||||
if err != nil {
|
||||
if errors.Is(err, model.ErrNotFound) {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("模块不存在"), "")
|
||||
}
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成白名单订单, 查询模块失败: %v", err)
|
||||
}
|
||||
|
||||
amount = feature.WhitelistPrice
|
||||
if amount <= 0 {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("该模块无需付费下架"), "")
|
||||
}
|
||||
|
||||
// 获取用户信息(用于内部用户测试金额)
|
||||
user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成白名单订单, 获取用户信息失败: %v", err)
|
||||
}
|
||||
if user.Inside == 1 {
|
||||
amount = 0.01
|
||||
}
|
||||
|
||||
// 生成订单号(白名单订单前缀 W_,限制长度不超过32)
|
||||
base := l.svcCtx.AlipayService.GenerateOutTradeNo()
|
||||
outTradeNo := "W_" + base
|
||||
if len(outTradeNo) > 32 {
|
||||
outTradeNo = outTradeNo[:32]
|
||||
}
|
||||
|
||||
// 创建主订单记录(用于支付系统)
|
||||
order := model.Order{
|
||||
Id: uuid.NewString(),
|
||||
OrderNo: outTradeNo,
|
||||
UserId: userID,
|
||||
ProductId: "", // 白名单订单没有具体产品ID
|
||||
PaymentPlatform: req.PayMethod,
|
||||
PaymentScene: "app", // 白名单订单,使用简短标识
|
||||
Amount: amount,
|
||||
Status: "pending",
|
||||
}
|
||||
if _, insertOrderErr := l.svcCtx.OrderModel.Insert(l.ctx, session, &order); insertOrderErr != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成白名单订单, 保存订单失败: %+v", insertOrderErr)
|
||||
}
|
||||
|
||||
// 创建白名单订单(业务订单,状态=待支付)
|
||||
whitelistOrder = &model.WhitelistOrder{
|
||||
Id: uuid.NewString(),
|
||||
OrderNo: outTradeNo,
|
||||
UserId: userID,
|
||||
IdCard: idCard,
|
||||
TotalAmount: amount,
|
||||
Status: 1, // 待支付
|
||||
}
|
||||
if _, err := l.svcCtx.WhitelistOrderModel.Insert(l.ctx, session, whitelistOrder); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成白名单订单, 保存白名单订单失败: %+v", err)
|
||||
}
|
||||
|
||||
// 创建白名单订单明细
|
||||
orderItem := &model.WhitelistOrderItem{
|
||||
Id: uuid.NewString(),
|
||||
OrderId: whitelistOrder.Id,
|
||||
FeatureId: feature.Id,
|
||||
FeatureApiId: feature.ApiId,
|
||||
FeatureName: feature.Name,
|
||||
Price: amount,
|
||||
}
|
||||
if _, err := l.svcCtx.WhitelistOrderItemModel.Insert(l.ctx, session, orderItem); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成白名单订单, 保存白名单订单明细失败: %+v", err)
|
||||
}
|
||||
|
||||
description = fmt.Sprintf("模块下架:%s", feature.Name)
|
||||
|
||||
return &PaymentTypeResp{
|
||||
amount: amount,
|
||||
outTradeNo: outTradeNo,
|
||||
description: description,
|
||||
orderID: order.Id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Session) (resp *PaymentTypeResp, err error) {
|
||||
userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx)
|
||||
if getUidErr != nil {
|
||||
|
||||
Reference in New Issue
Block a user