generated from youfool-project/youfool-prj-springboot3-template
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:
parent
ba49f7ecb8
commit
fb18992d52
|
|
@ -1,3 +1,5 @@
|
|||
/.idea
|
||||
/*.iml
|
||||
/target
|
||||
/.claude/
|
||||
/classpath.txt
|
||||
|
|
|
|||
71
CLAUDE.md
71
CLAUDE.md
|
|
@ -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`(Knife4j),Druid 监控:`/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 字段、数据库表映射及高频错误模式。
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
845
findings.md
845
findings.md
|
|
@ -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-1:DDL 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 个 Entity,6 处)
|
||||
|
||||
#### 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 所有方法返回 RestResult,Service 层与 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 定义废止应为 2(1=有效,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-1:API 路径全部不匹配(严重)
|
||||
|
||||
#### 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-2:JSDoc 参数名全部 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-3:JS 函数参数名 snake_case(15 处)
|
||||
|
||||
#### 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 参数名为 camelCase(10 个文件,~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 个 Entity,6 处)
|
||||
|
||||
#### 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** |
|
||||
|
||||
### 跨模块共性问题(高频模式)
|
||||
|
||||
#### 模式 1:POST 接口缺少 @RequestBody(P0,影响全部模块)
|
||||
所有模块的 POST 接口(query/save/update 等)均缺少 `@RequestBody` 注解。前端使用 Axios 发送 JSON body 时参数全部为空。
|
||||
|
||||
**修复方案**:统一在所有 POST 接口的对象参数前添加 `@RequestBody`。对于简单参数(String id, Integer status)使用 `@RequestBody Map<String, Object>` 或 `@RequestParam`。
|
||||
|
||||
#### 模式 2:save() 不返回新建实体 ID(P1,影响 7 个模块)
|
||||
所有新增接口返回 `RestResult.ok()` 而非 `RestResult.ok(entity.getId())`。前端无法获取新创建记录的 ID。
|
||||
|
||||
#### 模式 3:Entity 缺少 @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 库序列化。
|
||||
|
||||
#### 模式 6:Controller 缺少日志(P3,影响全部模块)
|
||||
所有 Controller 方法未按规范输出 `log.info("[OK] ...")` 日志。
|
||||
|
||||
#### 模式 7:BeanUtils.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-Token(StpInterfaceImpl 存在)
|
||||
- 项目结构: 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 方法不一致**:后端几乎全用 POST,PRD 规范使用 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 方法 | RESTful(PUT/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 层修复后页面自然跟随 |
|
||||
|
|
|
|||
394
progress.md
394
progress.md
|
|
@ -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() 不返回新建 ID(7 个模块)
|
||||
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/screen),PRD 用复数(/api/screens)— 不影响功能
|
||||
- **HTTP 方法差异**: 后端统一 POST,PRD 规范 RESTful(PUT/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 了 NotLoginException,NPE 直接传播到 MetaObjectHandler
|
||||
- 修复:将 catch 从 `NotLoginException` 扩大为 `Exception`
|
||||
- 同时删除了多余的 `NotLoginException` import(Checkstyle 检出)
|
||||
|
||||
**测试结果**: 应用成功启动,共测试 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 接口添加 @RequestBody(17 处,10 个 Controller)** ✅
|
||||
- 所有模块 POST 接口对象参数添加 `@RequestBody`
|
||||
- 简单参数改为 `@RequestBody Map<String, Object>` / `Map<String, String>`
|
||||
|
||||
**批次 2: P1 — save 返回 ID + 业务逻辑修复(15 处)** ✅
|
||||
- 7 个模块 save/generateClue/submitTransfer 返回新建实体 ID(14 文件)
|
||||
- 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 ObjectMapper(MonitoringRuleServiceImpl + 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 文件的路径和参数名
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import java.util.Map;
|
|||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/monitoring-rules")
|
||||
@RequestMapping("/api/monitoring-rule")
|
||||
@AllArgsConstructor
|
||||
@Tag(name = "监测规则管理")
|
||||
public class MonitoringRuleController {
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ public class RuleOperationHistoryEntity extends SuperEntity {
|
|||
@TableField("rule_id")
|
||||
private String ruleId;
|
||||
|
||||
@TableField("operator")
|
||||
private String operator;
|
||||
|
||||
@TableField("operation_type")
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ knife4j:
|
|||
# password: 123456
|
||||
|
||||
server:
|
||||
port: ${PRJ_PORT:8080}
|
||||
port: ${PRJ_PORT:8081}
|
||||
servlet:
|
||||
context-path: ${PRJ_CONTEXT_PATH:}
|
||||
# Sa-Token配置
|
||||
|
|
|
|||
159
task_plan.md
159
task_plan.md
|
|
@ -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_case;DDL 中 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)
|
||||
|
||||
### 批次 1:P0 — POST 接口添加 @RequestBody(17 处,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 标识符大写
|
||||
|
||||
### 批次 2:P1 — save 返回 ID + 业务逻辑修复(15 处)
|
||||
### Phase 2:后端 Controller API 路径审查
|
||||
|
||||
#### 2a. save() 返回新建实体 ID(7 个模块)
|
||||
修改 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 广告监控 API(3 个文件)
|
||||
- CW-1/2/3/4 内容预警 API(4 个文件)
|
||||
|
||||
| 模块 | 问题 | 修复 |
|
||||
|------|------|------|
|
||||
| LB-1 | repeal() 设 effectiveStatus=0 | 改为 2 |
|
||||
| CW-3 | statusSummary() 仅统计 1-2 | 补充 3(处理中)、4(已办结) |
|
||||
### Phase 4:前端页面组件审查(30+ 个 Vue 文件)
|
||||
|
||||
### 批次 3:P2 — 跨模块通用修复(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 queryList(VO 转换) |
|
||||
### 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 |
|
||||
|
||||
### 批次 4:P3 — 代码规范修复(24 处)
|
||||
|
||||
#### 4a. Controller 添加 log.info(10 个 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,不对接文件存储
|
||||
(审查过程中记录)
|
||||
|
|
|
|||
Loading…
Reference in New Issue