Kaynağa Gözat

fix(compile): 修复 Phase B 新增代码 + 2 处 shunfeng 历史歧义

Phase B 新增代码编译错误(本次修复):
- YDClient_FormImpl / YDClient_ProcessImpl: new McException(单参 String) 匹配到 McREnum 重载,改为 (code, message)
- YDClient_FormImpl / YDClient_ProcessImpl: DDR_New 字段为 code/message,之前误用 errorCode/errorMsg
- NonceCache: TimedCache 无 setCapacity,改用 LRUCache(capacity, ttl) 一步到位

shunfeng pre-existing 编译歧义(非本次新增):
- ZoomClientImpl.getMeeting: UtilHttp.doGet(url, header, null) 对 3 参 Map 与 Class 重载歧义 → (Map) null 显式
- MeetingServiceImpl.buildScheduleBody*: UtilMap.map("summary,start,end", subject, start, end) 命中 void 重载 → (Object) subject 选 varargs

验证:mvn -pl mjava-mcli,mjava-shunfeng,mjava-guangming -am compile 全部通过

同步勾掉 init-project-baseline tasks.md 5.4。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
malk 2 hafta önce
ebeveyn
işleme
c1fa189160

+ 3 - 2
mjava-shunfeng/src/main/java/com/malk/shunfeng/service/impl/MeetingServiceImpl.java

@@ -151,7 +151,8 @@ public class MeetingServiceImpl implements MeetingService {
         Object endTimeRaw = meetingInfo.getOrDefault("end_time", body.get("end_time"));
         Map start = UtilMap.map("dateTime, timeZone", String.valueOf(startTimeRaw), "Asia/Shanghai");
         Map end = UtilMap.map("dateTime, timeZone", String.valueOf(endTimeRaw), "Asia/Shanghai");
-        return UtilMap.map("summary, start, end", subject, start, end);
+        // cast 首参为 Object 以选 varargs 版 UtilMap.map(String, Object...) 避免命中 void 重载
+        return UtilMap.map("summary, start, end", (Object) subject, start, end);
     }
 
     /**
@@ -164,7 +165,7 @@ public class MeetingServiceImpl implements MeetingService {
         Map start = UtilMap.map("dateTime, timeZone", startTime, "Asia/Shanghai");
         // fixme: Zoom 无 end_time,通过 start_time + duration(分钟)推算
         Map end = UtilMap.map("dateTime, timeZone", startTime, "Asia/Shanghai");
-        return UtilMap.map("summary, start, end", subject, start, end);
+        return UtilMap.map("summary, start, end", (Object) subject, start, end);
     }
 
     private void assertPlatform(String platform) {

+ 1 - 1
mjava-shunfeng/src/main/java/com/malk/shunfeng/service/impl/ZoomClientImpl.java

@@ -88,7 +88,7 @@ public class ZoomClientImpl implements ZoomClient {
     public ZoomR getMeeting(String meetingId) {
         String url = zoomConf.getApiHost() + "/meetings/" + meetingId;
         Map header = buildAuthHeader();
-        String rsp = UtilHttp.doGet(url, header, null);
+        String rsp = UtilHttp.doGet(url, header, (Map) null);
         return parseAndAssert(rsp, "查询 Zoom 会议失败");
     }
 

+ 5 - 5
mjava/src/main/java/com/malk/core/NonceCache.java

@@ -1,7 +1,7 @@
 package com.malk.core;
 
 import cn.hutool.cache.CacheUtil;
-import cn.hutool.cache.impl.TimedCache;
+import cn.hutool.cache.impl.LRUCache;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -11,7 +11,8 @@ import java.util.concurrent.TimeUnit;
 /**
  * Nonce 去重缓存(capability: replay-guard)
  *
- * <p>基于 Hutool {@link TimedCache} 实现。TTL = {@code mjava.auth.window + 30s}。
+ * <p>基于 Hutool {@link LRUCache} 实现(兼顾容量上限 + 过期)。
+ * TTL = {@code mjava.auth.window + 30s}。
  * 单 JVM 实例生效;多实例场景需升级分布式缓存(独立 change 评估)。</p>
  */
 @Component
@@ -23,13 +24,12 @@ public class NonceCache {
     @Value("${mjava.auth.nonce-cache-size:10000}")
     private int capacity;
 
-    private TimedCache<String, Long> cache;
+    private LRUCache<String, Long> cache;
 
     @PostConstruct
     public void init() {
         long ttlMs = TimeUnit.SECONDS.toMillis(windowSeconds + 30);
-        this.cache = CacheUtil.newTimedCache(ttlMs);
-        this.cache.setCapacity(capacity);
+        this.cache = CacheUtil.newLRUCache(capacity, ttlMs);
     }
 
     /**

+ 6 - 3
mjava/src/main/java/com/malk/service/aliwork/impl/YDClient_FormImpl.java

@@ -82,10 +82,13 @@ public class YDClient_FormImpl implements YDClient_Form {
 
     private DDR_New assertResult(DDR_New ddr, String action) {
         if (ddr == null) {
-            throw new McException("宜搭接口 [" + action + "] 返回空");
+            throw new McException("YIDA_NULL_RESPONSE", "宜搭接口 [" + action + "] 返回空");
         }
         if (!ddr.isSuccess()) {
-            throw new McException("宜搭接口 [" + action + "] 失败: " + ddr.getErrorCode() + " - " + ddr.getErrorMsg());
+            throw new McException(
+                    ddr.getCode() == null ? "YIDA_ERROR" : ddr.getCode(),
+                    "宜搭接口 [" + action + "] 失败: " + ddr.getMessage()
+            );
         }
         return ddr;
     }
@@ -196,7 +199,7 @@ public class YDClient_FormImpl implements YDClient_Form {
     public Map<String, Object> searchForm(YDAuth auth, String formUuid, String searchFieldJson,
                                           Integer currentPage, Integer pageSize, Map<String, Object> body_ext) {
         if (pageSize != null && pageSize > YDConf.PAGE_SIZE_LIMIT) {
-            throw new McException("pageSize 不能超过 " + YDConf.PAGE_SIZE_LIMIT);
+            throw new McException("YIDA_PAGESIZE_EXCEEDED", "pageSize 不能超过 " + YDConf.PAGE_SIZE_LIMIT);
         }
         Map<String, Object> body = body(auth);
         body.put("formUuid", formUuid);

+ 6 - 3
mjava/src/main/java/com/malk/service/aliwork/impl/YDClient_ProcessImpl.java

@@ -64,10 +64,13 @@ public class YDClient_ProcessImpl implements YDClient_Process {
 
     private DDR_New assertResult(DDR_New ddr, String action) {
         if (ddr == null) {
-            throw new McException("宜搭流程接口 [" + action + "] 返回空");
+            throw new McException("YIDA_NULL_RESPONSE", "宜搭流程接口 [" + action + "] 返回空");
         }
         if (!ddr.isSuccess()) {
-            throw new McException("宜搭流程接口 [" + action + "] 失败: " + ddr.getErrorCode() + " - " + ddr.getErrorMsg());
+            throw new McException(
+                    ddr.getCode() == null ? "YIDA_ERROR" : ddr.getCode(),
+                    "宜搭流程接口 [" + action + "] 失败: " + ddr.getMessage()
+            );
         }
         return ddr;
     }
@@ -199,7 +202,7 @@ public class YDClient_ProcessImpl implements YDClient_Process {
     public Map<String, Object> searchProcesses(YDAuth auth, String formUuid, String processCode, String searchFieldJson,
                                                Integer currentPage, Integer pageSize, Map<String, Object> body_ext) {
         if (pageSize != null && pageSize > YDConf.PAGE_SIZE_LIMIT) {
-            throw new McException("pageSize 不能超过 " + YDConf.PAGE_SIZE_LIMIT);
+            throw new McException("YIDA_PAGESIZE_EXCEEDED", "pageSize 不能超过 " + YDConf.PAGE_SIZE_LIMIT);
         }
         Map<String, Object> body = body(auth);
         body.put("formUuid", formUuid);

+ 2 - 2
openspec/changes/init-project-baseline/tasks.md

@@ -24,5 +24,5 @@
 - [x] 5.1 `ls /Users/malk/server/cur/mjava-ai/openspec/specs/` 含 `project-baseline.md`
 - [x] 5.2 `ls /Users/malk/Desktop/Tech/claude/后端/` 含 `CLAUDE.md` `mjava-baseline.md` `yida-serverside.md`
 - [x] 5.3 `ls /Users/malk/server/` 只剩 `_Tool cur pre`
-- [ ] 5.4 `mvn -pl mjava-mcli -am clean compile`(在 `/Users/malk/server/cur/mjava-ai/` 下)通过
-      — **阻塞**:本机未装 Maven(见 memory `todo_install_maven.md`);`brew install maven` 后补做
+- [x] 5.4 `mvn -pl mjava-mcli,mjava-shunfeng,mjava-guangming -am compile` 全部通过(2026-04-19 验证)
+      — 顺带修复两处 pre-existing 编译歧义:ZoomClientImpl 的 `UtilHttp.doGet(url, header, null)` 与 MeetingServiceImpl 的 `UtilMap.map(summary,start,end, subject...)` 重载冲突,显式 cast 后编译通过