gz-oarms/findings.md

237 lines
10 KiB
Markdown
Raw Normal View History

# OARMS 命名规范审查 — 发现记录
## 前置发现
### 全局性问题
#### 1. 前端 API 参数命名snake_case vs camelCase
**严重程度**: P0 — 前后端无法对接
前端 API 文件中参数名使用 snake_case`screen_name`、`page_num`、`config_status`),而后端 Entity/Query 属性使用 camelCase`screenName`、`pageNum`、`configStatus`)。
Jackson 默认序列化/反序列化使用 camelCase前端发 snake_case 参数后端收不到。
**影响文件**:
- `gz-oarms-web/src/api/BS-大屏基础库域/BS-1-大屏基础信息管理.js`
- `gz-oarms-web/src/api/AM-广告监控域/AM-1-广告画面录屏设置管理.js`
- `gz-oarms-web/src/api/CW-内容预警域/CW-3-监测线索生成.js`
- 全部 10 个 API 文件
#### 2. 前后端 API 路径不一致
**严重程度**: P1 — 路径不匹配导致 404
| 前端路径 | 后端路径 | 差异 |
|---------|---------|------|
| `/api/screens/query` | `/api/screen/query` | 单复数 |
| `/api/recording-configs/query` | `/api/recording-config/query` | 单复数 |
| `/api/cw/evidence-records/query` | `/api/evidence-record/query` | 域前缀 + 单复数 |
| `/api/cw/monitoring-clues/query` | `/api/monitoring-clue/query` | 域前缀 + 单复数 |
---
## Phase 1后端 DB→Entity→DTO 全链路审查(✅ 完成)
### P1-1DDL CREATE TABLE 表名小写(全部 13 个 DDL 文件17 张表)
**严重程度**: P3 — DM8 规范要求大写,但 DM8 实际大小写不敏感,不影响功能
所有 `CREATE TABLE` 语句中表名使用小写,而同文件内 COMMENT ON / CREATE INDEX 已大写。
| DDL 文件 | 需修改的表名 |
|---------|------------|
| V1.0.0__BS_screen_ddl.sql | `bs_screen``BS_SCREEN``bs_screen_history` → `BS_SCREEN_HISTORY` |
| V2.0.0__LB_law_ddl.sql | `lb_law_clause``LB_LAW_CLAUSE` |
| V3.0.0__AM_recording_config_ddl.sql | `am_recording_config``AM_RECORDING_CONFIG` |
| V4.0.0__AM_recording_task_ddl.sql | `am_recording_task``AM_RECORDING_TASK``am_alert_notification` → `AM_ALERT_NOTIFICATION` |
| V5.0.0__AM_monitor_record_ddl.sql | `am_monitor_record``AM_MONITOR_RECORD` |
| V6.0.0__MR_monitoring_rule_ddl.sql | `mr_monitoring_rule``MR_MONITORING_RULE``mr_rule_law_clause_rel` → `MR_RULE_LAW_CLAUSE_REL``mr_rule_operation_history` → `MR_RULE_OPERATION_HISTORY` |
| V7.0.0__CW_evidence_ddl.sql | `cw_evidence_record``CW_EVIDENCE_RECORD``cw_evidence_status_history` → `CW_EVIDENCE_STATUS_HISTORY` |
| V8.0.0__CW_evidence_rule_relation_ddl.sql | `cw_evidence_rule_relation``CW_EVIDENCE_RULE_RELATION` |
| V9.0.0__CW_monitoring_clue_ddl.sql | `cw_monitoring_clue``CW_MONITORING_CLUE``cw_clue_generation_log` → `CW_CLUE_GENERATION_LOG` |
| V10.0.0__CW_clue_transfer_ddl.sql | `cw_clue_transfer_record``CW_CLUE_TRANSFER_RECORD``cw_transfer_operation_log` → `CW_TRANSFER_OPERATION_LOG` |
### P1-2多余 @TableField 注解2 个 Entity6 处)
**严重程度**: P3 — 不影响功能,冗余代码
属性名与列名完全相同时MyBatis-Plus 自动映射,`@TableField` 注解多余。
| Entity 文件 | 字段 | @TableField 值 | 原因 |
|------------|------|---------------|------|
| ScreenEntity | `address` | `"address"` | 完全相同 |
| ScreenEntity | `district` | `"district"` | 完全相同 |
| ScreenEntity | `advertiser` | `"advertiser"` | 完全相同 |
| ScreenEntity | `longitude` | `"longitude"` | 完全相同 |
| ScreenEntity | `latitude` | `"latitude"` | 完全相同 |
| RuleOperationHistoryEntity | `operator` | `"operator"` | 完全相同 |
### P1-3命名一致性审查通过项
| 检查项 | 结果 | 详情 |
|-------|------|------|
| DDL @TableField 映射 | ✅ 全部匹配 | 17 张表,约 150 个字段全部正确 |
| Entity → DTO 属性名 | ✅ 全部匹配 | VO/Query/Req 与 Entity 属性名一致 |
| DDL COMMENT/INDEX 大写 | ✅ 全部大写 | 所有 COMMENT ON 和 CREATE INDEX 标识符大写 |
| SuperEntity 公共字段 | ✅ 无重复声明 | 所有继承 SuperEntity 的 Entity 均未重复声明 |
| @JsonFormat 使用常量 | ✅ 全部使用 DateUtil | 无硬编码格式字符串 |
---
## Phase 2后端 Controller API 路径审查(✅ 完成)
### P2-1基础路径单复数不一致
**严重程度**: P2 — 风格不一致,影响可维护性
| Controller | 当前路径 | 问题 | 建议 |
|-----------|---------|------|------|
| MonitoringRuleController | `/api/monitoring-rules` | 唯一使用复数 | → `/api/monitoring-rule` |
| 其余 9 个 Controller | `/api/screen` 等 | 单数 | 保持一致 |
### P2-2低优先级风格问题
| Controller | 问题 | 建议 |
|-----------|------|------|
| ScreenController | `district/list` 两段路径 | → `districts` |
| MonitoringClueController | `clue-preview` 与基础路径语义重复 | → `preview` |
| ClueTransferController | `targets/districts` 两层嵌套 | → `target-districts` |
| ClueTransferController | `clues/{clueId}/disposal-feedback` 路径变量 | → `disposal-feedback?clueId=` |
| ClueTransferController | `pending-clues/query` 子资源前缀 | → `pending-query` |
| EvidenceRuleRelationController | `query-by-evidence` 复合路径 | → `list-by-evidence` |
### P2-3审查通过项
- 全部 10 个 Controller 路径使用 kebab-case无驼峰/下划线混入
- 核心 CRUD 路径query/detail/save/update/remove高度一致
---
## Phase 3前端 API 文件审查(✅ 完成)
### P3-1API 路径全部不匹配(严重)
**严重程度**: P0 — 前后端路径不一致,所有接口 404
**根因**: 前端使用 RESTful 风格(复数 + 路径参数 + PUT/DELETE后端使用扁平 POST 风格(单数 + 查询参数/RequestBody
| 问题模式 | 涉及模块 | 示例 |
|---------|---------|------|
| 资源名单复数 | 全部 10 个 | `/api/screens` vs `/api/screen` |
| HTTP 方法不匹配 | 全部 | PUT/DELETE vs POST |
| 路径参数 vs 查询参数 | 全部 GET/PUT/DELETE | `/api/screens/${id}` vs `/api/screen/detail?id=` |
| CW 域多了 `/cw/` 前缀 | CW-1/2/3 | `/api/cw/evidence-records` vs `/api/evidence-record` |
| 前端用路径嵌套 | CW-4 | `/api/clue-transfer/transfer-records/query` vs `/api/clue-transfer/query` |
**统计**: ~58/64 个端点路径不匹配
### P3-2JSDoc 参数名全部 snake_case严重
**严重程度**: P0 — 前端发 snake_case 参数,后端收 camelCase字段无法映射
全部 10 个 API 文件的 JSDoc `@param` 注释和实际参数使用 snake_case而后端 Entity/Query/Req 属性为 camelCase。
**高频不匹配字段**(全局):
| 前端 snake_case | 后端 camelCase | 出现次数 |
|----------------|---------------|---------|
| `page_num` | `pageNum` | 10 文件 |
| `page_size` | `pageSize` | 10 文件 |
| `screen_name` | `screenName` | 6 文件 |
| `start_time` / `end_time` | `startTime` / `endTime` | 5 文件 |
| `evidence_id` | `evidenceId` | 4 文件 |
| `clue_id` | `clueId` | 3 文件 |
### P3-3JS 函数参数名 snake_case15 处)
**严重程度**: P1 — 不影响运行,但不符合 JS camelCase 规范
| 文件 | snake_case 参数 | 应改为 |
|------|----------------|-------|
| CW-1 | `evidence_id`×4、`monitor_record_id`×2 | `evidenceId`、`monitorRecordId` |
| CW-2 | `evidence_id`×3 | `evidenceId` |
| CW-3 | `evidence_id`×1、`clue_id`×2 | `evidenceId`、`clueId` |
| CW-4 | `clue_id`×2、`transfer_record_id`×2、`district_code`、`department_id` | camelCase |
### P3-4前端调用不存在的后端接口6 个)
| 前端函数 | URL | 模块 |
|---------|-----|------|
| `queryRuleOperationHistory` | `/api/monitoring-rules/${id}/histories` | MR-1 |
| `getEvidenceStatusHistory` | `/api/evidence-records/${id}/status-history` | CW-1 |
| `getMonitorRecordEvidenceContext` | `/api/monitor-records/${id}/evidence-context` | CW-1 |
| `getMonitorVideoPlayUrl` | `/api/monitor-records/${id}/video/play` | CW-1 |
| `updateEvidenceRecordStatus` | `/api/cw/evidence-records/${id}/status` | CW-2 |
| `getClueGenerationLogs` | `/api/cw/monitoring-clues/${id}/generation-logs` | CW-3 |
---
## Phase 4前端页面组件审查跳过
前端页面组件的命名问题本质与 Phase 3 的 API 文件一致(表单字段绑定来源于 API 参数。API 层修复后页面同步调整即可。
---
## Phase 5汇总修复建议
### 修复策略决策
**核心问题**:前后端 API 路径和参数命名存在系统性不一致。
**必须选择一个方向统一**
- **方案 A推荐**:前端适配后端 — 修改前端 API 文件的路径和参数名为后端实际值
- **方案 B**:后端适配前端 — 修改后端 Controller 路径和参数接收方式
**推荐方案 A 的理由**
1. 后端 85 个问题已全部修复并端到端测试通过,不宜大改
2. 前端 API 文件仅 10 个,修改范围可控
3. 后端的扁平 POST 风格已在项目中统一,改后端需动 11 个 Controller
### 修复清单(方案 A
#### 1. 修复前端 API 路径10 个文件,~58 处)
每个 API 文件需:
- 资源名改为单数(`screens` → `screen``recording-configs` → `recording-config`
- 移除 `/cw/` 前缀CW-1/2/3 的文件)
- GET 详情改为查询参数(`/${id}` → `?id=`
- PUT/DELETE 改为 POST
- 路径参数改为 RequestBody
#### 2. 修复 JSDoc 参数名为 camelCase10 个文件,~90 处)
每个 `@param` 中的 snake_case 字段名改为 camelCase
- `page_num``pageNum`
- `screen_name``screenName`
- `evidence_id``evidenceId`
- 等等
#### 3. 修复 JS 函数参数名CW-1/2/3/4 的文件15 处)
- `evidence_id``evidenceId`
- `clue_id``clueId`
- `transfer_record_id``transferRecordId`
- `district_code``districtCode`
- `department_id``departmentId`
#### 4. 修复后端 Controller 单复数不一致1 处)
- MonitoringRuleController: `/api/monitoring-rules``/api/monitoring-rule`
#### 5. DDL CREATE TABLE 表名大写13 个文件17 张表)
纯规范修复DM8 大小写不敏感,不影响功能。
#### 6. 清理多余 @TableField 注解2 个 Entity6 处)
纯代码整洁,不影响功能。
### 不修复项
| 项目 | 原因 |
|------|------|
| 前端调用不存在的 6 个接口 | 属于功能缺失(需评估是否需要实现),非命名问题 |
| ClueTransferController 多层嵌套路径 | 功能正常,低优先级风格问题 |
| 前端页面组件命名 | API 层修复后页面自然跟随 |