"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 }[] reqConf?: { device?: string[] selectedDevices?: string[] } } 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 deviceCount = Array.isArray(task.reqConf?.device) ? task.reqConf.device.length : Array.isArray(task.reqConf?.selectedDevices) ? task.reqConf.selectedDevices.length : 0 // 获客数和已添加数可根据 msgConf 或其它字段自定义 const acquiredCount = task.acquiredCount ?? 0 const addedCount = task.addedCount ?? 0 const passRate = task.passRate ?? 0 const [menuOpen, setMenuOpen] = useState(false) const menuRef = useRef(null) const isActive = task.status === 1; 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}

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