[CMLR-070] 动态查询 selectPkInfoByCondition 等价迁移

This commit is contained in:
2026-02-08 20:25:55 +08:00
parent 3246146b7a
commit a78b06fcfb
2 changed files with 88 additions and 32 deletions

View File

@@ -6,7 +6,7 @@
"CMLR-040","P0","4.1","backend","迁移 User 域注解 SQL 到 Lambda","将 UserDao 的用户表查询注解 SQL 迁移到 LambdaQuery签到相关 SQL 的迁移与落地改由 CMLR-060新增 SignInRecordDao闭环承接。","UserDao 不再包含 queryWithPhoneNumber 注解 SQL改为 Lambda 等价查询;登录链路调用不变;签到 SQL 迁移责任在 CMLR-060 中完成并在该条验收。","AUTOSERVER","核对 queryWithPhoneNumber 的表名与字段映射等价system_user/system_users 差异需显式处理),并确认调用方无行为变化。","回归登录老用户/新用户路径;签到链路迁移与回归在 CMLR-060 执行并给出证据。","已完成","已完成","已完成","已提交","","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;src/main/java/vvpkassistant/User/mapper/UserDao.java:17;src/main/java/vvpkassistant/User/model/UserModel.java:14;src/main/java/vvpkassistant/controller/UserController.java:156","picked_reason:P0且影响登录与签到核心链路优先迁移可尽早暴露表映射与时区风险。 | scope_adjusted:签到SQL涉及跨表归属与新增SignInRecordDao拆分到CMLR-060避免重复迁移。 | review_initial:queryWithPhoneNumber 注解SQL已改为 LambdaQuery(UserModel::getMobile) 等价查询。 | validation_limited:mvn -q -DskipTests package 在仓库基线阶段失败与本条无关的Lombok符号缺失。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package调用 /user/loginWithPhoneNumber 覆盖老用户/新用户两条路径。 | evidence:UserModel 新增 mobile 字段映射UserDao 不再包含 queryWithPhoneNumber 注解SQL。 | evidence:签到SQL迁移已在范围拆分中转交 CMLR-060 处理。 | risk:medium system_user/system_users 实际表名差异仍需在可运行环境验证。 | done_at:2026-02-08" "CMLR-040","P0","4.1","backend","迁移 User 域注解 SQL 到 Lambda","将 UserDao 的用户表查询注解 SQL 迁移到 LambdaQuery签到相关 SQL 的迁移与落地改由 CMLR-060新增 SignInRecordDao闭环承接。","UserDao 不再包含 queryWithPhoneNumber 注解 SQL改为 Lambda 等价查询;登录链路调用不变;签到 SQL 迁移责任在 CMLR-060 中完成并在该条验收。","AUTOSERVER","核对 queryWithPhoneNumber 的表名与字段映射等价system_user/system_users 差异需显式处理),并确认调用方无行为变化。","回归登录老用户/新用户路径;签到链路迁移与回归在 CMLR-060 执行并给出证据。","已完成","已完成","已完成","已提交","","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;src/main/java/vvpkassistant/User/mapper/UserDao.java:17;src/main/java/vvpkassistant/User/model/UserModel.java:14;src/main/java/vvpkassistant/controller/UserController.java:156","picked_reason:P0且影响登录与签到核心链路优先迁移可尽早暴露表映射与时区风险。 | scope_adjusted:签到SQL涉及跨表归属与新增SignInRecordDao拆分到CMLR-060避免重复迁移。 | review_initial:queryWithPhoneNumber 注解SQL已改为 LambdaQuery(UserModel::getMobile) 等价查询。 | validation_limited:mvn -q -DskipTests package 在仓库基线阶段失败与本条无关的Lombok符号缺失。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package调用 /user/loginWithPhoneNumber 覆盖老用户/新用户两条路径。 | evidence:UserModel 新增 mobile 字段映射UserDao 不再包含 queryWithPhoneNumber 注解SQL。 | evidence:签到SQL迁移已在范围拆分中转交 CMLR-060 处理。 | risk:medium system_user/system_users 实际表名差异仍需在可运行环境验证。 | done_at:2026-02-08"
"CMLR-050","P0","4.2","backend","迁移 PK 域注解 SQL 到 Lambda","迁移 PK 域静态注解 SQLPkInfoDao/PkRecordDao/PkRecordDetailDao到 Lambda动态查询 selectPkInfoByCondition 留给 CMLR-070跨表明细归位留给 CMLR-060。","除 selectPkInfoByCondition、fetchDetailPkDataWithId、checkIfUnfinishedPKExistsWithAnchor跨表项PK 域注解 SQL 完成 Lambda 迁移:查询可用/全部PK、删除、按主播+时间、置顶时间更新、未邀请列表、当日列表、用户相关记录、待处理邀请、单条记录、主播存在性、明细查询。","AUTOSERVER","逐方法核对 where 条件、排序、limit/时间比较语义等价;明确拆分到 CMLR-060/CMLR-070 的方法不在本条重复改动。","回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord动态筛选与跨表明细回归在对应条目执行。","已完成","已完成","已完成","已提交","","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;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:47;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:75;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:18;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:34;src/main/java/vvpkassistant/pk/mapper/PkRecordDetailDao.java:14","picked_reason:P0且覆盖PK主流程DAO先迁移可提前锁定筛选/排序语义风险。 | scope_adjusted:selectPkInfoByCondition归CMLR-070fetchDetailPkDataWithId归CMLR-060避免重复迁移。 | scope_adjusted:checkIfUnfinishedPKExistsWithAnchor 同属跨表pk_record查询转交CMLR-060统一归位。 | review_initial:PK域静态注解SQL已迁移为Lambda default方法保留原条件与排序/分页语义。 | validation_limited:mvn -q -DskipTests package 仍被仓库既有Lombok符号缺失阻断无法执行运行态回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord。 | evidence:PkInfoDao/PkRecordDao/PkRecordDetailDao 静态SQL方法已改为 default+Wrappers 实现。 | evidence:selectPkInfoByCondition 与跨表明细项按拆分保留到 CMLR-070/CMLR-060。 | risk:medium pk_time 字段历史为字符串,时间比较与数据库函数差异需在联调环境复核。 | done_at:2026-02-08" "CMLR-050","P0","4.2","backend","迁移 PK 域注解 SQL 到 Lambda","迁移 PK 域静态注解 SQLPkInfoDao/PkRecordDao/PkRecordDetailDao到 Lambda动态查询 selectPkInfoByCondition 留给 CMLR-070跨表明细归位留给 CMLR-060。","除 selectPkInfoByCondition、fetchDetailPkDataWithId、checkIfUnfinishedPKExistsWithAnchor跨表项PK 域注解 SQL 完成 Lambda 迁移:查询可用/全部PK、删除、按主播+时间、置顶时间更新、未邀请列表、当日列表、用户相关记录、待处理邀请、单条记录、主播存在性、明细查询。","AUTOSERVER","逐方法核对 where 条件、排序、limit/时间比较语义等价;明确拆分到 CMLR-060/CMLR-070 的方法不在本条重复改动。","回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord动态筛选与跨表明细回归在对应条目执行。","已完成","已完成","已完成","已提交","","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;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:47;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:75;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:18;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:34;src/main/java/vvpkassistant/pk/mapper/PkRecordDetailDao.java:14","picked_reason:P0且覆盖PK主流程DAO先迁移可提前锁定筛选/排序语义风险。 | scope_adjusted:selectPkInfoByCondition归CMLR-070fetchDetailPkDataWithId归CMLR-060避免重复迁移。 | scope_adjusted:checkIfUnfinishedPKExistsWithAnchor 同属跨表pk_record查询转交CMLR-060统一归位。 | review_initial:PK域静态注解SQL已迁移为Lambda default方法保留原条件与排序/分页语义。 | validation_limited:mvn -q -DskipTests package 仍被仓库既有Lombok符号缺失阻断无法执行运行态回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord。 | evidence:PkInfoDao/PkRecordDao/PkRecordDetailDao 静态SQL方法已改为 default+Wrappers 实现。 | evidence:selectPkInfoByCondition 与跨表明细项按拆分保留到 CMLR-070/CMLR-060。 | risk:medium pk_time 字段历史为字符串,时间比较与数据库函数差异需在联调环境复核。 | done_at:2026-02-08"
"CMLR-060","P0","5","backend","修复跨表归属并新增 SignInRecordDao","将 UserDao 中跨表 SQL 迁移到正确 Mapper新增 SignInRecord 实体与 Dao迁移明细查询到 PkRecordDetailDao。","新增 `SignInRecord`+`SignInRecordDao` 并接入;`UserDao` 不再承载 `pk_record` 与 `sign_in_records` SQL详情查询归位到 `PkRecordDetailDao`。","AUTOSERVER","评审需确认实体@TableName、字段映射、Mapper 扫描路径与事务边界正确。","执行签到链路、PK 详情链路、handlePkInfo 链路回归,确认依赖注入与事务无回归。","已完成","已完成","已完成","已提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:22;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:91;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:93;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:137;src/main/java/vvpkassistant/User/model/SignInRecord.java:1;src/main/java/vvpkassistant/User/mapper/SignInRecordDao.java:15;src/main/java/vvpkassistant/User/mapper/UserDao.java:10;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:43;src/main/java/vvpkassistant/controller/UserController.java:252;src/main/java/vvpkassistant/controller/UserController.java:270;src/main/java/vvpkassistant/controller/PkController.java:121;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:224","picked_reason:已完成静态SQL迁移后优先处理跨表归位避免Mapper职责继续漂移。 | review_initial:新增 SignInRecord+SignInRecordDao并将 UserDao 中 pk_record/sign_in_records 跨表方法全部迁出。 | validation_limited:mvn -q -DskipTests package 仍因仓库既有Lombok符号缺失失败未能执行可运行回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package回归 /user/signIn、/user/checkSignStatus、/user/handlePkInfo、/pk/fetchDetailPkDataWithId。 | evidence:UserController 已改调 recordDao.findCreatedPk/getMyGuestPkList 与 signInRecordDao.signIn/checkSignStatus。 | evidence:PkController 明细查询已归位 detailDao.queryDetailPKServiceImpl 未完成记录检查改调 PkRecordDao。 | risk:medium 日期写入从数据库CURDATE改为Asia/Shanghai本地日期需在生产时区配置下验证一致性。 | done_at:2026-02-08" "CMLR-060","P0","5","backend","修复跨表归属并新增 SignInRecordDao","将 UserDao 中跨表 SQL 迁移到正确 Mapper新增 SignInRecord 实体与 Dao迁移明细查询到 PkRecordDetailDao。","新增 `SignInRecord`+`SignInRecordDao` 并接入;`UserDao` 不再承载 `pk_record` 与 `sign_in_records` SQL详情查询归位到 `PkRecordDetailDao`。","AUTOSERVER","评审需确认实体@TableName、字段映射、Mapper 扫描路径与事务边界正确。","执行签到链路、PK 详情链路、handlePkInfo 链路回归,确认依赖注入与事务无回归。","已完成","已完成","已完成","已提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:22;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:91;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:93;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:137;src/main/java/vvpkassistant/User/model/SignInRecord.java:1;src/main/java/vvpkassistant/User/mapper/SignInRecordDao.java:15;src/main/java/vvpkassistant/User/mapper/UserDao.java:10;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:43;src/main/java/vvpkassistant/controller/UserController.java:252;src/main/java/vvpkassistant/controller/UserController.java:270;src/main/java/vvpkassistant/controller/PkController.java:121;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:224","picked_reason:已完成静态SQL迁移后优先处理跨表归位避免Mapper职责继续漂移。 | review_initial:新增 SignInRecord+SignInRecordDao并将 UserDao 中 pk_record/sign_in_records 跨表方法全部迁出。 | validation_limited:mvn -q -DskipTests package 仍因仓库既有Lombok符号缺失失败未能执行可运行回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package回归 /user/signIn、/user/checkSignStatus、/user/handlePkInfo、/pk/fetchDetailPkDataWithId。 | evidence:UserController 已改调 recordDao.findCreatedPk/getMyGuestPkList 与 signInRecordDao.signIn/checkSignStatus。 | evidence:PkController 明细查询已归位 detailDao.queryDetailPKServiceImpl 未完成记录检查改调 PkRecordDao。 | risk:medium 日期写入从数据库CURDATE改为Asia/Shanghai本地日期需在生产时区配置下验证一致性。 | done_at:2026-02-08"
"CMLR-070","P0","6","backend","动态查询 selectPkInfoByCondition 等价迁移","将 `selectPkInfoByCondition` 迁移为 Lambda 条件拼装并保留原排序语义,必要处使用 `last` 保序。","在相同输入下,迁移前后结果集数量、顺序、关键字段完全一致;覆盖 condition 为空/有值、有无 userId 两类场景。","AUTOSERVER","评审需检查 every condition 分支、排序表达式与 SQL 注入风险控制。","执行首页筛选、主播 ID 脱敏、置顶排序回归;输出前后结果对比记录。","未开始","未开始","未开始","提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:23;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:189;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:196;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:14","" "CMLR-070","P0","6","backend","动态查询 selectPkInfoByCondition 等价迁移","将 `selectPkInfoByCondition` 迁移为 Lambda 条件拼装并保留原排序语义,必要处使用 `last` 保序。","在相同输入下,迁移前后结果集数量、顺序、关键字段完全一致;覆盖 condition 为空/有值、有无 userId 两类场景。","AUTOSERVER","评审需检查 every condition 分支、排序表达式与 SQL 注入风险控制。","执行首页筛选、主播 ID 脱敏、置顶排序回归;输出前后结果对比记录。","已完成","已完成","已完成","提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:23;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:189;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:196;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:14;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:16;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:59;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:112;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:162","picked_reason:跨表归位已完成,当前可独立处理动态筛选与排序保序风险。 | review_initial:selectPkInfoByCondition 已改为 Lambda 条件拼装,保留 sex/coin/country/pkTime/type 分支与 invite_status=0 过滤。 | validation_limited:mvn -q -DskipTests package 因仓库既有Lombok符号缺失失败无法执行真实结果集对比。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package回归 /pk/pkList 在 condition 为空/有值、含/不含 userId 场景并核对顺序。 | evidence:排序通过 wrapper.last 保留 pin_expire_time + pin_create_time + id 组合语义。 | evidence:新增 asMap/asLong/asInteger 做条件值兼容解析,未知/非法值安全忽略。 | risk:medium 条件值类型异常时采用忽略策略,需业务确认是否应转为参数错误。 | done_at:2026-02-08"
"CMLR-080","P0","7","backend","完成编译与分层自动化测试","完成全量编译,并为改造影响的 Controller/DAO 补齐最低成功+失败用例,确保可持续回归。","`mvn clean test` 通过;涉及改造的每个 Controller 至少 1 个成功 + 1 个失败/校验用例;关键 DAO 有等价查询测试。","AUTOSERVER","测试需覆盖分页、幂等、非法参数、空结果等分支;失败断言使用稳定错误码/消息。","回归前后测试结果可追溯(命令+结果),新增测试不得依赖脆弱时间窗口。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:24;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:148;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:199;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:236","" "CMLR-080","P0","7","backend","完成编译与分层自动化测试","完成全量编译,并为改造影响的 Controller/DAO 补齐最低成功+失败用例,确保可持续回归。","`mvn clean test` 通过;涉及改造的每个 Controller 至少 1 个成功 + 1 个失败/校验用例;关键 DAO 有等价查询测试。","AUTOSERVER","测试需覆盖分页、幂等、非法参数、空结果等分支;失败断言使用稳定错误码/消息。","回归前后测试结果可追溯(命令+结果),新增测试不得依赖脆弱时间窗口。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:24;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:148;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:199;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:236",""
"CMLR-090","P0","8","both","核心链路端到端回归","围绕分页、置顶、邀请状态、主播 ID 脱敏、签到幂等等关键路径执行联调回归,确认接口输出完全兼容。","关键路径回归清单全部通过;至少覆盖 10 条核心接口用例并完成字段级比对;无阻断级差异。","AUTOE2E","联调前固定测试数据与时间窗口,避免误判;接口对比需包含状态码与响应字段。","增加并发与边界复测(重复邀请、重复签到、置顶过期边界),确认无行为漂移。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:25;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:146;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:197;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:367","" "CMLR-090","P0","8","both","核心链路端到端回归","围绕分页、置顶、邀请状态、主播 ID 脱敏、签到幂等等关键路径执行联调回归,确认接口输出完全兼容。","关键路径回归清单全部通过;至少覆盖 10 条核心接口用例并完成字段级比对;无阻断级差异。","AUTOE2E","联调前固定测试数据与时间窗口,避免误判;接口对比需包含状态码与响应字段。","增加并发与边界复测(重复邀请、重复签到、置顶过期边界),确认无行为漂移。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:25;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:146;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:197;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:367",""
"CMLR-100","P1","8.1","both","非改造模块冒烟回归","对 FunctionConfig/File/OTP 三个无 Map 改造模块执行冒烟,确保全局扫描与参数绑定未受影响。","`getAllConfig/updateConfigValue`、文件上传、OTP 获取各至少 1 成功 + 1 异常路径通过;返回结构与历史一致。","AUTOE2E","检查 Mapper 扫描、全局配置与 multipart 绑定是否因改造受影响。","回归覆盖配置更新可见性、空文件上传、密钥异常等边界。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:305;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:329;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:352","" "CMLR-100","P1","8.1","both","非改造模块冒烟回归","对 FunctionConfig/File/OTP 三个无 Map 改造模块执行冒烟,确保全局扫描与参数绑定未受影响。","`getAllConfig/updateConfigValue`、文件上传、OTP 获取各至少 1 成功 + 1 异常路径通过;返回结构与历史一致。","AUTOE2E","检查 Mapper 扫描、全局配置与 multipart 绑定是否因改造受影响。","回归覆盖配置更新可见性、空文件上传、密钥异常等边界。","未开始","未开始","未开始","未提交","","plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:305;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:329;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:352",""
1 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
6 CMLR-040 P0 4.1 backend 迁移 User 域注解 SQL 到 Lambda 将 UserDao 的用户表查询注解 SQL 迁移到 LambdaQuery;签到相关 SQL 的迁移与落地改由 CMLR-060(新增 SignInRecordDao)闭环承接。 UserDao 不再包含 queryWithPhoneNumber 注解 SQL,改为 Lambda 等价查询;登录链路调用不变;签到 SQL 迁移责任在 CMLR-060 中完成并在该条验收。 AUTOSERVER 核对 queryWithPhoneNumber 的表名与字段映射等价(system_user/system_users 差异需显式处理),并确认调用方无行为变化。 回归登录老用户/新用户路径;签到链路迁移与回归在 CMLR-060 执行并给出证据。 已完成 已完成 已完成 已提交 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;src/main/java/vvpkassistant/User/mapper/UserDao.java:17;src/main/java/vvpkassistant/User/model/UserModel.java:14;src/main/java/vvpkassistant/controller/UserController.java:156 picked_reason:P0且影响登录与签到核心链路,优先迁移可尽早暴露表映射与时区风险。 | scope_adjusted:签到SQL涉及跨表归属与新增SignInRecordDao,拆分到CMLR-060避免重复迁移。 | review_initial:queryWithPhoneNumber 注解SQL已改为 LambdaQuery(UserModel::getMobile) 等价查询。 | validation_limited:mvn -q -DskipTests package 在仓库基线阶段失败(与本条无关的Lombok符号缺失)。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package;调用 /user/loginWithPhoneNumber 覆盖老用户/新用户两条路径。 | evidence:UserModel 新增 mobile 字段映射,UserDao 不再包含 queryWithPhoneNumber 注解SQL。 | evidence:签到SQL迁移已在范围拆分中转交 CMLR-060 处理。 | risk:medium system_user/system_users 实际表名差异仍需在可运行环境验证。 | done_at:2026-02-08
7 CMLR-050 P0 4.2 backend 迁移 PK 域注解 SQL 到 Lambda 迁移 PK 域静态注解 SQL(PkInfoDao/PkRecordDao/PkRecordDetailDao)到 Lambda;动态查询 selectPkInfoByCondition 留给 CMLR-070,跨表明细归位留给 CMLR-060。 除 selectPkInfoByCondition、fetchDetailPkDataWithId、checkIfUnfinishedPKExistsWithAnchor(跨表项)外,PK 域注解 SQL 完成 Lambda 迁移:查询可用/全部PK、删除、按主播+时间、置顶时间更新、未邀请列表、当日列表、用户相关记录、待处理邀请、单条记录、主播存在性、明细查询。 AUTOSERVER 逐方法核对 where 条件、排序、limit/时间比较语义等价;明确拆分到 CMLR-060/CMLR-070 的方法不在本条重复改动。 回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord;动态筛选与跨表明细回归在对应条目执行。 已完成 已完成 已完成 已提交 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;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:47;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:75;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:18;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:34;src/main/java/vvpkassistant/pk/mapper/PkRecordDetailDao.java:14 picked_reason:P0且覆盖PK主流程DAO,先迁移可提前锁定筛选/排序语义风险。 | scope_adjusted:selectPkInfoByCondition归CMLR-070,fetchDetailPkDataWithId归CMLR-060,避免重复迁移。 | scope_adjusted:checkIfUnfinishedPKExistsWithAnchor 同属跨表pk_record查询,转交CMLR-060统一归位。 | review_initial:PK域静态注解SQL已迁移为Lambda default方法,保留原条件与排序/分页语义。 | validation_limited:mvn -q -DskipTests package 仍被仓库既有Lombok符号缺失阻断,无法执行运行态回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package;回归 /pk/queryMyCanUsePkData、/pk/deletePkDataWithId、/pk/listUninvitedPublishedAnchorsByUserId、/pk/createPkRecord、/pk/singleRecord。 | evidence:PkInfoDao/PkRecordDao/PkRecordDetailDao 静态SQL方法已改为 default+Wrappers 实现。 | evidence:selectPkInfoByCondition 与跨表明细项按拆分保留到 CMLR-070/CMLR-060。 | risk:medium pk_time 字段历史为字符串,时间比较与数据库函数差异需在联调环境复核。 | done_at:2026-02-08
8 CMLR-060 P0 5 backend 修复跨表归属并新增 SignInRecordDao 将 UserDao 中跨表 SQL 迁移到正确 Mapper,新增 SignInRecord 实体与 Dao,迁移明细查询到 PkRecordDetailDao。 新增 `SignInRecord`+`SignInRecordDao` 并接入;`UserDao` 不再承载 `pk_record` 与 `sign_in_records` SQL;详情查询归位到 `PkRecordDetailDao`。 AUTOSERVER 评审需确认实体@TableName、字段映射、Mapper 扫描路径与事务边界正确。 执行签到链路、PK 详情链路、handlePkInfo 链路回归,确认依赖注入与事务无回归。 已完成 已完成 已完成 已提交 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:22;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:91;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:93;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:137;src/main/java/vvpkassistant/User/model/SignInRecord.java:1;src/main/java/vvpkassistant/User/mapper/SignInRecordDao.java:15;src/main/java/vvpkassistant/User/mapper/UserDao.java:10;src/main/java/vvpkassistant/pk/mapper/PkRecordDao.java:43;src/main/java/vvpkassistant/controller/UserController.java:252;src/main/java/vvpkassistant/controller/UserController.java:270;src/main/java/vvpkassistant/controller/PkController.java:121;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:224 picked_reason:已完成静态SQL迁移后优先处理跨表归位,避免Mapper职责继续漂移。 | review_initial:新增 SignInRecord+SignInRecordDao,并将 UserDao 中 pk_record/sign_in_records 跨表方法全部迁出。 | validation_limited:mvn -q -DskipTests package 仍因仓库既有Lombok符号缺失失败,未能执行可运行回归。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package;回归 /user/signIn、/user/checkSignStatus、/user/handlePkInfo、/pk/fetchDetailPkDataWithId。 | evidence:UserController 已改调 recordDao.findCreatedPk/getMyGuestPkList 与 signInRecordDao.signIn/checkSignStatus。 | evidence:PkController 明细查询已归位 detailDao.queryDetail;PKServiceImpl 未完成记录检查改调 PkRecordDao。 | risk:medium 日期写入从数据库CURDATE改为Asia/Shanghai本地日期,需在生产时区配置下验证一致性。 | done_at:2026-02-08
9 CMLR-070 P0 6 backend 动态查询 selectPkInfoByCondition 等价迁移 将 `selectPkInfoByCondition` 迁移为 Lambda 条件拼装并保留原排序语义,必要处使用 `last` 保序。 在相同输入下,迁移前后结果集数量、顺序、关键字段完全一致;覆盖 condition 为空/有值、有无 userId 两类场景。 AUTOSERVER 评审需检查 every condition 分支、排序表达式与 SQL 注入风险控制。 执行首页筛选、主播 ID 脱敏、置顶排序回归;输出前后结果对比记录。 未开始 已完成 未开始 已完成 未开始 已完成 未提交 已提交 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:23;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:189;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:196;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:14 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:23;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:189;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:196;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:14;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:16;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:59;src/main/java/vvpkassistant/pk/mapper/PkInfoDao.java:112;src/main/java/vvpkassistant/pk/service/PKServiceImpl.java:162 picked_reason:跨表归位已完成,当前可独立处理动态筛选与排序保序风险。 | review_initial:selectPkInfoByCondition 已改为 Lambda 条件拼装,保留 sex/coin/country/pkTime/type 分支与 invite_status=0 过滤。 | validation_limited:mvn -q -DskipTests package 因仓库既有Lombok符号缺失失败,无法执行真实结果集对比。 | manual_test:修复编译基线后执行 mvn -q -DskipTests package;回归 /pk/pkList 在 condition 为空/有值、含/不含 userId 场景并核对顺序。 | evidence:排序通过 wrapper.last 保留 pin_expire_time + pin_create_time + id 组合语义。 | evidence:新增 asMap/asLong/asInteger 做条件值兼容解析,未知/非法值安全忽略。 | risk:medium 条件值类型异常时采用忽略策略,需业务确认是否应转为参数错误。 | done_at:2026-02-08
10 CMLR-080 P0 7 backend 完成编译与分层自动化测试 完成全量编译,并为改造影响的 Controller/DAO 补齐最低成功+失败用例,确保可持续回归。 `mvn clean test` 通过;涉及改造的每个 Controller 至少 1 个成功 + 1 个失败/校验用例;关键 DAO 有等价查询测试。 AUTOSERVER 测试需覆盖分页、幂等、非法参数、空结果等分支;失败断言使用稳定错误码/消息。 回归前后测试结果可追溯(命令+结果),新增测试不得依赖脆弱时间窗口。 未开始 未开始 未开始 未提交 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:24;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:148;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:199;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:236
11 CMLR-090 P0 8 both 核心链路端到端回归 围绕分页、置顶、邀请状态、主播 ID 脱敏、签到幂等等关键路径执行联调回归,确认接口输出完全兼容。 关键路径回归清单全部通过;至少覆盖 10 条核心接口用例并完成字段级比对;无阻断级差异。 AUTOE2E 联调前固定测试数据与时间窗口,避免误判;接口对比需包含状态码与响应字段。 增加并发与边界复测(重复邀请、重复签到、置顶过期边界),确认无行为漂移。 未开始 未开始 未开始 未提交 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:25;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:146;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:197;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:367
12 CMLR-100 P1 8.1 both 非改造模块冒烟回归 对 FunctionConfig/File/OTP 三个无 Map 改造模块执行冒烟,确保全局扫描与参数绑定未受影响。 `getAllConfig/updateConfigValue`、文件上传、OTP 获取各至少 1 成功 + 1 异常路径通过;返回结构与历史一致。 AUTOE2E 检查 Mapper 扫描、全局配置与 multipart 绑定是否因改造受影响。 回归覆盖配置更新可见性、空文件上传、密钥异常等边界。 未开始 未开始 未开始 未提交 plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:305;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:329;plan/2026-02-08_19-56-54-controller-map-lambda-refactor.md:352

View File

@@ -1,7 +1,8 @@
package vvpkassistant.pk.mapper; package vvpkassistant.pk.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.ibatis.annotations.*; import org.apache.ibatis.annotations.Mapper;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import vvpkassistant.pk.model.PkInfoModel; import vvpkassistant.pk.model.PkInfoModel;
@@ -12,36 +13,56 @@ import java.util.Map;
public interface PkInfoDao extends BaseMapper<PkInfoModel> { public interface PkInfoDao extends BaseMapper<PkInfoModel> {
//根据条件筛选pk列表数据 //根据条件筛选pk列表数据
@Select("<script>" + default List<PkInfoModel> selectPkInfoByCondition(
"SELECT * FROM pk_info " + int page,
"WHERE 1=1 " + int size,
" <if test='condition.sex != null'> AND sex = #{condition.sex} </if>" + // 性别筛选 Map<String, Object> condition,
" <if test='condition.coin != null'> " + // 金币筛选 long todayStart,
" AND coin BETWEEN #{condition.coin.start} AND #{condition.coin.end} " + long todayEnd
" </if>" + ) {
" <if test='condition.country != null'> AND country = #{condition.country} </if>" + LambdaQueryWrapper<PkInfoModel> wrapper = Wrappers.<PkInfoModel>lambdaQuery();
" <if test='condition.pkTime != null'> " + // pk时间筛选 if (condition != null) {
" AND pk_time BETWEEN #{condition.pkTime.start} AND #{condition.pkTime.end} " + Object sex = condition.get("sex");
" </if>" + if (sex != null) {
" <if test='condition.type == 1'> " + // 当天时间 wrapper.eq(PkInfoModel::getSex, sex);
" AND pk_time BETWEEN #{todayStart} AND #{todayEnd}" + }
" </if>" +
" <if test='condition.type == 2'> " + // 大于当天 Map<String, Object> coin = asMap(condition.get("coin"));
" AND pk_time > #{todayEnd}" + Long coinStart = asLong(coin == null ? null : coin.get("start"));
" </if>" + Long coinEnd = asLong(coin == null ? null : coin.get("end"));
" AND invite_status = 0 " + if (coinStart != null && coinEnd != null) {
"ORDER BY pin_expire_time > UNIX_TIMESTAMP() DESC, " + wrapper.between(PkInfoModel::getCoin, coinStart, coinEnd);
"CASE WHEN pin_expire_time > UNIX_TIMESTAMP() THEN pin_create_time ELSE NULL END ASC, " + }
"id DESC " +
"LIMIT #{page} , #{size}" + Object country = condition.get("country");
"</script>") if (country != null) {
List<PkInfoModel> selectPkInfoByCondition( wrapper.eq(PkInfoModel::getCountry, country);
@Param("page") int page, }
@Param("size") int size,
@Param("condition") Map<String, Object> condition, Map<String, Object> pkTime = asMap(condition.get("pkTime"));
@Param("todayStart") long todayStart, // 当天开始时间戳00:00:00 Long pkTimeStart = asLong(pkTime == null ? null : pkTime.get("start"));
@Param("todayEnd") long todayEnd // 当天结束时间戳23:59:59 Long pkTimeEnd = asLong(pkTime == null ? null : pkTime.get("end"));
); if (pkTimeStart != null && pkTimeEnd != null) {
wrapper.between(PkInfoModel::getPkTime, pkTimeStart, pkTimeEnd);
}
Integer type = asInteger(condition.get("type"));
if (type != null) {
if (type == 1) {
wrapper.between(PkInfoModel::getPkTime, todayStart, todayEnd);
} else if (type == 2) {
wrapper.gt(PkInfoModel::getPkTime, todayEnd);
}
}
}
wrapper.eq(PkInfoModel::getInviteStatus, 0);
wrapper.last(String.format(
"ORDER BY pin_expire_time > UNIX_TIMESTAMP() DESC, " +
"CASE WHEN pin_expire_time > UNIX_TIMESTAMP() THEN pin_create_time ELSE NULL END ASC, " +
"id DESC LIMIT %d, %d",
page, size));
return selectList(wrapper);
}
// 查询用户发布的大于当前时间的pk数据 // 查询用户发布的大于当前时间的pk数据
default List<PkInfoModel> queryCanUseData(Integer userId, Long time) { default List<PkInfoModel> queryCanUseData(Integer userId, Long time) {
@@ -88,4 +109,39 @@ public interface PkInfoDao extends BaseMapper<PkInfoModel> {
.gt(PkInfoModel::getPkTime, currentTime)); .gt(PkInfoModel::getPkTime, currentTime));
} }
static Map<String, Object> asMap(Object value) {
if (value instanceof Map) {
return (Map<String, Object>) value;
}
return null;
}
static Long asLong(Object value) {
if (value == null) {
return null;
}
if (value instanceof Number) {
return ((Number) value).longValue();
}
try {
return Long.parseLong(value.toString());
} catch (NumberFormatException e) {
return null;
}
}
static Integer asInteger(Object value) {
if (value == null) {
return null;
}
if (value instanceof Number) {
return ((Number) value).intValue();
}
try {
return Integer.parseInt(value.toString());
} catch (NumberFormatException e) {
return null;
}
}
} }