attributes['file_num'])) { $this->attributes['file_num'] = ProjectTaskFile::whereTaskId($this->id)->count(); } return $this->attributes['file_num']; } /** * 消息数量 * @return int */ public function getMsgNumAttribute() { if (!isset($this->attributes['msg_num'])) { $this->attributes['msg_num'] = ProjectTaskMsg::whereTaskId($this->id)->count(); } return $this->attributes['msg_num']; } /** * 子任务数量 * @return int */ public function getSubNumAttribute() { if ($this->parent_id > 0) { return 0; } if (!isset($this->attributes['sub_num'])) { $this->attributes['sub_num'] = self::whereParentId($this->id)->count(); } return $this->attributes['sub_num']; } /** * 进度(0-100) * @return int */ public function getPercentAttribute() { if ($this->parent_id > 0) { return 0; } $builder = self::whereParentId($this->id); if (!isset($this->attributes['sub_num'])) { $this->attributes['sub_num'] = $builder->count(); } $subTaskTotal = $this->attributes['sub_num']; if ($subTaskTotal == 0) { return $this->complete_at ? 1 : 0; } $subTaskComplete = $builder->whereNotNull('complete_at')->count(); if ($subTaskComplete == 0) { return 0; } return intval($subTaskComplete / $subTaskTotal * 100); } /** * 是否今日任务 * @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\HasMany */ public function taskUser(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(projectTaskUser::class, 'task_id', 'id')->orderByDesc('id'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function taskTag(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(projectTaskTag::class, 'task_id', 'id')->orderByDesc('id'); } /** * 添加任务 * @param $params * @return array|bool */ public static function addTask($params) { $parent_id = intval($params['parent_id']); $project_id = intval($params['project_id']); $column_id = intval($params['column_id']); $name = $params['name']; $content = $params['content']; $times = $params['times']; $owner = $params['owner']; $subtasks = $params['subtasks']; $p_level = intval($params['p_level']); $p_name = $params['p_name']; $p_color = $params['p_color']; // $retPre = $parent_id ? '子任务' : '任务'; $task = self::createInstance(); $task->parent_id = $parent_id; $task->project_id = $project_id; $task->column_id = $column_id; $task->p_level = $p_level; $task->p_name = $p_name; $task->p_color = $p_color; if ($content) { $task->desc = Base::getHtml($content); } // 标题 if (empty($name)) { return Base::retError($retPre . '描述不能为空'); } elseif (mb_strlen($name) > 255) { return Base::retError($retPre . '描述最多只能设置255个字'); } $task->name = $name; // 时间 if ($times) { list($start, $end) = is_string($times) ? explode(",", $times) : (is_array($times) ? $times : []); if (Base::isDate($start) && Base::isDate($end)) { if ($start != $end) { $task->start_at = Carbon::parse($start); $task->end_at = Carbon::parse($end); } } } // 负责人 if (is_array($owner)) { $owner = Base::arrayFirst($owner); } $owner = $owner ?: User::token2userid(); if (!ProjectUser::whereProjectId($project_id)->whereUserid($owner)->exists()) { return Base::retError($retPre . '负责人填写错误'); } // 创建人 $task->userid = User::token2userid(); // return AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) { $task->save(); if ($owner) { ProjectTaskUser::createInstance([ 'project_id' => $task->parent_id, 'task_id' => $task->id, 'userid' => $owner, 'owner' => 1, ])->save(); } if ($content) { ProjectTaskContent::createInstance([ 'project_id' => $task->parent_id, 'task_id' => $task->id, 'content' => $content, ])->save(); } if ($task->parent_id == 0 && $subtasks && is_array($subtasks)) { foreach ($subtasks as $subtask) { $subtask['parent_id'] = $task->id; $subtask['project_id'] = $task->project_id; $subtask['column_id'] = $task->column_id; $subtask['p_level'] = $task->p_level; $subtask['p_name'] = $task->p_name; $subtask['p_color'] = $task->p_color; $res = self::addTask($subtask); if (Base::isError($res)) { return $res; } } } return Base::retSuccess('添加成功'); }); } }