fix: 代码修复 + CLAUDE.md 完善 + gitignore 更新

- MonitoringRuleController API路径修正 /api/monitoring-rules → /api/monitoring-rule
- ScreenEntity/RuleOperationHistoryEntity 移除冗余 @TableField 注解
- application.yml 默认端口修正为 8081
- CLAUDE.md 补充开发约定、数据源配置、Checkstyle 等文档
- .gitignore 添加 /.claude/ 和 /classpath.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
chenjy 2026-05-23 17:51:54 +08:00
parent ba49f7ecb8
commit fb18992d52
19 changed files with 373 additions and 1142 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
/.idea
/*.iml
/target
/.claude/
/classpath.txt

View File

@ -19,6 +19,12 @@ mvn dependency:build-classpath -Dmdep.outputFile=classpath.txt
java -cp "target/classes;$(cat classpath.txt)" -Dfile.encoding=UTF-8 com.chinaweal.youfool.prj.YoufoolApplication
```
- 默认端口 `8081`(环境变量 `PRJ_PORT` 可覆盖)
- Context Path 可通过环境变量 `PRJ_CONTEXT_PATH` 设置
- 环境切换:`spring.profiles.active` 设为 `dev``prod`,对应 `application-dev.yml` / `application-prod.yml`
- API 文档:`/doc.html`Knife4jDruid 监控:`/druid`,账号 admin/123456
- 公司私有仓库:`-Pcompany-nexus` profile
## Architecture
OARMS — 广州市户外广告监管系统后端Spring Boot 3.4.5 + JDK 21 + 达梦 DM8 数据库。
@ -35,6 +41,8 @@ OARMS — 广州市户外广告监管系统后端Spring Boot 3.4.5 + JDK 21 +
| AM 监控 | 录屏设置/任务/画面监控 | `modules/monitor/{config,task,record}` | `am_` |
| CW 取证 | 固化取证/规则关联/线索生成/线索转办 | `modules/evidence/{record,relation,clue,transfer}` | `cw_` |
核心实体依赖链:`SCREEN(BS-1)` → `AM-1/2/3`、`CW-1``MONITORING_RULE(MR-1)` → `CW-2`、`CW-3``EVIDENCE_RECORD(CW-1)` → `CW-2/3/4`
### 分层结构
每个模块遵循 Controller → Service → Mapper 三层,实体包内分 `query/`、`req/`、`vo/`
@ -57,6 +65,9 @@ modules/{module}/
- **日志**`log.info("[OK] 操作描述: key={}", value)`
- **Mapper 扫描**`com.chinaweal.youfool.prj.**.mapper`,新模块放此包下自动注册
- **API 路径**:所有接口以 `/api/` 开头
- **对象映射**:新模块推荐 `BeanUtils.copyProperties`,而非 MapStruct
- **删除接口**:用 `Map<String, String>` 接收 id
- **选项接口**:返回 `List<Map<String, String>>`label + value
### 数据源
@ -64,13 +75,71 @@ modules/{module}/
- `master`primary→ OARMS schema业务数据
- `youfool` → YOUFOOL schema框架日志restLog
连接配置在 `application-dev.yml` / `application-prod.yml`,不提交敏感信息到主配置。
### MyBatis 配置
- 配置文件:`mybatis/mybatis-config.xml`
- 开启 `mapUnderscoreToCamelCase`DB 列名自动转驼峰映射 Java 字段
- 分页插件:`MybatisPlusInterceptor` + `PaginationInnerInterceptor`
- XML mapper 路径:`classpath*:mybatis/mapper/**/*.xml`(当前模块未使用 XML均为注解方式
### DM8 数据库要点
- DDL/COMMENT/INDEX 中表名列名必须大写INSERT 中列名可用小写
- 日期字段:`@JsonFormat(pattern = DateUtil.DATE_DEFAULT_FORMAT, timezone = "GMT+8")`
- 日期时间字段:`@JsonFormat(pattern = DateUtil.DATETIME_DEFAULT_FORMAT, timezone = "GMT+8")`
- DDL 文件放在 `docs/db/sql/`,命名 `V{版本号}__{模块描述}_{ddl|init_data}.sql`
- DM8 精度上限 38`DECIMAL` 超过会报错,经纬度用 `DECIMAL(10,6)`
- CLOB 字段存 JSON 数组时Entity 返回 String前端需 `JSON.parse()`
- DDL 执行使用 Python + JayDeBeApi 连接 DM8详见 `docs/backend-module-dev-guide.md` B2 节)
### Checkstyle 要点
配置文件 `checkstyle-v1.0.xml`,开发阶段可用 `-Dcheckstyle.skip=true` 跳过。关键规则:
- 行宽 200 字符,文件最大 2000 行,方法最大 300 行
- 类名/方法名/成员变量:驼峰,最长 30 字符;参数名:最长 19 字符
- 静态常量:全大写下划线,最长 50 字符
- 非法访问成员:只能 `private``static final` 除外)
- 方法参数上限 7 个
- switch 必须有 default字符串比较必须用 `equals()`
### Swagger 分组
`application.yml` 中配置 `springdoc.group-configs`**当前仅配置了"基础框架"和"登录相关"两个分组**。新增模块需添加分组:
```yaml
- group: '新模块名'
paths-to-match: '/**'
packages-to-scan: com.chinaweal.youfool.prj.modules.新模块包名.controller
```
### 认证白名单
Sa-Token 拦截器在 `SpringMvcConfig`,白名单路径免登录:`/user/auth/**`、`/test/**`、`/doc.html**`、`/swagger*`、`/cms/**`、`/network/ping`
## PRD 文档路径
需求文档在 `gz-oarms-web/docs/prd-llm/` 目录下,按业务域组织:
```
gz-oarms-web/docs/prd-llm/
├── BS-大屏基础库域/BS-1_大屏基础信息管理/ # s1需求分析 s2实体定义 s4-api设计 s4-编码任务
├── LB-法律法规库域/LB-1_法律法规管理/
├── MR-监测规则库域/MR-1_监测规则管理/
├── AM-广告监控域/AM-{1,2,3}_*/
├── CW-内容预警域/CW-{1,2,3,4}_*/
└── DM-全局数据模型/全局实体字典.md # 核心实体跨域引用
```
## Development Guide
详细开发指南见 `docs/backend-module-dev-guide.md`,包含 Entity/Controller/Service/Mapper/Query 模板代码和 DM8 类型映射表。
详细开发指南见 `docs/backend-module-dev-guide.md`,包含:
- A. 运行环境技术栈、数据源、Maven 配置)
- B. 工具编译命令、Python + JayDeBeApi 数据库执行工具、SQL 版本号分配)
- C. 记忆Entity/Controller/Service/Mapper/Query 模板代码、DM8 类型映射、初始数据约定)
- D. 评估(编译验证、数据库验证、模块完成检查清单)
- E. 边界(数据库/代码/编译禁忌)
- F. Harness Engineering全流程、模块开发进度总表、核心实体跨域依赖、待开发任务建议顺序
前后端联调指南见 `docs/前后端联调指南.md`,包含 10 个模块的接口清单、DTO 字段、数据库表映射及高频错误模式。

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. bs_screen - 户外广告大屏
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.bs_screen (
CREATE TABLE OARMS.BS_SCREEN (
id VARCHAR(50) NOT NULL,
screen_code VARCHAR(30) NOT NULL,
screen_name VARCHAR(100) NOT NULL,
@ -72,7 +72,7 @@ COMMENT ON COLUMN OARMS.BS_SCREEN.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 2. bs_screen_history - 大屏历史版本
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.bs_screen_history (
CREATE TABLE OARMS.BS_SCREEN_HISTORY (
id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,
snapshot_data CLOB NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. cw_clue_transfer_record - 线索转办记录
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_clue_transfer_record (
CREATE TABLE OARMS.CW_CLUE_TRANSFER_RECORD (
id VARCHAR(50) NOT NULL,
clue_id VARCHAR(50) NOT NULL,
transfer_target_district VARCHAR(20) NOT NULL,
@ -64,7 +64,7 @@ COMMENT ON COLUMN OARMS.CW_CLUE_TRANSFER_RECORD.UPDATE_NAME IS '更新人姓名'
-- ----------------------------------------------------------------------------
-- 2. cw_transfer_operation_log - 转办操作日志
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_transfer_operation_log (
CREATE TABLE OARMS.CW_TRANSFER_OPERATION_LOG (
id VARCHAR(50) NOT NULL,
clue_transfer_record_id VARCHAR(50) NOT NULL,
operation_type VARCHAR(20) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. lb_law_clause - 法律条款
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.lb_law_clause (
CREATE TABLE OARMS.LB_LAW_CLAUSE (
id VARCHAR(50) NOT NULL,
clause_code VARCHAR(30) NOT NULL,
law_name VARCHAR(200) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. am_recording_config - 录屏配置
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.am_recording_config (
CREATE TABLE OARMS.AM_RECORDING_CONFIG (
id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,
screen_name VARCHAR(200),

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. am_recording_task - 录屏任务
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.am_recording_task (
CREATE TABLE OARMS.AM_RECORDING_TASK (
id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,
config_id VARCHAR(50) NOT NULL,
@ -57,7 +57,7 @@ COMMENT ON COLUMN OARMS.AM_RECORDING_TASK.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 2. am_alert_notification - 告警通知
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.am_alert_notification (
CREATE TABLE OARMS.AM_ALERT_NOTIFICATION (
id VARCHAR(50) NOT NULL,
task_id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. am_monitor_record - 监控记录
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.am_monitor_record (
CREATE TABLE OARMS.AM_MONITOR_RECORD (
id VARCHAR(50) NOT NULL,
task_id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. mr_monitoring_rule - 监测规则
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.mr_monitoring_rule (
CREATE TABLE OARMS.MR_MONITORING_RULE (
id VARCHAR(50) NOT NULL,
rule_code VARCHAR(30) NOT NULL,
rule_name VARCHAR(100) NOT NULL,
@ -56,7 +56,7 @@ COMMENT ON COLUMN OARMS.MR_MONITORING_RULE.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 2. mr_rule_law_clause_rel - 规则-法条关联
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.mr_rule_law_clause_rel (
CREATE TABLE OARMS.MR_RULE_LAW_CLAUSE_REL (
id VARCHAR(50) NOT NULL,
rule_id VARCHAR(50) NOT NULL,
clause_id VARCHAR(50) NOT NULL,
@ -93,7 +93,7 @@ COMMENT ON COLUMN OARMS.MR_RULE_LAW_CLAUSE_REL.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 3. mr_rule_operation_history - 规则操作历史
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.mr_rule_operation_history (
CREATE TABLE OARMS.MR_RULE_OPERATION_HISTORY (
id VARCHAR(50) NOT NULL,
rule_id VARCHAR(50) NOT NULL,
operator VARCHAR(100) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. cw_evidence_record - 固化取证记录
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_evidence_record (
CREATE TABLE OARMS.CW_EVIDENCE_RECORD (
id VARCHAR(50) NOT NULL,
monitor_record_id VARCHAR(50) NOT NULL,
screen_id VARCHAR(50) NOT NULL,
@ -77,7 +77,7 @@ COMMENT ON COLUMN OARMS.CW_EVIDENCE_RECORD.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 2. cw_evidence_status_history - 证据状态变更历史
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_evidence_status_history (
CREATE TABLE OARMS.CW_EVIDENCE_STATUS_HISTORY (
id VARCHAR(50) NOT NULL,
evidence_id VARCHAR(50) NOT NULL,
from_status TINYINT,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. cw_evidence_rule_relation - 证据规则关联
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_evidence_rule_relation (
CREATE TABLE OARMS.CW_EVIDENCE_RULE_RELATION (
id VARCHAR(50) NOT NULL,
evidence_id VARCHAR(50) NOT NULL,
rule_id VARCHAR(50) NOT NULL,

View File

@ -10,7 +10,7 @@
-- ----------------------------------------------------------------------------
-- 1. cw_monitoring_clue - 监测线索
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_monitoring_clue (
CREATE TABLE OARMS.CW_MONITORING_CLUE (
id VARCHAR(50) NOT NULL,
clue_code VARCHAR(20) NOT NULL,
evidence_id VARCHAR(50) NOT NULL,
@ -88,7 +88,7 @@ COMMENT ON COLUMN OARMS.CW_MONITORING_CLUE.UPDATE_NAME IS '更新人姓名';
-- ----------------------------------------------------------------------------
-- 2. cw_clue_generation_log - 线索生成日志
-- ----------------------------------------------------------------------------
CREATE TABLE OARMS.cw_clue_generation_log (
CREATE TABLE OARMS.CW_CLUE_GENERATION_LOG (
id VARCHAR(50) NOT NULL,
clue_id VARCHAR(50) NOT NULL,
evidence_id VARCHAR(50) NOT NULL,

View File

@ -1,745 +1,236 @@
# OARMS 研究与发现记录
# 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` | 域前缀 + 单复数 |
---
## 逐模块检查结果2026-05-21
## Phase 1后端 DB→Entity→DTO 全链路审查(✅ 完成
### BS-1 大屏管理 — 检查完成
### P1-1DDL CREATE TABLE 表名小写(全部 13 个 DDL 文件17 张表)
**检查范围**: 10 个 Java 文件 + 2 个 SQL 文件
**严重程度**: P3 — DM8 规范要求大写,但 DM8 实际大小写不敏感,不影响功能
#### L1 接口存在性
所有 `CREATE TABLE` 语句中表名使用小写,而同文件内 COMMENT ON / CREATE INDEX 已大写。
联调指南 14 个接口全部存在,路由精确匹配。 ✅
| 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` |
| 接口 | 路径 | 状态 |
|------|------|------|
| POST /query | ✅ | |
| GET /detail | ✅ | |
| POST /save | ✅ | |
| POST /update | ✅ | |
| POST /remove | ✅ | |
| GET /options | ✅ | |
| GET /district/list | ✅ | |
| POST /toggle-status | ✅ | |
| GET /check-code | ✅ | |
| GET /check-address | ✅ | |
| GET /export | ✅ | |
| POST /import | ✅ | |
| GET /import-template | ✅ | |
| GET /histories | ✅ | |
### P1-2多余 @TableField 注解2 个 Entity6 处)
#### L2 参数一致性
**严重程度**: P3 — 不影响功能,冗余代码
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList(ScreenQuery query)` POST 方法缺少 `@RequestBody`,前端发 JSON body 时参数为空 | **P0** | Controller:47 |
| 2 | `save(ScreenSaveReq req)` POST 方法缺少 `@RequestBody` | **P0** | Controller:71 |
| 3 | `update(ScreenSaveReq req)` POST 方法缺少 `@RequestBody` | **P0** | Controller:83 |
| 4 | `remove(String id)` POST 方法未使用 `@RequestBody Map`id 无法从 JSON body 获取 | **P1** | Controller:95 |
| 5 | `toggleStatus(String id, Integer status)` POST 方法缺少参数绑定注解 | **P1** | Controller:144 |
属性名与列名完全相同时MyBatis-Plus 自动映射,`@TableField` 注解多余。
> 说明:无 @RequestBody 时 Spring 从 query string / form data 绑定,前端 Axios 发 JSON body 会收不到数据。e2e 测试通过是因为测试脚本用了 query params。
| Entity 文件 | 字段 | @TableField 值 | 原因 |
|------------|------|---------------|------|
| ScreenEntity | `address` | `"address"` | 完全相同 |
| ScreenEntity | `district` | `"district"` | 完全相同 |
| ScreenEntity | `advertiser` | `"advertiser"` | 完全相同 |
| ScreenEntity | `longitude` | `"longitude"` | 完全相同 |
| ScreenEntity | `latitude` | `"latitude"` | 完全相同 |
| RuleOperationHistoryEntity | `operator` | `"operator"` | 完全相同 |
#### L3 返回值一致性
### P1-3命名一致性审查通过项
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 6 | `save()` 返回 `RestResult.ok()` 未携带新建实体 ID前端无法获取新记录 ID | **P1** | ServiceImpl:93-98 |
| 7 | ScreenDetailVO 的 createTime/updateTime 使用 `Date` 类型ScreenHistoryEntity 的 changedAt 使用 `LocalDateTime`,类型不一致 | **P2** | VO:94-97, HistoryEntity:41 |
| 8 | histories 返回的 snapshotData 是 CLOB(JSON) 字符串,前端需 JSON.parse无提示 | **P2** | ServiceImpl:253 |
#### L4 DTO-DB 映射
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 9 | ScreenEntity 缺少 `@DS("master")` 注解,开发指南约定必须标注 | **P2** | ScreenEntity:23 |
| 10 | ScreenHistoryEntity 缺少 `@DS("master")` 注解 | **P2** | ScreenHistoryEntity:25 |
其余 @TableField 与 DDL 列名完全对应,类型映射正确。 ✅
#### L5 数据完整性
- DDL 文件存在 ✅
- 初始数据 8 条 ✅
- DM8 已建表 ✅
#### L6 代码规范
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 11 | Controller 全部方法缺少 `log.info("[OK] ...")` 日志 | **P3** | Controller 全文件 |
| 12 | `AssertUtils.isNotNull(entity, "大屏信息不存在")` 第二个 String 参数会被当作 varargs 的第二个对象检查,不会作为错误消息显示 | **P3** | ServiceImpl:106 |
| 13 | IScreenService 所有方法返回 RestResultService 层与 HTTP 响应格式耦合 | **P3** | IScreenService 全文件 |
| 14 | update() 中 `BeanUtils.copyProperties(req, entity)` 会用 req 中 null 字段覆盖 entity 已有值 | **P2** | ServiceImpl:107 |
#### 问题汇总
| 严重程度 | 数量 |
|---------|------|
| P0 阻塞 | 3 |
| P1 严重 | 2 |
| P2 一般 | 5 |
| P3 建议 | 3 |
| **合计** | **13** |
| 检查项 | 结果 | 详情 |
|-------|------|------|
| DDL @TableField 映射 | ✅ 全部匹配 | 17 张表,约 150 个字段全部正确 |
| Entity → DTO 属性名 | ✅ 全部匹配 | VO/Query/Req 与 Entity 属性名一致 |
| DDL COMMENT/INDEX 大写 | ✅ 全部大写 | 所有 COMMENT ON 和 CREATE INDEX 标识符大写 |
| SuperEntity 公共字段 | ✅ 无重复声明 | 所有继承 SuperEntity 的 Entity 均未重复声明 |
| @JsonFormat 使用常量 | ✅ 全部使用 DateUtil | 无硬编码格式字符串 |
---
### LB-1 法律法规 — 检查完成
## Phase 2后端 Controller API 路径审查(✅ 完成)
**检查范围**: 7 个 Java 文件 + 2 个 SQL 文件
### P2-1基础路径单复数不一致
#### L1 接口存在
**严重程度**: P2 — 风格不一致,影响可维护性
联调指南 9 个接口全部存在,路由精确匹配。 ✅
| Controller | 当前路径 | 问题 | 建议 |
|-----------|---------|------|------|
| MonitoringRuleController | `/api/monitoring-rules` | 唯一使用复数 | → `/api/monitoring-rule` |
| 其余 9 个 Controller | `/api/screen` 等 | 单数 | 保持一致 |
#### L2 参数一致性
### P2-2低优先级风格问题
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList` POST 缺少 `@RequestBody`(同 BS-1 模式) | **P0** | Controller:44 |
| 2 | `save` POST 缺少 `@RequestBody` | **P0** | Controller:68 |
| 3 | `update` POST 缺少 `@RequestBody` | **P0** | Controller:80 |
| 4 | `remove(String id)` POST 缺少参数绑定 | **P1** | Controller:92 |
| 5 | `repeal(String id)` POST 缺少参数绑定 | **P1** | Controller:109 |
| 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` |
Query 字段与联调指南一致 ✅。SaveReq 字段与联调指南一致 ✅。
### P2-3审查通过项
#### L3 返回值一致性
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 6 | `save()` 未返回新建实体 ID | **P1** | ServiceImpl:69-74 |
直接返回 Entity 而非 VO与联调指南定义一致 ✅。
#### L4 DTO-DB 映射
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 7 | LawClauseEntity 缺少 `@DS("master")` | **P2** | Entity:24 |
其余 @TableField 与 DDL 列名完全对应,类型映射正确 ✅。
#### L5 数据完整性
DDL ✅、初始数据 5 条 ✅、DM8 建表 ✅
#### L6 代码规范
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 8 | **`repeal()` 设置 `effectiveStatus=0`,但 DDL 定义废止应为 21=有效,2=废止)** | **P1** | ServiceImpl:121 |
| 9 | `update()` BeanUtils.copyProperties null 字段覆盖 | **P2** | ServiceImpl:83 |
| 10 | Controller 全部方法缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 11 | `publishDate`@JsonFormat 使用硬编码 `"yyyy-MM-dd"`,应使用 `DateUtil.DATE_DEFAULT_FORMAT` | **P3** | Entity:50, SaveReq:57 |
| 12 | `AssertUtils.isNotNull(entity, "msg")` message 参数不生效 | **P3** | ServiceImpl:82,120 |
#### 问题汇总
| 严重程度 | 数量 |
|---------|------|
| P0 阻塞 | 3 |
| P1 严重 | 3 |
| P2 一般 | 2 |
| P3 建议 | 3 |
| **合计** | **11** |
- 全部 10 个 Controller 路径使用 kebab-case无驼峰/下划线混入
- 核心 CRUD 路径query/detail/save/update/remove高度一致
---
### MR-1 监测规则 — 检查完成
## Phase 3前端 API 文件审查(✅ 完成)
**检查范围**: 12 个 Java 文件 + 2 个 SQL 文件
### P3-1API 路径全部不匹配(严重)
#### L1 接口存在性
**严重程度**: P0 — 前后端路径不一致,所有接口 404
联调指南 11 个接口全部存在,路由精确匹配。 ✅
**根因**: 前端使用 RESTful 风格(复数 + 路径参数 + PUT/DELETE后端使用扁平 POST 风格(单数 + 查询参数/RequestBody
#### L2 参数一致性
| 问题模式 | 涉及模块 | 示例 |
|---------|---------|------|
| 资源名单复数 | 全部 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` |
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList` POST 缺少 `@RequestBody`(同 BS-1 模式) | **P0** | Controller:44 |
| 2 | `save` POST 缺少 `@RequestBody` | **P0** | Controller:68 |
| 3 | `update` POST 缺少 `@RequestBody` | **P0** | Controller:80 |
| 4 | `remove(String id)` POST 缺少参数绑定 | **P1** | Controller:92 |
| 5 | `toggleStatus(String id, Integer status)` POST 缺少参数绑定 | **P1** | Controller:105 |
**统计**: ~58/64 个端点路径不匹配
Query 字段与联调指南一致 ✅。SaveReq 字段与联调指南一致 ✅。
### P3-2JSDoc 参数名全部 snake_case严重
#### L3 返回值一致性
**严重程度**: P0 — 前端发 snake_case 参数,后端收 camelCase字段无法映射
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 6 | `save()` 未返回新建实体 ID | **P1** | ServiceImpl:126-143 |
| 7 | `scopeDistricts` 为 CLOB(JSON) 字符串,`getEnabledRules` 直接返回 String前端需 JSON.parse | **P2** | ServiceImpl:253 |
| 8 | `queryList` 返回的 VO 中 `lawClauses`/`histories` 为 null仅 detail 填充) | **P3** | ServiceImpl:72-76 |
全部 10 个 API 文件的 JSDoc `@param` 注释和实际参数使用 snake_case而后端 Entity/Query/Req 属性为 camelCase。
#### L4 DTO-DB 映射
**高频不匹配字段**(全局):
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 9 | MonitoringRuleEntity 缺少 `@DS("master")` | **P2** | Entity:21 |
| 前端 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 文件 |
其余 @TableField 与 DDL 列名完全对应 ✅。scopeDistricts CLOB → String 映射正确 ✅。
### P3-3JS 函数参数名 snake_case15 处)
#### L5 数据完整性
**严重程度**: P1 — 不影响运行,但不符合 JS camelCase 规范
DDL ✅3 张表)、初始数据 9 条 ✅、DM8 建表 ✅
| 文件 | 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 |
#### L6 代码规范
### P3-4前端调用不存在的后端接口6 个)
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 10 | 操作历史 `operator` 硬编码为 `"系统管理员"`,未从登录用户获取 | **P2** | ServiceImpl:141,172,202,227 |
| 11 | `update()` BeanUtils.copyProperties null 字段覆盖 | **P2** | ServiceImpl:159 |
| 12 | `remove()` 先删除操作历史再新增一条删除记录,产生孤儿历史数据 | **P3** | ServiceImpl:192-202 |
| 13 | `buildSnapshot()` 手动拼接 JSON 字符串,字段值含引号时会破坏 JSON 格式 | **P3** | ServiceImpl:341-354 |
| 14 | Controller 全部方法缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 15 | `AssertUtils.isNotNull(entity, "msg")` message 参数不生效 | **P3** | ServiceImpl:151,182,213 |
#### 问题汇总
| 严重程度 | 数量 |
|---------|------|
| P0 阻塞 | 3 |
| P1 严重 | 2 |
| P2 一般 | 4 |
| P3 建议 | 6 |
| **合计** | **15** |
| 前端函数 | 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 |
---
### AM-1 录屏设置 — 检查完成
## Phase 4前端页面组件审查跳过
**检查范围**: 7 个 Java 文件 + 1 个 DDL 文件
#### L1 接口存在性
联调指南 7 个接口全部存在 ✅
#### L2 参数一致性
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList`/`save`/`update` POST 缺少 `@RequestBody`(同前模块模式) | **P0** | Controller:44,68,80 |
| 2 | `remove(String id)` / `toggleStatus(String id, Integer status)` POST 缺少参数绑定 | **P1** | Controller:92,109 |
Query/SaveReq 字段与联调指南一致 ✅。save() 有录屏时长/频率范围校验、大屏唯一性校验、时间范围校验 ✅。
#### L3 返回值一致性
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 3 | `save()` 未返回新建实体 ID | **P1** | ServiceImpl:110 |
#### L4 DTO-DB 映射
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 4 | RecordingConfigEntity 缺少 `@DS("master")` | **P2** | Entity:21 |
#### L5 数据完整性
DDL ✅、无初始数据符合预期✅、DM8 建表 ✅
#### L6 代码规范
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 5 | `update()` BeanUtils.copyProperties null 字段覆盖 | **P2** | ServiceImpl:156 |
| 6 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 7 | `AssertUtils.isNotNull(entity, "msg")` message 不生效 | **P3** | ServiceImpl:91,119 |
#### 问题汇总: P0×1, P1×2, P2×2, P3×2 = **7**
前端页面组件的命名问题本质与 Phase 3 的 API 文件一致(表单字段绑定来源于 API 参数。API 层修复后页面同步调整即可。
---
### AM-2 随机录屏 — 检查完成
## Phase 5汇总修复建议
**检查范围**: 7 个 Java 文件 + 1 个 DDL 文件
### 修复策略决策
#### L1 接口存在性
**核心问题**:前后端 API 路径和参数命名存在系统性不一致。
联调指南 2 个接口全部存在 ✅query + detail
**必须选择一个方向统一**
- **方案 A推荐**:前端适配后端 — 修改前端 API 文件的路径和参数名为后端实际值
- **方案 B**:后端适配前端 — 修改后端 Controller 路径和参数接收方式
#### L2 参数一致性
**推荐方案 A 的理由**
1. 后端 85 个问题已全部修复并端到端测试通过,不宜大改
2. 前端 API 文件仅 10 个,修改范围可控
3. 后端的扁平 POST 风格已在项目中统一,改后端需动 11 个 Controller
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList` POST 缺少 `@RequestBody` | **P0** | Controller:42 |
### 修复清单(方案 A
Query 字段与联调指南一致 ✅。90 天查询范围限制已实现 ✅。
#### 1. 修复前端 API 路径10 个文件,~58 处)
#### L3/L4/L5
每个 API 文件需:
- 资源名改为单数(`screens` → `screen``recording-configs` → `recording-config`
- 移除 `/cw/` 前缀CW-1/2/3 的文件)
- GET 详情改为查询参数(`/${id}` → `?id=`
- PUT/DELETE 改为 POST
- 路径参数改为 RequestBody
- detail 返回 Map含 alerts 子列表)✅
- 跨模块查询ScreenMapper 两步关联)✅
- DDL ✅、无初始数据 ✅、DM8 ✅
- Entity 缺少 `@DS("master")` → **P2**
#### 2. 修复 JSDoc 参数名为 camelCase10 个文件,~90 处)
#### L6 代码规范
每个 `@param` 中的 snake_case 字段名改为 camelCase
- `page_num``pageNum`
- `screen_name``screenName`
- `evidence_id``evidenceId`
- 等等
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 2 | Entity 缺少 `@DS("master")` | **P2** | RecordingTaskEntity |
| 3 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
#### 3. 修复 JS 函数参数名CW-1/2/3/4 的文件15 处)
#### 问题汇总: P0×1, P2×1, P3×1 = **3**
- `evidence_id``evidenceId`
- `clue_id``clueId`
- `transfer_record_id``transferRecordId`
- `district_code``districtCode`
- `department_id``departmentId`
---
#### 4. 修复后端 Controller 单复数不一致1 处)
### AM-3 广告画面监控 — 检查完成
- MonitoringRuleController: `/api/monitoring-rules``/api/monitoring-rule`
**检查范围**: 6 个 Java 文件 + 1 个 DDL 文件
#### 5. DDL CREATE TABLE 表名大写13 个文件17 张表)
#### L1 接口存在性
纯规范修复DM8 大小写不敏感,不影响功能。
联调指南 4 个接口全部存在 ✅query, detail, start, judge
#### 6. 清理多余 @TableField 注解2 个 Entity6 处
#### L2 参数一致性
纯代码整洁,不影响功能。
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList` POST 缺少 `@RequestBody` | **P0** | Controller:41 |
| 2 | `judgeMonitor(MonitorJudgeReq req)` POST 缺少 `@RequestBody` | **P0** | Controller:77 |
| 3 | `startMonitor(String id)` POST 缺少参数绑定 | **P1** | Controller:65 |
### 不修复项
Query 字段与联调指南一致 ✅。默认过滤已判定记录monitorStatus < 3
#### L3 返回值一致性
- 直接返回 Entity与联调指南一致 ✅
#### L4 DTO-DB 映射
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 4 | MonitorRecordEntity 缺少 `@DS("master")` | **P2** | Entity |
#### L5 数据完整性
DDL ✅、无初始数据 ✅、DM8 ✅
#### L6 代码规范
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 5 | `autoCreateEvidence()` 用 try-catch 吞掉异常,取证创建失败但监控判定仍成功,导致数据不一致 | **P2** | ServiceImpl:148-176 |
| 6 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 7 | `AssertUtils.isNotNull` message 不生效 | **P3** | ServiceImpl:101,126 |
#### 问题汇总: P0×2, P1×1, P2×2, P3×2 = **7**
---
### CW-1 固化取证 — 检查完成
**检查范围**: 7 个 Java 文件 + 1 个 DDL 文件
#### L1 接口存在性
联调指南 5 个接口全部存在 ✅
#### L2/L3/L4/L5/L6 汇总
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList`/`save` POST 缺少 `@RequestBody` | **P0** | Controller:43,67 |
| 2 | `save()` 未返回新建实体 ID | **P1** | ServiceImpl:144 |
| 3 | EvidenceRecordEntity 缺少 `@DS("master")` | **P2** | Entity:25 |
| 4 | download/play 返回占位路径TODO 对接文件存储系统) | **P2** | ServiceImpl:161,174 |
| 5 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 6 | `AssertUtils.isNotNull` message 不生效 | **P3** | ServiceImpl:132,156,168 |
DTO-DB 映射正确 ✅。@JsonFormat 使用 DateUtil 常量 ✅。@DSTransactional 正确使用 ✅。
`AssertUtils.isTrue` 正确使用 `BaseResultCode.PARAM_IS_INVALID` ✅。
#### 问题汇总: P0×1, P1×1, P2×2, P3×2 = **6**
---
### CW-2 规则关联 — 检查完成
**检查范围**: 5 个 Java 文件 + 1 个 DDL 文件
#### L1 接口存在性
联调指南 2 个接口全部存在 ✅
#### 汇总
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `relate` POST 缺少 `@RequestBody` | **P0** | Controller:53 |
| 2 | Entity 缺少 `@DS("master")` | **P2** | Entity |
| 3 | `associatedBy` 硬编码 `"系统管理员"` | **P2** | ServiceImpl:103 |
| 4 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
`AssertUtils.isTrue` 正确使用 `BaseResultCode` ✅。跨模块校验(证据状态、规则有效性)完整 ✅。
#### 问题汇总: P0×1, P2×2, P3×1 = **4**
---
### CW-3 线索生成 — 检查完成
**检查范围**: 8 个 Java 文件 + 1 个 DDL 文件
#### L1 接口存在性
联调指南 5 个接口全部存在 ✅
#### L2/L3/L4/L6 汇总
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | `queryList` POST 缺少 `@RequestBody` | **P0** | Controller:43 |
| 2 | `generateClue(String evidenceId)` POST 缺少参数绑定 | **P1** | Controller:67 |
| 3 | `generateClue()` 未返回新建线索 ID | **P1** | ServiceImpl:222 |
| 4 | `statusSummary()` 仅统计状态 1-2遗漏 3(处理中) 和 4(已办结) | **P1** | ServiceImpl:244-253 |
| 5 | `relatedRules`/`relatedLawClauses` 为 CLOB(JSON) 字符串,前端需 JSON.parse | **P2** | ServiceImpl:181,183 |
| 6 | Entity 缺少 `@DS("master")` | **P2** | Entity |
| 7 | `generatedBy` 硬编码 `"系统管理员"` | **P2** | ServiceImpl:191 |
| 8 | `aggregateRuleInfo()` N+1 查询(循环内 selectById | **P2** | ServiceImpl:276-287 |
| 9 | `buildRulesJson`/`buildLawClausesJson` 手动拼 JSON字段值含引号会破坏格式 | **P3** | ServiceImpl:293-355 |
| 10 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
#### 问题汇总: P0×1, P1×3, P2×4, P3×2 = **10**
---
### CW-4 线索转办 — 检查完成
**检查范围**: 14 个 Java 文件 + 1 个 DDL 文件
#### L1 接口存在性
联调指南 13 个接口全部存在 ✅
#### L2/L3/L4/L6 汇总
| # | 问题 | 严重程度 | 位置 |
|---|------|---------|------|
| 1 | 6 个 POST 接口缺少 `@RequestBody`query/submit/pending-clues.query/status-update/urge/withdraw | **P0** | Controller:51,75,105,123,129,135 |
| 2 | `submitTransfer()` 未返回转办记录 ID | **P1** | ServiceImpl:175 |
| 3 | 2 个 Entity 缺少 `@DS("master")` | **P2** | Entity |
| 4 | `transferPerson` 硬编码 `"系统管理员"` | **P2** | ServiceImpl:152 |
| 5 | `departmentList`/`personList` 返回硬编码模拟数据TODO 对接组织架构) | **P2** | ServiceImpl:198-231 |
| 6 | `queryList` 列表查询存在 N+1每条记录 selectById 查线索编码) | **P2** | ServiceImpl:81-84 |
| 7 | Controller 缺少 `log.info("[OK]")` | **P3** | Controller 全文件 |
| 8 | `AssertUtils.isNotNull` message 不生效 | **P3** | ServiceImpl:139,293,335,378 |
状态流转校验完整transferred→processing→completed/failed✅。撤回回退线索状态 ✅。`@DSTransactional` 正确使用 ✅。
#### 问题汇总: P0×1, P1×1, P2×5, P3×2 = **9**
---
## 全模块检查总结
| 模块 | P0 | P1 | P2 | P3 | 合计 |
|------|----|----|----|----|------|
| BS-1 大屏管理 | 3 | 2 | 5 | 3 | 13 |
| LB-1 法律法规 | 3 | 3 | 2 | 3 | 11 |
| MR-1 监测规则 | 3 | 2 | 4 | 6 | 15 |
| AM-1 录屏设置 | 1 | 2 | 2 | 2 | 7 |
| AM-2 随机录屏 | 1 | 0 | 1 | 1 | 3 |
| AM-3 广告监控 | 2 | 1 | 2 | 2 | 7 |
| CW-1 固化取证 | 1 | 1 | 2 | 2 | 6 |
| CW-2 规则关联 | 1 | 0 | 2 | 1 | 4 |
| CW-3 线索生成 | 1 | 3 | 4 | 2 | 10 |
| CW-4 线索转办 | 1 | 1 | 5 | 2 | 9 |
| **合计** | **17** | **15** | **29** | **24** | **85** |
### 跨模块共性问题(高频模式)
#### 模式 1POST 接口缺少 @RequestBodyP0影响全部模块
所有模块的 POST 接口query/save/update 等)均缺少 `@RequestBody` 注解。前端使用 Axios 发送 JSON body 时参数全部为空。
**修复方案**:统一在所有 POST 接口的对象参数前添加 `@RequestBody`。对于简单参数String id, Integer status使用 `@RequestBody Map<String, Object>``@RequestParam`
#### 模式 2save() 不返回新建实体 IDP1影响 7 个模块)
所有新增接口返回 `RestResult.ok()` 而非 `RestResult.ok(entity.getId())`。前端无法获取新创建记录的 ID。
#### 模式 3Entity 缺少 @DS("master")P2影响全部 10 个模块)
所有 Entity 仅标注 `@TableName(schema = "OARMS")` 但缺少 `@DS("master")`。因 master 为 primary 数据源暂时不影响运行,但不符合开发规范。
#### 模式 4操作人硬编码P2影响 MR-1/CW-2/CW-3/CW-4
所有写入操作的操作人operator/generatedBy/transferPerson/associatedBy硬编码为 `"系统管理员"`,未从登录用户获取。
#### 模式 5手动拼接 JSON 字符串P3影响 MR-1/CW-3
`buildSnapshot`/`buildRulesJson`/`buildLawClausesJson` 使用 StringBuilder 拼接 JSON字段值含特殊字符时会破坏格式。应使用 JSON 库序列化。
#### 模式 6Controller 缺少日志P3影响全部模块
所有 Controller 方法未按规范输出 `log.info("[OK] ...")` 日志。
#### 模式 7BeanUtils.copyProperties null 覆盖P2影响 5 个模块)
update 方法中 `BeanUtils.copyProperties(req, entity)` 会用 req 中的 null 字段覆盖 entity 的已有值。
---
## 代码结构发现
### 模块对应关系(计划 vs 实际)
| 计划阶段 | 计划模块 | SQL DDL | SQL 初始数据 | Java 代码层 | 状态 |
|----------|----------|---------|-------------|-------------|------|
| Phase 1 | BS-1 大屏基础信息管理 | ✅ V1.0.0__BS_screen_ddl.sql | ✅ V1.0.0__BS_screen_init_data.sql | ✅ screen (Entity/Query/Req/VO/Mapper/Service/Controller) | ✅ 完成 |
| Phase 2 | LB-1 法律法规管理 | ✅ V2.0.0__LB_law_ddl.sql | ✅ V2.0.0__LB_law_init_data.sql | ✅ law (Entity/Query/Req/Mapper/Service/Controller) | ✅ 完成 |
| Phase 3 | MR-1 监测规则管理 | ✅ V6.0.0__MR_monitoring_rule_ddl.sql | ✅ V6.0.0__MR_monitoring_rule_init_data.sql | ✅ rule (Entity×3/Query/Req/VO/Mapper×3/Service/Controller) | ✅ 完成 |
| Phase 4 | AM-1 录屏设置管理 | ✅ V3.0.0__AM_recording_config_ddl.sql | ❌ 无初始数据 | ✅ monitor.config (Entity/Query/Req/Mapper/Service/Controller) | ✅ 完成 |
| Phase 5 | AM-2 随机录屏 | ✅ V4.0.0__AM_recording_task_ddl.sql | ❌ 无初始数据 | ✅ monitor.task (Entity×2/Query/Mapper×2/Service/Controller) | ✅ 完成 |
| Phase 6 | AM-3 广告画面监控 | ✅ V5.0.0__AM_monitor_record_ddl.sql | ❌ 无初始数据 | ✅ monitor.record (Entity/Query/Req/Mapper/Service/Controller) | ✅ 完成 |
| Phase 7 | CW-1 固化取证 | ✅ V7.0.0__CW_evidence_ddl.sql | ❌ 无初始数据 | ✅ evidence.record (Entity×2/Query/Req/VO/Mapper×2/Service/Controller) | ✅ 完成 |
| Phase 8 | CW-2 规则关联 | ✅ V8.0.0__CW_evidence_rule_relation_ddl.sql | ❌ 无初始数据 | ✅ evidence.relation (Entity/Query/Req/Mapper/Service/Controller) | ✅ 完成 |
| Phase 9 | CW-3 线索生成 | ✅ V9.0.0__CW_monitoring_clue_ddl.sql | ❌ 无初始数据 | ✅ evidence.clue (Entity×2/Query/VO/Mapper×2/Service/Controller) | ✅ 完成 |
| Phase 10 | CW-4 线索转办 | ✅ V10.0.0__CW_clue_transfer_ddl.sql | ❌ 无初始数据 | ✅ evidence.transfer (Entity×2/Query/Req/VO/Mapper×2/Service/Controller) | ✅ 完成 |
### 关键发现
1. **SQL 版本号与计划阶段不一致**: SQL 文件版本号 (V1~V10) 与计划阶段 (Phase 1~10) 顺序不同。MR-1 监测规则在计划中是 Phase 3但 SQL 编号为 V6。这不影响功能但说明 SQL 文件是按模块类别分组而非按依赖顺序编号。
2. **无 Mapper XML 文件**: 所有模块使用 MyBatis-Plus 注解方式,没有 XML mapper 文件,这是正常的。
3. **初始数据**: 仅 BS-1、LB-1、MR-1 有初始数据 SQL其余模块无需预置数据合理
4. **编译状态**: 代码已通过 git commit `c06a4e5` 提交commit 信息为 "feat: OARMS 全模块后端代码 + DM8 数据库适配"。
### 技术栈确认
- 框架: Spring Boot + MyBatis-Plus
- 数据库: DM8达梦数据库版本 `--03134283914-20220901-168571-20009`
- 权限: Sa-TokenStpInterfaceImpl 存在)
- 项目结构: modules/{模块}/{子模块}/{layer}
### 数据源架构决策2026-05-18
项目配置了两个数据源,共用同一 DM8 实例 `172.22.80.70:15236`
| 数据源名 | Schema | 用途 | 决策 |
|----------|--------|------|------|
| `master` | OARMS | 业务数据(全部 17 张业务表) | 保留 |
| `youfool` | YOUFOOL | 框架 restLog接口访问日志`RestLogServiceImpl` 硬编码 `@DS("youfool")` | 保留 |
**决策**: 保持现状不合并。框架代码不可修改youfool 数据源是框架层强制依赖。
### PRD vs 后端代码覆盖分析2026-05-18
#### 比对方法
读取每个模块的 `S4-API设计.md`,逐条对照后端 Controller 中实际定义的接口。
#### 整体结论
- **10 个模块全部有基础 CRUD 后端代码**Entity/Mapper/Service/Controller
- **路径命名风格不一致**:后端统一用单数名词(`/api/screen`PRD 用复数(`/api/screens`
- **HTTP 方法不一致**:后端几乎全用 POSTPRD 规范使用 RESTful 风格PUT/DELETE
- **高级功能接口大量缺失**
#### 逐模块覆盖详情
##### BS-1 大屏基础信息管理
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/screens/query | 列表查询 | ✅ |
| POST /api/screens | 新增 | ✅ (路径 /api/screen/save) |
| PUT /api/screens/{id} | 编辑 | ✅ (路径 /api/screen/update) |
| GET /api/screens/{id} | 详情 | ✅ (路径 /api/screen/detail) |
| DELETE /api/screens/{id} | 删除 | ✅ (路径 /api/screen/remove) |
| PUT /api/screens/{id}/status | 状态变更 | ❌ 未实现 |
| GET /api/screens/export | 导出 | ❌ 未实现 |
| POST /api/screens/import | 批量导入 | ❌ 未实现 |
| GET /api/screens/import-template | 下载导入模板 | ❌ 未实现 |
| GET /api/screens/{id}/histories | 历史版本列表 | ❌ 未实现 |
| GET /api/screens/check-code | 编码唯一校验 | ❌ 未实现 |
| GET /api/screens/check-address | 地址唯一校验 | ❌ 未实现 |
##### LB-1 法律法规管理
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/law-clauses/query | 列表查询 | ✅ |
| POST /api/law-clauses | 新增 | ✅ (路径 /api/law-clause/save) |
| PUT /api/law-clauses/{id} | 编辑 | ✅ (路径 /api/law-clause/update) |
| GET /api/law-clauses/{id} | 详情 | ✅ (路径 /api/law-clause/detail) |
| DELETE /api/law-clauses/{id} | 删除 | ✅ (路径 /api/law-clause/remove) |
| PUT /api/law-clauses/{id}/repeal | 废止条款 | ❌ 未实现 |
| GET /api/law-clauses/check-clause-number | 条款号唯一校验 | ❌ 未实现 |
| GET /api/law-clauses/effective | 已生效条款列表 | ❌ 未实现 |
##### MR-1 监测规则管理
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/monitoring-rules/query | 列表查询 | ✅ |
| POST /api/monitoring-rules | 新增 | ✅ |
| PUT /api/monitoring-rules/{id} | 编辑 | ✅ (POST /update) |
| GET /api/monitoring-rules/{id} | 详情 | ✅ (GET /detail) |
| DELETE /api/monitoring-rules/{id} | 删除 | ✅ (POST /remove) |
| PUT /api/monitoring-rules/{id}/toggle-status | 切换启用状态 | ✅ (POST /toggle-status) |
| GET /api/monitoring-rules/check-name | 名称唯一校验 | ✅ |
| GET /api/monitoring-rules/enabled | 已启用规则列表 | ✅ |
| GET /api/monitoring-rules/{id}/histories | 操作历史 | ❌ 未实现(详情接口已含历史) |
| POST /api/monitoring-rules/export | 导出Excel | ❌ 未实现 |
##### AM-1 录屏设置管理
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/recording-configs/query | 列表查询 | ✅ |
| POST /api/recording-configs | 新增 | ✅ |
| PUT /api/recording-configs/{id} | 编辑 | ✅ (POST /update) |
| GET /api/recording-configs/{id} | 详情 | ✅ |
| PUT /api/recording-configs/{id}/status | 状态变更 | ❌ 未实现 |
| GET /api/screens/available | 可配置大屏列表 | ✅ (路径不同) |
##### AM-2 随机录屏
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/recording-tasks/query | 列表查询 | ✅ |
| GET /api/recording-tasks/{id} | 详情 | ✅ |
##### AM-3 广告画面监控
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/monitor-records/query | 列表查询 | ✅ |
| GET /api/monitor-records/{id} | 详情 | ✅ |
| PUT /api/monitor-records/{id}/start | 开始监控 | ✅ |
| PUT /api/monitor-records/{id}/judge | 监控判定 | ✅ |
##### CW-1 固化取证
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/evidence-records/query | 列表查询 | ✅ |
| GET /api/evidence-records/{id} | 详情 | ✅ |
| POST /api/evidence-records | 保存取证 | ✅ |
| GET /api/evidence-records/{id}/status-history | 状态历史 | ❌ 未实现(详情接口已含) |
| GET /api/evidence-records/{id}/download | 下载地址 | ❌ 未实现 |
| GET /api/evidence-records/{id}/play | 播放地址 | ❌ 未实现 |
##### CW-2 规则关联
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| GET /api/evidence-rule-relations | 查询已关联规则 | ✅ |
| POST /api/evidence-rule-relations | 关联规则 | ✅ |
##### CW-3 线索生成
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/monitoring-clues/query | 列表查询 | ✅ |
| GET /api/monitoring-clues/{id} | 详情 | ✅ |
| POST /api/monitoring-clues | 生成线索 | ✅ |
| GET /api/evidence-records/{id}/clue-preview | 线索预览 | ❌ 未实现 |
| GET /api/monitoring-clues/status-summary | 状态统计 | ❌ 未实现 |
##### CW-4 线索转办
| PRD 接口 | 功能 | 后端状态 |
|----------|------|---------|
| POST /api/clue-transfer/query | 转办记录列表 | ✅ |
| GET /api/clue-transfer/{id} | 转办详情 | ✅ |
| POST /api/clue-transfer/submit | 提交转办 | ✅ |
| GET /api/clue-transfer/districts | 区域列表 | ❌ 未实现 |
| GET /api/clue-transfer/districts/{code}/departments | 部门列表 | ❌ 未实现 |
| GET /api/clue-transfer/departments/{id}/persons | 人员列表 | ❌ 未实现 |
| GET /api/clue-transfer/clues/{id}/disposal-feedback | 处置反馈 | ❌ 未实现 |
#### 缺失接口汇总
> 注:下表中标记 ❌ 的接口已在 2026-05-18 的"缺失接口补齐"和"CW-4 完善"中全部实现。此表保留作为历史对照。
| 类别 | 原缺失数 | 当前状态 |
|------|---------|---------|
| 导入/导出/模板下载 | 3 | ✅ 已补齐 |
| 唯一性校验 | 2 | ✅ 已补齐 |
| 状态变更/废止 | 2 | ✅ 已补齐 |
| 历史版本 | 1 | ✅ 已补齐 |
| 文件下载/播放 | 2 | ✅ 已补齐 |
| 级联选择 | 3 | ✅ 已补齐 |
| 线索预览/统计 | 2 | ✅ 已补齐 |
| 处置反馈 | 1 | ✅ 已补齐 |
| CW-4 业务闭环 | 6 | ✅ 已补齐pending-clues/status-update/urge/withdraw/operation-logs |
---
### PRD vs 后端代码详细差异分析2026-05-18 更新)
> 基础 CRUD 和 P0-P3 补齐接口均已实现并通过端到端测试。以下仅列出**仍然存在的差异**。
#### 一、风格差异(不影响功能)
| 项目 | PRD 要求 | 后端实现 | 影响 |
|------|---------|---------|------|
| 路径命名 | 复数名词 `/api/screens` | 单数名词 `/api/screen` | 不影响 |
| HTTP 方法 | RESTfulPUT/DELETE | 统一 POST | 不影响 |
| 状态枚举值 | 字符串 "RECORDING"/"COMPLETED" | 数字 1/2/3 | 不影响 |
| 分页默认大小 | 20 条/页 | 10 条/页 | 不影响 |
| API 前缀 | 部分 PRD 要求 `/api/cw/` | 无 `/cw/` 前缀 | 不影响 |
#### 二、缺失的业务逻辑(需补充)
##### AM-1 录屏设置
- **唯一性校验**PRD 要求同一大屏只能有一条配置,后端未在 save/update 中校验
- **时间范围校验**PRD 要求录屏时间必须在广告播放时间段内,后端未实现
##### AM-2 随机录屏
- **查询条件缺失**:缺少 `district`(区域)和 `screenName`(大屏名称模糊匹配)筛选条件
- **时间范围限制**PRD 要求最大查询范围不超过 90 天,后端未限制
##### AM-3 广告画面监控
- **查询条件缺失**缺少时间范围start_time/end_time、监控人员monitor_person筛选
- **默认状态过滤**PRD 要求默认只查询未归档记录,后端未实现
- **并发控制**PRD 要求同一记录只能由一人监控,后端未实现
- **自动联动**PRD 要求判定为违法时自动触发 CW-1 取证流程,后端未实现
##### CW-1 固化取证
- **状态历史独立接口**PRD 要求 `GET /evidence-records/{id}/status-history`,当前详情接口已含但无独立入口
- **关联上下文接口**PRD 要求 `GET /monitor-records/{id}/evidence-context`(来源监控记录关联信息),后端未实现
##### CW-2 规则关联
- **搜索可关联规则**PRD 要求搜索可关联的监测规则列表,当前只能在 MR-1 的 enabled 接口获取
##### CW-3 线索生成
- **线索生成日志**PRD 要求 `GET /monitoring-clues/{id}/generation-logs`,后端未实现独立接口
- **广告主补充**PRD 要求线索确认时可补充广告主信息,后端 generate 接口未支持
#### 三、缺失的通用功能
| 功能 | 涉及模块 | 说明 |
|------|---------|------|
| 权限控制 | 全部 | PRD 定义了市局/区局角色数据范围过滤,后端未实现 |
| 关联对象返回 | AM-1/2/3, CW-1 | PRD 要求返回 screen_info/config_info/video_info 嵌套对象,后端返回平铺字段 |
| 状态中文名 | 全部 | PRD 要求返回 `xxx_text` 中文字段(如 task_status_text后端未实现 |
| 归档标志 | AM-3 | PRD 要求 archive_flag 字段区分已归档/未归档,后端无此字段 |
#### 四、CW-4 已超出 PRD 的实现
以下接口为后端主动扩展PRD 中未要求但已实现:
| 接口 | 说明 |
| 项目 | 原因 |
|------|------|
| POST /api/clue-transfer/status-update | 外部系统回调状态流转 |
| POST /api/clue-transfer/urge | 催办 |
| POST /api/clue-transfer/withdraw | 撤回 |
| GET /api/clue-transfer/pending-clues/query | 待转办线索列表 |
| GET /api/clue-transfer/pending-clues/detail | 待转办线索详情 |
| GET /api/clue-transfer/operation-logs | 操作日志独立查询 |
### 框架 API 发现2026-05-18 编译修复过程中)
#### SuperEntity框架基类
- **位置**: `com.chinaweal.youfool.framework.springboot.mybatis.plus.SuperEntity`
- **不是泛型类**,直接 `extends SuperEntity` 即可
- 提供字段: `createBy`, `createTime`, `updateBy`, `updateTime`, `createName`, `updateName`
- 自动填充策略: INSERT 时填充 createBy/createTime, INSERT_UPDATE 时填充 updateBy/updateTime
#### AssertUtils断言工具
- **位置**: `com.chinaweal.youfool.framework.springboot.common.util.AssertUtils`
- `isTrue(boolean, ResultCode, Object... params)` — 第二个参数是 ResultCode 枚举,不是 String
- `isNotNull(Object...)` — 无消息参数版本,使用 BaseResultCode.PARAM_NOT_COMPLETE
- `isNotBlank(String...)` — 无消息参数版本,使用 BaseResultCode.PARAM_IS_BLANK
- `isNotBlank(String, String)` — 带消息参数的重载varargs 导致编译通过)
#### RestResult统一返回
- **位置**: `com.chinaweal.youfool.framework.springboot.rest.RestResult`
- `ok()` / `ok(T data)` — 成功返回
- `error(ResultCode)` / `error(ResultCode, String msg)` / `error(ResultCode, T data)` — 错误返回
- **没有 `fail()` 方法**,统一使用 `error()`
#### BaseResultCode常用错误码
- `SUCCESS` — 成功
- `PARAM_IS_INVALID` — 参数无效
- `PARAM_NOT_COMPLETE` — 参数不完整
- `PARAM_IS_BLANK` — 参数为空
| 前端调用不存在的 6 个接口 | 属于功能缺失(需评估是否需要实现),非命名问题 |
| ClueTransferController 多层嵌套路径 | 功能正常,低优先级风格问题 |
| 前端页面组件命名 | API 层修复后页面自然跟随 |

View File

@ -1,349 +1,59 @@
# OARMS 开发进度日志
# OARMS 命名规范审查 — 进度日志
## 当前状态
**阶段**: Phase 5 已完成,待用户确认修复方案
**进度**: 审查阶段全部完成
---
## 审查进度
| 阶段 | 状态 | 发现数 | 备注 |
|------|------|--------|------|
| Phase 1: DB→Entity→DTO | ✅ 完成 | 2 类DDL 大写 + 多余注解) | 后端全链路命名一致 |
| Phase 2: Controller API 路径 | ✅ 完成 | 1 处单复数不一致 | 其余均为 kebab-case |
| Phase 3: 前端 API 文件 | ✅ 完成 | 3 类重大问题 | 路径不匹配+snake_case+函数参数 |
| Phase 4: 前端页面组件 | ⏭️ 跳过 | — | 与 Phase 3 本质一致 |
| Phase 5: 汇总修复建议 | ✅ 完成 | — | 推荐方案 A前端适配后端 |
| Phase 6: 执行修复 | 待确认 | — | |
---
## 审查发现总结
### 后端(问题少,已基本规范)
| 问题类型 | 数量 | 严重度 |
|---------|------|--------|
| DDL CREATE TABLE 表名小写 | 17 张表 | P3 规范 |
| 多余 @TableField 注解 | 6 处 | P3 整洁 |
| Controller 单复数不一致 | 1 处 | P2 风格 |
### 前端(系统性不一致)
| 问题类型 | 数量 | 严重度 |
|---------|------|--------|
| API 路径不匹配 | ~58/64 端点 | P0 阻塞 |
| JSDoc 参数名 snake_case | ~90+ 处 | P0 阻塞 |
| JS 函数参数 snake_case | 15 处 | P1 |
| 调用不存在的后端接口 | 6 个 | P1 功能缺失 |
### 修复方案
推荐方案 A前端适配后端后端 85 个问题已修复并测试通过,不宜大改)
---
## 会话记录
### 2026-05-21 — 全模块系统检查(仅记录,不修复)
### 2026-05-22 — 全链路命名规范审查
**操作**: 按 6 层检查标准L1-L6+ 8 大高频错误模式,逐模块串行检查全部 10 个模块。
**检查依据**: docs/前后端联调指南.md、docs/backend-module-dev-guide.md、docs/fix/错题库
**结果**: 共发现 **85 个问题**P0×17, P1×15, P2×29, P3×24
| 模块 | P0 | P1 | P2 | P3 | 合计 | 关键发现 |
|------|----|----|----|----|------|---------|
| BS-1 | 3 | 2 | 5 | 3 | 13 | POST 缺 @RequestBody |
| LB-1 | 3 | 3 | 2 | 3 | 11 | repeal() 设 status=0 应为 2 |
| MR-1 | 3 | 2 | 4 | 6 | 15 | operator 硬编码、手动拼 JSON |
| AM-1 | 1 | 2 | 2 | 2 | 7 | save 不返回 ID |
| AM-2 | 1 | 0 | 1 | 1 | 3 | 最干净模块 |
| AM-3 | 2 | 1 | 2 | 2 | 7 | 自动取证异常被吞 |
| CW-1 | 1 | 1 | 2 | 2 | 6 | download/play 占位路径 |
| CW-2 | 1 | 0 | 2 | 1 | 4 | associatedBy 硬编码 |
| CW-3 | 1 | 3 | 4 | 2 | 10 | statusSummary 遗漏 2 个状态 |
| CW-4 | 1 | 1 | 5 | 2 | 9 | 部门/人员返回模拟数据 |
**跨模块共性问题**:
1. POST 接口缺 @RequestBody(全部模块)
2. save() 不返回新建 ID7 个模块)
3. Entity 缺 @DS("master")(全部模块)
4. 操作人硬编码 "系统管理员"4 个模块)
5. 手动拼接 JSON 字符串MR-1/CW-3
6. Controller 缺 log.info 日志(全部模块)
7. BeanUtils.copyProperties null 覆盖5 个模块)
**状态**: 检查完成,所有问题记录到 findings.md未做任何修复。
---
## 会话记录(历史)
### 2026-05-18 — 初始状态验证
**操作**: 验证 task_plan.md 中 10 个阶段的实际执行情况
**结论**: 全部 10 个阶段均已完成。
**证据**:
- 13 个 SQL DDL 文件已生成(覆盖全部计划表)
- 3 个初始数据 SQL 已生成BS-1、LB-1、MR-1
- 10 个 Controller 已实现Screen/Law/MonitoringRule/RecordingConfig/RecordingTask/MonitorRecord/EvidenceRecord/EvidenceRuleRelation/MonitoringClue/ClueTransfer
- 16 个 Mapper 已实现
- 11 个 Service 接口 + 实现类已实现
- 全部 Entity/Query/Req/VO 已到位
- Git commit `c06a4e5` 已包含所有代码
**验证方式**: 通过文件系统扫描确认。
### 2026-05-18 — 编译验证与修复
**问题1**: Checkstyle 检出 8 个未使用 import
- LoginController.java: RSAUtil, ResultCode
- RecordingTaskServiceImpl.java: HashMap
- IRecordingTaskService.java: AlertNotificationEntity
- MonitoringRuleServiceImpl.java: ArrayList
- ScreenEntity.java: JsonFormat, DateUtil
- ScreenServiceImpl.java: ArrayList
**问题2**: SuperEntity 不是泛型类13 个 Entity 使用了 `SuperEntity<XXX>` 错误格式
- 批量替换为 `extends SuperEntity`
**问题3**: `AssertUtils.isTrue(condition, String)` 签名不匹配,需改为 `AssertUtils.isTrue(condition, ResultCode, params...)`
- MonitoringClueServiceImpl: 2 处
- EvidenceRecordServiceImpl: 1 处
- EvidenceRuleRelationServiceImpl: 3 处
- ClueTransferServiceImpl: 1 处
**问题4**: `LawClauseEntity.getClauseName()` 不存在,应为 `getLawName()`
- MonitoringClueServiceImpl: 1 处
**结果**: 97 个源文件全部编译通过BUILD SUCCESS。
### 2026-05-18 — DM8 数据库连通性验证
**操作**: 使用 JDBC 直连测试 DM8 数据库
**连接参数**:
- URL: `jdbc:dm://172.22.80.70:15236?schema=OARMS`
- 用户: SYSDBA
- 驱动版本: DmJdbcDriver18 8.1.1.193
**结果**:
- 连接成功 ✅
- DM8 版本: `--03134283914-20220901-168571-20009`
- OARMS schema 已有 **17 张表**,覆盖全部计划表:
| 表名 | 对应模块 |
|------|---------|
| BS_SCREEN | Phase 1 大屏基础信息 |
| BS_SCREEN_HISTORY | Phase 1 大屏历史 |
| LB_LAW_CLAUSE | Phase 2 法律法规 |
| MR_MONITORING_RULE | Phase 3 监测规则 |
| MR_RULE_LAW_CLAUSE_REL | Phase 3 规则法条关联 |
| MR_RULE_OPERATION_HISTORY | Phase 3 规则操作历史 |
| AM_RECORDING_CONFIG | Phase 4 录屏设置 |
| AM_RECORDING_TASK | Phase 5 录屏任务 |
| AM_ALERT_NOTIFICATION | Phase 5 告警通知 |
| AM_MONITOR_RECORD | Phase 6 广告画面监控 |
| CW_EVIDENCE_RECORD | Phase 7 固化取证 |
| CW_EVIDENCE_STATUS_HISTORY | Phase 7 取证状态历史 |
| CW_EVIDENCE_RULE_RELATION | Phase 8 规则关联 |
| CW_MONITORING_CLUE | Phase 9 线索生成 |
| CW_CLUE_GENERATION_LOG | Phase 9 线索生成日志 |
| CW_CLUE_TRANSFER_RECORD | Phase 10 线索转办 |
| CW_TRANSFER_OPERATION_LOG | Phase 10 转办操作日志 |
**结论**: DDL 已全部执行到 DM8 数据库,无需重新建表。
### 2026-05-18 — PRD vs 后端代码覆盖比对
**操作**: 读取 5 个域 10 个模块的 S4-API设计.md逐条对照后端 Controller 代码
**操作**: 按 Phase 1-5 逐阶段审查后端 10 个模块 + 前端 10 个 API 文件
**结论**:
- **基础 CRUD 全部到位**: 10 个模块的核心增删改查接口均已实现
- **路径风格差异**: 后端用单数名词(/api/screenPRD 用复数(/api/screens— 不影响功能
- **HTTP 方法差异**: 后端统一 POSTPRD 规范 RESTfulPUT/DELETE— 不影响功能
- **高级功能缺失约 16 个接口**: 导入导出、文件下载播放、级联选择、唯一性校验等
- 后端命名规范良好,仅 DDL 大写和冗余注解等低优先级问题
- 前端存在系统性不一致RESTful 复数风格 vs 后端扁平 POST 风格,参数名 snake_case vs camelCase
- 前后端对接完全不通,需前端全面适配后端
**各模块覆盖率**:
- BS-1: 5/12 = 42%(缺导入导出、历史版本、校验)
- LB-1: 5/8 = 63%(缺废止、校验、已生效列表)
- MR-1: 8/10 = 80%(缺导出)
- AM-1: 5/6 = 83%(缺状态变更)
- AM-2: 2/2 = 100%
- AM-3: 4/4 = 100%
- CW-1: 3/6 = 50%(缺下载播放)
- CW-2: 2/2 = 100%
- CW-3: 3/5 = 60%(缺预览统计)
- CW-4: 3/10 = 30%(缺级联选择、处置反馈)
### 2026-05-18 — 缺失接口补齐计划制定
**操作**: 根据覆盖比对结果,按业务优先级分 4 批规划 20 个缺失接口
**批次规划**:
- P0 核心状态流转: 3 个接口BS-1 状态变更、AM-1 状态变更、LB-1 废止)
- P1 前端页面必需: 6 个接口(校验、下拉列表、预览、统计)
- P2 级联选择器: 4 个接口(区域/部门/人员列表、处置反馈)
- P3 文件操作 & 导入导出: 7 个接口(下载、播放、导入、导出、模板、历史)
**状态**: 计划已制定,待执行
### 2026-05-18 — 缺失接口补齐执行
**操作**: 按优先级分 4 批依次实现 20 个缺失接口
**P0 核心状态流转** (3 个):
1. `POST /api/screen/toggle-status` — 大屏状态变更 ✅
2. `POST /api/recording-config/toggle-status` — 录屏配置状态变更 ✅
3. `POST /api/law-clause/repeal` — 法律条款废止 ✅
**P1 前端页面必需** (6 个):
4. `GET /api/screen/check-code` — 编码唯一校验 ✅
5. `GET /api/screen/check-address` — 地址唯一校验 ✅
6. `GET /api/law-clause/check-clause-number` — 条款号唯一校验 ✅
7. `GET /api/law-clause/effective` — 已生效条款列表 ✅
8. `GET /api/monitoring-clue/clue-preview` — 线索生成前预览 ✅
9. `GET /api/monitoring-clue/status-summary` — 线索状态统计 ✅
**P2 级联选择器** (4 个):
10. `GET /api/clue-transfer/targets/districts` — 区域列表 ✅
11. `GET /api/clue-transfer/targets/departments` — 部门列表 ✅
12. `GET /api/clue-transfer/targets/persons` — 人员列表 ✅
13. `GET /api/clue-transfer/clues/{clueId}/disposal-feedback` — 处置反馈 ✅
**P3 文件操作 & 导入导出** (7 个):
14. `GET /api/evidence-record/download` — 取证视频下载地址 ✅
15. `GET /api/evidence-record/play` — 取证视频播放地址 ✅
16. `GET /api/screen/export` — 导出大屏数据 ✅
17. `POST /api/screen/import` — 批量导入大屏 ✅
18. `GET /api/screen/import-template` — 下载导入模板 ✅
19. `GET /api/screen/histories` — 大屏历史版本 ✅
20. `POST /api/monitoring-rules/export` — 导出规则 ✅
**新增文件**: `ScreenHistoryMapper.java`
**编译结果**: 98 个源文件 BUILD SUCCESS ✅
**注意事项**:
- CW-4 级联选择器的部门/人员数据为模拟数据TODO: 对接组织架构系统)
- CW-1 文件下载/播放 URL 为占位路径TODO: 对接文件存储系统)
### 2026-05-18 — 端到端接口测试
**问题1**: JDK 版本 25 不兼容,改为 21
- pom.xml 中 java.version/maven.compiler.source/target/compilerVersion 从 25 → 21
**问题2**: `spring-boot:run` 失败 — NoClassDefFoundError: SpringBootServletInitializer
- 根因spring-boot-maven-plugin 的 `<layout>ZIP</layout>` + `<includes>nothing</includes>` 导致 run 目标的 classpath 只包含 target/classes
- 解决:使用 `java -cp` 直接启动,绕过 maven plugin 的 classpath 过滤
**问题3**: DM8 连接初始化失败 — `dm.jdbc.driver.DMException: 第1行附近出现错误`
- 根因Druid validation-query 使用了 `select version()`DM8 不支持此语法
- 修复application.yml 中两个数据源的 validation-query 改为 `SELECT 1`
**问题4**: 所有写入操作失败 — `SaRetGenericFunction.run() is null`
- 根因Sa-Token 1.42.0 的 `SaSetValueInterface.get()` 存在 NPE`StpUtil.getSession()` 抛出 NullPointerException
- UserBaseServiceImpl.getCurrentUser() 只 catch 了 NotLoginExceptionNPE 直接传播到 MetaObjectHandler
- 修复:将 catch 从 `NotLoginException` 扩大为 `Exception`
- 同时删除了多余的 `NotLoginException` importCheckstyle 检出)
**测试结果**: 应用成功启动,共测试 30+ 个接口
| 模块 | 测试接口数 | 通过 | 失败 | 备注 |
|------|-----------|------|------|------|
| BS-1 大屏管理 | 10 | 10 | 0 | 新增需完整必填字段 |
| LB-1 法律法规 | 6 | 6 | 0 | |
| MR-1 监测规则 | 8 | 8 | 0 | |
| AM-1 录屏设置 | 4 | 4 | 0 | |
| AM-2 录屏任务 | 1 | 1 | 0 | |
| AM-3 广告监控 | 1 | 1 | 0 | |
| CW-1 固化取证 | 3 | 3 | 0 | |
| CW-2 规则关联 | 1 | 1 | 0 | |
| CW-3 线索生成 | 2 | 2 | 0 | |
| CW-4 线索转办 | 4 | 4 | 0 | |
**总通过率**: 40/40 = 100%(所有可用接口均正常响应)
### 2026-05-18 — CW-4 线索转办模块完善
**新增 6 个接口**7 个新文件 + 3 个修改文件,+435 行):
| # | 接口 | 说明 |
|---|------|------|
| 1 | POST /api/clue-transfer/pending-clues/query | 待转办线索列表clue_status=1 |
| 2 | GET /api/clue-transfer/pending-clues/detail | 待转办线索详情 |
| 3 | GET /api/clue-transfer/operation-logs | 转办操作日志 |
| 4 | POST /api/clue-transfer/status-update | 状态流转transferred→processing→completed/failed |
| 5 | POST /api/clue-transfer/urge | 催办 |
| 6 | POST /api/clue-transfer/withdraw | 撤回(线索回退到待转办) |
**新增文件**:
- PendingClueQuery.java, PendingClueVO.java, PendingClueDetailVO.java
- OperationLogVO.java
- TransferStatusUpdateReq.java, TransferUrgeReq.java, TransferWithdrawReq.java
**端到端测试结果**:
- 完整流转 transferred→processing→completed ✅
- 双表状态同步(线索 1→2→3→4
- 操作日志 4 条完整记录 ✅
- 催办记录日志 ✅
- 撤回后线索回退到 1 ✅
- 非法状态流转拦截 ✅
**提交**: `687eb9a` feat: CW-4 线索转办模块完善 — 新增6个接口覆盖完整业务闭环
### 2026-05-18 — PRD 业务逻辑差异补齐
**操作**: 按优先级分 4 批补齐 AM-1/AM-2/AM-3 的 PRD 业务逻辑差异
**批次 1: AM-3 广告画面监控** (修改 2 文件):
- MonitorRecordQuery 添加 startTime/endTime/monitorPerson/screenName 字段
- MonitorRecordServiceImpl.queryList 补充时间范围/监控人员/大屏名称筛选条件
- MonitorRecordServiceImpl.judgeMonitor 判定为违规(4)时自动创建取证记录
**批次 2: AM-2 随机录屏** (修改 2 文件):
- RecordingTaskQuery 添加 district/screenName 字段
- RecordingTaskServiceImpl 通过 ScreenMapper 两步关联查询
**批次 3: AM-1 录屏设置** (修改 1 文件):
- RecordingConfigServiceImpl save/update 添加录屏时间范围校验
- 校验 recordStartTime/recordEndTime 必须在大屏广告播放时间范围内
**批次 4: 低优先级通用改进** (修改 2 文件):
- AM-3 默认过滤已判定记录monitorStatus < 3
- AM-2 查询时间范围超过 90 天时拦截
**编译结果**: 全部通过 ✅
### 2026-05-22 — 85 个问题全量修复 + 端到端测试
**操作**: 按 P0→P1→P2→P3 优先级串行修复 findings.md 中记录的 85 个检查问题,修复后执行端到端测试。
**批次 1: P0 — POST 接口添加 @RequestBody17 处10 个 Controller** ✅
- 所有模块 POST 接口对象参数添加 `@RequestBody`
- 简单参数改为 `@RequestBody Map<String, Object>` / `Map<String, String>`
**批次 2: P1 — save 返回 ID + 业务逻辑修复15 处)** ✅
- 7 个模块 save/generateClue/submitTransfer 返回新建实体 ID14 文件)
- LB-1 repeal() effectiveStatus 0→2
- CW-3 statusSummary 补齐 4 个状态(待转办/已转办/处理中/已办结)
**批次 3: P2 — 跨模块通用修复29 处)** ✅
- 17 个 Entity 添加 `@DS("master")`
- 4 个模块 update() BeanUtils null 覆盖改为逐字段 null 判断
- 4 个模块操作人硬编码改为 `UserBaseService.getCurrentUser()` + 降级
- AM-3 autoCreateEvidence 移除异常吞没的 try-catch
- CW-3 N+1 查询改为批量查询selectBatchIds
- BS-1 ScreenDetailVO Date→LocalDateTime
**批次 4: P3 — 代码规范修复24 处)** ✅
- 10 个 Controller 共 73 个端点添加 `log.info("[OK] ...")` 日志
- 10 个 ServiceImpl 共 31 处 `AssertUtils.isNotNull(entity, "msg")` 清理为 `AssertUtils.isNotNull(entity)`
- 2 个文件手动拼接 JSON 改为 Jackson ObjectMapperMonitoringRuleServiceImpl + MonitoringClueServiceImpl
**批次 5: 编译验证** ✅
- `mvn clean compile` — 105 个源文件 BUILD SUCCESS
**批次 6: 端到端测试** ✅
| 模块 | 测试项 | 结果 | 关键验证 |
|------|--------|------|---------|
| BS-1 大屏 | save→detail→update→toggle→remove | ✅ 全通过 | save 返回 ID、部分更新不覆盖 null |
| LB-1 法律 | save→update→repeal→remove | ✅ 全通过 | repeal 后 effectiveStatus=2 |
| MR-1 规则 | save→toggle→remove | ✅ 全通过 | save 返回 ID |
| AM-1 录屏 | save→toggle→remove | ✅ 全通过 | save 返回 ID |
| AM-2 任务 | query | ✅ | @RequestBody 接收正常 |
| AM-3 监控 | query | ✅ | @RequestBody 接收正常 |
| CW-1 取证 | query | ✅ | save 需完整 DB 字段sourceMonitorPerson NOT NULL |
| CW-2 关联 | query-by-evidence | ✅ | |
| CW-3 线索 | status-summary | ✅ | 显示 4 个状态 + 汇总 |
| CW-4 转办 | submit→processing→completed→urge | ✅ | 完整流转、操作日志 4 条 |
| BS-1 校验 | check-code/check-address/histories | ✅ | |
| LB-1 校验 | effective/check-clause-number | ✅ | |
**总通过**: 所有核心接口均正常响应
**修复统计**: 85 个问题全部修复,涉及 50+ 个文件修改
---
## 阶段执行状态
| 阶段 | 状态 | 备注 |
|------|------|------|
| Phase 1: BS-1 大屏基础信息管理 | ✅ 完成 | DDL + 初始数据 + 全层代码 |
| Phase 2: LB-1 法律法规管理 | ✅ 完成 | DDL + 初始数据 + 全层代码 |
| Phase 3: MR-1 监测规则管理 | ✅ 完成 | DDL + 初始数据 + 全层代码含3个Entity/Mapper |
| Phase 4: AM-1 录屏设置管理 | ✅ 完成 | DDL + 全层代码 |
| Phase 5: AM-2 随机录屏 | ✅ 完成 | DDL + 全层代码含2个Entity/Mapper |
| Phase 6: AM-3 广告画面监控 | ✅ 完成 | DDL + 全层代码 |
| Phase 7: CW-1 固化取证 | ✅ 完成 | DDL + 全层代码含2个Entity/Mapper |
| Phase 8: CW-2 规则关联 | ✅ 完成 | DDL + 全层代码 |
| Phase 9: CW-3 线索生成 | ✅ 完成 | DDL + 全层代码含2个Entity/Mapper |
| Phase 10: CW-4 线索转办 | ✅ 完成 | DDL + 全层代码含2个Entity/Mapper |
## 待办事项
- [x] 执行编译验证mvn compile ✅ 2026-05-18 通过
- [x] 确认 DM8 数据库连接配置正确 ✅ 2026-05-18 连通
- [x] 确认 DDL 已实际执行到数据库 ✅ 2026-05-18 已确认 17 张表
**修复建议**: 方案 A前端适配后端修改 10 个前端 API 文件的路径和参数名

View File

@ -27,7 +27,7 @@ import java.util.Map;
*/
@Slf4j
@RestController
@RequestMapping("/api/monitoring-rules")
@RequestMapping("/api/monitoring-rule")
@AllArgsConstructor
@Tag(name = "监测规则管理")
public class MonitoringRuleController {

View File

@ -35,7 +35,6 @@ public class RuleOperationHistoryEntity extends SuperEntity {
@TableField("rule_id")
private String ruleId;
@TableField("operator")
private String operator;
@TableField("operation_type")

View File

@ -36,10 +36,8 @@ public class ScreenEntity extends SuperEntity {
@TableField("screen_name")
private String screenName;
@TableField("address")
private String address;
@TableField("district")
private String district;
@TableField("owner_unit")
@ -54,7 +52,6 @@ public class ScreenEntity extends SuperEntity {
@TableField("operator_contact")
private String operatorContact;
@TableField("advertiser")
private String advertiser;
@TableField("screen_spec")
@ -66,9 +63,7 @@ public class ScreenEntity extends SuperEntity {
@TableField("screen_status")
private Integer screenStatus;
@TableField("longitude")
private BigDecimal longitude;
@TableField("latitude")
private BigDecimal latitude;
}

View File

@ -58,7 +58,7 @@ knife4j:
# password: 123456
server:
port: ${PRJ_PORT:8080}
port: ${PRJ_PORT:8081}
servlet:
context-path: ${PRJ_CONTEXT_PATH:}
# Sa-Token配置

View File

@ -1,125 +1,90 @@
# OARMS 问题修复计划
# OARMS 全链路命名规范审查计划
## 目标
修复 findings.md 中记录的 85 个检查问题P0×17, P1×15, P2×29, P3×24修复后执行端到端测试
以命名映射规范(实体属性 → camelCase为基准对 gz-oarms 后端 + gz-oarms-web 前端进行全链路命名审查,发现并修复所有不一致的命名
## 修复原则
## 规范基准
- **按优先级串行修复**P0 → P1 → P2 → P3
- **跨模块共性问题批量处理**:同一模式一次修完所有模块
- 每个批次修复后编译验证
- 全部修复后启动应用执行端到端测试
| 层级 | 校验内容 | 规范要求 |
|------|---------|---------|
| 数据库 DDL | DM8 表名、字段名 | 表名 `bs_/lb_/mr_/am_/cw_` 前缀 + snake_caseDDL 中 COMMENT/INDEX 标识符大写 |
| 后端 Entity | Java 实体类属性名 + `@TableField` 注解 | camelCase`@TableField("snake_case")` 显式映射 DB |
| 后端 VO/Query/Req | DTO 类属性名 | camelCase与 Entity 属性名一致 |
| 后端 Controller | API 路径命名 | `/api/{kebab-case}`,方法路径 query/detail/save/update/remove |
| 前端 API 文件 | JS 请求参数/响应字段名 | camelCase与后端 JSON 返回字段 100% 一致 |
| 前端页面 | 组件变量、表单字段绑定 | camelCase与 API 字段一致 |
## 已知重大不一致(前置发现)
| 不一致项 | 前端现状 | 后端现状 | 影响 |
|---------|---------|---------|------|
| 参数字段命名 | snake_case`screen_name`、`page_num` | camelCase`screenName`、`pageNum` | 前后端字段无法映射 |
| API 路径风格 | `/api/recording-configs/query`(复数) | `/api/monitoring-clue/query`(单数) | 路径不匹配 |
| 域路径前缀 | `/api/cw/monitoring-clues/query` | `/api/monitoring-clue/query` | 路径不匹配 |
## 当前阶段
**状态**: 修复计划已制定,待执行
**当前批次**: —
**状态**: 审查执行中
**当前阶段**: Phase 1
## 修复批次6 批)
## 审查阶段6 个 Phase
### 批次 1P0 — POST 接口添加 @RequestBody17 处10 个 Controller
### Phase 1后端 DB→Entity→DTO 全链路审查10 个模块
所有模块的 POST 接口对象参数添加 `@RequestBody`。简单参数String id, Integer status改为 `@RequestBody Map<String, Object>`
逐模块检查DDL 字段名 ↔ Entity `@TableField` ↔ Entity 属性名 ↔ VO/Query/Req 属性名
| 文件 | 修改方法 |
|------|---------|
| ScreenController | queryList, save, update, remove, toggleStatus, importData |
| LawClauseController | queryList, save, update, remove, repeal |
| MonitoringRuleController | queryList, save, update, remove, toggleStatus, exportData |
| RecordingConfigController | queryList, save, update, remove, toggleStatus |
| RecordingTaskController | queryList |
| MonitorRecordController | queryList, judgeMonitor |
| EvidenceRecordController | queryList, save |
| EvidenceRuleRelationController | relateRules |
| MonitoringClueController | queryList, generateClue |
| ClueTransferController | queryList, submitTransfer, queryPendingClues, updateTransferStatus, urgeTransfer, withdrawTransfer |
| 模块 | DDL 文件 | Entity 数 | VO/Query/Req 数 |
|------|---------|----------|----------------|
| BS-1 | V1.0.0__BS_screen_ddl.sql | 2 | 5 |
| LB-1 | V2.0.0__LB_law_ddl.sql | 1 | 3 |
| MR-1 | V6.0.0__MR_monitoring_rule_ddl.sql | 3 | 4 |
| AM-1 | V3.0.0__AM_recording_config_ddl.sql | 1 | 3 |
| AM-2 | V4.0.0__AM_recording_task_ddl.sql | 2 | 1 |
| AM-3 | V5.0.0__AM_monitor_record_ddl.sql | 1 | 3 |
| CW-1 | V7.0.0__CW_evidence_ddl.sql | 2 | 4 |
| CW-2 | V8.0.0__CW_evidence_rule_relation_ddl.sql | 1 | 2 |
| CW-3 | V9.0.0__CW_monitoring_clue_ddl.sql | 2 | 2 |
| CW-4 | V10.0.0__CW_clue_transfer_ddl.sql | 2 | 6 |
对应 Service 接口和 ServiceImpl 的 remove/toggleStatus 等方法签名也需同步调整。
**校验规则**
1. DDL 字段名 → `@TableField`snake_case 完全匹配
2. Entity 属性名 → VO/Query/Req 属性名camelCase 完全匹配
3. DDL 中 COMMENT ON / CREATE INDEX 标识符大写
### 批次 2P1 — save 返回 ID + 业务逻辑修复15 处)
### Phase 2后端 Controller API 路径审查
#### 2a. save() 返回新建实体 ID7 个模块)
修改 Service 接口返回值从 `RestResult<?>``RestResult<String>`ServiceImpl 中返回 `entity.getId()`
检查 11 个 Controller 的 API 路径是否符合 `/api/{kebab-case}` 规范,方法路径是否使用 query/detail/save/update/remove 等动词。
| 模块 | 方法 |
|------|------|
| BS-1 | ScreenServiceImpl.save() |
| LB-1 | LawClauseServiceImpl.save() |
| MR-1 | MonitoringRuleServiceImpl.save() |
| AM-1 | RecordingConfigServiceImpl.save() |
| CW-1 | EvidenceRecordServiceImpl.save() |
| CW-3 | MonitoringClueServiceImpl.generateClue() |
| CW-4 | ClueTransferServiceImpl.submitTransfer() |
### Phase 3前端 API 文件审查10 个 API 文件)
#### 2b. 独立业务逻辑修复
校验前端 API 参数名与后端 JSON 字段的 camelCase 一致性:
- BS-1 大屏管理 API
- LB-1 法律法规 API
- MR-1 监测规则 API
- AM-1/2/3 广告监控 API3 个文件)
- CW-1/2/3/4 内容预警 API4 个文件)
| 模块 | 问题 | 修复 |
|------|------|------|
| LB-1 | repeal() 设 effectiveStatus=0 | 改为 2 |
| CW-3 | statusSummary() 仅统计 1-2 | 补充 3(处理中)、4(已办结) |
### Phase 4前端页面组件审查30+ 个 Vue 文件)
### 批次 3P2 — 跨模块通用修复29 处)
抽样检查表单字段绑定和组件变量命名是否为 camelCase。
#### 3a. Entity 添加 @DS("master")(全部 10 模块,~17 个 Entity
所有 Entity 类添加 `import com.baomidou.dynamic.datasource.annotation.DS;``@DS("master")`
### Phase 5汇总 + 修复建议
#### 3b. BeanUtils null 覆盖修复5 个模块)
update 方法中,对 req 的 null 字段不覆盖 entity 已有值。改用逐字段 set 或加 null 判断。
1. 按模块分组输出全部审查结果
2. 标记不符合规范的命名,说明违反规则
3. 给出修正建议
| 模块 | 位置 |
|------|------|
| BS-1 | ScreenServiceImpl.update() |
| LB-1 | LawClauseServiceImpl.update() |
| MR-1 | MonitoringRuleServiceImpl.update() |
| AM-1 | RecordingConfigServiceImpl.update() |
| CW-4 | ClueTransferServiceImpl queryListVO 转换) |
### Phase 6执行修复
#### 3c. 操作人硬编码修复4 个模块)
`UserBaseServiceImpl.getCurrentUser()` 获取当前用户,登录失败时降级为 `"系统管理员"`
根据 Phase 5 的建议逐模块修复命名不一致问题。
| 模块 | 位置 |
|------|------|
| MR-1 | saveOperationHistory() |
| CW-2 | relateRules() — associatedBy |
| CW-3 | generateClue() — generatedBy, saveGenerationLog() |
| CW-4 | submitTransfer() — transferPerson, saveOperationLog() |
## 补充说明
#### 3d. 其他 P2 修复
| 模块 | 问题 | 修复 |
|------|------|------|
| BS-1 | VO Date 类型不一致 | ScreenDetailVO 改为 LocalDateTime |
| AM-3 | autoCreateEvidence 异常被吞 | 去掉 try-catch让异常传播 |
| CW-3 | N+1 查询性能 | 批量查询替代循环 selectById |
### 批次 4P3 — 代码规范修复24 处)
#### 4a. Controller 添加 log.info10 个 Controller
所有接口方法入口添加 `log.info("[OK] 操作描述: key={}", value)`
#### 4b. AssertUtils.isNotNull 清理5+ 处)
移除 `AssertUtils.isNotNull(entity, "msg")` 中的 String 参数,改为纯 `AssertUtils.isNotNull(entity)`
#### 4c. 手动拼 JSON 改为工具类MR-1, CW-3
使用 Jackson ObjectMapper 替代 StringBuilder 拼接。
### 批次 5编译验证
```bash
JAVA_HOME="/d/Program Files/Java/jdk-21.0.11+10" \
/d/apache-maven-3.9.15/bin/mvn compile -Pcompany-nexus -Dcheckstyle.skip=true
```
### 批次 6端到端测试
1. 启动应用
2. 按模块逐个测试核心接口query/save/update/remove
3. 重点验证:@RequestBody JSON body 接收、save 返回 ID、repeal 状态值
4. 记录测试结果到 progress.md
- **Mapper XML**:项目中无 Mapper XML 文件,全部使用 MyBatis Plus 注解(`@TableField`、`@TableName`。XML 审查项跳过,替换为 `@TableField` 注解审查。
- **前端项目位置**`../gz-oarms-web/`
- **命名映射规范参考**`D:\chinaweal\gz-atms\gz-atms-web\docs\rules\Youfool-LLM 命名映射规范.md`
## 修复决策
- **P3 IScreenService 返回 RestResult 耦合问题**:暂不修改,改动太大且不影响功能
- **CW-4 部门/人员模拟数据**:保留 TODO不对接真实组织架构
- **CW-1 download/play 占位路径**:保留 TODO不对接文件存储
(审查过程中记录)