diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 30631bd80..d1f61378f 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -896,17 +896,7 @@ class ProjectController extends AbstractController public function task__lists() { $user = User::auth(); - - // 任务可见性 - $project_ids = Project::whereUserid($user->userid)->pluck('id')->toArray(); // 负责人项目ids - $main_task_ids = ProjectTask::whereIn('project_id', $project_ids)->pluck('id')->toArray(); // 负责人项目任务ids - $other_task_ids = ProjectTaskUser::whereUserid($user->userid)->whereColumn('task_id', '=', 'task_pid')->whereNotIn('project_id', $project_ids)->pluck('task_id')->toArray(); // 非负责人项目任务ids - $all_visible_task_ids = ProjectTask::whereIsAllVisible(1)->pluck('id')->toArray(); // 所有人可见项目ids - $one_task_ids = array_merge($main_task_ids, $other_task_ids); - $visibility_task_ids = array_merge($one_task_ids, $all_visible_task_ids); - - $builder = ProjectTask::with(['taskUser', 'taskTag']); - $builder->whereIn("project_tasks.id", $visibility_task_ids); + $userid = $user->userid; // $parent_id = intval(Request::input('parent_id')); $project_id = intval(Request::input('project_id')); @@ -919,6 +909,12 @@ class ProjectController extends AbstractController $sorts = Request::input('sorts'); $keys = is_array($keys) ? $keys : []; $sorts = is_array($sorts) ? $sorts : []; + + // 任务可见性 + $visibility_task_ids = ProjectTask::getVisibleUserids($userid, $project_id); + + $builder = ProjectTask::with(['taskUser', 'taskTag']); + $builder->whereIn("project_tasks.id", $visibility_task_ids); // if ($keys['name']) { if (Base::isNumber($keys['name'])) { @@ -1361,8 +1357,9 @@ class ProjectController extends AbstractController // 项目可见性 $project_userid = Project::whereId($task->project_id)->value('userid'); // 项目负责人 if ($task->is_all_visible != 1 && $user->userid != $project_userid) { - $visibleUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray(); - if (!in_array($user->userid, $visibleUserids)) { + $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)) { return Base::retError('无任务权限'); } } @@ -1670,10 +1667,16 @@ class ProjectController extends AbstractController 'project_id' => $task->project_id, 'column_id' => $task->column_id, 'times' => [$task->start_at, $task->end_at], - 'owner' => [User::userid()] + 'owner' => [User::userid()], + 'is_all_visible' => 0, ]); $data = ProjectTask::oneTask($task->id); - $task->pushMsg('add', $data); + $projectUserid = Project::whereId($data->project_id)->value('userid'); + $pushUserIds = ProjectTaskUser::whereTaskId($task->id)->pluck('userid')->toArray(); + $pushUserIds[] = $projectUserid; + foreach ($pushUserIds as $userId) { + $task->pushMsg('add', $data, $userId); + } return Base::retSuccess('添加成功', $data); } @@ -1727,7 +1730,7 @@ class ProjectController extends AbstractController $data['visibility_appointor'] = $data['is_all_visible'] == 1 ? [0] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid'); $task->pushMsg('update', $data); // 可见性推送 - if (Arr::exists($param, 'visibility_appointor')) { + if (Arr::exists($param, 'is_all_visible')) { if ($data['is_all_visible'] == 1) { $task->pushMsgVisibleAdd($data); } @@ -1738,9 +1741,16 @@ class ProjectController extends AbstractController $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'] == 0) { - $diff = array_diff($owners, $param['owner']); + $subUserids = ProjectTaskUser::whereTaskPid($data['id'])->pluck('userid')->toArray(); + $diff = array_diff($owners, $param['owner'], $subUserids); if ($diff) { $task->pushMsgVisibleRemove($diff); } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 7b7f786b4..4ab962394 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -716,10 +716,11 @@ class ProjectTask extends AbstractModel $this->syncDialogUser(); } // 可见性 - if (Arr::exists($data, 'visibility_appointor')) { - if (in_array(0, $data['visibility_appointor'])) { + 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]); - } else { + 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(); @@ -1437,8 +1438,6 @@ class ProjectTask extends AbstractModel ]; } // 协助人 -// $assists = $taskUser->pluck('userid')->toArray(); -// $assists = array_intersect($userids, array_diff($assists, $owners)); $assists = $taskUser->where('owner', 0)->pluck('userid')->toArray(); $assists = array_intersect($userids, $assists); if ($assists) { @@ -1456,8 +1455,7 @@ class ProjectTask extends AbstractModel $userids = array_diff($userids, $owners, $assists); } else { // 指定可见 - $visible = $taskUser->where('owner', 2)->pluck('userid')->toArray(); - $userids = $visible; + $userids = $taskUser->where('owner', 2)->pluck('userid')->toArray(); } $data = array_merge($data, [ 'owner' => 0, @@ -1492,6 +1490,7 @@ class ProjectTask extends AbstractModel */ public function pushMsgVisibleAdd($data = null) { + \Log::info('222222'); if (!$this->project) { return; } @@ -1509,7 +1508,8 @@ class ProjectTask extends AbstractModel // $array = []; if ($this->is_all_visible == 0) { - $userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->pluck('userid')->toArray(); + $userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->orWhere('task_pid' , '=', $this->id)->pluck('userid')->toArray(); + \Log::info($userids); } else { $userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员 } @@ -1521,9 +1521,8 @@ class ProjectTask extends AbstractModel // foreach ($array as $item) { $params = [ -// 'ignoreFd' => Request::header('fd'), 'ignoreFd' => '0', - 'userid' => array_values($item), + 'userid' => $item['userid'], 'msg' => [ 'type' => 'projectTask', 'action' => 'add', @@ -1569,9 +1568,8 @@ class ProjectTask extends AbstractModel // foreach ($array as $item) { $params = [ -// 'ignoreFd' => Request::header('fd'), 'ignoreFd' => '0', - 'userid' => array_values($item), + 'userid' => $item['userid'], 'msg' => [ 'type' => 'projectTask', 'action' => 'delete', @@ -1723,4 +1721,27 @@ class ProjectTask extends AbstractModel // return $task; } + + /** + * 获取用户任务可见性 + * @param $userid + * @param $project_id + * @return array + */ + public static function getVisibleUserids($userid, $project_id = 0) + { + return (new ProjectTask)->setTable('pt')->from('project_tasks as pt') + ->leftJoin('project_task_users as b', 'b.task_id', '=', 'pt.id') + ->Join('projects as p', 'p.id', '=', 'pt.project_id') + ->when($project_id, function ($q) use ($project_id) { + $q->where('pt.project_id', '=', $project_id); // 负责人项目ids + }) + ->where(function ($q) use ($userid){ + $q->where("pt.is_all_visible", '=', 1); + $q->OrWhere("p.userid", '=', $userid); + $q->OrWhere("b.userid", '=', $userid); + }) + ->pluck("pt.id") + ->toArray(); + } } diff --git a/resources/assets/js/pages/manage/components/TaskAdd.vue b/resources/assets/js/pages/manage/components/TaskAdd.vue index 25d328d24..e0d6dd059 100644 --- a/resources/assets/js/pages/manage/components/TaskAdd.vue +++ b/resources/assets/js/pages/manage/components/TaskAdd.vue @@ -94,23 +94,20 @@ - {{$L('项目负责人')}} - {{$L('项目协助人')}} - {{$L('指定人员')}} - {{$L('任务负责人')}} + {{$L('任务协助人')}} + + {{$L('所有人员')}} + {{$L('指定成员')}} + + - - + :avatar-size="28" + :title="$L('选择指定人员')" + :project-id="addData.project_id"/> +
@@ -209,7 +206,8 @@ export default { visibility_principal: 1, visibility_assist: 1, visibility_appoint: 1, - visibility_appointor: [0], + is_all_visible: 1, + visibility_appointor: [], }, cascaderShow: false, diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue index fbe491bab..a9628e401 100644 --- a/resources/assets/js/pages/manage/components/TaskDetail.vue +++ b/resources/assets/js/pages/manage/components/TaskDetail.vue @@ -1,55 +1,71 @@