"use client" import { useState } from "react" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Search, Plus, Filter, Play, Pause, Edit, Trash2, MoreHorizontal, FileText, Clock } from "lucide-react" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Switch } from "@/components/ui/switch" import { RuleEditor } from "@/components/tag-rules/rule-editor" import { RuleExecutionHistory } from "@/components/tag-rules/rule-execution-history" interface TagRule { id: string name: string description: string targetTag: string condition: string status: "active" | "inactive" | "draft" priority: number createdAt: string lastRun: string affectedUsers: number } const mockRules: TagRule[] = [ { id: "1", name: "高价值用户识别", description: "根据用户消费金额和频次识别高价值用户", targetTag: "高价值用户", condition: "消费金额 > 5000 AND 消费频次 > 10", status: "active", priority: 1, createdAt: "2023-05-12", lastRun: "2023-07-21 15:30", affectedUsers: 1250, }, { id: "2", name: "游戏爱好者标记", description: "根据用户浏览和购买行为识别游戏爱好者", targetTag: "游戏爱好者", condition: "游戏类目浏览时长 > 30min OR 游戏类目购买次数 > 2", status: "active", priority: 2, createdAt: "2023-04-18", lastRun: "2023-07-21 14:45", affectedUsers: 2840, }, { id: "3", name: "流失风险预警", description: "识别30天内可能流失的用户", targetTag: "流失风险高", condition: "最近登录时间 > 15天 AND 最近30天活跃度下降率 > 50%", status: "active", priority: 1, createdAt: "2023-06-30", lastRun: "2023-07-21 13:20", affectedUsers: 890, }, { id: "4", name: "周末活跃用户", description: "识别周末活跃度高的用户", targetTag: "周末活跃", condition: "周末活跃时长 > 工作日活跃时长 * 1.5", status: "inactive", priority: 3, createdAt: "2023-05-28", lastRun: "2023-07-10 09:15", affectedUsers: 3520, }, { id: "5", name: "潜在高转化用户", description: "识别浏览量高但未转化的潜在用户", targetTag: "潜在高转化", condition: "浏览商品数 > 20 AND 加购次数 > 5 AND 购买次数 = 0", status: "draft", priority: 2, createdAt: "2023-07-15", lastRun: "-", affectedUsers: 0, }, ] export default function TagRulesPage() { const [searchQuery, setSearchQuery] = useState("") const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) const [newRule, setNewRule] = useState({ name: "", description: "", targetTag: "", condition: "", priority: 2, status: "draft", }) const [selectedRuleId, setSelectedRuleId] = useState(null) const handleCreateRule = () => { // 这里应该是创建规则的逻辑 console.log("创建规则:", newRule) setIsCreateDialogOpen(false) setNewRule({ name: "", description: "", targetTag: "", condition: "", priority: 2, status: "draft", }) } const filteredRules = mockRules.filter( (rule) => rule.name.toLowerCase().includes(searchQuery.toLowerCase()) || rule.description.toLowerCase().includes(searchQuery.toLowerCase()) || rule.targetTag.toLowerCase().includes(searchQuery.toLowerCase()), ) const getStatusBadge = (status: TagRule["status"]) => { switch (status) { case "active": return 运行中 case "inactive": return 已暂停 case "draft": return 草稿 } } return (

标签规则引擎

管理和执行用户标签生成规则

规则总数
24

较上月增加 3 个

活跃规则
18

占总规则的 75%

今日执行次数
36

影响用户 12,580 人

规则列表 规则编辑器 执行历史
setSearchQuery(e.target.value)} />
规则名称 目标标签 状态 优先级 创建时间 最后执行 影响用户数 操作 {filteredRules.map((rule) => (
{rule.name}
{rule.description}
{rule.targetTag} {getStatusBadge(rule.status)} {rule.priority} {rule.createdAt} {rule.lastRun} {rule.affectedUsers.toLocaleString()} setSelectedRuleId(rule.id)}> 编辑 {rule.status === "active" ? ( <> 暂停 ) : ( <> 启动 )} 查看详情 删除
))}
{/* 创建规则对话框 */} 创建新规则 添加新的标签生成规则
setNewRule({ ...newRule, name: e.target.value })} className="col-span-3" />