Jelajahi Sumber

Merge remote-tracking branch 'origin/master' into prod_test

lrj 1 bulan lalu
induk
melakukan
4ffbce7598

+ 1 - 1
src/main/java/cn/cslg/pas/common/core/base/Constants.java

@@ -49,7 +49,7 @@ public class Constants {
     public static final Integer PATENT_CLASS_NUMBER_CPC = 2;
     public static final Integer PATENT_CLASS_NUMBER_UPC = 3;
     public static final Integer PATENT_CLASS_NUMBER_LOC = 4;
-    public static final Integer MAX_IMPORT_TASK_COUNT=2;
+    public static final Integer MAX_IMPORT_TASK_COUNT=5;
     public static final  Integer IMPORT_PATENT_TO=1;
     public static final String   IMPORT_TASK_CONFIG="importTaskConfig";
     /**

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

@@ -14,4 +14,5 @@ public class ChatMessageDTO {
     private Integer projectId;
     private Integer confessionSessionId;
     private Integer type;
+    private List<String> fileGuids;
 }

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

@@ -15,4 +15,5 @@ public class GenerateInstructAnswerVO {
     private List<ImplementationMessage> implementations;
     private List<String> answers;
     private List<String> claimList;
+    private List<ClaimExplainVO> claimExplainVOs;
 }

+ 9 - 0
src/main/java/cn/cslg/pas/common/model/dify/generateDiscoveryResult/QueryDiscoveryPictureDTO.java

@@ -0,0 +1,9 @@
+package cn.cslg.pas.common.model.dify.generateDiscoveryResult;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import lombok.Data;
+
+@Data
+public class QueryDiscoveryPictureDTO {
+    private Integer confessionSessionId;
+}

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

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

+ 43 - 0
src/main/java/cn/cslg/pas/common/utils/FileUtils.java

@@ -490,4 +490,47 @@ public class FileUtils {
     public static String getConfigFilePath(String url) {
         return getStaticPath(COMMON_FILE) + url;
     }
+    public static String getFileType(String name){
+        Integer i= name.lastIndexOf(".");
+        String type =name.substring(i+1,name.length());
+        return type;
+    }
+    public static boolean deleteFolder(String path) {
+        File target = new File(path);
+        return delete(target);
+    }
+
+    /**
+     * 通用的删除方法,可针对文件或文件夹对象调用
+     * @param target 要删除的File对象(文件或文件夹)
+     * @return 删除成功返回 true,否则返回 false
+     */
+    public static boolean delete(File target) {
+        // 如果目标不存在,直接返回true[4,7](@ref)
+        if (!target.exists()) {
+            return true;
+        }
+
+        // 如果是文件,直接删除[4](@ref)
+        if (target.isFile()) {
+            return target.delete();
+        }
+
+        // 如果是目录,递归删除其内容[8](@ref)
+        if (target.isDirectory()) {
+            File[] files = target.listFiles();
+            // 确保目录列表非空,避免NullPointerException[7](@ref)
+            if (files != null) {
+                for (File file : files) {
+                    // 递归调用,删除子项(文件或文件夹)[6,8](@ref)
+                    if (!delete(file)) {
+                        return false; // 如果任何子项删除失败,则终止并返回失败
+                    }
+                }
+            }
+            // 目录内容清空后,删除空目录本身[1,7](@ref)
+            return target.delete();
+        }
+        return false;
+    }
 }

+ 53 - 0
src/main/java/cn/cslg/pas/common/utils/commonUtils/PictureUtils.java

@@ -0,0 +1,53 @@
+package cn.cslg.pas.common.utils.commonUtils;
+
+import org.apache.poi.hemf.usermodel.HemfPicture;
+import org.apache.poi.util.Units;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.geom.Dimension2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+
+public class PictureUtils {
+    public static File convertEmfToPng(File inputEmf, File outputPng) throws Exception {
+        try (FileInputStream fis = new FileInputStream(inputEmf)) {
+            // 1. 使用POI的HemfPicture解析EMF文件
+            HemfPicture emf = new HemfPicture(fis);
+
+            // 2. 获取EMF图片的原始尺寸(单位为点)
+            Dimension2D dim = emf.getSize();
+            int width = Units.pointsToPixel(dim.getWidth()); // 将点转换为像素
+            int height = Units.pointsToPixel(dim.getHeight());
+
+            // 3. (可选) 调整输出图片大小,例如限制最大边长
+            double max = Math.max(width, height);
+            if (max > 1500) {
+                width *= 1500 / max;
+                height *= 1500 / max;
+            }
+
+            // 4. 创建BufferedImage,并设置渲染提示以提高质量
+            BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+            Graphics2D g = bufImg.createGraphics();
+            // 设置一系列渲染提示,使转换后的图片更平滑清晰
+            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+            g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+
+            // 5. 将EMF图片绘制到BufferedImage上
+            emf.draw(g, new Rectangle2D.Double(0, 0, width, height));
+            g.dispose();
+
+            // 6. 保存为PNG
+            ImageIO.write(bufImg, "PNG", outputPng);
+
+            inputEmf.delete();
+            return outputPng;
+        }
+    }
+
+}

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

@@ -1,9 +1,12 @@
 package cn.cslg.pas.controller.outApi;
 
 import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.model.cronModel.SystemFile;
 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.model.dify.generateDiscoveryResult.QueryDiscoveryPictureDTO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryPictureDTO;
 import cn.cslg.pas.common.model.dify.generatePatentResult.GeneratePatentResultDTO;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
@@ -25,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
 import reactor.core.publisher.Flux;
 
 import java.io.IOException;
+import java.util.List;
 
 
 @SuppressWarnings({"all"})
@@ -44,6 +48,7 @@ public class DifyController {
     @Autowired
     private LoginUtils loginUtils;
     private final PatentResultService patentResultService;
+
     @RequestMapping(value = "/chatMessage", method = RequestMethod.POST, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     @Operation(summary = "发送对话")
     public Flux<String> chatMessage(@RequestBody ChatMessageDTO chatMessageDTO) throws IOException {
@@ -68,8 +73,8 @@ public class DifyController {
 
     @RequestMapping(value = "/stopMessage", method = RequestMethod.GET)
     @Operation(summary = "停止会话")
-    public Response stopMessage(String taskId,Integer type) throws IOException {
-        return Response.success(difyService.stopMessage(taskId,type));
+    public Response stopMessage(String taskId, Integer type) throws IOException {
+        return Response.success(difyService.stopMessage(taskId, type));
     }
 
     @RequestMapping(value = "/generateInventionPoint", method = RequestMethod.POST)
@@ -108,6 +113,7 @@ public class DifyController {
         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 {
@@ -119,4 +125,18 @@ public class DifyController {
     public Flux<String> generatePatentResult(@RequestBody GeneratePatentResultDTO generatePatentResultDTO) throws Exception {
         return patentResultService.aiGeneratePatentResult(generatePatentResultDTO);
     }
+
+    @RequestMapping(value = "/generateDiscoveryResult/queryPicture", method = RequestMethod.POST)
+    @Operation(summary = "获取技术交底书理解结果的附图列表")
+    public Response queryPicture(@RequestBody QueryDiscoveryPictureDTO queryDiscoveryPictureDTO) throws IOException {
+        List<SystemFile> systemFileList = generateDiscoveryResultService.getDiscoveryPictures(queryDiscoveryPictureDTO);
+        return Response.success(systemFileList);
+    }
+    @RequestMapping(value = "/generateDiscoveryResult/uploadPicture", method = RequestMethod.POST)
+    @Operation(summary = "上传技术交底书附图")
+    public Response uploadPicture(@RequestBody UpdateDiscoveryPictureDTO updateDiscoveryPictureDTO) throws IOException {
+ generateDiscoveryResultService.uploadDiscoveryPictures(updateDiscoveryPictureDTO);
+        return Response.success("上传成功");
+    }
+
 }

+ 48 - 21
src/main/java/cn/cslg/pas/service/common/DifyService.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.service.common;
 
 
+import cn.cslg.pas.common.model.cronModel.SystemFile;
 import cn.cslg.pas.common.model.dify.*;
 
 import cn.cslg.pas.common.model.dify.GenerateClaimDTO;
@@ -137,14 +138,14 @@ public class DifyService {
                 .writeTimeout(600, TimeUnit.SECONDS)
                 .readTimeout(600, TimeUnit.SECONDS)
                 .build();
-        Integer type =difyChatMessageDTO.getType();
+        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;
+        String key = apiKey;
+        if (type != null && type.equals(4)) {
+            key = discoveryResultKey;
         }
         Request request = new Request.Builder()
                 .url(url + path)
@@ -196,7 +197,7 @@ public class DifyService {
 
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
-        Request request = this.getChatMessageRequest(requestBody,apiKey);
+        Request request = this.getChatMessageRequest(requestBody, apiKey);
         return Flux.create(emitter -> {
             client.newCall(request).enqueue(new Callback() {
                 @Override
@@ -275,7 +276,7 @@ public class DifyService {
         return url;
     }
 
-    public Request getChatMessageRequest(RequestBody requestBody,String key) {
+    public Request getChatMessageRequest(RequestBody requestBody, String key) {
         Request request = new Request.Builder()
                 .url(url + "chat-messages")
                 .addHeader("Authorization", "Bearer " + key).addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
@@ -284,7 +285,7 @@ public class DifyService {
         return request;
     }
 
-    public JSONObject stopMessage(String taskId,Integer type) throws IOException {
+    public JSONObject stopMessage(String taskId, Integer type) throws IOException {
         OkHttpClient client = new OkHttpClient.Builder()
                 .connectTimeout(60, TimeUnit.SECONDS)
                 .writeTimeout(60, TimeUnit.SECONDS)
@@ -294,9 +295,9 @@ 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;
+        String key = apiKey;
+        if (type != null && type.equals(4)) {
+            key = discoveryResultKey;
         }
         Request request = new Request.Builder()
                 .url(url + "chat-messages/" + taskId + "/stop")
@@ -340,7 +341,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,apiKey);
+        Request request = this.getChatMessageRequest(requestBody, apiKey);
         String res = Objects.requireNonNull(client.newCall(request).execute().body()).string();
         System.out.println(res);
         JSONObject jsonObject = JSONObject.parseObject(res);
@@ -807,6 +808,7 @@ public class DifyService {
         String userId = loginUtils.getId().toString();
         String query = chatMessageDTO.getQuery();
         Integer type = chatMessageDTO.getType();
+        List<String> fileGuids = chatMessageDTO.getFileGuids();
         if (type == null || query == null || query.trim().equals("")) {
             throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请按要求输入参数");
         }
@@ -816,7 +818,7 @@ public class DifyService {
 
 
         String temConversationId = conversationId;
-        String temConversationId3=conversationId;
+        String temConversationId3 = conversationId;
         OkHttpClient client = new OkHttpClient.Builder()
                 .connectTimeout(600, TimeUnit.SECONDS)
                 .writeTimeout(600, TimeUnit.SECONDS)
@@ -829,15 +831,19 @@ public class DifyService {
 
         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);
+        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());
+        if (fileGuids != null && fileGuids.size() > 0) {
+            String pictureJson = this.getDiscoveryResultDialoguePicture(fileGuids);
+            map.put("pictures", pictureJson);
+        }
         difyChatMessageDTO.setInputs(map);
         difyChatMessageDTO.setConversationId(conversationId);
         difyChatMessageDTO.setResponseMode("streaming");
@@ -847,7 +853,7 @@ public class DifyService {
 
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
-        Request request = this.getChatMessageRequest(requestBody,discoveryResultKey);
+        Request request = this.getChatMessageRequest(requestBody, discoveryResultKey);
 
         return Flux.create(emitter -> {
             client.newCall(request).enqueue(new Callback() {
@@ -901,10 +907,31 @@ public class DifyService {
         });
     }
 
-    public Request getGeneratePatentResultResultRequest(Integer confessionSessionId,DifyChatMessageDTO difyChatMessageDTO,String aiKey){
+    public Request getGeneratePatentResultResultRequest(Integer confessionSessionId, DifyChatMessageDTO difyChatMessageDTO, String aiKey) {
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
-        Request request = this.getChatMessageRequest(requestBody,aiKey);
+        Request request = this.getChatMessageRequest(requestBody, aiKey);
         return request;
     }
+
+    public String getDiscoveryResultDialoguePicture(List<String> fileGuids) {
+        List<SystemFile> systemFiles = new ArrayList<>();
+
+        List<Map<String, Object>> list = new ArrayList<>();
+        if (fileGuids != null && fileGuids.size() > 0) {
+            systemFiles = fileManagerService.getSystemFileByGuids(fileGuids);
+            if (systemFiles != null) {
+                systemFiles.forEach(item -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("path", fileDownloadUrl + item.getGuid());
+                    map.put("guid", item.getGuid());
+                    map.put("name", item.getOriginalName());
+                    map.put("desc", "");
+                    list.add(map);
+                });
+            }
+        }
+        String re = JSON.toJSONString(list);
+        return re;
+    }
 }

+ 24 - 5
src/main/java/cn/cslg/pas/service/common/FileManagerService.java

@@ -3,6 +3,7 @@ package cn.cslg.pas.service.common;
 import cn.cslg.pas.common.dto.FMSDeleteFileDTO;
 import cn.cslg.pas.common.model.cronModel.SystemFile;
 import cn.cslg.pas.common.utils.CustomizeFileUtils;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.business.TechnicalCaseService;
 import cn.hutool.core.io.FileUtil;
 import com.alibaba.fastjson.JSONArray;
@@ -41,7 +42,9 @@ public class FileManagerService {
     private String FMSUrl;
     @Value("${FileSource}")
     private String FileSource;
-    private TechnicalCaseService technicalCaseService;;
+    private TechnicalCaseService technicalCaseService;
+    ;
+
     /**
      * 调用文件系统上传文件接口
      *
@@ -91,6 +94,7 @@ public class FileManagerService {
 
     /**
      * 调用文件系统取出文件接口(获得文件流)
+     *
      * @param fieldId 文件id
      */
     public byte[] downloadSystemFileFromFMS(String fieldId) throws IOException {
@@ -234,7 +238,7 @@ public class FileManagerService {
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
 
-    public  File getTempFileByGuid(String guid)throws IOException{
+    public File getTempFileByGuid(String guid) throws IOException {
         String res = this.getSystemFileFromFMS(Arrays.asList(guid));
         List<SystemFile> systemFiles = JSONArray.parseArray(res, SystemFile.class);
         SystemFile systemFile = systemFiles.get(0);
@@ -249,9 +253,10 @@ public class FileManagerService {
         ) {
             IOUtils.copy(inputStream, outputStream); // 将输入流复制到临时文件
         }
-        return  tempFile;
+        return tempFile;
     }
-    public  File getOrgTempFileByGuid(String guid)throws IOException{
+
+    public File getOrgTempFileByGuid(String guid) throws IOException {
         String res = this.getSystemFileFromFMS(Arrays.asList(guid));
         List<SystemFile> systemFiles = JSONArray.parseArray(res, SystemFile.class);
         SystemFile systemFile = systemFiles.get(0);
@@ -267,6 +272,20 @@ public class FileManagerService {
         ) {
             IOUtils.copy(inputStream, outputStream); // 将输入流复制到临时文件
         }
-        return  tempFile;
+        return tempFile;
+    }
+
+    public List<SystemFile> getSystemFileByGuids(List<String> guids) {
+        List<SystemFile> systemFiles = new ArrayList<>();
+        if (guids == null || guids.size() == 0) {
+            return systemFiles;
+        }
+        try {
+            String res = this.getSystemFileFromFMS(guids);
+            systemFiles = com.alibaba.fastjson.JSONObject.parseArray(res, SystemFile.class);
+        } catch (Exception e) {
+            throw new XiaoShiException("查询文件详细信息错误" + e);
+        }
+        return systemFiles;
     }
 }

+ 153 - 0
src/main/java/cn/cslg/pas/service/common/WordService.java

@@ -0,0 +1,153 @@
+package cn.cslg.pas.service.common;
+
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.commonUtils.PictureUtils;
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.extractor.WordExtractor;
+import org.apache.poi.hwpf.model.PicturesTable;
+import org.apache.poi.hwpf.usermodel.Picture;
+import org.apache.poi.xwpf.usermodel.XWPFComment;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFPictureData;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+public class WordService {
+    private static final List<String> images = Arrays.asList("png", "jpeg", "gif", "jpg", "webp", "svg");
+
+    public String getDocxComments(MultipartFile multipartFile) {
+        StringBuilder stringBuilder = new StringBuilder();
+        try (InputStream fis = multipartFile.getInputStream();
+             XWPFDocument document = new XWPFDocument(fis)) {
+
+            // 获取文档中的所有批注
+            XWPFComment[] comments = document.getComments();
+            if (comments != null && comments.length > 0) {
+                for (XWPFComment comment : comments) {
+                    // 提取批注信息
+                    String author = comment.getAuthor();
+                    String text = comment.getText(); // 获取批注文本内容
+                    String id = comment.getId(); // 获取批注ID
+                    stringBuilder.append(text);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return stringBuilder.toString();
+    }
+
+    public String getDocComments(MultipartFile multipartFile) {
+        StringBuilder stringBuilder = new StringBuilder();
+        try (InputStream fis = multipartFile.getInputStream();
+             WordExtractor extractor = new WordExtractor(fis)) {
+
+            // 尝试提取批注文本
+            String[] comments = extractor.getCommentsText();
+            if (comments != null) {
+                for (String comment : comments) {
+                    stringBuilder.append(comment);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return stringBuilder.toString();
+    }
+
+    public List<File> getDocxPictures(InputStream fis, File dir) {
+        List<File> files = new ArrayList<>();
+        try (
+                XWPFDocument document = new XWPFDocument(fis)) {
+// 获取所有图片数据
+            List<XWPFPictureData> pictures = document.getAllPictures();
+            String dirName = dir.getName();
+            if (!dir.exists()) {
+                dir.mkdir();
+            }
+            int imageIndex = 1;
+            for (XWPFPictureData picture : pictures) {
+                String suggestFileExtension = picture.suggestFileExtension();
+                if (!images.contains(suggestFileExtension)) {
+                    suggestFileExtension = "png";
+
+                }
+
+// 获取图片数据和文件名
+                byte[] bytes = picture.getData();
+                String pictureName = picture.getFileName();
+                String[] tem = pictureName.split("\\.");
+                String truePictureName = tem[0];
+                String refx = dirName + FileUtils.FILE_SEPARATOR;
+
+                String fileName = refx + truePictureName + "." + suggestFileExtension;
+                File file = new File(fileName);
+// 保存图片到本地
+                try (FileOutputStream fos = new FileOutputStream(file)) {
+                    fos.write(bytes);
+                }
+                files.add(file);
+                imageIndex++;
+            }
+            document.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return files;
+    }
+
+    public List<File> getDocPictures(InputStream fis, File dir) throws IOException {
+        String picStr = "";
+        List<File> files = new ArrayList<>();
+        HWPFDocument doc = null;
+        try {
+            String dirName = dir.getName();
+            doc = new HWPFDocument(fis);
+// 获取所有图片数据
+            int length = doc.characterLength();
+            PicturesTable pTable = doc.getPicturesTable();
+            int imageIndex = 1;
+            for (Picture picture : pTable.getAllPictures()) {
+                String suggestFileExtension = picture.suggestFileExtension();
+                String suggestFullFileName = picture.suggestFullFileName();
+                String[] suggestFullFileNames = suggestFullFileName.split("\\.");
+                String trueName = "图"+imageIndex;
+                String fullTrueName = dirName + FileUtils.FILE_SEPARATOR + trueName;
+                String fileName = fullTrueName + "." + suggestFileExtension;
+
+                File file = new File(fileName);
+                byte[] bytes = picture.getContent();
+
+                try (FileOutputStream fos = new FileOutputStream(file)) {
+                    fos.write(bytes);
+                }
+//                OutputStream out = new FileOutputStream(file);
+//                picture.writeImageContent(out);
+
+                if (!images.contains(suggestFileExtension)) {
+                    File newFile = new File(fullTrueName + ".png");
+                    if (suggestFileExtension.equals("emf")) {
+                        file = PictureUtils.convertEmfToPng(file, newFile);
+                    }
+                }
+                files.add(file);
+                imageIndex++;
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            doc.close();
+        }
+        return files;
+    }
+
+}

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

@@ -2,12 +2,16 @@ 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.common.FileManagerService;
 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.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -15,6 +19,8 @@ import java.util.stream.Collectors;
 @Service
 @RequiredArgsConstructor
 public class AssoConfessionSessionFileService extends ServiceImpl<AssoConfessionSessionFileMapper, AssoConfessionSessionFile> {
+    @Autowired
+    private FileManagerService fileManagerService;
 
     public List<String> getFileGuid(Integer confessionSessionId, Integer type) {
         LambdaQueryWrapper<AssoConfessionSessionFile> queryWrapper = new LambdaQueryWrapper<>();
@@ -46,4 +52,42 @@ public class AssoConfessionSessionFileService extends ServiceImpl<AssoConfession
         }
         return assoConfessionSessionFile;
     }
+
+
+    public List<AssoConfessionSessionFile> addDiscoveryPictures(List<File> files, Integer confessionSessionId) throws Exception {
+        Integer type = 2;
+        List<AssoConfessionSessionFile> assoConfessionSessionFiles = new ArrayList<>();
+        if (files == null || files.size() == 0) {
+            return assoConfessionSessionFiles;
+        }
+        List<String> guids = fileManagerService.uploadFileGetGuid2(files);
+        if (guids == null || guids.size() == 0) {
+            return assoConfessionSessionFiles;
+        }
+        guids.forEach(item -> {
+            AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+            assoConfessionSessionFile.setConfessionSessionId(confessionSessionId);
+            assoConfessionSessionFile.setType(type);
+            assoConfessionSessionFile.setGuid(item);
+            assoConfessionSessionFiles.add(assoConfessionSessionFile);
+        });
+        this.saveBatch(assoConfessionSessionFiles);
+        return assoConfessionSessionFiles;
+    }
+    public List<AssoConfessionSessionFile> addDiscoveryPicturesByGuid(List<String> guids , Integer confessionSessionId) {
+        Integer type = 2;
+        List<AssoConfessionSessionFile> assoConfessionSessionFiles = new ArrayList<>();
+        if (guids == null || guids.size() == 0) {
+            return assoConfessionSessionFiles;
+        }
+        guids.forEach(item -> {
+            AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+            assoConfessionSessionFile.setConfessionSessionId(confessionSessionId);
+            assoConfessionSessionFile.setType(type);
+            assoConfessionSessionFile.setGuid(item);
+            assoConfessionSessionFiles.add(assoConfessionSessionFile);
+        });
+        this.saveBatch(assoConfessionSessionFiles);
+        return assoConfessionSessionFiles;
+    }
 }

+ 80 - 3
src/main/java/cn/cslg/pas/service/dify/GenerateDiscoveryResultService.java

@@ -1,19 +1,28 @@
 package cn.cslg.pas.service.dify;
 
+import cn.cslg.pas.common.model.cronModel.SystemFile;
 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.common.model.dify.generateDiscoveryResult.QueryDiscoveryPictureDTO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryPictureDTO;
+import cn.cslg.pas.common.utils.FileUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.domain.dify.ConfessionSession;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.common.FileManagerService;
+import cn.cslg.pas.service.common.WordService;
 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;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.*;
 
 @Service
 public class GenerateDiscoveryResultService {
@@ -27,6 +36,13 @@ public class GenerateDiscoveryResultService {
     private LoginUtils loginUtils;
     @Value("${DIFY.discoveryResultKey}")
     private String discoveryResultKey;
+    @Autowired
+    private FileManagerService fileManagerService;
+    @Autowired
+    private WordService wordService;
+    @Autowired
+    private AssoConfessionSessionFileService assoConfessionSessionFileService;
+
     public DiscoryResultVO generateResult(ChatMessageDTO chatMessageDTO) throws Exception {
         DiscoryResultVO discoryResultVO = null;
         Integer confessionSessionId = chatMessageDTO.getConfessionSessionId();
@@ -34,7 +50,7 @@ public class GenerateDiscoveryResultService {
         ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
         String fileId = confessionSession.getGuid();
         String path = fileDownloadUrl + fileId;
-
+        this.addDiscoveryPictures(fileId, confessionSessionId);
         DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
         difyChatMessageDTO.setUser(loginUtils.getId().toString());
         difyChatMessageDTO.setResponseMode("blocking");
@@ -71,7 +87,68 @@ public class GenerateDiscoveryResultService {
         LambdaUpdateWrapper<ConfessionSession> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.set(ConfessionSession::getResultContent, answer).eq(ConfessionSession::getId, confessionSessionId);
         confessionSessionService.update(updateWrapper);
+
+
         return discoryResultVO;
 
     }
+
+    private void addDiscoveryPictures(String fileId, Integer confessionSessionId) throws Exception {
+        File file = fileManagerService.getOrgTempFileByGuid(fileId);
+        //保存交底书附图
+        List<File> fileList = new ArrayList<>();
+        String dirName = UUID.randomUUID() + "";
+        try {
+            InputStream inputStream = new FileInputStream(file);
+            String orgName = file.getName();
+            String fileType = FileUtils.getFileType(orgName);
+
+            File dir = new File(dirName);
+            if (!dir.exists()) {
+                dir.mkdir();
+            }
+            switch (fileType) {
+                case "doc":
+                    fileList = wordService.getDocPictures(inputStream, dir);
+
+                    break;
+                case "docx":
+                    fileList = wordService.getDocxPictures(inputStream, dir);
+
+                    break;
+            }
+            if (fileList.size() > 0) {
+                assoConfessionSessionFileService.addDiscoveryPictures(fileList, confessionSessionId);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            FileUtils.deleteFolder(dirName);
+            file.delete();
+        }
+    }
+
+    public List<SystemFile> getDiscoveryPictures(QueryDiscoveryPictureDTO queryDiscoveryPictureDTO) {
+        Integer confessionSessionId = queryDiscoveryPictureDTO.getConfessionSessionId();
+        List<String> guids = assoConfessionSessionFileService.getFileGuid(confessionSessionId, 2);
+        List<SystemFile> systemFiles = new ArrayList<>();
+        if (guids != null && guids.size() > 0) {
+            try {
+                String res = fileManagerService.getSystemFileFromFMS(guids);
+                systemFiles = com.alibaba.fastjson.JSONObject.parseArray(res, SystemFile.class);
+            } catch (Exception e) {
+                throw new XiaoShiException("查询文件详细信息错误" + e);
+            }
+        }
+        return systemFiles;
+    }
+
+    public void uploadDiscoveryPictures(UpdateDiscoveryPictureDTO updateDiscoveryPictureDTO) {
+        Integer confessionSessionId = updateDiscoveryPictureDTO.getConfessionSessionId();
+        List<String> guids = updateDiscoveryPictureDTO.getFileGuids();
+        if (guids == null || guids.size() == 0) {
+            return;
+        }
+        assoConfessionSessionFileService.addDiscoveryPicturesByGuid(guids, confessionSessionId);
+    }
 }

+ 56 - 61
src/main/java/cn/cslg/pas/service/dify/GenerateInstructionService.java

@@ -162,7 +162,7 @@ public class GenerateInstructionService {
             mainClaimStr = StringUtils.join(reMainPatentClaims, "\n");
         }
         String mainClaim = mainClaimStr;
-        String claimStrs= StringUtils.join(reMainPatentClaims,"\n");
+        String claimStrs = StringUtils.join(reMainPatentClaims, "\n");
         return Flux.create(emitter -> {
             new Thread(() -> {
                 try {
@@ -170,15 +170,30 @@ public class GenerateInstructionService {
                     //;流程开始
                     String startMess = getFluxMessage("", ALL_START, "");
                     emitter.next(startMess);
-
+                    String conversionId = "";
+                    String title = "";
                     //生成标题和技术领域
-                    GenerateInstructAnswerVO generateInstructAnswerVO = this.genrateTechcialAndTitle(userId, emitter, mainClaim, background, filePath,claimStrs);
-                    String conversionId = generateInstructAnswerVO.getConversionId();
-                    String title = generateInstructAnswerVO.getTitle();
+                    GenerateInstructAnswerVO generateInstructAnswerVO = this.genrateTechcialAndTitle(userId, emitter, mainClaim, background, filePath, claimStrs);
+                    conversionId = generateInstructAnswerVO.getConversionId();
+                    title = generateInstructAnswerVO.getTitle();
                     String technical = generateInstructAnswerVO.getTechnical();
                     map.put("title", title);
                     map.put("conversionId", conversionId);
                     map.put("technical", technical);
+                    //生成具体实施方式
+                    GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(userId, emitter, background, conversionId, rePatentClaims);
+                    map.put("implementation", generateInstructAnswerVO2.getImplementations());
+
+                    List<ClaimExplainVO> claimExplainVOS = generateInstructAnswerVO2.getClaimExplainVOs();
+                    conversionId = generateInstructAnswerVO2.getConversionId();
+                    //生成发明内容
+                    String startMessage = getFluxMessage(FIELD_CONTENT, START, "");
+                    emitter.next(startMessage);
+
+                    GenerateInstructAnswerVO generateInstructAnswerVO3 = this.generateContent(userId, emitter, rePatentClaims, claimExplainVOS, conversionId, title);
+                    List<String> formClaimList = generateInstructAnswerVO3.getClaimList();
+                    map.put("content", generateInstructAnswerVO3.getAnswers());
+
                     //生成背景技术
                     GenerateInstructAnswerVO generateInstructAnswerVO4 = this.generateBackGround(emitter, background);
                     map.put("background", generateInstructAnswerVO4.getAnswers());
@@ -189,17 +204,6 @@ public class GenerateInstructionService {
                     confessionSession.setConversationId(conversionId);
                     confessionSession.updateById();
 
-                    //生成发明内容
-                    String startMessage = getFluxMessage(FIELD_CONTENT, START, "");
-                    emitter.next(startMessage);
-                    ClaimExplainVO claimExplainVO = this.getFirstImplementation(userId, rePatentClaims.get(0), background, conversionId);
-                    GenerateInstructAnswerVO generateInstructAnswerVO3 = this.generateContent(userId, emitter, rePatentClaims, claimExplainVO, conversionId, title);
-                    List<String> formClaimList = generateInstructAnswerVO3.getClaimList();
-                    map.put("content", generateInstructAnswerVO3.getAnswers());
-                    //生成具体实施方式
-                    GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(userId, emitter, claimExplainVO, background, conversionId, rePatentClaims, formClaimList);
-                    map.put("implementation", generateInstructAnswerVO2.getImplementations());
-
                     //生成文档
                     String fileGuid = this.generateFile(map, templateFilePath, name);
                     AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
@@ -251,7 +255,7 @@ public class GenerateInstructionService {
      * @return
      * @throws Exception
      */
-    public GenerateInstructAnswerVO genrateTechcialAndTitle(Integer userId, FluxSink fluxSink, String mainClaim, String background, String filePath,String claimStrs) throws Exception {
+    public GenerateInstructAnswerVO genrateTechcialAndTitle(Integer userId, FluxSink fluxSink, String mainClaim, String background, String filePath, String claimStrs) throws Exception {
         GenerateInstructAnswerVO generateInstructAnswerVO = null;
         GenerateTechnicalVO generateTechnicalVO = null;
         String startMessage = getFluxMessage(FIELD_TITLE, START, "");
@@ -338,59 +342,52 @@ public class GenerateInstructionService {
      * 生成权要的具体实施方式
      *
      * @param fluxSink
-     * @param firstClaimExplainVO
      * @param background
      * @param conversationId
      * @param rePatentClaims
      * @return
      * @throws Exception
      */
-    public GenerateInstructAnswerVO generateImplementation(Integer userId, FluxSink fluxSink, ClaimExplainVO firstClaimExplainVO, String background, String conversationId, List<RePatentClaim> rePatentClaims, List<String> formClaims) throws Exception {
+    public GenerateInstructAnswerVO generateImplementation(Integer userId, FluxSink fluxSink, String background, String conversationId, List<RePatentClaim> rePatentClaims) throws Exception {
         String startMessage = getFluxMessage(FIELD_IMPLEMENTATION, START, "");
         fluxSink.next(startMessage);
         GenerateInstructAnswerVO mainVO = new GenerateInstructAnswerVO();
         List<ImplementationMessage> implementationMessages = new ArrayList<>();
 
-
+        List<ClaimExplainVO> claimExplainVOS = new ArrayList<>();
         for (int i = 0; i < rePatentClaims.size(); i++) {
             RePatentClaim rePatentClaim = rePatentClaims.get(i);
-            String formClaim = "";
-            if (formClaims.size() >= i + 1) {
-                formClaim = formClaims.get(i);
-            }
-            ClaimExplainVO claimExplainVO = null;
-            if (i == 0) {
-                claimExplainVO = firstClaimExplainVO;
-            } else {
-                try {
 
-                    String claimContent = rePatentClaim.getContent();
-                    GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
-                    getInstructAnswerDTO.setClaim(claimContent);
-                    getInstructAnswerDTO.setBackground(background);
-                    getInstructAnswerDTO.setIndex(i);
-                    getInstructAnswerDTO.setType("g&implementation");
-                    getInstructAnswerDTO.setConversationId(conversationId);
-                    getInstructAnswerDTO.setUserId(userId);
-                    GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerVO(getInstructAnswerDTO);
-                    String answer = generateInstructAnswerVO.getAnswer();
-                    if (generateInstructAnswerVO.getConversionId() != null) {
-                        mainVO.setConversionId(generateInstructAnswerVO.getConversionId());
-                    }
+            ClaimExplainVO claimExplainVO = null;
 
-                    claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
+            try {
+
+                String claimContent = rePatentClaim.getContent();
+                GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
+                getInstructAnswerDTO.setClaim(claimContent);
+                getInstructAnswerDTO.setBackground(background);
+                getInstructAnswerDTO.setIndex(i);
+                getInstructAnswerDTO.setType("g&implementation");
+                getInstructAnswerDTO.setConversationId(conversationId);
+                getInstructAnswerDTO.setUserId(userId);
+                GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerVO(getInstructAnswerDTO);
+                String answer = generateInstructAnswerVO.getAnswer();
+                if (generateInstructAnswerVO.getConversionId() != null) {
+                    mainVO.setConversionId(generateInstructAnswerVO.getConversionId());
+                }
 
+                claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
 
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
 
+            } catch (Exception e) {
+                e.printStackTrace();
             }
 
+
             String message = "";
             String reStr = null;
             if (claimExplainVO != null) {
-                ImplementationMessage implementationMessage = this.formatImplementation(claimExplainVO, rePatentClaim, formClaim);
+                ImplementationMessage implementationMessage = this.formatImplementation(claimExplainVO, rePatentClaim);
                 implementationMessages.add(implementationMessage);
                 if (implementationMessage != null) {
                     reStr = implementationMessage.getClaimStr() + "\n" + implementationMessage.getExplain() + "\n" + implementationMessage.getEffect();
@@ -399,15 +396,17 @@ public class GenerateInstructionService {
                     reStr = "\n" + reStr;
                 }
                 message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, reStr);
+
             } else {
                 message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, "生成权要" + (i + 1) + "的具体实施方式异常");
 
             }
+            claimExplainVOS.add(claimExplainVO);
             fluxSink.next(message);
 
 
         }
-
+        mainVO.setClaimExplainVOs(claimExplainVOS);
         mainVO.setImplementations(implementationMessages);
         String endMessage = getFluxMessage(FIELD_IMPLEMENTATION, END, "");
         fluxSink.next(endMessage);
@@ -420,9 +419,9 @@ public class GenerateInstructionService {
      * @param claimExplainVO
      * @return
      */
-    private ImplementationMessage formatImplementation(ClaimExplainVO claimExplainVO, RePatentClaim rePatentClaim, String formClaim) {
+    private ImplementationMessage formatImplementation(ClaimExplainVO claimExplainVO, RePatentClaim rePatentClaim) {
         ImplementationMessage implementationMessage = new ImplementationMessage();
-        String explainVOClaim = formClaim;
+        String explainVOClaim = claimExplainVO.getClaim();
         String effect = claimExplainVO.getEffects();
         String explain = claimExplainVO.getExplain();
         if (explainVOClaim != null && !explainVOClaim.trim().equals("")) {
@@ -536,10 +535,11 @@ public class GenerateInstructionService {
      * @param rePatentClaims
      * @return
      */
-    public GenerateInstructAnswerVO generateContent(Integer userId, FluxSink fluxSink, List<RePatentClaim> rePatentClaims, ClaimExplainVO claimExplainVO, String conversationId, String title) throws Exception {
+    public GenerateInstructAnswerVO generateContent(Integer userId, FluxSink fluxSink, List<RePatentClaim> rePatentClaims, List<ClaimExplainVO> claimExplainVOs, String conversationId, String title) throws Exception {
         GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
         List<String> formClaims = new ArrayList<>();
         List<String> contentStrs = new ArrayList<>();
+        ClaimExplainVO firstClaimExplainVO = claimExplainVOs.get(0);
         List<String> claimStrsList = rePatentClaims.stream().map(RePatentClaim::getContent).collect(Collectors.toList());
         GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
         getInstructAnswerDTO.setConversationId(conversationId);
@@ -547,7 +547,7 @@ public class GenerateInstructionService {
         GenerateInstructAnswerVO generateInstructAnswerVO2 = new GenerateInstructAnswerVO();
 
         //发送说明书内容第一段信息
-        getInstructAnswerDTO.setEffects(claimExplainVO.getEffects());
+        getInstructAnswerDTO.setEffects(firstClaimExplainVO.getEffects());
         getInstructAnswerDTO.setType("g&re_effect");
         getInstructAnswerDTO.setUserId(userId);
         generateInstructAnswerVO2 = this.getAnswerVO(getInstructAnswerDTO);
@@ -560,13 +560,8 @@ public class GenerateInstructionService {
         fluxSink.next(message);
         Integer mainClaimFlag = 0;
         for (int i = 0; i < claimStrsList.size(); i++) {
-            getInstructAnswerDTO.setType("g&content");
-            String claimStr = claimStrsList.get(i);
-            getInstructAnswerDTO.setClaim(claimStr);
-            generateInstructAnswerVO2 = this.getAnswerVO(getInstructAnswerDTO);
-            String answer1 = generateInstructAnswerVO2.getAnswer();
-            GenerateContentVO generateTechnicalVO1 = JSONObject.parseObject(answer1, GenerateContentVO.class);
-            String claim = generateTechnicalVO1.getClaim();
+            ClaimExplainVO claimExplainVO = claimExplainVOs.get(i);
+            String claim = claimExplainVO.getClaim();
             formClaims.add(claim);
             RePatentClaim rePatentClaim = rePatentClaims.get(i);
             String temContent = "";
@@ -582,8 +577,8 @@ public class GenerateInstructionService {
         }
 
 
-        if (claimExplainVO != null) {
-            String temContent = "有益效果是:" + claimExplainVO.getEffects();
+        if (firstClaimExplainVO != null) {
+            String temContent = "有益效果是:" + firstClaimExplainVO.getEffects();
             contentStrs.add(temContent);
             message = getFluxMessage(FIELD_CONTENT, MESSAGE, "\n" + temContent);
             fluxSink.next(message);

+ 0 - 1
src/main/java/cn/cslg/pas/service/importPatent/TaskThread.java

@@ -146,7 +146,6 @@ catch (Exception e){
             task.setDoneNum(this.patentProcess.getPatentDoneNum());
         }
 
-
         importTaskAMVO.setDoneNum(this.patentProcess.getPatentDoneNum());
         task.updateById();
         MessageService messageService = applicationContext.getBean(MessageService.class);

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

@@ -92,7 +92,7 @@ DIFY:
   checkApiKey: aa
   cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
 #  gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
-  gInstructionKey: app-HuhT7taopBI3fnxdB6Hgq7ov
+  gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
   discoveryResultKey: app-G5gnZ4s7GlMEIft79fk7hUR7
   aiPatentResultKey: app-KLneZ6O7qXL2DjKm169ltxJI
   url: http://192.168.2.24/v1/