From 085679ae9d5b9335bd3c6f0fbbf776c256a87063 Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Mon, 29 Jun 2026 17:48:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=9C=8D=E5=8A=A1=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/AiExtractRequestDTO.java | 36 ++++++++----- .../PostToAiExtractDomainServiceImpl.java | 4 +- ...aveDataExtractResultDomainServiceImpl.java | 51 +++++++++++++++---- 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/project/interaction/domain/dto/AiExtractRequestDTO.java b/src/main/java/com/project/interaction/domain/dto/AiExtractRequestDTO.java index 523ea48..b1fda9e 100644 --- a/src/main/java/com/project/interaction/domain/dto/AiExtractRequestDTO.java +++ b/src/main/java/com/project/interaction/domain/dto/AiExtractRequestDTO.java @@ -1,32 +1,44 @@ package com.project.interaction.domain.dto; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; /** * 算法服务 - 知识点提取请求 DTO - * 入参结构待算法服务确认后调整 */ @Data public class AiExtractRequestDTO { /** 虚拟资料ID */ + @JsonProperty("information_id") private Long informationId; - /** 文件内容分类(产品类/知识类/规范类/流程类) */ - private String contentCategory; + /** 子文件解析后的分段列表(直接取 parsed_text 的 segments) */ + private List segments; - /** 子文件解析文本列表 */ - private List files; + /** 回调URL(配置注入) */ + @JsonProperty("callback_url") + private String callbackUrl; @Data - public static class FileContent { - /** 文件名 */ - private String fileName; - /** 内容分类 */ - private String contentCategory; - /** 数据服务解析后的纯文本 */ - private String parsedText; + public static class Segment { + /** 片段内容 */ + private String content; + + /** 补充内容 */ + private String supplement; + + /** 章节标识 */ + private String chapter; + + /** 解析来源文件名(对应 JSON 的 chunk_size 字段) */ + @JsonProperty("chunk_size") + private String parseName; + + /** 内容类型 */ + @JsonProperty("content_type") + private String contentType; } } diff --git a/src/main/java/com/project/interaction/domain/service/impl/PostToAiExtractDomainServiceImpl.java b/src/main/java/com/project/interaction/domain/service/impl/PostToAiExtractDomainServiceImpl.java index 956dde4..2c2d700 100644 --- a/src/main/java/com/project/interaction/domain/service/impl/PostToAiExtractDomainServiceImpl.java +++ b/src/main/java/com/project/interaction/domain/service/impl/PostToAiExtractDomainServiceImpl.java @@ -21,8 +21,8 @@ public class PostToAiExtractDomainServiceImpl implements PostToAiExtractDomainSe @Resource(name = "algorithmWebClient") private WebClient algorithmWebClient; - /** 算法服务知识点提取路径(待确认) */ - @Value("${algo.extractUrl:/ai-extract}") + /** 算法服务知识点提取路径 */ + @Value("${algo.extractUrl:http://172.16.204.50:8000/v1/key_points/extract}") private String extractUrl; @Override diff --git a/src/main/java/com/project/interaction/domain/service/impl/SaveDataExtractResultDomainServiceImpl.java b/src/main/java/com/project/interaction/domain/service/impl/SaveDataExtractResultDomainServiceImpl.java index 3f8850d..74bdced 100644 --- a/src/main/java/com/project/interaction/domain/service/impl/SaveDataExtractResultDomainServiceImpl.java +++ b/src/main/java/com/project/interaction/domain/service/impl/SaveDataExtractResultDomainServiceImpl.java @@ -1,6 +1,8 @@ package com.project.interaction.domain.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.project.information.domain.entity.InformationFileEntity; import com.project.information.domain.enums.FileParseStatusEnum; import com.project.information.domain.service.InformationFileBaseService; @@ -10,10 +12,12 @@ import com.project.interaction.domain.service.PostToAiExtractDomainService; import com.project.interaction.domain.service.SaveDataExtractResultDomainService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 保存数据服务解析结果域服务实现 @@ -28,6 +32,13 @@ public class SaveDataExtractResultDomainServiceImpl implements SaveDataExtractRe @Autowired private PostToAiExtractDomainService postToAiExtractDomainService; + @Autowired + private ObjectMapper objectMapper; + + /** 算法服务回调地址 */ + @Value("${algo.callbackUrl:http://172.16.204.50/evaluator-api/api/interaction/aiExtractCallback}") + private String callbackUrl; + @Override public void handleCallback(DataExtractCallbackDTO callback) { Long fileId = callback.getFileId(); @@ -71,28 +82,46 @@ public class SaveDataExtractResultDomainServiceImpl implements SaveDataExtractRe return; } - // 4. 全部成功 → 调用算法服务知识点提取 + // 4. 全部成功 → 解析 parsedText JSON,构建 segments 列表,调用算法服务 log.info(">>> [数据服务回调] 虚拟资料 {} 下所有子文件解析成功,开始调用算法服务", informationId); - List fileContents = new ArrayList<>(); + List allSegments = new ArrayList<>(); for (InformationFileEntity f : allFiles) { - if (f.getParsedText() != null) { - AiExtractRequestDTO.FileContent fc = new AiExtractRequestDTO.FileContent(); - fc.setFileName(f.getFileName()); - fc.setContentCategory(String.valueOf(f.getContentCategory())); - fc.setParsedText(f.getParsedText()); - fileContents.add(fc); + if (f.getParsedText() == null || f.getParsedText().isBlank()) { + continue; + } + // 解析 parsed_text JSON: {"segments": [{"content": "...", "supplement": "", "chapter": "...", "content_type": "..."}]} + try { + Map>> parsed = objectMapper.readValue( + f.getParsedText(), new TypeReference>>>() {}); + List> segments = parsed.get("segments"); + if (segments == null || segments.isEmpty()) { + continue; + } + String fileName = f.getFileName(); + for (Map seg : segments) { + AiExtractRequestDTO.Segment segment = new AiExtractRequestDTO.Segment(); + segment.setContent(seg.get("content")); + segment.setSupplement(seg.get("supplement")); + segment.setChapter(seg.get("chapter")); + segment.setParseName(fileName); // parseName = 文件名 + segment.setContentType(seg.get("content_type")); + allSegments.add(segment); + } + } catch (Exception e) { + log.error(">>> [数据服务回调] 解析 parsedText 失败, fileId={}, error={}", f.getId(), e.getMessage()); } } - if (fileContents.isEmpty()) { - log.warn(">>> [数据服务回调] 虚拟资料 {} 下所有子文件已解析成功但 parsedText 均为空", informationId); + if (allSegments.isEmpty()) { + log.warn(">>> [数据服务回调] 虚拟资料 {} 下所有子文件已解析但无有效 segments", informationId); return; } AiExtractRequestDTO request = new AiExtractRequestDTO(); request.setInformationId(informationId); - request.setFiles(fileContents); + request.setSegments(allSegments); + request.setCallbackUrl(callbackUrl); postToAiExtractDomainService.postToAiExtract(request); }