# OARMS 后端全模块开发计划 ## 目标 完成广州广告监管系统全部 10 个模块的后端代码生成、DDL 建表语句生成、初始数据准备并执行到 DM8 数据库。 ## 当前阶段 **状态**: 全部 10 个阶段已完成,编译验证通过 ✅,DDL 已执行到 DM8 ✅,缺失接口已补齐 ✅,端到端接口测试通过 ✅ **下一步**: 提交代码到 git ## 模块开发顺序(按依赖关系) | 阶段 | 模块 | 实体/表 | 依赖 | 状态 | |------|------|---------|------|------| | Phase 1 | BS-1 大屏基础信息管理 | bs_screen, bs_screen_history | 无 | ✅ 完成 | | Phase 2 | LB-1 法律法规管理 | lb_law_clause | 无 | ✅ 完成 | | Phase 3 | MR-1 监测规则管理 | mr_monitoring_rule, mr_rule_law_clause_rel, mr_rule_operation_history | LB-1 | ✅ 完成 | | Phase 4 | AM-1 录屏设置管理 | am_recording_config | BS-1 | ✅ 完成 | | Phase 5 | AM-2 随机录屏 | am_recording_task, am_alert_notification | BS-1, AM-1 | ✅ 完成 | | Phase 6 | AM-3 广告画面监控 | am_monitor_record | BS-1, AM-2 | ✅ 完成 | | Phase 7 | CW-1 固化取证 | cw_evidence_record, cw_evidence_status_history | BS-1, AM-3 | ✅ 完成 | | Phase 8 | CW-2 规则关联 | cw_evidence_rule_relation | CW-1, MR-1 | ✅ 完成 | | Phase 9 | CW-3 线索生成 | cw_monitoring_clue, cw_clue_generation_log | CW-1, CW-2, BS-1, MR-1 | ✅ 完成 | | Phase 10 | CW-4 线索转办 | cw_clue_transfer_record, cw_transfer_operation_log | CW-3 | ✅ 完成 | ## 每阶段执行步骤 1. 生成 DDL SQL 文件到 docs/db/sql/ 2. 执行 DDL 到 DM8 数据库 3. 生成初始数据 SQL 并执行 4. 生成 Java 代码(Entity → Query/Req/VO → Mapper → Service → Controller) 5. 编译验证 ## 后续待办 - [x] 执行 mvn compile 编译验证 ✅ 2026-05-18 BUILD SUCCESS - [x] 确认 DM8 数据库连接参数 ✅ 172.22.80.70:15236 连通 - [x] 执行 DDL 到目标数据库 ✅ OARMS schema 下已有 17 张表 - [x] PRD vs 后端代码覆盖比对 ✅ 已完成 - [ ] 补齐缺失接口(分 4 批) ✅ 2026-05-18 全部完成 - [ ] 端到端接口测试 ✅ 2026-05-18 40/40 接口通过 --- ## 缺失接口补齐计划 按业务影响度分为 4 个优先级批次。新增接口保持现有路径风格(单数名词、POST 为主)。 ### P0 — 核心状态流转(阻塞业务流程) | # | 模块 | 接口 | Controller 方法 | 说明 | |---|------|------|----------------|------| | 1 | BS-1 | `POST /api/screen/toggle-status` | toggleStatus(String id, Integer status) | 大屏启停用 | | 2 | AM-1 | `POST /api/recording-config/toggle-status` | toggleStatus(String id, Integer status) | 配置启停用 | | 3 | LB-1 | `POST /api/law-clause/repeal` | repeal(String id) | 条款废止(effectiveStatus → 0) | ### P1 — 前端页面必需(校验 & 列表 & 预览) | # | 模块 | 接口 | Controller 方法 | 说明 | |---|------|------|----------------|------| | 4 | BS-1 | `GET /api/screen/check-code` | checkCode(String screenCode, String excludeId) | 编码唯一校验 | | 5 | BS-1 | `GET /api/screen/check-address` | checkAddress(String address, String excludeId) | 地址唯一校验 | | 6 | LB-1 | `GET /api/law-clause/check-clause-number` | checkClauseNumber(String clauseNumber, String excludeId) | 条款号唯一校验 | | 7 | LB-1 | `GET /api/law-clause/effective` | effectiveList() | 已生效条款下拉 | | 8 | CW-3 | `GET /api/monitoring-clue/clue-preview/{evidenceId}` | cluePreview(String evidenceId) | 线索生成前预览 | | 9 | CW-3 | `GET /api/monitoring-clue/status-summary` | statusSummary() | 各状态线索数量统计 | ### P2 — 级联选择器(CW-4 转办页面依赖) | # | 模块 | 接口 | Controller 方法 | 说明 | |---|------|------|----------------|------| | 10 | CW-4 | `GET /api/clue-transfer/targets/districts` | districtList() | 转办目标区域列表 | | 11 | CW-4 | `GET /api/clue-transfer/targets/departments` | departmentList(String districtCode) | 按区域查部门 | | 12 | CW-4 | `GET /api/clue-transfer/targets/persons` | personList(String departmentId) | 按部门查人员 | | 13 | CW-4 | `GET /api/clue-transfer/clues/{clueId}/disposal-feedback` | disposalFeedback(String clueId) | 线索处置反馈 | ### P3 — 文件操作 & 导入导出(可延后) | # | 模块 | 接口 | Controller 方法 | 说明 | |---|------|------|----------------|------| | 14 | CW-1 | `GET /api/evidence-record/download/{id}` | downloadUrl(String id) | 取证视频下载地址 | | 15 | CW-1 | `GET /api/evidence-record/play/{id}` | playUrl(String id) | 取证视频播放地址 | | 16 | BS-1 | `GET /api/screen/export` | export(ScreenQuery query) | 导出大屏数据 | | 17 | BS-1 | `POST /api/screen/import` | importData(MultipartFile file) | 批量导入大屏 | | 18 | BS-1 | `GET /api/screen/import-template` | importTemplate() | 下载导入模板 | | 19 | BS-1 | `GET /api/screen/{id}/histories` | histories(String id) | 大屏历史版本列表 | | 20 | MR-1 | `POST /api/monitoring-rules/export` | export(MonitoringRuleQuery query) | 导出规则 Excel | ### 实施规则 1. 新增接口在已有 Controller 中追加方法,不新建 Controller 2. Service 层新增方法在已有 ServiceImpl 中实现 3. 路径风格遵循现有规范:单数名词 + 小写 + 短横线分隔 4. 编译验证在每批次完成后执行 ## 错误记录 | # | 问题 | 修复 | 日期 | |---|------|------|------| | 1 | 8 个未使用 import 被 Checkstyle 拦截 | 删除多余 import | 2026-05-18 | | 2 | 13 个 Entity 的 SuperEntity 泛型参数错误 | 批量替换为无参 `extends SuperEntity` | 2026-05-18 | | 3 | 7 处 AssertUtils.isTrue 签名不匹配 | 加 BaseResultCode.PARAM_IS_INVALID 参数 | 2026-05-18 | | 4 | LawClauseEntity.getClauseName() 不存在 | 改为 getLawName() | 2026-05-18 | | 5 | JDK 25 不兼容 | pom.xml 改为 JDK 21 | 2026-05-18 | | 6 | spring-boot:run classpath 只含 target/classes | ZIP layout + includes nothing 过滤了依赖;改用 java -cp | 2026-05-18 | | 7 | DM8 不支持 `select version()` | validation-query 改为 `SELECT 1` | 2026-05-18 | | 8 | Sa-Token NPE 导致所有写入失败 | UserBaseServiceImpl catch NotLoginException → Exception | 2026-05-18 | | 9 | NotLoginException import 未使用 | 删除多余 import | 2026-05-18 |