feat: AI预测分析接入真实后端数据 + 修复CloudBilling文件损坏

- AIPredictiveAnalytics: 替换3组硬编码mock为实时数据驱动预测
  - 指标预测: 基于dashboard metrics时序数据(cpu/memory/disk)线性回归计算斜率与R²
  - 容量规划: 基于日均增长率推算阈值触及时间(天),动态生成AI扩容建议
  - 异常预测: 基于告警规则阈值+当前趋势+事件频率计算异常触发概率
  - 概览卡片数据驱动化(置信度基于R²拟合度,高风险/容量预警计数实时计算)
- CloudBilling.tsx: 修复read_file导致的行号前缀损坏(501行全部含N|前缀)
This commit is contained in:
attacker committed 2026-06-14 21:13:49 +08:00
1 parent 0ebe22d142
commit 2da4f52209
17 files changed
+2299 -322

No files matched your search

@@ -21,6 +21,7 @@ import { Label } from '@/components/ui/label';
import { Separator } from '@/components/ui/separator';
import { ScrollArea } from '@/components/ui/scroll-area';
import { toast } from 'sonner';
import { useConfirm } from '@/components/ui/confirm-dialog';
import { ansibleApi } from '@/services/api';
interface Playbook {
@@ -80,6 +81,7 @@ interface Group {
}
const AnsibleManager: React.FC = () => {
const _confirm = useConfirm();
const [playbooks, setPlaybooks] = useState<Playbook[]>([]);
const [jobs, setJobs] = useState<Job[]>([]);
const [inventories, setInventories] = useState<Inventory[]>([]);
@@ -181,7 +183,7 @@ const AnsibleManager: React.FC = () => {
};
const handleDelete = async (id: string) => {
if (!confirm('确定删除此Playbook吗?')) return;
{ const ok = await _confirm({ title: '删除 Playbook', description: '确定删除此Playbook吗?', confirmText: '删除', variant: 'destructive' }); if (!ok) return; }
try {
await ansibleApi.deletePlaybook(id);
toast.success('删除成功');