From 0666a8f5c255e7b5934038521c0b4ad7ec112573 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Mon, 29 Sep 2025 09:04:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E6=80=A7=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 14 +++++---- app/Models/ProjectTask.php | 31 +++++++++++-------- resources/assets/js/store/actions.js | 8 ++--- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 3af25dfa8..8256d61cb 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1991,7 +1991,9 @@ class ProjectController extends AbstractController 'path' => $file->getRawOriginal('path'), 'thumb' => $file->getRawOriginal('thumb'), ]); - $task->pushMsg('filedelete', $file); + $task->pushMsg('filedelete', [ + 'id' => $file->id, + ]); $file->delete(); // return Base::retSuccess('success', $file); @@ -2840,7 +2842,7 @@ class ProjectController extends AbstractController * @apiVersion 1.0.0 * @apiGroup project * @apiName task__ai_generate - * + * * @apiParam {String} content 用户输入的任务描述(必填) * @apiParam {String} [current_title] 当前已有的任务标题(用于优化改进) * @apiParam {String} [current_content] 当前已有的任务内容(HTML格式,用于优化改进) @@ -2860,13 +2862,13 @@ class ProjectController extends AbstractController public function task__ai_generate() { User::auth(); - + // 获取用户输入的任务描述 $content = Request::input('content'); if (empty($content)) { return Base::retError('任务描述不能为空'); } - + // 获取上下文信息 $context = [ 'current_title' => Request::input('current_title', ''), @@ -2877,7 +2879,7 @@ class ProjectController extends AbstractController 'has_time_plan' => boolval(Request::input('has_time_plan', false)), 'priority_level' => Request::input('priority_level', ''), ]; - + // 如果当前内容是HTML格式,转换为markdown if (!empty($context['current_content'])) { $context['current_content'] = Base::html2markdown($context['current_content']); @@ -2885,7 +2887,7 @@ class ProjectController extends AbstractController if (!empty($context['template_content'])) { $context['template_content'] = Base::html2markdown($context['template_content']); } - + $result = AI::generateTask($content, $context); if (Base::isError($result)) { return Base::retError('生成任务失败', $result); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 3e3749dbc..6c7953eee 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -1579,7 +1579,8 @@ class ProjectTask extends AbstractModel } elseif ($data instanceof self) { $data = $data->toArray(); } - // + + // 获取接收会员 if ($userid === null) { $userids = $this->project->relationUserids(); } else { @@ -1590,11 +1591,7 @@ class ProjectTask extends AbstractModel return; } - if (!Arr::exists($data, 'visibility')) { - $data['visibility'] = $this->visibility; - } - - $visibility = intval($data['visibility']); + // 按可见性分组推送 $taskUser = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($data['id'])->get(); $ownerList = $taskUser->where('owner', 1)->pluck('userid')->toArray(); $assistList = $taskUser->where('owner', 0)->pluck('userid')->toArray(); @@ -1603,16 +1600,19 @@ class ProjectTask extends AbstractModel $assistUsers = array_values(array_diff(array_intersect($userids, $assistList), $ownerUsers)); $array = []; + + // 负责人 if ($ownerUsers) { $array[] = [ 'userid' => $ownerUsers, 'data' => array_merge($data, [ 'owner' => 1, - 'assist' => 1, + 'assist' => 0, ]) ]; } + // 协助人 if ($assistUsers) { $array[] = [ 'userid' => $assistUsers, @@ -1623,27 +1623,31 @@ class ProjectTask extends AbstractModel ]; } + // 其他人 $otherUsers = []; - switch ($visibility) { + switch (intval($data['visibility'])) { case 1: + // 项目人员:除了负责人、协助人项目其他人 $otherUsers = array_diff($userids, $ownerUsers, $assistUsers); break; case 2: - $otherUsers = []; + // 任务人员:除了负责人、协助人 + // $otherUsers = []; break; case 3: + // 指定成员 $specifys = ProjectTaskVisibilityUser::select(['userid'])->whereTaskId($data['id'])->pluck('userid')->toArray(); $otherUsers = array_diff(array_intersect($userids, $specifys), $ownerUsers, $assistUsers); break; - default: - $otherUsers = array_diff($userids, $ownerUsers, $assistUsers); - break; } if ($otherUsers) { $array[] = [ 'userid' => array_values($otherUsers), - 'data' => $data + 'data' => array_merge($data, [ + 'owner' => 0, + 'assist' => 0, + ]) ]; } @@ -1651,6 +1655,7 @@ class ProjectTask extends AbstractModel return; } + // 推送 foreach ($array as $item) { $params = [ 'ignoreFd' => $ignoreSelf ? Request::header('fd') : null, diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 5d64def7d..755aea120 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -4609,11 +4609,6 @@ export default { case 'recovery': // 恢复(归档) dispatch("saveTask", data) break; - case 'relation': - if (data?.id) { - emitter.emit('taskRelationUpdate', data.id) - } - break; case 'dialog': dispatch("saveTask", data) dispatch("getDialogOne", data.dialog_id).catch(() => {}) @@ -4627,6 +4622,9 @@ export default { case 'delete': dispatch("forgetTask", data) break; + case 'relation': + emitter.emit('taskRelationUpdate', data.id) + break; } })(msgDetail); break;