Files
tyc-server-v2/app/main/api/internal/logic/admin_agent/adminupdateagentcommissionstatuslogic.go
2026-01-22 16:04:12 +08:00

110 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package admin_agent
import (
"context"
"errors"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/app/main/model"
"tyc-server/common/xerr"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
type AdminUpdateAgentCommissionStatusLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateAgentCommissionStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateAgentCommissionStatusLogic {
return &AdminUpdateAgentCommissionStatusLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateAgentCommissionStatusLogic) AdminUpdateAgentCommissionStatus(req *types.AdminUpdateAgentCommissionStatusReq) (resp *types.AdminUpdateAgentCommissionStatusResp, err error) {
// 验证状态值不允许手动设置为2已取消只能设置为0或1
if req.Status != 0 && req.Status != 1 {
return nil, xerr.NewErrMsg("无效的状态值状态必须为0(已结算)或1(冻结中)")
}
commission, err := l.svcCtx.AgentCommissionModel.FindOne(l.ctx, req.Id)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
return nil, xerr.NewErrMsg("佣金记录不存在")
}
return nil, err
}
// 检查状态转换是否合法
// 0(已结算) <-> 1(冻结中):允许冻结和解冻相互转换
// 2(已取消):已取消的状态无法转换到其他状态(由订单退款自动触发)
if commission.Status == req.Status {
return nil, xerr.NewErrMsg("状态未发生变化")
}
// 已取消的状态不能再转换
if commission.Status == 2 {
return nil, xerr.NewErrMsg("已取消的佣金状态不能转换")
}
// 开始事务
err = l.svcCtx.AgentCommissionModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 保存原始状态用于判断
originalStatus := commission.Status
// 更新佣金状态
commission.Status = req.Status
err = l.svcCtx.AgentCommissionModel.UpdateWithVersion(ctx, session, commission)
if err != nil {
return err
}
// 查询代理钱包
wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(ctx, commission.AgentId)
if err != nil {
return err
}
// 根据状态转换更新钱包
if originalStatus == 0 && req.Status == 1 {
// 已结算 -> 冻结中:增加冻结金额,减少钱包余额
// 检查钱包余额是否足够
if wallet.Balance < commission.Amount {
return xerr.NewErrMsg("钱包余额不足,无法冻结")
}
wallet.FrozenBalance += commission.Amount
wallet.Balance -= commission.Amount
} else if originalStatus == 1 && req.Status == 0 {
// 冻结中 -> 已结算:减少冻结金额,增加钱包余额
// 检查冻结余额是否足够
if wallet.FrozenBalance < commission.Amount {
return xerr.NewErrMsg("冻结余额不足,无法解冻")
}
wallet.FrozenBalance -= commission.Amount
wallet.Balance += commission.Amount
}
err = l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet)
if err != nil {
return err
}
return nil
})
if err != nil {
return nil, err
}
resp = &types.AdminUpdateAgentCommissionStatusResp{
Success: true,
}
return
}