"use client" import { useState } from "react" import type { UserRFMData, UserSegment, UserFilterOptions } from "@/types/data-analysis" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Search, Filter, RefreshCw, UserPlus, Download } from "lucide-react" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" interface UserSelectorProps { users: UserRFMData[] selectedUsers: string[] onSelectUser: (userId: string) => void onSelectAll: (selected: boolean) => void onFilterChange: (options: UserFilterOptions) => void filterOptions: UserFilterOptions } export function UserSelector({ users, selectedUsers, onSelectUser, onSelectAll, onFilterChange, filterOptions, }: UserSelectorProps) { const [searchQuery, setSearchQuery] = useState("") const [showFilters, setShowFilters] = useState(false) // 本地过滤用户(搜索功能) const filteredUsers = users.filter( (user) => user.userName.toLowerCase().includes(searchQuery.toLowerCase()) || user.phone.includes(searchQuery) || user.segment.toLowerCase().includes(searchQuery.toLowerCase()), ) // 处理分群选择 const handleSegmentChange = (segment: UserSegment, checked: boolean) => { let newSegments = [...filterOptions.segments] if (checked) { newSegments.push(segment) } else { newSegments = newSegments.filter((s) => s !== segment) } onFilterChange({ ...filterOptions, segments: newSegments }) } // 处理日期范围变更 const handleDateRangeChange = (field: "start" | "end", value: string) => { onFilterChange({ ...filterOptions, dateRange: { ...filterOptions.dateRange, [field]: value, }, }) } // 处理价值范围变更 const handleValueRangeChange = (field: "min" | "max", value: string) => { onFilterChange({ ...filterOptions, valueRange: { ...filterOptions.valueRange, [field]: Number.parseInt(value) || 0, }, }) } // 获取用户分群的颜色 const getSegmentColor = (segment: string) => { if (segment.includes("高价值")) return "bg-green-100 text-green-800" if (segment.includes("中价值")) return "bg-blue-100 text-blue-800" if (segment.includes("低价值")) return "bg-gray-100 text-gray-800" return "bg-purple-100 text-purple-800" // 新用户 } return (
用户选择
{/* 搜索栏 */}
setSearchQuery(e.target.value)} />
{/* 筛选面板 */} {showFilters && (

高级筛选

{/* 分群筛选 */}

用户分群

{[ "高价值活跃用户", "高价值流失风险用户", "高价值沉睡用户", "中价值活跃用户", "中价值流失风险用户", "中价值沉睡用户", "低价值活跃用户", "低价值流失风险用户", "低价值沉睡用户", "新用户", ].map((segment) => (
handleSegmentChange(segment as UserSegment, checked as boolean)} />
))}
{/* 日期范围筛选 */}

最后购买日期

handleDateRangeChange("start", e.target.value)} className="text-xs" />
handleDateRangeChange("end", e.target.value)} className="text-xs" />
{/* 价值范围筛选 */}

用户估值范围

handleValueRangeChange("min", e.target.value)} className="text-xs" />
handleValueRangeChange("max", e.target.value)} className="text-xs" />
)} {/* 用户表格 */}
0} onCheckedChange={(checked) => onSelectAll(!!checked)} /> 用户名 手机号 最后购买 购买频率 消费总额 RFM得分 用户分群 估值 {filteredUsers.length === 0 ? ( 没有找到匹配的用户 ) : ( filteredUsers.map((user) => ( onSelectUser(user.userId)} /> {user.userName} {user.phone} {user.lastPurchaseDate} {user.purchaseFrequency}次 ¥{user.totalSpent.toLocaleString()}
R{user.rfmScore.recency} F{user.rfmScore.frequency} M{user.rfmScore.monetary}
{user.segment} ¥{user.valueEstimation.toLocaleString()}
)) )}
{/* 选择统计 */}
已选择 {selectedUsers.length} 个用户, 总估值{" "} ¥ {users .filter((user) => selectedUsers.includes(user.userId)) .reduce((sum, user) => sum + user.valueEstimation, 0) .toLocaleString()}
) }