From e2ae2536b38812e529b1fddabd7740769b0bc8e1 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 15 Jun 2021 16:46:56 +0800 Subject: [PATCH] no message --- app/Exceptions/ApiException.php | 5 ++ .../Controllers/Api/ProjectController.php | 89 +++++++++++-------- app/Models/Project.php | 20 +++++ app/Models/ProjectColumn.php | 20 +++++ app/Models/ProjectLog.php | 19 ---- app/Models/ProjectTask.php | 77 ++++++++++++---- .../pages/manage/components/ProjectList.vue | 2 +- 7 files changed, 157 insertions(+), 75 deletions(-) diff --git a/app/Exceptions/ApiException.php b/app/Exceptions/ApiException.php index a06e70fa..ab40d8a3 100644 --- a/app/Exceptions/ApiException.php +++ b/app/Exceptions/ApiException.php @@ -18,6 +18,11 @@ class ApiException extends RuntimeException */ public function __construct($msg = '', $data = [], $code = 0) { + if (is_array($msg) && isset($msg['code'])) { + $code = $msg['code']; + $data = $msg['data']; + $msg = $msg['msg']; + } $this->data = $data; parent::__construct($msg, $code); } diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 1ad59ff7..7c20c9cd 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -96,7 +96,7 @@ class ProjectController extends AbstractController * 添加项目 * * @apiParam {String} name 项目名称 - * @apiParam {String} [desc] 项目描述 + * @apiParam {String} [desc] 项目介绍 * @apiParam {Array} [columns] 流程,格式[流程1, 流程2] */ public function add() @@ -111,7 +111,7 @@ class ProjectController extends AbstractController return Base::retError('项目名称最多只能设置32个字'); } if (mb_strlen($desc) > 255) { - return Base::retError('项目描述最多只能设置255个字'); + return Base::retError('项目介绍最多只能设置255个字'); } //流程 $columns = Request::input('columns'); @@ -153,6 +153,7 @@ class ProjectController extends AbstractController $column['project_id'] = $project->id; ProjectColumn::createInstance($column)->save(); } + $project->addLog("创建项目"); return Base::retSuccess('添加成功', $project->find($project->id)); }); } @@ -162,7 +163,7 @@ class ProjectController extends AbstractController * * @apiParam {Number} project_id 项目ID * @apiParam {String} name 项目名称 - * @apiParam {String} [desc] 项目描述 + * @apiParam {String} [desc] 项目介绍 */ public function edit() { @@ -177,7 +178,7 @@ class ProjectController extends AbstractController return Base::retError('项目名称最多只能设置32个字'); } if (mb_strlen($desc) > 255) { - return Base::retError('项目描述最多只能设置255个字'); + return Base::retError('项目介绍最多只能设置255个字'); } // $project = Project::userProject($project_id); @@ -185,8 +186,14 @@ class ProjectController extends AbstractController return Base::retError('你不是项目负责人'); } // - $project->name = $name; - $project->desc = $desc; + if ($project->name != $name) { + $project->name = $name; + $project->addLog("修改项目名称:{$project->name} => {$name}"); + } + if ($project->desc != $desc) { + $project->desc = $desc; + $project->addLog("修改项目介绍"); + } $project->save(); // return Base::retSuccess('修改成功', $project); @@ -220,6 +227,7 @@ class ProjectController extends AbstractController ]); $index++; } + $project->addLog("调整列表排序"); } else { // 排序任务 foreach ($sort as $item) { @@ -238,6 +246,7 @@ class ProjectController extends AbstractController $index++; } } + $project->addLog("调整任务排序"); } return Base::retSuccess('调整成功'); } @@ -270,6 +279,7 @@ class ProjectController extends AbstractController } ProjectUser::whereProjectId($project->id)->whereNotIn('userid', $array)->delete(); $project->syncDialogUser(); + $project->addLog("修改项目成员"); return Base::retSuccess('修改成功'); }); } @@ -305,6 +315,7 @@ class ProjectController extends AbstractController 'owner' => 1, ]); $project->syncDialogUser(); + $project->addLog("移交项目给会员ID:" . $owner_userid); // return Base::retSuccess('移交成功'); }); @@ -330,6 +341,7 @@ class ProjectController extends AbstractController return AbstractModel::transaction(function() use ($user, $project) { ProjectUser::whereProjectId($project->id)->whereUserid($user->userid)->delete(); $project->syncDialogUser(); + $project->addLog("会员ID:" . $user->userid . " 退出项目"); return Base::retSuccess('退出成功'); }); } @@ -380,6 +392,7 @@ class ProjectController extends AbstractController ]); $column->sort = intval(ProjectColumn::whereProjectId($project->id)->orderByDesc('sort')->value('sort')) + 1; $column->save(); + $column->addLog("创建列表:" . $column->name); // $data = $column->find($column->id); $data->project_task = []; @@ -414,8 +427,14 @@ class ProjectController extends AbstractController return Base::retError('项目不存在或不在成员列表内'); } // - if (Arr::exists($data, 'name')) $column->name = $data['name']; - if (Arr::exists($data, 'color')) $column->color = $data['color']; + if (Arr::exists($data, 'name') && $column->name != $data['name']) { + $column->addLog("修改列表名称:{$column->name} => {$data['name']}"); + $column->name = $data['name']; + } + if (Arr::exists($data, 'color') && $column->color != $data['color']) { + $column->addLog("修改列表颜色:{$column->color} => {$data['color']}"); + $column->color = $data['color']; + } $column->save(); return Base::retSuccess('修改成功', $column); } @@ -462,9 +481,9 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id, ['taskUser', 'taskTag']); + $task = ProjectTask::userTask($task_id, ['taskUser', 'taskTag']); // - $task->project_name = $project->name; + $task->project_name = ProjectColumn::whereId($task->project_id)->value('name'); $task->column_name = ProjectColumn::whereId($task->column_id)->value('name'); // return Base::retSuccess('success', $task); @@ -481,7 +500,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($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); @@ -498,7 +517,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // return Base::retSuccess('success', $task->content ?: json_decode('{}')); } @@ -514,7 +533,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // return Base::retSuccess('success', $task->taskFile); } @@ -559,6 +578,7 @@ class ProjectController extends AbstractController ]); $column->sort = intval(ProjectColumn::whereProjectId($project->id)->orderByDesc('sort')->value('sort')) + 1; $column->save(); + $column->addLog("创建列表:" . $column->name); $newColumn = $column->find($column->id); $newColumn->project_task = []; } @@ -566,19 +586,16 @@ class ProjectController extends AbstractController return Base::retError('任务列表不存在或已被删除'); } // - $result = ProjectTask::addTask(array_merge($data, [ + $task = ProjectTask::addTask(array_merge($data, [ 'parent_id' => 0, 'project_id' => $project->id, 'column_id' => $column->id, ])); - if (Base::isSuccess($result)) { - $result['data'] = [ - 'new_column' => $newColumn, - 'in_top' => intval($data['top']), - 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($result['data']['id']), - ]; - } - return $result; + return Base::retSuccess('添加成功', [ + 'new_column' => $newColumn, + 'in_top' => intval($data['top']), + 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id), + ]); } /** @@ -594,22 +611,19 @@ class ProjectController extends AbstractController $task_id = intval(Request::input('task_id')); $name = Request::input('name'); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // - $result = ProjectTask::addTask([ + $task = ProjectTask::addTask([ 'name' => $name, 'parent_id' => $task->id, 'project_id' => $task->project_id, 'column_id' => $task->column_id, ]); - if (Base::isSuccess($result)) { - $result['data'] = [ - 'new_column' => null, - 'in_top' => 0, - 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($result['data']['id']), - ]; - } - return $result; + return Base::retSuccess('添加成功', [ + 'new_column' => null, + 'in_top' => 0, + 'task' => ProjectTask::with(['taskUser', 'taskTag'])->find($task->id), + ]); } /** @@ -636,7 +650,7 @@ class ProjectController extends AbstractController parse_str(Request::getContent(), $data); $task_id = intval($data['task_id']); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // if (Base::isDate($data['complete_at'])) { // 标记已完成 @@ -674,7 +688,7 @@ class ProjectController extends AbstractController // $task_id = Base::getPostInt('task_id'); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // $path = "uploads/task/" . $task->id . "/"; $image64 = Base::getPostValue('image64'); @@ -709,6 +723,7 @@ class ProjectController extends AbstractController 'userid' => $user->userid, ]); $file->save(); + $task->addLog("上传文件:" . $file->name); return Base::retSuccess("上传成功", $file->find($file->id)); } } @@ -724,7 +739,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // if ($task->parent_id > 0) { return Base::retError('子任务不支持此功能'); @@ -759,7 +774,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // if ($task->parent_id > 0) { return Base::retError('子任务不支持此功能'); @@ -779,7 +794,7 @@ class ProjectController extends AbstractController // $task_id = intval(Request::input('task_id')); // - list($task, $project) = ProjectTask::userTask($task_id); + $task = ProjectTask::userTask($task_id); // return $task->deleteTask(); } diff --git a/app/Models/Project.php b/app/Models/Project.php index 46012a8e..0565d9a2 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -260,6 +260,7 @@ class Project extends AbstractModel $column->deleteColumn(); } if ($this->delete()) { + $this->addLog("删除项目"); return Base::retSuccess('删除成功', $this->toArray()); } else { return Base::retError('删除失败', $this->toArray()); @@ -268,6 +269,25 @@ class Project extends AbstractModel return Base::isSuccess($result); } + /** + * 添加项目日志 + * @param string $detail + * @param int $userid + * @return ProjectLog + */ + public function addLog($detail, $userid = 0) + { + $log = ProjectLog::createInstance([ + 'project_id' => $this->id, + 'column_id' => 0, + 'task_id' => 0, + 'userid' => $userid ?: User::token2userid(), + 'detail' => $detail, + ]); + $log->save(); + return $log; + } + /** * 根据用户获取项目信息(用于判断会员是否存在项目内) * @param int $project_id diff --git a/app/Models/ProjectColumn.php b/app/Models/ProjectColumn.php index a51c9790..3b8de557 100644 --- a/app/Models/ProjectColumn.php +++ b/app/Models/ProjectColumn.php @@ -59,6 +59,7 @@ class ProjectColumn extends AbstractModel $task->deleteTask(); } if ($this->delete()) { + $this->addLog("删除列表:" . $this->name); return Base::retSuccess('删除成功', $this->toArray()); } else { return Base::retError('删除失败', $this->toArray()); @@ -66,4 +67,23 @@ class ProjectColumn extends AbstractModel }); return Base::isSuccess($result); } + + /** + * 添加项目日志 + * @param string $detail + * @param int $userid + * @return ProjectLog + */ + public function addLog($detail, $userid = 0) + { + $log = ProjectLog::createInstance([ + 'project_id' => $this->project_id, + 'column_id' => $this->id, + 'task_id' => 0, + 'userid' => $userid ?: User::token2userid(), + 'detail' => $detail, + ]); + $log->save(); + return $log; + } } diff --git a/app/Models/ProjectLog.php b/app/Models/ProjectLog.php index acf74918..96b6b449 100644 --- a/app/Models/ProjectLog.php +++ b/app/Models/ProjectLog.php @@ -4,26 +4,7 @@ namespace App\Models; /** * Class ProjectLog - * * @package App\Models - * @property int $id - * @property int|null $project_id 项目ID - * @property int|null $task_id 项目ID - * @property int|null $userid 会员ID - * @property string|null $detail 详细信息 - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog query() - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereDetail($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereTaskId($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectLog whereUserid($value) - * @mixin \Eloquent */ class ProjectLog extends AbstractModel { diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index c811c81d..e98f5559 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -241,7 +241,7 @@ class ProjectTask extends AbstractModel /** * 添加任务 * @param $data - * @return array|bool + * @return self */ public static function addTask($data) { @@ -272,9 +272,9 @@ class ProjectTask extends AbstractModel } // 标题 if (empty($name)) { - return Base::retError($retPre . '描述不能为空'); + throw new ApiException($retPre . '描述不能为空'); } elseif (mb_strlen($name) > 255) { - return Base::retError($retPre . '描述最多只能设置255个字'); + throw new ApiException($retPre . '描述最多只能设置255个字'); } $task->name = $name; // 时间 @@ -290,7 +290,7 @@ class ProjectTask extends AbstractModel // 负责人 $owner = intval($owner) ?: User::token2userid(); if (!ProjectUser::whereProjectId($project_id)->whereUserid($owner)->exists()) { - return Base::retError($retPre . '负责人填写错误'); + throw new ApiException($retPre . '负责人填写错误'); } // 创建人 $task->userid = User::token2userid(); @@ -301,7 +301,7 @@ class ProjectTask extends AbstractModel $task->sort = intval(self::whereColumnId($task->column_id)->orderByDesc('sort')->value('sort')) + 1; } // - return AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) { + $result = AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) { $task->save(); if ($owner) { ProjectTaskUser::createInstance([ @@ -329,10 +329,13 @@ class ProjectTask extends AbstractModel } } } - return Base::retSuccess('添加成功', [ - 'id' => $task->id - ]); + $task->addLog("创建{任务}:" . $task->name); + return Base::retSuccess('success', $task); }); + if (Base::isError($result)) { + throw new ApiException($result); + } + return $result['data']; } /** @@ -344,13 +347,14 @@ class ProjectTask extends AbstractModel { return AbstractModel::transaction(function () use ($data) { // 标题 - if (Arr::exists($data, 'name')) { + if (Arr::exists($data, 'name') && $this->name != $data['name']) { if (empty($data['name'])) { return Base::retError('任务描述不能为空'); } elseif (mb_strlen($data['name']) > 255) { return Base::retError('任务描述最多只能设置255个字'); } $this->name = $data['name']; + $this->addLog("修改{任务}标题:{$this->name} => {$data['name']}"); } // 负责人 if (Arr::exists($data, 'owner')) { @@ -370,6 +374,7 @@ class ProjectTask extends AbstractModel 'owner' => 1, ]); $this->syncDialogUser(); + $this->addLog("修改{任务}负责人为会员ID:" . $owner); } } // 计划时间 @@ -384,6 +389,7 @@ class ProjectTask extends AbstractModel $this->end_at = Carbon::parse($end); } } + $this->addLog("修改{任务}时间"); } // 以下紧顶级任务可修改 if ($this->parent_id === 0) { @@ -406,10 +412,12 @@ class ProjectTask extends AbstractModel } ProjectTaskUser::whereTaskId($this->id)->where('owner', '!=', 1)->whereNotIn('userid', $array)->delete(); $this->syncDialogUser(); + $this->addLog("修改协助人员"); } // 背景色 - if (Arr::exists($data, 'color')) { + if (Arr::exists($data, 'color') && $this->color != $data['color']) { $this->color = $data['color']; + $this->addLog("修改任务背景色:{$this->color} => {$data['color']}"); } // 内容 if (Arr::exists($data, 'content')) { @@ -420,16 +428,24 @@ class ProjectTask extends AbstractModel 'content' => $data['content'], ]); $this->desc = Base::getHtml($data['content']); + $this->addLog("修改任务详细描述"); } // 优先级 - if (Arr::exists($data, 'p_level')) { + $p = false; + if (Arr::exists($data, 'p_level') && $this->p_level != $data['p_level']) { $this->p_level = intval($data['p_level']); + $p = true; } - if (Arr::exists($data, 'p_name')) { + if (Arr::exists($data, 'p_name') && $this->p_name != $data['p_name']) { $this->p_name = trim($data['p_name']); + $p = true; } - if (Arr::exists($data, 'p_color')) { + if (Arr::exists($data, 'p_color') && $this->p_color != $data['p_color']) { $this->p_color = trim($data['p_color']); + $p = true; + } + if ($p) { + $this->addLog("修改任务优先级"); } } $this->save(); @@ -519,6 +535,7 @@ class ProjectTask extends AbstractModel if ($complete_at === null) { // 标记未完成 $this->complete_at = null; + $this->addLog("{任务}标记未完成:" . $this->name); } else { // 标记已完成 if ($this->parent_id == 0) { @@ -527,6 +544,7 @@ class ProjectTask extends AbstractModel } } $this->complete_at = $complete_at; + $this->addLog("{任务}标记已完成:" . $this->name); } $this->save(); return Base::retSuccess('修改成功'); @@ -542,11 +560,13 @@ class ProjectTask extends AbstractModel { return AbstractModel::transaction(function () use ($archived_at) { if ($archived_at === null) { - // 标记未完成 + // 取消归档 $this->archived_at = null; + $this->addLog("任务取消归档:" . $this->name); } else { - // 标记已完成 + // 归档任务 $this->archived_at = $archived_at; + $this->addLog("任务归档:" . $this->name); } $this->save(); return Base::retSuccess('修改成功', $this->toArray()); @@ -564,6 +584,7 @@ class ProjectTask extends AbstractModel WebSocketDialog::whereId($this->dialog_id)->delete(); } if ($this->delete()) { + $this->addLog("删除{任务}:" . $this->name); return Base::retSuccess('删除成功', $this->toArray()); } else { return Base::retError('删除失败', $this->toArray()); @@ -571,11 +592,31 @@ class ProjectTask extends AbstractModel }); } + /** + * 添加任务日志 + * @param string $detail + * @param int $userid + * @return ProjectLog + */ + public function addLog($detail, $userid = 0) + { + $detail = str_replace("{任务}", $this->parent_id > 0 ? "子任务" : "任务", $detail); + $log = ProjectLog::createInstance([ + 'project_id' => $this->project_id, + 'column_id' => $this->column_id, + 'task_id' => $this->parent_id ?: $this->id, + 'userid' => $userid ?: User::token2userid(), + 'detail' => $detail, + ]); + $log->save(); + return $log; + } + /** * 根据会员ID获取任务、项目信息(用于判断会员是否存在项目内) * @param int $task_id * @param array $with - * @return array(ProjectTask, Project) + * @return self */ public static function userTask($task_id, $with = []) { @@ -583,7 +624,7 @@ class ProjectTask extends AbstractModel if (empty($task)) { throw new ApiException('任务不存在'); } - // 项目 + // $project = Project::select([ 'projects.*', 'project_users.owner' ]) ->join('project_users', 'projects.id', '=', 'project_users.project_id') ->where('projects.id', $task->project_id) @@ -592,6 +633,6 @@ class ProjectTask extends AbstractModel if (empty($project)) { throw new ApiException('项目不存在或不在成员列表内'); } - return [$task, $project]; + return $task; } } diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index 1678e2ee..b0eb8edb 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -309,7 +309,7 @@ - +