diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index d1f61378f..668b22d68 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1668,7 +1668,7 @@ class ProjectController extends AbstractController 'column_id' => $task->column_id, 'times' => [$task->start_at, $task->end_at], 'owner' => [User::userid()], - 'is_all_visible' => 0, + 'is_all_visible' => 2, ]); $data = ProjectTask::oneTask($task->id); $projectUserid = Project::whereId($data->project_id)->value('userid'); @@ -1717,9 +1717,9 @@ class ProjectController extends AbstractController $task_id = intval($param['task_id']); // $task = ProjectTask::userTask($task_id, true, true, 2); - $taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($task_id)->whereIn('owner', [0, 1])->get(); + $taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($task_id)->get(); $owners = $taskUser->where('owner', 1)->pluck('userid')->toArray(); // 负责人 - $assist = $taskUser->where('owner', 0)->pluck('userid')->toArray(); // 协助人 + $assists = $taskUser->where('owner', 0)->pluck('userid')->toArray(); // 协助人 // 更新任务 $updateMarking = []; @@ -1727,38 +1727,52 @@ class ProjectController extends AbstractController // $data = ProjectTask::oneTask($task->id)->toArray(); $data['update_marking'] = $updateMarking ?: json_decode('{}'); - $data['visibility_appointor'] = $data['is_all_visible'] == 1 ? [0] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid'); + $data['visibility_appointor'] = $data['is_all_visible'] == 1 ? [] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid'); $task->pushMsg('update', $data); // 可见性推送 - if (Arr::exists($param, 'is_all_visible')) { - if ($data['is_all_visible'] == 1) { - $task->pushMsgVisibleAdd($data); - } - if ($data['is_all_visible'] == 0) { + if($task->parent_id == 0){ + $subUserids = ProjectTaskUser::whereTaskPid($data['id'])->pluck('userid')->toArray(); + if (Arr::exists($param, 'is_all_visible') || Arr::exists($param, 'visibility_appointor')) { + if ($data['is_all_visible'] == 1) { + $task->pushMsgVisibleAdd($data); + } if ($param['visibility_appointor']) { - $task->pushMsgVisibleUpdate($data); - } else { + $oldVisibleUserIds = $taskUser->where('owner', 2)->pluck('userid')->toArray()??[]; + $newVisibleUserIds = $param['visibility_appointor'] ?? []; + $deleteUserIds = array_diff($oldVisibleUserIds, $newVisibleUserIds, $subUserids); + $addUserIds = array_diff($newVisibleUserIds, $oldVisibleUserIds); + $task->pushMsgVisibleUpdate($data, $deleteUserIds, $addUserIds); + } + if ($data['is_all_visible'] != 1 && empty($param['visibility_appointor'])) { $task->pushMsgVisibleRemove(); } } - } elseif (Arr::exists($param, 'visibility_appointor')) { - if ($param['visibility_appointor']) { - $task->pushMsgVisibleUpdate($data); - } else { - $task->pushMsgVisibleRemove(); + if (Arr::exists($param, 'owner') && $data['is_all_visible'] != 1) { + $diff = array_diff($owners, $subUserids); + if ($diff) { + $task->pushMsgVisibleRemove($diff); + } } - } - if (Arr::exists($param, 'owner') && $data['is_all_visible'] == 0) { - $subUserids = ProjectTaskUser::whereTaskPid($data['id'])->pluck('userid')->toArray(); - $diff = array_diff($owners, $param['owner'], $subUserids); - if ($diff) { - $task->pushMsgVisibleRemove($diff); + if (Arr::exists($param, 'assist') && $data['is_all_visible'] != 1) { + $diff = array_diff($assists, $subUserids); + if ($diff) { + $task->pushMsgVisibleRemove($diff); + } } - } - if (Arr::exists($param, 'assist') && $data['is_all_visible'] == 0) { - $diff = array_diff($owners, $param['assist']); - if ($diff) { - $task->pushMsgVisibleRemove($diff); + }else{ + if(Arr::exists($param, 'owner') ){ + $diff = array_diff($owners, $param['owner'] ?: [] ); + if ($diff) { + $task->pushMsgVisibleRemove($diff); + } + $parentTask = ProjectTask::whereId($task->parent_id)->first(); + $subUserids = ProjectTaskUser::whereTaskPid($task->parent_id)->pluck('userid')->toArray(); + if ( $parentTask && $parentTask->is_all_visible != 1 && empty($subUserids) ) { + $diff = array_diff($owners, $param['owner'] ?: [], $subUserids); + if ($diff) { + $parentTask->pushMsgVisibleRemove($diff); + } + } } } // diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 513f99eed..0ce8de294 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -370,18 +370,8 @@ class ProjectTask extends AbstractModel $p_color = $data['p_color']; $top = intval($data['top']); $userid = User::userid(); - $visibility_appoint = $data['visibility_appoint']; - $visibility_appointor = $data['visibility_appointor']; - // 可见性 - $visibility_userids = []; - $is_all_visible = 0; - if ($visibility_appoint) { - if (in_array(0, $visibility_appointor)) { - $is_all_visible = 1; - } else { - $visibility_userids = $visibility_appointor; - } - } + $is_all_visible = $data['visibility_appoint']; + $visibility_userids = $data['visibility_appointor']; // if (ProjectTask::whereProjectId($project_id) ->whereNull('project_tasks.complete_at') @@ -686,15 +676,24 @@ class ProjectTask extends AbstractModel foreach ($owner as $uid) { if (intval($uid) == 0) continue; if (!$this->project->useridInTheProject($uid)) continue; - // - ProjectTaskUser::updateInsert([ - 'task_id' => $this->id, - 'userid' => $uid, - ], [ - 'project_id' => $this->project_id, - 'task_pid' => $this->parent_id ?: $this->id, - 'owner' => 1, - ]); + $row = ProjectTaskUser::where("task_id",$this->id) + ->where("userid",$uid) + ->where("owner",'!=', 2) + ->first(); + if(empty($row)){ + ProjectTaskUser::createInstance([ + 'task_id' => $this->id, + 'userid' => $uid, + 'project_id' => $this->project_id, + 'task_pid' => $this->parent_id ?: $this->id, + 'owner' => 1, + ])->save(); + }else{ + $row->project_id = $this->project_id; + $row->task_pid = $this->parent_id ?: $this->id; + $row->owner = 1; + $row->save(); + } $array[] = $uid; } if ($array) { @@ -716,24 +715,23 @@ class ProjectTask extends AbstractModel $this->syncDialogUser(); } // 可见性 - if (Arr::exists($data, 'visibility_appointor') || Arr::exists($data, 'is_all_visible')) { - if ($data['is_all_visible'] == 1) { - ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 1]); - ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete(); - } elseif ( isset($data['visibility_appointor']) || $data['is_all_visible'] == 0) { - ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 0]); - // 覆盖 - ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete(); + if (Arr::exists($data, 'is_all_visible') || Arr::exists($data, 'visibility_appointor')) { + if(Arr::exists($data, 'is_all_visible')){ + ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => $data["is_all_visible"]]); + } + ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete(); + if(Arr::exists($data, 'visibility_appointor')){ foreach ($data['visibility_appointor'] as $uid) { - ProjectTaskUser::createInstance([ - 'project_id' => $this->project_id, - 'task_id' => $this->id, - 'task_pid' => $this->parent_id ?: $this->id, - 'userid' => $uid, - 'owner' => 2, - ])->save(); + if($uid){ + ProjectTaskUser::createInstance([ + 'project_id' => $this->project_id, + 'task_id' => $this->id, + 'task_pid' => $this->parent_id ?: $this->id, + 'userid' => $uid, + 'owner' => 2, + ])->save(); + } } - } } // 计划时间(原则:子任务时间在主任务时间内) @@ -1455,7 +1453,7 @@ class ProjectTask extends AbstractModel $userids = array_diff($userids, $owners, $assists); } else { // 指定可见 - $userids = $taskUser->where('owner', 2)->pluck('userid')->toArray(); + $userids = $taskUser->pluck('userid')->toArray(); } $data = array_merge($data, [ 'owner' => 0, @@ -1488,7 +1486,7 @@ class ProjectTask extends AbstractModel * 添加可见性任务 推送 * @param array|self $data 发送内容,默认为[id, parent_id, project_id, column_id, dialog_id] */ - public function pushMsgVisibleAdd($data = null) + public function pushMsgVisibleAdd($data = null, array $pushUserIds = []) { if (!$this->project) { return; @@ -1506,7 +1504,9 @@ class ProjectTask extends AbstractModel } // $array = []; - if ($this->is_all_visible == 0) { + if ($pushUserIds) { + $userids = $pushUserIds; + }elseif ($this->is_all_visible != 1) { $userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->orWhere('task_pid' , '=', $this->id)->pluck('userid')->toArray(); } else { $userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员 @@ -1556,7 +1556,8 @@ class ProjectTask extends AbstractModel $projectUserids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员 $projectOwner = Project::whereId($this->project_id)->pluck('userid')->toArray(); // 项目负责人 $taskOwnerAndAssists = ProjectTaskUser::select(['userid', 'owner'])->whereIn('owner', [0, 1])->whereTaskId($this->id)->pluck('userid')->toArray(); - $userids = array_diff($projectUserids, $projectOwner, $taskOwnerAndAssists); + $subUserids = ProjectTaskUser::whereTaskPid($this->id)->pluck('userid')->toArray(); + $userids = array_diff($projectUserids, $projectOwner, $taskOwnerAndAssists,$subUserids); } // $array[] = [ @@ -1583,11 +1584,14 @@ class ProjectTask extends AbstractModel * 更新可见性任务 推送 * @param array|self $data 发送内容,默认为[id, parent_id, project_id, column_id, dialog_id] */ - public function pushMsgVisibleUpdate($data) + public function pushMsgVisibleUpdate($data, array $deleteUserIds = [], array $addUserIds = []) { - $this->pushMsgVisibleRemove(); - usleep(300); - $this->pushMsgVisibleAdd($data); + if ($deleteUserIds) { + $this->pushMsgVisibleRemove($deleteUserIds); + } + if ($addUserIds) { + $this->pushMsgVisibleAdd($data, $addUserIds); + } } /** diff --git a/resources/assets/js/components/UserSelect.vue b/resources/assets/js/components/UserSelect.vue index b39d2cf4b..993bd7373 100755 --- a/resources/assets/js/components/UserSelect.vue +++ b/resources/assets/js/components/UserSelect.vue @@ -1,7 +1,7 @@