diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index b1d2e02d5..cab44778c 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -32,10 +32,11 @@ use App\Models\ProjectTaskUser; use App\Models\WebSocketDialog; use App\Exceptions\ApiException; use App\Models\ProjectPermission; -use App\Module\BillMultipleExport; use App\Models\WebSocketDialogMsg; +use App\Module\BillMultipleExport; use Illuminate\Support\Facades\DB; use App\Models\ProjectTaskFlowChange; +use App\Models\ProjectTaskVisibilityUser; /** * @apiDefine project @@ -1032,15 +1033,20 @@ class ProjectController extends AbstractController $query->where('project_users.owner', 1); $query->where('project_users.userid', $userid); }); - $builder->leftJoin('project_task_users as project_p_task_users', function ($query) use($userid) { - $query->on('project_p_task_users.task_pid', '=', 'project_tasks.parent_id'); - $query->where('project_p_task_users.userid', $userid); + $builder->leftJoin('project_task_users as project_sub_task_users', function ($query) use($userid) { + $query->on('project_sub_task_users.task_pid', '=', 'project_tasks.parent_id'); + $query->where('project_sub_task_users.userid', $userid); + }); + $builder->leftJoin('project_task_visibility_users', function ($query) use($userid) { + $query->on('project_task_visibility_users.task_id', '=', 'project_tasks.id'); + $query->where('project_task_visibility_users.userid', $userid); }); $builder->where(function ($query) use ($userid) { $query->where("project_tasks.visibility", 1); $query->orWhere("project_users.userid", $userid); $query->orWhere("project_task_users.userid", $userid); - $query->orWhere("project_p_task_users.userid", $userid); + $query->orWhere("project_task_visibility_users.userid", $userid); + $query->orWhere("project_sub_task_users.userid", $userid); }); // 优化子查询汇总 $builder->leftJoinSub(function ($query) { @@ -1538,9 +1544,11 @@ class ProjectController extends AbstractController // 项目可见性 $project_userid = ProjectUser::whereProjectId($task->project_id)->whereOwner(1)->value('userid'); // 项目负责人 if ($task->visibility != 1 && $user->userid != $project_userid) { - $visibleUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); // 是否任务负责人、协助人、可见人 - $subVisibleUserids = ProjectTaskUser::whereTaskPid($task_id)->pluck('userid')->toArray(); // 是否子任务负责人、协助人 - if (!in_array($user->userid, $visibleUserids) && !in_array($user->userid, $subVisibleUserids)) { + $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('无任务权限'); } } @@ -1548,7 +1556,7 @@ class ProjectController extends AbstractController $data = $task->toArray(); $data['project_name'] = $task->project?->name; $data['column_name'] = $task->projectColumn?->name; - $data['visibility_appointor'] = $task->visibility == 1 ? [0] : ProjectTaskUser::whereTaskId($task_id)->whereOwner(2)->pluck('userid'); + $data['visibility_appointor'] = $task->visibility == 1 ? [0] : ProjectTaskVisibilityUser::whereTaskId($task_id)->pluck('userid'); return Base::retSuccess('success', $data); } @@ -1912,13 +1920,14 @@ class ProjectController extends AbstractController $taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($task_id)->get(); $owners = $taskUser->where('owner', 1)->pluck('userid')->toArray(); // 负责人 $assists = $taskUser->where('owner', 0)->pluck('userid')->toArray(); // 协助人 + $visible = ProjectTaskVisibilityUser::whereTaskId($task->id)->pluck('userid')->toArray() ?? []; // 更新任务 $updateMarking = []; $task->updateTask($param, $updateMarking); // $data = ProjectTask::oneTask($task->id)->toArray(); $data['update_marking'] = $updateMarking ?: json_decode('{}'); - $data['visibility_appointor'] = $data['visibility'] == 1 ? [] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid'); + $data['visibility_appointor'] = $data['visibility'] == 1 ? [] : ProjectTaskVisibilityUser::whereTaskId($task->id)->pluck('userid')->toArray(); $task->pushMsg('update', $data); // 可见性推送 if ($task->parent_id == 0) { @@ -1928,10 +1937,9 @@ class ProjectController extends AbstractController $task->pushMsgVisibleAdd($data); } if ($param['visibility_appointor']) { - $oldVisibleUserIds = $taskUser->where('owner', 2)->pluck('userid')->toArray() ?? []; $newVisibleUserIds = $param['visibility_appointor'] ?? []; - $deleteUserIds = array_diff($oldVisibleUserIds, $newVisibleUserIds, $subUserids); - $addUserIds = array_diff($newVisibleUserIds, $oldVisibleUserIds); + $deleteUserIds = array_diff($visible, $newVisibleUserIds, $subUserids); + $addUserIds = array_diff($newVisibleUserIds, $visible); $task->pushMsgVisibleUpdate($data, $deleteUserIds, $addUserIds); } if ($data['visibility'] != 1 && empty($param['visibility_appointor'])) { diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 997904000..5954759d4 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -2,15 +2,16 @@ namespace App\Models; -use App\Exceptions\ApiException; +use DB; +use Arr; +use Request; +use Carbon\Carbon; use App\Module\Base; use App\Tasks\PushTask; -use Arr; -use Carbon\Carbon; -use DB; +use App\Exceptions\ApiException; use Hhxsv5\LaravelS\Swoole\Task\Task; +use App\Models\ProjectTaskVisibilityUser; use Illuminate\Database\Eloquent\SoftDeletes; -use Request; /** * App\Models\ProjectTask @@ -288,8 +289,7 @@ class ProjectTask extends AbstractModel ->leftJoin('project_task_users', function ($leftJoin) use ($userid) { $leftJoin ->on('project_task_users.userid', '=', DB::raw($userid)) - ->on('project_tasks.id', '=', 'project_task_users.task_id') - ->where('project_task_users.owner', '<', 2); + ->on('project_tasks.id', '=', 'project_task_users.task_id'); }); return $query; } @@ -310,11 +310,7 @@ class ProjectTask extends AbstractModel 'project_task_users.owner' ]) ->selectRaw("1 AS assist") - ->join('project_task_users', function ($join) { - $join - ->on('project_tasks.id', '=', 'project_task_users.task_id') - ->where('project_task_users.owner', '<', 2); - }) + ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') ->where('project_task_users.userid', $userid); if ($owner !== null) { $query->where('project_task_users.owner', $owner); @@ -501,13 +497,12 @@ class ProjectTask extends AbstractModel ])->save(); } + // 可见性 foreach ($visibility_userids as $uid) { - ProjectTaskUser::createInstance([ + ProjectTaskVisibilityUser::createInstance([ 'project_id' => $task->project_id, 'task_id' => $task->id, - 'task_pid' => $task->parent_id ?: $task->id, - 'userid' => $uid, - 'owner' => 2, + 'userid' => $uid ])->save(); } @@ -734,16 +729,14 @@ class ProjectTask extends AbstractModel ProjectTask::whereId($data['task_id'])->update(['visibility' => $data["visibility"]]); ProjectTask::whereParentId($data['task_id'])->update(['visibility' => $data["visibility"]]); } - ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete(); + ProjectTaskVisibilityUser::whereTaskId($data['task_id'])->delete(); if (Arr::exists($data, 'visibility_appointor')) { foreach ($data['visibility_appointor'] as $uid) { if ($uid) { - ProjectTaskUser::createInstance([ + ProjectTaskVisibilityUser::createInstance([ 'project_id' => $this->project_id, 'task_id' => $this->id, - 'task_pid' => $this->parent_id ?: $this->id, - 'userid' => $uid, - 'owner' => 2, + 'userid' => $uid ])->save(); } } @@ -1526,7 +1519,10 @@ class ProjectTask extends AbstractModel if ($pushUserIds) { $userids = $pushUserIds; } elseif ($this->visibility != 1) { - $userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->orWhere('task_pid', '=', $this->id)->pluck('userid')->toArray(); + $userids = ProjectTaskUser::whereTaskId($this->id)->orWhere('task_pid', '=', $this->id)->pluck('userid')->toArray(); + if ($this->visibility == 3) { + $userids = array_merge($userids, ProjectTaskVisibilityUser::whereTaskId($this->id)->pluck('userid')->toArray()); + } } else { $userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员 } diff --git a/app/Models/ProjectTaskVisibilityUser.php b/app/Models/ProjectTaskVisibilityUser.php new file mode 100644 index 000000000..b462630c3 --- /dev/null +++ b/app/Models/ProjectTaskVisibilityUser.php @@ -0,0 +1,37 @@ +hasOne(ProjectTask::class, 'id', 'task_id'); + } + +} diff --git a/database/migrations/2023_12_26_182631_create_project_task_visibility_users_table.php b/database/migrations/2023_12_26_182631_create_project_task_visibility_users_table.php new file mode 100644 index 000000000..b2268d90e --- /dev/null +++ b/database/migrations/2023_12_26_182631_create_project_task_visibility_users_table.php @@ -0,0 +1,48 @@ +bigIncrements('id'); + $table->bigInteger('project_id')->index()->nullable()->default(0)->comment('项目ID'); + $table->bigInteger('task_id')->index()->nullable()->default(0)->comment('任务ID'); + $table->bigInteger('userid')->index()->nullable()->default(0)->comment('成员ID'); + $table->timestamps(); + }); + + // 迁移旧数据 + DB::table('project_task_users')->where("owner",2)->orderBy('id')->chunk(100, function ($data) { + foreach ($data as $item) { + DB::table('project_task_visibility_users')->insert([ + 'project_id' => $item->project_id, + 'task_id' => $item->task_id, + 'userid' => $item->userid, + 'created_at' => $item->created_at, + 'updated_at' => $item->updated_at + ]); + } + }); + DB::table('project_task_users')->where("owner",2)->delete(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('project_task_visibility_users'); + } +}