cc 3 tygodni temu
rodzic
commit
30ad6557bb

+ 43 - 0
.workbuddy/memory/2026-09-16.md

@@ -133,4 +133,47 @@ SKILL.md 里写了完整 9 步修复流程与本机编译方式。
 - `eslint`(3 文件,`--max-warnings 0`)→ 0 错误
 - `vue-tsc --noEmit` → 这三个文件 **0 错误**,全仓错误总数仍为 103(与改动前一致,无新增)
 
+---
+
+## Result 包装复核(2026-09-16 晚,用户要求)
+
+需求:「检查所有 controller 的接口返回结果是不是又缺 Result 包裹,有就加上」。
+
+### 审计口径与结果
+全量扫描 45 个 controller → **165 个方法级端点**(用「方法级映射注解总数 = 165」做过完整性交叉校验,**无遗漏**):
+| 类别 | 数量 |
+| --- | --- |
+| 已 `Result` 包裹 | 151 |
+| 流式 / ResponseEntity(不适用) | 3(`/govern/sse`、`/chat/stream` 的 SseEmitter + `/py/files/**` 的 ResponseEntity) |
+| **刻意裸返回(保持不动)** | 11(`AgentChatController` 10 个 `/chat/**` + `AgentResultController` 的 `/chat/results/{resultId}`) |
+| **漏网缺陷(已修)** | 2 |
+
+### 修掉的 2 个(`DataProfileController`)
+- `GET /dp/callStat`:`CallDataProfileStatDTO` → `Result<CallDataProfileStatDTO>`
+- `GET /dp/transStat`:`TransDataProfileStatDTO` → `Result<TransDataProfileStatDTO>`
+前端 `person/api/dpApi.ts` 用 `defHttp.get<...>` 默认 transform 读 `{code,message,data}`,
+裸返回必然走到 `code !== 200` 分支 → 画像页通话/交易统计直接报「接口请求出错」。
+
+### ★ 为什么上一轮批量脚本会漏掉这两个
+它们的注解与方法签名之间夹了一行注释(Solon 迁移遗留):
+```java
+@GetMapping("/callStat")
+//@Cache(key = "dp_callStat_${personName}", tags = StrConsts.CACHE_TAG_QING_JIAN)
+public CallDataProfileStatDTO callInfoStat(String personName) { ... }
+```
+「紧跟映射注解去找方法签名」的解析逻辑遇到注释行就失配 → 整个端点被跳过。
+**教训:任何注解/签名扫描都必须做完整性交叉校验**(映射注解总数 vs 解析端点数),否则静默漏项。
+
+### 刻意裸返回清单的判定依据(不要再"修"它们)
+- `/chat/**`:前端 `aiHttp.postRaw/getRaw/putRaw/deleteRaw`(`{ isTransformResponse: false }`)
+- `/chat/results/{resultId}`:同上,且 404 语义=结果过期
+- `/py/files/**`:`ResponseEntity` 直出文件
+- `/govern/sse`、`/chat/stream`:`SseEmitter` 流式
+
+### 验证
+- 复扫:151 + 3 + 11 = 165 ✓
+- `mvn -pl ai-server -B clean compile` → **BUILD SUCCESS**
+- 审计脚本已归档到 skill:`scripts/audit-result-wrap.cjs`
+
+
 

+ 4 - 4
ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java

@@ -38,8 +38,8 @@ public class DataProfileController {
      */
     @GetMapping("/callStat")
     //@Cache(key = "dp_callStat_${personName}", tags = StrConsts.CACHE_TAG_QING_JIAN)
-    public CallDataProfileStatDTO callInfoStat(String personName) {
-        return dataProfileService.callInfoStat(personName);
+    public Result<CallDataProfileStatDTO> callInfoStat(String personName) {
+        return Result.succeed(dataProfileService.callInfoStat(personName));
     }
 
     /**
@@ -103,8 +103,8 @@ public class DataProfileController {
      */
     @GetMapping("/transStat")
     //@Cache(key = "dp_transStat_${personName}", tags = StrConsts.CACHE_TAG_QING_JIAN)
-    public TransDataProfileStatDTO transInfoStat(String personName) {
-        return dataProfileService.transInfoStat(personName);
+    public Result<TransDataProfileStatDTO> transInfoStat(String personName) {
+        return Result.succeed(dataProfileService.transInfoStat(personName));
     }
 
     /**