瀏覽代碼

Merge remote-tracking branch 'origin/xiaoshi-ai'

lrj 3 周之前
父節點
當前提交
9892e8884e
共有 20 個文件被更改,包括 519 次插入23 次删除
  1. 1 0
      src/main/java/cn/cslg/pas/common/model/dify/ChatMessageDTO.java
  2. 1 0
      src/main/java/cn/cslg/pas/common/model/dify/DifyHistoryMessageDTO.java
  3. 8 0
      src/main/java/cn/cslg/pas/common/model/dify/confessionSession/ConfessionSessionDetailDTO.java
  4. 27 0
      src/main/java/cn/cslg/pas/common/model/dify/confessionSession/ConfessionSessionDetailVO.java
  5. 43 0
      src/main/java/cn/cslg/pas/common/model/dify/generateDiscoveryResult/DiscoryResultVO.java
  6. 12 0
      src/main/java/cn/cslg/pas/common/model/dify/generateDiscoveryResult/UpdateDiscoveryResultDTO.java
  7. 13 0
      src/main/java/cn/cslg/pas/controller/common/ConfessionSessionController.java
  8. 25 2
      src/main/java/cn/cslg/pas/controller/outApi/DifyController.java
  9. 27 0
      src/main/java/cn/cslg/pas/domain/dify/AssoConfessionConversation.java
  10. 2 0
      src/main/java/cn/cslg/pas/domain/dify/AssoConfessionSessionFile.java
  11. 1 0
      src/main/java/cn/cslg/pas/domain/dify/ConfessionSession.java
  12. 18 0
      src/main/java/cn/cslg/pas/mapper/dify/AssoConfessionConversationMapper.java
  13. 131 17
      src/main/java/cn/cslg/pas/service/common/DifyService.java
  14. 32 0
      src/main/java/cn/cslg/pas/service/dify/AssoConfessionConversationService.java
  15. 19 0
      src/main/java/cn/cslg/pas/service/dify/AssoConfessionSessionFileService.java
  16. 70 0
      src/main/java/cn/cslg/pas/service/dify/ConfessionSessionService.java
  17. 74 0
      src/main/java/cn/cslg/pas/service/dify/GenerateDiscoveryResultService.java
  18. 1 0
      src/main/resources/application-dev.yml
  19. 5 1
      src/test/java/cn/cslg/pas/DifyTest.java
  20. 9 3
      src/test/java/cn/cslg/pas/service/dify/GenerateInstructionServiceTests.java

+ 1 - 0
src/main/java/cn/cslg/pas/common/model/dify/ChatMessageDTO.java

@@ -13,4 +13,5 @@ public class ChatMessageDTO {
     private String conversationId;
     private Integer projectId;
     private Integer confessionSessionId;
+    private Integer type;
 }

+ 1 - 0
src/main/java/cn/cslg/pas/common/model/dify/DifyHistoryMessageDTO.java

@@ -8,4 +8,5 @@ public class DifyHistoryMessageDTO {
     private String user;
     private String firstId;
     private Integer limit;
+    private Integer type;
 }

+ 8 - 0
src/main/java/cn/cslg/pas/common/model/dify/confessionSession/ConfessionSessionDetailDTO.java

@@ -0,0 +1,8 @@
+package cn.cslg.pas.common.model.dify.confessionSession;
+
+import lombok.Data;
+
+@Data
+public class ConfessionSessionDetailDTO {
+    private Integer confessionSessionId;
+}

+ 27 - 0
src/main/java/cn/cslg/pas/common/model/dify/confessionSession/ConfessionSessionDetailVO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.model.dify.confessionSession;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+@Data
+public class ConfessionSessionDetailVO {
+
+    private Integer id;
+    private List<SystemFile> discoveryFiles;
+    private List<SystemFile> resultFiles;
+    private String conversationId;
+
+    private String conversationName;
+
+    private String inventionPoint;
+
+    private String createId;
+    private Date createTime;
+    private Integer type;
+    private String content;
+    private String discoveryResult;
+    private String dialogueConversationId;
+    private String aiUpdateConversationId;
+}

+ 43 - 0
src/main/java/cn/cslg/pas/common/model/dify/generateDiscoveryResult/DiscoryResultVO.java

@@ -0,0 +1,43 @@
+package cn.cslg.pas.common.model.dify.generateDiscoveryResult;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DiscoryResultVO {
+    private String technicalField;
+    private List<String> technicalFeature;
+    private List<TechnicalCase> technicalCase;
+    private String additionalSuggestions;
+    private List<TermsExplanation> termsExplanation;
+    private ClaimSuggestions claimSuggestions;
+    private String background;
+
+    @Data
+    public static class TechnicalCase {
+        private String technicalProblem;
+        private List<TechnicalMeans> technicalMeans;
+
+    }
+
+    @Data
+    public static class TechnicalMeans {
+        private String technicalMeansContent;
+        private String ImplementationMethod;
+        private List<String> technicalEffect;
+    }
+
+    @Data
+    public static class TermsExplanation {
+        private String terms;
+        private String explanation;
+    }
+
+    @Data
+    public static class ClaimSuggestions {
+        private String mainClaimSuggestions;
+        private String dependentClaimSuggestions;
+    }
+
+}

+ 12 - 0
src/main/java/cn/cslg/pas/common/model/dify/generateDiscoveryResult/UpdateDiscoveryResultDTO.java

@@ -0,0 +1,12 @@
+package cn.cslg.pas.common.model.dify.generateDiscoveryResult;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UpdateDiscoveryResultDTO {
+   private Integer confessionSessionId;
+   private String discoveryResult;
+
+}

+ 13 - 0
src/main/java/cn/cslg/pas/controller/common/ConfessionSessionController.java

@@ -4,6 +4,7 @@ import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.model.dify.ChatMessageDTO;
 import cn.cslg.pas.common.model.dify.DifyHistoryMessageDTO;
 import cn.cslg.pas.common.model.dify.confessionSession.*;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryResultDTO;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.Response;
@@ -84,5 +85,17 @@ public class ConfessionSessionController {
         Integer id = confessionSessionService.addConfessionSessionFile(addConfessionSessionDTO);
         return Response.success(id);
     }
+    @RequestMapping(value = "/updateDiscoveryResult", method = RequestMethod.POST)
+    @Operation(summary = "更新技术交底书理解结果")
+    public Response updateDiscoryResult(@RequestBody UpdateDiscoveryResultDTO updateDiscoveryResultDTO) throws IOException {
+        Integer id = confessionSessionService.updateDiscoveryResult(updateDiscoveryResultDTO);
+        return Response.success(id);
+    }
 
+    @RequestMapping(value = "/detail", method = RequestMethod.POST)
+    @Operation(summary = "查询会话记录详情")
+    public Response detail(@RequestBody ConfessionSessionDetailDTO confessionSessionDetailDTO) throws IOException {
+        ConfessionSessionDetailVO  confessionSessionDetailVO = confessionSessionService.getConfessionSessionDetail(confessionSessionDetailDTO);
+        return Response.success(confessionSessionDetailVO);
+    }
 }

+ 25 - 2
src/main/java/cn/cslg/pas/controller/outApi/DifyController.java

@@ -2,11 +2,15 @@ package cn.cslg.pas.controller.outApi;
 
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.model.dify.*;
+import cn.cslg.pas.common.model.dify.confessionSession.ConfessionSessionDetailDTO;
+import cn.cslg.pas.common.model.dify.confessionSession.ConfessionSessionDetailVO;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.dify.ConfessionSessionService;
 import cn.cslg.pas.service.dify.DifySessionService;
+import cn.cslg.pas.service.dify.GenerateDiscoveryResultService;
 import cn.cslg.pas.service.dify.GenerateInstructionService;
 import com.alibaba.fastjson2.JSONObject;
 import io.swagger.v3.oas.annotations.Operation;
@@ -34,6 +38,8 @@ public class DifyController {
     private final DifyService difyService;
     private final DifySessionService difySessionService;
     private final GenerateInstructionService generateInstructionService;
+    private final GenerateDiscoveryResultService generateDiscoveryResultService;
+    private final ConfessionSessionService confessionSessionService;
     @Autowired
     private CacheUtils cacheUtils;
     @Autowired
@@ -63,8 +69,8 @@ public class DifyController {
 
     @RequestMapping(value = "/stopMessage", method = RequestMethod.GET)
     @Operation(summary = "停止会话")
-    public Response stopMessage(String taskId) throws IOException {
-        return Response.success(difyService.stopMessage(taskId));
+    public Response stopMessage(String taskId,Integer type) throws IOException {
+        return Response.success(difyService.stopMessage(taskId,type));
     }
 
     @RequestMapping(value = "/generateInventionPoint", method = RequestMethod.POST)
@@ -91,4 +97,21 @@ public class DifyController {
         return generateInstructionService.generateInstruction2(generateClaimDTO);
     }
 
+    @RequestMapping(value = "/generateDiscoveryResult", method = RequestMethod.POST)
+    @Operation(summary = "生成技术交底书理解结果")
+    public Response generateDiscoveryResult(@RequestBody ChatMessageDTO chatMessageDTO) throws Exception {
+        return Response.success(generateDiscoveryResultService.generateResult(chatMessageDTO));
+    }
+
+    @RequestMapping(value = "/generateDiscoveryResult/detail", method = RequestMethod.POST)
+    @Operation(summary = "获取技术交底书理解结果详情")
+    public Response detail(@RequestBody ConfessionSessionDetailDTO confessionSessionDetailDTO) throws IOException {
+        ConfessionSessionDetailVO confessionSessionDetailVO = confessionSessionService.getConfessionSessionDetail(confessionSessionDetailDTO);
+        return Response.success(confessionSessionDetailVO);
+    }
+    @RequestMapping(value = "/generateDiscoveryResult/dialogue", method = RequestMethod.POST, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    @Operation(summary = "ai对话")
+    public Flux<String> discoveryResultDialogue(@RequestBody ChatMessageDTO chatMessageDTO) throws Exception {
+        return difyService.discoveryResultDialogue(chatMessageDTO);
+    }
 }

+ 27 - 0
src/main/java/cn/cslg/pas/domain/dify/AssoConfessionConversation.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.domain.dify;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @TableName asso_confession_conversation
+ */
+@TableName(value ="asso_confession_conversation")
+@Data
+public class AssoConfessionConversation extends BaseEntity<AssoConfessionConversation> {
+    private Integer id;
+
+    private Integer confessionId;
+
+    private String conversationId;
+
+    private Integer type;
+
+    private Date createTime;
+
+    private String createId;
+}

+ 2 - 0
src/main/java/cn/cslg/pas/domain/dify/AssoConfessionSessionFile.java

@@ -14,4 +14,6 @@ public class AssoConfessionSessionFile extends BaseEntity<AssoConfessionSessionF
 
     @TableField(value = "guid")
     private String guid;
+    @TableField(value = "type")
+    private Integer type;
 }

+ 1 - 0
src/main/java/cn/cslg/pas/domain/dify/ConfessionSession.java

@@ -32,5 +32,6 @@ public class ConfessionSession extends BaseEntity<ConfessionSession> {
     private Date createTime;
     private Integer type;
     private String content;
+    private String resultContent;
 
 }

+ 18 - 0
src/main/java/cn/cslg/pas/mapper/dify/AssoConfessionConversationMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.mapper.dify;
+
+import cn.cslg.pas.domain.dify.AssoConfessionConversation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【asso_confession_conversation】的数据库操作Mapper
+* @createDate 2025-09-11 11:32:40
+* @Entity cn.cslg.pas.domain.novelty.domain.AssoConfessionConversation
+*/
+public interface AssoConfessionConversationMapper extends BaseMapper<AssoConfessionConversation> {
+
+}
+
+
+
+

+ 131 - 17
src/main/java/cn/cslg/pas/service/common/DifyService.java

@@ -6,11 +6,13 @@ import cn.cslg.pas.common.model.dify.*;
 import cn.cslg.pas.common.model.dify.GenerateClaimDTO;
 import cn.cslg.pas.common.model.dify.confessionSession.AddConfessionSessionDTO;
 import cn.cslg.pas.common.model.dify.confessionSession.UpdateConfessionSessionDTO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.DiscoryResultVO;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
 import cn.cslg.pas.common.vo.PatentRightParams;
 import cn.cslg.pas.domain.business.ReportTemple;
 import cn.cslg.pas.domain.business.TechnicalCase;
+import cn.cslg.pas.domain.dify.AssoConfessionConversation;
 import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.domain.report.AssoProjectConfession;
@@ -19,9 +21,7 @@ import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
 import cn.cslg.pas.service.business.ReportTempleService;
 import cn.cslg.pas.service.business.TechnicalCaseService;
-import cn.cslg.pas.service.dify.ConfessionSessionService;
-import cn.cslg.pas.service.dify.DifySessionService;
-import cn.cslg.pas.service.dify.GenerateInstructionService;
+import cn.cslg.pas.service.dify.*;
 import cn.cslg.pas.service.report.AssoProjectConfessionService;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -81,6 +81,8 @@ public class DifyService {
     private String fileDownloadUrl;
     @Value("${DIFY.cliamKey}")
     private String cliamKey;
+    @Value("${DIFY.discoveryResultKey}")
+    private String discoveryResultKey;
     private final DifySessionService difySessionService;
     private final TechnicalCaseService technicalCaseService;
     private final AssoProjectConfessionService assoProjectConfessionService;
@@ -100,11 +102,15 @@ public class DifyService {
     @Autowired
     @Lazy
     private GenerateInstructionService generateInstructionService;
+    @Autowired
+    private AssoConfessionConversationService assoConfessionConversationService;
+    @Autowired
+    private AssoConfessionSessionFileService assoConfessionSessionFileService;
 
     /**
      * 调用文件系统删除文件接口
      */
-    public String chatMessage(DifyChatMessageDTO difyChatMessageDTO,String key) throws IOException {
+    public String chatMessage(DifyChatMessageDTO difyChatMessageDTO, String key) throws IOException {
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
         OkHttpClient okHttpClient = new OkHttpClient.Builder()
@@ -131,14 +137,19 @@ public class DifyService {
                 .writeTimeout(600, TimeUnit.SECONDS)
                 .readTimeout(600, TimeUnit.SECONDS)
                 .build();
+        Integer type =difyChatMessageDTO.getType();
         String path = "messages?conversation_id=" + difyChatMessageDTO.getConversationId() + "&user=" + difyChatMessageDTO.getUser() + "&limit=" + difyChatMessageDTO.getLimit();
         if (difyChatMessageDTO.getFirstId() != null) {
             path += "&first_id=" + difyChatMessageDTO.getFirstId();
         }
+        String key =apiKey;
+        if(type!=null&&type.equals(4)){
+            key=discoveryResultKey;
+        }
         Request request = new Request.Builder()
                 .url(url + path)
                 .get()
-                .addHeader("Authorization", "Bearer " + apiKey)
+                .addHeader("Authorization", "Bearer " + key)
                 .build();
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
@@ -185,7 +196,7 @@ public class DifyService {
 
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
-        Request request = this.getChatMessageRequest(requestBody);
+        Request request = this.getChatMessageRequest(requestBody,apiKey);
         return Flux.create(emitter -> {
             client.newCall(request).enqueue(new Callback() {
                 @Override
@@ -264,16 +275,16 @@ public class DifyService {
         return url;
     }
 
-    public Request getChatMessageRequest(RequestBody requestBody) {
+    public Request getChatMessageRequest(RequestBody requestBody,String key) {
         Request request = new Request.Builder()
                 .url(url + "chat-messages")
-                .addHeader("Authorization", "Bearer " + apiKey).addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
+                .addHeader("Authorization", "Bearer " + key).addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
                 .post(requestBody)
                 .build();
         return request;
     }
 
-    public JSONObject stopMessage(String taskId) throws IOException {
+    public JSONObject stopMessage(String taskId,Integer type) throws IOException {
         OkHttpClient client = new OkHttpClient.Builder()
                 .connectTimeout(60, TimeUnit.SECONDS)
                 .writeTimeout(60, TimeUnit.SECONDS)
@@ -283,9 +294,13 @@ public class DifyService {
         difyChatMessageDTO.setUser("1");
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        String key =apiKey;
+        if(type!=null&&type.equals(4)){
+            key=discoveryResultKey;
+        }
         Request request = new Request.Builder()
                 .url(url + "chat-messages/" + taskId + "/stop")
-                .addHeader("Authorization", "Bearer " + apiKey).addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
+                .addHeader("Authorization", "Bearer " + key).addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
                 .post(requestBody)
                 .build();
         String json = Objects.requireNonNull(client.newCall(request).execute().body()).string();
@@ -325,7 +340,7 @@ public class DifyService {
                 .build();
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
-        Request request = this.getChatMessageRequest(requestBody);
+        Request request = this.getChatMessageRequest(requestBody,apiKey);
         String res = Objects.requireNonNull(client.newCall(request).execute().body()).string();
         JSONObject jsonObject = JSONObject.parseObject(res);
         String inventionPoint = jsonObject.get("answer").toString();
@@ -524,9 +539,9 @@ public class DifyService {
 
         Map<String, Object> map = new HashMap<>();
         map.put("fileUrl", fileUrl);
-        map.put("patent_fileUrls",patentFileUrls);
-        map.put("app_file_guid",appFileGuid);
-        map.put("modify_file_guid",modifyFileGuid);
+        map.put("patent_fileUrls", patentFileUrls);
+        map.put("app_file_guid", appFileGuid);
+        map.put("modify_file_guid", modifyFileGuid);
         map.put("patent_files", new ArrayList<>());
         map.put("changeClaim", vo.getChangeClaim());
         map.put("claim", vo.getClaim());
@@ -581,7 +596,7 @@ public class DifyService {
                             }
                             try {
                                 JSONObject jsonObject = JSON.parseObject(line);
-                                String sessionConversationId  = jsonObject.get("conversation_id").toString();
+                                String sessionConversationId = jsonObject.get("conversation_id").toString();
                                 String event = jsonObject.get("event").toString();
                                 if (StringUtils.isEmpty(runId)) {
                                     if (StringUtils.isNotEmpty(sessionConversationId)) {
@@ -630,7 +645,7 @@ public class DifyService {
         });
     }
 
-    public void generateDoc(String conversationName,Integer confessionSessionId,JSONObject object) {
+    public void generateDoc(String conversationName, Integer confessionSessionId, JSONObject object) {
         Map<String, Object> map = new HashMap<>();
         String reason = object.getString("reason");
         String num = object.getString("num");
@@ -759,7 +774,7 @@ public class DifyService {
         String background = generateClaimDTO.getBackground();
 
         DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
-        String userId ="1";
+        String userId = "1";
 //        String userId = loginUtils.getId().toString();
         Map<String, Object> map = new HashMap<>();
         map.put("claim", claim);
@@ -785,4 +800,103 @@ public class DifyService {
         return res;
     }
 
+    public Flux<String> discoveryResultDialogue(ChatMessageDTO chatMessageDTO) {
+        Integer confessionSessionId = chatMessageDTO.getConfessionSessionId();
+        String conversationId = chatMessageDTO.getConversationId();
+        String userId = loginUtils.getId().toString();
+        String query = chatMessageDTO.getQuery();
+        Integer type = chatMessageDTO.getType();
+        if (type == null || query == null || query.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请按要求输入参数");
+        }
+        if (conversationId == null) {
+            conversationId = assoConfessionConversationService.getConversationId(confessionSessionId, type);
+        }
+
+
+        String temConversationId = conversationId;
+        String temConversationId3=conversationId;
+        OkHttpClient client = new OkHttpClient.Builder()
+                .connectTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600, TimeUnit.SECONDS)
+                .readTimeout(600, TimeUnit.SECONDS)
+                .build();
+
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        Map<String, Object> map = new HashMap<>();
+        String fileContent = "";
+
+        ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
+
+            List<String> guids = assoConfessionSessionFileService.getFileGuid(confessionSessionId, 0);
+            if (guids == null || guids.size() == 0) {
+                throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "数据错误,未检测到交底书");
+            }
+            fileContent = fileDownloadUrl + guids.get(0);
+            map.put("file_path", fileContent);
+
+        map.put("data_Result", confessionSession.getResultContent());
+        map.put("ask_type", type.toString());
+        difyChatMessageDTO.setInputs(map);
+        difyChatMessageDTO.setConversationId(conversationId);
+        difyChatMessageDTO.setResponseMode("streaming");
+        difyChatMessageDTO.setUser(userId);
+        difyChatMessageDTO.setQuery(query);
+        difyChatMessageDTO.setFiles(new ArrayList<>());
+
+        String param = new Gson().toJson(difyChatMessageDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        Request request = this.getChatMessageRequest(requestBody,discoveryResultKey);
+
+        return Flux.create(emitter -> {
+            client.newCall(request).enqueue(new Callback() {
+                @Override
+                public void onFailure(Call call, IOException e) {
+                    emitter.error(e);
+                }
+
+                @Override
+                public void onResponse(Call call, Response response) throws IOException {
+
+                    if (!response.isSuccessful()) {
+                        emitter.error(new IOException("Unexpected code: " + response));
+                        return;
+                    }
+
+                    try (Reader reader = response.body().charStream()) {
+                        BufferedReader bufferedReader = new BufferedReader(reader);
+                        String line;
+                        String temConversationId2 = temConversationId;
+                        String prefixToRemove = "data: ";
+                        while ((line = bufferedReader.readLine()) != null) {
+                            if (line.isEmpty()) {
+                                continue;
+                            }
+                            if (line.startsWith(prefixToRemove)) {
+                                line = line.substring(prefixToRemove.length());
+                            }
+                            if (temConversationId2 == null || temConversationId2.isEmpty()) {
+                                try {
+                                    JSONObject jsonObject = JSON.parseObject(line);
+                                    temConversationId2 = jsonObject.get("conversation_id").toString();
+                                    AssoConfessionConversation assoConfessionConversation = new AssoConfessionConversation();
+                                    assoConfessionConversation.setConfessionId(confessionSessionId);
+                                    assoConfessionConversation.setConversationId(temConversationId2);
+                                    assoConfessionConversation.setType(type);
+                                    assoConfessionConversation.insert();
+                                } catch (Exception e) {
+                                }
+
+                            }
+                            emitter.next(line); // 将每行数据发送到 Flux
+                        }
+                    } catch (IOException e) {
+                        emitter.error(e);
+                    } finally {
+                        emitter.complete();
+                    }
+                }
+            });
+        });
+    }
 }

+ 32 - 0
src/main/java/cn/cslg/pas/service/dify/AssoConfessionConversationService.java

@@ -0,0 +1,32 @@
+package cn.cslg.pas.service.dify;
+
+import cn.cslg.pas.domain.dify.AssoConfessionConversation;
+import cn.cslg.pas.mapper.dify.AssoConfessionConversationMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author admin
+ * @description 针对表【asso_confession_conversation】的数据库操作Service实现
+ * @createDate 2025-09-11 11:32:40
+ */
+@Service
+public class AssoConfessionConversationService extends ServiceImpl<AssoConfessionConversationMapper, AssoConfessionConversation> {
+    public String getConversationId(Integer confessionSessionId, Integer type) {
+        String conversationId = null;
+        LambdaQueryWrapper<AssoConfessionConversation> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoConfessionConversation::getConfessionId, confessionSessionId)
+                .eq(AssoConfessionConversation::getType, type);
+        AssoConfessionConversation assoConfessionConversation = this.getOne(queryWrapper, false);
+        if (assoConfessionConversation != null) {
+            conversationId = assoConfessionConversation.getConversationId();
+        }
+        return conversationId;
+    }
+}
+
+
+
+

+ 19 - 0
src/main/java/cn/cslg/pas/service/dify/AssoConfessionSessionFileService.java

@@ -2,11 +2,30 @@ package cn.cslg.pas.service.dify;
 
 import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
 import cn.cslg.pas.mapper.dify.AssoConfessionSessionFileMapper;
+import cn.cslg.pas.service.quartzService.QuartzVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Service
 @RequiredArgsConstructor
 public class AssoConfessionSessionFileService extends ServiceImpl<AssoConfessionSessionFileMapper, AssoConfessionSessionFile> {
+
+    public List<String> getFileGuid(Integer confessionSessionId, Integer type) {
+        LambdaQueryWrapper<AssoConfessionSessionFile> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoConfessionSessionFile::getConfessionSessionId, confessionSessionId);
+        if (type != null) {
+            queryWrapper.eq(AssoConfessionSessionFile::getType, type);
+
+        }
+        List<AssoConfessionSessionFile> assoConfessionSessionFiles = this.list(queryWrapper);
+        List<String> guids = assoConfessionSessionFiles.stream().map(AssoConfessionSessionFile::getGuid).collect(Collectors.toList());
+
+        return guids;
+    }
 }

+ 70 - 0
src/main/java/cn/cslg/pas/service/dify/ConfessionSessionService.java

@@ -2,9 +2,11 @@ package cn.cslg.pas.service.dify;
 
 import cn.cslg.pas.common.model.cronModel.SystemFile;
 import cn.cslg.pas.common.model.dify.confessionSession.*;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryResultDTO;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.FormatUtil;
 import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.domain.dify.AssoConfessionConversation;
 import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
 import cn.cslg.pas.exception.ExceptionEnum;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -13,7 +15,9 @@ import cn.cslg.pas.service.common.FileManagerService;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
@@ -43,9 +47,12 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
     private final LoginUtils loginUtils;
     private final FileManagerService fileManagerService;
     private final AssoConfessionSessionFileMapper assoConfessionSessionFileMapper;
+    private final AssoConfessionSessionFileService assoConfessionSessionFileService;
+    private final AssoConfessionConversationService assoConfessionConversationService;
 
     public Integer addConfessionSession(AddConfessionSessionDTO addConfessionSessionDTO) {
         String guid = addConfessionSessionDTO.getFileGuid();
+        Integer type = addConfessionSessionDTO.getType();
         String name = "";
         try {
             if (guid != null && !guid.trim().equals("")) {
@@ -69,6 +76,13 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         confessionSession.setType(addConfessionSessionDTO.getType());
         confessionSession.setContent(addConfessionSessionDTO.getContent());
         confessionSession.insert();
+        if (type != null && type == 4) {
+            AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+            assoConfessionSessionFile.setGuid(guid);
+            assoConfessionSessionFile.setConfessionSessionId(confessionSession.getId());
+            assoConfessionSessionFile.setType(0);
+            assoConfessionSessionFile.insert();
+        }
         return confessionSession.getId();
     }
 
@@ -208,6 +222,62 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         return confessionSession;
     }
 
+    public Integer updateDiscoveryResult(UpdateDiscoveryResultDTO updateDiscoveryResultDTO) {
+        String discoveryResult = updateDiscoveryResultDTO.getDiscoveryResult();
+        Integer confessionSessionId = updateDiscoveryResultDTO.getConfessionSessionId();
+        LambdaUpdateWrapper<ConfessionSession> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(ConfessionSession::getResultContent, discoveryResult).eq(ConfessionSession::getId, confessionSessionId);
+        this.update(updateWrapper);
+        return confessionSessionId;
+    }
+
+    public ConfessionSessionDetailVO getConfessionSessionDetail(ConfessionSessionDetailDTO confessionSessionDetailDTO) {
+        ConfessionSessionDetailVO confessionSessionDetailVO = new ConfessionSessionDetailVO();
+        Integer confessionSessionId = confessionSessionDetailDTO.getConfessionSessionId();
+        ConfessionSession confessionSession = this.getById(confessionSessionId);
+        BeanUtils.copyProperties(confessionSession, confessionSessionDetailVO);
+        confessionSessionDetailVO.setDiscoveryResult(confessionSession.getResultContent());
+
+        //装载文件
+        LambdaQueryWrapper<AssoConfessionSessionFile> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoConfessionSessionFile::getConfessionSessionId, confessionSessionId);
+        List<AssoConfessionSessionFile> assoConfessionSessionFiles = assoConfessionSessionFileService.list(queryWrapper);
+        List<String> fileGuids = assoConfessionSessionFiles.stream().map(AssoConfessionSessionFile::getGuid).collect(Collectors.toList());
+        List<SystemFile> systemFiles = new ArrayList<>();
+        try {
+            if (fileGuids != null && fileGuids.size() > 0) {
+                String res = fileManagerService.getSystemFileFromFMS(fileGuids);
+                systemFiles = JSONObject.parseArray(res, SystemFile.class);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        List<String> inFileGuids =assoConfessionSessionFiles.stream().filter(item->item.getType()!=null&&item.getType().equals(0)).map(AssoConfessionSessionFile::getGuid).collect(Collectors.toList());
+        List<String> outFileGuids =assoConfessionSessionFiles.stream().filter(item->item.getType()==null||item.getType().equals(1)).map(AssoConfessionSessionFile::getGuid).collect(Collectors.toList());
+        if(inFileGuids.size()>0){
+            List<SystemFile> systemFileList =systemFiles.stream().filter(item->inFileGuids.contains(item.getGuid())).collect(Collectors.toList());
+            confessionSessionDetailVO.setDiscoveryFiles(systemFileList);
+        }
+        if(outFileGuids.size()>0){
+            List<SystemFile> systemFileList =systemFiles.stream().filter(item->outFileGuids.contains(item.getGuid())).collect(Collectors.toList());
+            confessionSessionDetailVO.setResultFiles(systemFileList);
+        }
+        //装载会话id
+        LambdaQueryWrapper<AssoConfessionConversation> assoQueryWrapper = new LambdaQueryWrapper<>();
+        assoQueryWrapper.eq(AssoConfessionConversation::getConfessionId, confessionSessionId);
+        List<AssoConfessionConversation> assoConfessionConversations = assoConfessionConversationService.list(assoQueryWrapper);
+        if (assoConfessionConversations != null && assoConfessionConversations.size() > 0) {
+            AssoConfessionConversation confessionSessionAiDialogue = assoConfessionConversations.stream().filter(item -> item.getType().equals(31)).findFirst().orElse(null);
+            AssoConfessionConversation confessionSessionAiUpdate = assoConfessionConversations.stream().filter(item -> item.getType().equals(32)).findFirst().orElse(null);
+            if (confessionSessionAiDialogue != null) {
+                confessionSessionDetailVO.setDialogueConversationId(confessionSessionAiDialogue.getConversationId());
+            }
+            if (confessionSessionAiUpdate != null) {
+                confessionSessionDetailVO.setAiUpdateConversationId(confessionSessionAiUpdate.getConversationId());
+            }
+        }
+        return confessionSessionDetailVO;
+    }
 }
 
 

+ 74 - 0
src/main/java/cn/cslg/pas/service/dify/GenerateDiscoveryResultService.java

@@ -0,0 +1,74 @@
+package cn.cslg.pas.service.dify;
+
+import cn.cslg.pas.common.model.dify.ChatMessageDTO;
+import cn.cslg.pas.common.model.dify.DifyChatMessageDTO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.DiscoryResultVO;
+import cn.cslg.pas.domain.dify.ConfessionSession;
+import cn.cslg.pas.service.common.DifyService;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class GenerateDiscoveryResultService {
+    @Autowired
+    private DifyService difyService;
+    @Value("${FileDownloadUrl}")
+    private String fileDownloadUrl;
+    @Autowired
+    private ConfessionSessionService confessionSessionService;
+
+    public DiscoryResultVO generateResult(ChatMessageDTO chatMessageDTO) throws Exception {
+        DiscoryResultVO discoryResultVO = null;
+        Integer confessionSessionId = chatMessageDTO.getConfessionSessionId();
+        String conversionId = chatMessageDTO.getConversationId();
+        ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
+        String fileId = confessionSession.getGuid();
+        String path = fileDownloadUrl + fileId;
+        String gInstructionKey = "app-ekzGTtvRnSq2aSqwZqKG5EH3";
+        Integer userId = 1;
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        difyChatMessageDTO.setUser(userId.toString());
+        difyChatMessageDTO.setResponseMode("blocking");
+        difyChatMessageDTO.setQuery("内容结束");
+//        difyChatMessageDTO.setConversationId();
+        Map<String, Object> map = new HashMap<>();
+        map.put("ask_type", "jiaodi");
+        map.put("file_path", path);
+        difyChatMessageDTO.setInputs(map);
+        Integer cycle = 0;
+        Boolean flag = false;
+        String re = "";
+        String answer = "";
+        while (cycle < 5 && flag == false) {
+            re = difyService.chatMessage(difyChatMessageDTO, gInstructionKey);
+            JSONObject jsonObject = JSONObject.parseObject(re);
+            Object status = jsonObject.get("status");
+            if (status != null) {
+                cycle++;
+            } else {
+                try {
+                    answer = jsonObject.get("answer").toString();
+                    conversionId = jsonObject.get("conversation_id").toString();
+                    discoryResultVO = JSONObject.parseObject(answer, DiscoryResultVO.class);
+                } catch (Exception e) {
+                    cycle++;
+                }
+
+                System.out.println(answer);
+                flag = true;
+            }
+
+        }
+        LambdaUpdateWrapper<ConfessionSession> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(ConfessionSession::getResultContent, answer).eq(ConfessionSession::getId, confessionSessionId);
+        confessionSessionService.update(updateWrapper);
+        return discoryResultVO;
+
+    }
+}

+ 1 - 0
src/main/resources/application-dev.yml

@@ -92,4 +92,5 @@ DIFY:
   checkApiKey: aa
   cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
   gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
+  discoveryResultKey: app-ekzGTtvRnSq2aSqwZqKG5EH3
   url: http://192.168.2.24/v1/

+ 5 - 1
src/test/java/cn/cslg/pas/DifyTest.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas;
 
+import cn.cslg.pas.common.model.dify.ChatMessageDTO;
 import cn.cslg.pas.common.model.dify.ClaimExplainVO;
 import cn.cslg.pas.common.model.dify.DifyChatMessageDTO;
 import cn.cslg.pas.common.model.dify.GenerateInstructAnswerVO;
@@ -11,6 +12,7 @@ import cn.cslg.pas.common.vo.PatentRightParams;
 import cn.cslg.pas.common.vo.RePatentClaim;
 import cn.cslg.pas.domain.dify.GetInstructAnswerDTO;
 import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.dify.GenerateDiscoveryResultService;
 import cn.cslg.pas.service.dify.GenerateInstructionService;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
@@ -39,7 +41,8 @@ public class DifyTest {
     private GenerateInstructionService generateInstructionService;
     @Autowired
     private DifyService difyService;
-
+ @Autowired
+ private GenerateDiscoveryResultService generateDiscoveryResultService;
     @Test
     public void checkFile() throws Exception {
 //        String path = "E:\\temfile\\poi\\test1.docx";
@@ -275,4 +278,5 @@ public class DifyTest {
 
       System.out.println(cleanText);
     }
+
 }

+ 9 - 3
src/test/java/cn/cslg/pas/service/dify/GenerateInstructionServiceTests.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.service.dify;
 
 import cn.cslg.pas.common.dto.DomainFieldDTO;
+import cn.cslg.pas.common.model.dify.ChatMessageDTO;
 import cn.cslg.pas.common.model.dify.GenerateClaimDTO;
 import cn.cslg.pas.common.model.dify.GenerateInstructAnswerVO;
 import cn.cslg.pas.common.model.dify.GenerateTechnicalVO;
@@ -22,7 +23,8 @@ import java.util.*;
 public class GenerateInstructionServiceTests {
     @Autowired
     private GenerateInstructionService generateInstructionService;
-
+@Autowired
+private GenerateDiscoveryResultService generateDiscoveryResultService;
 
     @Test
     public void getClaimContent() throws Exception {
@@ -66,7 +68,11 @@ public class GenerateInstructionServiceTests {
         map.put("implementation", strings);
         generateInstructionService.generateFile(map, "D:\\PAS\\target\\file\\patent.docx", "test");
         String a = "";
-
-
+    }
+    @Test
+    public  void generateResult123() throws Exception{
+        ChatMessageDTO chatMessageDTO=new ChatMessageDTO();
+        chatMessageDTO.setConfessionSessionId(426);
+        generateDiscoveryResultService.generateResult(chatMessageDTO);
     }
 }