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
|