zero 4 maanden geleden
bovenliggende
commit
ee5a5225ab

+ 3 - 1
src/main/java/cn/cslg/pas/common/model/dify/DifyFile.java

@@ -1,12 +1,14 @@
 package cn.cslg.pas.common.model.dify;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
 @Data
 public class DifyFile {
     private String type;
-    @JsonProperty("transfer_method")
+//    @JsonProperty("transfer_method")
+    @SerializedName("transfer_method")
     private String transferMethod;
     private String url;
     @JsonProperty("upload_file_id")

+ 11 - 0
src/main/java/cn/cslg/pas/common/model/dify/confessionSession/AddConfessionSessionFileDTO.java

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

+ 17 - 0
src/main/java/cn/cslg/pas/common/model/dify/confessionSession/QueryAssoConfessionSessionFileDTO.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.model.dify.confessionSession;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import lombok.Data;
+
+@Data
+public class QueryAssoConfessionSessionFileDTO {
+
+    private Integer assoConfessionSessionFileId;
+
+    private Integer confessionSessionId;
+
+    private String guid;
+
+    private SystemFile systemFile;
+
+}

+ 2 - 0
src/main/java/cn/cslg/pas/common/model/dify/confessionSession/QueryConfessionSessionVO.java

@@ -15,4 +15,6 @@ public class QueryConfessionSessionVO {
     private String createId;
     private Date createTime;
     private String content;
+    private Integer type;
+    private SystemFile assoSystemFile;
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/utils/DataUtils.java

@@ -243,6 +243,8 @@ public class DataUtils {
         }
         return result;
     }
+
+    //将Unicode代码转为字符
     public static String unicodeDecode(String string) {
         Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
         Matcher matcher = pattern.matcher(string);

+ 15 - 0
src/main/java/cn/cslg/pas/controller/common/AssoConfessionSessionFileController.java

@@ -0,0 +1,15 @@
+package cn.cslg.pas.controller.common;
+
+import cn.cslg.pas.common.core.base.Constants;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Tag(name = "外部人员调用接口")
+@RestController
+@RequestMapping(Constants.API_XiaoSHI + "/assoConfessionSessionFile")
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class AssoConfessionSessionFileController {
+}

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

@@ -78,4 +78,11 @@ public class ConfessionSessionController {
         return Response.success(id);
     }
 
+    @RequestMapping(value = "/addConfessionSessionFile", method = RequestMethod.POST)
+    @Operation(summary = "添加会话记录关联文件")
+    public Response addConfessionSessionFile(@RequestBody AddConfessionSessionFileDTO addConfessionSessionDTO) throws IOException {
+        Integer id = confessionSessionService.addConfessionSessionFile(addConfessionSessionDTO);
+        return Response.success(id);
+    }
+
 }

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

@@ -88,9 +88,9 @@ public class DifyController {
         return Response.success(difyService.generateInventionPoint(chatMessageDTO));
     }
 
-    @RequestMapping(value = "/sendOADefense", method = RequestMethod.POST, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    @RequestMapping(value = "/sendOADefense", method = RequestMethod.GET, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     @Operation(summary = "OA答辩")
-    public Flux<String> sendOADefense(@RequestBody String guid) throws IOException {
-        return difyService.successGetOAHttp(guid);
+    public Flux<String> sendOADefense(Integer confessionSessionId) throws IOException {
+        return difyService.successGetOAHttp(confessionSessionId);
     }
 }

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

@@ -0,0 +1,17 @@
+package cn.cslg.pas.domain.dify;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@TableName(value = "asso_confession_session_file")
+@Data
+public class AssoConfessionSessionFile extends BaseEntity<AssoConfessionSessionFile> {
+
+    @TableField(value = "confession_session_id")
+    private Integer confessionSessionId;
+
+    @TableField(value = "guid")
+    private String guid;
+}

+ 7 - 0
src/main/java/cn/cslg/pas/mapper/dify/AssoConfessionSessionFileMapper.java

@@ -0,0 +1,7 @@
+package cn.cslg.pas.mapper.dify;
+
+import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface AssoConfessionSessionFileMapper extends BaseMapper<AssoConfessionSessionFile> {
+}

+ 5 - 0
src/main/java/cn/cslg/pas/mapper/dify/ConfessionSessionMapper.java

@@ -2,6 +2,8 @@ package cn.cslg.pas.mapper.dify;
 
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 /**
 * @author admin
@@ -9,8 +11,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 * @createDate 2025-04-16 15:48:57
 * @Entity cn.cslg.pas.domain.novelty.domain.ConfessionSession
 */
+@Repository
 public interface ConfessionSessionMapper extends BaseMapper<ConfessionSession> {
 
+    public int updateSingleField(@Param("id") Integer id, @Param("field") String field,
+                                 @Param("value") Object value);
 }
 
 

+ 33 - 16
src/main/java/cn/cslg/pas/service/common/DifyService.java

@@ -10,6 +10,7 @@ import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.domain.business.TechnicalCase;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.domain.report.AssoProjectConfession;
+import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
 import cn.cslg.pas.service.business.TechnicalCaseService;
 import cn.cslg.pas.service.dify.ConfessionSessionService;
 import cn.cslg.pas.service.dify.DifySessionService;
@@ -25,6 +26,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
@@ -70,6 +72,8 @@ public class DifyService {
     @Autowired
     private LoginUtils loginUtils;
     private final ConfessionSessionService confessionSessionService;
+    @Autowired
+    private ConfessionSessionMapper confessionSessionMapper;
 
     /**
      * 调用文件系统删除文件接口
@@ -320,8 +324,9 @@ public class DifyService {
     }
 
 
-    public Flux<String> successGetOAHttp(String guid) {
-        String fileUrl = fileDownloadUrl + guid;
+    public Flux<String> successGetOAHttp(Integer confessionSessionId) {
+        ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
+        String fileUrl = fileDownloadUrl + confessionSession.getGuid();
         String userId = loginUtils.getId().toString();
 
         OkHttpClient client = new OkHttpClient.Builder()
@@ -331,11 +336,7 @@ public class DifyService {
                 .build();
 
         Map<String, Object> map = new HashMap<>();
-        DifyFile difyFile = new DifyFile();
-        difyFile.setTransferMethod("remote_url");
-        difyFile.setType("document");
-        difyFile.setUrl(fileUrl);
-        map.put("file", difyFile);
+        map.put("fileUrl", fileUrl);
 
         OAMessageDTO oaMessageDTO = new OAMessageDTO();
         oaMessageDTO.setInputs(map);
@@ -370,6 +371,7 @@ public class DifyService {
                         BufferedReader bufferedReader = new BufferedReader(reader);
                         String line;
                         String prefixToRemove = "data: ";
+                        String runId = "";
                         while ((line = bufferedReader.readLine()) != null) {
                             if (line.isEmpty()) {
                                 continue;
@@ -380,15 +382,30 @@ public class DifyService {
                             try {
                                 JSONObject jsonObject = JSON.parseObject(line);
                                 String workflowRunId = jsonObject.get("workflow_run_id").toString();
-                                if (workflowRunId != null) {
-                                    ConfessionSession session = confessionSessionService.getOne(new LambdaQueryWrapper<ConfessionSession>()
-                                            .eq(ConfessionSession::getConversationId, workflowRunId));
-                                    if (ObjectUtils.isEmpty(session)) {
-                                        ConfessionSession confessionSession = new ConfessionSession();
-                                        confessionSession.setConversationId(workflowRunId);
-                                        confessionSession.setCreateId(userId);
-                                        confessionSession.setGuid(guid);
-                                        confessionSession.insert();
+                                String event = jsonObject.get("event").toString();
+                                if (StringUtils.isNotEmpty(workflowRunId)) {
+                                    if (StringUtils.isEmpty(runId)) {
+                                        runId = workflowRunId;
+                                        confessionSessionMapper.updateSingleField(confessionSessionId, "conversation_id", workflowRunId);
+
+                                    }
+                                }
+                                if (event.equals("workflow_finished")) {
+                                    String data = jsonObject.get("data").toString();
+                                    String content = "";
+                                    if (StringUtils.isNotEmpty(data)) {
+                                        JSONObject dataObject = JSON.parseObject(data);
+                                        String outputs = dataObject.get("outputs").toString();
+                                        if (StringUtils.isNotEmpty(outputs)) {
+                                            JSONObject outputsObject = JSON.parseObject(outputs);
+                                            String output = outputsObject.get("output").toString();
+                                            content = DataUtils.unicodeDecode(output);
+                                        }
+                                    }
+                                    if (StringUtils.isNotEmpty(content)) {
+                                        JSONObject obj = new JSONObject();
+                                        obj.put("answer", content);
+                                        confessionSessionMapper.updateSingleField(confessionSessionId, "content", obj.toString());
                                     }
                                 }
                             } catch (Exception e) {

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

@@ -0,0 +1,12 @@
+package cn.cslg.pas.service.dify;
+
+import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
+import cn.cslg.pas.mapper.dify.AssoConfessionSessionFileMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class AssoConfessionSessionFileService extends ServiceImpl<AssoConfessionSessionFileMapper, AssoConfessionSessionFile> {
+}

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

@@ -5,8 +5,10 @@ import cn.cslg.pas.common.model.dify.confessionSession.*;
 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.AssoConfessionSessionFile;
 import cn.cslg.pas.exception.ExceptionEnum;
 import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.mapper.dify.AssoConfessionSessionFileMapper;
 import cn.cslg.pas.service.common.FileManagerService;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,9 +16,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,6 +39,7 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
     private final CacheUtils cacheUtils;
     private final LoginUtils loginUtils;
     private final FileManagerService fileManagerService;
+    private final AssoConfessionSessionFileMapper assoConfessionSessionFileMapper;
 
     public Integer addConfessionSession(AddConfessionSessionDTO addConfessionSessionDTO) {
         String guid = addConfessionSessionDTO.getFileGuid();
@@ -55,6 +61,7 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         confessionSession.setConversationName(name);
         String id = loginUtils.getId().toString();
         confessionSession.setCreateId(id);
+        confessionSession.setType(addConfessionSessionDTO.getType());
         confessionSession.insert();
         return confessionSession.getId();
     }
@@ -98,6 +105,10 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         } catch (Exception e) {
             e.printStackTrace();
         }
+
+        List<Integer> confessionSessionIds = confessionSessions.stream().map(ConfessionSession::getId).collect(Collectors.toList());
+        List<QueryAssoConfessionSessionFileDTO> sessionFileDTOS = this.queryAssoConfessionSessionFileDTOS(confessionSessionIds);
+
         for (ConfessionSession confessionSession : confessionSessions) {
             QueryConfessionSessionVO queryConfessionSessionVO = new QueryConfessionSessionVO();
             BeanUtils.copyProperties(confessionSession, queryConfessionSessionVO);
@@ -106,11 +117,51 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
                 SystemFile systemFile = systemFiles.stream().filter(item -> item.getGuid().equals(guid)).findFirst().orElse(null);
                 queryConfessionSessionVO.setSystemFile(systemFile);
             }
+            if (!CollectionUtils.isEmpty(sessionFileDTOS)) {
+                QueryAssoConfessionSessionFileDTO fileDTO = sessionFileDTOS.stream().filter(i -> i.getConfessionSessionId().equals(confessionSession.getId())).findFirst().orElse(null);
+                if (fileDTO != null) {
+                    queryConfessionSessionVO.setAssoSystemFile(fileDTO.getSystemFile());
+                }
+            }
             queryConfessionSessionVOS.add(queryConfessionSessionVO);
         }
         return queryConfessionSessionVOS;
     }
 
+    public List<QueryAssoConfessionSessionFileDTO> queryAssoConfessionSessionFileDTOS(List<Integer> list) {
+        //装载会话关联文件信息
+        List<QueryAssoConfessionSessionFileDTO> assoConfessionSessionFileDTOS = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(list)) {
+            List<AssoConfessionSessionFile> assoConfessionSessionFiles = assoConfessionSessionFileMapper.selectList(new LambdaQueryWrapper<AssoConfessionSessionFile>()
+                    .in(AssoConfessionSessionFile::getConfessionSessionId, list));
+            if (!CollectionUtils.isEmpty(assoConfessionSessionFiles)) {
+                List<String> fileGuids = assoConfessionSessionFiles.stream().map(AssoConfessionSessionFile::getGuid)
+                        .filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+                List<SystemFile> systemFiles = new ArrayList<>();
+                try {
+                    if (!CollectionUtils.isEmpty(fileGuids)) {
+                        String res = fileManagerService.getSystemFileFromFMS(fileGuids);
+                        systemFiles = JSONObject.parseArray(res, SystemFile.class);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+                for (AssoConfessionSessionFile sessionFile : assoConfessionSessionFiles) {
+                    QueryAssoConfessionSessionFileDTO fileDTO = new QueryAssoConfessionSessionFileDTO();
+                    BeanUtils.copyProperties(sessionFile, fileDTO);
+                    fileDTO.setAssoConfessionSessionFileId(sessionFile.getId());
+                    if (!CollectionUtils.isEmpty(systemFiles)) {
+                        SystemFile systemFile = systemFiles.stream().filter(item -> item.getGuid().equals(sessionFile.getGuid())).findFirst().orElse(null);
+                        fileDTO.setSystemFile(systemFile);
+                    }
+                    assoConfessionSessionFileDTOS.add(fileDTO);
+                }
+            }
+        }
+        return assoConfessionSessionFileDTOS;
+    }
+
     public List<Integer> deleteConfessionSessions(DeleteConfessionSessionDTO deleteConfessionSessionDTO) {
         List<Integer> ids = deleteConfessionSessionDTO.getConfessionSessionIds();
         this.removeBatchByIds(ids);
@@ -128,6 +179,14 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         confessionSession.insert();
         return confessionSession.getId();
     }
+
+    public Integer addConfessionSessionFile(AddConfessionSessionFileDTO addConfessionSessionFileDTO) {
+        AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+        assoConfessionSessionFile.setConfessionSessionId(addConfessionSessionFileDTO.getConfessionSessionId());
+        assoConfessionSessionFile.setGuid(addConfessionSessionFileDTO.getGuid());
+        assoConfessionSessionFile.insert();
+        return assoConfessionSessionFile.getId();
+    }
 }
 
 

+ 3 - 3
src/main/resources/application-dev.yml

@@ -60,12 +60,12 @@ spring:
     job-store-type: memory
     #初始化表结构
 
-authorUrl: http://192.168.2.24:8871
-PCSUrl: http://192.168.2.24:8871
+authorUrl: http://192.168.2.105:8880
+PCSUrl: http://192.168.2.105:8880
 #OPSUrl: http://192.168.2.24:5001
 OPSUrl: http://139.224.24.90:5001
 PASUrl: http://localhost:8879
-FMSUrl: http://192.168.2.24:8803
+FMSUrl: http://192.168.2.105:8803
 WDUrl: http://1.116.113.26:81
 PythonUrl: http://192.168.2.24:8001
 FileDownloadUrl: http://192.168.2.24:8803/fileManager/downloadFile?fileId=

+ 13 - 0
src/main/resources/mapper/ConfessionSessionMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.cslg.pas.mapper.dify.ConfessionSessionMapper">
+
+    <update id="updateSingleField">
+        UPDATE confession_session
+        <set>
+            ${field} = #{value}
+        </set>
+        WHERE id = #{id}
+    </update>
+
+</mapper>

+ 21 - 0
src/test/java/cn/cslg/pas/service/EventServiceTests.java

@@ -25,6 +25,7 @@ import cn.cslg.pas.domain.es.PatentPerson;
 import cn.cslg.pas.exception.ExceptionEnum;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.AssoProjectEventMapper;
+import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
 import cn.cslg.pas.service.business.*;
 import cn.cslg.pas.service.business.es.*;
 import cn.cslg.pas.service.common.FileManagerService;
@@ -930,4 +931,24 @@ public class EventServiceTests {
         GenerateObjectUtil.getTableColumnName(project,"evidenceRiskResponse");
     }
 
+    @Autowired
+    private ConfessionSessionMapper sessionMapper;
+
+    @Test
+    public void test121() throws Exception {
+//        String s = "<details style=\\\"color:gray;background-color: #f8f8f8;padding: 8px;border-radius: 4px;\\\" open> <summary> Thinking... </summary>\\u55ef\\uff0c\\u7528\\u6237\\u7ed9\\u4e86\\u4e00\\u4e2a\\u5173\\u4e8e\\u4e13\\u5229\\u5ba1\\u67e5\\u610f\\u89c1\\u7b54\\u590d\\u7684\\u590d\\u6742\\u95ee\\u9898\\uff0c\\u9700\\u8981";
+//        final String unicodeDecode = DataUtils.unicodeDecode(s);
+//        System.out.println(unicodeDecode);
+//
+//
+//        JSONObject obj = new JSONObject();
+//        obj.put("answer", unicodeDecode);
+//        final String s1 = obj.toJSONString();
+//        final String s2 = obj.toString();
+//        System.out.println(s1);
+//        System.out.println(s2);
+        final int i = sessionMapper.updateSingleField(78, "content", "1222");
+        System.out.println(i);
+
+    }
 }