mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 19:35:50 +00:00
perf: 任务可见性用户 - 分表优化
This commit is contained in:
parent
4e78920f99
commit
632068a74c
@ -32,10 +32,11 @@ use App\Models\ProjectTaskUser;
|
|||||||
use App\Models\WebSocketDialog;
|
use App\Models\WebSocketDialog;
|
||||||
use App\Exceptions\ApiException;
|
use App\Exceptions\ApiException;
|
||||||
use App\Models\ProjectPermission;
|
use App\Models\ProjectPermission;
|
||||||
use App\Module\BillMultipleExport;
|
|
||||||
use App\Models\WebSocketDialogMsg;
|
use App\Models\WebSocketDialogMsg;
|
||||||
|
use App\Module\BillMultipleExport;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use App\Models\ProjectTaskFlowChange;
|
use App\Models\ProjectTaskFlowChange;
|
||||||
|
use App\Models\ProjectTaskVisibilityUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @apiDefine project
|
* @apiDefine project
|
||||||
@ -1032,15 +1033,20 @@ class ProjectController extends AbstractController
|
|||||||
$query->where('project_users.owner', 1);
|
$query->where('project_users.owner', 1);
|
||||||
$query->where('project_users.userid', $userid);
|
$query->where('project_users.userid', $userid);
|
||||||
});
|
});
|
||||||
$builder->leftJoin('project_task_users as project_p_task_users', function ($query) use($userid) {
|
$builder->leftJoin('project_task_users as project_sub_task_users', function ($query) use($userid) {
|
||||||
$query->on('project_p_task_users.task_pid', '=', 'project_tasks.parent_id');
|
$query->on('project_sub_task_users.task_pid', '=', 'project_tasks.parent_id');
|
||||||
$query->where('project_p_task_users.userid', $userid);
|
$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) {
|
$builder->where(function ($query) use ($userid) {
|
||||||
$query->where("project_tasks.visibility", 1);
|
$query->where("project_tasks.visibility", 1);
|
||||||
$query->orWhere("project_users.userid", $userid);
|
$query->orWhere("project_users.userid", $userid);
|
||||||
$query->orWhere("project_task_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) {
|
$builder->leftJoinSub(function ($query) {
|
||||||
@ -1538,9 +1544,11 @@ class ProjectController extends AbstractController
|
|||||||
// 项目可见性
|
// 项目可见性
|
||||||
$project_userid = ProjectUser::whereProjectId($task->project_id)->whereOwner(1)->value('userid'); // 项目负责人
|
$project_userid = ProjectUser::whereProjectId($task->project_id)->whereOwner(1)->value('userid'); // 项目负责人
|
||||||
if ($task->visibility != 1 && $user->userid != $project_userid) {
|
if ($task->visibility != 1 && $user->userid != $project_userid) {
|
||||||
$visibleUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); // 是否任务负责人、协助人、可见人
|
$taskUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); //任务负责人、协助人
|
||||||
$subVisibleUserids = ProjectTaskUser::whereTaskPid($task_id)->pluck('userid')->toArray(); // 是否子任务负责人、协助人
|
$subTaskUserids = ProjectTaskUser::whereTaskPid($task_id)->pluck('userid')->toArray(); //子任务负责人、协助人
|
||||||
if (!in_array($user->userid, $visibleUserids) && !in_array($user->userid, $subVisibleUserids)) {
|
$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('无任务权限');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1548,7 +1556,7 @@ class ProjectController extends AbstractController
|
|||||||
$data = $task->toArray();
|
$data = $task->toArray();
|
||||||
$data['project_name'] = $task->project?->name;
|
$data['project_name'] = $task->project?->name;
|
||||||
$data['column_name'] = $task->projectColumn?->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);
|
return Base::retSuccess('success', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1912,13 +1920,14 @@ class ProjectController extends AbstractController
|
|||||||
$taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($task_id)->get();
|
$taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($task_id)->get();
|
||||||
$owners = $taskUser->where('owner', 1)->pluck('userid')->toArray(); // 负责人
|
$owners = $taskUser->where('owner', 1)->pluck('userid')->toArray(); // 负责人
|
||||||
$assists = $taskUser->where('owner', 0)->pluck('userid')->toArray(); // 协助人
|
$assists = $taskUser->where('owner', 0)->pluck('userid')->toArray(); // 协助人
|
||||||
|
$visible = ProjectTaskVisibilityUser::whereTaskId($task->id)->pluck('userid')->toArray() ?? [];
|
||||||
// 更新任务
|
// 更新任务
|
||||||
$updateMarking = [];
|
$updateMarking = [];
|
||||||
$task->updateTask($param, $updateMarking);
|
$task->updateTask($param, $updateMarking);
|
||||||
//
|
//
|
||||||
$data = ProjectTask::oneTask($task->id)->toArray();
|
$data = ProjectTask::oneTask($task->id)->toArray();
|
||||||
$data['update_marking'] = $updateMarking ?: json_decode('{}');
|
$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);
|
$task->pushMsg('update', $data);
|
||||||
// 可见性推送
|
// 可见性推送
|
||||||
if ($task->parent_id == 0) {
|
if ($task->parent_id == 0) {
|
||||||
@ -1928,10 +1937,9 @@ class ProjectController extends AbstractController
|
|||||||
$task->pushMsgVisibleAdd($data);
|
$task->pushMsgVisibleAdd($data);
|
||||||
}
|
}
|
||||||
if ($param['visibility_appointor']) {
|
if ($param['visibility_appointor']) {
|
||||||
$oldVisibleUserIds = $taskUser->where('owner', 2)->pluck('userid')->toArray() ?? [];
|
|
||||||
$newVisibleUserIds = $param['visibility_appointor'] ?? [];
|
$newVisibleUserIds = $param['visibility_appointor'] ?? [];
|
||||||
$deleteUserIds = array_diff($oldVisibleUserIds, $newVisibleUserIds, $subUserids);
|
$deleteUserIds = array_diff($visible, $newVisibleUserIds, $subUserids);
|
||||||
$addUserIds = array_diff($newVisibleUserIds, $oldVisibleUserIds);
|
$addUserIds = array_diff($newVisibleUserIds, $visible);
|
||||||
$task->pushMsgVisibleUpdate($data, $deleteUserIds, $addUserIds);
|
$task->pushMsgVisibleUpdate($data, $deleteUserIds, $addUserIds);
|
||||||
}
|
}
|
||||||
if ($data['visibility'] != 1 && empty($param['visibility_appointor'])) {
|
if ($data['visibility'] != 1 && empty($param['visibility_appointor'])) {
|
||||||
|
|||||||
@ -2,15 +2,16 @@
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use App\Exceptions\ApiException;
|
use DB;
|
||||||
|
use Arr;
|
||||||
|
use Request;
|
||||||
|
use Carbon\Carbon;
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
use App\Tasks\PushTask;
|
use App\Tasks\PushTask;
|
||||||
use Arr;
|
use App\Exceptions\ApiException;
|
||||||
use Carbon\Carbon;
|
|
||||||
use DB;
|
|
||||||
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
||||||
|
use App\Models\ProjectTaskVisibilityUser;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Request;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* App\Models\ProjectTask
|
* App\Models\ProjectTask
|
||||||
@ -288,8 +289,7 @@ class ProjectTask extends AbstractModel
|
|||||||
->leftJoin('project_task_users', function ($leftJoin) use ($userid) {
|
->leftJoin('project_task_users', function ($leftJoin) use ($userid) {
|
||||||
$leftJoin
|
$leftJoin
|
||||||
->on('project_task_users.userid', '=', DB::raw($userid))
|
->on('project_task_users.userid', '=', DB::raw($userid))
|
||||||
->on('project_tasks.id', '=', 'project_task_users.task_id')
|
->on('project_tasks.id', '=', 'project_task_users.task_id');
|
||||||
->where('project_task_users.owner', '<', 2);
|
|
||||||
});
|
});
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
@ -310,11 +310,7 @@ class ProjectTask extends AbstractModel
|
|||||||
'project_task_users.owner'
|
'project_task_users.owner'
|
||||||
])
|
])
|
||||||
->selectRaw("1 AS assist")
|
->selectRaw("1 AS assist")
|
||||||
->join('project_task_users', function ($join) {
|
->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id')
|
||||||
$join
|
|
||||||
->on('project_tasks.id', '=', 'project_task_users.task_id')
|
|
||||||
->where('project_task_users.owner', '<', 2);
|
|
||||||
})
|
|
||||||
->where('project_task_users.userid', $userid);
|
->where('project_task_users.userid', $userid);
|
||||||
if ($owner !== null) {
|
if ($owner !== null) {
|
||||||
$query->where('project_task_users.owner', $owner);
|
$query->where('project_task_users.owner', $owner);
|
||||||
@ -501,13 +497,12 @@ class ProjectTask extends AbstractModel
|
|||||||
])->save();
|
])->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 可见性
|
||||||
foreach ($visibility_userids as $uid) {
|
foreach ($visibility_userids as $uid) {
|
||||||
ProjectTaskUser::createInstance([
|
ProjectTaskVisibilityUser::createInstance([
|
||||||
'project_id' => $task->project_id,
|
'project_id' => $task->project_id,
|
||||||
'task_id' => $task->id,
|
'task_id' => $task->id,
|
||||||
'task_pid' => $task->parent_id ?: $task->id,
|
'userid' => $uid
|
||||||
'userid' => $uid,
|
|
||||||
'owner' => 2,
|
|
||||||
])->save();
|
])->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -734,16 +729,14 @@ class ProjectTask extends AbstractModel
|
|||||||
ProjectTask::whereId($data['task_id'])->update(['visibility' => $data["visibility"]]);
|
ProjectTask::whereId($data['task_id'])->update(['visibility' => $data["visibility"]]);
|
||||||
ProjectTask::whereParentId($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')) {
|
if (Arr::exists($data, 'visibility_appointor')) {
|
||||||
foreach ($data['visibility_appointor'] as $uid) {
|
foreach ($data['visibility_appointor'] as $uid) {
|
||||||
if ($uid) {
|
if ($uid) {
|
||||||
ProjectTaskUser::createInstance([
|
ProjectTaskVisibilityUser::createInstance([
|
||||||
'project_id' => $this->project_id,
|
'project_id' => $this->project_id,
|
||||||
'task_id' => $this->id,
|
'task_id' => $this->id,
|
||||||
'task_pid' => $this->parent_id ?: $this->id,
|
'userid' => $uid
|
||||||
'userid' => $uid,
|
|
||||||
'owner' => 2,
|
|
||||||
])->save();
|
])->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1526,7 +1519,10 @@ class ProjectTask extends AbstractModel
|
|||||||
if ($pushUserIds) {
|
if ($pushUserIds) {
|
||||||
$userids = $pushUserIds;
|
$userids = $pushUserIds;
|
||||||
} elseif ($this->visibility != 1) {
|
} 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 {
|
} else {
|
||||||
$userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员
|
$userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员
|
||||||
}
|
}
|
||||||
|
|||||||
37
app/Models/ProjectTaskVisibilityUser.php
Normal file
37
app/Models/ProjectTaskVisibilityUser.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App\Models\ProjectTaskVisibilityUser
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property int|null $project_id 项目ID
|
||||||
|
* @property int|null $task_id 任务ID
|
||||||
|
* @property int|null $userid 成员ID
|
||||||
|
* @property \Illuminate\Support\Carbon|null $created_at
|
||||||
|
* @property \Illuminate\Support\Carbon|null $updated_at
|
||||||
|
* @property-read \App\Models\ProjectTask|null $projectTask
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereCreatedAt($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereId($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereProjectId($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereTaskId($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereUpdatedAt($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTaskVisibilityUser whereUserid($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ProjectTaskVisibilityUser extends AbstractModel
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Illuminate\Database\Eloquent\Relations\HasOne
|
||||||
|
*/
|
||||||
|
public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(ProjectTask::class, 'id', 'task_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateProjectTaskVisibilityUsersTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('project_task_visibility_users', function (Blueprint $table) {
|
||||||
|
$table->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');
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user