zcloud_gbs_edgeguard/边缘人脸识别区域安全设计方案.md

473 lines
27 KiB
Markdown
Raw Normal View History

2026-09-02 13:34:04 +08:00
# 边缘人脸识别区域安全设计方案
## 1. 当前需求结论
综合平台维护企业下面的区域树,并向第三方提供区域查询接口。
当前功能范围:
- 一个企业可以维护多棵或多层区域树。
- 区域支持新增同级区域、新增下级区域、修改和删除。
- 区域包含区域名称、负责人和电子围栏坐标。
- 当前原型要求电子围栏由 4 个有顺序的坐标点组成。
- 摄像头主数据来自第三方接口,综合平台不维护摄像头主档。
- 综合平台保存区域与摄像头的绑定关系。
- 每个已绑定摄像头可以设置负责人。
- 选择区域后,右侧列表展示该区域直接绑定的摄像头。
- 人员、公司、部门、人脸和人员区域准入关系不属于本功能维护范围。
- 综合平台不主动推送,由第三方主动调用区域开放接口。
## 2. 领域边界
```text
企业(外部公共数据)
└── 区域(综合平台维护,树结构)
├── 下级区域
└── 摄像头绑定(摄像头主数据来自第三方)
└── 摄像头负责人
```
### 2.1 企业
- 企业作为区域树的根节点和数据隔离维度。
- 企业主数据不在区域表中重复维护,只保存 `corp_id`
- 页面树由“企业虚拟根节点 + 本地区域节点”组合生成。
- 企业名称通过公共信息翻译或企业公共接口获取,不作为区域的权威数据保存。
### 2.2 区域
区域是本功能的聚合根,负责:
- 企业归属。
- 父子层级。
- 区域名称。
- 区域负责人。
- 电子围栏坐标。
- 区域状态和逻辑删除。
### 2.3 摄像头
- 摄像头名称、所属单位、类型、等级、主管部门、在线状态等来自第三方接口。
- 本系统不成为摄像头主数据的权威维护方,但会冗余列表展示和查询所需的摄像头缓存字段。
- 本系统保存第三方摄像头唯一标识、来源系统、区域绑定、摄像头负责人,以及名称、所属单位、类型、等级、主管部门、在线状态等快照。
- 绑定摄像头时写入快照;后续可按查询或定时策略刷新,第三方数据始终是权威来源。
- 第三方临时不可用时可以展示本地最近快照,并显示最近同步时间;不得把缓存快照作为修改第三方摄像头的依据。
## 3. 关键设计决策
### 3.1 公司节点不进入区域表
区域表只存真实区域。顶级区域的 `parent_id` 为空或为 `0`,通过 `corp_id` 归属企业。这样不会把外部企业主数据和本地区域数据混为一种实体。
页面树建议返回统一节点结构:
```text
nodeType = CORP 企业虚拟节点
nodeType = REGION 本地区域节点
```
### 3.2 区域树规则
- 同一企业下,同一父节点中的区域名称建议唯一。
- 子区域必须与父区域属于同一企业、租户和单位。
- 禁止把节点移动到自身或自己的子孙节点下面。
- 删除包含子区域的节点时,默认禁止删除,先迁移或删除子节点。
- 删除仍绑定摄像头的区域时,默认禁止删除,先解除或迁移绑定。
- 查询区域树时使用批量查询后在内存组树,禁止递归逐节点查询数据库。
是否允许跨层级移动区域、区域最大层级和区域排序规则仍需产品确认。
### 3.3 四点电子围栏
建议数据库保存一个有顺序的坐标数组,而不是设计 `point1_x``point4_y` 八个固定字段:
```json
[
{"seq": 1, "longitude": 113.123456, "latitude": 23.123456},
{"seq": 2, "longitude": 113.223456, "latitude": 23.123456},
{"seq": 3, "longitude": 113.223456, "latitude": 23.223456},
{"seq": 4, "longitude": 113.123456, "latitude": 23.223456}
]
```
一期保存时强制校验:
- 必须恰好 4 个点。
- 点序号不可重复,按顺时针或逆时针排序。
- 经度范围 `[-180, 180]`,纬度范围 `[-90, 90]`
- 相邻点和首尾点不能重复。
- 四条边不能自相交。
- 围栏面积不能为 0。
- 必须明确坐标系,例如 WGS84、GCJ-02 或 BD-09坐标系作为字段保存禁止默认猜测。
使用 JSON 可以满足当前 4 点要求,同时允许未来扩展为多边形。如果后续需要“判断坐标是否在区域内”等空间检索,再增加 MySQL `POLYGON` 空间字段和空间索引。
### 3.4 负责人
- 区域负责人保存用户 ID不重复保存用户主档。
- 摄像头负责人保存在区域摄像头绑定记录中。
- 页面通过 `TranslateField` 批量翻译负责人姓名,禁止循环逐人查询。
- 原型中负责人是必填单选;是否允许多个负责人,需要产品确认。
- 人员被停用或删除后,负责人绑定如何处理,需要明确校验或提示规则。
### 3.5 摄像头绑定
- 选择摄像头时调用第三方接口获取可选摄像头列表。
- 保存时只提交选中的第三方摄像头 ID本系统必须再次校验摄像头存在性和调用方数据范围。
- 建议一期约束“一个来源系统中的一个摄像头只能绑定一个区域”。如果业务允许一个摄像头属于多个区域,再取消唯一约束。
- 重复选择已经绑定到当前区域的摄像头应幂等成功。
- 已绑定其他区域时,应返回明确提示,不静默迁移。
- 解绑只删除本地关系,不调用第三方删除摄像头。
2026-09-02 14:23:54 +08:00
- 在线状态等动态字段允许作为列表快照写入绑定表,并记录 `camera_synced_at`;第三方实时结果仍是权威数据,刷新失败时展示最近快照。
2026-09-02 13:34:04 +08:00
## 4. 表结构草案
2026-09-02 14:23:54 +08:00
当前需求确定四张业务表。所有表都包含根目录 `AGENTS.md` 规定的公共字段。MySQL 8.0 DDL 见 `web-infrastructure/src/main/resources/RegionManagementDDL.sql`
2026-09-02 13:34:04 +08:00
2026-09-02 14:23:54 +08:00
### 4.1 区域表 `edgeguard_region`
2026-09-02 13:34:04 +08:00
| 字段 | 类型建议 | 说明 |
| --- | --- | --- |
| `id` | `bigint` | 区域主键 |
| `region_code` | `varchar(64)` | 区域编码,建议提供稳定的对外标识 |
| `region_name` | `varchar(100)` | 区域名称 |
| `corp_id` | `bigint` | 所属企业 ID |
| `parent_id` | `bigint` | 父区域 ID顶级区域为空或 0 |
| `tree_path` | `varchar(1000)` | 祖先路径,用于子树查询和防循环 |
| `tree_level` | `int` | 区域层级,企业下顶级区域从 1 开始 |
| `sort_no` | `int` | 同级排序 |
| `leader_user_id` | `bigint` | 区域负责人用户 ID |
| `coordinate_system` | `varchar(32)` | 坐标系,例如 GCJ02 |
| `fence_points` | `json` | 有序电子围栏坐标点,一期固定 4 点 |
| `region_status` | `varchar(32)` | `ENABLED/DISABLED` |
建议索引:
- 唯一索引:`region_code`,是否叠加租户维度按编码生成规则确定。
- 同级名称唯一:`tenant_id + corp_id + parent_id + region_name + delete_enum`。由于可空字段会影响 MySQL 唯一约束,正式 DDL 需采用非空默认值或规范化唯一键。
- 树查询索引:`tenant_id + corp_id + parent_id + delete_enum + sort_no`。
- 负责人查询索引:`leader_user_id`,仅在存在反向查询需求时增加。
2026-09-02 14:23:54 +08:00
### 4.2 区域摄像头绑定表 `edgeguard_region_camera`
2026-09-02 13:34:04 +08:00
| 字段 | 类型建议 | 说明 |
| --- | --- | --- |
| `id` | `bigint` | 主键 |
| `region_id` | `bigint` | 本地区域 ID |
| `camera_source` | `varchar(64)` | 摄像头来源系统编码 |
| `camera_id` | `varchar(128)` | 第三方摄像头唯一标识 |
| `camera_name` | `varchar(255)` | 摄像头名称缓存 |
| `video_type` | `varchar(64)` | 视频类型快照 |
| `camera_unit_id/name` | `bigint/varchar` | 所属单位及名称快照 |
| `camera_dept_id/name` | `bigint/varchar` | 主管部门及名称快照 |
| `video_level` | `varchar(64)` | 视频等级快照 |
| `video_address` | `varchar(1000)` | 视频地址快照 |
| `is_online` | `int` | 在线状态快照 |
| `device_model` | `varchar(255)` | 规格型号快照 |
| `device_gb_number` | `varchar(128)` | 设备国标编号快照 |
| `camera_number` | `varchar(128)` | 摄像头编号快照 |
| `longitude/latitude` | `varchar(64)` | 经纬度快照 |
2026-09-02 13:34:04 +08:00
| `leader_user_id` | `bigint` | 摄像头负责人用户 ID |
| `bind_status` | `varchar(32)` | `BOUND/UNBOUND`,若逻辑删除足够可不单设 |
| `bound_time` | `datetime` | 绑定时间 |
建议索引:
- 唯一索引:`tenant_id + camera_source + camera_id`,落实一个摄像头只绑定一个区域。
- 区域列表索引:`tenant_id + region_id + delete_enum`。
- 摄像头负责人索引:`leader_user_id`,仅在需要按负责人查询时增加。
当前只缓存已绑定摄像头的 `FixedCameraCO` 业务展示字段,权威主数据仍由视频巡检服务维护。如果后续要求缓存全部摄像头或一个摄像头允许绑定多个区域,再拆分为“摄像头缓存表 + 区域摄像头关系表”。
2026-09-02 13:34:04 +08:00
## 5. 页面功能拆解
### 5.1 区域树
- 按当前用户数据权限加载企业。
- 批量查询企业下全部区域并组装树。
- 支持新增顶级区域、同级区域和下级区域。
- 支持修改和删除区域。
- 选中区域后显示企业/区域面包屑。
### 5.2 新增或修改区域
入参建议:
- `parentId`:新增顶级区域时为空。
- `corpId`:必填。
- `regionName`:必填。
- `leaderUserId`:按当前原型必填。
- `coordinateSystem`:必填。
- `fencePoints`:必填且恰好 4 点。
- `sortNo`:可选。
### 5.3 选择摄像头
- 显示当前区域路径。
- 调用第三方接口分页查询摄像头。
- 支持视频名称、等级、在线状态等第三方支持的条件。
- 已绑定当前区域的摄像头默认勾选。
- 已绑定其他区域的摄像头应禁选或明确标识。
- 确认后计算新增绑定和解除绑定差异,在一个本地事务中保存。
### 5.4 区域摄像头列表
列表字段来自两部分:
| 字段 | 来源 |
| --- | --- |
| 视频名称、所属单位、类型、等级、主管部门、在线状态 | 本地缓存字段展示,第三方接口负责刷新 |
| 所属区域、摄像头负责人、绑定时间 | 本地绑定字段 |
列表操作:设置摄像头负责人、查看第三方摄像头详情、解除绑定。原型中的“删除”建议在业务文案中改为“解绑”,避免误解为删除第三方摄像头。
## 6. 接口建议
### 6.1 内部区域管理接口
| 能力 | 建议接口语义 |
| --- | --- |
| 区域树 | 按数据权限返回企业虚拟根和区域树 |
| 新增区域 | 新增顶级或下级区域 |
| 修改区域 | 修改名称、负责人、围栏和排序 |
| 删除区域 | 校验子区域和摄像头绑定后逻辑删除 |
| 区域摄像头分页 | 查询选中区域直接绑定的摄像头 |
2026-09-02 16:26:31 +08:00
| 可选摄像头分页 | 前端直接调用视频巡检固定摄像头分页 |
2026-09-02 13:34:04 +08:00
| 保存摄像头绑定 | 批量计算并保存绑定差异 |
| 设置摄像头负责人 | 更新绑定记录负责人 |
| 解除摄像头绑定 | 逻辑删除本地绑定关系 |
## 7. DDD 落位
| 模块 | 内容 |
| --- | --- |
| `web-client` | Region、RegionCamera 的 Cmd、Qry、Co 和服务接口 |
2026-09-02 16:26:31 +08:00
| `web-adapter` | 区域管理 Controller |
2026-09-02 13:34:04 +08:00
| `web-app` | 区域增删改查、组树、摄像头绑定和负责人设置执行器 |
| `web-domain` | `RegionE`、`RegionCameraBindingE`、树及围栏规则、Gateway |
2026-09-02 16:26:31 +08:00
| `web-infrastructure` | DO、Mapper、Repository、GatewayImpl |
2026-09-02 13:34:04 +08:00
| `start` | RPC Client 和配置装配;当前不需要推送定时任务 |
2026-09-02 16:26:31 +08:00
可选摄像头由前端调用视频巡检服务查询;本服务只接收选中结果并保存区域绑定及摄像头展示快照。
2026-09-02 13:34:04 +08:00
## 8. 待确认问题
### 区域
- 是否需要区域编码,对外唯一标识采用 ID 还是编码?
- 顶级区域 `parent_id` 使用 `NULL` 还是 `0`
- 区域最大层级是多少,是否允许移动节点?
- 区域负责人是否只能有一个?
- 坐标使用哪种坐标系?四点是否永远固定,还是后续允许任意多边形?
- 是否要求判断摄像头坐标或告警坐标是否处于区域内?
- 区域是否需要启用/停用状态?
### 摄像头
- 摄像头第三方接口的系统、协议和 Common Facade 是什么?
- 摄像头唯一主键是什么,是否跨企业唯一?
- 是否支持分页及原型中的名称、等级、在线状态筛选?
- 一个摄像头是否只能绑定一个区域?
- 查询某区域时只展示直接绑定摄像头,还是包含所有子区域摄像头?
- 解绑后负责人是否随绑定记录一起失效?
- 第三方不可用时页面是报错,还是允许展示本地快照?
### 开放接口
- 第三方只查询区域,还是同时查询区域摄像头绑定?
- 需要全量分页、区域树还是更新时间增量查询?
- 是否需要返回逻辑删除区域和已解除绑定关系?
- 鉴权、签名、IP 白名单及租户范围如何确定?
## 9. 当前不开发内容
- 人员、企业、部门、岗位和人脸主数据维护。
- 人员与区域准入关系。
- 摄像头主数据维护和删除。
- 主动推送、推送任务、回执和失败重试。
上一版人员推送 DDL 已删除。当前 `RegionManagementDDL.sql` 是根据原型形成的区域表草案;坐标系、摄像头唯一性和区域删除规则确认后,再作为正式迁移脚本执行。
2026-09-02 16:26:31 +08:00
## 10. 报警处置与统计
2026-09-02 13:34:04 +08:00
2026-09-02 16:26:31 +08:00
报警数据如何进入本系统归入后续“对外接口”统一设计,本章只描述内部查询、处置和统计逻辑。
2026-09-02 13:34:04 +08:00
2026-09-02 16:26:31 +08:00
### 10.1 处置状态机
2026-09-02 13:34:04 +08:00
```text
PENDING未处置
├─ 误报=是 -> DISPOSED
└─ 误报=否
├─ 隐患=否 -> 填写结果 -> DISPOSED
└─ 隐患=是 -> 创建隐患 -> DISPOSED
```
- 误报直接闭环,不进入隐患流程。
- 非误报必须选择是否隐患。
- 非隐患必须填写处置结果,提交后闭环。
- 隐患调用 `ZcloudHiddenFacade.aiHiddenAndSave(HiddenAddCmd)`,以报警编号作为 `foreignKey`
- 隐患流程和进度以隐患服务为准,本地不再维护报警闭环状态。
- 当前报警不经过派单、转办或审批,每条报警只提交一次处置结论;处置人、处置时间及公共更新审计字段用于留痕。
2026-09-02 16:26:31 +08:00
### 10.2 数据表
2026-09-02 13:34:04 +08:00
区域、摄像头绑定、报警和处置统一维护在 `web-infrastructure/src/main/resources/RegionManagementDDL.sql`,报警部分包含:
| 表 | 用途 |
| --- | --- |
| `edgeguard_alarm` | 报警事实、区域/摄像头快照、当前状态、统计维度 |
| `edgeguard_alarm_disposal` | 是否误报、是否隐患、直接处置结果及关联隐患 ID |
Common 已有 `ZcloudHiddenFacade``aiHiddenAndSave`、`listByForeignKey` 和 `queryHiddenCheckStatus` 等能力。本系统不复制隐患主表,也不缓存隐患状态、级别和进度。创建成功后只在报警处置表保存 `hidden_id`;详情页根据该 ID 调用隐患服务查询实时详情。
2026-09-02 16:26:31 +08:00
### 10.3 统计
2026-09-02 13:34:04 +08:00
一期直接聚合报警主表,不建统计结果表:
- 股份端按 `corp_id` 统计各分公司报警总数、未处置和已处置。
- 分公司端按 `region_id` 统计各区域报警总数、未处置和已处置。
- 可统计误报数、隐患数和非隐患处置数。
报警保存发生时的企业、区域和摄像头快照,后续改名或移动不影响历史台账。数据量较大后再增加按日汇总表。
2026-09-02 16:26:31 +08:00
### 10.4 待确认
2026-09-02 13:34:04 +08:00
- 处置结果字典。
- 误报是否仍需填写处置原因。
- 隐患级别、确认人、整改人和期限由谁填写。
- 是否允许修改处置结论、重新打开报警及是否需要审批。
2026-09-02 16:26:31 +08:00
### 10.5 报警查看权限升级
2026-09-02 13:34:04 +08:00
当前需求只控制报警列表的可见范围,不需要增加业务表:
- 摄像头负责人从报警入库开始即可查看该摄像头产生的报警。
- 报警保持 `PENDING` 且超过配置的升级时长后,所属区域负责人也可以查看。
- 当前升级时长为 10 分钟,必须配置化,禁止硬编码在查询 SQL 中。
- 超时基准使用综合平台 `received_time`,不使用第三方 `alarm_time`,避免延迟推送导致报警刚入库就被升级。
- 报警处置后进入台账的查看范围按页面数据权限确定,不再依赖 10 分钟规则。
查询逻辑:
```text
当前用户是摄像头负责人
OR
当前用户是区域负责人
AND disposal_status = PENDING
AND received_time <= 当前时间 - 配置分钟数
```
摄像头负责人从 `edgeguard_region_camera.leader_user_id` 获取,区域负责人从 `edgeguard_region.leader_user_id` 获取。负责人发生变更后按当前负责人权限查询;如果未来要求报警产生时锁定负责人,再在报警表增加负责人快照字段。
本规则只表示“能够在列表看到”,不表示系统主动通知。若后续要求短信、消息中心或待办提醒,并需要记录发送结果和防止重复通知,再设计通知记录或升级标记。
2026-09-02 14:23:54 +08:00
## 11. 待开发接口总清单
### 11.1 接口设计约定
- 页面内部接口统一放在 `/edgeguard/**`,使用登录态、接口权限和数据权限。
- 第三方开放接口统一放在 `/open/edgeguard/**`,使用独立的应用鉴权、签名、防重放和租户/企业授权范围。
- 新增使用 `POST`,修改使用 `PUT`,删除或解绑使用 `DELETE`,详情使用 `GET`,复杂分页查询使用 `POST`
- 新增、修改入参使用 `XxxCmd`,分页查询使用 `XxxPageQry`,返回对象使用 `XxxCo`
- 单对象返回 `SingleResponse<T>`,分页返回 `PageResponse<T>`,集合返回 `MultiResponse<T>`,无数据操作返回 `Response`
- 下表中的权限编码先使用“待分配”标识,等菜单和权限资源建立后再填写真实值,禁止复制示例权限编码。
- `corpId`、`tenantId`、`orgId` 等数据范围不得只信任前端入参,必须结合当前用户上下文和数据权限校验。
- 接口路径是当前开发基线如果项目统一网关会自动增加服务前缀Controller 中不重复拼接网关前缀。
### 11.2 区域管理接口
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
| `REGION-01` | `GET /edgeguard/regions/tree` | 加载企业虚拟根及区域树 | 可选 `corpId` | `MultiResponse<RegionTreeNodeCo>` | 企业来自公共服务;区域一次批量查询后内存组树;按当前用户企业数据权限过滤 | P0 |
| `REGION-02` | `GET /edgeguard/regions/{id}` | 查询区域详情 | `id` | `SingleResponse<RegionCo>` | 校验数据权限;负责人姓名使用公共翻译;围栏返回有序点集合 | P0 |
| `REGION-03` | `POST /edgeguard/regions` | 新增顶级或下级区域 | `RegionAddCmd` | `SingleResponse<Long>` | 校验父子企业一致、同级名称、负责人、坐标系及四点围栏;生成 `regionCode/treePath/treeLevel` | P0 |
| `REGION-04` | `PUT /edgeguard/regions/{id}` | 修改区域 | `id + RegionUpdateCmd` | `Response` | 一期不提供父节点迁移;修改名称、负责人、围栏、排序和状态;使用版本号防并发覆盖 | P0 |
| `REGION-05` | `DELETE /edgeguard/regions/{id}` | 删除区域 | `id` | `Response` | 存在子区域或有效摄像头绑定时禁止删除;使用逻辑删除 | P0 |
`RegionAddCmd` 建议字段:
- `corpId`、`parentId`、`regionName`、`leaderUserId`。
- `coordinateSystem`、`List<FencePointCmd> fencePoints`。
- `sortNo`、`remarks`。
`RegionUpdateCmd` 在上述可修改字段外增加 `id/version/regionStatus`。`regionCode`、`corpId`、`treePath` 和 `treeLevel` 不允许由前端直接修改。
### 11.3 区域摄像头接口
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
| `CAMERA-01` | `POST /edgeguard/region-cameras/page` | 查询区域已绑定摄像头 | `RegionCameraPageQry` | `PageResponse<RegionCameraCo>` | 必须传 `regionId`;从本地快照分页;支持名称、等级和在线状态筛选;负责人批量翻译 | P0 |
| `CAMERA-02` | `POST /videopatrol/fixedCamera/list` | 查询可选摄像头 | 视频巡检 `FixedCameraPageQry` | 视频巡检 `FixedCameraCO` 分页 | 前端直接调用视频巡检服务,本服务不重复提供接口;`pageSize` 不使用 1000 | P0外部前端依赖 |
| `CAMERA-03` | `PUT /edgeguard/regions/{regionId}/cameras` | 保存区域摄像头选择结果 | `regionId + RegionCameraBindCmd` | `Response` | 入参字段与 `FixedCameraCO` 对齐;校验所属企业;保存展示快照并计算绑定差异;重复提交幂等 | P0 |
2026-09-02 14:23:54 +08:00
| `CAMERA-04` | `PUT /edgeguard/region-cameras/{id}/leader` | 设置摄像头负责人 | `id + CameraLeaderUpdateCmd` | `Response` | 负责人必须为有效用户;只修改当前有效绑定 | P0 |
| `CAMERA-05` | `DELETE /edgeguard/region-cameras/{id}` | 解除摄像头绑定 | `id` | `Response` | 只解除本地关系,不删除第三方摄像头;写入 `UNBOUND/unboundTime` | P0 |
| `CAMERA-06` | `GET /edgeguard/region-cameras/{id}` | 查看摄像头详情 | `id` | `SingleResponse<RegionCameraCo>` | 优先查询第三方实时详情;失败时返回本地快照并明确 `snapshot=true` | P1依赖第三方契约 |
`RegionCameraPageQry` 至少包含 `regionId`,可选 `name`。可选摄像头分页参数以视频巡检服务的 `FixedCameraPageQry` 为准。
2026-09-02 14:23:54 +08:00
2026-09-02 16:26:31 +08:00
### 11.4 报警查询与处置接口
2026-09-02 14:23:54 +08:00
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
| `ALARM-02` | `POST /edgeguard/alarms/page` | 报警处置列表/台账分页 | `AlarmPageQry` | `PageResponse<AlarmCo>` | 未处置列表执行负责人和10分钟升级规则台账按页面数据权限支持编号、区域、状态、时间筛选 | P0 |
| `ALARM-03` | `GET /edgeguard/alarms/{id}` | 查询报警及处置详情 | `id` | `SingleResponse<AlarmDetailCo>` | 返回报警、处置结论和 `hiddenId`;不复制隐患详情,前端按 ID 调隐患服务 | P0 |
| `ALARM-04` | `POST /edgeguard/alarms/{id}/disposal` | 提交报警处置 | `id + AlarmDisposeCmd` | `Response` | 一条报警只处置一次;校验误报/隐患条件;保存处置记录并将报警改为 `DISPOSED` | P0 |
`AlarmDisposeCmd` 建议字段:
- `isFalseAlarm`:必填。
- `isHiddenHazard`:非误报时必填。
- `disposalResultCode/disposalResultName/disposalDescription`:非误报且非隐患时按业务规则必填。
- 创建隐患所需字段暂不固化到本文,确认 `HiddenAddCmd` 必填项后补充;禁止由 Controller 直接调用隐患 Facade。
2026-09-02 16:26:31 +08:00
`ALARM-04` 在选择“是隐患”时负责调用隐患服务创建隐患并保存 `hiddenId`;创建失败则接口返回失败,不保存本地处置结果,由前端重新提交。远程调用不能放在持有数据库锁的长事务中,并以报警编号作为 `foreignKey` 保证重复提交幂等。
2026-09-02 14:23:54 +08:00
### 11.6 报警统计接口
统计接口属于已确认开发范围,依据原型 `E:\job_worde\人脸识别原型\人脸识别原型\人脸识别综合原型.html` 实现,不再作为待确认功能:
- 分公司端按当前分公司下的区域分页展示:报警区域、报警总数、未处置、已处置、查看。
- 股份端按分公司分页展示:分公司名称、报警总数、未处置、已处置。
- 股份端点击分公司名称下钻到该分公司的区域统计。
- 区域统计点击“查看”进入统计报警台账,并自动携带公司和区域条件。
- 统计报警台账展示报警编号、报警区域、报警摄像头、报警时间、处置状态和查看操作;查询复用 `ALARM-02`
- 没有报警的已维护区域也要展示为 0不能只从报警表 `GROUP BY` 后返回有数据的区域;区域维度应以有效区域表为主表左连接报警聚合结果。
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
| `STAT-01` | `POST /edgeguard/alarm-statistics/corporations` | 股份端按分公司统计 | `AlarmCorpStatisticQry` | `PageResponse<AlarmCorpStatisticCo>` | 按 `corpId` 聚合总数、未处置、已处置;公司名称来自公共服务;受股份端数据权限控制 | P0 |
| `STAT-02` | `POST /edgeguard/alarm-statistics/regions` | 分公司端及股份下钻按区域统计 | `AlarmRegionStatisticQry` | `PageResponse<AlarmRegionStatisticCo>` | 必须传或从权限确定 `corpId`以有效区域为基础分页并关联报警聚合包含报警数为0的区域 | P0 |
统计页面点击公司或区域后的明细复用 `ALARM-02`,携带 `corpId/regionId/disposalStatus`,不再增加重复的台账查询接口。
### 11.7 暂不单独开发的接口
- 企业、部门、岗位、用户主数据接口:统一调用公共服务或使用 `TranslateField`,本项目不维护。
- 摄像头新增、修改、删除接口:摄像头主数据归第三方,本项目只查询和绑定。
- 隐患详情、进度和整改接口:复用隐患服务,本项目只保存 `hiddenId`
- 报警附件接口:当前只有单张截图 URL直接保存在报警主表。
- 报警派单、转办、操作轨迹接口:当前报警直接处置,没有派单流程。
- 人员、人脸和人员区域准入接口:不在当前项目范围。
2026-09-02 16:26:31 +08:00
- 报警接收、主动推送、回执和失败重试接口:统一归入后续对外接口设计。
2026-09-02 14:23:54 +08:00
### 11.8 外部依赖契约
| 依赖 | 使用接口 | 当前状态 | 开发前需要确认 |
| --- | --- | --- | --- |
| 企业/用户公共服务 | `REGION-01~04`、`CAMERA-04`、统计展示 | 已有公共能力 | 企业数据权限来源、负责人有效性校验和批量翻译字段 |
| 视频巡检固定摄像头分页 | `CAMERA-02` | 已确认 | 前端调用 `POST /videopatrol/fixedCamera/list`,普通分页时返回 `FixedCameraCO` |
2026-09-02 14:23:54 +08:00
| 隐患服务 `ZcloudHiddenFacade` | `ALARM-04/05` | Common 已有能力 | `HiddenAddCmd` 必填字段、返回的隐患 ID、幂等行为、失败错误码 |
### 11.9 建议实现顺序与状态
接口状态统一使用:`TODO`、`DOING`、`DONE`、`BLOCKED`。每完成一个接口,需要同时更新本文状态、请求/响应示例、权限编码和异常码。
| 开发批次 | 接口 | 当前状态 | 原因 |
| --- | --- | --- | --- |
| 第1批区域闭环 | `REGION-01~05` | `DOING` | 分层实现、校验、测试及编译已完成;待菜单资源分配真实权限编码后转 `DONE` |
| 第2批摄像头绑定 | `CAMERA-01~05` | `DOING` | 前端复用视频巡检固定摄像头分页;本服务已完成快照保存、负责人、解绑及绑定差异逻辑;待配置菜单权限编码 |
2026-09-02 16:26:31 +08:00
| 第3批报警与统计 | `ALARM-02~04`、`STAT-01~02` | `TODO` | 保留内部查询、处置和统计;报警接收归入后续对外接口统一设计 |
| 第4批增强能力 | `CAMERA-06` | `TODO` | 摄像头实时详情降级 |
2026-09-02 14:23:54 +08:00
推荐从 `REGION-01` 区域树接口开始逐个实现。每个接口的完成标准包括Client 契约、Controller、App 执行器、Domain 规则、Infrastructure 查询/持久化、权限与数据范围、参数校验、异常码、单元测试或集成测试,以及 Maven 编译通过。