You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
7.5 KiB

package wallet
import (
"github.com/shopspring/decimal"
"recook/internal/model/user"
)
type queryTeamDateIncomeParam struct {
UserID uint `json:"userId"`
Date string `json:"date" time_format:"2006-01"`
OrderType string `json:"orderType"`
}
type TeamSalesStatistics struct {
SalesAmount decimal.Decimal `gorm:"column:sales_amount" json:"salesAmount"`
Income decimal.Decimal `gorm:"column:income" json:"income"`
SubIncome decimal.Decimal `json:"subIncome"` // 下发的收入
ActualIncome decimal.Decimal `json:"actualIncome"`
Ratio decimal.Decimal `gorm:"column:ratio" json:"ratio"`
}
type secondary struct {
Nickname string `json:"nickname"`
AvatarPath string `json:"avatarPath"`
UserID uint `json:"userId"`
Role uint `json:"role"`
SalesAmount decimal.Decimal `gorm:"column:sales_amount" json:"salesAmount"`
}
/* todo 不要了
团队实时业绩查询
IO最频繁的函数
*/
//func QueryTeamIncomeList(c *gin.Context) {
// var p queryTeamDateIncomeParam
// if err := tools.ParseParams(&p, c); err != nil {
// back.Fail(c, err.Error())
// return
// }
//
// st, err := time.Parse("2006-01", p.Date)
// if err != nil {
// back.Fail(c, "时间无法解析")
// return
// }
//
// et := tools.GetFirstDateOfNextMonth(st)
//
// var trees []user.Tree
// if err := dbc.DB.Select("user_id").Find(&trees, "root_id = ? AND depth = 1", p.UserID).Error; err != nil {
// back.Err(c, err.Error())
// return
// }
//
// list := make([]secondary, 0, 0)
//
// var myInfo user.Information
// dbc.DB.Select("role, nickname, head_img_url").First(&myInfo, p.UserID)
//
// my := secondary{
// Nickname: myInfo.Nickname,
// AvatarPath: myInfo.HeadImgUrl,
// UserID: p.UserID,
// Role: myInfo.Role,
// }
//
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).
// Select("SUM(actual_amount) AS sales_amount").
// Order("sales_amount desc").
// Where("user_id = ? AND pay_status = 1 AND ass_type = 0 AND is_join_team_performance = 1 AND order_time > ? AND order_time < ?", p.UserID, st, et).
// First(&my).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
// back.Err(c, err.Error())
// return
// }
//
// list = append(list, my)
//
// for _, v := range trees {
// var userInfo user.Information
// dbc.DB.Select("role, nickname, head_img_url").First(&userInfo, v.UserID)
//
// one := secondary{
// Nickname: userInfo.Nickname,
// AvatarPath: userInfo.HeadImgUrl,
// UserID: v.UserID,
// Role: userInfo.Role,
// }
//
// var subTrees []user.Tree
// dbc.DB.Find(&subTrees, "root_id = ?", v.UserID)
//
// var id []uint
// for _, v := range subTrees {
// id = append(id, v.UserID)
// }
//
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).
// Select("SUM(actual_amount) AS sales_amount").
// Order("sales_amount desc").
// Where("user_id IN (?) AND pay_status = 1 AND ass_type = 0 AND is_join_team_performance = 1 AND order_time > ? AND order_time < ?", id, st, et).
// First(&one).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
// back.Err(c, err.Error())
// return
// }
//
// list = append(list, one)
// }
//
// // 业绩排序
// p.OrderType = strings.ToLower(strings.TrimSpace(p.OrderType))
// if len(p.OrderType) > 0 {
// listLen := len(list)
// for i := 0; i < listLen-1; i++ {
// for j := i; j < listLen-1; j++ {
// if p.OrderType == "desc" {
// if list[j+1].SalesAmount.GreaterThan(list[i].SalesAmount) {
// list[j+1], list[i] = list[i], list[j+1]
// }
// } else if p.OrderType == "asc" {
// if list[j+1].SalesAmount.LessThan(list[j].SalesAmount) {
// list[j+1], list[j] = list[j], list[j+1]
// }
// }
//
// }
// }
// }
// err, ts := GetRealTimeTeamSalesStatistics(p.UserID, st, et)
// if err != nil {
// back.Err(c, err.Error())
// return
// }
// back.Suc(c, "", gin.H{
// "statistics": ts,
// "list": list,
// })
//}
type sales struct {
Amount decimal.Decimal `gorm:"column:sales_amount"`
}
/*
团队业绩实时分析:
合伙人只展示团队销售额
计算团队成员包括自己在内,把每个人本月的销售额都计算出来,过滤掉是会员的人,会员不参与计算团队业绩计算
*/
//func GetRealTimeTeamSalesStatistics(userId uint, st time.Time, et time.Time) (err error, s *TeamSalesStatistics) {
// if userId == 0 {
// return nil, &TeamSalesStatistics{
// SalesAmount: decimal.NewFromFloat(0.0),
// Income: decimal.NewFromFloat(0.0),
// SubIncome: decimal.NewFromFloat(0.0),
// ActualIncome: decimal.NewFromFloat(0.0),
// Ratio: decimal.NewFromFloat(0.0),
// }
// }
//
// // 获取了包括自己在内的团队所有成员的id
// var trees []user.Tree
// if err := dbc.DB.Select("user_id").Find(&trees, "root_id = ?", userId).Error; err != nil {
// return err, nil
// }
//
// // 计算每个成员的购买额
// salesAmount := decimal.NewFromFloat(0.0)
// m := map[uint]decimal.Decimal{}
// for _, v := range trees {
// var one sales
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).Select("SUM(actual_amount) AS sales_amount").
// Where("user_id = ? AND pay_status = 1 AND ass_type = 0 AND is_join_team_performance = 1 AND order_time > ? AND order_time < ?", v.UserID, st, et).
// First(&one).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
// return err, nil
// } else {
// m[v.UserID] = one.Amount
// salesAmount = salesAmount.Add(one.Amount)
// }
// }
//
// // 如果是合伙人 只需要返回销售额
// var userInfo user.Information
// dbc.DB.Select("role").First(&userInfo, userId)
// if userInfo.Role == 3 {
// return nil, &TeamSalesStatistics{
// SalesAmount: salesAmount,
// Income: decimal.NewFromFloat(0.0),
// SubIncome: decimal.NewFromFloat(0.0),
// Ratio: decimal.NewFromFloat(0.0),
// }
// }
//
// var ratios []user.TeamSalesGradientRatio
// dbc.DB.Order("amount desc").Find(&ratios)
//
// // 下级要分走的钱 余下的钱才是自己的
// // 分钱的人都是过滤后剩下的
// ratio := getRatio(salesAmount, ratios).Div(decimal.NewFromInt(100))
// teamIncome := salesAmount.Mul(ratio).Truncate(2) // 整个团队的钱是这么多
//
// // 发给团队下面的人 只算一级
// var subFirstTrees []user.Tree
// if err := dbc.DB.Select("user_id").Find(&subFirstTrees, "root_id = ? AND depth = 1", userId).Error; err != nil && gorm.IsRecordNotFoundError(err) {
// return err, nil
// }
//
// subTotalIncome := decimal.NewFromFloat(0.0)
//
// for _, v := range subFirstTrees { // 下一级的人
// var role user.Information
// dbc.DB.First(&role, v.UserID)
//
// if role.Role > 0 { // 店主及以上才能有钱分
// var subAllTrees []user.Tree
// if err := dbc.DB.Select("user_id").Find(&subAllTrees, "root_id = ?", v.UserID).Error; err != nil && gorm.IsRecordNotFoundError(err) {
// return err, nil
// }
//
// sale := decimal.NewFromFloat(0.0)
// for _, v := range subAllTrees {
// sale = sale.Add(m[v.UserID])
// }
//
// subRatio := getRatio(sale, ratios).Div(decimal.NewFromInt(100))
// subTotalIncome = subTotalIncome.Add(sale.Mul(subRatio)).Truncate(2)
// }
// }
//
// return nil, &TeamSalesStatistics{
// SalesAmount: salesAmount,
// Income: teamIncome,
// SubIncome: subTotalIncome,
// ActualIncome: teamIncome.Sub(subTotalIncome).Truncate(2),
// Ratio: ratio.Mul(decimal.NewFromInt(100)),
// }
//}
func getRatio(sales decimal.Decimal, ratios []user.TeamSalesGradientRatio) decimal.Decimal {
for _, v := range ratios {
if sales.GreaterThanOrEqual(v.Amount) {
return v.Ratio
}
}
return decimal.NewFromFloat(0.0)
}