"use client" import type React from "react" import { useState, useEffect } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Database, Upload, Download, RefreshCw, CheckCircle, AlertCircle, Clock, Settings, Pause, BarChart3, TrendingUp, Zap, } from "lucide-react" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { useToast } from "@/components/ui/use-toast" export default function DataIngestionPage() { const { toast } = useToast() const [activeTab, setActiveTab] = useState("overview") const [ingestionStatus, setIngestionStatus] = useState(null) const [isManualIngesting, setIsManualIngesting] = useState(false) // 模拟数据接入状态 const [mockStatus] = useState({ totalIngested: 125678, todayIngested: 1234, activeSources: 8, lastIngestionTime: "2分钟前", dataQuality: 94.6, processingQueue: 23, recentIngestions: [ { id: "ing_001", source: "抖音API", recordsCount: 156, status: "completed", startTime: "14:30", duration: "2分钟", quality: 96.8, }, { id: "ing_002", source: "触客宝后台", recordsCount: 89, status: "completed", startTime: "14:25", duration: "1分钟", quality: 95.2, }, { id: "ing_003", source: "表单提交", recordsCount: 234, status: "processing", startTime: "14:32", duration: "进行中", quality: 0, }, { id: "ing_004", source: "小红书API", recordsCount: 67, status: "failed", startTime: "14:20", duration: "失败", quality: 0, }, ], sourceStats: [ { name: "抖音API", records: 45678, quality: 96.8, status: "active" }, { name: "小红书API", records: 23456, quality: 92.5, status: "active" }, { name: "触客宝后台", records: 12345, quality: 95.1, status: "active" }, { name: "表单提交", records: 34567, quality: 97.2, status: "active" }, { name: "飞书妙记", records: 5678, quality: 91.3, status: "active" }, { name: "微信公众号", records: 8901, quality: 93.7, status: "inactive" }, ], }) useEffect(() => { // 模拟获取接入状态 setIngestionStatus(mockStatus) }, []) const handleManualIngest = async (formData: any) => { setIsManualIngesting(true) try { const response = await fetch("/api/ingest", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), }) const result = await response.json() if (result.success) { toast({ title: "数据接入成功", description: `成功处理用户数据,用户ID: ${result.data.userId}`, }) } else { throw new Error(result.error) } } catch (error) { toast({ title: "数据接入失败", description: (error as Error).message, variant: "destructive", }) } finally { setIsManualIngesting(false) } } const getStatusColor = (status: string) => { switch (status) { case "completed": return "bg-green-100 text-green-800" case "processing": return "bg-yellow-100 text-yellow-800" case "failed": return "bg-red-100 text-red-800" case "active": return "bg-green-100 text-green-800" case "inactive": return "bg-gray-100 text-gray-800" default: return "bg-gray-100 text-gray-800" } } const getStatusIcon = (status: string) => { switch (status) { case "completed": return case "processing": return case "failed": return case "active": return case "inactive": return default: return } } if (!ingestionStatus) { return
加载中...
} return (
{/* 页面标题和工具栏 */}

数据接入管理

多源数据接入监控与管理

手动数据接入 手动提交数据进行接入处理
概览 数据源 接入历史 监控统计 {/* 接入概览 */}

总接入量

{ingestionStatus.totalIngested.toLocaleString()}

今日接入

{ingestionStatus.todayIngested.toLocaleString()}

活跃数据源

{ingestionStatus.activeSources}

数据质量

{ingestionStatus.dataQuality}%

{/* 实时状态 */} 实时接入状态 当前数据接入处理状态
处理队列 {ingestionStatus.processingQueue} 条待处理
最后接入时间 {ingestionStatus.lastIngestionTime}
数据质量评分 {ingestionStatus.dataQuality}%
{/* 数据源状态 */} 数据源管理 各数据源的接入状态和质量监控
{ingestionStatus.sourceStats.map((source: any, index: number) => (
{getStatusIcon(source.status)}

{source.name}

{source.records.toLocaleString()} 条记录

{source.quality}%

数据质量

{source.status === "active" ? "活跃" : "非活跃"}
))}
{/* 接入历史 */} 最近接入记录 最近的数据接入处理记录
{ingestionStatus.recentIngestions.map((ingestion: any) => (
{getStatusIcon(ingestion.status)}

{ingestion.source}

{ingestion.recordsCount} 条记录 • {ingestion.startTime} • {ingestion.duration}

{ingestion.quality > 0 && (

{ingestion.quality}%

质量评分

)} {ingestion.status === "completed" ? "完成" : ingestion.status === "processing" ? "处理中" : "失败"}
))}
{/* 监控统计 */}
接入趋势 过去7天的数据接入趋势

接入趋势图表

质量分布 各数据源的质量分布情况
{ingestionStatus.sourceStats.slice(0, 5).map((source: any, index: number) => (
{source.name} {source.quality}%
))}
) } // 手动接入表单组件 function ManualIngestionForm({ onSubmit, isLoading }: { onSubmit: (data: any) => void; isLoading: boolean }) { const [formData, setFormData] = useState({ source: "", sourceUserId: "", sourceRecordId: "", originalData: "", }) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() try { const parsedData = JSON.parse(formData.originalData) onSubmit({ ...formData, originalData: parsedData, }) } catch (error) { alert("原始数据必须是有效的JSON格式") } } return (
setFormData({ ...formData, sourceUserId: e.target.value })} placeholder="可选" />
setFormData({ ...formData, sourceRecordId: e.target.value })} placeholder="可选" />