GenerateInstructionService.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. package cn.cslg.pas.service.dify;
  2. import cn.cslg.pas.common.model.dify.*;
  3. import cn.cslg.pas.common.model.dify.confessionSession.AddConfessionSessionDTO;
  4. import cn.cslg.pas.common.utils.ClaimUtils.ClaimSplitUtils;
  5. import cn.cslg.pas.common.utils.DateUtils;
  6. import cn.cslg.pas.common.utils.FileUtils;
  7. import cn.cslg.pas.common.utils.LoginUtils;
  8. import cn.cslg.pas.common.utils.StringUtils;
  9. import cn.cslg.pas.common.vo.PatentRightParams;
  10. import cn.cslg.pas.common.vo.RePatentClaim;
  11. import cn.cslg.pas.domain.business.ReportProject;
  12. import cn.cslg.pas.domain.business.ReportTemple;
  13. import cn.cslg.pas.domain.dify.AssoConfessionSessionFile;
  14. import cn.cslg.pas.domain.dify.ConfessionSession;
  15. import cn.cslg.pas.domain.dify.GetInstructAnswerDTO;
  16. import cn.cslg.pas.exception.ExceptionEnum;
  17. import cn.cslg.pas.exception.XiaoShiException;
  18. import cn.cslg.pas.service.business.ReportTempleService;
  19. import cn.cslg.pas.service.common.DifyService;
  20. import cn.cslg.pas.service.common.FileManagerService;
  21. import cn.hutool.core.util.IdUtil;
  22. import com.alibaba.fastjson.JSONArray;
  23. import com.alibaba.fastjson.JSONObject;
  24. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  25. import com.deepoove.poi.XWPFTemplate;
  26. import com.deepoove.poi.config.Configure;
  27. import com.google.gson.Gson;
  28. import okhttp3.MediaType;
  29. import okhttp3.OkHttpClient;
  30. import okhttp3.Request;
  31. import okhttp3.RequestBody;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.stereotype.Service;
  35. import reactor.core.publisher.Flux;
  36. import reactor.core.publisher.FluxSink;
  37. import java.io.File;
  38. import java.io.IOException;
  39. import java.util.*;
  40. import java.util.concurrent.TimeUnit;
  41. import java.util.regex.Matcher;
  42. import java.util.regex.Pattern;
  43. import java.util.stream.Collectors;
  44. @Service
  45. public class GenerateInstructionService {
  46. @Autowired
  47. private ReportTempleService templeService;
  48. @Autowired
  49. private FileUtils fileUtils;
  50. @Autowired
  51. private AssoConfessionSessionFileService assoConfessionSessionFileService;
  52. @Autowired
  53. private DifyService difyService;
  54. @Autowired
  55. private FileManagerService fileManagerService;
  56. @Autowired
  57. private ConfessionSessionService confessionSessionService;
  58. @Value("${FileDownloadUrl}")
  59. private String fileDownloadUrl;
  60. private final static String ALL_START = "all_start";
  61. private final static String ALL_END = "all_end";
  62. private final static String START = "start";
  63. private final static String END = "end";
  64. private final static String MESSAGE = "message";
  65. private final static String FIELD_TITLE = "title";
  66. private final static String FIELD_TECHNICAL = "technical";
  67. private final static String FIELD_IMPLEMENTATION = "implementation";
  68. private final static String FIELD_BACKGROUND = "background";
  69. private final static String FIELD_CONTENT = "content";
  70. private final static String ERROR = "error";
  71. private final static List<String> DISABLE_WORD = Arrays.asList("权利要求", "所述", "其特征在于");
  72. private static final String[] num_lower = {"一", "二", "三", "四", "五", "六", "七", "八", "九"};
  73. private Integer SESSION_ID;
  74. @Value("${DIFY.gInstructionKey}")
  75. private String gInstructionKey;
  76. @Autowired
  77. private LoginUtils loginUtils;
  78. public String getClaimContent(String claim) {
  79. claim = claim.replaceAll("所述", "");
  80. // 正则表达式模式(注意 Java 中需要双反斜杠转义)
  81. String regex = "其特征在于[,。;!?、::]+(.+)";
  82. Pattern pattern = Pattern.compile(regex);
  83. Matcher matcher = pattern.matcher(claim);
  84. if (matcher.find()) {
  85. // 提取第一个捕获组的内容(即括号内的部分)
  86. return matcher.group(1).trim();
  87. }
  88. return claim; // 未找到匹配时返回空字符串
  89. }
  90. public String getMainClaimContent(Integer mainFlag, String claim) {
  91. if (mainFlag <= num_lower.length) {
  92. claim = "第" + num_lower[mainFlag] + "方面,本申请提供" + claim;
  93. }
  94. // 正则表达式模式(注意 Java 中需要双反斜杠转义)
  95. return claim; // 未找到匹配时返回空字符串
  96. }
  97. public String getClaimText(String claim) {
  98. String combinedRegex = "^(\\d+[.、]|\\[[0-9]+])";
  99. String output = claim.replaceAll(combinedRegex, "").replaceAll("[\\n\\r]+$", "");
  100. return output; // 未找到匹配时返回空字符串
  101. }
  102. private XWPFTemplate getTemplate(Map<String, Object> map, String filePath) {
  103. //装载标的专利信息
  104. XWPFTemplate template = null;
  105. try {
  106. Configure configure = Configure.builder()
  107. .build();
  108. template = XWPFTemplate.compile(filePath, configure).render(map);
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未匹配到模版文件");
  112. }
  113. return template;
  114. }
  115. public Flux<String> generateInstruction2(GenerateClaimDTO generateClaimDTO) throws Exception {
  116. Integer templeId = 19;
  117. String orgClaim = generateClaimDTO.getClaim();
  118. String guid = generateClaimDTO.getFilePath();
  119. String filePath = fileDownloadUrl + generateClaimDTO.getFilePath();
  120. String claim = orgClaim.replaceAll("\n", "").replaceAll("\\\\n", "");
  121. String background = generateClaimDTO.getBackground();
  122. Map<String, Object> addMap = new HashMap<>();
  123. Map<String, Object> queryMap = new HashMap<>();
  124. queryMap.put("claim", claim);
  125. queryMap.put("background", background);
  126. addMap.put("query", queryMap);
  127. String addStr = JSONObject.toJSONString(addMap);
  128. AddConfessionSessionDTO addConfessionSessionDTO = new AddConfessionSessionDTO();
  129. addConfessionSessionDTO.setType(3);
  130. addConfessionSessionDTO.setContent(addStr);
  131. addConfessionSessionDTO.setGuid(guid);
  132. ConfessionSession confessionSession = confessionSessionService.addSessionReDO(addConfessionSessionDTO);
  133. SESSION_ID = confessionSession.getId();
  134. ReportTemple reportTemplate = templeService.getById(templeId);
  135. String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
  136. Map<String, Object> map = new HashMap<>();
  137. PatentRightParams params = new PatentRightParams();
  138. params.setCountry("CN");
  139. params.setContent(claim);
  140. params.setPatentNo("CN");
  141. List<RePatentClaim> rePatentClaims = ClaimSplitUtils.formatPatentRight(params);
  142. List<String> reMainPatentClaims = rePatentClaims.stream().filter(item -> item.getParentSort().equals("-1")).map(RePatentClaim::getContent).collect(Collectors.toList());
  143. String mainClaimStr = "";
  144. if (reMainPatentClaims != null && reMainPatentClaims.size() > 0) {
  145. mainClaimStr = StringUtils.join(reMainPatentClaims, "\n");
  146. }
  147. String mainClaim = mainClaimStr;
  148. return Flux.create(emitter -> {
  149. new Thread(() -> {
  150. try {
  151. //;流程开始
  152. String startMess = getFluxMessage("", ALL_START, "");
  153. emitter.next(startMess);
  154. //生成标题和技术领域
  155. GenerateInstructAnswerVO generateInstructAnswerVO = this.genrateTechcialAndTitle(emitter, mainClaim, background, filePath);
  156. String conversionId = generateInstructAnswerVO.getConversionId();
  157. String title = generateInstructAnswerVO.getTitle();
  158. String technical = generateInstructAnswerVO.getTechnical();
  159. map.put("title", title);
  160. map.put("conversionId", conversionId);
  161. map.put("technical", technical);
  162. //生成背景技术
  163. GenerateInstructAnswerVO generateInstructAnswerVO4 = this.generateBackGround(emitter, background);
  164. map.put("background", generateInstructAnswerVO4.getAnswers());
  165. //更新会话
  166. String name = DateUtils.dateTimeToStr(new Date(), "yyyyMMdd");
  167. name = name + "-" + title + "-生成说明书";
  168. confessionSession.setConversationName(name);
  169. confessionSession.setConversationId(conversionId);
  170. confessionSession.updateById();
  171. //生成发明内容
  172. String startMessage = getFluxMessage(FIELD_CONTENT, START, "");
  173. emitter.next(startMessage);
  174. ClaimExplainVO claimExplainVO = this.getFirstImplementation(rePatentClaims.get(0), background, conversionId);
  175. GenerateInstructAnswerVO generateInstructAnswerVO3 = this.generateContent(emitter, rePatentClaims, claimExplainVO, conversionId, title);
  176. List<String> formClaimList = generateInstructAnswerVO3.getClaimList();
  177. map.put("content", generateInstructAnswerVO3.getAnswers());
  178. //生成具体实施方式
  179. GenerateInstructAnswerVO generateInstructAnswerVO2 = this.generateImplementation(emitter, claimExplainVO, background, conversionId, rePatentClaims, formClaimList);
  180. map.put("implementation", generateInstructAnswerVO2.getImplementations());
  181. //生成文档
  182. String fileGuid = this.generateFile(map, templateFilePath, name);
  183. AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
  184. assoConfessionSessionFile.setGuid(fileGuid);
  185. assoConfessionSessionFile.setConfessionSessionId(confessionSession.getId());
  186. assoConfessionSessionFile.insert();
  187. String endMess = getFluxMessage("", ALL_END, fileGuid);
  188. emitter.next(endMess);
  189. } catch (Exception e) {
  190. e.printStackTrace();
  191. } finally {
  192. emitter.complete();
  193. }
  194. }).start();
  195. });
  196. }
  197. /**
  198. * 生成文件
  199. *
  200. * @param map
  201. * @param templateFilePath
  202. * @param name
  203. * @return
  204. * @throws Exception
  205. */
  206. public String generateFile(Map<String, Object> map, String templateFilePath, String name) throws Exception {
  207. XWPFTemplate xwpfTemplate = this.getTemplate(map, templateFilePath);
  208. String fileName = name + ".docx";
  209. String directoryName = fileUtils.createDirectory();
  210. String outPath = fileUtils.getSavePath(directoryName) + fileName;
  211. File file = new File(outPath);
  212. // 生成word保存在指定目录
  213. xwpfTemplate.writeToFile(outPath);
  214. xwpfTemplate.close();
  215. List<String> ids = fileManagerService.uploadFileGetGuid2(Arrays.asList(file));
  216. if (ids == null || ids.size() == 0) {
  217. throw new XiaoShiException("保存记录失败");
  218. }
  219. return ids.get(0);
  220. }
  221. /**
  222. * 生成标题和技术领域
  223. *
  224. * @param fluxSink
  225. * @param background
  226. * @return
  227. * @throws Exception
  228. */
  229. public GenerateInstructAnswerVO genrateTechcialAndTitle(FluxSink fluxSink, String mainClaim, String background, String filePath) throws Exception {
  230. GenerateInstructAnswerVO generateInstructAnswerVO = null;
  231. GenerateTechnicalVO generateTechnicalVO = null;
  232. String startMessage = getFluxMessage(FIELD_TITLE, START, "");
  233. fluxSink.next(startMessage);
  234. Boolean ifError = false;
  235. try {
  236. GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
  237. getInstructAnswerDTO.setBackground(background);
  238. getInstructAnswerDTO.setMainClaim(mainClaim);
  239. getInstructAnswerDTO.setFilePath(filePath);
  240. getInstructAnswerDTO.setType("g&technical");
  241. generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
  242. String answer = generateInstructAnswerVO.getAnswer();
  243. generateTechnicalVO = JSONObject.parseObject(answer, GenerateTechnicalVO.class);
  244. } catch (Exception e) {
  245. e.printStackTrace();
  246. ifError = true;
  247. }
  248. generateInstructAnswerVO.setTitle(generateTechnicalVO.getTitle());
  249. generateInstructAnswerVO.setTechnical(generateTechnicalVO.getTechnical());
  250. String message = "";
  251. if (ifError) {
  252. message = getFluxMessage(FIELD_TITLE, ERROR, "生成标题异常");
  253. } else {
  254. message = getFluxMessage(FIELD_TITLE, MESSAGE, generateTechnicalVO.getTitle());
  255. }
  256. fluxSink.next(message);
  257. String endMessage = getFluxMessage(FIELD_TITLE, END, "");
  258. fluxSink.next(endMessage);
  259. String startMessage2 = getFluxMessage(FIELD_TECHNICAL, START, "");
  260. fluxSink.next(startMessage2);
  261. String message2 = "";
  262. if (ifError) {
  263. message2 = getFluxMessage(FIELD_TECHNICAL, ERROR, "生成技术领域异常");
  264. } else {
  265. message2 = getFluxMessage(FIELD_TECHNICAL, MESSAGE, generateTechnicalVO.getTechnical());
  266. }
  267. fluxSink.next(message2);
  268. String endMessage2 = getFluxMessage(FIELD_TECHNICAL, END, "");
  269. fluxSink.next(endMessage2);
  270. return generateInstructAnswerVO;
  271. }
  272. /**
  273. * 生成第一个权利要求解释
  274. *
  275. * @param rePatentClaim
  276. * @return
  277. */
  278. public ClaimExplainVO getFirstImplementation(RePatentClaim rePatentClaim, String background, String conversationId) throws Exception {
  279. ClaimExplainVO claimExplainVO = null;
  280. try {
  281. String claimContent = rePatentClaim.getContent();
  282. GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
  283. getInstructAnswerDTO.setClaim(claimContent);
  284. getInstructAnswerDTO.setIndex(0);
  285. getInstructAnswerDTO.setBackground(background);
  286. getInstructAnswerDTO.setType("g&implementation");
  287. getInstructAnswerDTO.setConversationId(conversationId);
  288. GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerVO(getInstructAnswerDTO);
  289. String answer = generateInstructAnswerVO.getAnswer();
  290. claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
  291. } catch (Exception e) {
  292. e.printStackTrace();
  293. }
  294. return claimExplainVO;
  295. }
  296. /**
  297. * 生成权要的具体实施方式
  298. *
  299. * @param fluxSink
  300. * @param firstClaimExplainVO
  301. * @param background
  302. * @param conversationId
  303. * @param rePatentClaims
  304. * @return
  305. * @throws Exception
  306. */
  307. public GenerateInstructAnswerVO generateImplementation(FluxSink fluxSink, ClaimExplainVO firstClaimExplainVO, String background, String conversationId, List<RePatentClaim> rePatentClaims, List<String> formClaims) throws Exception {
  308. String startMessage = getFluxMessage(FIELD_IMPLEMENTATION, START, "");
  309. fluxSink.next(startMessage);
  310. GenerateInstructAnswerVO mainVO = new GenerateInstructAnswerVO();
  311. List<String> reContents = new ArrayList<>();
  312. for (int i = 0; i < rePatentClaims.size(); i++) {
  313. RePatentClaim rePatentClaim = rePatentClaims.get(i);
  314. String formClaim = "";
  315. if (formClaims.size() >= i + 1) {
  316. formClaim = formClaims.get(i);
  317. }
  318. ClaimExplainVO claimExplainVO = null;
  319. if (i == 0) {
  320. claimExplainVO = firstClaimExplainVO;
  321. } else {
  322. try {
  323. String claimContent = rePatentClaim.getContent();
  324. GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
  325. getInstructAnswerDTO.setClaim(claimContent);
  326. getInstructAnswerDTO.setBackground(background);
  327. getInstructAnswerDTO.setIndex(i);
  328. getInstructAnswerDTO.setType("g&implementation");
  329. getInstructAnswerDTO.setConversationId(conversationId);
  330. GenerateInstructAnswerVO generateInstructAnswerVO = this.getAnswerVO(getInstructAnswerDTO);
  331. String answer = generateInstructAnswerVO.getAnswer();
  332. if (generateInstructAnswerVO.getConversionId() != null) {
  333. mainVO.setConversionId(generateInstructAnswerVO.getConversionId());
  334. }
  335. claimExplainVO = JSONObject.parseObject(answer, ClaimExplainVO.class);
  336. } catch (Exception e) {
  337. }
  338. }
  339. String message = "";
  340. String reStr = null;
  341. if (claimExplainVO != null) {
  342. List<String> contents = this.formatImplementation(claimExplainVO, rePatentClaim, formClaim);
  343. if (contents.size() > 0) {
  344. reContents.addAll(contents);
  345. reStr = StringUtils.join(contents, "\n");
  346. }
  347. if (i != 0) {
  348. reStr = "\n" + reStr;
  349. }
  350. message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, reStr);
  351. } else {
  352. message = getFluxMessage(FIELD_IMPLEMENTATION, MESSAGE, "生成权要" + (i + 1) + "的具体实施方式异常");
  353. }
  354. fluxSink.next(message);
  355. }
  356. mainVO.setImplementations(reContents);
  357. String endMessage = getFluxMessage(FIELD_IMPLEMENTATION, END, "");
  358. fluxSink.next(endMessage);
  359. return mainVO;
  360. }
  361. /**
  362. * 生成单个权要的具体实施方式
  363. *
  364. * @param claimExplainVO
  365. * @return
  366. */
  367. private List<String> formatImplementation(ClaimExplainVO claimExplainVO, RePatentClaim rePatentClaim, String formClaim) {
  368. String reStr = null;
  369. List<String> contents = new ArrayList<>();
  370. String explainVOClaim = formClaim;
  371. String effect = claimExplainVO.getEffects();
  372. String explain = claimExplainVO.getExplain();
  373. if (explainVOClaim != null && !explainVOClaim.trim().equals("")) {
  374. String tem = "";
  375. if (rePatentClaim != null && rePatentClaim.getType() != null && rePatentClaim.getType().equals(1)) {
  376. tem = explainVOClaim;
  377. } else {
  378. tem = "在一实施方式中," + explainVOClaim;
  379. }
  380. contents.add(tem);
  381. }
  382. if (explain != null && !explain.trim().equals("")) {
  383. contents.add(explain);
  384. }
  385. if (effect != null && !effect.trim().equals("")) {
  386. contents.add(effect);
  387. }
  388. return contents;
  389. }
  390. private String getFluxMessage(String field, String event, String content) {
  391. FluxMessageVO fluxMessage = new FluxMessageVO();
  392. fluxMessage.setEvent(event);
  393. fluxMessage.setField(field);
  394. fluxMessage.setContent(content);
  395. fluxMessage.setId(SESSION_ID);
  396. String json = JSONObject.toJSONString(fluxMessage);
  397. return json;
  398. }
  399. public GenerateInstructAnswerVO getAnswerFromAI(GetInstructAnswerDTO getInstructAnswerDTO) throws Exception {
  400. String type = getInstructAnswerDTO.getType();
  401. String conversationId = getInstructAnswerDTO.getConversationId();
  402. String claim = getInstructAnswerDTO.getClaim();
  403. String claims = getInstructAnswerDTO.getClaims();
  404. String background = getInstructAnswerDTO.getBackground();
  405. Integer index = getInstructAnswerDTO.getIndex();
  406. String effects = getInstructAnswerDTO.getEffects();
  407. String mainClaim = getInstructAnswerDTO.getMainClaim();
  408. String filePath = getInstructAnswerDTO.getFilePath();
  409. GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
  410. DifyChatMessageDTO difyChatMessageDTO = new DifyChatMessageDTO();
  411. difyChatMessageDTO.setUser("1");
  412. difyChatMessageDTO.setResponseMode("blocking");
  413. difyChatMessageDTO.setQuery(type);
  414. difyChatMessageDTO.setConversationId(conversationId);
  415. Map<String, Object> map = new HashMap<>();
  416. map.put("claim", claim);
  417. map.put("background", background);
  418. map.put("num_index", index);
  419. map.put("effect", effects);
  420. map.put("claims", claims);
  421. map.put("main_claim", mainClaim);
  422. map.put("file_path", filePath);
  423. difyChatMessageDTO.setInputs(map);
  424. Integer cycle = 0;
  425. Boolean flag = false;
  426. String re = "";
  427. while (cycle < 5 && flag == false) {
  428. re = difyService.chatMessage(difyChatMessageDTO, gInstructionKey);
  429. JSONObject jsonObject = JSONObject.parseObject(re);
  430. Object status = jsonObject.get("status");
  431. if (status != null) {
  432. cycle++;
  433. } else {
  434. String answer = jsonObject.get("answer").toString();
  435. String conversionId = jsonObject.get("conversation_id").toString();
  436. generateInstructAnswerVO.setAnswer(answer);
  437. generateInstructAnswerVO.setConversionId(conversionId);
  438. flag = true;
  439. }
  440. }
  441. return generateInstructAnswerVO;
  442. }
  443. /**
  444. * 生成背景技术
  445. *
  446. * @param fluxSink
  447. * @param background
  448. * @return
  449. */
  450. public GenerateInstructAnswerVO generateBackGround(FluxSink fluxSink, String background) {
  451. GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
  452. generateInstructAnswerVO.setAnswer(background);
  453. String startMessage = getFluxMessage(FIELD_BACKGROUND, START, "");
  454. fluxSink.next(startMessage);
  455. String message = getFluxMessage(FIELD_BACKGROUND, MESSAGE, background);
  456. fluxSink.next(message);
  457. String endMessage = getFluxMessage(FIELD_BACKGROUND, END, "");
  458. fluxSink.next(endMessage);
  459. List<String> answers = Arrays.asList(background.split("\n"));
  460. generateInstructAnswerVO.setAnswers(answers);
  461. return generateInstructAnswerVO;
  462. }
  463. /**
  464. * 生成发明/实用新型内容
  465. *
  466. * @param fluxSink
  467. * @param rePatentClaims
  468. * @return
  469. */
  470. public GenerateInstructAnswerVO generateContent(FluxSink fluxSink, List<RePatentClaim> rePatentClaims, ClaimExplainVO claimExplainVO, String conversationId, String title) throws Exception {
  471. GenerateInstructAnswerVO generateInstructAnswerVO = new GenerateInstructAnswerVO();
  472. List<String> formClaims = new ArrayList<>();
  473. List<String> contentStrs = new ArrayList<>();
  474. List<String> claimStrsList = rePatentClaims.stream().map(RePatentClaim::getContent).collect(Collectors.toList());
  475. GetInstructAnswerDTO getInstructAnswerDTO = new GetInstructAnswerDTO();
  476. getInstructAnswerDTO.setConversationId(conversationId);
  477. getInstructAnswerDTO.setType("g&content");
  478. GenerateInstructAnswerVO generateInstructAnswerVO2 = new GenerateInstructAnswerVO();
  479. //发送说明书内容第一段信息
  480. getInstructAnswerDTO.setEffects(claimExplainVO.getEffects());
  481. getInstructAnswerDTO.setType("g&re_effect");
  482. generateInstructAnswerVO2 = this.getAnswerVO(getInstructAnswerDTO);
  483. String answer = generateInstructAnswerVO2.getAnswer();
  484. GenerateContentVO generateTechnicalVO = JSONObject.parseObject(answer, GenerateContentVO.class);
  485. String effects = generateTechnicalVO.getEffect();
  486. String titleEffect = "本申请主要解决的技术问题是" + title + "," + effects;
  487. contentStrs.add(titleEffect);
  488. String message = getFluxMessage(FIELD_CONTENT, MESSAGE, titleEffect);
  489. fluxSink.next(message);
  490. Integer mainClaimFlag = 0;
  491. for (int i = 0; i < claimStrsList.size(); i++) {
  492. getInstructAnswerDTO.setType("g&content");
  493. String claimStr = claimStrsList.get(i);
  494. getInstructAnswerDTO.setClaim(claimStr);
  495. generateInstructAnswerVO2 = this.getAnswerVO(getInstructAnswerDTO);
  496. String answer1 = generateInstructAnswerVO2.getAnswer();
  497. GenerateContentVO generateTechnicalVO1 = JSONObject.parseObject(answer1, GenerateContentVO.class);
  498. String claim = generateTechnicalVO1.getClaim();
  499. formClaims.add(claim);
  500. RePatentClaim rePatentClaim = rePatentClaims.get(i);
  501. String temContent = "";
  502. if (rePatentClaim != null && rePatentClaim.getType() != null && rePatentClaim.getType().equals(1)) {
  503. temContent = this.getMainClaimContent(mainClaimFlag, claim);
  504. mainClaimFlag++;
  505. } else {
  506. temContent = "其中," + claim;
  507. }
  508. contentStrs.add(temContent);
  509. String message1 = getFluxMessage(FIELD_CONTENT, MESSAGE, "\n" + temContent);
  510. fluxSink.next(message1);
  511. }
  512. if (claimExplainVO != null) {
  513. String temContent = "有益效果是:" + claimExplainVO.getEffects();
  514. contentStrs.add(temContent);
  515. message = getFluxMessage(FIELD_CONTENT, MESSAGE, "\n" + temContent);
  516. fluxSink.next(message);
  517. } else {
  518. message = getFluxMessage(FIELD_CONTENT, ERROR, "生成有益效果异常");
  519. fluxSink.next(message);
  520. }
  521. String endMessage = getFluxMessage(FIELD_CONTENT, END, "");
  522. fluxSink.next(endMessage);
  523. generateInstructAnswerVO.setAnswers(contentStrs);
  524. generateInstructAnswerVO.setClaimList(formClaims);
  525. return generateInstructAnswerVO;
  526. }
  527. public GenerateInstructAnswerVO getAnswerVO(GetInstructAnswerDTO getInstructAnswerDTO) throws Exception {
  528. GenerateInstructAnswerVO generateInstructAnswerVO = null;
  529. Integer a = 0;
  530. Boolean flag = true;
  531. while (flag && a < 5) {
  532. generateInstructAnswerVO = this.getAnswerFromAI(getInstructAnswerDTO);
  533. String answer = generateInstructAnswerVO.getAnswer();
  534. if ((answer == null) || answer != null && (answer.contains("所述") || answer.contains("权利要求") || answer.contains("其特征在于"))) {
  535. a++;
  536. continue;
  537. }
  538. flag = false;
  539. }
  540. return generateInstructAnswerVO;
  541. }
  542. }