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

473 lines
27 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 边缘人脸识别区域安全设计方案
## 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本系统必须再次校验摄像头存在性和调用方数据范围。
- 建议一期约束“一个来源系统中的一个摄像头只能绑定一个区域”。如果业务允许一个摄像头属于多个区域,再取消唯一约束。
- 重复选择已经绑定到当前区域的摄像头应幂等成功。
- 已绑定其他区域时,应返回明确提示,不静默迁移。
- 解绑只删除本地关系,不调用第三方删除摄像头。
- 在线状态等动态字段允许作为列表快照写入绑定表,并记录 `camera_synced_at`;第三方实时结果仍是权威数据,刷新失败时展示最近快照。
## 4. 表结构草案
当前需求确定四张业务表。所有表都包含根目录 `AGENTS.md` 规定的公共字段。MySQL 8.0 DDL 见 `web-infrastructure/src/main/resources/RegionManagementDDL.sql`
### 4.1 区域表 `edgeguard_region`
| 字段 | 类型建议 | 说明 |
| --- | --- | --- |
| `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`,仅在存在反向查询需求时增加。
### 4.2 区域摄像头绑定表 `edgeguard_region_camera`
| 字段 | 类型建议 | 说明 |
| --- | --- | --- |
| `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)` | 经纬度快照 |
| `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` 业务展示字段,权威主数据仍由视频巡检服务维护。如果后续要求缓存全部摄像头或一个摄像头允许绑定多个区域,再拆分为“摄像头缓存表 + 区域摄像头关系表”。
## 5. 页面功能拆解
### 5.1 区域树
- 按当前用户数据权限加载企业。
- 批量查询企业下全部区域并组装树。
- 支持新增顶级区域、同级区域和下级区域。
- 支持修改和删除区域。
- 选中区域后显示企业/区域面包屑。
### 5.2 新增或修改区域
入参建议:
- `parentId`:新增顶级区域时为空。
- `corpId`:必填。
- `regionName`:必填。
- `leaderUserId`:按当前原型必填。
- `coordinateSystem`:必填。
- `fencePoints`:必填且恰好 4 点。
- `sortNo`:可选。
### 5.3 选择摄像头
- 显示当前区域路径。
- 调用第三方接口分页查询摄像头。
- 支持视频名称、等级、在线状态等第三方支持的条件。
- 已绑定当前区域的摄像头默认勾选。
- 已绑定其他区域的摄像头应禁选或明确标识。
- 确认后计算新增绑定和解除绑定差异,在一个本地事务中保存。
### 5.4 区域摄像头列表
列表字段来自两部分:
| 字段 | 来源 |
| --- | --- |
| 视频名称、所属单位、类型、等级、主管部门、在线状态 | 本地缓存字段展示,第三方接口负责刷新 |
| 所属区域、摄像头负责人、绑定时间 | 本地绑定字段 |
列表操作:设置摄像头负责人、查看第三方摄像头详情、解除绑定。原型中的“删除”建议在业务文案中改为“解绑”,避免误解为删除第三方摄像头。
## 6. 接口建议
### 6.1 内部区域管理接口
| 能力 | 建议接口语义 |
| --- | --- |
| 区域树 | 按数据权限返回企业虚拟根和区域树 |
| 新增区域 | 新增顶级或下级区域 |
| 修改区域 | 修改名称、负责人、围栏和排序 |
| 删除区域 | 校验子区域和摄像头绑定后逻辑删除 |
| 区域摄像头分页 | 查询选中区域直接绑定的摄像头 |
| 可选摄像头分页 | 前端直接调用视频巡检固定摄像头分页 |
| 保存摄像头绑定 | 批量计算并保存绑定差异 |
| 设置摄像头负责人 | 更新绑定记录负责人 |
| 解除摄像头绑定 | 逻辑删除本地绑定关系 |
## 7. DDD 落位
| 模块 | 内容 |
| --- | --- |
| `web-client` | Region、RegionCamera 的 Cmd、Qry、Co 和服务接口 |
| `web-adapter` | 区域管理 Controller |
| `web-app` | 区域增删改查、组树、摄像头绑定和负责人设置执行器 |
| `web-domain` | `RegionE`、`RegionCameraBindingE`、树及围栏规则、Gateway |
| `web-infrastructure` | DO、Mapper、Repository、GatewayImpl |
| `start` | RPC Client 和配置装配;当前不需要推送定时任务 |
可选摄像头由前端调用视频巡检服务查询;本服务只接收选中结果并保存区域绑定及摄像头展示快照。
## 8. 待确认问题
### 区域
- 是否需要区域编码,对外唯一标识采用 ID 还是编码?
- 顶级区域 `parent_id` 使用 `NULL` 还是 `0`
- 区域最大层级是多少,是否允许移动节点?
- 区域负责人是否只能有一个?
- 坐标使用哪种坐标系?四点是否永远固定,还是后续允许任意多边形?
- 是否要求判断摄像头坐标或告警坐标是否处于区域内?
- 区域是否需要启用/停用状态?
### 摄像头
- 摄像头第三方接口的系统、协议和 Common Facade 是什么?
- 摄像头唯一主键是什么,是否跨企业唯一?
- 是否支持分页及原型中的名称、等级、在线状态筛选?
- 一个摄像头是否只能绑定一个区域?
- 查询某区域时只展示直接绑定摄像头,还是包含所有子区域摄像头?
- 解绑后负责人是否随绑定记录一起失效?
- 第三方不可用时页面是报错,还是允许展示本地快照?
### 开放接口
- 第三方只查询区域,还是同时查询区域摄像头绑定?
- 需要全量分页、区域树还是更新时间增量查询?
- 是否需要返回逻辑删除区域和已解除绑定关系?
- 鉴权、签名、IP 白名单及租户范围如何确定?
## 9. 当前不开发内容
- 人员、企业、部门、岗位和人脸主数据维护。
- 人员与区域准入关系。
- 摄像头主数据维护和删除。
- 主动推送、推送任务、回执和失败重试。
上一版人员推送 DDL 已删除。当前 `RegionManagementDDL.sql` 是根据原型形成的区域表草案;坐标系、摄像头唯一性和区域删除规则确认后,再作为正式迁移脚本执行。
## 10. 报警处置与统计
报警数据如何进入本系统归入后续“对外接口”统一设计,本章只描述内部查询、处置和统计逻辑。
### 10.1 处置状态机
```text
PENDING未处置
├─ 误报=是 -> DISPOSED
└─ 误报=否
├─ 隐患=否 -> 填写结果 -> DISPOSED
└─ 隐患=是 -> 创建隐患 -> DISPOSED
```
- 误报直接闭环,不进入隐患流程。
- 非误报必须选择是否隐患。
- 非隐患必须填写处置结果,提交后闭环。
- 隐患调用 `ZcloudHiddenFacade.aiHiddenAndSave(HiddenAddCmd)`,以报警编号作为 `foreignKey`
- 隐患流程和进度以隐患服务为准,本地不再维护报警闭环状态。
- 当前报警不经过派单、转办或审批,每条报警只提交一次处置结论;处置人、处置时间及公共更新审计字段用于留痕。
### 10.2 数据表
区域、摄像头绑定、报警和处置统一维护在 `web-infrastructure/src/main/resources/RegionManagementDDL.sql`,报警部分包含:
| 表 | 用途 |
| --- | --- |
| `edgeguard_alarm` | 报警事实、区域/摄像头快照、当前状态、统计维度 |
| `edgeguard_alarm_disposal` | 是否误报、是否隐患、直接处置结果及关联隐患 ID |
Common 已有 `ZcloudHiddenFacade``aiHiddenAndSave`、`listByForeignKey` 和 `queryHiddenCheckStatus` 等能力。本系统不复制隐患主表,也不缓存隐患状态、级别和进度。创建成功后只在报警处置表保存 `hidden_id`;详情页根据该 ID 调用隐患服务查询实时详情。
### 10.3 统计
一期直接聚合报警主表,不建统计结果表:
- 股份端按 `corp_id` 统计各分公司报警总数、未处置和已处置。
- 分公司端按 `region_id` 统计各区域报警总数、未处置和已处置。
- 可统计误报数、隐患数和非隐患处置数。
报警保存发生时的企业、区域和摄像头快照,后续改名或移动不影响历史台账。数据量较大后再增加按日汇总表。
### 10.4 待确认
- 处置结果字典。
- 误报是否仍需填写处置原因。
- 隐患级别、确认人、整改人和期限由谁填写。
- 是否允许修改处置结论、重新打开报警及是否需要审批。
### 10.5 报警查看权限升级
当前需求只控制报警列表的可见范围,不需要增加业务表:
- 摄像头负责人从报警入库开始即可查看该摄像头产生的报警。
- 报警保持 `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` 获取。负责人发生变更后按当前负责人权限查询;如果未来要求报警产生时锁定负责人,再在报警表增加负责人快照字段。
本规则只表示“能够在列表看到”,不表示系统主动通知。若后续要求短信、消息中心或待办提醒,并需要记录发送结果和防止重复通知,再设计通知记录或升级标记。
## 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 |
| `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` 为准。
### 11.4 报警查询与处置接口
| 编号 | 方法与路径 | 用途 | 主要入参 | 主要返回 | 核心规则 | 优先级 |
| --- | --- | --- | --- | --- | --- | --- |
| `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。
`ALARM-04` 在选择“是隐患”时负责调用隐患服务创建隐患并保存 `hiddenId`;创建失败则接口返回失败,不保存本地处置结果,由前端重新提交。远程调用不能放在持有数据库锁的长事务中,并以报警编号作为 `foreignKey` 保证重复提交幂等。
### 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直接保存在报警主表。
- 报警派单、转办、操作轨迹接口:当前报警直接处置,没有派单流程。
- 人员、人脸和人员区域准入接口:不在当前项目范围。
- 报警接收、主动推送、回执和失败重试接口:统一归入后续对外接口设计。
### 11.8 外部依赖契约
| 依赖 | 使用接口 | 当前状态 | 开发前需要确认 |
| --- | --- | --- | --- |
| 企业/用户公共服务 | `REGION-01~04`、`CAMERA-04`、统计展示 | 已有公共能力 | 企业数据权限来源、负责人有效性校验和批量翻译字段 |
| 视频巡检固定摄像头分页 | `CAMERA-02` | 已确认 | 前端调用 `POST /videopatrol/fixedCamera/list`,普通分页时返回 `FixedCameraCO` |
| 隐患服务 `ZcloudHiddenFacade` | `ALARM-04/05` | Common 已有能力 | `HiddenAddCmd` 必填字段、返回的隐患 ID、幂等行为、失败错误码 |
### 11.9 建议实现顺序与状态
接口状态统一使用:`TODO`、`DOING`、`DONE`、`BLOCKED`。每完成一个接口,需要同时更新本文状态、请求/响应示例、权限编码和异常码。
| 开发批次 | 接口 | 当前状态 | 原因 |
| --- | --- | --- | --- |
| 第1批区域闭环 | `REGION-01~05` | `DOING` | 分层实现、校验、测试及编译已完成;待菜单资源分配真实权限编码后转 `DONE` |
| 第2批摄像头绑定 | `CAMERA-01~05` | `DOING` | 前端复用视频巡检固定摄像头分页;本服务已完成快照保存、负责人、解绑及绑定差异逻辑;待配置菜单权限编码 |
| 第3批报警与统计 | `ALARM-02~04`、`STAT-01~02` | `TODO` | 保留内部查询、处置和统计;报警接收归入后续对外接口统一设计 |
| 第4批增强能力 | `CAMERA-06` | `TODO` | 摄像头实时详情降级 |
推荐从 `REGION-01` 区域树接口开始逐个实现。每个接口的完成标准包括Client 契约、Controller、App 执行器、Domain 规则、Infrastructure 查询/持久化、权限与数据范围、参数校验、异常码、单元测试或集成测试,以及 Maven 编译通过。