From 5d57666cd4e724f83b967fc30e59f1a9fcfa8df1 Mon Sep 17 00:00:00 2001
From: Meng <381618248@qq.com>
Date: Wed, 28 Jun 2023 20:45:52 +0800
Subject: [PATCH] =?UTF-8?q?feat(=E5=AD=90=E4=BB=BB=E5=8A=A1=E5=8F=AF?=
=?UTF-8?q?=E8=A7=81=E6=80=A7):=E4=BC=98=E5=8C=96=E5=AD=90=E4=BB=BB?=
=?UTF-8?q?=E5=8A=A1=E5=8F=AF=E8=A7=81=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Controllers/Api/ProjectController.php | 44 +++--
app/Models/ProjectTask.php | 45 +++--
.../js/pages/manage/components/TaskAdd.vue | 32 ++--
.../js/pages/manage/components/TaskDetail.vue | 163 ++++++++++++------
4 files changed, 183 insertions(+), 101 deletions(-)
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 @@