Jelajahi Sumber

Merge remote-tracking branch 'origin/dify2'

lrj 4 bulan lalu
induk
melakukan
16c5f8858a

+ 10 - 0
src/main/java/cn/cslg/pas/common/model/dify/ClaimExplainVO.java

@@ -0,0 +1,10 @@
+package cn.cslg.pas.common.model.dify;
+
+import lombok.Data;
+
+@Data
+public class ClaimExplainVO {
+    private String explain;
+    private String effects;
+    private String claim;
+}

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

@@ -0,0 +1,11 @@
+package cn.cslg.pas.common.model.dify;
+
+import lombok.Data;
+
+@Data
+public class FluxMessageVO {
+    private String event;
+    private String field;
+    private String content;
+    private Integer id;
+}

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

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

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

@@ -0,0 +1,16 @@
+package cn.cslg.pas.common.model.dify;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GenerateInstructAnswerVO {
+    private String answer;
+    private String conversionId;
+    private ClaimExplainVO claimExplainVO;
+    private String title;
+    private String technical;
+    private List<String> implementations;
+    private List<String> answers;
+}

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

@@ -0,0 +1,12 @@
+package cn.cslg.pas.common.model.dify;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GenerateInstructVO {
+    private List<ClaimExplainVO> claimExplains;
+    private GenerateTechnicalVO technical;
+    private String conversionId ;
+}

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

@@ -0,0 +1,9 @@
+package cn.cslg.pas.common.model.dify;
+
+import lombok.Data;
+
+@Data
+public class GenerateTechnicalVO {
+    private String technical;
+    public  String title;
+}

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

@@ -21,7 +21,7 @@ import java.util.stream.Collectors;
  */
 @Component
 public class ClaimSplitUtils {
-    private static final List<String> CNRegix = Arrays.asList("[0-9]+\\.[^0-9]+?", "\\[[0-9]+]");
+    private static final List<String> CNRegix = Arrays.asList("[0-9]+\\.[^0-9]+?", "\\[[0-9]+]","[0-9]+\\、[^0-9]+?");
     private static final List<String> JPRegix = Arrays.asList("【請求項[0-9]+】");
     private static final List<String> KORRegix = Arrays.asList("청구항 [0-9]+", "\\[[0-9]+]");
     private static final List<String> ENReginx = Arrays.asList("[0-9]+\\.[^0-9]+?", "\\[[0-9]+]");

+ 3 - 1
src/main/java/cn/cslg/pas/common/utils/FileUtils.java

@@ -30,7 +30,9 @@ public class FileUtils {
         File file = ah.getSource();
         //获取 file的parentFile 即最后一级之前的所有层级路径(包括盘符) 这里能获得到的最终层级为  ...\target 后续用FILE_SEPARATOR(系统路径分割通配符 即 "\") 以及fileName拼接生成存放文件的目录层级 即为根目录 root
         String rootPath = null;
-
+       if(file==null){
+           return "D:\\PAS\\target\\file";
+       }
         if (fileName != null && !fileName.equals("")) {
             rootPath = file.getParentFile().toString() + FILE_SEPARATOR + fileName;
         } else {

+ 1 - 1
src/main/java/cn/cslg/pas/common/vo/RePatentClaim.java

@@ -29,7 +29,7 @@ public class RePatentClaim {
     private String content;
 
     /**
-     * 类型
+     * 类型 1主权要,2从权
      */
     private Integer type;
 

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

@@ -19,6 +19,7 @@ import cn.cslg.pas.service.business.es.EsPatentVectorService;
 import cn.cslg.pas.service.common.DifyService;
 import cn.cslg.pas.service.common.POIService;
 import cn.cslg.pas.service.dify.DifySessionService;
+import cn.cslg.pas.service.dify.GenerateInstructionService;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -45,6 +46,8 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 import reactor.core.publisher.Flux;
 
 import java.io.IOException;
+import java.time.Duration;
+import java.time.LocalTime;
 import java.util.List;
 
 
@@ -58,6 +61,7 @@ public class DifyController {
     private final DifyService difyService;
     private final DifySessionService difySessionService;
     private final POIService poiService;
+    private final GenerateInstructionService generateInstructionService;
     @Autowired
     private CacheUtils cacheUtils;
     @Autowired
@@ -108,14 +112,22 @@ public class DifyController {
     public Flux<String> sendOADefense(Integer confessionSessionId) throws IOException {
         return difyService.successGetOAHttp(confessionSessionId);
     }
+
     @RequestMapping(value = "/getCheckFile", method = RequestMethod.POST)
     @Operation(summary = "获取质检文件")
     public ResponseEntity<InputStreamResource> addConfessionSession(MultipartFile file) throws Exception {
         RequestAttributes ra = RequestContextHolder.getRequestAttributes();
         ServletRequestAttributes sra = (ServletRequestAttributes) ra;
         HttpServletRequest httpRequest = sra.getRequest();
-        String a=   httpRequest.getHeader("Content-Type");
+        String a = httpRequest.getHeader("Content-Type");
         System.out.println(a);
-        return  poiService.exportCheckFile(file);
+        return poiService.exportCheckFile(file);
+    }
+
+    @RequestMapping(value = "/generateInstruction", method = RequestMethod.POST, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    @Operation(summary = "生成说明书")
+    public Flux<String> addConfessionSession(@RequestBody GenerateClaimDTO generateClaimDTO) throws Exception {
+        return generateInstructionService.generateInstruction2(generateClaimDTO);
     }
+
 }

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

@@ -7,9 +7,11 @@ import cn.cslg.pas.common.model.dify.GenerateClaimDTO;
 import cn.cslg.pas.common.model.dify.confessionSession.AddConfessionSessionDTO;
 import cn.cslg.pas.common.model.dify.confessionSession.UpdateConfessionSessionDTO;
 import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
 import cn.cslg.pas.common.utils.DataUtils;
 import cn.cslg.pas.common.utils.DateUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.vo.PatentRightParams;
 import cn.cslg.pas.domain.business.TechnicalCase;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.domain.report.AssoProjectConfession;
@@ -83,18 +85,18 @@ public class DifyService {
     /**
      * 调用文件系统删除文件接口
      */
-    public String chatMessage(DifyChatMessageDTO difyChatMessageDTO) throws IOException {
+    public String chatMessage(DifyChatMessageDTO difyChatMessageDTO,String key) throws IOException {
         String param = new Gson().toJson(difyChatMessageDTO);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
         OkHttpClient okHttpClient = new OkHttpClient.Builder()
-                .connectTimeout(60, TimeUnit.SECONDS)
-                .writeTimeout(60, TimeUnit.SECONDS)
-                .readTimeout(60, TimeUnit.SECONDS)
+                .connectTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600, TimeUnit.SECONDS)
+                .readTimeout(600, TimeUnit.SECONDS)
                 .build();
         Request request = new Request.Builder()
                 .url(url + "chat-messages")
                 .post(requestBody)
-                .addHeader("Authorization", "Bearer " + apiKey)
+                .addHeader("Authorization", "Bearer " + key)
                 .build();
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
@@ -329,6 +331,11 @@ public class DifyService {
 
     public List<Object> generateClaimExplain(GenerateClaimDTO generateClaimDTO) throws Exception {
         String claim = generateClaimDTO.getClaim();
+        PatentRightParams params = new PatentRightParams();
+        params.setCountry("CN");
+        params.setContent(claim);
+        params.setPatentNo("CN");
+        ClaimSplitUtils.formatPatentRight(params);
         DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
         String userId = loginUtils.getId().toString();
         Map<String, Object> map = new HashMap<>();
@@ -355,12 +362,12 @@ public class DifyService {
         JSONObject dataObject = JSONObject.parseObject(dataStr);
         String outPuts = dataObject.get("outputs").toString();
         JSONObject jsonObject1 = JSONObject.parseObject(outPuts);
-        Object retsObj= jsonObject1.get("json");
+        Object retsObj = jsonObject1.get("json");
         String rets = retsObj.toString();
         List<Object> reObject = JSONArray.parseArray(rets, Object.class);
         Map<String, Object> addMap = new HashMap<>();
-        Map<String,Object> queryMap =new HashMap<>();
-        queryMap.put("claim",claim);
+        Map<String, Object> queryMap = new HashMap<>();
+        queryMap.put("claim", claim);
         addMap.put("query", queryMap);
         addMap.put("answer", retsObj);
         String addStr = JSONObject.toJSONString(addMap);
@@ -494,10 +501,11 @@ public class DifyService {
                 .build();
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
+
     /**
      * 获取具体实施方式
      */
-    public String getImplementation(Map<String,Object> map) throws IOException {
+    public String getImplementation(Map<String, Object> map) throws IOException {
         String param = new Gson().toJson(map);
         RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
         OkHttpClient okHttpClient = new OkHttpClient.Builder()
@@ -513,7 +521,35 @@ public class DifyService {
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
 
-    /**
-     *
-     */
+    public String generateClaimExplainRequest(GenerateClaimDTO generateClaimDTO) throws Exception {
+        String claim = generateClaimDTO.getClaim();
+        String background = generateClaimDTO.getBackground();
+
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        String userId ="1";
+//        String userId = loginUtils.getId().toString();
+        Map<String, Object> map = new HashMap<>();
+        map.put("claim", claim);
+        map.put("background", background);
+        difyChatMessageDTO.setInputs(map);
+        difyChatMessageDTO.setResponseMode("blocking");
+        difyChatMessageDTO.setUser(userId);
+
+        String param = new Gson().toJson(difyChatMessageDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(6000, TimeUnit.SECONDS)
+                .writeTimeout(6000, TimeUnit.SECONDS)
+                .readTimeout(6000, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(url + "workflows/run")
+                .post(requestBody)
+                .addHeader("Authorization", "Bearer " + cliamKey)
+                .build();
+        String res = Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+
+        return res;
+    }
+
 }

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

@@ -12,6 +12,8 @@ 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;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.pas.domain.dify.ConfessionSession;
 import cn.cslg.pas.mapper.dify.ConfessionSessionMapper;
@@ -25,6 +27,7 @@ import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -189,6 +192,20 @@ public class ConfessionSessionService extends ServiceImpl<ConfessionSessionMappe
         assoConfessionSessionFile.insert();
         return assoConfessionSessionFile.getId();
     }
+
+    public ConfessionSession addSessionReDO(AddConfessionSessionDTO addConfessionSessionDTO) {
+        ConfessionSession confessionSession = new ConfessionSession();
+        confessionSession.setContent(addConfessionSessionDTO.getContent());
+        confessionSession.setConversationId(addConfessionSessionDTO.getConversationId());
+        confessionSession.setConversationName(addConfessionSessionDTO.getConversationName());
+//        String createId = loginUtils.getId().toString();
+        confessionSession.setCreateId("1");
+        confessionSession.setType(addConfessionSessionDTO.getType());
+        confessionSession.setCreateTime(new Date());
+        confessionSession.insert();
+        return confessionSession;
+    }
+
 }
 
 

+ 460 - 16
src/main/java/cn/cslg/pas/service/dify/GenerateInstructionService.java

@@ -1,25 +1,78 @@
 package cn.cslg.pas.service.dify;
 
+import cn.cslg.pas.common.model.dify.*;
+import cn.cslg.pas.common.model.dify.confessionSession.AddConfessionSessionDTO;
 import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
+import cn.cslg.pas.common.utils.DateUtils;
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.common.vo.PatentRightParams;
+import cn.cslg.pas.common.vo.RePatentClaim;
+import cn.cslg.pas.domain.business.ReportProject;
+import cn.cslg.pas.domain.business.ReportTemple;
+import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
+import cn.cslg.pas.domain.dify.ConfessionSession;
+import cn.cslg.pas.exception.ExceptionEnum;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.ReportTempleService;
+import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.common.FileManagerService;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.google.gson.Gson;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.FluxSink;
 
-import java.util.List;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 @Service
 public class GenerateInstructionService {
-    public void generateContent(String claim){
-        PatentRightParams params =new PatentRightParams();
-        params.setCountry("CN");
-        params.setContent(claim);
-        params.setPatentNo("CN");
-      ClaimSplitUtils.formatPatentRight(params);
+    @Autowired
+    private ReportTempleService templeService;
+    @Autowired
+    private FileUtils fileUtils;
+    @Autowired
+    private AssoConfessionSessionFileService assoConfessionSessionFileService;
+    @Autowired
+    private DifyService difyService;
+    @Autowired
+    private FileManagerService fileManagerService;
+    @Autowired
+    private ConfessionSessionService confessionSessionService;
+    private final static String ALL_START = "all_start";
+    private final static String ALL_END = "all_end";
+    private final static String START = "start";
+    private final static String END = "end";
+    private final static String MESSAGE = "message";
+    private final static String FIELD_TITLE = "title";
+    private final static String FIELD_TECHNICAL = "technical";
+    private final static String FIELD_IMPLEMENTATION = "implementation";
+    private final static String FIELD_BACKGROUND = "background";
+    private final static String FIELD_CONTENT = "content";
+    private final static String ERROR = "error";
+    private Integer SESSION_ID;
+    @Value("${DIFY.gInstructionKey}")
+    private String gInstructionKey;
 
-    }
 
-    public String getClaimContent(String claim){
+    public String getClaimContent(String claim) {
         // 正则表达式模式(注意 Java 中需要双反斜杠转义)
         String regex = "其特征在于[,。;!?、]+(.+)";
         Pattern pattern = Pattern.compile(regex);
@@ -28,17 +81,408 @@ public class GenerateInstructionService {
             // 提取第一个捕获组的内容(即括号内的部分)
             return matcher.group(1).trim();
         }
-        return "其中,"+claim; // 未找到匹配时返回空字符串
+        return "其中," + claim; // 未找到匹配时返回空字符串
 
     }
-    public String getMainClaimContent(String claim){
+
+    public String getMainClaimContent(String claim) {
         // 正则表达式模式(注意 Java 中需要双反斜杠转义)
-        String regex1 = "^[0-9]+\\.[^0-9]+?";
-        String regex2="^\\[[0-9]+]";
-        String outPut1=claim.replaceAll(regex1,"");
-        String outPut2=outPut1.replaceAll(regex2,"");
-        return "为解决上述问题,本申请提出"+outPut2; // 未找到匹配时返回空字符串
+//        String regex1 = "^[0-9]+\\.";
+//        String regex2 = "^\\[[0-9]+]";
+//        String regex3 = "^[0-9]+、";
+//        String outPut1 = claim.replaceAll(regex1, "");
+//        String outPut2 = outPut1.replaceAll(regex2, "");
+//        String outPut3 =outPut2.replaceAll(regex3,"");
+        String combinedRegex = "^(\\d+[.、]|\\[[0-9]+])";
+        String output = claim.replaceAll(combinedRegex, "").replaceAll("[\\n\\r]+$", "");
+
+        return  output; // 未找到匹配时返回空字符串
+
+    }
+    public String getClaimText(String claim) {
+        String combinedRegex = "^(\\d+[.、]|\\[[0-9]+])";
+        String output = claim.replaceAll(combinedRegex, "").replaceAll("[\\n\\r]+$", "");
+
+        return  output; // 未找到匹配时返回空字符串
+
+    }
+    private XWPFTemplate getTemplate(Map<String, Object> map, String filePath) {
+        //装载标的专利信息
+        XWPFTemplate template = null;
+        try {
+            Configure configure = Configure.builder()
+                    .build();
+            template = XWPFTemplate.compile(filePath, configure).render(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未匹配到模版文件");
+        }
+        return template;
+    }
+
+
+    public Flux<String> generateInstruction2(GenerateClaimDTO generateClaimDTO) throws Exception {
+        Integer templeId = 19;
+        String claim = generateClaimDTO.getClaim();
+        String background = generateClaimDTO.getBackground();
+        Map<String, Object> addMap = new HashMap<>();
+        Map<String, Object> queryMap = new HashMap<>();
+        queryMap.put("claim", claim);
+        queryMap.put("background", background);
+        addMap.put("query", queryMap);
+
+        String addStr = JSONObject.toJSONString(addMap);
+        AddConfessionSessionDTO addConfessionSessionDTO = new AddConfessionSessionDTO();
+        addConfessionSessionDTO.setType(3);
+        addConfessionSessionDTO.setContent(addStr);
+        ConfessionSession confessionSession = confessionSessionService.addSessionReDO(addConfessionSessionDTO);
+        SESSION_ID = confessionSession.getId();
+
+        ReportTemple reportTemplate = templeService.getById(templeId);
+        String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
+
+        Map<String, Object> map = new HashMap<>();
+
+
+        return Flux.create(emitter -> {
+            new Thread(() -> {
+                try {
+                    //;流程开始
+                    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);
+                    String conversionId = generateInstructAnswerVO.getConversionId();
+                    String title = generateInstructAnswerVO.getTitle();
+                    String technical = generateInstructAnswerVO.getTechnical();
+                    map.put("title", title);
+                    map.put("conversionId", conversionId);
+                    map.put("technical", technical);
+                    //生成背景技术
+                    GenerateInstructAnswerVO generateInstructAnswerVO4 =  this.generateBackGround(emitter, background);
+                    map.put("background", generateInstructAnswerVO4.getAnswers());
+                    //更新会话
+                    String name = DateUtils.dateTimeToStr(new Date(), "yyyyMMdd");
+                    name = name + "-" + title + "-生成说明书";
+                    confessionSession.setConversationName(name);
+                    confessionSession.setConversationId(conversionId);
+                    confessionSession.updateById();
+
+                    //生成发明内容
+                    String startMessage = getFluxMessage(FIELD_CONTENT, START, "");
+                    emitter.next(startMessage);
+                    ClaimExplainVO claimExplainVO = this.getFirstImplementation(rePatentClaims.get(0), background, conversionId);
+                    GenerateInstructAnswerVO generateInstructAnswerVO3 = this.generateContent(emitter, rePatentClaims, claimExplainVO);
+                    map.put("content",generateInstructAnswerVO3.getAnswers());
+                    //生成具体实施方式
+                    GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(emitter, claimExplainVO, background, conversionId, rePatentClaims);
+                    map.put("implementation", generateInstructAnswerVO2.getImplementations());
+
+                    //生成文档
+                    String fileGuid = this.generateFile(map, templateFilePath, name);
+                    AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+                    assoConfessionSessionFile.setGuid(fileGuid);
+                    assoConfessionSessionFile.setConfessionSessionId(confessionSession.getId());
+                    assoConfessionSessionFile.insert();
+                    String endMess = getFluxMessage("", ALL_END, fileGuid);
+                    emitter.next(endMess);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    emitter.complete();
+                }
+            }).start();
+        });
+    }
+
+    /**
+     * 生成文件
+     *
+     * @param map
+     * @param templateFilePath
+     * @param name
+     * @return
+     * @throws Exception
+     */
+    public String generateFile(Map<String, Object> map, String templateFilePath, String name) throws Exception {
+        XWPFTemplate xwpfTemplate = this.getTemplate(map, templateFilePath);
+        String fileName = name + ".docx";
+        String directoryName = fileUtils.createDirectory();
+        String outPath = fileUtils.getSavePath(directoryName) + fileName;
+        File file = new File(outPath);
+        // 生成word保存在指定目录
+        xwpfTemplate.writeToFile(outPath);
+        xwpfTemplate.close();
+        List<String> ids = fileManagerService.uploadFileGetGuid2(Arrays.asList(file));
+        if (ids == null || ids.size() == 0) {
+            throw new XiaoShiException("保存记录失败");
+        }
+
+        return ids.get(0);
+    }
+
+    /**
+     * 生成标题和技术领域
+     *
+     * @param fluxSink
+     * @param claim
+     * @param background
+     * @return
+     * @throws Exception
+     */
+    public GenerateInstructAnswerVO genrateTechcialAndTitle(FluxSink fluxSink, String claim, String background) throws Exception {
+        GenerateInstructAnswerVO generateInstructAnswerVO = null;
+        GenerateTechnicalVO generateTechnicalVO = null;
+        String startMessage = getFluxMessage(FIELD_TITLE, START, "");
+        fluxSink.next(startMessage);
+        Boolean ifError = false;
+        try {
+            generateInstructAnswerVO = this.getAnswerFromAI(claim, background, null, "g&technical", null);
+            String answer = generateInstructAnswerVO.getAnswer();
+            generateTechnicalVO = JSONObject.parseObject(answer, GenerateTechnicalVO.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+            ifError = true;
+        }
+
+        generateInstructAnswerVO.setTitle(generateTechnicalVO.getTitle());
+        generateInstructAnswerVO.setTechnical(generateTechnicalVO.getTechnical());
+
+        String message = "";
+        if (ifError) {
+            message = getFluxMessage(FIELD_TITLE, ERROR, "生成标题异常");
+        } else {
+            message = getFluxMessage(FIELD_TITLE, MESSAGE, generateTechnicalVO.getTitle());
+        }
+        fluxSink.next(message);
+        String endMessage = getFluxMessage(FIELD_TITLE, END, "");
+        fluxSink.next(endMessage);
+        String startMessage2 = getFluxMessage(FIELD_TECHNICAL, START, "");
+        fluxSink.next(startMessage2);
+        String message2 = "";
+        if (ifError) {
+            message2 = getFluxMessage(FIELD_TECHNICAL, ERROR, "生成技术领域异常");
+        } else {
+            message2 = getFluxMessage(FIELD_TECHNICAL, MESSAGE, generateTechnicalVO.getTechnical());
+        }
+        fluxSink.next(message2);
+        String endMessage2 = getFluxMessage(FIELD_TECHNICAL, END, "");
+        fluxSink.next(endMessage2);
+
+        return generateInstructAnswerVO;
+    }
+
+    /**
+     * 生成第一个权利要求解释
+     *
+     * @param rePatentClaim
+     * @return
+     */
+    public ClaimExplainVO getFirstImplementation(RePatentClaim rePatentClaim, String background, String conversationId) throws Exception {
+        ClaimExplainVO claimExplainVO = null;
+        try {
+            String claimContent = rePatentClaim.getContent();
+            GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerFromAI(claimContent, background, 0, "g&implementation", conversationId);
+            String answer = generateInstructAnswerVO.getAnswer();
+            claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return claimExplainVO;
+    }
+
+
+    /**
+     * 生成权要的具体实施方式
+     *
+     * @param fluxSink
+     * @param firstClaimExplainVO
+     * @param background
+     * @param conversationId
+     * @param rePatentClaims
+     * @return
+     * @throws Exception
+     */
+    public GenerateInstructAnswerVO generateImplementation(FluxSink fluxSink, ClaimExplainVO firstClaimExplainVO, String background, String conversationId, List<RePatentClaim> rePatentClaims) throws Exception {
+        String startMessage = getFluxMessage(FIELD_IMPLEMENTATION, START, "");
+        fluxSink.next(startMessage);
+        GenerateInstructAnswerVO mainVO = new GenerateInstructAnswerVO();
+        List<String> reContents = new ArrayList<>();
+
+
+        for (int i = 0; i < rePatentClaims.size(); i++) {
+            ClaimExplainVO claimExplainVO = null;
+            if (i == 0) {
+                claimExplainVO = firstClaimExplainVO;
+            } else {
+                try {
+                    RePatentClaim rePatentClaim = rePatentClaims.get(i);
+                    String claimContent = rePatentClaim.getContent();
+                    GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerFromAI(claimContent, background, i, "g&implementation", conversationId);
+                    String answer = generateInstructAnswerVO.getAnswer();
+                    if (generateInstructAnswerVO.getConversionId() != null) {
+                        mainVO.setConversionId(generateInstructAnswerVO.getConversionId());
+                    }
+
+                    claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
+                } catch (Exception e) {
+
+                }
+
+            }
+
+            String message = "";
+            String reStr = null;
+            if (claimExplainVO != null) {
+               List<String> contents = this.formatImplementation(claimExplainVO);
+                if(contents.size()>0){
+                    reContents.addAll(contents);
+                    reStr = StringUtils.join(contents, "\n");
+                }
+                if (i != 0) {
+                    reStr = "\n" + reStr;
+                }
+                message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, reStr);
+            } else {
+                message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, "生成权要" + (i + 1) + "的具体实施方式异常");
+
+            }
+            fluxSink.next(message);
+
+
+        }
+
+        mainVO.setImplementations(reContents);
+        String endMessage = getFluxMessage(FIELD_IMPLEMENTATION, END, "");
+        fluxSink.next(endMessage);
+        return mainVO;
+    }
 
+    /**
+     * 生成单个权要的具体实施方式
+     *
+     * @param claimExplainVO
+     * @return
+     */
+    private List<String> formatImplementation(ClaimExplainVO claimExplainVO) {
+        String reStr = null;
+        List<String> contents = new ArrayList<>();
+        String explainVOClaim = claimExplainVO.getClaim();
+        String effect = claimExplainVO.getEffects();
+        String explain = claimExplainVO.getExplain();
+        if (explainVOClaim != null && !explainVOClaim.trim().equals("")) {
+         String tem= this.getClaimText(explainVOClaim);
+            contents.add(tem);
+        }
+        if (effect != null && !effect.trim().equals("")) {
+            contents.add(effect);
+        }
+        if (explain != null && !explain.trim().equals("")) {
+            contents.add(explain);
+        }
+
+        return contents;
+    }
+
+    private String getFluxMessage(String field, String event, String content) {
+        FluxMessageVO fluxMessage = new FluxMessageVO();
+        fluxMessage.setEvent(event);
+        fluxMessage.setField(field);
+        fluxMessage.setContent(content);
+        fluxMessage.setId(SESSION_ID);
+        String json = JSONObject.toJSONString(fluxMessage);
+        return json;
+    }
+
+    public GenerateInstructAnswerVO getAnswerFromAI(String claim, String background, Integer index, String type, String conversationId) throws Exception {
+        GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
+        DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
+        difyChatMessageDTO.setUser("1");
+        difyChatMessageDTO.setResponseMode("blocking");
+        difyChatMessageDTO.setQuery(type);
+        difyChatMessageDTO.setConversationId(conversationId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("claim", claim);
+        map.put("background", background);
+        map.put("num_index", index);
+        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);
+        return generateInstructAnswerVO;
+    }
+
+    /**
+     * 生成背景技术
+     *
+     * @param fluxSink
+     * @param background
+     * @return
+     */
+    public GenerateInstructAnswerVO generateBackGround(FluxSink fluxSink, String background) {
+        GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
+        generateInstructAnswerVO.setAnswer(background);
+        String startMessage = getFluxMessage(FIELD_BACKGROUND, START, "");
+        fluxSink.next(startMessage);
+        String message = getFluxMessage(FIELD_BACKGROUND, MESSAGE, background);
+        fluxSink.next(message);
+        String endMessage = getFluxMessage(FIELD_BACKGROUND, END, "");
+        fluxSink.next(endMessage);
+      List<String> answers =Arrays.asList( background.split("\n"));
+      generateInstructAnswerVO.setAnswers(answers);
+        return generateInstructAnswerVO;
+    }
+
+    /**
+     * 生成发明/实用新型内容
+     *
+     * @param fluxSink
+     * @param rePatentClaims
+     * @return
+     */
+    public GenerateInstructAnswerVO generateContent(FluxSink fluxSink, List<RePatentClaim> rePatentClaims, ClaimExplainVO claimExplainVO) {
+        GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
+
+        List<String> contentStrs = new ArrayList<>();
+        for (RePatentClaim rePatentClaim : rePatentClaims) {
+            String claimContent = rePatentClaim.getContent();
+            String temContent = "";
+            if (rePatentClaim != null && rePatentClaim.getType() != null && rePatentClaim.getType().equals(1)) {
+                temContent = "为解决上述问题,本申请提出"+ this.getClaimText(claimContent);
+            } else {
+                temContent = this.getClaimContent(claimContent);
+            }
+            contentStrs.add(temContent);
+        }
+        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);
+            message = getFluxMessage(FIELD_CONTENT, MESSAGE,"\n"+temContent);
+            fluxSink.next(message);
+        } else {
+            message = getFluxMessage(FIELD_CONTENT, ERROR, "生成有益效果异常");
+            fluxSink.next(message);
+        }
+        String endMessage = getFluxMessage(FIELD_CONTENT, END, "");
+        fluxSink.next(endMessage);
+        generateInstructAnswerVO.setAnswer(reContent);
+        generateInstructAnswerVO.setAnswers(contentStrs);
+        return generateInstructAnswerVO;
     }
 
 }

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

@@ -87,7 +87,9 @@ management:
       show-details: always
 DIFY:
   apiKey: app-DDGJt4QUmzlc2aFQ5voOAXIj
-  cliamKey: app-fxpiWOYqtJM1BOaJnG54NlCZ
+#  cliamKey: app-fxpiWOYqtJM1BOaJnG54NlCZ
   OAApiKey: app-mmfvVywt7wdS8HofrYpFy4RL
   checkApiKey: aa
+  cliamKey: app-jF3akhYKgljPLdpeIpTNbs6f
+  gInstructionKey: app-YfoUDlED4oJNO9hVk6hfdKSw
   url: http://192.168.2.24/v1/

+ 2 - 2
src/test/java/cn/cslg/pas/service/common/DifyServiceTest.java

@@ -34,8 +34,8 @@ private DifyService difyService;
         difyChatMessageDTO.setUser("1");
         difyChatMessageDTO.setConversationId("59903434-3a5b-4228-83fa-62c7fa73f642");
         difyChatMessageDTO.setFiles(new ArrayList<>());
-       String a= difyService.chatMessage(difyChatMessageDTO);
-       System.out.println(a);
+//       String a= difyService.chatMessage(difyChatMessageDTO);
+//       System.out.println(a);
     }
 
     @Test

File diff ditekan karena terlalu besar
+ 48 - 8
src/test/java/cn/cslg/pas/service/dify/GenerateInstructionServiceTests.java