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.
351 lines
11 KiB
351 lines
11 KiB
package order
|
|
|
|
import (
|
|
"github.com/shopspring/decimal"
|
|
"recook/internal/model/user"
|
|
)
|
|
|
|
type stat struct {
|
|
SalesAmount decimal.Decimal `gorm:"column:sales_amount" json:"salesAmount"`
|
|
}
|
|
|
|
// 分配团队佣金
|
|
// 每月21号
|
|
//func DistributeTeamCommission() error {
|
|
// now := time.Now()
|
|
// if now.Day() < 21 {
|
|
// return nil
|
|
// }
|
|
// if now.Hour() < 3 { // 凌晨3点才开始计算 保证上个月的订单全部能自动确认收货
|
|
// return nil
|
|
// }
|
|
//
|
|
// month := now.AddDate(0, -1, 0).Format("2006-01")
|
|
//
|
|
// var comp uint
|
|
// dbc.DB.Table((&user.PartnerSalesMonthStat{}).TableName()).Where("month = ?", month).Count(&comp)
|
|
// if comp > 0 { // 这个月已经计算过
|
|
// return nil
|
|
// }
|
|
//
|
|
// var ratios []user.TeamSalesGradientRatio
|
|
// dbc.DB.Order("amount desc").Find(&ratios)
|
|
// if len(ratios) == 0 {
|
|
// return errors.New("提成比例还没有设置")
|
|
// }
|
|
//
|
|
// st := tools.GetStartOfLastMonth()
|
|
// et := tools.GetFirstDateOfMonth(now)
|
|
//
|
|
// var partnerTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&partnerTrees, "root_id = 0").Error; err != nil {
|
|
// return err
|
|
// }
|
|
//
|
|
// teamMonthStatList := make([]user.PartnerSalesMonthStat, 0, 0)
|
|
// userTeamBalanceList := make([]user.WalletBalanceList, 0, 0)
|
|
//
|
|
// for _, partner := range partnerTrees {
|
|
// var userRealInfo user.RealInfo
|
|
// if err := dbc.DB.First(&userRealInfo, "user_id = ?", partner.UserID).Error; err != nil {
|
|
// return err
|
|
// }
|
|
//
|
|
// var company user.PartnerCompanyInfo
|
|
// dbc.DB.First(&company, "user_id = ?", partner.UserID)
|
|
//
|
|
// var teamMonthStat stat
|
|
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).
|
|
// Select("SUM(actual_amount) AS sales_amount").
|
|
// Where("ancestor_id = ? AND status = 1 AND is_join_team_performance = 1 AND order_time >= ? AND order_time < ?", partner.UserID, st, et).
|
|
// First(&teamMonthStat).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// return err
|
|
// }
|
|
//
|
|
// monthStat := user.PartnerSalesMonthStat{
|
|
// PartnerUserId: partner.UserID,
|
|
// Name: userRealInfo.IdCardName,
|
|
// BankName: company.BankName,
|
|
// BankNo: userRealInfo.BankNo,
|
|
// SalesAmount: teamMonthStat.SalesAmount,
|
|
// Month: month,
|
|
// }
|
|
//
|
|
// teamMonthStatList = append(teamMonthStatList, monthStat)
|
|
//
|
|
// // 计算该团队下面用户的团队提成将合伙人下所有下级取出
|
|
// var subTrees []user.Tree
|
|
// if err := dbc.DB.Find(&subTrees, "root_id = ? AND depth > 0", partner.UserID).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// return err
|
|
// }
|
|
//
|
|
// // 统计下级用户各自买了多少钱
|
|
// m := map[uint]decimal.Decimal{}
|
|
// for _, secondary := range subTrees {
|
|
// var one stat
|
|
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).Select("SUM(actual_amount) AS sales_amount").
|
|
// Where("user_id = ? AND status = 1 AND is_join_team_performance = 1 AND order_time > ? AND order_time < ?", secondary.UserID, st, et).
|
|
// First(&one).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// return err
|
|
// } else {
|
|
// m[secondary.UserID] = one.SalesAmount
|
|
// }
|
|
// }
|
|
//
|
|
// // 过滤掉会员
|
|
// nonMembersIdList := make([]uint, 0, 0)
|
|
// for _, v := range subTrees {
|
|
// var u user.Information
|
|
// dbc.DB.Select("id").First(&u, "id = ? AND role > 0", v.UserID)
|
|
// if u.ID > 0 {
|
|
// nonMembersIdList = append(nonMembersIdList, v.UserID)
|
|
// }
|
|
// }
|
|
//
|
|
// // 开始分钱
|
|
// for _, non := range nonMembersIdList {
|
|
// var teamTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&teamTrees, "root_id = ?", non).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// return err
|
|
// }
|
|
//
|
|
// subIncome := decimal.NewFromFloat(0.0)
|
|
// for _, v := range teamTrees {
|
|
// subIncome = subIncome.Add(m[v.UserID])
|
|
// }
|
|
// subRatio := getRatio(subIncome, ratios).Div(decimal.NewFromFloat(100.0))
|
|
//
|
|
// teamCommission := subIncome.Mul(subRatio).Truncate(2)
|
|
//
|
|
// // 自己所得的钱,要把下面一级的人减掉
|
|
// var firstTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&firstTrees, "root_id = ? AND depth = 1", non).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// return err
|
|
// }
|
|
//
|
|
// subTotalIncome := decimal.NewFromFloat(0.0)
|
|
// for _, ft := range firstTrees {
|
|
// var role user.Information
|
|
// dbc.DB.First(&role, ft.UserID)
|
|
// if role.Role > 0 { // 只有店主 实体店分钱
|
|
// var subAllTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&subAllTrees, "root_id = ?", ft.UserID).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// return err
|
|
// }
|
|
//
|
|
// sale := decimal.NewFromFloat(0.0)
|
|
// for _, v := range subAllTrees {
|
|
// sale = sale.Add(m[v.UserID])
|
|
// }
|
|
//
|
|
// subRatio := getRatio(sale, ratios)
|
|
// subTotalIncome = subTotalIncome.Add(sale.Mul(subRatio)).Truncate(2)
|
|
// }
|
|
// }
|
|
//
|
|
// finalIncome := teamCommission.Sub(subTotalIncome)
|
|
// if finalIncome.GreaterThan(decimal.NewFromFloat(0.01)) {
|
|
// userTeamBalanceList = append(userTeamBalanceList, user.WalletBalanceList{
|
|
// UserID: non,
|
|
// IncomeType: 3, // 表示团队收益
|
|
// Amount: finalIncome,
|
|
// Title: "团队收益到账",
|
|
// Comment: month + "月份",
|
|
// })
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// tx := dbc.DB.Begin()
|
|
// {
|
|
// for _, v := range teamMonthStatList {
|
|
// if err := tx.Create(&v).Error; err != nil {
|
|
// tx.Rollback()
|
|
// return err
|
|
// }
|
|
// }
|
|
//
|
|
// for _, v := range userTeamBalanceList {
|
|
// var userWallet user.Wallet
|
|
// if err := dbc.DB.First(&userWallet, "user_id = ?", v.UserID).Error; err != nil {
|
|
// tx.Rollback()
|
|
// return err
|
|
// }
|
|
//
|
|
// if r := tx.Exec("UPDATE `recook_user_wallet` SET balance=balance+?, "+
|
|
// "sum_team_income=sum_team_income+? "+
|
|
// "WHERE id = ?",
|
|
// v.Amount, v.Amount, userWallet.ID).RowsAffected; r == 0 {
|
|
// tx.Rollback()
|
|
// return errors.New("佣金计算内部错误,请稍后再试")
|
|
// }
|
|
//
|
|
// if err := tx.Create(&v).Error; err != nil {
|
|
// tx.Rollback()
|
|
// return err
|
|
// }
|
|
// }
|
|
// }
|
|
// tx.Commit()
|
|
//
|
|
// return nil
|
|
//}
|
|
|
|
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)
|
|
}
|
|
|
|
//
|
|
//// 这个方法用于测试 模拟2019年12月份下单的数据
|
|
//func Test1227DistributeTeamCommission() {
|
|
// now := time.Now()
|
|
// month := now.Format("2006-01")
|
|
//
|
|
// var ratios []user.TeamSalesGradientRatio
|
|
// dbc.DB.Order("amount desc").Find(&ratios)
|
|
//
|
|
// st := tools.GetStartOfLastMonth()
|
|
// et := tools.GetFirstDateOfMonth(now)
|
|
//
|
|
// var partnerTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&partnerTrees, "root_id = 0").Error; err != nil {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// teamMonthStatList := make([]user.PartnerSalesMonthStat, 0, 0)
|
|
// userTeamBalanceList := make([]user.WalletBalanceList, 0, 0)
|
|
//
|
|
// for _, partner := range partnerTrees {
|
|
// var userRealInfo user.RealInfo
|
|
// if err := dbc.DB.First(&userRealInfo, "user_id = ?", partner.UserID).Error; err != nil {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// var company user.PartnerCompanyInfo
|
|
// dbc.DB.First(&company, "user_id = ?", partner.UserID)
|
|
//
|
|
// var teamMonthStat stat
|
|
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).
|
|
// Select("SUM(actual_amount) AS sales_amount").
|
|
// Where("ancestor_id = ? AND status = 1 AND is_join_team_performance = 1 AND order_time >= ? AND order_time < ?", partner.UserID, st, et).
|
|
// First(&teamMonthStat).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// monthStat := user.PartnerSalesMonthStat{
|
|
// PartnerUserId: partner.UserID,
|
|
// Name: userRealInfo.IdCardName,
|
|
// BankName: company.BankName,
|
|
// BankNo: userRealInfo.BankNo,
|
|
// SalesAmount: teamMonthStat.SalesAmount,
|
|
// Month: month,
|
|
// }
|
|
//
|
|
// teamMonthStatList = append(teamMonthStatList, monthStat)
|
|
//
|
|
// // 计算该团队下面用户的团队提成将合伙人下所有下级取出
|
|
// var subTrees []user.Tree
|
|
// if err := dbc.DB.Find(&subTrees, "root_id = ? AND depth > 0", partner.UserID).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// // 统计下级用户各自买了多少钱
|
|
// m := map[uint]decimal.Decimal{}
|
|
// for _, secondary := range subTrees {
|
|
// var one stat
|
|
// if err := dbc.DB.Table((&order.GoodsDetail{}).TableName()).Select("SUM(actual_amount) AS sales_amount").
|
|
// Where("user_id = ? AND status = 1 AND is_join_team_performance = 1 AND order_time > ? AND order_time < ?", secondary.UserID, st, et).
|
|
// First(&one).Error; err != nil && gorm.IsRecordNotFoundError(err) == false {
|
|
// log.Println(err)
|
|
// return
|
|
// } else {
|
|
// m[secondary.UserID] = one.SalesAmount
|
|
// }
|
|
// }
|
|
//
|
|
// // 过滤掉会员
|
|
// nonMembersIdList := make([]uint, 0, 0)
|
|
// for _, v := range subTrees {
|
|
// var u user.Information
|
|
// dbc.DB.Select("id").First(&u, "id = ? AND role > 0", v.UserID)
|
|
// if u.ID > 0 {
|
|
// nonMembersIdList = append(nonMembersIdList, v.UserID)
|
|
// }
|
|
// }
|
|
//
|
|
// // 开始分钱
|
|
// for _, non := range nonMembersIdList {
|
|
// var teamTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&teamTrees, "root_id = ?", non).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// subIncome := decimal.NewFromFloat(0.0)
|
|
// for _, v := range teamTrees {
|
|
// subIncome = subIncome.Add(m[v.UserID])
|
|
// }
|
|
// subRatio := getRatio(subIncome, ratios).Div(decimal.NewFromFloat(100.0))
|
|
//
|
|
// teamCommission := subIncome.Mul(subRatio).Round(2)
|
|
//
|
|
// // 自己所得的钱,要把下面一级的人减掉
|
|
// var firstTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&firstTrees, "root_id = ? AND depth = 1", non).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// subTotalIncome := decimal.NewFromFloat(0.0)
|
|
// for _, ft := range firstTrees {
|
|
// var role user.Information
|
|
// dbc.DB.First(&role, ft.UserID)
|
|
// if role.Role > 0 { // 只有店主 实体店分钱
|
|
// var subAllTrees []user.Tree
|
|
// if err := dbc.DB.Select("user_id").Find(&subAllTrees, "root_id = ?", ft.UserID).Error; err != nil && gorm.IsRecordNotFoundError(err) {
|
|
// log.Println(err)
|
|
// return
|
|
// }
|
|
//
|
|
// sale := decimal.NewFromFloat(0.0)
|
|
// for _, v := range subAllTrees {
|
|
// sale = sale.Add(m[v.UserID])
|
|
// }
|
|
//
|
|
// subRatio := getRatio(sale, ratios)
|
|
// subTotalIncome = subTotalIncome.Add(sale.Mul(subRatio).Round(2))
|
|
// }
|
|
// }
|
|
//
|
|
// finalIncome := teamCommission.Sub(subTotalIncome)
|
|
// if finalIncome.GreaterThan(decimal.NewFromFloat(0.01)) {
|
|
// userTeamBalanceList = append(userTeamBalanceList, user.WalletBalanceList{
|
|
// UserID: non,
|
|
// IncomeType: 3, // 表示团队收益
|
|
// Amount: finalIncome,
|
|
// Title: "团队收益到账",
|
|
// Comment: month + "月份",
|
|
// })
|
|
//
|
|
// log.Println("id: ", non, "收益:", finalIncome)
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// log.Println("***********************************")
|
|
// log.Println("测试团队提成计算完成")
|
|
// log.Println("***********************************")
|
|
//
|
|
// return
|
|
//}
|