From 4b32472d64768c65366cf633da306cbd59b00469 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 2 Apr 2026 17:51:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E5=A2=9E=E5=8A=A0AI=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=86=E6=9E=90=E5=BC=80=E5=85=B3=EF=BC=88=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=BA=A7+=E9=A1=B9=E7=9B=AE=E7=BA=A7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 系统设置新增 task_ai_auto_analyze 开关控制全局AI任务分析;项目设置新增 ai_auto_analyze 开关,系统关闭时项目无法开启。 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Controllers/Api/ProjectController.php | 10 +++++- app/Http/Controllers/Api/SystemController.php | 2 ++ app/Tasks/AiTaskLoopTask.php | 16 ++++++++-- ..._add_ai_auto_analyze_to_projects_table.php | 32 +++++++++++++++++++ .../pages/manage/components/ProjectPanel.vue | 14 +++++++- .../setting/components/SystemSetting.vue | 8 +++++ 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2026_04_02_000000_add_ai_auto_analyze_to_projects_table.php diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index f994bc407..37e36890b 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -301,6 +301,7 @@ class ProjectController extends AbstractController * @apiParam {String} [desc] 项目介绍 * @apiParam {String} [archive_method] 归档方式 * @apiParam {Number} [archive_days] 自动归档天数 + * @apiParam {String} [ai_auto_analyze] AI自动分析(open|close) * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -315,6 +316,7 @@ class ProjectController extends AbstractController $desc = trim(Request::input('desc', '')); $archive_method = Request::input('archive_method'); $archive_days = intval(Request::input('archive_days')); + $ai_auto_analyze = Request::input('ai_auto_analyze'); if (mb_strlen($name) < 2) { return Base::retError('项目名称不可以少于2个字'); } elseif (mb_strlen($name) > 32) { @@ -330,7 +332,7 @@ class ProjectController extends AbstractController } // $project = Project::userProject($project_id, true, true); - AbstractModel::transaction(function () use ($archive_days, $archive_method, $desc, $name, $project) { + AbstractModel::transaction(function () use ($archive_days, $archive_method, $ai_auto_analyze, $desc, $name, $project) { if ($project->name != $name) { $project->addLog("修改项目名称", [ 'change' => [$project->name, $name] @@ -356,6 +358,12 @@ class ProjectController extends AbstractController ]); $project->archive_days = $archive_days; } + if (in_array($ai_auto_analyze, ['open', 'close']) && $project->ai_auto_analyze != $ai_auto_analyze) { + $project->addLog("修改AI自动分析", [ + 'change' => [$project->ai_auto_analyze, $ai_auto_analyze] + ]); + $project->ai_auto_analyze = $ai_auto_analyze; + } $project->save(); }); $project->pushMsg('update'); diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 4d8760ff9..aac2733b6 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -93,6 +93,7 @@ class SystemController extends AbstractController 'file_upload_limit', 'unclaimed_task_reminder', 'unclaimed_task_reminder_time', + 'task_ai_auto_analyze', ])) { unset($all[$key]); } @@ -146,6 +147,7 @@ class SystemController extends AbstractController $setting['file_upload_limit'] = $setting['file_upload_limit'] ?: ''; $setting['unclaimed_task_reminder'] = $setting['unclaimed_task_reminder'] ?: 'close'; $setting['unclaimed_task_reminder_time'] = $setting['unclaimed_task_reminder_time'] ?: ''; + $setting['task_ai_auto_analyze'] = $setting['task_ai_auto_analyze'] ?: 'open'; $setting['server_timezone'] = config('app.timezone'); $setting['server_version'] = Base::getVersion(); // diff --git a/app/Tasks/AiTaskLoopTask.php b/app/Tasks/AiTaskLoopTask.php index cc4f8d6e6..05590c610 100644 --- a/app/Tasks/AiTaskLoopTask.php +++ b/app/Tasks/AiTaskLoopTask.php @@ -37,10 +37,20 @@ class AiTaskLoopTask extends AbstractTask return; } + // 检查系统级 AI 自动分析开关 + if (Base::settingFind('system', 'task_ai_auto_analyze', 'open') === 'close') { + return; + } + // 查询待处理的任务 $tasks = $this->findPendingTasks(); foreach ($tasks as $task) { + // 检查项目级 AI 自动分析开关 + if ($task->project && $task->project->ai_auto_analyze === 'close') { + continue; + } + // 为任务创建事件记录 $this->createEventRecords($task); @@ -62,7 +72,8 @@ class AiTaskLoopTask extends AbstractTask ->pluck('task_id'); // 查询新建任务(未处理过的) - $newTasks = ProjectTask::where('parent_id', 0) // 只处理主任务 + $newTasks = ProjectTask::with('project') + ->where('parent_id', 0) // 只处理主任务 ->whereNull('deleted_at') ->whereNull('archived_at') ->where('created_at', '<=', $delayTime) // 创建超过延迟时间 @@ -81,7 +92,8 @@ class AiTaskLoopTask extends AbstractTask ->take(self::BATCH_SIZE - $newTasks->count()) ->pluck('task_id'); - $retryTasks = ProjectTask::whereIn('id', $retryTaskIds) + $retryTasks = ProjectTask::with('project') + ->whereIn('id', $retryTaskIds) ->whereNull('deleted_at') ->get(); diff --git a/database/migrations/2026_04_02_000000_add_ai_auto_analyze_to_projects_table.php b/database/migrations/2026_04_02_000000_add_ai_auto_analyze_to_projects_table.php new file mode 100644 index 000000000..67419cd59 --- /dev/null +++ b/database/migrations/2026_04_02_000000_add_ai_auto_analyze_to_projects_table.php @@ -0,0 +1,32 @@ +string('ai_auto_analyze', 20)->default('open')->after('archive_days'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('projects', function (Blueprint $table) { + $table->dropColumn('ai_auto_analyze'); + }); + } +} diff --git a/resources/assets/js/pages/manage/components/ProjectPanel.vue b/resources/assets/js/pages/manage/components/ProjectPanel.vue index c4de6ae81..4dbe8b786 100644 --- a/resources/assets/js/pages/manage/components/ProjectPanel.vue +++ b/resources/assets/js/pages/manage/components/ProjectPanel.vue @@ -416,6 +416,15 @@ + + + {{$L('开启')}} + {{$L('关闭')}} + +
{{$L('系统已关闭AI任务分析功能。')}}
+
{{$L('新建任务后AI自动分析并给出建议。')}}
+
{{$L('关闭后本项目将不再自动分析任务。')}}
+
@@ -696,6 +705,8 @@ export default { 'cacheUserBasic', 'formOptions', + + 'systemConfig', ]), ...mapGetters(['projectData', 'transforTasks']), @@ -1508,7 +1519,8 @@ export default { name: this.projectData.name, desc: this.projectData.desc, archive_method: this.projectData.archive_method, - archive_days: this.projectData.archive_days + archive_days: this.projectData.archive_days, + ai_auto_analyze: this.projectData.ai_auto_analyze || 'open' }); this.settingShow = true; this.$nextTick(() => { diff --git a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue index bfa305c94..377cecfef 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue @@ -124,6 +124,14 @@ :placeholder="$L('请选择提醒时间')" transfer/> + + + {{$L('开启')}} + {{$L('关闭')}} + +
{{$L('新建任务后AI自动分析并给出建议。')}}
+
{{$L('关闭后所有项目将不再自动分析任务。')}}
+