# EdgeGuard 第三方开放接口 ## 1. 查询区域及摄像头关系 ```http GET /open/edgeguard/regions?corpId={corpId} ``` `corpId` 非必填:传入时查询指定企业,不传时查询当前调用方租户下全部企业。接口只返回 `ENABLED` 区域,以及区域下 `BOUND` 状态的摄像头和当前有效的授权人员。 区域中的 `users` 仅包含权限状态为 `ACTIVE`、已到生效开始时间、未到有效结束时间且用户仍处于启用状态的人员;已撤销、已过期、未生效或已停用用户均不返回。 摄像头字段来自海康 `/videopatrol/fixedCamera/videoSelectList`: | 开放字段 | 海康字段 | 说明 | | --- | --- | --- | | `cameraId` | `indexCode` | 摄像头唯一编码 | | `cameraName` | `name` | 摄像头名称 | | `cameraRegionName` | `regionName` | 海康平台所属区域名称快照 | | `cameraSource` | 后台固定 | 当前为 `HIKVISION` | `users` 人员字段: | 字段 | 说明 | | --- | --- | | `userId` | 被授权人员用户 ID | | `userName` | 人员姓名 | | `permissionType` | 权限类型:`TEMPORARY`(临时)或 `FIXED`(固定) | | `effectiveStartTime` | 授权生效开始时间,格式 `yyyy-MM-dd HH:mm:ss` | | `effectiveEndTime` | 授权生效结束时间;固定权限为 `null` | | `authorizationSource` | 授权来源:`MANUAL`、`IMPORT` 或 `API` | 响应示例: ```json { "success": true, "data": [{ "regionId": 1001, "regionCode": "8d9d07f4d9db4c49906a7a891474f3af", "regionName": "仓库东区", "corpId": 2001, "parentId": 0, "treePath": "/", "treeLevel": 1, "sortNo": 10, "coordinateSystem": "GCJ02", "fencePoints": [ {"seq": 1, "longitude": 113.1, "latitude": 23.1}, {"seq": 2, "longitude": 113.2, "latitude": 23.1}, {"seq": 3, "longitude": 113.2, "latitude": 23.2}, {"seq": 4, "longitude": 113.1, "latitude": 23.2} ], "regionStatus": "ENABLED", "cameras": [{ "cameraSource": "HIKVISION", "cameraId": "CAMERA-001", "cameraName": "东门摄像头", "cameraRegionName": "海康园区一层" }], "users": [{ "userId": 3001, "userName": "张三", "permissionType": "TEMPORARY", "effectiveStartTime": "2026-09-03 08:00:00", "effectiveEndTime": "2026-09-03 18:00:00", "authorizationSource": "MANUAL" }] }] } ``` ## 2. 接收第三方报警 ```http POST /open/edgeguard/alarms Content-Type: application/json ``` 请求字段: | 字段 | 必填 | 最大长度 | 说明 | | --- | --- | --- | --- | | `alarmNo` | 是 | 128 | 第三方报警唯一编号 | | `sourceSystem` | 是 | 64 | 报警来源系统编码 | | `recognitionResult` | 是 | 100 | 识别结论,例如“已知人员无权限”或“无法匹配的陌生人员” | | `alarmTime` | 是 | - | `yyyy-MM-dd HH:mm:ss`,东八区 | | `regionCode` | 是 | 64 | 区域查询接口返回的稳定编码 | | `cameraSource` | 是 | 64 | 当前海康摄像头传 `HIKVISION` | | `cameraId` | 是 | 128 | 区域查询接口返回的摄像头编码 | | `alarmAddress` | 否 | 500 | 报警位置描述 | | `alarmImageUrl` | 否 | 1000 | 报警截图地址 | | `remarks` | 否 | 255 | 补充说明 | 请求示例: ```json { "alarmNo": "ALARM-20260903-000001", "sourceSystem": "FACE_AI", "recognitionResult": "已知人员无权限", "alarmTime": "2026-09-03 10:30:00", "regionCode": "8d9d07f4d9db4c49906a7a891474f3af", "cameraSource": "HIKVISION", "cameraId": "CAMERA-001", "alarmAddress": "仓库东区入口", "alarmImageUrl": "https://files.example.com/alarm/001.jpg", "remarks": "人员进入限制区域" } ``` 后台使用 `regionCode + cameraSource + cameraId` 校验摄像头确实绑定在该区域,并从本地数据补充企业、区域和摄像头名称快照。`receivedTime` 和 `disposalStatus=PENDING` 由后台生成。 `sourceSystem + alarmNo` 是幂等键。重复推送返回第一次保存的报警,不重复入库: ```json { "success": true, "data": { "alarmId": 5001, "alarmNo": "ALARM-20260903-000001", "receivedTime": "2026-09-03 10:30:02", "duplicate": false } } ``` ## 3. 接入约束 - 两个开放接口都必须携带平台签发的 `token` 请求头。框架认证过滤器解析 token 后把租户信息写入 `AuthContext`,业务接口不接受第三方自行传入的 `tenantId` 作为身份依据。 - 开放接口上线前必须在网关配置第三方应用鉴权、签名、防重放及企业授权范围。 - `corpId` 只作为可选查询条件;不传时按鉴权上下文中的租户范围查询,最终允许访问的企业范围以应用授权为准。 - 第三方报警中的区域和摄像头组合必须来自区域查询接口。 - 报警图片接口只保存 URL,不同步下载图片,URL 中禁止携带永久明文密钥。