diff --git a/frontend/src/components/BotSourceTag.vue b/frontend/src/components/BotSourceTag.vue
new file mode 100644
index 00000000..6b7bb599
--- /dev/null
+++ b/frontend/src/components/BotSourceTag.vue
@@ -0,0 +1,45 @@
+
+
+ 最近Bot更新:{{ updatedAt }}
+ |
+ 来源:{{ source }}
+ |
+ 批次:{{ batch }}
+
+
+
+
+
+
diff --git a/frontend/src/views/AlertList.vue b/frontend/src/views/AlertList.vue
index 77f4fb37..02d91163 100644
--- a/frontend/src/views/AlertList.vue
+++ b/frontend/src/views/AlertList.vue
@@ -9,6 +9,10 @@
+
+
+
+
@@ -342,6 +346,7 @@ import { ref, computed, onMounted } from 'vue'
import { useRoute } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { alertApi, userApi, actionPlanApi, kpiApi, alertRulesApi } from '../api/index'
+import BotSourceTag from '../components/BotSourceTag.vue'
import RiskCell from '../components/charts/RiskCell.vue'
const route = useRoute()
@@ -398,6 +403,13 @@ function isTrendAlert(msg: string): boolean {
return msg?.startsWith('[趋势') || msg?.startsWith('[动态')
}
+// ── C区标注:预警数据由预警引擎(定时规则)自动生成,展示最近生成时间(无预警行则不显示) ──
+const latestAlertTime = computed(() => {
+ const times = alerts.value.map((a: any) => a.created_at || '').filter(Boolean)
+ if (!times.length) return ''
+ return formatTime(times.sort((x: string, y: string) => y.localeCompare(x))[0])
+})
+
function formatTime(t: string): string {
if (!t) return '-'
try { return new Date(t).toLocaleString('zh-CN', { hour12: false }) } catch { return t }
diff --git a/frontend/src/views/BotKpiDashboard.vue b/frontend/src/views/BotKpiDashboard.vue
index 815d046b..ce2ea49e 100644
--- a/frontend/src/views/BotKpiDashboard.vue
+++ b/frontend/src/views/BotKpiDashboard.vue
@@ -7,6 +7,7 @@
2026年7月
@@ -163,6 +164,7 @@