package quota import ( "app/commons/core" "app/commons/model/entity" "github.com/samber/lo" "github.com/shopspring/decimal" ) // todo: 升级 // 用户根据业绩重新升级 -- 必须在业绩计算后执行 func (s *Service) userLevelHandler() error { var err error err = s.RefreshUserMap() if err != nil { return err } levelMap, err := s.LevelConfigMapFromCache() if err != nil { return err } // 准备批量更新的数据 userQuotas, err := s.BatchUserQuota(s.DB().Where("1=1")) if err != nil { return err } count := len(userQuotas) core.JobLog.Infof("用户指标信息初始化完成:%d", count) changes := 0 for _, quota := range userQuotas { acLevel := s.userAcLevel(levelMap, quota) // 业绩等级 realLevel := lo.If(quota.LockLevel > acLevel, quota.LockLevel).Else(acLevel) // 真实最终应用等级 // 等级变化 if acLevel != quota.AcLevel { changes++ if err = s.DB().Model(&entity.UserQuota{}). Where("user_id", quota.UserId). Updates(map[string]interface{}{ "level": realLevel, "ac_level": acLevel, }). Error; err != nil { core.JobLog.Errorf(err.Error()) } } } core.JobLog.Infof("用户等级变化人数:%d 总用户数量:%d", changes, count) return nil } // 根据用户指标信息 等级验证是否达到改等级 func (s *Service) userAcLevel(levelMap map[int]*entity.SysLevelConfig, quota *entity.UserQuota) int { acLevel := 0 // 业绩等级计算 // 升级后系统触发赠送:V1赠送2w、V2赠送10W、V3赠送50W、V4赠送200W、V5赠送600W // 真实大小区总业绩达到对应等级业绩门槛,且真实小区业绩达到50%及以上 for _, levelConf := range levelMap { // 个人业绩不达标则直接跳过 if levelConf.PersonAchievement.GreaterThan(quota.PersonAchievement) { continue } // 真实小区业绩达标 if quota.FewTeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) { if levelConf.Level > acLevel { acLevel = levelConf.Level } continue } // 当赠送大区业绩大于等于升级要求小区业绩 if quota.GiftLargeRegionAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) { // 检查团队总业绩是否达标 if !quota.TeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) { continue } // 小区业绩真实业绩到达50% if !quota.FewTeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement.Mul(decimal.NewFromFloat(0.5))) { continue } if levelConf.Level > acLevel { acLevel = levelConf.Level } } } return acLevel }