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
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)
|
|
}
|