GenerateInstructionService.java 26 KB

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