From 11b4aea20c7b5e8e2ff5484c33a1abb8cc860533 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sun, 20 Jun 2021 17:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 190 +++--- app/Models/Project.php | 17 +- app/Models/ProjectTask.php | 7 +- resources/assets/js/pages/manage.vue | 28 +- resources/assets/js/pages/manage/calendar.vue | 93 +-- .../js/pages/manage/components/Calendar.vue | 7 +- .../pages/manage/components/DialogWrapper.vue | 5 +- .../js/pages/manage/components/TaskDetail.vue | 4 +- .../js/pages/manage/components/TaskUpload.vue | 13 +- .../assets/js/pages/manage/dashboard.vue | 78 ++- resources/assets/js/store/actions.js | 551 ++++++++---------- resources/assets/js/store/getters.js | 19 +- resources/assets/js/store/mutations.js | 170 ------ resources/assets/js/store/state.js | 22 +- 14 files changed, 542 insertions(+), 662 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 1c52be66..e8b1a37a 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -24,6 +24,39 @@ use Request; */ class ProjectController extends AbstractController { + /** + * 任务统计 + */ + public function statistics() + { + User::auth(); + + $data = []; + + // 今日待完成 + $between = [ + Carbon::today()->startOfDay(), + Carbon::today()->endOfDay() + ]; + $data['today'] = ProjectTask::authData() + ->whereNull('project_tasks.complete_at') + ->where('project_tasks.parent_id', 0) + ->where(function ($query) use ($between) { + $query->whereBetween('project_tasks.start_at', $between)->orWhereBetween('project_tasks.end_at', $between); + }) + ->count(); + + // 超期未完成 + $data['overdue'] = ProjectTask::authData() + ->whereNull('project_tasks.complete_at') + ->where('project_tasks.parent_id', 0) + ->whereNotNull('project_tasks.end_at') + ->where('project_tasks.end_at', '<', Carbon::now()) + ->count(); + + return Base::retSuccess('success', $data); + } + /** * 获取项目列表 * @@ -43,11 +76,11 @@ class ProjectController extends AbstractController } /** - * 获取项目基础信息 + * 获取一个项目信息 * * @apiParam {Number} project_id 项目ID */ - public function basic() + public function one() { User::auth(); // @@ -58,46 +91,17 @@ class ProjectController extends AbstractController return Base::retSuccess('success', $project); } - /** - * 获取项目详细信息 - * - * @apiParam {Number} project_id 项目ID - */ - public function detail() - { - User::auth(); - // - $project_id = intval(Request::input('project_id')); - // - $project = Project::with(['projectColumn' => function($query) { - $query->with(['projectTask' => function($taskQuery) { - $taskQuery->with(['taskUser', 'taskTag'])->where('parent_id', 0); - }]); - }, 'projectUser']) - ->select(project::projectSelect) - ->authData() - ->where('projects.id', $project_id) - ->first(); - if (empty($project)) { - return Base::retError('项目不存在或不在成员列表内'); - } - $owner_user = $project->projectUser->where('owner', 1)->first(); - $project->owner_userid = $owner_user ? $owner_user->userid : 0; - // - return Base::retSuccess('success', $project); - } - /** * 添加项目 * * @apiParam {String} name 项目名称 * @apiParam {String} [desc] 项目介绍 - * @apiParam {Array} [columns] 流程,格式[流程1, 流程2] + * @apiParam {Array} [columns] 列表,格式[列表1, 列表2] */ public function add() { $user = User::auth(); - //项目名称 + // 项目名称 $name = trim(Request::input('name', '')); $desc = trim(Request::input('desc', '')); if (mb_strlen($name) < 2) { @@ -108,7 +112,7 @@ class ProjectController extends AbstractController if (mb_strlen($desc) > 255) { return Base::retError('项目介绍最多只能设置255个字'); } - //流程 + // 列表 $columns = Request::input('columns'); if (!is_array($columns)) $columns = []; $insertColumns = []; @@ -129,9 +133,9 @@ class ProjectController extends AbstractController ]; } if (count($insertColumns) > 30) { - return Base::retError('项目流程最多不能超过30个'); + return Base::retError('项目列表最多不能超过30个'); } - //开始创建 + // 开始创建 $project = Project::createInstance([ 'name' => $name, 'desc' => $desc, @@ -150,7 +154,7 @@ class ProjectController extends AbstractController } }); // - $data = $project->find($project->id); + $data = Project::find($project->id); $data->addLog("创建项目"); $data->pushMsg('add', $data->toArray()); return Base::retSuccess('添加成功', $data); @@ -374,6 +378,30 @@ class ProjectController extends AbstractController return Base::retSuccess('删除成功', ['id' => $project->id]); } + /** + * 获取任务列表 + * + * @apiParam {Number} project_id 项目ID + * + * @apiParam {Number} [page] 当前页,默认:1 + * @apiParam {Number} [pagesize] 每页显示数量,默认:100,最大:200 + */ + public function column__lists() + { + User::auth(); + // + $project_id = intval(Request::input('project_id')); + // 项目 + $project = Project::userProject($project_id); + // + $list = ProjectColumn::whereProjectId($project->id) + ->orderBy('sort') + ->orderBy('id') + ->paginate(Base::getPaginate(200, 100)); + // + return Base::retSuccess('success', $list); + } + /** * 添加任务列表 * @@ -400,7 +428,7 @@ class ProjectController extends AbstractController $column->save(); $column->addLog("创建列表:" . $column->name); // - $data = $column->find($column->id); + $data = ProjectColumn::find($column->id); $data->project_task = []; $data->pushMsg("add", $data->toArray()); return Base::retSuccess('添加成功', $data); @@ -471,54 +499,46 @@ class ProjectController extends AbstractController } // $column->deleteColumn(); - return Base::retSuccess('删除成功', $column->toArray()); - } - - /** - * 任务统计 - */ - public function task__statistics() - { - User::auth(); - - $data = []; - - // 今日待完成 - $between = [ - Carbon::today()->startOfDay(), - Carbon::today()->endOfDay() - ]; - $data['today'] = ProjectTask::authData()->where(function($query) use ($between) { - $query->whereBetween('project_tasks.start_at', $between)->orWhereBetween('project_tasks.end_at', $between); - })->count(); - - // 超期未完成 - $data['overdue'] = ProjectTask::authData()->whereNotNull('project_tasks.end_at')->where('project_tasks.end_at', '<', Carbon::now())->count(); - - return Base::retSuccess('success', $data); + return Base::retSuccess('删除成功', ['id' => $column->id]); } /** * 任务列表 * - * @apiParam {String} name 任务名称(包含) - * @apiParam {Array} time 时间范围,如:['2020-12-12', '2020-12-30'] - * @apiParam {String} time_before 指定时间之前,如:2020-12-30 00:00:00(填写此项时time参数无效) + * @apiParam {Number} [project_id] 项目ID + * @apiParam {Number} [parent_id] 主任务ID(填写后 project_id 无效) + * @apiParam {String} [name] 任务描述关键词 + * @apiParam {Array} [time] 时间范围,如:['2020-12-12', '2020-12-30'] + * @apiParam {String} [time_before] 指定时间之前,如:2020-12-30 00:00:00(填写此项时time参数无效) */ public function task__lists() { User::auth(); // - $builder = ProjectTask::select(ProjectTask::taskSelect)->authData(); + $builder = ProjectTask::with(['taskUser', 'taskTag']); // + $parent_id = intval(Request::input('parent_id')); + $project_id = intval(Request::input('project_id')); $name = Request::input('name'); $time = Request::input('time'); $time_before = Request::input('time_before'); + // + if ($parent_id > 0) { + ProjectTask::userTask($parent_id); + $builder->where('parent_id', $parent_id)->whereNull('archived_at'); + } elseif ($project_id > 0) { + Project::userProject($project_id); + $builder->where('project_id', $project_id)->whereNull('archived_at'); + } else { + $builder->authData(); + } + // if ($name) { $builder->where(function($query) use ($name) { $query->where('project_tasks.name', 'like', '%,' . $name . ',%'); }); } + // if (Base::isDateOrTime($time_before)) { $builder->whereNotNull('project_tasks.end_at')->where('project_tasks.end_at', '<', Carbon::parse($time_before)); } elseif (is_array($time)) { @@ -539,11 +559,11 @@ class ProjectController extends AbstractController } /** - * 获取任务基础信息 + * 获取单个任务信息 * * @apiParam {Number} task_id 任务ID */ - public function task__basic() + public function task__one() { User::auth(); // @@ -557,23 +577,6 @@ class ProjectController extends AbstractController return Base::retSuccess('success', $task); } - /** - * 获取子任务 - * - * @apiParam {Number} task_id 任务ID - */ - public function task__sublist() - { - User::auth(); - // - $task_id = intval(Request::input('task_id')); - // - $task = ProjectTask::userTask($task_id); - // - $data = ProjectTask::with(['taskUser', 'taskTag'])->where('parent_id', $task->id)->whereNull('archived_at')->get(); - return Base::retSuccess('success', $data); - } - /** * 获取任务详细描述 * @@ -661,10 +664,10 @@ class ProjectController extends AbstractController ])); $data = [ 'new_column' => $newColumn, - 'in_top' => intval($data['top']), - 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id), + 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(), ]; $task->pushMsg('add', $data); + $data['task']['owner'] = 1; return Base::retSuccess('添加成功', $data); } @@ -691,10 +694,10 @@ class ProjectController extends AbstractController ]); $data = [ 'new_column' => null, - 'in_top' => 0, - 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id), + 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id)->toArray(), ]; $task->pushMsg('add', $data); + $data['task']['owner'] = 1; return Base::retSuccess('添加成功', $data); } @@ -800,7 +803,8 @@ class ProjectController extends AbstractController 'userid' => $user->userid, ]); $file->save(); - $file = $file->find($file->id); + // + $file = ProjectTaskFile::find($file->id); $task->addLog("上传文件:" . $file->name); $task->pushMsg('upload', $file->toArray()); return Base::retSuccess("上传成功", $file); @@ -863,7 +867,7 @@ class ProjectController extends AbstractController } // $task->archivedTask(Carbon::now()); - return Base::retSuccess('保存成功', $task); + return Base::retSuccess('保存成功', ['id' => $task->id]); } /** @@ -880,7 +884,7 @@ class ProjectController extends AbstractController $task = ProjectTask::userTask($task_id); // $task->deleteTask(); - return Base::retSuccess('删除成功', $task); + return Base::retSuccess('删除成功', ['id' => $task->id]); } /** diff --git a/app/Models/Project.php b/app/Models/Project.php index 43487334..19d8d1da 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -20,6 +20,7 @@ use Request; * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read int $owner_userid * @property-read int $task_complete * @property-read int $task_my_complete * @property-read int $task_my_num @@ -65,6 +66,7 @@ class Project extends AbstractModel 'task_my_num', 'task_my_complete', 'task_my_percent', + 'owner_userid', ]; /** @@ -145,6 +147,19 @@ class Project extends AbstractModel return $this->appendattrs['task_my_percent']; } + /** + * 负责人会员ID + * @return int + */ + public function getOwnerUseridAttribute() + { + if (!isset($this->appendattrs['owner_userid'])) { + $ownerUser = $this->projectUser->where('owner', 1)->first(); + $this->appendattrs['owner_userid'] = $ownerUser ? $ownerUser->userid : 0; + } + return $this->appendattrs['owner_userid']; + } + /** * @param $value * @return int|mixed @@ -338,7 +353,7 @@ class Project extends AbstractModel */ public static function userProject($project_id) { - $project = Project::select(self::projectSelect) + $project = self::select(self::projectSelect) ->authData() ->where('projects.id', intval($project_id)) ->first(); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index d4ddfe43..8d26470a 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -258,15 +258,16 @@ class ProjectTask extends AbstractModel { $pre = DB::getTablePrefix(); $user = $user ?: User::auth(); - $query->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_pid') + $query->select(ProjectTask::taskSelect) + ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_pid') ->whereExists(function ($der) use ($pre) { $der->select(DB::raw(1)) ->from('project_task_users as B') + ->where('B.owner', 1) ->whereColumn('project_task_users.task_pid', '=', 'B.task_pid') ->havingRaw("max({$pre}B.id) = {$pre}project_task_users.id"); }) ->whereNull('project_tasks.archived_at') - ->where('project_tasks.parent_id', 0) ->where('project_task_users.userid', $user->userid); return $query; } @@ -688,7 +689,7 @@ class ProjectTask extends AbstractModel */ public static function userTask($task_id, $with = []) { - $task = ProjectTask::with($with)->whereId(intval($task_id))->first(); + $task = self::with($with)->whereId(intval($task_id))->first(); if (empty($task)) { throw new ApiException('任务不存在'); } diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 20376fcd..0a95257b 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -34,7 +34,7 @@