diff --git a/SuperAdmin/app/dashboard/projects/[id]/page.tsx b/SuperAdmin/app/dashboard/projects/[id]/page.tsx index 21ced6b8..0b673600 100644 --- a/SuperAdmin/app/dashboard/projects/[id]/page.tsx +++ b/SuperAdmin/app/dashboard/projects/[id]/page.tsx @@ -8,12 +8,14 @@ import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" -import { ArrowLeft, Edit } from "lucide-react" +import { ArrowLeft, Edit, ArrowUp, ArrowDown, ArrowUpDown } from "lucide-react" import { toast } from "sonner" import { use } from "react" import Image from "next/image" import { Badge } from "@/components/ui/badge" import { apiRequest } from '@/lib/api-utils' +import { Loader2 } from "lucide-react" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" interface ProjectProfile { id: number @@ -69,6 +71,9 @@ export default function ProjectDetailPage({ params }: ProjectDetailPageProps) { const [devices, setDevices] = useState([]) const [subUsers, setSubUsers] = useState([]) const [activeTab, setActiveTab] = useState("overview") + const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null) + const [deviceStatusFilter, setDeviceStatusFilter] = useState<'all' | 'online' | 'offline'>('all') + const [wechatStatusFilter, setWechatStatusFilter] = useState<'all' | 'loggedIn' | 'loggedOut' | 'notLogged'>('all') const fetchProject = async () => { try { @@ -92,17 +97,48 @@ export default function ProjectDetailPage({ params }: ProjectDetailPageProps) { }, [id]) const fetchDevices = async () => { + if (activeTab !== "devices") return + + setIsDevicesLoading(true) try { - setIsDevicesLoading(true) const result = await apiRequest(`/company/devices?companyId=${id}`) - if (result.code === 200 && result.data) { - setDevices(result.data) + + if (result.code === 200) { + let filteredDevices = result.data + + // 应用设备状态筛选 + if (deviceStatusFilter !== 'all') { + filteredDevices = filteredDevices.filter(device => + deviceStatusFilter === 'online' ? device.alive === 1 : device.alive !== 1 + ) + } + + // 应用微信状态筛选 + if (wechatStatusFilter !== 'all') { + filteredDevices = filteredDevices.filter(device => { + if (wechatStatusFilter === 'loggedIn') return device.wAlive === 1 + if (wechatStatusFilter === 'loggedOut') return device.wAlive === 0 + return device.wAlive === -1 + }) + } + + // 应用排序 + if (sortOrder) { + filteredDevices = [...filteredDevices].sort((a, b) => { + const aCount = a.friendCount || 0 + const bCount = b.friendCount || 0 + return sortOrder === 'asc' ? aCount - bCount : bCount - aCount + }) + } + + setDevices(filteredDevices) } else { toast.error(result.msg || "获取设备列表失败") + setDevices([]) } } catch (error) { - console.error("获取设备列表失败:", error) - toast.error("网络错误,请稍后再试") + toast.error("网络错误,请稍后重试") + setDevices([]) } finally { setIsDevicesLoading(false) } @@ -110,7 +146,7 @@ export default function ProjectDetailPage({ params }: ProjectDetailPageProps) { useEffect(() => { fetchDevices() - }, [activeTab, id]) + }, [activeTab, id, sortOrder, deviceStatusFilter, wechatStatusFilter]) useEffect(() => { const fetchSubUsers = async () => { @@ -133,6 +169,14 @@ export default function ProjectDetailPage({ params }: ProjectDetailPageProps) { fetchSubUsers() }, [id]) + const handleSort = () => { + setSortOrder(prev => { + if (prev === null) return 'desc' + if (prev === 'desc') return 'asc' + return null + }) + } + if (isLoading) { return
加载中...
} @@ -226,67 +270,111 @@ export default function ProjectDetailPage({ params }: ProjectDetailPageProps) { - - - 关联设备列表 - 项目关联的所有设备及其微信好友数量 - - - {isDevicesLoading ? ( -
加载中...
- ) : devices.length === 0 ? ( -
暂无数据
- ) : ( - <> - - - - 设备名称 - 设备型号 - 品牌 - IMEI - 设备状态 - 微信状态 - 微信好友数量 +
+
+

设备列表

+
+
+ 设备状态: + +
+
+ 微信状态: + +
+ +
+
+ {isDevicesLoading ? ( +
+ +
+ ) : devices.length > 0 ? ( +
+
+ + + 设备名称 + 型号 + 品牌 + IMEI + 设备状态 + 微信状态 + 微信好友数量 + + + + {devices.map((device) => ( + + {device.memo} + {device.model} + {device.brand} + {device.imei} + + + {device.alive === 1 ? "在线" : "离线"} + + + + + {device.wAlive === 1 ? "已登录" : device.wAlive === 0 ? "已登出" : "未登录微信"} + + + {device.friendCount || 0} - - - {devices.map((device) => ( - - {device.memo} - {device.model} - {device.brand} - {device.imei} - - - {device.alive === 1 ? "在线" : "离线"} - - - - - {device.wAlive === 1 ? "已登录" : device.wAlive === 0 ? "已登出" : "未登录微信"} - - - {device.friendCount || 0} - - ))} - -
-
- 共 {devices.length} 条数据 -
- - )} -
-
+ ))} + + + + ) : ( +
+ 暂无设备数据 +
+ )} +