Project.php 3.3 KB

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