Parcourir la source

20250619-生成说明书修改

lrj il y a 2 mois
Parent
commit
b226c41ea0

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

@@ -6,4 +6,5 @@ import lombok.Data;
 public class GenerateClaimDTO {
     private String claim;
     private String background;
+    private String filePath;
 }

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

@@ -6,6 +6,6 @@ import java.util.List;
 
 @Data
 public class GenerateContentVO {
-    private List<String> claims;
+    private String claim;
     private String effect;
 }

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

@@ -13,4 +13,5 @@ public class GenerateInstructAnswerVO {
     private String technical;
     private List<String> implementations;
     private List<String> answers;
+    private List<String> claimList;
 }

+ 15 - 1
src/main/java/cn/cslg/pas/common/utils/ClaimUtils/ClaimSplitUtils.java

@@ -209,7 +209,8 @@ public class ClaimSplitUtils {
         for (int i = 0; i < rePatentClaims.size(); i++) {
             RePatentClaim patentRight = rePatentClaims.get(i);
             String content = rePatentClaims.get(i).getContent();
-            if ((content.contains(",") && content.substring(0, content.indexOf(",")).contains("权利要求")) || (!content.contains(",") && content.contains("权利要求"))) {
+            String cleanContent =getCNCleanText(content);
+            if (!cleanContent.startsWith("一种")) {
                 Matcher matcher1 = Pattern.compile(regex1).matcher(content);
                 Matcher matcher2 = Pattern.compile(regex2).matcher(content);
                 if (matcher2.find()) {
@@ -433,4 +434,17 @@ public class ClaimSplitUtils {
         return arrayList;
 
     }
+
+    private  static String getCNCleanText(String text){
+        String cleanText ="";
+
+        String regex = "[\u4e00-\u9fff]+";  // 匹配连续中文字符
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(text);
+        while (matcher.find()) {
+            cleanText=matcher.group();
+            break;
+        }
+        return  cleanText;
+    }
 }

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

@@ -11,4 +11,6 @@ public class GetInstructAnswerDTO {
     private String conversationId;
     private String claims;
     private String effects;
+    private String mainClaim;
+    private String filePath;
 }

+ 3 - 7
src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java

@@ -1544,9 +1544,7 @@ public class PatentStarApiService {
                     String claimStr = claim.replaceAll("\t", "\n");
                     builder.append("                                   权利要求");
                     builder.append("\n");
-                    if (claim.length() > 50) {
-                        builder.append(claimStr);
-                    }
+                    builder.append(claimStr);
                 }
             }
         }
@@ -1560,13 +1558,11 @@ public class PatentStarApiService {
                 builder.append("\n");
                 builder.append("                                         说明书");
                 builder.append("\n");
-                if (specification.length() > 50) {
-                    builder.append(specification);
-                }
+                builder.append(specification);
             }
         }
         String result = builder.toString();
-        if (StringUtils.isNotEmpty(result) && result.length() > 100) {
+        if (StringUtils.isNotEmpty(result)) {
             byte[] bytes = result.getBytes();
             MultipartFile multipartFile = FileUtils.convertBytesToMultipartFile(bytes, patentNo + "-" + "文本文档.txt");
             List<String> list = fileManagerService.uploadFileGetGuid(Collections.singletonList(multipartFile));

+ 118 - 71
src/main/java/cn/cslg/pas/service/dify/GenerateInstructionService.java

@@ -58,6 +58,8 @@ public class GenerateInstructionService {
     private FileManagerService fileManagerService;
     @Autowired
     private ConfessionSessionService confessionSessionService;
+    @Value("${FileDownloadUrl}")
+    private String fileDownloadUrl;
     private final static String ALL_START = "all_start";
     private final static String ALL_END = "all_end";
     private final static String START = "start";
@@ -69,6 +71,8 @@ public class GenerateInstructionService {
     private final static String FIELD_BACKGROUND = "background";
     private final static String FIELD_CONTENT = "content";
     private final static String ERROR = "error";
+    private final static List<String> DISABLE_WORD = Arrays.asList("权利要求", "所述", "其特征在于");
+    private static final String[] num_lower = {"一", "二", "三", "四", "五", "六", "七", "八", "九"};
     private Integer SESSION_ID;
     @Value("${DIFY.gInstructionKey}")
     private String gInstructionKey;
@@ -90,11 +94,11 @@ public class GenerateInstructionService {
 
     }
 
-    public String getMainClaimContent(String claim) {
-        claim = claim.replaceAll("所述", "");
+    public String getMainClaimContent(Integer mainFlag, String claim) {
+        if (mainFlag <= num_lower.length) {
+            claim = "第" + num_lower[mainFlag] + "方面,本申请提供" + claim;
+        }
         // 正则表达式模式(注意 Java 中需要双反斜杠转义)
-        claim = claim.replaceAll("^(\\d+[.、]|\\[[0-9]+])", "");
-        claim = claim.replaceAll("其特征在于[,。;!?、::]", "");
         return claim; // 未找到匹配时返回空字符串
 
 
@@ -126,6 +130,8 @@ public class GenerateInstructionService {
     public Flux<String> generateInstruction2(GenerateClaimDTO generateClaimDTO) throws Exception {
         Integer templeId = 19;
         String orgClaim = generateClaimDTO.getClaim();
+        String guid = generateClaimDTO.getFilePath();
+        String filePath = fileDownloadUrl + generateClaimDTO.getFilePath();
         String claim = orgClaim.replaceAll("\n", "").replaceAll("\\\\n", "");
         String background = generateClaimDTO.getBackground();
         Map<String, Object> addMap = new HashMap<>();
@@ -138,6 +144,7 @@ public class GenerateInstructionService {
         AddConfessionSessionDTO addConfessionSessionDTO = new AddConfessionSessionDTO();
         addConfessionSessionDTO.setType(3);
         addConfessionSessionDTO.setContent(addStr);
+        addConfessionSessionDTO.setGuid(guid);
         ConfessionSession confessionSession = confessionSessionService.addSessionReDO(addConfessionSessionDTO);
         SESSION_ID = confessionSession.getId();
 
@@ -145,7 +152,17 @@ public class GenerateInstructionService {
         String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
 
         Map<String, Object> map = new HashMap<>();
-
+        PatentRightParams params = new PatentRightParams();
+        params.setCountry("CN");
+        params.setContent(claim);
+        params.setPatentNo("CN");
+        List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(params);
+        List<String> reMainPatentClaims = rePatentClaims.stream().filter(item -> item.getParentSort().equals("-1")).map(RePatentClaim::getContent).collect(Collectors.toList());
+        String mainClaimStr = "";
+        if (reMainPatentClaims != null && reMainPatentClaims.size() > 0) {
+            mainClaimStr = StringUtils.join(reMainPatentClaims, "\n");
+        }
+        String mainClaim = mainClaimStr;
 
         return Flux.create(emitter -> {
             new Thread(() -> {
@@ -154,13 +171,9 @@ public class GenerateInstructionService {
                     //;流程开始
                     String startMess = getFluxMessage("", ALL_START, "");
                     emitter.next(startMess);
-                    PatentRightParams params = new PatentRightParams();
-                    params.setCountry("CN");
-                    params.setContent(claim);
-                    params.setPatentNo("CN");
-                    List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(params);
+
                     //生成标题和技术领域
-                    GenerateInstructAnswerVO generateInstructAnswerVO = this.genrateTechcialAndTitle(emitter, claim, background);
+                    GenerateInstructAnswerVO generateInstructAnswerVO = this.genrateTechcialAndTitle(emitter, mainClaim, background, filePath);
                     String conversionId = generateInstructAnswerVO.getConversionId();
                     String title = generateInstructAnswerVO.getTitle();
                     String technical = generateInstructAnswerVO.getTechnical();
@@ -182,9 +195,10 @@ public class GenerateInstructionService {
                     emitter.next(startMessage);
                     ClaimExplainVO claimExplainVO = this.getFirstImplementation(rePatentClaims.get(0), background, conversionId);
                     GenerateInstructAnswerVO generateInstructAnswerVO3 = this.generateContent(emitter, rePatentClaims, claimExplainVO, conversionId, title);
+                    List<String> formClaimList = generateInstructAnswerVO3.getClaimList();
                     map.put("content", generateInstructAnswerVO3.getAnswers());
                     //生成具体实施方式
-                    GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(emitter, claimExplainVO, background, conversionId, rePatentClaims);
+                    GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(emitter, claimExplainVO, background, conversionId, rePatentClaims, formClaimList);
                     map.put("implementation", generateInstructAnswerVO2.getImplementations());
 
                     //生成文档
@@ -234,12 +248,11 @@ public class GenerateInstructionService {
      * 生成标题和技术领域
      *
      * @param fluxSink
-     * @param claim
      * @param background
      * @return
      * @throws Exception
      */
-    public GenerateInstructAnswerVO genrateTechcialAndTitle(FluxSink fluxSink, String claim, String background) throws Exception {
+    public GenerateInstructAnswerVO genrateTechcialAndTitle(FluxSink fluxSink, String mainClaim, String background, String filePath) throws Exception {
         GenerateInstructAnswerVO generateInstructAnswerVO = null;
         GenerateTechnicalVO generateTechnicalVO = null;
         String startMessage = getFluxMessage(FIELD_TITLE, START, "");
@@ -248,7 +261,8 @@ public class GenerateInstructionService {
         try {
             GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
             getInstructAnswerDTO.setBackground(background);
-            getInstructAnswerDTO.setClaim(claim);
+            getInstructAnswerDTO.setMainClaim(mainClaim);
+            getInstructAnswerDTO.setFilePath(filePath);
             getInstructAnswerDTO.setType("g&technical");
             generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
             String answer = generateInstructAnswerVO.getAnswer();
@@ -301,9 +315,12 @@ public class GenerateInstructionService {
             getInstructAnswerDTO.setBackground(background);
             getInstructAnswerDTO.setType("g&implementation");
             getInstructAnswerDTO.setConversationId(conversationId);
-            GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
+
+            GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerVO(getInstructAnswerDTO);
             String answer = generateInstructAnswerVO.getAnswer();
             claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
+
+
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -323,7 +340,7 @@ public class GenerateInstructionService {
      * @return
      * @throws Exception
      */
-    public GenerateInstructAnswerVO generateImplementation(FluxSink fluxSink, ClaimExplainVO firstClaimExplainVO, String background, String conversationId, List<RePatentClaim> rePatentClaims) throws Exception {
+    public GenerateInstructAnswerVO generateImplementation(FluxSink fluxSink, ClaimExplainVO firstClaimExplainVO, String background, String conversationId, List<RePatentClaim> rePatentClaims, List<String> formClaims) throws Exception {
         String startMessage = getFluxMessage(FIELD_IMPLEMENTATION, START, "");
         fluxSink.next(startMessage);
         GenerateInstructAnswerVO mainVO = new GenerateInstructAnswerVO();
@@ -332,6 +349,10 @@ public class GenerateInstructionService {
 
         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;
@@ -345,13 +366,16 @@ public class GenerateInstructionService {
                     getInstructAnswerDTO.setIndex(i);
                     getInstructAnswerDTO.setType("g&implementation");
                     getInstructAnswerDTO.setConversationId(conversationId);
-                    GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
+
+                    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) {
 
                 }
@@ -361,7 +385,7 @@ public class GenerateInstructionService {
             String message = "";
             String reStr = null;
             if (claimExplainVO != null) {
-                List<String> contents = this.formatImplementation(claimExplainVO, rePatentClaim);
+                List<String> contents = this.formatImplementation(claimExplainVO, rePatentClaim, formClaim);
                 if (contents.size() > 0) {
                     reContents.addAll(contents);
                     reStr = StringUtils.join(contents, "\n");
@@ -391,10 +415,10 @@ public class GenerateInstructionService {
      * @param claimExplainVO
      * @return
      */
-    private List<String> formatImplementation(ClaimExplainVO claimExplainVO, RePatentClaim rePatentClaim) {
+    private List<String> formatImplementation(ClaimExplainVO claimExplainVO, RePatentClaim rePatentClaim, String formClaim) {
         String reStr = null;
         List<String> contents = new ArrayList<>();
-        String explainVOClaim = claimExplainVO.getClaim();
+        String explainVOClaim = formClaim;
         String effect = claimExplainVO.getEffects();
         String explain = claimExplainVO.getExplain();
         if (explainVOClaim != null && !explainVOClaim.trim().equals("")) {
@@ -436,6 +460,8 @@ public class GenerateInstructionService {
         String background = getInstructAnswerDTO.getBackground();
         Integer index = getInstructAnswerDTO.getIndex();
         String effects = getInstructAnswerDTO.getEffects();
+        String mainClaim = getInstructAnswerDTO.getMainClaim();
+        String filePath = getInstructAnswerDTO.getFilePath();
         GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
         DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
         difyChatMessageDTO.setUser("1");
@@ -448,13 +474,28 @@ public class GenerateInstructionService {
         map.put("num_index", index);
         map.put("effect", effects);
         map.put("claims", claims);
+        map.put("main_claim", mainClaim);
+        map.put("file_path", filePath);
         difyChatMessageDTO.setInputs(map);
-        String re = difyService.chatMessage(difyChatMessageDTO, gInstructionKey);
-        JSONObject jsonObject = JSONObject.parseObject(re);
-        String answer = jsonObject.get("answer").toString();
-        String conversionId = jsonObject.get("conversation_id").toString();
-        generateInstructAnswerVO.setAnswer(answer);
-        generateInstructAnswerVO.setConversionId(conversionId);
+        Integer cycle = 0;
+        Boolean flag = false;
+        String re = "";
+        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 {
+                String answer = jsonObject.get("answer").toString();
+                String conversionId = jsonObject.get("conversation_id").toString();
+                generateInstructAnswerVO.setAnswer(answer);
+                generateInstructAnswerVO.setConversionId(conversionId);
+                flag = true;
+            }
+        }
+
+
         return generateInstructAnswerVO;
     }
 
@@ -486,61 +527,51 @@ public class GenerateInstructionService {
      * @param rePatentClaims
      * @return
      */
-    public GenerateInstructAnswerVO generateContent(FluxSink fluxSink, List<RePatentClaim> rePatentClaims, ClaimExplainVO claimExplainVO, String conversationId, String title) {
+    public GenerateInstructAnswerVO generateContent(FluxSink fluxSink, List<RePatentClaim> rePatentClaims, ClaimExplainVO claimExplainVO, String conversationId, String title) throws Exception {
         GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
-
+        List<String> formClaims = new ArrayList<>();
         List<String> contentStrs = new ArrayList<>();
         List<String> claimStrsList = rePatentClaims.stream().map(RePatentClaim::getContent).collect(Collectors.toList());
-        String claimStrJson = JSONObject.toJSONString(claimStrsList);
         GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
-        getInstructAnswerDTO.setClaims(claimStrJson);
         getInstructAnswerDTO.setConversationId(conversationId);
         getInstructAnswerDTO.setType("g&content");
         GenerateInstructAnswerVO generateInstructAnswerVO2 = new GenerateInstructAnswerVO();
-        Boolean flag = true;
-        List<String> formClaims = new ArrayList<>();
-        String effects = "";
-        try {
-            Integer a = 0;
-            while (flag && a < 3) {
-                generateInstructAnswerVO2 = this.getAnswerFromAI(getInstructAnswerDTO);
-                String answer = generateInstructAnswerVO2.getAnswer();
-                GenerateContentVO generateTechnicalVO = JSONObject.parseObject(answer, GenerateContentVO.class);
-                List<String> claimList = generateTechnicalVO.getClaims();
-                if (claimList.size() != claimStrsList.size()) {
-                    a++;
-                    continue;
-                } else {
-                    flag = false;
-                    formClaims = claimList;
-                    effects = generateTechnicalVO.getEffect();
-                }
-            }
 
-        } catch (Exception e) {
-           e.printStackTrace();
-        }
-        contentStrs.add("本申请主要解决的技术问题是" + title + "," + effects);
-        for (int i = 0; i < rePatentClaims.size(); i++) {
+        //发送说明书内容第一段信息
+        getInstructAnswerDTO.setEffects(claimExplainVO.getEffects());
+        getInstructAnswerDTO.setType("g&re_effect");
+        generateInstructAnswerVO2 = this.getAnswerVO(getInstructAnswerDTO);
+        String answer = generateInstructAnswerVO2.getAnswer();
+        GenerateContentVO generateTechnicalVO = JSONObject.parseObject(answer, GenerateContentVO.class);
+        String effects = generateTechnicalVO.getEffect();
+        String titleEffect = "本申请主要解决的技术问题是" + title + "," + effects;
+        contentStrs.add(titleEffect);
+        String message = getFluxMessage(FIELD_CONTENT, MESSAGE, titleEffect);
+        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();
+            formClaims.add(claim);
             RePatentClaim rePatentClaim = rePatentClaims.get(i);
-            if (formClaims.size() >= i + 1) {
-                String claim = formClaims.get(i);
-                String temContent = "";
-                if (rePatentClaim != null && rePatentClaim.getType() != null && rePatentClaim.getType().equals(1)) {
-                    temContent = this.getMainClaimContent(rePatentClaim.getContent());
-                } else {
-                    temContent = "其中," + claim;
-                }
-                contentStrs.add(temContent);
+            String temContent = "";
+            if (rePatentClaim != null && rePatentClaim.getType() != null && rePatentClaim.getType().equals(1)) {
+                temContent = this.getMainClaimContent(mainClaimFlag, claim);
+                mainClaimFlag++;
+            } else {
+                temContent = "其中," + claim;
             }
+            contentStrs.add(temContent);
+            String message1 = getFluxMessage(FIELD_CONTENT, MESSAGE, "\n" + temContent);
+            fluxSink.next(message1);
         }
 
-        String reContent = "";
-        if (contentStrs.size() != 0) {
-            reContent = StringUtils.join(contentStrs, "\n");
-        }
-        String message = getFluxMessage(FIELD_CONTENT, MESSAGE, reContent);
-        fluxSink.next(message);
+
         if (claimExplainVO != null) {
             String temContent = "有益效果是:" + claimExplainVO.getEffects();
             contentStrs.add(temContent);
@@ -552,9 +583,25 @@ public class GenerateInstructionService {
         }
         String endMessage = getFluxMessage(FIELD_CONTENT, END, "");
         fluxSink.next(endMessage);
-        generateInstructAnswerVO.setAnswer(reContent);
         generateInstructAnswerVO.setAnswers(contentStrs);
+        generateInstructAnswerVO.setClaimList(formClaims);
         return generateInstructAnswerVO;
     }
 
+
+    public GenerateInstructAnswerVO getAnswerVO(GetInstructAnswerDTO getInstructAnswerDTO) throws Exception {
+        GenerateInstructAnswerVO generateInstructAnswerVO = null;
+        Integer a = 0;
+        Boolean flag = true;
+        while (flag && a < 5) {
+            generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
+            String answer = generateInstructAnswerVO.getAnswer();
+            if ((answer == null) || answer != null && (answer.contains("所述") || answer.contains("权利要求") || answer.contains("其特征在于"))) {
+                a++;
+                continue;
+            }
+            flag = false;
+        }
+        return generateInstructAnswerVO;
+    }
 }

+ 5 - 0
src/main/resources/application-prodNetOut.yml

@@ -44,4 +44,9 @@ WDSYS:
   password: Lqftiu807005
 DIFY:
   apiKey: app-DDGJt4QUmzlc2aFQ5voOAXIj
+  #  cliamKey: app-fxpiWOYqtJM1BOaJnG54NlCZ
+  OAApiKey: app-NvKwdHvEK2UmJdmjTGDR0xu6
+  checkApiKey: aa
+  cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
+  gInstructionKey: app-7ImBmlr7kvBTSvBj1mTvgKyp
   url: http://192.168.2.24/v1/

+ 244 - 3
src/test/java/cn/cslg/pas/DifyTest.java

@@ -1,8 +1,24 @@
 package cn.cslg.pas;
 
+import cn.cslg.pas.common.model.dify.ClaimExplainVO;
+import cn.cslg.pas.common.model.dify.DifyChatMessageDTO;
+import cn.cslg.pas.common.model.dify.GenerateInstructAnswerVO;
+import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
 import cn.cslg.pas.common.utils.FileUtils;
 import cn.cslg.pas.common.utils.commonUtils.BusinessUtil;
 
+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.GenerateInstructionService;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,12 +26,19 @@ import org.springframework.boot.test.context.SpringBootTest;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @SpringBootTest
 public class DifyTest {
-
+    @Autowired
+    private GenerateInstructionService generateInstructionService;
+    @Autowired
+    private DifyService difyService;
 
     @Test
     public void checkFile() throws Exception {
@@ -31,7 +54,225 @@ public class DifyTest {
 
     @Test
     public void checkFile1() throws Exception {
-        Map<String, List<String>> map=   BusinessUtil.getPatentNosMap("{\"publicNo\":\"CN202021689802.5;  , CN202021689802.5;CN202021689802.5\"}");
-           System.out.println(map);
+        String text = "一种多功能汽车座舱,其特征在于,包括:\n地板机构;\n第一座椅机构,设置于所述地板机构,所述第一座椅机构用于作为驾驶舱供驾驶员进行驾驶操作;";
+        String a = text.replaceAll("\n", "");
+        System.out.println(a);
+    }
+
+    @Test
+    public void test() throws Exception {
+        String path = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250421-生成说明书-lrj-v1\\testModel\\claim-7.xlsx";
+        Integer StartCell = 12;
+        List<Map<String, Object>> maps = new ArrayList<>();
+        List<String> claims = new ArrayList<>();
+        // 打开Excel工作簿文件
+        XSSFWorkbook workbook = new XSSFWorkbook(path);
+// 获取第一个工作表
+        XSSFSheet sheet = workbook.getSheetAt(0);
+// 遍历所有行
+        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+            XSSFRow row = sheet.getRow(i);
+            XSSFCell cell = row.getCell(0);
+            if (cell != null) {
+                String claimValue = cell.getStringCellValue();
+                if (claimValue != null && !claimValue.trim().equals("")) {
+                    PatentRightParams params = new PatentRightParams();
+                    params.setCountry("CN");
+                    params.setContent(claimValue);
+                    params.setPatentNo("CN");
+                    List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(params);
+                    String conversationId = null;
+                    for (int t = 0; t < rePatentClaims.size(); t++) {
+                        Map<String, Object> map = new HashMap<>();
+                        RePatentClaim rePatentClaim = rePatentClaims.get(t);
+                        ClaimExplainVO claimExplainVO = null;
+                        String claimContent = rePatentClaim.getContent();
+                        GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
+                        getInstructAnswerDTO.setClaim(claimContent);
+                        getInstructAnswerDTO.setIndex(t + 1);
+                        getInstructAnswerDTO.setType("g&implementation");
+                        if (conversationId != null) {
+                            getInstructAnswerDTO.setConversationId(conversationId);
+                        }
+                        long start = System.currentTimeMillis();
+                        GenerateInstructAnswerVO generateInstructAnswerVO = generateInstructionService.getAnswerFromAI(getInstructAnswerDTO);
+                        long end = System.currentTimeMillis();
+                        generateInstructAnswerVO.getConversionId();
+                        String answer = generateInstructAnswerVO.getAnswer();
+                        if (generateInstructAnswerVO.getConversionId() != null && conversationId == null) {
+                            conversationId = generateInstructAnswerVO.getConversionId();
+                        }
+
+                        claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
+                        long overTime = (end - start) / 1000;
+                        map.put("claimExplainVO", claimExplainVO);
+                        map.put("claim", claimContent);
+                        map.put("overTime", overTime);
+                        maps.add(map);
+                    }
+                }
+
+            }
+        }
+
+        for (int i = 0; i < maps.size(); i++) {
+            Map<String, Object> map = maps.get(i);
+            ClaimExplainVO claimExplainVO = (ClaimExplainVO) map.get("claimExplainVO");
+            String claim = (String) map.get("claim");
+            long overTime = (long) map.get("overTime");
+            XSSFRow row = sheet.getRow(i + 1);
+            if (row == null) {
+                row = sheet.createRow(i + 1);
+            }
+            XSSFCell cell1 = row.getCell(1);
+            if (cell1 == null) {
+                cell1 = row.createCell(1);
+            }
+            cell1.setCellValue(claim);
+            XSSFCell cell2 = row.getCell(StartCell);
+            if (cell2 == null) {
+                cell2 = row.createCell(StartCell);
+            }
+            String jsons = JSONObject.toJSONString(claimExplainVO);
+            cell2.setCellValue(jsons);
+
+            XSSFCell cell3 = row.getCell(StartCell + 1);
+            if (cell3 == null) {
+                cell3 = row.createCell(StartCell + 1);
+            }
+            cell3.setCellValue(overTime);
+        }
+// 关闭工作簿
+        String outPath = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250421-生成说明书-lrj-v1\\testModel\\claim-2.xlsx";
+
+        FileOutputStream out = new FileOutputStream(outPath);
+        workbook.write(out);
+        out.flush();
+        out.close();
+        workbook.close();
+    }
+
+
+    public String chatMessage(String cl, String f1, String f2, String f3, String f4, String f5, String f6) throws Exception {
+        String key = "app-yW12smqvBIGmocUDeeG1B8DF";
+        Map<String, Object> map = new HashMap<>();
+        map.put("cl", cl);
+        map.put("f1", f1);
+        map.put("f2", f2);
+        map.put("f3", f3);
+        map.put("f4", f4);
+        map.put("f5", f5);
+        map.put("f6", f6);
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        difyChatMessageDTO.setUser("1");
+        difyChatMessageDTO.setResponseMode("blocking");
+        difyChatMessageDTO.setQuery("123");
+        difyChatMessageDTO.setInputs(map);
+        String re = difyService.chatMessage(difyChatMessageDTO, key);
+        JSONObject jsonObject = JSONObject.parseObject(re);
+        String answer = jsonObject.get("answer").toString();
+        return answer;
+    }
+
+    @Test
+    public void pingfen() throws Exception {
+        String path = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250421-生成说明书-lrj-v1\\testModel\\claim-8.xlsx";
+        List<Map<String, Object>> maps = new ArrayList<>();
+        List<String> claims = new ArrayList<>();
+        // 打开Excel工作簿文件
+        XSSFWorkbook workbook = new XSSFWorkbook(path);
+// 获取第一个工作表
+        XSSFSheet sheet = workbook.getSheetAt(0);
+// 遍历所有行
+        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+            XSSFRow row = sheet.getRow(i);
+            XSSFCell cell1 = row.getCell(1);
+            String v1 = cell1.getStringCellValue();
+            XSSFCell cell2 = row.getCell(2);
+            String v2 = cell2.getStringCellValue();
+            XSSFCell cell3 = row.getCell(4);
+            String v3 = cell3.getStringCellValue();
+            XSSFCell cell4 = row.getCell(6);
+            String v4 = cell4.getStringCellValue();
+            XSSFCell cell5 = row.getCell(8);
+            String v5 = cell5.getStringCellValue();
+            XSSFCell cell6 = row.getCell(10);
+            String v6 = cell6.getStringCellValue();
+            XSSFCell cell7 = row.getCell(12);
+            String v7 = cell7.getStringCellValue();
+            String a = this.chatMessage(v1, v2, v3, v4, v5, v6, v7);
+            XSSFCell xssfCell8 = row.createCell(14);
+            xssfCell8.setCellValue(a);
+        }
+
+        String outPath = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250421-生成说明书-lrj-v1\\testModel\\claim-2.xlsx";
+
+        FileOutputStream out = new FileOutputStream(outPath);
+        workbook.write(out);
+        out.flush();
+        out.close();
+        workbook.close();
+    }
+
+    @Test
+    public void TestWord() throws Exception {
+        Integer start=10;
+        String path = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250310-技术交底书自动生成-lrj-v1\\question3.xlsx";
+        // 打开Excel工作簿文件
+        XSSFWorkbook workbook = new XSSFWorkbook(path);
+// 获取第一个工作表
+        XSSFSheet sheet = workbook.getSheetAt(0);
+// 遍历所有行
+        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+            XSSFRow row = sheet.getRow(i);
+            XSSFCell cell1 = row.getCell(0);
+            String value = cell1.getStringCellValue();
+            long a1 =System.currentTimeMillis();
+            String a = this.chatMessageGetOpt(value);
+            long b1 =System.currentTimeMillis();
+            XSSFCell xssfCell8 = row.createCell(start);
+            xssfCell8.setCellValue(a);
+            XSSFCell xssfCell9 = row.createCell(start+1);
+            long overTime =(b1-a1)/1000;
+            xssfCell9.setCellValue(overTime);
+        }
+
+        String outPath = "E:\\20240716-工作记录文件\\功能文件\\小世系统\\20250310-技术交底书自动生成-lrj-v1\\question4.xlsx";
+
+        FileOutputStream out = new FileOutputStream(outPath);
+        workbook.write(out);
+        out.flush();
+        out.close();
+        workbook.close();
+
+    }
+
+    public String chatMessageGetOpt(String query) throws Exception {
+        String key = "app-RJf21elYKkzosEbLQwjl7gqi";
+        Map<String, Object> map = new HashMap<>();
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        difyChatMessageDTO.setUser("1");
+        difyChatMessageDTO.setResponseMode("blocking");
+        difyChatMessageDTO.setQuery(query);
+        difyChatMessageDTO.setInputs(map);
+        String re = difyService.chatMessage(difyChatMessageDTO, key);
+        JSONObject jsonObject = JSONObject.parseObject(re);
+        String answer = jsonObject.get("answer").toString();
+        return answer;
+    }
+
+@Test
+    public  void test3(){
+        String cleanText ="";
+    String a ="1.一种,13开发";
+    String regex = "[\u4e00-\u9fff]+";  // 匹配连续中文字符
+    Pattern pattern = Pattern.compile(regex);
+    Matcher matcher = pattern.matcher(a);
+    while (matcher.find()) {
+        cleanText=matcher.group();
+        break;
+    }
+
+      System.out.println(cleanText);
     }
 }

+ 1 - 6
src/test/java/cn/cslg/pas/service/dify/GenerateInstructionServiceTests.java

@@ -32,12 +32,7 @@ public class GenerateInstructionServiceTests {
 
     @Test
     public void getMainClaimContent() throws Exception {
-        String re = generateInstructionService.getMainClaimContent("1、一种电磁弹簧,其特征在于,包括:\n" +
-                "螺旋弹性体,由弹簧丝绕一轴线螺旋环绕形成,所述螺旋弹性体至少包括两匝;\n" +
-                "所述螺旋弹性体的至少一组相邻设置的两个匝圈上均设有一电磁件,且所述两个匝圈上的所述电磁件沿所述轴线的正投影至少部分重叠;\n" +
-                "若干线束,沿所述轴线延伸设置于所述螺旋弹性体,所述电磁件连接于至少一所述线束,所述线束用于调节所述电磁件的磁力。\n"
-                );
-        System.out.println(re);
+
     }
 
     @Test