fix and add

This commit is contained in:
2026-01-03 17:53:19 +08:00
parent 0211c67f86
commit 21b4069465
15 changed files with 277 additions and 24 deletions

View File

@@ -2,6 +2,8 @@ package admin_agent
import (
"context"
"errors"
"fmt"
"tydata-server/app/main/api/internal/svc"
"tydata-server/app/main/api/internal/types"
@@ -69,7 +71,27 @@ func (l *AdminBatchUnfreezeAgentCommissionLogic) AdminBatchUnfreezeAgentCommissi
commission.Status = 0
err := l.svcCtx.AgentCommissionModel.UpdateWithVersion(ctx, session, commission)
if err != nil {
return err
// 如果是版本冲突错误,重新查询最新的数据后重试
if errors.Is(err, model.ErrNoRowsUpdate) {
latestCommission, findErr := l.svcCtx.AgentCommissionModel.FindOne(ctx, commission.Id)
if findErr != nil {
return findErr
}
// 检查状态是否已被其他操作修改
if latestCommission.Status != 1 {
return xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, fmt.Sprintf("佣金 %d 的状态已被其他操作修改,当前状态: %d", commission.Id, latestCommission.Status))
}
// 重新更新状态
latestCommission.Status = 0
updateErr := l.svcCtx.AgentCommissionModel.UpdateWithVersion(ctx, session, latestCommission)
if updateErr != nil {
return updateErr
}
// 更新引用,使用最新的数据
commission.Version = latestCommission.Version
} else {
return err
}
}
// 累加到对应代理商的钱包数据
@@ -92,7 +114,22 @@ func (l *AdminBatchUnfreezeAgentCommissionLogic) AdminBatchUnfreezeAgentCommissi
for _, wallet := range agentWalletMap {
err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet)
if err != nil {
return err
// 如果是版本冲突错误,重新查询最新的数据后重试
if errors.Is(err, model.ErrNoRowsUpdate) {
latestWallet, findErr := l.svcCtx.AgentWalletModel.FindOneByAgentId(ctx, wallet.AgentId)
if findErr != nil {
return findErr
}
// 重新累加金额
latestWallet.Balance = wallet.Balance
latestWallet.FrozenBalance = wallet.FrozenBalance
updateErr := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, latestWallet)
if updateErr != nil {
return updateErr
}
} else {
return err
}
}
}

View File

@@ -30,19 +30,25 @@ func (l *AdminGetAgentCommissionListLogic) AdminGetAgentCommissionList(req *type
if req.AgentId != nil {
builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId})
}
if req.OrderId != nil {
builder = builder.Where(squirrel.Eq{"order_id": *req.OrderId})
}
if req.Status != nil {
builder = builder.Where(squirrel.Eq{"status": *req.Status})
}
// 先查出所有product_id对应的product_name如有product_name筛选需反查id
var productIdFilter int64
if req.ProductName != nil && *req.ProductName != "" {
// 支持精确匹配,如需模糊可扩展
products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"product_name": *req.ProductName}), "")
// 支持模糊匹配产品名称
products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Like{"product_name": "%" + *req.ProductName + "%"}), "")
if err != nil || len(products) == 0 {
return &types.AdminGetAgentCommissionListResp{Total: 0, Items: []types.AgentCommissionListItem{}}, nil
}
productIdFilter = products[0].Id
builder = builder.Where("product_id = ?", productIdFilter)
productIds := make([]int64, 0, len(products))
for _, p := range products {
productIds = append(productIds, p.Id)
}
builder = builder.Where(squirrel.Eq{"product_id": productIds})
}
list, total, err := l.svcCtx.AgentCommissionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC")

View File

@@ -0,0 +1,45 @@
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"
)
type AdminGetAgentWalletLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetAgentWalletLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentWalletLogic {
return &AdminGetAgentWalletLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetAgentWalletLogic) AdminGetAgentWallet(req *types.AdminGetAgentWalletReq) (resp *types.AdminGetAgentWalletResp, err error) {
// 查询代理钱包信息
wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, req.AgentId)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
return nil, xerr.NewErrMsg("代理钱包不存在")
}
return nil, err
}
resp = &types.AdminGetAgentWalletResp{
Balance: wallet.Balance,
FrozenBalance: wallet.FrozenBalance,
TotalEarnings: wallet.TotalEarnings,
}
return
}

View File

@@ -28,9 +28,9 @@ func NewAdminUpdateAgentCommissionStatusLogic(ctx context.Context, svcCtx *svc.S
}
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(已取消)")
// 验证状态值不允许手动设置为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 {
@@ -41,9 +41,8 @@ func (l *AdminUpdateAgentCommissionStatusLogic) AdminUpdateAgentCommissionStatus
}
// 检查状态转换是否合法
// 0(已结算) <-> 1(冻结中):允许冻结和解冻相互转换,不涉及钱包余额
// 1(冻结中) -> 2(已取消):允许,扣减冻结余额
// 2(已取消):已取消的状态无法转换到其他状态
// 0(已结算) <-> 1(冻结中):允许冻结和解冻相互转换
// 2(已取消):已取消的状态无法转换到其他状态(由订单退款自动触发)
if commission.Status == req.Status {
return nil, xerr.NewErrMsg("状态未发生变化")
}
@@ -73,17 +72,22 @@ func (l *AdminUpdateAgentCommissionStatusLogic) AdminUpdateAgentCommissionStatus
// 根据状态转换更新钱包
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
} else if originalStatus == 1 && req.Status == 2 {
// 冻结中 -> 已取消:减少冻结金额。
wallet.FrozenBalance -= commission.Amount
}
err = l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet)