UrsUserTalent.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace App\Module\UrsPromotion\Models;
  3. use UCore\ModelCore;
  4. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  5. use App\Module\User\Models\User;
  6. use App\Module\UrsPromotion\Enums\UrsTalentLevel;
  7. /**
  8. * URS用户达人等级模型
  9. * field start
  10. * @property int $id 主键ID
  11. * @property int $user_id 用户ID
  12. * @property int $talent_level URS达人等级:0无,1初级,2中级,3高级,4资深,5顶级
  13. * @property int $direct_count 直推人数
  14. * @property int $indirect_count 间推人数
  15. * @property int $third_count 三推人数
  16. * @property int $promotion_count 团队总人数
  17. * @property \Carbon\Carbon $last_level_update_time 最后等级更新时间
  18. * @property \Carbon\Carbon $created_at 创建时间
  19. * @property \Carbon\Carbon $updated_at 更新时间
  20. * field end
  21. *
  22. * @property-read User $user 用户
  23. */
  24. class UrsUserTalent extends ModelCore
  25. {
  26. /**
  27. * 数据库表名
  28. */
  29. protected $table = 'urs_promotion_user_talents';
  30. /**
  31. * 可批量赋值的属性
  32. */
  33. protected $fillable = [
  34. 'user_id',
  35. 'talent_level',
  36. 'direct_count',
  37. 'indirect_count',
  38. 'third_count',
  39. 'promotion_count',
  40. 'last_level_update_time',
  41. ];
  42. /**
  43. * 属性类型转换
  44. */
  45. protected $casts = [
  46. 'user_id' => 'integer',
  47. 'talent_level' => 'integer',
  48. 'direct_count' => 'integer',
  49. 'indirect_count' => 'integer',
  50. 'third_count' => 'integer',
  51. 'promotion_count' => 'integer',
  52. 'last_level_update_time' => 'datetime',
  53. 'created_at' => 'datetime',
  54. 'updated_at' => 'datetime',
  55. ];
  56. /**
  57. * 获取用户映射关系
  58. */
  59. public function userMapping(): BelongsTo
  60. {
  61. return $this->belongsTo(UrsUserMapping::class, 'user_id', 'user_id');
  62. }
  63. /**
  64. * 获取达人等级枚举
  65. */
  66. public function getTalentLevelEnum(): UrsTalentLevel
  67. {
  68. return UrsTalentLevel::fromInt($this->talent_level) ?? UrsTalentLevel::NONE;
  69. }
  70. /**
  71. * 获取达人等级名称
  72. */
  73. public function getTalentLevelName(): string
  74. {
  75. return $this->getTalentLevelEnum()->getName();
  76. }
  77. /**
  78. * 检查是否为达人
  79. */
  80. public function isTalent(): bool
  81. {
  82. return $this->getTalentLevelEnum()->isTalent();
  83. }
  84. /**
  85. * 更新团队统计数据
  86. *
  87. * @param int $directCount 直推人数
  88. * @param int $indirectCount 间推人数
  89. * @param int $thirdCount 三推人数
  90. * @param int $promotionCount 团队总人数(20代统计)
  91. */
  92. public function updateTeamStats(int $directCount, int $indirectCount, int $thirdCount, int $promotionCount): void
  93. {
  94. $this->direct_count = $directCount;
  95. $this->indirect_count = $indirectCount;
  96. $this->third_count = $thirdCount;
  97. $this->promotion_count = $promotionCount;
  98. }
  99. /**
  100. * 升级达人等级
  101. */
  102. public function upgradeTalentLevel(int $newLevel): void
  103. {
  104. if ($newLevel > $this->talent_level) {
  105. $this->talent_level = $newLevel;
  106. $this->last_level_update_time = now();
  107. }
  108. }
  109. /**
  110. * 获取团队总人数(20代统计)
  111. */
  112. public function getTotalTeamCount(): int
  113. {
  114. return $this->promotion_count;
  115. }
  116. /**
  117. * 获取前三代团队总人数
  118. */
  119. public function getThreeGenTeamCount(): int
  120. {
  121. return $this->direct_count + $this->indirect_count + $this->third_count;
  122. }
  123. }