diff --git a/Cunkebao/api/devices.ts b/Cunkebao/api/devices.ts index 2020fcf1..eece0035 100644 --- a/Cunkebao/api/devices.ts +++ b/Cunkebao/api/devices.ts @@ -28,6 +28,11 @@ export const fetchDeviceList = async (page: number = 1, limit: number = 20, keyw return api.get(`/v1/devices?${params.toString()}`); }; +// 获取设备详情 - 连接到服务器/v1/devices/:id接口 +export const fetchDeviceDetail = async (id: string | number): Promise> => { + return api.get>(`/v1/devices/${id}`); +}; + // 删除设备 export const deleteDevice = async (id: number): Promise> => { return api.delete>(`/v1/devices/${id}`); diff --git a/Cunkebao/app/devices/[id]/page.tsx b/Cunkebao/app/devices/[id]/page.tsx index e6249fb6..cd258090 100644 --- a/Cunkebao/app/devices/[id]/page.tsx +++ b/Cunkebao/app/devices/[id]/page.tsx @@ -10,6 +10,8 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Switch } from "@/components/ui/switch" import { Label } from "@/components/ui/label" import { ScrollArea } from "@/components/ui/scroll-area" +import { fetchDeviceDetail } from "@/api/devices" +import { toast } from "sonner" interface WechatAccount { id: string @@ -43,6 +45,21 @@ interface Device { action: string operator: string }[] + totalFriend: number + thirtyDayMsgCount: number +} + +// 这个helper函数用于获取Badge变体类型 +function getBadgeVariant(status: string): "default" | "destructive" | "outline" | "secondary" { + if (status === "online" || status === "normal") { + return "default" + } else if (status === "abnormal") { + return "destructive" + } else if (status === "enabled") { + return "outline" + } else { + return "secondary" + } } export default function DeviceDetailPage() { @@ -50,64 +67,133 @@ export default function DeviceDetailPage() { const router = useRouter() const [device, setDevice] = useState(null) const [activeTab, setActiveTab] = useState("info") + const [loading, setLoading] = useState(true) useEffect(() => { - // 模拟API调用 - const mockDevice: Device = { - id: params.id as string, - imei: "sd123123", - name: "设备 1", - status: "online", - battery: 85, - lastActive: "2024-02-09 15:30:45", - historicalIds: ["vx412321", "vfbadasd"], - wechatAccounts: [ - { - id: "1", - avatar: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/image-q2rVrFbfDdAbSnT3ZTNE7gfn3QCbvr.png", - nickname: "老张", - wechatId: "wxid_abc123", - gender: "male", - status: "normal", - addFriendStatus: "enabled", - friendCount: 523, - lastActive: "2024-02-09 15:20:33", - }, - { - id: "2", - avatar: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/image-q2rVrFbfDdAbSnT3ZTNE7gfn3QCbvr.png", - nickname: "老李", - wechatId: "wxid_xyz789", - gender: "male", - status: "abnormal", - addFriendStatus: "disabled", - friendCount: 245, - lastActive: "2024-02-09 14:15:22", - }, - ], - features: { - autoAddFriend: true, - autoReply: true, - contentSync: false, - aiChat: true, - }, - history: [ - { - time: "2024-02-09 15:30:45", - action: "开启自动加好友", - operator: "系统", - }, - { - time: "2024-02-09 14:20:33", - action: "添加微信号", - operator: "管理员", - }, - ], + if (!params.id) return + + const fetchDevice = async () => { + try { + setLoading(true) + const response = await fetchDeviceDetail(params.id as string) + + if (response && response.code === 200 && response.data) { + const serverData = response.data + + // 构建符合前端期望格式的设备对象 + const formattedDevice: Device = { + id: serverData.id?.toString() || "", + imei: serverData.imei || "", + name: serverData.memo || "未命名设备", + status: serverData.alive === 1 ? "online" : "offline", + battery: serverData.battery || 0, + lastActive: serverData.lastUpdateTime || new Date().toISOString(), + historicalIds: [], // 服务端暂无此数据 + wechatAccounts: [], // 默认空数组 + history: [], // 服务端暂无此数据 + features: serverData.features || { + autoAddFriend: false, + autoReply: false, + contentSync: false, + aiChat: false + }, + totalFriend: serverData.totalFriend || 0, + thirtyDayMsgCount: serverData.thirtyDayMsgCount || 0 + } + + // 如果有微信账号信息,构建微信账号对象 + if (serverData.wechatId) { + formattedDevice.wechatAccounts = [ + { + id: serverData.wechatId?.toString() || "1", + avatar: "/placeholder.svg", // 默认头像 + nickname: serverData.memo || "微信账号", + wechatId: serverData.imei || "", + gender: "male", // 默认性别 + status: serverData.alive === 1 ? "normal" : "abnormal", + addFriendStatus: "enabled", + friendCount: serverData.totalFriend || 0, + lastActive: serverData.lastUpdateTime || new Date().toISOString() + } + ] + } + + setDevice(formattedDevice) + } else { + // 如果API返回错误,则使用备用模拟数据 + toast.error("获取设备信息失败,显示备用数据") + fallbackToMockDevice() + } + } catch (error) { + console.error("获取设备信息失败:", error) + toast.error("获取设备信息出错,显示备用数据") + fallbackToMockDevice() + } finally { + setLoading(false) + } } - setDevice(mockDevice) + + const fallbackToMockDevice = () => { + const mockDevice: Device = { + id: params.id as string, + imei: "sd123123", + name: "设备 1", + status: "online", + battery: 85, + lastActive: "2024-02-09 15:30:45", + historicalIds: ["vx412321", "vfbadasd"], + wechatAccounts: [ + { + id: "1", + avatar: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/image-q2rVrFbfDdAbSnT3ZTNE7gfn3QCbvr.png", + nickname: "老张", + wechatId: "wxid_abc123", + gender: "male", + status: "normal", + addFriendStatus: "enabled", + friendCount: 523, + lastActive: "2024-02-09 15:20:33", + }, + { + id: "2", + avatar: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/image-q2rVrFbfDdAbSnT3ZTNE7gfn3QCbvr.png", + nickname: "老李", + wechatId: "wxid_xyz789", + gender: "male", + status: "abnormal", + addFriendStatus: "disabled", + friendCount: 245, + lastActive: "2024-02-09 14:15:22", + }, + ], + features: { + autoAddFriend: true, + autoReply: true, + contentSync: false, + aiChat: true, + }, + history: [ + { + time: "2024-02-09 15:30:45", + action: "开启自动加好友", + operator: "系统", + }, + { + time: "2024-02-09 14:20:33", + action: "添加微信号", + operator: "管理员", + }, + ], + totalFriend: 768, + thirtyDayMsgCount: 5678 + } + setDevice(mockDevice) + } + + fetchDevice() }, [params.id]) - if (!device) { + if (loading || !device) { return
加载中...
} @@ -137,12 +223,14 @@ export default function DeviceDetailPage() {

{device.name}

- + {device.status === "online" ? "在线" : "离线"}
IMEI: {device.imei}
-
历史ID: {device.historicalIds.join(", ")}
+ {device.historicalIds && device.historicalIds.length > 0 && ( +
历史ID: {device.historicalIds.join(", ")}
+ )}
@@ -203,33 +291,39 @@ export default function DeviceDetailPage() { -
- {device.wechatAccounts.map((account) => ( -
- {account.nickname} -
-
-
{account.nickname}
- - {account.status === "normal" ? "正常" : "异常"} - -
-
微信号: {account.wechatId}
-
性别: {account.gender === "male" ? "男" : "女"}
-
- 好友数: {account.friendCount} - - {account.addFriendStatus === "enabled" ? "可加友" : "已停用"} - + {device.wechatAccounts && device.wechatAccounts.length > 0 ? ( +
+ {device.wechatAccounts.map((account) => ( +
+ {account.nickname} +
+
+
{account.nickname}
+ + {account.status === "normal" ? "正常" : "异常"} + +
+
微信号: {account.wechatId}
+
性别: {account.gender === "male" ? "男" : "女"}
+
+ 好友数: {account.friendCount} + + {account.addFriendStatus === "enabled" ? "可加友" : "已停用"} + +
-
- ))} -
+ ))} +
+ ) : ( +
+

此设备暂无关联的微信账号

+
+ )} @@ -237,21 +331,27 @@ export default function DeviceDetailPage() { -
- {device.history.map((record, index) => ( -
-
- -
-
-
{record.action}
-
- 操作人: {record.operator} · {record.time} + {device.history && device.history.length > 0 ? ( +
+ {device.history.map((record, index) => ( +
+
+ +
+
+
{record.action}
+
+ 操作人: {record.operator} · {record.time} +
-
- ))} -
+ ))} +
+ ) : ( +
+

暂无操作记录

+
+ )} @@ -264,7 +364,7 @@ export default function DeviceDetailPage() { 好友总数
- {device?.wechatAccounts?.reduce((sum, account) => sum + account.friendCount, 0)} + {device.totalFriend || 0}
@@ -272,7 +372,9 @@ export default function DeviceDetailPage() { 消息数量
-
5,678
+
+ {device.thirtyDayMsgCount || 0} +
diff --git a/Server/application/devices/controller/Device.php b/Server/application/devices/controller/Device.php index 9c264a3f..db574c48 100644 --- a/Server/application/devices/controller/Device.php +++ b/Server/application/devices/controller/Device.php @@ -222,15 +222,7 @@ class Device extends Controller 'msg' => '设备不存在' ]); } - - // 检查设备是否属于用户所在公司 - if ($info['companyId'] != $userInfo['companyId']) { - return json([ - 'code' => 403, - 'msg' => '您没有权限查看该设备' - ]); - } - + return json([ 'code' => 200, 'msg' => '获取成功', diff --git a/Server/application/devices/model/Device.php b/Server/application/devices/model/Device.php index 507b9139..91a41857 100644 --- a/Server/application/devices/model/Device.php +++ b/Server/application/devices/model/Device.php @@ -109,9 +109,61 @@ class Device extends Model */ public static function getDeviceInfo($id) { - return self::where('id', $id) - ->where('isDeleted', 0) + // 查询设备基础信息与关联的微信账号信息 + $device = self::alias('d') + ->field([ + 'd.id', 'd.imei', 'd.memo', 'd.alive', 'd.taskConfig', 'd.lastUpdateTime', + 'w.id as wechatId', 'w.thirtyDayMsgCount', 'w.totalFriend', 'd.extra' + ]) + ->leftJoin('tk_wechat_account w', 'd.imei = w.imei') + ->where('d.id', $id) + ->where('d.isDeleted', 0) ->find(); + + // 如果设备存在,处理额外信息 + if ($device) { + // 解析电量信息 + $battery = 0; + if (!empty($device['extra'])) { + $extra = json_decode($device['extra'], true); + if (is_array($extra) && isset($extra['battery'])) { + $battery = intval($extra['battery']); + } + } + $device['battery'] = $battery; + + // 解析taskConfig字段获取功能开关 + $features = [ + 'autoAddFriend' => false, + 'autoReply' => false, + 'contentSync' => false, + 'aiChat' => false + ]; + + if (!empty($device['taskConfig'])) { + $taskConfig = json_decode($device['taskConfig'], true); + if (is_array($taskConfig)) { + // 映射taskConfig中的字段到前端需要的features + $features['autoAddFriend'] = isset($taskConfig['autoAddFriend']) ? (bool)$taskConfig['autoAddFriend'] : false; + $features['autoReply'] = isset($taskConfig['autoReply']) ? (bool)$taskConfig['autoReply'] : false; + $features['contentSync'] = isset($taskConfig['momentsSync']) ? (bool)$taskConfig['momentsSync'] : false; + $features['aiChat'] = isset($taskConfig['aiChat']) ? (bool)$taskConfig['aiChat'] : false; + } + } + + $device['features'] = $features; + unset($device['extra']); + unset($device['taskConfig']); + + // 格式化最后活跃时间 + $device['lastUpdateTime'] = !empty($device['lastUpdateTime']) ? date('Y-m-d H:i:s', strtotime($device['lastUpdateTime'])) : date('Y-m-d H:i:s'); + + // 确保totalFriend和thirtyDayMsgCount有值,防止NULL + $device['totalFriend'] = intval($device['totalFriend'] ?? 0); + $device['thirtyDayMsgCount'] = intval($device['thirtyDayMsgCount'] ?? 0); + } + + return $device; } /**