f add
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -189,11 +189,36 @@ func (l *BankCardWithdrawalLogic) createBankCardWithdrawalRecord(session sqlx.Se
|
||||
|
||||
// 冻结资金(事务内操作)
|
||||
func (l *BankCardWithdrawalLogic) freezeFunds(session sqlx.Session, wallet *model.AgentWallet, amount float64) error {
|
||||
// 记录变动前的余额
|
||||
balanceBefore := wallet.Balance
|
||||
frozenBalanceBefore := wallet.FrozenBalance
|
||||
|
||||
// 更新钱包余额
|
||||
wallet.Balance -= amount
|
||||
wallet.FrozenBalance += amount
|
||||
err := l.svcCtx.AgentWalletModel.UpdateWithVersion(l.ctx, session, wallet)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 记录交易流水(冻结操作)
|
||||
err = l.svcCtx.AgentService.CreateWalletTransaction(
|
||||
l.ctx,
|
||||
session,
|
||||
wallet.AgentId,
|
||||
model.WalletTransactionTypeFreeze,
|
||||
amount, // 变动金额
|
||||
balanceBefore, // 变动前余额
|
||||
wallet.Balance, // 变动后余额
|
||||
frozenBalanceBefore, // 变动前冻结余额
|
||||
wallet.FrozenBalance, // 变动后冻结余额
|
||||
"", // 关联交易ID(暂时为空,创建提现记录后可以更新)
|
||||
0, // 关联用户ID
|
||||
"提现申请冻结资金", // 备注
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -32,7 +32,10 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
|
||||
}
|
||||
|
||||
for _, commission := range commissions {
|
||||
// 记录更新佣金状态前的状态值,用于后续判断
|
||||
oldCommissionStatus := commission.Status
|
||||
commission.Status = 2 // 设置为已退款
|
||||
|
||||
// 更新佣金状态到数据库
|
||||
var updateCommissionErr error
|
||||
if session != nil {
|
||||
@@ -52,17 +55,30 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
|
||||
continue
|
||||
}
|
||||
|
||||
// 根据订单金额优先减少冻结金额,如果冻结金额不足则减少钱包余额
|
||||
if wallet.FrozenBalance >= order.Amount {
|
||||
// 冻结余额足够,优先减少冻结金额
|
||||
wallet.FrozenBalance -= order.Amount
|
||||
} else {
|
||||
// 冻结余额不足,先扣减所有冻结金额,再扣减余额
|
||||
remaining := order.Amount - wallet.FrozenBalance
|
||||
wallet.FrozenBalance = 0
|
||||
wallet.Balance -= remaining
|
||||
}
|
||||
// 记录变动前的余额
|
||||
balanceBefore := wallet.Balance
|
||||
frozenBalanceBefore := wallet.FrozenBalance
|
||||
|
||||
// 如果是已结算状态的佣金(status = 1),直接扣减钱包余额
|
||||
if oldCommissionStatus == 1 {
|
||||
// 冻结状态的佣金,根据订单金额优先减少冻结金额,如果冻结金额不足则减少钱包余额
|
||||
if wallet.FrozenBalance >= order.Amount {
|
||||
// 冻结余额足够,优先减少冻结金额
|
||||
wallet.FrozenBalance -= order.Amount
|
||||
} else {
|
||||
// 冻结余额不足,先扣减所有冻结金额,再扣减余额
|
||||
remaining := order.Amount - wallet.FrozenBalance
|
||||
wallet.FrozenBalance = 0
|
||||
wallet.Balance -= remaining
|
||||
}
|
||||
// 其他状态的佣金,比如已结算状态(status = 1),直接扣减钱包余额
|
||||
} else {
|
||||
wallet.Balance -= order.Amount
|
||||
}
|
||||
// 变动后余额和冻结余额
|
||||
balanceAfter := wallet.Balance
|
||||
frozenBalanceAfter := wallet.FrozenBalance
|
||||
// 更新钱包
|
||||
var updateWalletErr error
|
||||
if session != nil {
|
||||
updateWalletErr = svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet)
|
||||
@@ -73,6 +89,26 @@ func HandleCommissionAndWalletDeduction(ctx context.Context, svcCtx *svc.Service
|
||||
logx.Errorf("更新代理钱包失败,代理ID: %d, 错误: %v", commission.AgentId, updateWalletErr)
|
||||
continue
|
||||
}
|
||||
// 创建钱包交易流水记录(退款)
|
||||
transErr := svcCtx.AgentService.CreateWalletTransaction(
|
||||
ctx,
|
||||
session,
|
||||
commission.AgentId,
|
||||
model.WalletTransactionTypeRefund,
|
||||
-order.Amount,
|
||||
balanceBefore,
|
||||
balanceAfter,
|
||||
frozenBalanceBefore,
|
||||
frozenBalanceAfter,
|
||||
order.OrderNo,
|
||||
commission.Id,
|
||||
"订单退款,佣金已扣除",
|
||||
)
|
||||
if transErr != nil {
|
||||
logx.Errorf("创建代理钱包流水记录失败,代理ID: %d, 错误: %v", commission.AgentId, transErr)
|
||||
continue
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user