Task.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Enums\TaskACL;
  4. use App\Models\Scopes\CompanyScope;
  5. use EloquentFilter\Filterable;
  6. use Illuminate\Database\Eloquent\Builder;
  7. use Illuminate\Database\Eloquent\Factories\HasFactory;
  8. use Illuminate\Database\Eloquent\Model;
  9. use Illuminate\Database\Eloquent\SoftDeletes;
  10. use Illuminate\Support\Facades\Auth;
  11. class Task extends Model
  12. {
  13. use HasFactory, Filterable, SoftDeletes;
  14. protected $guarded = [
  15. 'id'
  16. ];
  17. protected $casts = [
  18. 'mailto' => 'array',
  19. 'naming_rules' => 'array',
  20. ];
  21. protected static function booted(): void
  22. {
  23. static::addGlobalScope(new CompanyScope);
  24. }
  25. /**
  26. * ACL 访问控制作用域
  27. *
  28. * @param Builder $query
  29. * @param string $id 单个操作时使用,限制范围
  30. * @return void
  31. */
  32. public function scopeAllowed(Builder $query, string $id = null): void
  33. {
  34. $taskIds = Task::query()->leftJoin("team_members", "tasks.project_id", "=", "team_members.project_id")
  35. ->when($id == null, fn($query) => $query->filter(request()->query()))
  36. ->when($id, fn($query) => $query->where("tasks.id", $id))
  37. ->where(function($query) {
  38. $query->where("team_members.user_id", Auth::id())
  39. ->orWhere(fn($query) => $query->where("tasks.acl", TaskACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
  40. })
  41. ->pluck("tasks.id")
  42. ->unique();
  43. $query->whereIn("id", $taskIds->toArray());
  44. }
  45. public function requirement(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  46. {
  47. return $this->belongsTo(Requirement::class);
  48. }
  49. public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  50. {
  51. return $this->belongsTo(Project::class);
  52. }
  53. public function namingRule(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  54. {
  55. return $this->belongsTo(NamingRule::class);
  56. }
  57. public function createdBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  58. {
  59. return $this->belongsTo(User::class, 'created_by');
  60. }
  61. public function reviewBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  62. {
  63. return $this->belongsTo(User::class, 'review_by');
  64. }
  65. public function finishedBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  66. {
  67. return $this->belongsTo(User::class, 'finished_by');
  68. }
  69. public function approveBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  70. {
  71. return $this->belongsTo(User::class, 'approve_by');
  72. }
  73. public function canceledBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  74. {
  75. return $this->belongsTo(User::class, 'canceled_by');
  76. }
  77. public function children(): \Illuminate\Database\Eloquent\Relations\HasMany
  78. {
  79. return $this->hasMany(Task::class, 'parent_id');
  80. }
  81. public function closedBy(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  82. {
  83. return $this->belongsTo(User::class, 'closed_by');
  84. }
  85. public function assignTo(): \Illuminate\Database\Eloquent\Relations\BelongsTo
  86. {
  87. return $this->belongsTo(User::class, 'assign');
  88. }
  89. public function containers(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  90. {
  91. return $this->belongsToMany(Container::class, "task_container")->withPivot(['id']);
  92. }
  93. }