From dcffeded9a5b8b155241e056e8680f29ba98dcf0 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 30 May 2024 21:56:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E6=80=A7=E5=90=8E=E4=BB=8D=E5=AD=98=E5=9C=A8=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 9 ++-- app/Models/ProjectTask.php | 8 ++- app/Observers/ProjectTaskObserver.php | 53 ++++++++++++++++--- resources/assets/js/store/actions.js | 3 ++ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 2a976e481..58b3f5c8c 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1553,12 +1553,12 @@ class ProjectController extends AbstractController // 项目可见性 $project_userid = ProjectUser::whereProjectId($task->project_id)->whereOwner(1)->value('userid'); // 项目负责人 if ($task->visibility != 1 && $user->userid != $project_userid) { - $taskUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); //任务负责人、协助人 - $subTaskUserids = ProjectTaskUser::whereTaskPid($task_id)->pluck('userid')->toArray(); //子任务负责人、协助人 - $visibleUserids = ProjectTaskVisibilityUser::whereTaskId($task_id)->pluck('userid')->toArray(); //可见人 + $taskUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); //任务负责人、协助人 + $subTaskUserids = ProjectTaskUser::whereTaskPid($task_id)->pluck('userid')->toArray(); //子任务负责人、协助人 + $visibleUserids = ProjectTaskVisibilityUser::whereTaskId($task_id)->pluck('userid')->toArray(); //可见人 $visibleUserids = array_merge($taskUserids, $subTaskUserids, $visibleUserids); if (!in_array($user->userid, $visibleUserids)) { - return Base::retError('无任务权限'); + return Base::retError('无任务权限', ['task_id' => $task_id, 'force' => 1], -4002); } } // @@ -1940,6 +1940,7 @@ class ProjectController extends AbstractController * @apiParam {String} [content] 任务详情(子任务不支持) * @apiParam {String} [color] 背景色(子任务不支持) * @apiParam {Array} [assist] 修改协助人员(子任务不支持) + * @apiParam {Number} [visibility] 修改可见性 * @apiParam {Array} [visibility_appointor] 修改可见性人员 * * @apiParam {Number} [p_level] 优先级相关(子任务不支持) diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 2a16aa2da..bba4dd9ba 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -9,6 +9,7 @@ use Carbon\Carbon; use App\Module\Base; use App\Tasks\PushTask; use App\Exceptions\ApiException; +use App\Observers\ProjectTaskObserver; use Hhxsv5\LaravelS\Swoole\Task\Task; use Illuminate\Database\Eloquent\SoftDeletes; @@ -744,8 +745,8 @@ class ProjectTask extends AbstractModel // 可见性 if (Arr::exists($data, 'visibility') || Arr::exists($data, 'visibility_appointor')) { if (Arr::exists($data, 'visibility')) { - ProjectTask::whereId($data['task_id'])->update(['visibility' => $data["visibility"]]); - ProjectTask::whereParentId($data['task_id'])->update(['visibility' => $data["visibility"]]); + $this->visibility = $data["visibility"]; + ProjectTask::whereParentId($data['task_id'])->change(['visibility' => $data["visibility"]]); } ProjectTaskVisibilityUser::whereTaskId($data['task_id'])->delete(); if (Arr::exists($data, 'visibility_appointor')) { @@ -758,6 +759,9 @@ class ProjectTask extends AbstractModel ])->save(); } } + if (!Arr::exists($data, 'visibility')) { + ProjectTaskObserver::visibilityUpdate($this); + } } } // 计划时间(原则:子任务时间在主任务时间内) diff --git a/app/Observers/ProjectTaskObserver.php b/app/Observers/ProjectTaskObserver.php index 11dc52a19..3c2590819 100644 --- a/app/Observers/ProjectTaskObserver.php +++ b/app/Observers/ProjectTaskObserver.php @@ -4,6 +4,8 @@ namespace App\Observers; use App\Models\Deleted; use App\Models\ProjectTask; +use App\Models\ProjectTaskUser; +use App\Models\ProjectTaskVisibilityUser; use App\Models\ProjectUser; class ProjectTaskObserver @@ -27,11 +29,14 @@ class ProjectTaskObserver */ public function updated(ProjectTask $projectTask) { + if ($projectTask->isDirty('visibility')) { + self::visibilityUpdate($projectTask); + } if ($projectTask->isDirty('archived_at')) { if ($projectTask->archived_at) { - Deleted::record('projectTask', $projectTask->id, $this->userids($projectTask)); + Deleted::record('projectTask', $projectTask->id, self::userids($projectTask)); } else { - Deleted::forget('projectTask', $projectTask->id, $this->userids($projectTask)); + Deleted::forget('projectTask', $projectTask->id, self::userids($projectTask)); } } } @@ -44,7 +49,7 @@ class ProjectTaskObserver */ public function deleted(ProjectTask $projectTask) { - Deleted::record('projectTask', $projectTask->id, $this->userids($projectTask)); + Deleted::record('projectTask', $projectTask->id, self::userids($projectTask)); } /** @@ -55,7 +60,7 @@ class ProjectTaskObserver */ public function restored(ProjectTask $projectTask) { - Deleted::forget('projectTask', $projectTask->id, $this->userids($projectTask)); + Deleted::forget('projectTask', $projectTask->id, self::userids($projectTask)); } /** @@ -71,10 +76,46 @@ class ProjectTaskObserver /** * @param ProjectTask $projectTask + * @param string[]|string $dataType * @return array */ - private function userids(ProjectTask $projectTask) + public static function userids(ProjectTask $projectTask, array|string $dataType = 'project') { - return ProjectUser::whereProjectId($projectTask->project_id)->pluck('userid')->toArray(); + if (!is_array($dataType)) { + $dataType = [$dataType]; + } + if (in_array('project', $dataType)) { + return ProjectUser::whereProjectId($projectTask->project_id)->pluck('userid')->toArray(); + } + $array = []; + if (in_array('task', $dataType)) { + $array = array_merge($array, ProjectTaskUser::whereTaskId($projectTask->id)->pluck('userid')->toArray()); + } + if (in_array('visibility', $dataType)) { + $array = array_merge($array, ProjectTaskVisibilityUser::whereTaskId($projectTask->id)->pluck('userid')->toArray()); + } + return array_values(array_filter(array_unique($array))); + } + + /** + * 可见性更新 + * @param ProjectTask $projectTask + */ + public static function visibilityUpdate(ProjectTask $projectTask) + { + $projectUserids = self::userids($projectTask); + switch ($projectTask->visibility) { + case 1: + Deleted::forget('projectTask', $projectTask->id, $projectUserids); + break; + case 2: + case 3: + $dataType = $projectTask->visibility == 2 ? ['task'] : ['task', 'visibility']; + $forgetUserids = self::userids($projectTask, $dataType); + $recordUserids = array_diff($projectUserids, $forgetUserids); + Deleted::record('projectTask', $projectTask->id, $recordUserids); + Deleted::forget('projectTask', $projectTask->id, $forgetUserids); + break; + } } } diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index c81d5b30d..7938ce29f 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -208,6 +208,9 @@ export default { if (ret === -4001) { dispatch("forgetProject", data.project_id) } else if (ret === -4002) { + if (data.force === 1) { + state.taskArchiveView = 0 + } dispatch("forgetTask", data.task_id) } else if (ret === -4003) { dispatch("forgetDialog", data.dialog_id)