From 42e4ddbd1734ff76eb1e118a20f43ee4448a2f56 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 13 Jan 2026 11:55:45 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=BA=A7=E8=81=94=E5=90=8C=E6=AD=A5=E7=BC=BA=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 Manticore 搜索索引在特定场景下 allowed_users 权限未能正确同步的问题: Observer.updated 补充: - ProjectUserObserver: 处理项目成员移交时的权限级联 - ProjectTaskUserObserver: 处理任务成员移交时的权限更新 批量操作绕过 Observer 修复(delete → remove): - FileUser: deleteFileAll/deleteFileUser 方法 - ProjectTask: 可见性设置时的批量删除 - ProjectController: 子任务升级和任务复制时的批量删除 文件批量更新封装: - File 新增 updateChildFilesUserid() 方法,统一处理子文件 userid 更新及 Manticore 同步 --- app/Http/Controllers/Api/FileController.php | 4 ++-- .../Controllers/Api/ProjectController.php | 4 ++-- app/Models/File.php | 22 +++++++++++++++++++ app/Models/FileUser.php | 4 ++-- app/Models/ProjectTask.php | 2 +- app/Observers/ProjectTaskUserObserver.php | 13 ++++++++++- app/Observers/ProjectUserObserver.php | 10 ++++++++- 7 files changed, 50 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index e1f8bf501..bf8f213e2 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -418,7 +418,7 @@ class FileController extends AbstractController throw new ApiException("{$file->name} 内含有共享文件,无法移动到另一个共享文件夹内"); } $file->userid = $toShareFile->userid; - File::where('pids', 'LIKE', "%,{$file->id},%")->update(['userid' => $toShareFile->userid]); + $file->updateChildFilesUserid($toShareFile->userid); } // $tmpId = $pid; @@ -430,7 +430,7 @@ class FileController extends AbstractController } } else { $file->userid = $user->userid; - File::where('pids', 'LIKE', "%,{$file->id},%")->update(['userid' => $user->userid]); + $file->updateChildFilesUserid($user->userid); } // $file->pid = $pid; diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 620e45c4e..cee34f93e 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -2379,7 +2379,7 @@ class ProjectController extends AbstractController $task->save(); ProjectTaskUser::whereTaskId($task->id)->update(['task_pid' => $task->id]); if ($task->visibility == 3 && !empty($visibilityUserids)) { - ProjectTaskVisibilityUser::whereTaskId($task->id)->delete(); + ProjectTaskVisibilityUser::whereTaskId($task->id)->remove(); foreach (array_unique($visibilityUserids) as $userid) { if (!$userid) { continue; @@ -3031,7 +3031,7 @@ class ProjectController extends AbstractController $taskTag->project_id = $project->id; $taskTag->save(); } - ProjectTaskUser::whereTaskId($copy->id)->delete(); + ProjectTaskUser::whereTaskId($copy->id)->remove(); $copy->setRelation('taskUser', collect()); $copy->setRelation('project', $project); $updateData = [ diff --git a/app/Models/File.php b/app/Models/File.php index c65ce8d39..dca2c6afe 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -6,6 +6,8 @@ use Request; use App\Module\Apps; use App\Module\Base; use App\Tasks\PushTask; +use App\Tasks\ManticoreSyncTask; +use App\Observers\AbstractObserver; use App\Exceptions\ApiException; use Illuminate\Support\Facades\DB; use Hhxsv5\LaravelS\Swoole\Task\Task; @@ -623,6 +625,26 @@ class File extends AbstractModel return true; } + /** + * 批量更新子文件的 userid 并同步到 Manticore + * @param int $userid 新的 userid + * @return int 更新的文件数量 + */ + public function updateChildFilesUserid(int $userid): int + { + self::where('pids', 'like', "%,{$this->id},%")->update(['userid' => $userid]); + + // 批量 update 绕过 Observer,手动触发 Manticore 同步 + $childFileIds = self::where('pids', 'like', "%,{$this->id},%") + ->where('type', '!=', 'folder') + ->pluck('id') + ->toArray(); + foreach ($childFileIds as $childFileId) { + AbstractObserver::taskDeliver(new ManticoreSyncTask('file_sync', ['id' => $childFileId])); + } + return count($childFileIds); + } + /** * 获取文件分享链接 * @param $userid diff --git a/app/Models/FileUser.php b/app/Models/FileUser.php index ce146f43f..cc31457cd 100644 --- a/app/Models/FileUser.php +++ b/app/Models/FileUser.php @@ -45,7 +45,7 @@ class FileUser extends AbstractModel } else { FileLink::whereFileId($file_id)->delete(); } - FileUser::whereFileId($file_id)->delete(); + FileUser::whereFileId($file_id)->remove(); }); } /** @@ -58,7 +58,7 @@ class FileUser extends AbstractModel { return AbstractModel::transaction(function() use ($userid, $file_id) { FileLink::whereFileId($file_id)->whereUserid($userid)->delete(); - return self::whereFileId($file_id)->whereUserid($userid)->delete(); + return self::whereFileId($file_id)->whereUserid($userid)->remove(); }); } } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 446c37bc8..81f1cf73a 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -800,7 +800,7 @@ class ProjectTask extends AbstractModel $this->visibility = $data["visibility"]; ProjectTask::whereParentId($data['task_id'])->change(['visibility' => $data["visibility"]]); } - ProjectTaskVisibilityUser::whereTaskId($data['task_id'])->delete(); + ProjectTaskVisibilityUser::whereTaskId($data['task_id'])->remove(); if (Arr::exists($data, 'visibility_appointor')) { foreach ($data['visibility_appointor'] as $uid) { if ($uid) { diff --git a/app/Observers/ProjectTaskUserObserver.php b/app/Observers/ProjectTaskUserObserver.php index efc7c2ae1..812b1632f 100644 --- a/app/Observers/ProjectTaskUserObserver.php +++ b/app/Observers/ProjectTaskUserObserver.php @@ -42,7 +42,18 @@ class ProjectTaskUserObserver extends AbstractObserver */ public function updated(ProjectTaskUser $projectTaskUser) { - // + // userid 变更时需要更新任务权限(移交场景) + if ($projectTaskUser->isDirty('userid')) { + self::taskDeliver(new ManticoreSyncTask('update_task_allowed_users', [ + 'task_id' => $projectTaskUser->task_id, + ])); + // 如果是子任务,也更新父任务 + if ($projectTaskUser->task_pid) { + self::taskDeliver(new ManticoreSyncTask('update_task_allowed_users', [ + 'task_id' => $projectTaskUser->task_pid, + ])); + } + } } /** diff --git a/app/Observers/ProjectUserObserver.php b/app/Observers/ProjectUserObserver.php index ac27a14b7..d3b9648ff 100644 --- a/app/Observers/ProjectUserObserver.php +++ b/app/Observers/ProjectUserObserver.php @@ -36,7 +36,15 @@ class ProjectUserObserver extends AbstractObserver */ public function updated(ProjectUser $projectUser) { - // + // userid 变更时需要更新项目权限和级联任务权限(移交场景) + if ($projectUser->isDirty('userid')) { + self::taskDeliver(new ManticoreSyncTask('update_project_allowed_users', [ + 'project_id' => $projectUser->project_id, + ])); + self::taskDeliver(new ManticoreSyncTask('cascade_project_users', [ + 'project_id' => $projectUser->project_id, + ])); + } } /**