diff --git a/features/2026-02-08_20-03-29-controller-map-lambda-refactor.csv b/features/2026-02-08_20-03-29-controller-map-lambda-refactor.csv index 07fe3df..7b74d5b 100644 --- a/features/2026-02-08_20-03-29-controller-map-lambda-refactor.csv +++ b/features/2026-02-08_20-03-29-controller-map-lambda-refactor.csv @@ -1,7 +1,7 @@ "id","priority","phase","area","title","description","acceptance_criteria","test_mcp","review_initial_requirements","review_regression_requirements","dev_state","review_initial_state","review_regression_state","git_state","owner","refs","notes" "CMLR-000","P0","1","backend","建立改造基线清单","冻结当前 18 个 Map 入参接口、关键返回类型与调用链,作为后续等价回归基线。","形成一份可追溯清单并覆盖 User/Pk/Anchors/SystemMessage/Chat 五个 Controller;抽样 5 条接口请求-响应对照样本可复现。","AUTOSERVER","核对接口 URL、HTTP 方法、请求字段名、返回类型不变;清单需可与代码位置一一跳转。","回归时逐项对照基线,任何字段级偏差需记录并阻断合并。","已完成","已完成","已完成","已提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:18;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:30;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:97;src/main/java/vvpkassistant/controller/UserController.java:65;src/main/java/vvpkassistant/controller/PkController.java:64;src/main/java/vvpkassistant/controller/AnchorsController.java:31;src/main/java/vvpkassistant/controller/SystemMessageController.java:25;src/main/java/vvpkassistant/controller/ChatController.java:37;plan/2026-02-08_20-03-29-controller-map-baseline.md:1;plan/2026-02-08_20-03-29-controller-map-baseline.md:32","picked_reason:作为P0基线先冻结18个Map入参接口与调用链,降低后续等价替换回归风险。 | review_initial:已核对18个接口URL/HTTP方法/Map字段名/返回类型与代码一致。 | evidence:新增基线文档并抽样5条可复现请求响应样本。 | evidence:rg核验Map入参接口数量=18。 | done_at:2026-02-08" "CMLR-010","P0","2.1","backend","补齐 User/Pk 侧 DTO 模型","为 UserController 与 PkController 的 Map 入参接口新增显式 DTO,保持 JSON key 与可空语义不变。","新增 DTO 覆盖 User 8 个接口与 Pk 6 个接口;Controller 编译通过且不再直接读取 Map key。","AUTOSERVER","字段命名与旧 Map key 完全一致;可选字段保持可空并保留默认行为。","针对每个 Controller 至少执行 1 条成功与 1 条异常参数用例,确认返回结构无变化。","已完成","已完成","已完成","已提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:19;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:135;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:188;src/main/java/vvpkassistant/controller/UserController.java:64;src/main/java/vvpkassistant/controller/PkController.java:63;src/main/java/vvpkassistant/controller/UserController.java:73;src/main/java/vvpkassistant/controller/PkController.java:70;src/main/java/vvpkassistant/pk/service/PKService.java:22;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:152;src/main/java/vvpkassistant/User/model/DTO/UserInputUserInfoDTO.java:1;src/main/java/vvpkassistant/pk/model/DTO/PkListRequestDTO.java:1","picked_reason:P0且直接影响14个Map入参接口,先完成可尽早收敛控制器签名改造风险。 | review_initial:User8+Pk6接口均改为DTO读取,字段名保持与历史Map key一致。 | validation_limited:mvn -q -DskipTests package 在当前仓库基线失败(大量与本改动无关的Lombok getter/log符号缺失)。 | manual_test:修复仓库编译基线后执行 mvn -q -DskipTests package;并分别调用 /user/loginWithPhoneNumber 与 /pk/deletePkDataWithId 的成功/异常参数用例比对返回结构。 | evidence:新增14个DTO并完成UserController/PkController RequestBody Map->DTO替换。 | evidence:rg核验 UserController/PkController 中 @RequestBody Map 匹配为0。 | risk:medium 未完成可执行编译与接口回归,存在运行期兼容性待验证。 | done_at:2026-02-08" -"CMLR-020","P1","2.2","backend","补齐 Anchors/SystemMessage/Chat DTO","为 AnchorsController、SystemMessageController、ChatController 的 Map 入参接口新增 DTO,保留宽松兼容策略。","新增 DTO 覆盖 4 个接口(anchor/list, anchor/deleteMyAnchor, systemMessage/list, chat/receiveImMessage);Chat 回调可接受未知字段。","AUTOSERVER","Chat DTO 需支持扩展字段(如保留 payload 承载);分页字段类型与旧行为一致。","回归验证空字段、未知字段、缺字段场景,保证错误路径与历史一致。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:53;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:227;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:254;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:280;src/main/java/vvpkassistant/controller/AnchorsController.java:30;src/main/java/vvpkassistant/controller/SystemMessageController.java:24;src/main/java/vvpkassistant/controller/ChatController.java:36","" +"CMLR-020","P1","2.2","backend","补齐 Anchors/SystemMessage/Chat DTO","为 AnchorsController、SystemMessageController、ChatController 的 Map 入参接口新增 DTO,保留宽松兼容策略。","新增 DTO 覆盖 4 个接口(anchor/list, anchor/deleteMyAnchor, systemMessage/list, chat/receiveImMessage);Chat 回调可接受未知字段。","AUTOSERVER","Chat DTO 需支持扩展字段(如保留 payload 承载);分页字段类型与旧行为一致。","回归验证空字段、未知字段、缺字段场景,保证错误路径与历史一致。","已完成","已完成","已完成","已提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:53;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:227;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:254;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:280;src/main/java/vvpkassistant/controller/AnchorsController.java:30;src/main/java/vvpkassistant/controller/SystemMessageController.java:24;src/main/java/vvpkassistant/controller/ChatController.java:36;src/main/java/vvpkassistant/controller/AnchorsController.java:32;src/main/java/vvpkassistant/controller/SystemMessageController.java:25;src/main/java/vvpkassistant/controller/ChatController.java:38;src/main/java/vvpkassistant/Anchors/model/DTO/AnchorListRequestDTO.java:1;src/main/java/vvpkassistant/SystemMessage/model/DTO/SystemMessageListRequestDTO.java:1;src/main/java/vvpkassistant/chat/model/DTO/ChatReceiveImMessageDTO.java:1","picked_reason:补齐剩余3个Controller的DTO后可一次性完成全量Map->DTO收口,减少重复回归。 | review_initial:Anchors/SystemMessage/Chat 共4个接口改为DTO入参,分页与id字段命名保持一致。 | validation_limited:mvn -q -DskipTests package 仍因仓库现存Lombok符号缺失而失败,无法完成可执行回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package;调用 /anchor/list、/systemMessage/list、/chat/receiveImMessage 覆盖成功+缺字段/未知字段场景。 | evidence:三处Controller中 @RequestBody Map 静态扫描结果为0。 | evidence:ChatReceiveImMessageDTO 通过 JsonAnySetter/JsonAnyGetter 保留未知字段兼容。 | risk:medium 编译/接口回归未可执行,需后续环境验证。 | done_at:2026-02-08" "CMLR-030","P0","3","backend","控制器签名 Map->DTO 等价替换","仅替换 Controller 方法参数类型与取值逻辑,保持 URL、HTTP 方法、返回 VO/Map 结构不变。","18 个 Map 入参接口全部改为 DTO;全局路由无新增/删除;接口返回类型与 JSON 字段集合与基线一致。","AUTOSERVER","代码评审重点检查序列化字段、空值分支、异常处理路径是否与旧实现等价。","回归执行关键接口快照比对(字段名、字段数量、状态码),差异需附原因。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:20;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:136;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:365","" "CMLR-040","P0","4.1","backend","迁移 User 域注解 SQL 到 Lambda","将 User 相关 Mapper 注解 SQL 迁移到 MyBatis-Plus LambdaQuery/LambdaUpdate,并保证签到与手机号查询语义不变。","UserDao 中目标注解方法完成迁移或迁出;`queryWithPhoneNumber`、签到相关查询写入等价实现并通过测试。","AUTOSERVER","确认真实表名与实体映射一致(system_user/system_users 差异);签到日期逻辑统一时区。","执行用户登录、签到首签/重复签到、我的 PK 列表查询回归并对比旧行为。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:124;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:140;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:144;src/main/java/vvpkassistant/User/mapper/UserDao.java:16","" "CMLR-050","P0","4.2","backend","迁移 PK 域注解 SQL 到 Lambda","将 PkInfoDao、PkRecordDao、PkRecordDetailDao 注解 SQL 分组迁移为 Lambda 实现,保持筛选、排序、删除语义一致。","PK 域清单内注解方法完成迁移;删除/邀请/详情查询接口行为与原 SQL 等价;关键排序结果稳定。","AUTOSERVER","分批提交并逐批验证,避免跨模块大范围回归;重点检查置顶与邀请状态条件。","回归 `/pk/pkList`、`/pk/pkInfoDetail`、`/pk/deletePkDataWithId`、`/pk/createPkRecord` 成功/失败路径。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:21;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:183;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:184;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:14;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:17;src/main/java/vvpkassistant/pk/mapper/PkRecordDetailDao.java:15","" diff --git a/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorDeleteRequestDTO.java b/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorDeleteRequestDTO.java new file mode 100644 index 0000000..dc76a92 --- /dev/null +++ b/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorDeleteRequestDTO.java @@ -0,0 +1,8 @@ +package vvpkassistant.Anchors.model.DTO; + +import lombok.Data; + +@Data +public class AnchorDeleteRequestDTO { + private Integer id; +} diff --git a/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorListRequestDTO.java b/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorListRequestDTO.java new file mode 100644 index 0000000..6eea1c5 --- /dev/null +++ b/src/main/java/vvpkassistant/Anchors/model/DTO/AnchorListRequestDTO.java @@ -0,0 +1,8 @@ +package vvpkassistant.Anchors.model.DTO; + +import lombok.Data; + +@Data +public class AnchorListRequestDTO { + private Integer id; +} diff --git a/src/main/java/vvpkassistant/SystemMessage/model/DTO/SystemMessageListRequestDTO.java b/src/main/java/vvpkassistant/SystemMessage/model/DTO/SystemMessageListRequestDTO.java new file mode 100644 index 0000000..8f44433 --- /dev/null +++ b/src/main/java/vvpkassistant/SystemMessage/model/DTO/SystemMessageListRequestDTO.java @@ -0,0 +1,9 @@ +package vvpkassistant.SystemMessage.model.DTO; + +import lombok.Data; + +@Data +public class SystemMessageListRequestDTO { + private Integer page; + private Integer size; +} diff --git a/src/main/java/vvpkassistant/chat/model/DTO/ChatReceiveImMessageDTO.java b/src/main/java/vvpkassistant/chat/model/DTO/ChatReceiveImMessageDTO.java new file mode 100644 index 0000000..3d6672a --- /dev/null +++ b/src/main/java/vvpkassistant/chat/model/DTO/ChatReceiveImMessageDTO.java @@ -0,0 +1,25 @@ +package vvpkassistant.chat.model.DTO; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class ChatReceiveImMessageDTO { + private String eventType; + private Map payload; + private final Map additionalFields = new HashMap<>(); + + @JsonAnySetter + public void putAdditionalField(String key, Object value) { + additionalFields.put(key, value); + } + + @JsonAnyGetter + public Map getAdditionalFields() { + return additionalFields; + } +} diff --git a/src/main/java/vvpkassistant/controller/AnchorsController.java b/src/main/java/vvpkassistant/controller/AnchorsController.java index 699b1c6..2f78bbe 100644 --- a/src/main/java/vvpkassistant/controller/AnchorsController.java +++ b/src/main/java/vvpkassistant/controller/AnchorsController.java @@ -4,13 +4,14 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import vvpkassistant.Anchors.model.DTO.AnchorDeleteRequestDTO; +import vvpkassistant.Anchors.model.DTO.AnchorListRequestDTO; import vvpkassistant.Anchors.model.AnchorModel; import vvpkassistant.Anchors.service.AnchorsService; import vvpkassistant.Data.ResponseData; import vvpkassistant.common.ErrorCode; import javax.annotation.Resource; -import java.util.Map; @RestController @RequestMapping("anchor") @@ -28,15 +29,15 @@ public class AnchorsController { // 查询我的主播列表 @PostMapping("list") - public ResponseData myAnchorList(@RequestBody Map map) { - Integer userId = map.get("id"); + public ResponseData myAnchorList(@RequestBody AnchorListRequestDTO request) { + Integer userId = request.getId(); return ResponseData.success(anchorsService.selectMyAnchor(userId)); } // 删除我的主播 @PostMapping("deleteMyAnchor") - public ResponseData deleteMyAnchor(@RequestBody Map map) { - Integer id = map.get("id"); + public ResponseData deleteMyAnchor(@RequestBody AnchorDeleteRequestDTO request) { + Integer id = request.getId(); return anchorsService.deleteMyAnchor(id) == 1 ? ResponseData.success(""):ResponseData.error(ErrorCode.DELETE_FAILED ); } diff --git a/src/main/java/vvpkassistant/controller/ChatController.java b/src/main/java/vvpkassistant/controller/ChatController.java index 5865d27..1b370cf 100644 --- a/src/main/java/vvpkassistant/controller/ChatController.java +++ b/src/main/java/vvpkassistant/controller/ChatController.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import vvpkassistant.Data.ResponseData; import vvpkassistant.chat.mapper.ChatDao; +import vvpkassistant.chat.model.DTO.ChatReceiveImMessageDTO; import vvpkassistant.chat.model.ChatModel; import vvpkassistant.common.ErrorCode; @@ -34,7 +35,7 @@ public class ChatController { //接收im消息 @PostMapping("receiveImMessage") - public Map receiveImMessage(@RequestBody Map data) { + public Map receiveImMessage(@RequestBody ChatReceiveImMessageDTO data) { System.out.println(data); Map result = new HashMap<>(); result.put("code",200); diff --git a/src/main/java/vvpkassistant/controller/SystemMessageController.java b/src/main/java/vvpkassistant/controller/SystemMessageController.java index cba81c3..bbae9d0 100644 --- a/src/main/java/vvpkassistant/controller/SystemMessageController.java +++ b/src/main/java/vvpkassistant/controller/SystemMessageController.java @@ -7,11 +7,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import vvpkassistant.Data.ResponseData; import vvpkassistant.SystemMessage.mapper.SystemMessageDao; +import vvpkassistant.SystemMessage.model.DTO.SystemMessageListRequestDTO; import vvpkassistant.SystemMessage.model.SystemMessage; import vvpkassistant.Tools.VVTools; import java.util.List; -import java.util.Map; @RestController @RequestMapping("systemMessage") @@ -22,9 +22,9 @@ public class SystemMessageController { // 获取列表 @PostMapping("list") - public ResponseData messageList(@RequestBody Map map) { - Integer page = map.get("page"); - Integer size = map.get("size"); + public ResponseData messageList(@RequestBody SystemMessageListRequestDTO request) { + Integer page = request.getPage(); + Integer size = request.getSize(); List systemMessages = messageDao.messageList(page * size, size); return ResponseData.success(systemMessages); }