Files
jnc-server/app/main/api/internal/service/agentService.go
2025-12-27 18:12:05 +08:00

167 lines
5.6 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 service
import (
"context"
"jnc-server/app/main/api/internal/config"
"jnc-server/app/main/model"
"jnc-server/pkg/lzkit/lzUtils"
"time"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
// AgentService 新代理系统服务
// 系统简化:移除团队关系、返佣、升级、提现、实名认证、邀请码功能
type AgentService struct {
config config.Config
OrderModel model.OrderModel
AgentModel model.AgentModel
AgentWalletModel model.AgentWalletModel
AgentLinkModel model.AgentLinkModel
AgentOrderModel model.AgentOrderModel
AgentCommissionModel model.AgentCommissionModel
AgentConfigModel model.AgentConfigModel
AgentProductConfigModel model.AgentProductConfigModel
}
// NewAgentService 创建新的代理服务
// 系统简化:移除团队关系、返佣、升级、提现、实名认证、邀请码功能
func NewAgentService(
c config.Config,
orderModel model.OrderModel,
agentModel model.AgentModel,
agentWalletModel model.AgentWalletModel,
agentLinkModel model.AgentLinkModel,
agentOrderModel model.AgentOrderModel,
agentCommissionModel model.AgentCommissionModel,
agentConfigModel model.AgentConfigModel,
agentProductConfigModel model.AgentProductConfigModel,
) *AgentService {
return &AgentService{
config: c,
OrderModel: orderModel,
AgentModel: agentModel,
AgentWalletModel: agentWalletModel,
AgentLinkModel: agentLinkModel,
AgentOrderModel: agentOrderModel,
AgentCommissionModel: agentCommissionModel,
AgentConfigModel: agentConfigModel,
AgentProductConfigModel: agentProductConfigModel,
}
}
// AgentProcess 处理代理订单(简化版)
// 系统简化:只计算代理自己的推广佣金,不再有等级、团队、返佣等复杂逻辑
func (s *AgentService) AgentProcess(ctx context.Context, order *model.Order) error {
// 1. 检查是否是代理推广订单
agentOrder, err := s.AgentOrderModel.FindOneByOrderId(ctx, order.Id)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
// 不是代理订单,直接返回
return nil
}
return errors.Wrapf(err, "查询代理订单失败, orderId: %s", order.Id)
}
// 2. 检查订单是否已处理
if agentOrder.ProcessStatus == 1 {
logx.Infof("订单已处理, orderId: %s", order.Id)
return nil
}
// 3. 获取产品配置(必须存在)
productConfig, err := s.AgentProductConfigModel.FindOneByProductId(ctx, order.ProductId)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
return errors.Wrapf(err, "产品配置不存在, productId: %s请先在后台配置产品价格参数", order.ProductId)
}
return errors.Wrapf(err, "查询产品配置失败, productId: %s", order.ProductId)
}
// 4. 使用事务处理订单
err = s.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error {
// 4.1 计算代理收益 = 设置价 - 底价 - 提价成本
basePrice := productConfig.BasePrice
// 计算提价成本
priceThreshold := 0.0
priceFeeRate := 0.0
if productConfig.PriceThreshold.Valid {
priceThreshold = productConfig.PriceThreshold.Float64
}
if productConfig.PriceFeeRate.Valid {
priceFeeRate = productConfig.PriceFeeRate.Float64
}
priceCost := s.calculatePriceCost(agentOrder.SetPrice, priceThreshold, priceFeeRate)
// 代理收益
agentProfit := agentOrder.SetPrice - basePrice - priceCost
// 4.2 更新代理订单记录
agentOrder.ProcessStatus = 1
agentOrder.ProcessTime = lzUtils.TimeToNullTime(time.Now())
agentOrder.ProcessRemark = lzUtils.StringToNullString("处理成功")
if err := s.AgentOrderModel.UpdateWithVersion(transCtx, session, agentOrder); err != nil {
return errors.Wrapf(err, "更新代理订单失败")
}
// 4.3 发放代理佣金
err := s.giveAgentCommission(transCtx, session, agentOrder.AgentId, order.Id, order.ProductId, agentProfit)
if err != nil {
return errors.Wrapf(err, "发放代理佣金失败")
}
return nil
})
return err
}
// calculatePriceCost 计算提价成本
func (s *AgentService) calculatePriceCost(setPrice, priceThreshold, priceFeeRate float64) float64 {
if setPrice <= priceThreshold {
return 0
}
return (setPrice - priceThreshold) * priceFeeRate
}
// giveAgentCommission 发放代理佣金
// 系统简化:移除佣金冻结功能,直接发放全部金额
func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Session, agentId, orderId, productId string, amount float64) error {
// 1. 创建佣金记录
commission := &model.AgentCommission{
Id: uuid.NewString(),
AgentId: agentId,
OrderId: orderId,
ProductId: productId,
Amount: amount,
Status: 1, // 已发放
}
_, err := s.AgentCommissionModel.Insert(ctx, session, commission)
if err != nil {
return errors.Wrapf(err, "创建佣金记录失败")
}
// 2. 更新钱包余额
wallet, err := s.AgentWalletModel.FindOneByAgentId(ctx, agentId)
if err != nil {
return errors.Wrapf(err, "查询钱包失败, agentId: %s", agentId)
}
// 直接发放全部佣金金额到余额
wallet.Balance += amount
wallet.TotalEarnings += amount
if err := s.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil {
return errors.Wrapf(err, "更新钱包失败")
}
return nil
}
// 系统简化:移除所有团队关系、返佣、升级功能
// 以下方法已删除distributeLevelBonus, distributeNormalAgentBonus, giveRebate, findDirectParent, findDiamondParent, findGoldParent 等
// 以及佣金冻结功能getConfigFloat, getConfigInt