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 @@
+