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

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