04_quota_level.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package quota
  2. import (
  3. "app/commons/core"
  4. "app/commons/model/entity"
  5. "github.com/samber/lo"
  6. "github.com/shopspring/decimal"
  7. )
  8. // todo: 升级
  9. // 用户根据业绩重新升级 -- 必须在业绩计算后执行
  10. func (s *Service) userLevelHandler() error {
  11. var err error
  12. err = s.RefreshUserMap()
  13. if err != nil {
  14. return err
  15. }
  16. levelMap, err := s.LevelConfigMapFromCache()
  17. if err != nil {
  18. return err
  19. }
  20. // 准备批量更新的数据
  21. userQuotas, err := s.BatchUserQuota(s.DB().Where("1=1"))
  22. if err != nil {
  23. return err
  24. }
  25. count := len(userQuotas)
  26. core.JobLog.Infof("用户指标信息初始化完成:%d", count)
  27. changes := 0
  28. for _, quota := range userQuotas {
  29. acLevel := s.userAcLevel(levelMap, quota) // 业绩等级
  30. realLevel := lo.If(quota.LockLevel > acLevel, quota.LockLevel).Else(acLevel) // 真实最终应用等级
  31. // 等级变化
  32. if acLevel != quota.AcLevel {
  33. changes++
  34. if err = s.DB().Model(&entity.UserQuota{}).
  35. Where("user_id", quota.UserId).
  36. Updates(map[string]interface{}{
  37. "level": realLevel,
  38. "ac_level": acLevel,
  39. }).
  40. Error; err != nil {
  41. core.JobLog.Errorf(err.Error())
  42. }
  43. }
  44. }
  45. core.JobLog.Infof("用户等级变化人数:%d 总用户数量:%d", changes, count)
  46. return nil
  47. }
  48. // 根据用户指标信息 等级验证是否达到改等级
  49. func (s *Service) userAcLevel(levelMap map[int]*entity.SysLevelConfig, quota *entity.UserQuota) int {
  50. acLevel := 0 // 业绩等级计算
  51. // 升级后系统触发赠送:V1赠送2w、V2赠送10W、V3赠送50W、V4赠送200W、V5赠送600W
  52. // 真实大小区总业绩达到对应等级业绩门槛,且真实小区业绩达到50%及以上
  53. for _, levelConf := range levelMap {
  54. // 个人业绩不达标则直接跳过
  55. if levelConf.PersonAchievement.GreaterThan(quota.PersonAchievement) {
  56. continue
  57. }
  58. // 真实小区业绩达标
  59. if quota.FewTeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) {
  60. if levelConf.Level > acLevel {
  61. acLevel = levelConf.Level
  62. }
  63. continue
  64. }
  65. // 当赠送大区业绩大于等于升级要求小区业绩
  66. if quota.GiftLargeRegionAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) {
  67. // 检查团队总业绩是否达标
  68. if !quota.TeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement) {
  69. continue
  70. }
  71. // 小区业绩真实业绩到达50%
  72. if !quota.FewTeamAchievement.GreaterThanOrEqual(levelConf.FewTeamAchievement.Mul(decimal.NewFromFloat(0.5))) {
  73. continue
  74. }
  75. if levelConf.Level > acLevel {
  76. acLevel = levelConf.Level
  77. }
  78. }
  79. }
  80. return acLevel
  81. }