cc 5 روز پیش
والد
کامیت
f9b93c7122

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/common/constants/FileTypeConstants.java

@@ -58,7 +58,7 @@ public class FileTypeConstants {
      * <p>无后缀文件({@code file_info.fileType = "unknown"})不在白名单里 ——
      * 拿不到后缀就无法在抽样本之前判断类型,按「其他都不识别」处理。
      *
-     * <p>★ 加后缀时注意:{@code csv / xls / xlsx} <b>不要</b>加进来 ——
+     * <p>加后缀时注意:{@code csv / xls / xlsx} <b>不要</b>加进来 ——
      * 它们走表格解析流水线,根本不会走到 AI 识别这条路。
      */
     public static final Set<String> AI_RECOGNIZABLE_SUFFIXES = Set.of(

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/agent/insight/agent/InsightAgentFactory.java

@@ -40,7 +40,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
- * AI 研判 Agent 实例工厂(★ 独立实例池)。
+ * AI 研判 Agent 实例工厂(独立实例池)。
  *
  * <h3>为什么必须新开池,而不是复用 {@code AgentService#agentPool}</h3>
  * 现有池的 key 是 {@code w{ws}-a{agent}-m{model}} —— <b>没有 sysPrompt 维度</b>。

+ 4 - 4
ai-server/src/main/java/com/zsjz/ai/module/agent/insight/entity/AgentInsightMessage.java

@@ -31,11 +31,11 @@ public class AgentInsightMessage {
     @TableField("session_id")
     private Long sessionId;
 
-    /** ★ 冗余自会话表:保证消息查询永远可带 case_id 过滤 */
+    /** 冗余自会话表:保证消息查询永远可带 case_id 过滤 */
     @TableField("case_id")
     private Long caseId;
 
-    /** ★ 会话内单调递增序号,分页排序列(勿用 create_at / id 排序) */
+    /** 会话内单调递增序号,分页排序列(勿用 create_at / id 排序) */
     @TableField("seq")
     private Long seq;
 
@@ -58,11 +58,11 @@ public class AgentInsightMessage {
     @TableField(value = "metadata", typeHandler = JsonbTypeHandler.class, jdbcType = JdbcType.OTHER)
     private String metadata;
 
-    /** ★ 工具调用明细(单条可达数百 KB,列表查询一律不 select) */
+    /** 工具调用明细(单条可达数百 KB,列表查询一律不 select) */
     @TableField(value = "tool_events", typeHandler = JsonbTypeHandler.class, jdbcType = JdbcType.OTHER)
     private String toolEvents;
 
-    /** ★ ```insight 结构化产物(仅首轮 assistant 消息有值) */
+    /** ```insight 结构化产物(仅首轮 assistant 消息有值) */
     @TableField(value = "output_json", typeHandler = JsonbTypeHandler.class, jdbcType = JdbcType.OTHER)
     private String outputJson;
 

+ 4 - 4
ai-server/src/main/java/com/zsjz/ai/module/agent/insight/entity/AgentInsightSession.java

@@ -25,7 +25,7 @@ public class AgentInsightSession {
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
-    /** ★ 案件级硬隔离边界:所有查询强制携带 */
+    /** 案件级硬隔离边界:所有查询强制携带 */
     @TableField("case_id")
     private Long caseId;
 
@@ -49,7 +49,7 @@ public class AgentInsightSession {
     @TableField("title")
     private String title;
 
-    /** ★ 查询条件 + 结果快照 JSON(动态 sysPrompt 的数据源) */
+    /** 查询条件 + 结果快照 JSON(动态 sysPrompt 的数据源) */
     @TableField(value = "context", typeHandler = JsonbTypeHandler.class, jdbcType = JdbcType.OTHER)
     private String context;
 
@@ -57,7 +57,7 @@ public class AgentInsightSession {
     @TableField("context_hash")
     private String contextHash;
 
-    /** ★ 会话内实际使用的完整 sysPrompt(不可变,不通过接口下发) */
+    /** 会话内实际使用的完整 sysPrompt(不可变,不通过接口下发) */
     @TableField("sys_prompt")
     private String sysPrompt;
 
@@ -65,7 +65,7 @@ public class AgentInsightSession {
     @TableField("message_count")
     private Integer messageCount;
 
-    /** ★ 会话内消息序号水位,消息 seq 由它原子分配 */
+    /** 会话内消息序号水位,消息 seq 由它原子分配 */
     @TableField("last_seq")
     private Long lastSeq;
 

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/agent/llm/LlmService.java

@@ -170,7 +170,7 @@ public class LlmService {
                     // 用 timeout 操作符而不是 blockLast(Duration):后者把「流内错误」也统一抛成
                     // IllegalStateException("Timeout on blocking read..."),没法与真正的超时区分 ——
                     // 模型返回 401/429 会被误报成「超时」,排查方向直接跑偏。
-                    // ★ 但 Reactor 的 Flux.timeout 是「片间超时」:模型只要一直慢慢吐字就永远不触发,
+                    // 但 Reactor 的 Flux.timeout 是「片间超时」:模型只要一直慢慢吐字就永远不触发,
                     // 实测出现过单次调用流式输出 35 分钟的本地模型 —— 所以还要 blockLast 的
                     // 总时长上限一起兜底(总时长超限抛 IllegalStateException,下方按 504 语义转换)。
                     .timeout(request.timeoutOrDefault())

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/agent/tools/AgentToolRegistry.java

@@ -434,7 +434,7 @@ public class AgentToolRegistry {
         //createGroup(toolkit, GROUP_OTG,
         //        "全文检索与行为时间轴(5 个工具):案件材料的全文关键词检索(search_global)、"
         //                + "特殊日期清单、行为时间轴及其跳转与明细。"
-        //                + "★ 问「哪个文件里提到过某某」「原文怎么写的」「某人某段时间的行为时间轴」时激活本组;"
+        //                + "问「哪个文件里提到过某某」「原文怎么写的」「某人某段时间的行为时间轴」时激活本组;"
         //                + "做结构化字段的条件筛选/聚合/排序请用 execute_sql 或其它业务工具,不要用全文检索。",
         //        OTG_TOOLS);
 

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/agent/tools/ToolResultTable.java

@@ -120,7 +120,7 @@ final class ToolResultTable {
      * {@code execute_sql} 的单元格一致({@code LocalDateTime → "yyyy-MM-dd HH:mm:ss"}、
      * {@code Long → 字符串})。
      *
-     * <p>★ 标量元素必须兜底:列表里装的是 {@code String} / {@code Number} 之类的裸值时
+     * <p>标量元素必须兜底:列表里装的是 {@code String} / {@code Number} 之类的裸值时
      * 统一包成单列 {@link #SCALAR_COLUMN}。工具侧若想要更贴切的列名,应在调用前自行包装成 Map。
      */
     static List<LinkedHashMap<String, Object>> toRows(List<?> pojos) {

+ 2 - 2
ai-server/src/main/java/com/zsjz/ai/module/aiclean/service/AiSmartCleanService.java

@@ -325,7 +325,7 @@ public class AiSmartCleanService {
             // 判定开始即推一次快照:前端据此建立初始进度(此后全靠 SSE 推送,不再轮询)
             pushProgress(caseId, batchId);
             // 判定并发:闸门 + 虚拟线程,结果按批次聚合。
-            // ★ 判定任务跑在独立虚拟线程上,ScopedValue 绑定不会跨线程传播,
+            // 判定任务跑在独立虚拟线程上,ScopedValue 绑定不会跨线程传播,
             // 必须用 runWith 显式带上案件上下文,否则 judge 里的 slave 查询
             // 会因路由不到案件库抛「请先打开案件后再操作数据」,整批判定全灭。
             Semaphore gate = new Semaphore(Math.max(1, maxConcurrent), true);
@@ -374,7 +374,7 @@ public class AiSmartCleanService {
             // 判定全部归零之后才能进清洗阶段,否则会漏掉 AI 命中的表
             stage(batchId, AiCleanStageEnum.CLEANING_EXISTING);
             pushProgress(caseId, batchId);
-            // ★ 按降级顺序串行清洗(需求 2026-10-11):1级(上传已匹配模板)先洗并等它
+            // 按降级顺序串行清洗(需求 2026-10-11):1级(上传已匹配模板)先洗并等它
             // 全部落库,再洗 2级(AI 命中既有模板),然后才进 3级(AI 自建表入库)。
             // 4级(无法清洗)在判定阶段就只标记、不产生清洗任务。
             int toExisting = dispatchExistingByLevel(roots, existingHits);

+ 2 - 2
ai-server/src/main/java/com/zsjz/ai/module/dm/service/DmService.java

@@ -636,7 +636,7 @@ public class DmService {
                     int completedCount = dataNum - failNum;
                     // 所有清洗任务已完成:预览阶段动态建的 raw_{sheetId} 临时表不再需要,整表清掉;
                     // 不清理会随每次上传在案件库里无限累积(AI 微批还会再叠一份),拖慢备份与开案。
-                    // ★ 静默趟不能删:预览表同时是 AI 自建表(出口 B)的取数源,融合链路里
+                    // 静默趟不能删:预览表同时是 AI 自建表(出口 B)的取数源,融合链路里
                     //   1/2 级静默清洗之后还有 3 级 AI 入库,删早了 AI 只能回退重读源文件。
                     //   静默批次的清理统一由 AiSmartCleanService 在整批结束后执行。
                     if (!silent) {
@@ -660,7 +660,7 @@ public class DmService {
                         sseService.sendSee(new SseDTO(101, 100, "[数据清洗]所有文件清洗完成!", new SeeDataDTO(completedCount, failNum)));
                         sseService.closeSee();
                     }
-                    // ★ 这里必须显式绑定上下文:全文检索按 caseId 隔离,
+                    // 这里必须显式绑定上下文:全文检索按 caseId 隔离,
                     // 裸起虚拟线程会让 flush() 抛「缺少案件上下文」。
                     Long mergeCaseId = CaseContextHolder.get();
                     Long mergeUserId = CaseContextHolder.getUserId();