|
@@ -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;
|
|
|
+ }
|
|
|
}
|