167 lines
5.6 KiB
Go
167 lines
5.6 KiB
Go
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
|