"use client" import { Card } from "@/components/ui/card" import type React from "react" import { useState, useRef, useEffect } from "react" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { MoreHorizontal, Copy, Pencil, Trash2, Clock, Link } from "lucide-react" interface Task { id: string name: string status: "running" | "paused" | "completed" stats: { devices: number acquired: number added: number } lastUpdated: string executionTime: string nextExecutionTime: string trend: { date: string; customers: number }[] } interface ScenarioAcquisitionCardProps { task: Task channel: string onEdit: (taskId: string) => void onCopy: (taskId: string) => void onDelete: (taskId: string) => void onOpenSettings?: (taskId: string) => void onStatusChange?: (taskId: string, newStatus: "running" | "paused") => void } export function ScenarioAcquisitionCard({ task, channel, onEdit, onCopy, onDelete, onOpenSettings, onStatusChange, }: ScenarioAcquisitionCardProps) { const { devices: deviceCount, acquired: acquiredCount, added: addedCount } = task.stats const passRate = calculatePassRate(acquiredCount, addedCount) const [menuOpen, setMenuOpen] = useState(false) const menuRef = useRef(null) const handleStatusChange = (e: React.MouseEvent) => { e.stopPropagation() if (onStatusChange) { onStatusChange(task.id, task.status === "running" ? "paused" : "running") } } const handleEdit = (e: React.MouseEvent) => { e.stopPropagation() setMenuOpen(false) onEdit(task.id) } const handleCopy = (e: React.MouseEvent) => { e.stopPropagation() setMenuOpen(false) onCopy(task.id) } const handleOpenSettings = (e: React.MouseEvent) => { e.stopPropagation() setMenuOpen(false) if (onOpenSettings) { onOpenSettings(task.id) } } const handleDelete = (e: React.MouseEvent) => { e.stopPropagation() setMenuOpen(false) onDelete(task.id) } const toggleMenu = (e: React.MouseEvent) => { e.stopPropagation() setMenuOpen(!menuOpen) } // 点击外部关闭菜单 useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setMenuOpen(false) } } document.addEventListener("mousedown", handleClickOutside) return () => { document.removeEventListener("mousedown", handleClickOutside) } }, []) return (

{task.name}

{task.status === "running" ? "进行中" : "已暂停"}
{menuOpen && (
{onOpenSettings && ( )}
)}
设备数
{deviceCount}
已获客
{acquiredCount}
已添加
{addedCount}
通过率
{passRate}%
上次执行:{task.lastUpdated}
下次执行:{task.nextExecutionTime}
) } // 计算通过率 function calculatePassRate(acquired: number, added: number) { if (acquired === 0) return 0 return Math.round((added / acquired) * 100) }