2025-07-03 18:09:07 +08:00
|
|
|
|
import { get, post, put, del } from './request';
|
|
|
|
|
|
import type { ApiResponse, PaginatedResponse } from '@/types/common';
|
|
|
|
|
|
import type {
|
|
|
|
|
|
Device,
|
|
|
|
|
|
DeviceStats,
|
|
|
|
|
|
DeviceTaskRecord,
|
|
|
|
|
|
QueryDeviceParams,
|
|
|
|
|
|
CreateDeviceParams,
|
|
|
|
|
|
UpdateDeviceParams,
|
|
|
|
|
|
DeviceStatus,
|
|
|
|
|
|
ServerDevicesResponse
|
|
|
|
|
|
} from '@/types/device';
|
|
|
|
|
|
|
|
|
|
|
|
const API_BASE = "/devices";
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备列表 - 连接到服务器/v1/devices接口
|
|
|
|
|
|
export const fetchDeviceList = async (page: number = 1, limit: number = 20, keyword?: string): Promise<ServerDevicesResponse> => {
|
|
|
|
|
|
const params = new URLSearchParams();
|
|
|
|
|
|
params.append('page', page.toString());
|
|
|
|
|
|
params.append('limit', limit.toString());
|
|
|
|
|
|
|
|
|
|
|
|
if (keyword) {
|
|
|
|
|
|
params.append('keyword', keyword);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return get<ServerDevicesResponse>(`/v1/devices?${params.toString()}`);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备详情 - 连接到服务器/v1/devices/:id接口
|
|
|
|
|
|
export const fetchDeviceDetail = async (id: string | number): Promise<ApiResponse<any>> => {
|
|
|
|
|
|
return get<ApiResponse<any>>(`/v1/devices/${id}`);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备关联的微信账号
|
|
|
|
|
|
export const fetchDeviceRelatedAccounts = async (id: string | number): Promise<ApiResponse<any>> => {
|
|
|
|
|
|
return get<ApiResponse<any>>(`/v1/wechats/related-device/${id}`);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备操作记录
|
|
|
|
|
|
export const fetchDeviceHandleLogs = async (id: string | number, page: number = 1, limit: number = 10): Promise<ApiResponse<any>> => {
|
|
|
|
|
|
return get<ApiResponse<any>>(`/v1/devices/${id}/handle-logs?page=${page}&limit=${limit}`);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 更新设备任务配置
|
|
|
|
|
|
export const updateDeviceTaskConfig = async (
|
|
|
|
|
|
config: {
|
|
|
|
|
|
deviceId: string | number;
|
|
|
|
|
|
autoAddFriend?: boolean;
|
|
|
|
|
|
autoReply?: boolean;
|
|
|
|
|
|
momentsSync?: boolean;
|
|
|
|
|
|
aiChat?: boolean;
|
|
|
|
|
|
}
|
|
|
|
|
|
): Promise<ApiResponse<any>> => {
|
|
|
|
|
|
return post<ApiResponse<any>>(`/v1/devices/task-config`, config);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 删除设备
|
|
|
|
|
|
export const deleteDevice = async (id: number): Promise<ApiResponse<any>> => {
|
|
|
|
|
|
return del<ApiResponse<any>>(`/v1/devices/${id}`);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 设备管理API
|
2025-07-04 17:15:06 +08:00
|
|
|
|
export const devicesApi = {
|
|
|
|
|
|
// 获取设备列表
|
|
|
|
|
|
async getList(page: number = 1, limit: number = 20, keyword?: string): Promise<ServerDevicesResponse> {
|
|
|
|
|
|
const params = new URLSearchParams();
|
|
|
|
|
|
params.append('page', page.toString());
|
|
|
|
|
|
params.append('limit', limit.toString());
|
|
|
|
|
|
|
|
|
|
|
|
if (keyword) {
|
|
|
|
|
|
params.append('keyword', keyword);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return get<ServerDevicesResponse>(`/v1/devices?${params.toString()}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备二维码
|
|
|
|
|
|
async getQRCode(accountId: string): Promise<ApiResponse<{ qrCode: string }>> {
|
|
|
|
|
|
return post<ApiResponse<{ qrCode: string }>>('/v1/api/device/add', { accountId });
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 通过IMEI添加设备
|
|
|
|
|
|
async addByImei(imei: string, name: string): Promise<ApiResponse<any>> {
|
|
|
|
|
|
return post<ApiResponse<any>>('/v1/api/device/add-by-imei', { imei, name });
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-07-03 18:09:07 +08:00
|
|
|
|
// 创建设备
|
|
|
|
|
|
async create(params: CreateDeviceParams): Promise<ApiResponse<Device>> {
|
|
|
|
|
|
return post<ApiResponse<Device>>(`${API_BASE}`, params);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 更新设备
|
|
|
|
|
|
async update(params: UpdateDeviceParams): Promise<ApiResponse<Device>> {
|
|
|
|
|
|
return put<ApiResponse<Device>>(`${API_BASE}/${params.id}`, params);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备详情
|
|
|
|
|
|
async getById(id: string): Promise<ApiResponse<Device>> {
|
|
|
|
|
|
return get<ApiResponse<Device>>(`${API_BASE}/${id}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 查询设备列表
|
|
|
|
|
|
async query(params: QueryDeviceParams): Promise<ApiResponse<PaginatedResponse<Device>>> {
|
|
|
|
|
|
// 创建一个新对象,用于构建URLSearchParams
|
|
|
|
|
|
const queryParams: Record<string, string> = {};
|
|
|
|
|
|
|
|
|
|
|
|
// 按需将params中的属性添加到queryParams
|
|
|
|
|
|
if (params.keyword) queryParams.keyword = params.keyword;
|
|
|
|
|
|
if (params.status) queryParams.status = params.status;
|
|
|
|
|
|
if (params.type) queryParams.type = params.type;
|
|
|
|
|
|
if (params.page) queryParams.page = params.page.toString();
|
|
|
|
|
|
if (params.pageSize) queryParams.pageSize = params.pageSize.toString();
|
|
|
|
|
|
|
|
|
|
|
|
// 特殊处理需要JSON序列化的属性
|
|
|
|
|
|
if (params.tags) queryParams.tags = JSON.stringify(params.tags);
|
|
|
|
|
|
if (params.dateRange) queryParams.dateRange = JSON.stringify(params.dateRange);
|
|
|
|
|
|
|
|
|
|
|
|
// 构建查询字符串
|
|
|
|
|
|
const queryString = new URLSearchParams(queryParams).toString();
|
|
|
|
|
|
return get<ApiResponse<PaginatedResponse<Device>>>(`${API_BASE}?${queryString}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-07-04 17:15:06 +08:00
|
|
|
|
// 删除设备(旧版本)
|
|
|
|
|
|
async deleteById(id: string): Promise<ApiResponse<void>> {
|
2025-07-03 18:09:07 +08:00
|
|
|
|
return del<ApiResponse<void>>(`${API_BASE}/${id}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-07-04 17:15:06 +08:00
|
|
|
|
// 删除设备(新版本)
|
|
|
|
|
|
async delete(id: number): Promise<ApiResponse<any>> {
|
|
|
|
|
|
return del<ApiResponse<any>>(`/v1/devices/${id}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-07-03 18:09:07 +08:00
|
|
|
|
// 重启设备
|
|
|
|
|
|
async restart(id: string): Promise<ApiResponse<void>> {
|
|
|
|
|
|
return post<ApiResponse<void>>(`${API_BASE}/${id}/restart`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 解绑设备
|
|
|
|
|
|
async unbind(id: string): Promise<ApiResponse<void>> {
|
|
|
|
|
|
return post<ApiResponse<void>>(`${API_BASE}/${id}/unbind`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备统计数据
|
|
|
|
|
|
async getStats(id: string): Promise<ApiResponse<DeviceStats>> {
|
|
|
|
|
|
return get<ApiResponse<DeviceStats>>(`${API_BASE}/${id}/stats`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取设备任务记录
|
|
|
|
|
|
async getTaskRecords(id: string, page = 1, pageSize = 20): Promise<ApiResponse<PaginatedResponse<DeviceTaskRecord>>> {
|
|
|
|
|
|
return get<ApiResponse<PaginatedResponse<DeviceTaskRecord>>>(`${API_BASE}/${id}/tasks?page=${page}&pageSize=${pageSize}`);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 批量更新设备标签
|
|
|
|
|
|
async updateTags(ids: string[], tags: string[]): Promise<ApiResponse<void>> {
|
|
|
|
|
|
return post<ApiResponse<void>>(`${API_BASE}/tags`, { deviceIds: ids, tags });
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 批量导出设备数据
|
|
|
|
|
|
async exportDevices(ids: string[]): Promise<Blob> {
|
|
|
|
|
|
const response = await fetch(`${process.env.REACT_APP_API_BASE || 'http://localhost:3000/api'}${API_BASE}/export`, {
|
|
|
|
|
|
method: "POST",
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
"Content-Type": "application/json",
|
|
|
|
|
|
},
|
|
|
|
|
|
body: JSON.stringify({ deviceIds: ids }),
|
|
|
|
|
|
});
|
|
|
|
|
|
return response.blob();
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 检查设备在线状态
|
|
|
|
|
|
async checkStatus(ids: string[]): Promise<ApiResponse<Record<string, DeviceStatus>>> {
|
|
|
|
|
|
return post<ApiResponse<Record<string, DeviceStatus>>>(`${API_BASE}/status`, { deviceIds: ids });
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|