Project.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Enums\ProjectACL;
  4. use App\Models\Scopes\CompanyScope;
  5. use function DragonCode\Support\Instances\when;
  6. use EloquentFilter\Filterable;
  7. use Illuminate\Database\Eloquent\Builder;
  8. use Illuminate\Database\Eloquent\Factories\HasFactory;
  9. use Illuminate\Database\Eloquent\Model;
  10. use Illuminate\Database\Eloquent\SoftDeletes;
  11. use Illuminate\Support\Facades\Auth;
  12. class Project extends Model
  13. {
  14. use HasFactory, Filterable,SoftDeletes;
  15. protected $fillable = [
  16. "name","code","const","status","begin","end","latitude","longitude","type","acl","whitelist","description"
  17. ];
  18. protected static function booted(): void
  19. {
  20. static::addGlobalScope(new CompanyScope);
  21. }
  22. /**
  23. * ACL 访问控制作用域
  24. *
  25. * @param Builder $query
  26. * @param string $id 单个操作时使用,限制范围
  27. * @return void
  28. */
  29. public function scopeAllowed(Builder $query, string $id = null,bool $isAction=false): void
  30. {
  31. $projectIds = Project::query()->leftJoin("team_members", "projects.id", "=", "team_members.project_id")
  32. ->when($id == null, fn($query) => $query->filter(request()->query()))
  33. ->when($isAction===false,fn($query)=>$query->filter(request()->query()))
  34. ->when($id, fn($query) => $query->where("projects.id", $id))
  35. ->when($isAction,fn($query)=>$query->where(function ($query){
  36. $query->where("team_members.user_id", Auth::id())->where('team_members.limited',1);
  37. }))
  38. ->where(function ($query) {
  39. $query->where("team_members.user_id", Auth::id())
  40. ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
  41. })
  42. ->pluck("projects.id")
  43. ->unique();
  44. $query->whereIn("id", $projectIds->toArray());
  45. }
  46. public function plans(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  47. {
  48. return $this->belongsToMany(Plan::class, 'project_plan')->withTrashed();
  49. }
  50. public function assets(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  51. {
  52. return $this->belongsToMany(Asset::class, 'project_asset')->withTrashed();
  53. }
  54. public function requirements(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  55. {
  56. return $this->belongsToMany(Requirement::class, 'project_requirement')->withTrashed();
  57. }
  58. public function teamMembers(): \Illuminate\Database\Eloquent\Relations\HasMany
  59. {
  60. return $this->hasMany(TeamMember::class);
  61. }
  62. public function tasks(): \Illuminate\Database\Eloquent\Relations\HasMany
  63. {
  64. return $this->hasMany(Task::class);
  65. }
  66. public function requirementsGroup(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  67. {
  68. return $this->belongsToMany(RequirementGroup::class, 'project_requirement');
  69. }
  70. public function library(){
  71. return $this->hasMany(Library::class ,'project_id')->where('type', 'project');
  72. }
  73. }