UrsProfit.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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\UrsProfitType;
  7. use App\Module\UrsPromotion\Enums\UrsPromotionRelationLevel;
  8. use App\Module\UrsPromotion\Enums\UrsTalentLevel;
  9. /**
  10. * URS团队收益记录模型
  11. *
  12. * field start
  13. * @property int $id 主键ID
  14. * @property int $urs_user_id 获得收益的URS用户ID
  15. * @property int $urs_promotion_member_id 团队成员URS用户ID(产生收益的用户)
  16. * @property int $promotion_member_farm_user_id 产生收益的农场用户ID
  17. * @property int $source_id 收益来源ID
  18. * @property string $source_type 收益来源类型
  19. * @property string $profit_type 收益类型:promotion_reward推广收益,planting_reward种植收益
  20. * @property int $relation_level 推荐层级:1直推,2间推,3三推
  21. * @property float $original_amount 原始收益金额
  22. * @property float $profit_amount 分成收益金额,资金
  23. * @property float $profit_rate 分成比例
  24. * @property int $reward_group_id 奖励组ID(推广收益时使用)
  25. * @property int $talent_level 获得收益时的达人等级
  26. * @property int $farm_user_id 实际发放奖励的农场用户ID(冗余字段,便于查询)
  27. * @property int $status 状态:1正常,0取消
  28. * @property \Carbon\Carbon $created_at 创建时间
  29. * @property \Carbon\Carbon $updated_at 更新时间
  30. * @property int $item_number 物品数量
  31. * @property int $item_id 物品ID
  32. * field end
  33. * @property-read User $user 获得收益的用户
  34. * @property-read User $promotionMember 团队成员
  35. */
  36. class UrsProfit extends ModelCore
  37. {
  38. /**
  39. * 数据库表名
  40. */
  41. protected $table = 'urs_promotion_profits';
  42. /**
  43. * 可批量赋值的属性
  44. */
  45. protected $fillable = [
  46. 'urs_user_id',
  47. 'urs_promotion_member_id',
  48. 'promotion_member_farm_user_id',
  49. 'source_id',
  50. 'source_type',
  51. 'profit_type',
  52. 'relation_level',
  53. 'original_amount',
  54. 'profit_amount',
  55. 'profit_rate',
  56. 'talent_level',
  57. 'farm_user_id',
  58. 'status',
  59. ];
  60. /**
  61. * 属性类型转换
  62. */
  63. protected $casts = [
  64. 'urs_user_id' => 'integer',
  65. 'urs_promotion_member_id' => 'integer',
  66. 'promotion_member_farm_user_id' => 'integer',
  67. 'source_id' => 'integer',
  68. 'relation_level' => 'integer',
  69. 'original_amount' => 'decimal:10',
  70. 'profit_amount' => 'decimal:10',
  71. 'profit_rate' => 'decimal:6',
  72. 'talent_level' => 'integer',
  73. 'farm_user_id' => 'integer',
  74. 'status' => 'integer',
  75. 'created_at' => 'datetime',
  76. 'updated_at' => 'datetime',
  77. ];
  78. /**
  79. * 状态常量
  80. */
  81. const STATUS_CANCELLED = 0; // 取消
  82. const STATUS_NORMAL = 1; // 正常
  83. const STATUS_SKIPPED = 2; // 跳过(用户未进入农场)
  84. /**
  85. * 获取用户映射关系
  86. */
  87. public function userMapping(): BelongsTo
  88. {
  89. return $this->belongsTo(UrsUserMapping::class, 'urs_user_id', 'urs_user_id');
  90. }
  91. /**
  92. * 获取团队成员映射关系
  93. */
  94. public function promotionMemberMapping(): BelongsTo
  95. {
  96. return $this->belongsTo(UrsUserMapping::class, 'urs_promotion_member_id', 'urs_user_id');
  97. }
  98. /**
  99. * 获取农场用户关系(通过冗余字段)
  100. */
  101. public function farmUser(): BelongsTo
  102. {
  103. return $this->belongsTo(User::class, 'farm_user_id');
  104. }
  105. /**
  106. * 获取产生收益的农场用户关系
  107. */
  108. public function promotionMemberFarmUser(): BelongsTo
  109. {
  110. return $this->belongsTo(User::class, 'promotion_member_farm_user_id');
  111. }
  112. /**
  113. * 获取收益类型枚举
  114. */
  115. public function getProfitTypeEnum(): ?UrsProfitType
  116. {
  117. return UrsProfitType::fromString($this->profit_type);
  118. }
  119. /**
  120. * 获取收益类型名称
  121. */
  122. public function getProfitTypeName(): string
  123. {
  124. return $this->getProfitTypeEnum()?->getName() ?? '未知';
  125. }
  126. /**
  127. * 获取推荐层级枚举
  128. */
  129. public function getRelationLevelEnum(): ?UrsPromotionRelationLevel
  130. {
  131. return UrsPromotionRelationLevel::tryFrom($this->relation_level);
  132. }
  133. /**
  134. * 获取推荐层级名称
  135. */
  136. public function getRelationLevelName(): string
  137. {
  138. return $this->getRelationLevelEnum()?->getName() ?? '未知';
  139. }
  140. /**
  141. * 获取达人等级枚举
  142. */
  143. public function getTalentLevelEnum(): UrsTalentLevel
  144. {
  145. return UrsTalentLevel::fromInt($this->talent_level) ?? UrsTalentLevel::NONE;
  146. }
  147. /**
  148. * 获取达人等级名称
  149. */
  150. public function getTalentLevelName(): string
  151. {
  152. return $this->getTalentLevelEnum()->getName();
  153. }
  154. /**
  155. * 检查收益是否正常
  156. */
  157. public function isNormal(): bool
  158. {
  159. return $this->status === self::STATUS_NORMAL;
  160. }
  161. /**
  162. * 检查收益是否跳过
  163. */
  164. public function isSkipped(): bool
  165. {
  166. return $this->status === self::STATUS_SKIPPED;
  167. }
  168. /**
  169. * 取消收益
  170. */
  171. public function cancel(): void
  172. {
  173. $this->status = self::STATUS_CANCELLED;
  174. }
  175. /**
  176. * 设置为跳过状态
  177. */
  178. public function skip(): void
  179. {
  180. $this->status = self::STATUS_SKIPPED;
  181. }
  182. /**
  183. * 获取状态文本
  184. */
  185. public function getStatusText(): string
  186. {
  187. return match($this->status) {
  188. self::STATUS_NORMAL => '正常',
  189. self::STATUS_CANCELLED => '取消',
  190. self::STATUS_SKIPPED => '跳过',
  191. default => '未知',
  192. };
  193. }
  194. }