UserLog.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. namespace App\Module\Game\Models;
  3. use UCore\ModelCore;
  4. /**
  5. * 用户日志模型
  6. *
  7. * field start
  8. * @property int $id 主键ID
  9. * @property int $user_id 用户ID
  10. * @property string $message 日志消息内容
  11. * @property string $source_type 来源类型(fund, item, farm等)
  12. * @property int $source_id 来源记录ID
  13. * @property string $source_table 来源表名
  14. * @property \Carbon\Carbon $original_time 原始日志时间(业务发生时间)
  15. * @property \Carbon\Carbon $collected_at 收集时间(日志收集时间)
  16. * @property \Carbon\Carbon $created_at 创建时间(兼容字段,等同于collected_at)
  17. * field end
  18. */
  19. class UserLog extends ModelCore
  20. {
  21. /**
  22. * 与模型关联的表名
  23. *
  24. * @var string
  25. */
  26. protected $table = 'user_logs';
  27. /**
  28. * 指示模型是否应该被打上时间戳
  29. * 只需要创建时间,不需要更新时间
  30. *
  31. * @var bool
  32. */
  33. public $timestamps = true;
  34. /**
  35. * 更新时间戳字段名
  36. * 设置为null表示不使用updated_at字段
  37. *
  38. * @var string|null
  39. */
  40. const UPDATED_AT = null;
  41. // attrlist start
  42. protected $fillable = [
  43. 'id',
  44. 'user_id',
  45. 'message',
  46. 'source_type',
  47. 'source_id',
  48. 'source_table',
  49. 'original_time',
  50. 'collected_at',
  51. ];
  52. // attrlist end
  53. /**
  54. * 应该被转换为日期的属性
  55. *
  56. * @var array
  57. */
  58. protected $dates = [
  59. 'original_time',
  60. 'collected_at',
  61. 'created_at',
  62. ];
  63. /**
  64. * 应该被转换为原生类型的属性
  65. *
  66. * @var array
  67. */
  68. protected $casts = [
  69. 'user_id' => 'integer',
  70. 'source_id' => 'integer',
  71. 'original_time' => 'datetime',
  72. 'collected_at' => 'datetime',
  73. 'created_at' => 'datetime',
  74. ];
  75. /**
  76. * 关联用户模型
  77. *
  78. * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
  79. */
  80. public function user()
  81. {
  82. return $this->belongsTo(\App\Module\User\Models\User::class, 'user_id', 'id');
  83. }
  84. /**
  85. * 按用户ID查询日志
  86. *
  87. * @param \Illuminate\Database\Eloquent\Builder $query
  88. * @param int $userId
  89. * @return \Illuminate\Database\Eloquent\Builder
  90. */
  91. public function scopeByUser($query, int $userId)
  92. {
  93. return $query->where('user_id', $userId);
  94. }
  95. /**
  96. * 按来源类型查询日志
  97. *
  98. * @param \Illuminate\Database\Eloquent\Builder $query
  99. * @param string $sourceType
  100. * @return \Illuminate\Database\Eloquent\Builder
  101. */
  102. public function scopeBySourceType($query, string $sourceType)
  103. {
  104. return $query->where('source_type', $sourceType);
  105. }
  106. /**
  107. * 按时间范围查询日志
  108. *
  109. * @param \Illuminate\Database\Eloquent\Builder $query
  110. * @param string $startTime
  111. * @param string $endTime
  112. * @return \Illuminate\Database\Eloquent\Builder
  113. */
  114. public function scopeByTimeRange($query, string $startTime, string $endTime)
  115. {
  116. return $query->whereBetween('created_at', [$startTime, $endTime]);
  117. }
  118. /**
  119. * 最新日志优先(按原始时间排序)
  120. *
  121. * @param \Illuminate\Database\Eloquent\Builder $query
  122. * @return \Illuminate\Database\Eloquent\Builder
  123. */
  124. public function scopeLatest($query)
  125. {
  126. return $query->orderBy('original_time', 'desc');
  127. }
  128. /**
  129. * 按原始时间排序(升序)
  130. *
  131. * @param \Illuminate\Database\Eloquent\Builder $query
  132. * @return \Illuminate\Database\Eloquent\Builder
  133. */
  134. public function scopeByOriginalTime($query)
  135. {
  136. return $query->orderBy('original_time', 'asc');
  137. }
  138. /**
  139. * 按收集时间排序
  140. *
  141. * @param \Illuminate\Database\Eloquent\Builder $query
  142. * @return \Illuminate\Database\Eloquent\Builder
  143. */
  144. public function scopeByCollectedTime($query)
  145. {
  146. return $query->orderBy('collected_at', 'desc');
  147. }
  148. /**
  149. * 按原始时间范围查询
  150. *
  151. * @param \Illuminate\Database\Eloquent\Builder $query
  152. * @param string $startTime
  153. * @param string $endTime
  154. * @return \Illuminate\Database\Eloquent\Builder
  155. */
  156. public function scopeByOriginalTimeRange($query, string $startTime, string $endTime)
  157. {
  158. return $query->whereBetween('original_time', [$startTime, $endTime]);
  159. }
  160. /**
  161. * 获取格式化的创建时间
  162. *
  163. * @return string
  164. */
  165. public function getFormattedCreatedAtAttribute(): string
  166. {
  167. return $this->created_at ? $this->created_at->format('Y-m-d H:i:s') : '';
  168. }
  169. /**
  170. * 获取格式化的时间戳(使用原始时间)
  171. *
  172. * @return string
  173. */
  174. public function getTimeAttribute(): string
  175. {
  176. return $this->original_time ? $this->original_time->format('m-d H:i') : '';
  177. }
  178. /**
  179. * 获取格式化的原始时间
  180. *
  181. * @return string
  182. */
  183. public function getFormattedOriginalTimeAttribute(): string
  184. {
  185. return $this->original_time ? $this->original_time->format('Y-m-d H:i:s') : '';
  186. }
  187. /**
  188. * 获取格式化的收集时间
  189. *
  190. * @return string
  191. */
  192. public function getFormattedCollectedAtAttribute(): string
  193. {
  194. return $this->collected_at ? $this->collected_at->format('Y-m-d H:i:s') : '';
  195. }
  196. /**
  197. * 获取时间差(收集时间 - 原始时间)
  198. *
  199. * @return int 秒数
  200. */
  201. public function getCollectionDelayAttribute(): int
  202. {
  203. if (!$this->original_time || !$this->collected_at) {
  204. return 0;
  205. }
  206. return $this->collected_at->timestamp - $this->original_time->timestamp;
  207. }
  208. }