diff --git a/issues/2026-01-23_17-04-15-whitelist-order-status-complete.csv b/issues/2026-01-23_17-04-15-whitelist-order-status-complete.csv index 55b9f2e86..d64e28c95 100644 --- a/issues/2026-01-23_17-04-15-whitelist-order-status-complete.csv +++ b/issues/2026-01-23_17-04-15-whitelist-order-status-complete.csv @@ -1,6 +1,6 @@ "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" "WLOS-010","P0","1","backend","澄清白名单修正规则与验收口径","明确白名单支付订单的判定字段与状态修正边界,形成可实现/可测试的规则清单。","明确并在PR/变更说明中写清:1) 白名单判定字段(order_basic_info.pay_mode 是否足够,是否需校验 order_pay_record.pay_mode);2) 仅当 payMode=3 且订单状态为 ABNORMAL(4) 或 STAY_SETTLEMENT(2) 才允许修正;3) 修正为 ORDER_COMPLETE(6) 时需要同步的字段列表(settlement_time/金额字段/pay_status 等)与缺失数据的默认策略。","AUTOSERVER","Review过程中持续检查:规则是否与枚举一致;字段同步是否会影响分账/退款/通知/解锁等后续链路;是否需要审计/日志记录原状态。","完成后复核:规则与验收口径在代码/测试/接口行为三者一致;对非白名单/非目标状态无副作用。","已完成","已完成","已完成","已提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:16; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:17; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:18; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:20; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderPayModeEnum.java:11; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderPayRecordEnum.java:8; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderStatusEnum.java:12; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderStatusEnum.java:14; jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java:1244; jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java:5618; jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java:5693","picked_reason:define concrete rule set before wiring behavior in WLOS-040; done_at:2026-01-28; evidence:documented executable rule set in plan/2026-01-23_16-45-56-whitelist-order-status-complete.md; risk:low doc-only" -"WLOS-020","P0","2","backend","定位异常/待结算状态写入点并梳理影响面","确认订单进入 ABNORMAL/待结算/完成 的关键写入路径,决定修正应放在写入点还是补偿点,并列出受影响链路。","输出可审计的影响面清单(写在PR描述或变更说明中):至少包含白名单批量入口、订单标记异常位置、结算后落库完成位置;明确最终选择的修正插入点(例如统一补偿方法 + 入口调用)。","AUTOSERVER","检查是否存在并发/重复调用场景;是否有事务边界;是否会触发远程停机/拉取交易记录等外部依赖;异常原因字段/审计日志是否保留。","回归时覆盖:修正路径不会破坏正常结算完成流程;不会将真实异常订单误判为完成。","未开始","未开始","未开始","未提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:20; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:22; jsowell-admin/src/main/java/com/jsowell/service/TempService.java:1504; jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java:1043; jsowell-admin/src/main/java/com/jsowell/service/OrderService.java:528; jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java:247","" +"WLOS-020","P0","2","backend","定位异常/待结算状态写入点并梳理影响面","确认订单进入 ABNORMAL/待结算/完成 的关键写入路径,决定修正应放在写入点还是补偿点,并列出受影响链路。","输出可审计的影响面清单(写在PR描述或变更说明中):至少包含白名单批量入口、订单标记异常位置、结算后落库完成位置;明确最终选择的修正插入点(例如统一补偿方法 + 入口调用)。","AUTOSERVER","检查是否存在并发/重复调用场景;是否有事务边界;是否会触发远程停机/拉取交易记录等外部依赖;异常原因字段/审计日志是否保留。","回归时覆盖:修正路径不会破坏正常结算完成流程;不会将真实异常订单误判为完成。","已完成","已完成","已完成","已提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:20; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:22; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:42; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:51; jsowell-admin/src/main/java/com/jsowell/service/TempService.java:1504; jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java:1043; jsowell-admin/src/main/java/com/jsowell/service/OrderService.java:528; jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/RemoteStopChargingStrategy.java:85; jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/TransactionRecordsStrategy.java:617; jsowell-netty/src/main/java/com/jsowell/netty/strategy/ykc/TransactionRecordsStrategy.java:642; jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java:247","picked_reason:map status write paths before changing TempService入口逻辑; done_at:2026-01-28; evidence:documented status write paths + insertion point decision in plan/2026-01-23_16-45-56-whitelist-order-status-complete.md; risk:low doc-only" "WLOS-030","P0","3","backend","设计并落地统一的白名单订单完成补偿方法","在订单领域服务中新增可复用且幂等的补偿方法,专门用于白名单订单从异常/待结算修正为完成,并补齐必要字段。","新增补偿方法(如 completeWhitelistOrderIfNeeded(orderCode) 或等价实现):1) 判定 payMode=3 且状态在 {ABNORMAL, STAY_SETTLEMENT};2) 幂等(重复调用不产生额外副作用);3) 更新为 ORDER_COMPLETE 并处理 settlement_time(为空则置当前时间)及约定的金额/状态字段默认值;4) 记录可追溯日志(至少包含订单号、原状态、新状态)。","AUTOSERVER","检查金额字段默认策略是否会影响对账;时间字段是否符合既有语义;方法是否避免不必要的外部调用(如远程停机/拉交易)。","回归验证:在真实/模拟数据上重复调用、并发调用无异常;下游依赖(通知/解锁/MQ/分账退款)要么保持一致,要么明确不触发并有说明。","已完成","已完成","已完成","已提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:27; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:30; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:54; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderStatusEnum.java:14; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderPayModeEnum.java:11; jsowell-admin/src/main/java/com/jsowell/service/OrderService.java:1629; jsowell-admin/src/main/java/com/jsowell/service/WhitelistOrderCompletionDefaults.java:17; jsowell-admin/src/test/java/com/jsowell/service/WhitelistOrderCompletionDefaultsTest.java:1","picked_reason:unblocks core capability for WLOS-040/WLOS-050; done_at:2026-01-28; evidence:added completeWhitelistOrderIfNeeded + defaults helper + unit test; validation_limited:jsowell-admin module compilation fails due to missing types (e.g., CarNumberBindDTO, com.jsowell.pile.jcpp.*), tests not runnable until fixed; manual_test:mvn -pl jsowell-admin test -Dtest=WhitelistOrderCompletionDefaultsTest; risk:low additive method not yet wired into flows" "WLOS-040","P0","4","backend","改造白名单结算入口以支持异常/待结算并复用补偿逻辑","调整 TempService.whiteListSettlement 及对应接口,使其支持 ABNORMAL/待结算两种状态并调用统一补偿方法,避免硬编码与不必要外部依赖。","1) TempService.whiteListSettlement 支持状态=ABNORMAL 或 STAY_SETTLEMENT;2) payMode 判断改为使用 OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();3) 默认走统一补偿方法完成状态修正;4) 若保留 manualSettlementOrder 调用,需明确触发条件与降级策略(避免依赖外部设备/交易服务导致批量失败)。","AUTOSERVER","Review时重点:权限/入参校验是否合理;批量处理时的错误隔离与日志;是否需要对调用方预期做兼容(原先只允许异常)。","回归时验证:接口对非白名单/非目标状态不改动;批量输入中单个失败不影响其他(如有此需求则实现并说明)。","未开始","未开始","未开始","未提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:35; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:39; jsowell-admin/src/main/java/com/jsowell/service/TempService.java:1504; jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java:1043; jsowell-admin/src/main/java/com/jsowell/service/OrderService.java:749; jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderPayModeEnum.java:11","" "WLOS-050","P0","5","backend","补齐白名单状态修正的单测/集成测试与回归场景","为白名单订单状态修正逻辑新增测试用例,确保异常/待结算均可修正且非白名单不会被误改。","新增/更新测试并通过:1) 白名单+异常(4) -> 完成(6);2) 白名单+待结算(2) -> 完成(6);3) 非白名单订单不变;4) 关键字段(如 settlement_time)按约定填充;执行 `mvn -pl jsowell-admin test` 通过。","AUTOSERVER","Review时关注:测试数据构造是否贴近真实(金额/时间/状态);是否覆盖幂等与边界输入(空字段、重复调用)。","完成后回归:全量后端测试通过;若有接口层变化,补充接口测试或Mock验证。","未开始","未开始","未开始","未提交","","plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:41; plan/2026-01-23_16-45-56-whitelist-order-status-complete.md:46; jsowell-admin/src/main/java/com/jsowell/service/TempService.java:1504","" diff --git a/plan/2026-01-23_16-45-56-whitelist-order-status-complete.md b/plan/2026-01-23_16-45-56-whitelist-order-status-complete.md index fa35afd12..23097ea8e 100644 --- a/plan/2026-01-23_16-45-56-whitelist-order-status-complete.md +++ b/plan/2026-01-23_16-45-56-whitelist-order-status-complete.md @@ -35,9 +35,22 @@ created_at: 2026-01-23T16:45:56.6767838+08:00 2. 代码定位与影响面梳理 - 定位现有白名单异常订单批量处理入口:`jsowell-admin/src/main/java/com/jsowell/service/TempService.java` 的 `whiteListSettlement` 与 `jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java` 的 `/whiteListSettlement`。 - 查找订单状态被设置为异常/待结算的路径,确认修正应放在“状态写入点”还是“事后补偿点”。重点关注: - - `jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderStatusEnum.java` - - `jsowell-admin/src/main/java/com/jsowell/service/OrderService.java`(存在将充电中订单标记为异常的逻辑) - - `jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java`、`jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java`(结算后会落库为完成) + - `jsowell-common/src/main/java/com/jsowell/common/enums/ykc/OrderStatusEnum.java` + - `jsowell-admin/src/main/java/com/jsowell/service/OrderService.java`(存在将充电中订单标记为异常的逻辑) + - `jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java`、`jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java`(结算后会落库为完成) + +📌 影响面清单(可审计) +- 白名单批量入口(人工/管理接口):`TempController#/whiteListSettlement` → `TempService#whiteListSettlement`(当前仅允许异常订单、且硬编码 payMode=3,并调用 `OrderService#manualSettlementOrder`,会触发远程停机/拉交易记录等外部依赖)。 +- 订单标记异常(后管查询触发):`OrderService#getOrderDetail` 在“充电中”但实时数据缺失/超时场景会将订单置为 `ABNORMAL(4)` 并落库。 +- 待结算写入点(设备/交易链路): + - `RemoteStopChargingStrategy`:停机成功→`STAY_SETTLEMENT(2)`;停机失败→`ABNORMAL(4)`。 + - `TransactionRecordsStrategy`:收到交易记录后,若订单为 `ABNORMAL(4)` 会先改为 `STAY_SETTLEMENT(2)`,随后进入 `ProgramLogicFactory#getProgramLogic(...).settleOrder(...)` 完成结算落库。 + - 其他协议/平台(同类写入点):`jsowell-netty` 的 yunkuaichong handlers、`jsowell-thirdparty` 的 Huawei 等也存在将订单置为 `STAY_SETTLEMENT(2)` 的路径(需避免在这些写入点引入“白名单直接完成”造成副作用扩散)。 +- 结算后落库完成(核心):`AbstractProgramLogic#returnUpdateOrderBasicInfo` 会设置 `ORDER_COMPLETE(6)` 并写入结算时间/金额字段(及可能补 SOC)。 + +🧭 修正插入点选择(结论) +- 选择“事后补偿点”而不是在各类“状态写入点”分散修正:以统一补偿方法 + 白名单批量入口调用为主(后续可扩展定时任务/管理按钮复用该方法)。 +- 理由:避免侵入设备协议/交易记录链路(风险大、场景多);补偿方法可控、幂等、日志可追溯,且明确不触发远程停机/拉交易/MQ/解锁等外部副作用。 3. 设计修正策略(推荐“统一补偿方法”) - 在订单领域服务中新增一个可复用的方法(命名示例:`completeWhitelistOrderIfNeeded(orderCode)`),封装: