Bladeren bron

feat(任务中心): 添加NER分块进度信息展示

- ParseTask新增nerMessage字段存储分块处理进度
- 轮询NER进度时同步更新message到任务状态
- 前端可获取类似"正在处理第1/7个文本块"的进度信息
何文松 1 maand geleden
bovenliggende
commit
b6d02c8803

+ 9 - 1
backend/graph-service/src/main/java/com/lingyue/graph/listener/DocumentParsedEventListener.java

@@ -343,11 +343,19 @@ public class DocumentParsedEventListener {
                             ((Number) taskStatus.get("progress")).intValue() : 0;
                     String message = (String) taskStatus.get("message");
                     
-                    // 只在进度变化时打印日志
+                    // 只在进度变化时打印日志和更新前端进度
                     if (progress != lastProgress) {
                         log.info("NER 进度: documentId={}, taskId={}, status={}, progress={}%, message={}", 
                                 documentId, taskId, status, progress, message);
                         lastProgress = progress;
+                        
+                        // 更新 NER 进度到任务状态(包含分块信息)
+                        Map<String, Object> nerProgressData = new HashMap<>();
+                        nerProgressData.put("status", "processing");
+                        nerProgressData.put("progress", progress);
+                        nerProgressData.put("nerTaskId", taskId);
+                        nerProgressData.put("message", message);  // 分块进度信息
+                        updateTaskProgress(documentId, "ner", nerProgressData);
                     }
                     
                     // 检查任务是否完成

+ 8 - 4
backend/parse-service/src/main/java/com/lingyue/parse/controller/TaskProgressController.java

@@ -58,13 +58,17 @@ public class TaskProgressController {
             @RequestBody Map<String, Object> request) {
         
         String status = (String) request.get("status");
-        Integer progress = (Integer) request.get("progress");
+        Integer progress = request.get("progress") != null ? 
+                ((Number) request.get("progress")).intValue() : null;
         String nerTaskId = (String) request.get("nerTaskId");
-        Integer entityCount = (Integer) request.get("entityCount");
-        Integer relationCount = (Integer) request.get("relationCount");
+        Integer entityCount = request.get("entityCount") != null ? 
+                ((Number) request.get("entityCount")).intValue() : null;
+        Integer relationCount = request.get("relationCount") != null ? 
+                ((Number) request.get("relationCount")).intValue() : null;
+        String message = (String) request.get("message");
         
         taskProgressService.updateNerProgress(documentId, status, progress, 
-                nerTaskId, entityCount, relationCount);
+                nerTaskId, entityCount, relationCount, message);
         
         return AjaxResult.success();
     }

+ 4 - 0
backend/parse-service/src/main/java/com/lingyue/parse/entity/ParseTask.java

@@ -116,6 +116,10 @@ public class ParseTask extends SimpleModel {
     @TableField("ner_relation_count")
     private Integer nerRelationCount;
     
+    @Schema(description = "NER阶段消息(如分块进度)")
+    @TableField("ner_message")
+    private String nerMessage;
+    
     @Schema(description = "图构建阶段状态")
     @TableField("graph_status")
     private String graphStatus = "pending";

+ 7 - 3
backend/parse-service/src/main/java/com/lingyue/parse/service/TaskProgressService.java

@@ -100,7 +100,8 @@ public class TaskProgressService {
      */
     @Transactional
     public void updateNerProgress(String documentId, String status, Integer progress, 
-                                   String nerTaskId, Integer entityCount, Integer relationCount) {
+                                   String nerTaskId, Integer entityCount, Integer relationCount,
+                                   String message) {
         ParseTask task = parseTaskRepository.findByDocumentId(documentId);
         if (task == null) {
             log.warn("任务不存在: documentId={}", documentId);
@@ -118,12 +119,15 @@ public class TaskProgressService {
         if (relationCount != null) {
             task.setNerRelationCount(relationCount);
         }
+        if (message != null) {
+            task.setNerMessage(message);
+        }
         task.setCurrentStep("ner");
         updateOverallProgress(task);
         
         parseTaskRepository.updateById(task);
-        log.debug("更新NER进度: documentId={}, status={}, progress={}, entities={}", 
-                documentId, status, progress, entityCount);
+        log.debug("更新NER进度: documentId={}, status={}, progress={}, message={}", 
+                documentId, status, progress, message);
     }
 
     /**

+ 4 - 0
database/migrations/V2026_01_27_02__add_ner_message_field.sql

@@ -0,0 +1,4 @@
+-- 添加 NER 消息字段,用于存储分块处理进度等信息
+ALTER TABLE parse_tasks ADD COLUMN IF NOT EXISTS ner_message VARCHAR(255);
+
+COMMENT ON COLUMN parse_tasks.ner_message IS 'NER阶段消息(如分块进度信息)';

+ 13 - 13
docs/design/数据提取规则系统设计.md

@@ -210,9 +210,9 @@
                 │ variable_values │  ← JSONB: {"project_name": {...}, ...}
                 │ output_doc_id   │
                 │ status          │
-                │ created_at      │
+                          │ created_at      │
                 │ completed_at    │
-                └─────────────────┘
+                          └─────────────────┘
 ```
 
 ### 4.2 表结构定义
@@ -390,10 +390,10 @@ COMMENT ON TABLE generations IS '报告生成任务';
   "source_file_alias": "可研批复",
   "source_type": "document",
   "source_config": {
-    "location": {
+  "location": {
       "type": "page",           // page | chapter | element
-      "pageStart": 1,
-      "pageEnd": 2,
+    "pageStart": 1,
+    "pageEnd": 2,
       "paragraphKeyword": null  // 可选:段落关键词过滤
     }
   },
@@ -433,7 +433,7 @@ COMMENT ON TABLE generations IS '报告生成任务';
   "source_config": {
     "referenceVariables": ["project_name", "design_unit", "report_date"],
     "combineTemplate": "《{project_name}可行性研究报告》由{design_unit}于{report_date}编制",
-    "transform": {
+  "transform": {
       "type": "format",
       "formatPattern": "{0}"
     }
@@ -484,10 +484,10 @@ COMMENT ON TABLE generations IS '报告生成任务';
   "extract_type": "ai_extract",
   "extract_config": {
     "targetDescription": "从批复文件中提取可研批复的日期",
-    "fieldType": "date",
-    "expectedFormat": "YYYY年MM月DD日",
-    "examples": ["2024年5月15日", "2023年12月1日"]
-  }
+  "fieldType": "date",
+  "expectedFormat": "YYYY年MM月DD日",
+  "examples": ["2024年5月15日", "2023年12月1日"]
+}
 }
 ```
 
@@ -497,10 +497,10 @@ COMMENT ON TABLE generations IS '报告生成任务';
 {
   "extract_type": "ai_summarize",
   "extract_config": {
-    "summarizePrompt": "请对以下内容进行总结,重点描述项目建设的必要性",
-    "focusPoints": ["建设背景", "现状问题", "建设目的"],
+  "summarizePrompt": "请对以下内容进行总结,重点描述项目建设的必要性",
+  "focusPoints": ["建设背景", "现状问题", "建设目的"],
     "rules": ["使用正式的工程报告语言", "保留关键的数据和指标"],
-    "style": "formal",
+  "style": "formal",
     "maxLength": 300
   }
 }