Browse Source

docs(交付): 门店地区交付说明 —— 补 400 订正与产物重打读数

- 提交清单补第 6 刀 `300a27f9`(5 个 → 6 个未 push)
- 产物指纹换成重打后的那一版(jar `b6b64c8a…` / dist.zip `80038a66…`),
  旧指纹划掉;开包验法写成「从 jar 取 class 反汇编,两处 sipush 400」;
  dist 那 103 个改名 chunk 的来由(Rollup [hash] 含依赖哈希)与两向读数一并记上
- §二 整包读数补 12:47 复跑(400 订正后 1212/0/0/0)
- §五 改成「两件拍板(你已裁定:① 我解决、② 保持现状)」,docx 那条记为保持现状;
  另标出 third_shop_id 重复仍是 500 属**本次裁定范围之外,未动**
alphaH 1 week ago
parent
commit
a6bdcc4e11
1 changed files with 34 additions and 18 deletions
  1. 34 18
      .claude/plan/2026-10-08-har-shop-region-交付说明.md

+ 34 - 18
.claude/plan/2026-10-08-har-shop-region-交付说明.md

@@ -11,9 +11,9 @@
 ★ 这一批**没有写计划文件**(前几批是 `.claude/plan/<日期>-<主题>.md`),需求以 docx + 上述裁定
 为准,落地过程与读数都在 `logs/` 下的日志里 —— 这点与既有批次不同,先说明。
 
-## 一、提交清单(5 个,全部**未 push**)
+## 一、提交清单(6 个,全部**未 push**)
 
-`origin/java` 停在 `ed24480f`;本地 `java` 领先 5 个提交:
+`origin/java` 停在 `ed24480f`;本地 `java` 领先 6 个提交:
 
 | 提交 | 内容 |
 |---|---|
@@ -22,15 +22,19 @@
 | `c47b0c63` | (三)省市目录只读端点 `GET /payment/har/region/provinces|cities` + `db/har-shop-region.sql` |
 | `8e352e7e` | (四)前端:门店表单省→市选择器、列表「地区」列、详情一行;开放 API 文档 §10.1 同步 |
 | `ccc34414` | 文档 markdown 空行修正(引用块贴着 `---` 会被当成懒惰续行) |
+| `300a27f9` | (五)编码填错统一 400:`HarShopService#requireKnownCity` 两处单参 `BusinessException`(默认码 500)改显式 400;两条地区拒收用例补码断言(先红后绿);开放文档 §10.1 补码值 |
 
 ★ **`b1c8f6fb` 里夹带了一份 `支付宝支付接口接入规范261008(1).docx`(87512 字节)** ——
 那是开工时会话开始前就已经 `git add` 进索引的文件,提交时没有指定路径,于是跟着这一刀进去了。
-**我没有改写历史**(改写会动到你已经能看到的提交),要不要摘出来请你定:留着无功能影响,
-摘掉需要 rebase/改写。后续提交都改成「显式路径 `git add` + `git commit -F <msg> -- <显式路径>`」。
+**我没有改写历史**(改写会动到你已经能看到的提交)。**你的裁定是保持现状**(2026-10-08),
+本批不再动它:留着无功能影响,摘掉需要 rebase/改写。后续提交都改成
+「显式路径 `git add` + `git commit -F <msg> -- <显式路径>`」。
 
 ## 二、验证读数(本机实测,不是推断)
 
-- 整包 `mvn test`:**1212 条,0 失败 0 错误 0 跳过,BUILD SUCCESS**(12:44:08;
+- 整包 `mvn test`:**1212 条,0 失败 0 错误 0 跳过,BUILD SUCCESS**
+  (★ 两条读数:第一条 12:44:08 在 `300a27f9` 之前;400 订正后 **12:47 复跑同数**
+  = 1212/0/0/0,21.4s,日志 `logs/_mvn-full-region-code-400.txt`;
   `HarCheckoutControllerTest` 24 + `HarRegionControllerTest` 5 都在内)
 - 两向变异(每条都先确认变异体生效,还原后 sha256 复核回基线):
 
@@ -49,12 +53,19 @@
   - Element Plus 用法对着**装好的包**核过(2.14.0 `select.mjs`):`loading: Boolean`
     「whether Select is loading data from server」、`disabled: Boolean` —— 不是凭记忆。
 
-- 产物指纹:
-  - `java/target/payment-platform-1.0.0.jar`,143,146,829 字节,**sha256 `977da28010f737bdde382af5a34b5a46a0967e607a62573231e5867ef0d0f4f9`**,
-    重打于 12:45:02;已开包确认含 `HarRegionController.class`、`HarRegionVO.class`,
-    且包内 `har-region-cn.json` 与源码 sha256 一致(`23c713b1…`)
-  - `frontend/dist.zip`,9,375,221 字节,**sha256 `dd4cf524bc11bc32d4a4e831793035b2ba2ca53b6ed0f957682c43708750dab1`**,
-    281 个条目(与上一版同形:`dist/` 开头、**全为正斜杠**、`testzip()` 无坏成员)
+- 产物指纹(★ 下面这版是**要部署的**,12:51/12:53 在 `300a27f9` 之后重打):
+  - `java/target/payment-platform-1.0.0.jar`,143,146,853 字节,**sha256 `b6b64c8ad8455d4e1e0639d7d8ad04ea9db347292ec75bb81cb384213379068d`**,
+    重打于 12:51:49;开包验的是产物本身:从 jar 里取 `HarShopService.class` 反汇编
+    (`javap -p -c`),两处拒收都是 `sipush 400` → `BusinessException.<init>:(ILjava/lang/String;)V`
+  - `frontend/dist.zip`,9,375,214 字节,**sha256 `80038a66ef9dd73678ec5d9158f66763eef6f4451feb9f3fd9b92d50a2468fa6`**,
+    12:53:49;281 个条目 = 277 文件 + 4 个目录条目(`dist/`、`dist/css/`、`dist/img/`、`dist/js/`,
+    与上一版同形:**全为正斜杠**、`testzip()` 无坏成员)
+  - 这两版之前的旧件已被取代,别再照旧指纹核产物:
+    ~~jar `977da280…`(143,146,829 字节,12:45:02)、`dist.zip` `dd4cf524…`(9,375,221 字节)~~
+  - 文档改了一行 ⇒ dist 里 **103 个 chunk 的文件名哈希跟着变了**(Rollup 的 `[hash]` 含依赖哈希,
+    一处内容改动脉冲式传播),条目数没变(前后各 277 个文件)。两向读数:旧包里只有旧句
+    `不属于该省的编码会被拒`(在 `js/index.SNmFzXAj.js`),新包里只有新句 `编码填错一律`
+    (在 `js/index.ruVK6GJ7.js`),互不相见 —— 不是「重建后一律变」的空话
 
 ## 三、部署要求(按顺序,第 1 步不做就没有后面)
 
@@ -87,15 +98,20 @@
    不是本次引入):`shopName` 我方 `@Size(128)` vs 规范 varchar(16);`thirdShopCode` 32 vs 30;
    实体列宽按规范 16 建。
 
-## 五、要你知悉 / 拍板的两件
+## 五、两件拍板(你已裁定:① 我解决、② 保持现状)
 
-1. **同类错误码两处不一致**(本次实测发现):编码不认识时,
-   `HarRegionController` 返回 `code=400`(我写的,两参构造),
+1. **同类错误码两处不一致 —— 已按裁定修掉(`300a27f9`)**:编码不认识时,
+   `HarRegionController` 返回 `code=400`(两参构造),
    而 `HarShopService#requireKnownCity` 返回 **`code=500`**(单参 `BusinessException` 的默认码)。
-   后者是对外开放 API 也会走到的路径 ⇒ 外部调用方传错码会看到「服务器错误」。**我没有改它**
-   (改的是既有端点契约 + 要动它的用例),只把开放文档按**实测**口径写成 500。要不要统一成 400,
-   请你定。
-2. **`third_shop_id` 重复被判 `code=500`** 是文档里的既有说法,同上一类,本次未动。
+   后者是对外开放 API 也会走到的路径 ⇒ 外部调用方传错码会看到「服务器错误」。
+   现在两处都是显式 400,**文案一字未动**。读数:给两条地区拒收用例各加一条
+   `assertEquals(400, e.getCode())` 后实测红(`expected: <400> but was: <500>`,两条都红,
+   同类其余 16 条绿)→ 改完该件 18/18 绿 → 整包 **1212/0/0/0**(21.4s)。
+   开放文档 §10.1 那句从「只写 msg 形状、不写码值」改成写死 `code=400`(按上面的实测口径)。
+2. **`b1c8f6fb` 里的 docx:保持现状**(按裁定未动,历史未改写)。
+3. 顺带说明(**不在本次裁定范围,仍未动**):**`third_shop_id` 重复仍是 `code=500`**
+   —— 它与上面同类,但只有一处入口、且开放文档第 82 行已按 500 写给外部调用方,
+   改它等于动一条既有对外契约。要统一请单独说。
 
 另:`probe` 结论提醒 —— 顾客端拒收文案能上屏,是因为 `GlobalExceptionHandler` 对
 `BusinessException` **不带 `@ResponseStatus`**(HTTP 200 + body `code`),顾客页自建实例