瀏覽代碼

docs(进件): 三-A 计划预检修正 - 移除零消费方枚举,修正测试断言对象

alphaH 3 周之前
父節點
當前提交
fd8e2d8d10
共有 1 個文件被更改,包括 5 次插入 和 5 次删除
  1. 5 5
      .claude/plan/2026-09-22-lsy-onboarding-A.md

+ 5 - 5
.claude/plan/2026-09-22-lsy-onboarding-A.md

@@ -79,7 +79,8 @@
 | `java/src/main/java/com/payment/platform/module/payment/leshouying/dto/LsyShopItemDTO.java` | 门店列表一项 |
 | `java/src/main/java/com/payment/platform/module/payment/leshouying/dto/LsyReviewStatusDTO.java` | 审核状态:`reviewedStatus`(原值)/ `reviewedReason` / `statusText` |
 | `java/src/main/java/com/payment/platform/module/payment/leshouying/enums/LsyReviewStatus.java` | 「商户审核主动查询」**这一套**值域 → 文案。javadoc 必须写明它**不通用** |
-| `java/src/main/java/com/payment/platform/module/payment/leshouying/enums/LsyMerchantType.java` | `1企业 / 2个体工商户 / 3小微商户`(spec §6.2(a) 的裁定) |
+
+> ★ **`LsyMerchantType` 不在本批次**(预检时从 Task 3 移除):`merchant_type` 是**创建商户**的必填字段,属三-B。三-A 这六个接口里没有任何一个读它 ⇒ 建出来就是零消费方的投机代码。spec §6.2(a) 那条裁定(`1企业/2个体工商户/3小微商户`)**留在 spec 里**,三-B 用到时照着建。
 
 **修改:**
 
@@ -225,7 +226,6 @@ git commit -m "feat(进件): LeshouyingClient 补 /api/* 出站腿 - 信封与 /
 **Files:**
 - Create: `.../leshouying/service/LsyOnboardingService.java`
 - Create: `.../leshouying/dto/LsyAreaItemDTO.java`
-- Create: `.../leshouying/enums/LsyMerchantType.java`
 - Test: `.../service/LsyOnboardingServiceTest.java`
 
 **Interfaces:**
@@ -261,7 +261,7 @@ git commit -m "feat(进件): LeshouyingClient 补 /api/* 出站腿 - 信封与 /
 - 路径字面量就地写:`client.postApi("/api/info/area", p)`(与 `LsyQueryService` 写 `"/v3/queryorder"` 一致)。
 - DTO 用 `@Data`,字段 `areaName` / `areaCode`,**`areaCode` 必须是 `String`**,javadoc 指向 page 196236568 的 `100G` 反例。
 - `area_list` 取值要做**防御性读取**:上游没返回该键、返回 null、或返回的不是 List,都归成空列表。不引入 Jackson 反序列化 —— 本模块既有风格是直接读 `Map<String,Object>` 再手工映射。
-- `LsyMerchantType` 枚举:`ENTERPRISE("1","企业")` / `INDIVIDUAL("2","个体工商户")` / `MICRO("3","小微商户")`,javadoc 写明 spec §6.2(a) 的裁定依据(三处一致 vs 行业类目页有复制痕迹)。本 task **只建枚举不使用** —— 它是 Task 5 的依赖,先建好是为了让 Task 5 不返工。
+- **★ 测试骨架的注记**:`LsyOnboardingServiceTest` 里 mock 的是 **`LeshouyingClient`**(不是 `RestTemplate` —— 那个在客户端内部,服务层看不见)。所以本类里一切「没有出海」的断言都写作 `verifyNoInteractions(client)`。Task 5 / Task 6 同理。
 
 - [ ] **Step 4: 跑测试确认绿**
 
@@ -372,7 +372,7 @@ Run: `... -Dtest=LsyOnboardingServiceTest`
 |---|---|
 | `createShop_sendsManagerNameSpelledAsTable` | 抓出站 map ⇒ 含 `manager_name` 与 `manager_phone`,**不含** `maneger_name`/`maneger_phone`。**这条钉 R-2 的裁定**,且真机确认后若需翻转,改常量即可 |
 | `createShop_allEightBusinessFieldsAreSent` | 抓出站 map ⇒ 键集合**恰好**是 `{inst_no, trace_no, merchant_no, shop_name, shop_phone, shop_address, manager_name, manager_phone, sign}`。**集合相等**,不是 `contains` —— 多发的字段会进签名,上游可能因此判「参数不合法」 |
-| `createShop_blankRequiredField_throws400` | 八个业务字段逐个置空白(参数化或循环)⇒ 全部抛 `BusinessException(400, ...)`,且**一次上游调用都没发出**(`verifyNoInteractions(restTemplate)`)。**这条钉的是本地校验先于出站** |
+| `createShop_blankRequiredField_throws400` | 八个业务字段逐个置空白(参数化或循环)⇒ 全部抛 `BusinessException(400, ...)`,且**一次上游调用都没发出**(`verifyNoInteractions(client)`)。**这条钉的是本地校验先于出站** |
 | `createShop_returnsShopNo` | 桩返回 `{"result_code":"SUCCESS","shop_no":"861907240003"}` ⇒ 返回 `"861907240003"` |
 | `createShop_missingShopNo_throws` | 桩返回 `{"result_code":"SUCCESS"}`(**无** `shop_no`)⇒ 抛异常(**不要让 null 一路往外走**:上游说成功却没给门店号,调用方拿 null 存库就是一条查不回来的记录)。异常类型由实现者定,测试与实现一致即可,javadoc 写明 |
 | `listShops_mapsFourFields` | 桩返回 page 196236560 的返回示例(**注意**:该示例里 `"trace_no": "123456"` 后面**缺一个逗号**,是非法 JSON —— 测试里要**补上逗号**再用,不要照抄)⇒ 四项都映射上 |
@@ -426,7 +426,7 @@ Run: `... -Dtest=LsyOnboardingServiceTest`
 | `uploadImage_sendsImgNameAndFile` | 抓 multipart 部件 ⇒ `img_name` 等于传入文件名、`img_file` 是文件部件 |
 | `uploadImage_returnsImgUrl` | 桩返回 `{"result_code":"SUCCESS","img_url":"http://www.abc.com/picture/xxx.jpg"}` ⇒ 返回该 URL |
 | `uploadImage_missingImgUrl_throws` | 桩返回 `{"result_code":"SUCCESS"}`(**无** `img_url`)⇒ 抛异常,不返回 null。同 `createShop_missingShopNo_throws` 的理由 |
-| `uploadImage_oversize_rejectedLocally` | 传 `uploadMaxBytes + 1` 字节 ⇒ 抛 `BusinessException(400, ...)`,且 **`verifyNoInteractions(restTemplate)`**(**没有出海**)。**★ 这条钉 R-3 的护栏真的在出站之前** |
+| `uploadImage_oversize_rejectedLocally` | 传 `uploadMaxBytes + 1` 字节 ⇒ 抛 `BusinessException(400, ...)`,且 **`verifyNoInteractions(client)`**(**没有出海**)。**★ 这条钉 R-3 的护栏真的在出站之前** |
 | `uploadImage_exactlyAtLimit_accepted` | 传**恰好** `uploadMaxBytes` 字节 ⇒ **通过**。**★ 边界闭区间**:`>` 还是 `>=` 在中文里都可读成「超过上限」,代码只能选一个,这条把它钉死 |
 | `uploadImage_emptyBytes_rejected` | 传 0 字节 ⇒ `BusinessException(400, ...)` |
 | `uploadImage_disallowedExtension_rejected` | `evil.exe` / `x.jpg.php` / `x`(无后缀)⇒ 400。`a.JPG`(大写)⇒ **通过**(扩展名匹配不区分大小写,这条钉住那个 `toLowerCase`) |