import type { PageParam, PageResult } from '@vben/request'; import { requestClient } from '#/api/request'; export namespace IotSubsystemApi { /** 子系统 */ export interface Subsystem { id?: number; // 子系统编号 name: string; // 子系统名称 code: string; // 子系统编码(小写+下划线,如 security / energy / clean) description?: string; // 子系统描述 icon?: string; // 子系统图标 URL 或 iconify 名称 status: number; // 状态(0=禁用 1=启用) sort?: number; // 排序 projectId?: number; // 所属项目 ID(预留字段,当前版本不启用) deviceCount?: number; // 设备数量(来自 /iot/subsystem/device-count 聚合,非实时 count) createTime?: Date; // 创建时间 updateTime?: Date; // 更新时间 } /** 子系统分页查询参数 */ export interface SubsystemPageParam extends PageParam { keyword?: string; // 关键字(名称/编码模糊搜索) status?: number; // 状态过滤 } /** 子系统精简信息(下拉列表) */ export interface SubsystemSimple { id: number; name: string; code: string; } /** 设备统计 map 中单条数据 */ export interface SubsystemDeviceCount { subsystemId: number; total: number; online: number; alarm: number; } /** 批量绑定子系统请求体 */ export interface BatchBindSubsystemReqVO { deviceIds: number[]; // 设备编号列表(每批 ≤ 100) subsystemId: number; // 目标子系统 ID } /** 单设备绑定/解绑子系统请求体 */ export interface BindSubsystemReqVO { deviceId: number; subsystemId: null | number; // null = 解绑(移除归属) } } // ─── 子系统 CRUD ──────────────────────────────────────────────────────────── /** 创建子系统 */ export function createSubsystem(data: IotSubsystemApi.Subsystem) { return requestClient.post('/iot/subsystem/create', data); } /** 更新子系统 */ export function updateSubsystem(data: IotSubsystemApi.Subsystem) { return requestClient.put('/iot/subsystem/update', data); } /** * 删除子系统 * 后端会校验子系统下是否仍有设备,有则返回业务异常(前端 deleteCount 检查后禁用按钮) */ export function deleteSubsystem(id: number) { return requestClient.delete(`/iot/subsystem/delete?id=${id}`); } /** 获取子系统详情 */ export function getSubsystem(id: number) { return requestClient.get( `/iot/subsystem/get?id=${id}`, ); } /** 子系统分页查询 */ export function getSubsystemPage(params: IotSubsystemApi.SubsystemPageParam) { return requestClient.get>( '/iot/subsystem/page', { params }, ); } /** * 子系统精简列表(下拉) * 注意:⚠️ [评审 A7] 此接口已加权限,403 由请求拦截器统一处理 */ export function getSubsystemSimpleList() { return requestClient.get( '/iot/subsystem/simple-list', ); } // ─── 设备统计(B10 需提供)──────────────────────────────────────────────────── /** * 各子系统设备统计(Redis 聚合) * ⚠️ [评审 A6] 统计数据来自 Redis 缓存,不做实时 count * B10 需要实现:GET /iot/subsystem/device-count * 返回格式:{ [subsystemId]: { total, online, alarm } } */ export function getSubsystemDeviceCount() { return requestClient.get< Record >('/iot/subsystem/device-count'); } // ─── 设备归属操作(B11 需提供)─────────────────────────────────────────────── /** * 批量绑定设备到子系统 * ⚠️ 每批 ≤ 100 台,调用方需自行分批 * B11 需要实现:PUT /iot/device/batchBindSubsystem */ export function batchBindSubsystem( data: IotSubsystemApi.BatchBindSubsystemReqVO, ) { return requestClient.put('/iot/device/batchBindSubsystem', data); } /** * 单设备解绑子系统(移除归属) * B11 需要实现:PUT /iot/device/bindSubsystem(subsystemId=null 表示解绑) */ export function unbindDeviceSubsystem(deviceId: number) { return requestClient.put('/iot/device/bindSubsystem', { deviceId, subsystemId: null, } satisfies IotSubsystemApi.BindSubsystemReqVO); }