$taskFile * @property-read int|null $task_file_count * @property-read \Illuminate\Database\Eloquent\Collection $taskTag * @property-read int|null $task_tag_count * @property-read \Illuminate\Database\Eloquent\Collection $taskUser * @property-read int|null $task_user_count * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask allData($userid = null) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask authData($userid = null, $owner = null) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask betweenTime($start, $end, $type = 'taskTime') * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelAppend() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelHidden() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel change($array) * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel getKeyValue() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask query() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel remove() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedFollow($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedUserid($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColor($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColumnId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCompleteAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDeletedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDeletedUserid($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDesc($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDialogId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereEndAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereFlowItemId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereFlowItemName($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereLoop($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereLoopAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePColor($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePLevel($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePName($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereParentId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereProjectId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereSort($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereStartAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUserid($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereVisibility($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask withoutTrashed() * @mixin \Eloquent */ class ProjectTask extends AbstractModel { use SoftDeletes; protected $appends = [ 'file_num', 'msg_num', 'sub_num', 'sub_complete', 'percent', 'today', 'overdue', ]; /** * 附件数量 * @return int */ public function getFileNumAttribute() { if (!isset($this->appendattrs['file_num'])) { $this->appendattrs['file_num'] = $this->parent_id > 0 ? 0 : ProjectTaskFile::whereTaskId($this->id)->count(); } return $this->appendattrs['file_num']; } /** * 消息数量 * @return int */ public function getMsgNumAttribute() { if (!isset($this->appendattrs['msg_num'])) { $this->appendattrs['msg_num'] = $this->dialog_id ? WebSocketDialogMsg::whereDialogId($this->dialog_id)->count() : 0; } return $this->appendattrs['msg_num']; } /** * 生成子任务数据 */ private function generateSubTaskData() { if ($this->parent_id > 0) { $this->appendattrs['sub_num'] = 0; $this->appendattrs['sub_complete'] = 0; $this->appendattrs['percent'] = $this->complete_at ? 100 : 0; return; } if (!isset($this->appendattrs['sub_num'])) { $builder = self::whereParentId($this->id)->whereNull('archived_at'); $this->appendattrs['sub_num'] = $builder->count(); $this->appendattrs['sub_complete'] = $builder->whereNotNull('complete_at')->count(); // if ($this->complete_at) { $this->appendattrs['percent'] = 100; } elseif ($this->appendattrs['sub_complete'] == 0) { $this->appendattrs['percent'] = 0; } else { $this->appendattrs['percent'] = intval($this->appendattrs['sub_complete'] / $this->appendattrs['sub_num'] * 100); } } } /** * 子任务数量 * @return int */ public function getSubNumAttribute() { $this->generateSubTaskData(); return $this->appendattrs['sub_num']; } /** * 子任务已完成数量 * @return int */ public function getSubCompleteAttribute() { $this->generateSubTaskData(); return $this->appendattrs['sub_complete']; } /** * 进度(0-100) * @return int */ public function getPercentAttribute() { $this->generateSubTaskData(); return $this->appendattrs['percent']; } /** * 是否今日任务 * @return bool */ public function getTodayAttribute() { if ($this->end_at) { $end_at = Carbon::parse($this->end_at); if ($end_at->toDateString() == Carbon::now()->toDateString()) { return true; } } return false; } /** * 是否过期 * @return bool */ public function getOverdueAttribute() { if ($this->end_at) { if (Carbon::parse($this->end_at)->lt(Carbon::now())) { return true; } } return false; } /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function project(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(Project::class, 'id', 'project_id'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function projectColumn(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(ProjectColumn::class, 'id', 'column_id'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function content(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(ProjectTaskContent::class, 'task_id', 'id')->orderByDesc('id'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function taskFile(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(ProjectTaskFile::class, 'task_id', 'id')->orderByDesc('id')->limit(50); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function taskUser(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(ProjectTaskUser::class, 'task_id', 'id')->orderByDesc('owner')->orderByDesc('id'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function taskTag(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(ProjectTaskTag::class, 'task_id', 'id')->orderBy('id'); } /** * 查询所有任务(与正常查询多返回owner字段) * @param self $query * @param null $userid * @return self */ public function scopeAllData($query, $userid = null) { $userid = $userid ?: User::userid(); $query ->select([ 'project_tasks.*', 'project_task_users.owner' ]) ->leftJoin('project_task_users', function ($leftJoin) use ($userid) { $leftJoin ->on('project_task_users.userid', '=', DB::raw($userid)) ->on('project_tasks.id', '=', 'project_task_users.task_id'); }); return $query; } /** * 查询自己负责或参与的任务 * @param self $query * @param null $userid * @param null $owner * @return self */ public function scopeAuthData($query, $userid = null, $owner = null) { $userid = $userid ?: User::userid(); $query ->select([ 'project_tasks.*', 'project_task_users.owner' ]) ->selectRaw("1 AS assist") ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') ->where('project_task_users.userid', $userid); if ($owner !== null) { $query->where('project_task_users.owner', $owner); } return $query; } /** * 指定范围内的任务 * @param $query * @param $start * @param $end * @param $type * @return mixed */ public function scopeBetweenTime($query, $start, $end, $type = 'taskTime') { $query->where(function ($q1) use ($start, $end, $type) { switch ($type) { case 'createdTime': $q1->where('project_tasks.created_at', '>=', $start)->where('project_tasks.created_at', '<=', $end); break; default: $q1->where(function ($q2) use ($start) { $q2->where('project_tasks.start_at', '<=', $start)->where('project_tasks.end_at', '>=', $start); })->orWhere(function ($q2) use ($end) { $q2->where('project_tasks.start_at', '<=', $end)->where('project_tasks.end_at', '>=', $end); })->orWhere(function ($q2) use ($start, $end) { $q2->where('project_tasks.start_at', '>', $start)->where('project_tasks.end_at', '<', $end); }); break; } }); return $query; } /** * 生成描述 * @param $content * @return string */ public static function generateDesc($content) { $content = preg_replace_callback('/