diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 6006a494..b33228a3 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -161,7 +161,16 @@ class ProjectController extends AbstractController "owner": 1, // 是否项目负责人 "owner_userid": 1, // 项目负责人ID - "project_user": [], // 项目成员 + "project_user": [ // 项目成员 + { + "id": 2, + "project_id": 2, + "userid": 1, + "owner": 1, + "created_at": "2022-01-02 00:55:32", + "updated_at": "2022-01-02 00:55:32" + } + ], "task_num": 9, "task_complete": 0, @@ -1022,7 +1031,7 @@ class ProjectController extends AbstractController } // $task = ProjectTask::userTask($file->task_id, [], true, $project); - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人操作'); } // @@ -1125,7 +1134,7 @@ class ProjectController extends AbstractController $name = Request::input('name'); // $task = ProjectTask::userTask($task_id, [], true, $project); - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人添加'); } // @@ -1180,39 +1189,24 @@ class ProjectController extends AbstractController // $task = ProjectTask::userTask($task_id, [], true, $project); // - if (count($task->taskUser->where('owner', 1)) > 0) { + if ($task->hasOwner()) { // 任务有负责人后仅限项目或任务负责人修改 - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人修改'); } } - // - $updateComplete = false; + // 更新任务 + $updateProject = false; $updateContent = false; $updateSubTask = false; - if (Base::isDate($data['complete_at'])) { - // 标记已完成 - if ($task->complete_at) { - return Base::retError('任务已完成'); - } - $task->completeTask(Carbon::now()); - $updateComplete = true; - } elseif (Arr::exists($data, 'complete_at')) { - // 标记未完成 - if (!$task->complete_at) { - return Base::retError('未完成任务'); - } - $task->completeTask(null); - $updateComplete = true; - } else { - // 更新任务 - $task->updateTask($data, $updateContent, $updateSubTask); - } + $task->updateTask($data, $updateProject, $updateContent, $updateSubTask); + // $data = ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(); - $data['is_update_complete'] = $updateComplete; + $data['is_update_project'] = $updateProject; $data['is_update_content'] = $updateContent; $data['is_update_subtask'] = $updateSubTask; $task->pushMsg('update', $data); + // return Base::retSuccess('修改成功', $data); } @@ -1240,7 +1234,7 @@ class ProjectController extends AbstractController $task_id = Base::getPostInt('task_id'); // $task = ProjectTask::userTask($task_id, [], true, $project); - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人上传'); } // @@ -1357,7 +1351,7 @@ class ProjectController extends AbstractController $type = Request::input('type', 'add'); // $task = ProjectTask::userTask($task_id, [], false, $project); - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人操作'); } // @@ -1394,7 +1388,7 @@ class ProjectController extends AbstractController $task_id = intval(Request::input('task_id')); // $task = ProjectTask::userTask($task_id, [], true, $project); - if (!$task->isOwnerParent() && !$project->owner) { + if (!$task->isOwner() && !$project->owner) { return Base::retError('仅限项目或任务负责人删除'); } // diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 49cf59d1..dae53c3d 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -433,13 +433,32 @@ class ProjectTask extends AbstractModel /** * 修改任务 * @param $data - * @param $updateContent - * @param $updateSubTask + * @param bool $updateProject 是否更新项目数据(项目统计) + * @param bool $updateContent 是否更新任务详情 + * @param bool $updateSubTask 是否更新子任务 * @return bool */ - public function updateTask($data, &$updateContent = false, &$updateSubTask = false) + public function updateTask($data, &$updateProject = false, &$updateContent = false, &$updateSubTask = false) { - AbstractModel::transaction(function () use ($data, &$updateContent, &$updateSubTask) { + AbstractModel::transaction(function () use ($data, &$updateProject, &$updateContent, &$updateSubTask) { + // 状态 + if (Arr::exists($data, 'complete_at')) { + if (Base::isDate($data['complete_at'])) { + // 标记已完成 + if ($this->complete_at) { + throw new ApiException('任务已完成'); + } + $this->completeTask(Carbon::now()); + } else { + // 标记未完成 + if (!$this->complete_at) { + throw new ApiException('未完成任务'); + } + $this->completeTask(null); + } + $updateProject = true; + return; + } // 标题 if (Arr::exists($data, 'name') && $this->name != $data['name']) { if (empty($data['name'])) { @@ -486,6 +505,7 @@ class ProjectTask extends AbstractModel $row->delete(); } } + $updateProject = true; $this->syncDialogUser(); } // 计划时间 @@ -677,12 +697,24 @@ class ProjectTask extends AbstractModel return $user->owner ? 2 : 1; } + /** + * 是否有负责人 + * @return bool + */ + public function hasOwner() + { + if (!isset($this->appendattrs['has_owner'])) { + $this->appendattrs['has_owner'] = ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->exists(); + } + return $this->appendattrs['has_owner']; + } + /** * 是否负责人 * @param bool $isParent 是父级任务的负责人也算 * @return bool */ - public function isOwnerParent($isParent = true) { + public function isOwner($isParent = true) { if ($this->owner) { return true; } @@ -714,7 +746,7 @@ class ProjectTask extends AbstractModel throw new ApiException('子任务未完成'); } } - if (count($this->taskUser->where('owner', 1)) == 0) { + if (!$this->hasOwner()) { throw new ApiException('请先领取任务'); } $this->complete_at = $complete_at; diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index 3d4a26ef..e4133ea0 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -571,9 +571,9 @@ export default { columnList() { const {projectId, columns, tasks} = this; - let list = $A.cloneJSON(columns.filter(({project_id}) => { + const list = columns.filter(({project_id}) => { return project_id == projectId - })).sort((a, b) => { + }).sort((a, b) => { if (a.sort != b.sort) { return a.sort - b.sort; } @@ -589,7 +589,7 @@ export default { return a.id - b.id; }); }) - return Object.freeze(list); + return list; }, myList() { @@ -751,17 +751,42 @@ export default { } this.sortData = newSort; // + const data = { + project_id: this.projectId, + sort: this.sortData, + only_column: only_column === true ? 1 : 0 + }; this.sortDisabled = true; this.$store.dispatch("call", { url: 'project/sort', - data: { - project_id: this.projectId, - sort: this.sortData, - only_column: only_column === true ? 1 : 0 - }, + data, }).then(({msg}) => { $A.messageSuccess(msg); this.sortDisabled = false; + // + if (!data.only_column) { + let sort, + upTask = []; + data.sort.forEach((item) => { + sort = -1; + upTask.push(...item.task.map(id => { + sort++; + upTask.push(...this.tasks.filter(({parent_id}) => parent_id == id).map(({id}) => { + return { + id, + sort, + column_id: item.id, + } + })) + return { + id, + sort, + column_id: item.id, + } + })) + }) + this.$store.dispatch("saveTask", upTask) + } }).catch(({msg}) => { $A.modalError(msg); this.sortDisabled = false; diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 738aec58..47b7cbf9 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -862,8 +862,8 @@ export default { if (data.parent_id > 0 && state.tasks.findIndex(({id}) => id == data.parent_id) === -1) { dispatch("getTaskOne", data.parent_id); } - if (data.is_update_complete) { - data.is_update_complete = false; + if (data.is_update_project) { + data.is_update_project = false; dispatch("getProjectOne", data.project_id); } if (data.is_update_content) {