fix: 更新可见性后仍存在对话会话列表

This commit is contained in:
kuaifan 2024-05-30 21:56:18 +08:00
parent e24b6806da
commit dcffeded9a
4 changed files with 61 additions and 12 deletions

View File

@ -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] 优先级相关(子任务不支持)

View File

@ -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);
}
}
}
// 计划时间(原则:子任务时间在主任务时间内)

View File

@ -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;
}
}
}

View File

@ -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)