2025-12-31 12:40:41 +08:00
|
|
|
|
package admin_agent
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
|
|
|
|
"tydata-server/app/main/api/internal/svc"
|
|
|
|
|
|
"tydata-server/app/main/api/internal/types"
|
|
|
|
|
|
"tydata-server/app/main/model"
|
|
|
|
|
|
"tydata-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) {
|
|
|
|
|
|
// 验证状态值
|
|
|
|
|
|
if req.Status != 0 && req.Status != 1 && req.Status != 2 {
|
|
|
|
|
|
return nil, xerr.NewErrMsg("无效的状态值,状态必须为0(已结算)、1(冻结中)或2(已取消)")
|
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-31 14:56:31 +08:00
|
|
|
|
// 检查状态转换是否合法
|
|
|
|
|
|
// 0(已结算) <-> 1(冻结中):允许冻结和解冻相互转换,不涉及钱包余额
|
|
|
|
|
|
// 1(冻结中) -> 2(已取消):允许,扣减冻结余额
|
|
|
|
|
|
// 2(已取消):已取消的状态无法转换到其他状态
|
|
|
|
|
|
if commission.Status == req.Status {
|
|
|
|
|
|
return nil, xerr.NewErrMsg("状态未发生变化")
|
2025-12-31 12:40:41 +08:00
|
|
|
|
}
|
2025-12-31 14:56:31 +08:00
|
|
|
|
|
|
|
|
|
|
// 已取消的状态不能再转换
|
2025-12-31 12:40:41 +08:00
|
|
|
|
if commission.Status == 2 {
|
2025-12-31 14:56:31 +08:00
|
|
|
|
return nil, xerr.NewErrMsg("已取消的佣金状态不能转换")
|
2025-12-31 12:40:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 开始事务
|
|
|
|
|
|
err = l.svcCtx.AgentCommissionModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
|
2025-12-31 14:56:31 +08:00
|
|
|
|
// 保存原始状态用于判断
|
|
|
|
|
|
originalStatus := commission.Status
|
|
|
|
|
|
|
2025-12-31 12:40:41 +08:00
|
|
|
|
// 更新佣金状态
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-31 14:56:31 +08:00
|
|
|
|
// 根据状态转换更新钱包
|
|
|
|
|
|
if originalStatus == 0 && req.Status == 1 {
|
|
|
|
|
|
// 已结算 -> 冻结中:仅状态转换,增加冻结金额,减少钱包余额。
|
|
|
|
|
|
wallet.FrozenBalance += commission.Amount
|
|
|
|
|
|
wallet.Balance -= commission.Amount
|
|
|
|
|
|
|
|
|
|
|
|
} else if originalStatus == 1 && req.Status == 0 {
|
|
|
|
|
|
// 冻结中 -> 已结算:仅状态转换,减少冻结金额,增加钱包余额。
|
2025-12-31 12:40:41 +08:00
|
|
|
|
wallet.FrozenBalance -= commission.Amount
|
2025-12-31 14:56:31 +08:00
|
|
|
|
wallet.Balance += commission.Amount
|
|
|
|
|
|
} else if originalStatus == 1 && req.Status == 2 {
|
|
|
|
|
|
// 冻结中 -> 已取消:减少冻结金额。
|
2025-12-31 12:40:41 +08:00
|
|
|
|
wallet.FrozenBalance -= 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
|
|
|
|
|
|
}
|