1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- namespace App\Models;
- use App\Http\Requests\IndexHelper;
- use App\Models\Enums\DisplayIndexObjectType;
- use App\Models\Enums\ProjectACL;
- use App\Models\Scopes\CompanyScope;
- use function DragonCode\Support\Instances\when;
- use EloquentFilter\Filterable;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\Eloquent\Factories\HasFactory;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Database\Eloquent\SoftDeletes;
- use Illuminate\Support\Facades\Auth;
- class Project extends Model
- {
- use HasFactory, Filterable,SoftDeletes;
- protected $fillable = [
- "name","code","const","status","begin","end","latitude","longitude","type","acl","whitelist","description","cost_unit"
- ];
- protected static function booted(): void
- {
- static::addGlobalScope(new CompanyScope);
- static::creating(function (Project $project){
- $type =DisplayIndexObjectType::PROJECT;
- $displayIndex = IndexHelper::getObjectMaxIndex($type);
- $project->display_id =$displayIndex;
- });
- }
- /**
- * ACL 访问控制作用域
- *
- * @param Builder $query
- * @param string $id 单个操作时使用,限制范围
- * @return void
- */
- public function scopeAllowed(Builder $query, string $id = null,bool $isAction=false): void
- {
- $projectIds = Project::query()->leftJoin("team_members", "projects.id", "=", "team_members.project_id")
- ->when($id == null, fn($query) => $query->filter(request()->query()))
- ->when($isAction===false,fn($query)=>$query->filter(request()->query()))
- ->when($id, fn($query) => $query->where("projects.id", $id))
- ->when($isAction,fn($query)=>$query->where(function ($query){
- $query->where("team_members.user_id", Auth::id())->where('team_members.limited',1);
- }))
- ->where(function ($query) {
- $query->where("team_members.user_id", Auth::id())
- ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
- })
- ->pluck("projects.id")
- ->unique();
- $query->whereIn("id", $projectIds->toArray());
- }
- public function plans(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
- {
- return $this->belongsToMany(Plan::class, 'project_plan')->withTrashed();
- }
- public function assets(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
- {
- return $this->belongsToMany(Asset::class, 'project_asset')->withTrashed();
- }
- public function requirements(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
- {
- return $this->belongsToMany(Requirement::class, 'project_requirement');
- }
- public function teamMembers(): \Illuminate\Database\Eloquent\Relations\HasMany
- {
- return $this->hasMany(TeamMember::class);
- }
- public function tasks(): \Illuminate\Database\Eloquent\Relations\HasMany
- {
- return $this->hasMany(Task::class);
- }
- public function requirementsGroup(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
- {
- return $this->belongsToMany(RequirementGroup::class, 'project_requirement');
- }
- public function library(){
- return $this->hasMany(Library::class ,'project_id')->where('type', 'project');
- }
- }
|