From e6794bce8c510931cf04cf7d52101e12d3898123 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 9 Jun 2021 11:15:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=92=E6=A1=A3=E3=80=81=E5=88=A0=E9=99=A4?= =?UTF-8?q?=20=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 79 +++++++++++++-- app/Models/ProjectColumn.php | 2 +- app/Models/ProjectTask.php | 38 +++++++- .../pages/manage/components/ProjectList.vue | 95 +++++++++++-------- resources/assets/sass/project-list.scss | 15 +++ 5 files changed, 179 insertions(+), 50 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 5adb4d22..e0d1b181 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -605,7 +605,6 @@ class ProjectController extends AbstractController /** * 删除任务列表 * - * @apiParam {Number} project_id 项目ID * @apiParam {Number} column_id 列表ID(留空为添加列表) */ public function column__delete() @@ -617,22 +616,22 @@ class ProjectController extends AbstractController $user = User::IDE($user['data']); } // - $project_id = intval(Request::input('project_id')); $column_id = intval(Request::input('column_id')); + // 列表 + $column = ProjectColumn::whereId($column_id)->first(); + if (empty($column)) { + return Base::retError('列表不存在'); + } // 项目 $project = Project::select($this->projectSelect) ->join('project_users', 'projects.id', '=', 'project_users.project_id') - ->where('projects.id', $project_id) + ->where('projects.id', $column->project_id) ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { return Base::retError('项目不存在或不在成员列表内'); } // - $column = ProjectColumn::whereId($column_id)->whereProjectId($project_id)->first(); - if (empty($column)) { - return Base::retError('列表不存在'); - } if ($column->deleteColumn()) { return Base::retSuccess('删除成功'); } @@ -763,4 +762,70 @@ class ProjectController extends AbstractController } return $result; } + + /** + * 归档任务 + * + * @apiParam {Number} task_id 任务ID + */ + public function task__archived() + { + $user = User::authE(); + if (Base::isError($user)) { + return $user; + } else { + $user = User::IDE($user['data']); + } + // + $task_id = intval(Request::input('task_id')); + // 任务 + $task = ProjectTask::whereId($task_id)->first(); + if (empty($task)) { + return Base::retError('任务不存在'); + } + // 项目 + $project = Project::select($this->projectSelect) + ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->where('projects.id', $task->project_id) + ->where('project_users.userid', $user->userid) + ->first(); + if (empty($project)) { + return Base::retError('项目不存在或不在成员列表内'); + } + // + return $task->archivedTask(Carbon::now()); + } + + /** + * 删除任务 + * + * @apiParam {Number} task_id 任务ID + */ + public function task__delete() + { + $user = User::authE(); + if (Base::isError($user)) { + return $user; + } else { + $user = User::IDE($user['data']); + } + // + $task_id = intval(Request::input('task_id')); + // 任务 + $task = ProjectTask::whereId($task_id)->first(); + if (empty($task)) { + return Base::retError('任务不存在'); + } + // 项目 + $project = Project::select($this->projectSelect) + ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->where('projects.id', $task->project_id) + ->where('project_users.userid', $user->userid) + ->first(); + if (empty($project)) { + return Base::retError('项目不存在或不在成员列表内'); + } + // + return $task->deleteTask(); + } } diff --git a/app/Models/ProjectColumn.php b/app/Models/ProjectColumn.php index 8d2be94b..2d240993 100644 --- a/app/Models/ProjectColumn.php +++ b/app/Models/ProjectColumn.php @@ -44,7 +44,7 @@ class ProjectColumn extends AbstractModel */ public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasMany { - return $this->hasMany(projectTask::class, 'column_id', 'id')->orderBy('sort')->orderBy('id'); + return $this->hasMany(projectTask::class, 'column_id', 'id')->whereNull('archived_at')->orderBy('sort')->orderBy('id'); } /** diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 4c688df6..8213d0f7 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -16,6 +16,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $project_id 项目ID * @property int|null $column_id 列表ID * @property string|null $name 标题 + * @property string|null $color 颜色 * @property string|null $desc 描述 * @property string|null $start_at 计划开始时间 * @property string|null $end_at 计划结束时间 @@ -46,6 +47,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask query() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedAt($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) @@ -147,7 +149,7 @@ class ProjectTask extends AbstractModel } $subTaskTotal = $this->attributes['sub_num']; if ($subTaskTotal == 0) { - return $this->complete_at ? 1 : 0; + return $this->complete_at ? 100 : 0; } $subTaskComplete = $builder->whereNotNull('complete_at')->count(); if ($subTaskComplete == 0) { @@ -336,6 +338,7 @@ class ProjectTask extends AbstractModel if (Arr::exists($data, 'color')) { $this->color = $data['color']; } + // 内容 if ($content && $this->parent_id === 0) { ProjectTaskContent::updateInsert([ 'project_id' => $this->parent_id, @@ -343,6 +346,7 @@ class ProjectTask extends AbstractModel ], [ 'content' => $content, ]); + $this->desc = Base::getHtml($content); } // 计划时间 if ($times) { @@ -401,4 +405,36 @@ class ProjectTask extends AbstractModel return Base::retSuccess('修改成功'); }); } + + /** + * 归档任务、取消归档 + * @param Carbon|null $archived_at 归档时间 + * @return array|bool + */ + public function archivedTask($archived_at) + { + return AbstractModel::transaction(function () use ($archived_at) { + if ($archived_at === null) { + // 标记未完成 + $this->archived_at = null; + } else { + // 标记已完成 + $this->archived_at = $archived_at; + } + $this->save(); + return Base::retSuccess('修改成功'); + }); + } + + /** + * 删除任务 + * @return array|bool + */ + public function deleteTask() + { + return AbstractModel::transaction(function () { + $this->delete(); + return Base::retSuccess('删除成功'); + }); + } } diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index cff299f1..8f0d5fc3 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -54,7 +54,7 @@ -
+
{{$L('完成')}}
+ +
+ {{$L('归档')}} +
+
{{$L('删除')}} @@ -861,7 +866,6 @@ export default { $A.apiAjax({ url: 'project/column/delete', data: { - project_id: this.projectDetail.id, column_id: column.id, }, complete: () => { @@ -902,8 +906,25 @@ export default { complete_at: false }) } + else if (command === 'archived') { + $A.modalConfirm({ + title: '归档任务', + content: '你确定要归档任务【' + task.name + '】吗?', + loading: true, + onOk: () => { + this.archivedOrRemoveTask(task, 'archived'); + } + }); + } else if (command === 'delete') { - this.removeTask(task); + $A.modalConfirm({ + title: '删除任务', + content: '你确定要删除任务【' + task.name + '】吗?', + loading: true, + onOk: () => { + this.archivedOrRemoveTask(task, 'delete'); + } + }); } else if (command.name) { this.updateTask(task, { @@ -951,46 +972,38 @@ export default { }); }, - removeTask(task) { - $A.modalConfirm({ - title: '删除任务', - content: '你确定要删除任务【' + task.name + '】吗?', - loading: true, - onOk: () => { - if (task.loading === true) { - return; - } - this.$set(task, 'loading', true); - // - $A.apiAjax({ - url: 'project/task/delete', - data: { - task_id: task.id, - }, - complete: () => { - this.$set(task, 'loading', false); - }, - error: () => { - this.$Modal.remove(); - $A.modalAlert('网络繁忙,请稍后再试!'); - }, - success: ({ret, data, msg}) => { - this.$Modal.remove(); - if (ret === 1) { - $A.messageSuccess(msg); - let column = this.projectDetail.project_column.find(({id}) => id === column.id); - if (column) { - let index = column.project_task.findIndex(({id}) => id === task.id); - if (index > -1) { - column.project_task.splice(index, 1); - } - } - this.$store.commit('getProjectDetail', this.projectDetail.id); - }else{ - $A.modalError(msg, 301); + archivedOrRemoveTask(task, type) { + if (task.loading === true) { + return; + } + this.$set(task, 'loading', true); + $A.apiAjax({ + url: 'project/task/' + type, + data: { + task_id: task.id, + }, + complete: () => { + this.$set(task, 'loading', false); + }, + error: () => { + this.$Modal.remove(); + $A.modalAlert('网络繁忙,请稍后再试!'); + }, + success: ({ret, data, msg}) => { + this.$Modal.remove(); + if (ret === 1) { + $A.messageSuccess(msg); + let column = this.projectDetail.project_column.find(({id}) => id === task.column_id); + if (column) { + let index = column.project_task.findIndex(({id}) => id === task.id); + if (index > -1) { + column.project_task.splice(index, 1); } } - }); + this.$store.commit('getProjectDetail', this.projectDetail.id); + }else{ + $A.modalError(msg, 301); + } } }); }, diff --git a/resources/assets/sass/project-list.scss b/resources/assets/sass/project-list.scss index 2781b072..5df8d0d8 100644 --- a/resources/assets/sass/project-list.scss +++ b/resources/assets/sass/project-list.scss @@ -610,6 +610,9 @@ display: flex; align-items: center; > i { + width: 18px; + height: 18px; + line-height: 18px; font-size: 18px; margin-right: 8px; padding: 0; @@ -624,6 +627,18 @@ color: #f00; } } + &:hover { + > i { + &.ivu-icon { + color: #66b1ff; + } + } + &.red { + > i { + color: #f00; + } + } + } } } &.column-more {