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