This commit is contained in:
2026-01-07 16:50:42 +08:00
parent 9e42257e4e
commit ec72e47695
16 changed files with 981 additions and 27 deletions

View File

@@ -0,0 +1,84 @@
package admin_agent
import (
"context"
"errors"
"tydata-server/app/main/api/internal/svc"
"tydata-server/app/main/api/internal/types"
"github.com/Masterminds/squirrel"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminGetAgentWalletTransactionListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetAgentWalletTransactionListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentWalletTransactionListLogic {
return &AdminGetAgentWalletTransactionListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetAgentWalletTransactionListLogic) AdminGetAgentWalletTransactionList(req *types.AdminGetAgentWalletTransactionListReq) (resp *types.AdminGetAgentWalletTransactionListResp, err error) {
builder := l.svcCtx.AgentWalletTransactionModel.SelectBuilder()
// 必须传入代理ID
if req.AgentId == 0 {
return nil, errors.New("代理ID不能为空")
}
builder = builder.Where(squirrel.Eq{"agent_id": req.AgentId})
// 可选条件
if req.TransactionType != nil && *req.TransactionType != "" {
builder = builder.Where(squirrel.Eq{"transaction_type": *req.TransactionType})
}
if req.CreateTimeStart != nil && *req.CreateTimeStart != "" {
builder = builder.Where(squirrel.GtOrEq{"create_time": *req.CreateTimeStart})
}
if req.CreateTimeEnd != nil && *req.CreateTimeEnd != "" {
builder = builder.Where(squirrel.LtOrEq{"create_time": *req.CreateTimeEnd})
}
list, total, err := l.svcCtx.AgentWalletTransactionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC")
if err != nil {
return nil, err
}
items := make([]types.AgentWalletTransactionListItem, 0, len(list))
for _, v := range list {
item := types.AgentWalletTransactionListItem{
Id: v.Id,
AgentId: v.AgentId,
TransactionType: v.TransactionType,
Amount: v.Amount,
BalanceBefore: v.BalanceBefore,
BalanceAfter: v.BalanceAfter,
FrozenBalanceBefore: v.FrozenBalanceBefore,
FrozenBalanceAfter: v.FrozenBalanceAfter,
CreateTime: v.CreateTime.Format("2006-01-02 15:04:05"),
}
if v.TransactionId.Valid {
item.TransactionId = &v.TransactionId.String
}
if v.RelatedUserId.Valid {
item.RelatedUserId = &v.RelatedUserId.Int64
}
if v.Remark.Valid {
item.Remark = &v.Remark.String
}
items = append(items, item)
}
resp = &types.AdminGetAgentWalletTransactionListResp{
Total: total,
Items: items,
}
return
}

View File

@@ -160,11 +160,34 @@ func (l *AdminReviewBankCardWithdrawalLogic) approveBankCardWithdrawal(ctx conte
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询钱包失败: %v", err)
}
// 记录变动前的冻结余额
frozenBalanceBefore := wallet.FrozenBalance
// 更新钱包(减少冻结余额)
wallet.FrozenBalance -= record.Amount
if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新钱包失败: %v", err)
}
// 记录交易流水(提现成功)
err = l.svcCtx.AgentService.CreateWalletTransaction(
ctx,
session,
wallet.AgentId,
model.WalletTransactionTypeWithdraw,
-record.Amount, // 变动金额(负数表示减少)
wallet.Balance, // 变动前余额(不变)
wallet.Balance, // 变动后余额(不变)
frozenBalanceBefore, // 变动前冻结余额
wallet.FrozenBalance, // 变动后冻结余额
record.WithdrawNo, // 关联交易ID
0, // 关联用户ID
"提现审核通过", // 备注
)
if err != nil {
return err
}
// 更新扣税记录状态为成功
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
if err != nil {
@@ -206,12 +229,36 @@ func (l *AdminReviewBankCardWithdrawalLogic) rejectWithdrawal(ctx context.Contex
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询钱包失败: %v", err)
}
// 记录变动前的余额
balanceBefore := wallet.Balance
frozenBalanceBefore := wallet.FrozenBalance
// 更新钱包(余额增加,冻结余额减少)
wallet.Balance += record.Amount
wallet.FrozenBalance -= record.Amount
if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新钱包失败: %v", err)
}
// 记录交易流水(解冻)
err = l.svcCtx.AgentService.CreateWalletTransaction(
ctx,
session,
wallet.AgentId,
model.WalletTransactionTypeUnfreeze,
record.Amount, // 变动金额(正数表示增加)
balanceBefore, // 变动前余额
wallet.Balance, // 变动后余额
frozenBalanceBefore, // 变动前冻结余额
wallet.FrozenBalance, // 变动后冻结余额
record.WithdrawNo, // 关联交易ID
0, // 关联用户ID
"提现拒绝,解冻资金", // 备注
)
if err != nil {
return err
}
// 更新扣税记录状态为失败
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
if err != nil {
@@ -244,11 +291,34 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalSuccess(ctx conte
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询钱包失败: %v", err)
}
// 记录变动前的冻结余额
frozenBalanceBefore := wallet.FrozenBalance
// 更新钱包(减少冻结余额)
wallet.FrozenBalance -= record.Amount
if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新钱包失败: %v", err)
}
// 记录交易流水(提现成功)
err = l.svcCtx.AgentService.CreateWalletTransaction(
ctx,
session,
wallet.AgentId,
model.WalletTransactionTypeWithdraw,
-record.Amount, // 变动金额(负数表示减少)
wallet.Balance, // 变动前余额(不变)
wallet.Balance, // 变动后余额(不变)
frozenBalanceBefore, // 变动前冻结余额
wallet.FrozenBalance, // 变动后冻结余额
record.WithdrawNo, // 关联交易ID
0, // 关联用户ID
"提现成功", // 备注
)
if err != nil {
return err
}
// 更新扣税记录状态为成功
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
if err != nil {
@@ -290,12 +360,36 @@ func (l *AdminReviewBankCardWithdrawalLogic) completeWithdrawalFailure(ctx conte
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询钱包失败: %v", err)
}
// 记录变动前的余额
balanceBefore := wallet.Balance
frozenBalanceBefore := wallet.FrozenBalance
// 更新钱包(余额增加,冻结余额减少)
wallet.Balance += record.Amount
wallet.FrozenBalance -= record.Amount
if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新钱包失败: %v", err)
}
// 记录交易流水(解冻)
err = l.svcCtx.AgentService.CreateWalletTransaction(
ctx,
session,
wallet.AgentId,
model.WalletTransactionTypeUnfreeze,
record.Amount, // 变动金额(正数表示增加)
balanceBefore, // 变动前余额
wallet.Balance, // 变动后余额
frozenBalanceBefore, // 变动前冻结余额
wallet.FrozenBalance, // 变动后冻结余额
record.WithdrawNo, // 关联交易ID
0, // 关联用户ID
"提现失败,解冻资金", // 备注
)
if err != nil {
return err
}
// 更新扣税记录状态为失败
taxModel, err := l.svcCtx.AgentWithdrawalTaxModel.FindOneByWithdrawalId(ctx, record.Id)
if err != nil {

View File

@@ -56,6 +56,10 @@ func (l *AdminUpdateAgentWalletBalanceLogic) AdminUpdateAgentWalletBalance(req *
// 更新余额
updateErr := l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
// 记录变动前的余额
balanceBefore := wallet.Balance
frozenBalanceBefore := wallet.FrozenBalance
// 使用版本号更新
wallet.Balance = newBalance
err := l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet)
@@ -63,9 +67,29 @@ func (l *AdminUpdateAgentWalletBalanceLogic) AdminUpdateAgentWalletBalance(req *
return err
}
// TODO: 这里可以添加记录余额变更日志的逻辑
// 创建钱包交易流水记录(手动调整)
remark := fmt.Sprintf("管理员手动调整余额,金额: %.2f", req.Amount)
transErr := l.svcCtx.AgentService.CreateWalletTransaction(
transCtx,
session,
req.AgentId,
model.WalletTransactionTypeAdjust,
req.Amount, // 变动金额(正数表示增加,负数表示减少)
balanceBefore, // 变动前余额
wallet.Balance, // 变动后余额
frozenBalanceBefore, // 变动前冻结余额
wallet.FrozenBalance, // 变动后冻结余额(保持不变)
"", // 关联交易ID无关联
0, // 关联用户ID无关联
remark, // 备注
)
if transErr != nil {
l.Logger.Errorf("创建代理钱包流水记录失败: %+v", transErr)
return transErr
}
l.Logger.Infof("代理钱包余额变更 - AgentId: %d, 原余额: %.2f, 变更金额: %.2f, 新余额: %.2f",
req.AgentId, wallet.Balance-req.Amount, req.Amount, newBalance)
req.AgentId, balanceBefore, req.Amount, wallet.Balance)
return nil
})