Browse Source

Merge remote-tracking branch 'origin/baodaohan'

# Conflicts:
#	src/main/resources/application-dev.yml
lrj 4 days ago
parent
commit
2ef457066e

+ 13 - 0
src/main/java/cn/cslg/pas/common/model/dify/generateRejection/GenerateRejectionDTO.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.common.model.dify.generateRejection;
+
+import lombok.Data;
+
+@Data
+public class GenerateRejectionDTO {
+    private Integer confessionSessionId;
+    private String rejectionDecision;
+    private String reviewFiles;
+    private String reviewSuggest;
+    private Integer reviewCount;
+    private String caseVolume;
+}

+ 29 - 0
src/main/java/cn/cslg/pas/common/utils/DateUtils.java

@@ -779,4 +779,33 @@ public class               DateUtils {
         df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));
         return df.format(date);
     }
+
+    /**
+     * 获取增加月份后的时间
+     *
+     * @param date  yyyy-MM-dd HH:mm:ss
+     * @param
+     */
+    public static Date getPlusMonthDate(Date date, int month) {
+        Calendar cal = Calendar.getInstance();
+        try {
+            cal.setTime(date);
+            cal.add(Calendar.MONTH, month);
+            return cal.getTime();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    public static Date getPlusDayDate(Date date, int day) {
+        Calendar cal = Calendar.getInstance();
+        try {
+            cal.setTime(date);
+            cal.add(Calendar.DATE, day);
+            return cal.getTime();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 166 - 0
src/main/java/cn/cslg/pas/common/utils/commonUtils/HoliDayUtils.java

@@ -0,0 +1,166 @@
+package cn.cslg.pas.common.utils.commonUtils;
+
+import cn.cslg.pas.common.utils.RedisUtil;
+import cn.cslg.pas.domain.report.OralNotice;
+import cn.cslg.pas.exception.XiaoShiException;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class HoliDayUtils {
+    @Autowired
+    private RedisUtil redisUtil;
+
+    public String isWorkingDay(Date parse) throws ParseException {
+
+        SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd");
+
+        String newDate = new SimpleDateFormat("yyyy").format(parse);
+        String time = getYearFormat.format(parse);
+
+        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(time);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
+        List<JSONObject> jsonObjects = this.getYearHoliday(newDate);
+
+        JSONObject temJsonObject = null;
+        for (JSONObject jsonObject : jsonObjects) {
+            String temDate = jsonObject.getString("date");
+            if (time.equals(temDate)) {
+                temJsonObject = jsonObject;
+                break;
+            }
+        }
+
+        if (temJsonObject != null) {
+            if (temJsonObject.getBoolean("holiday")) {
+                return "2"; // 节假日
+            } else if (!temJsonObject.getBoolean("holiday")) {
+                return "3"; // 调休日
+            }
+        } else {
+            if (weekday == Calendar.SATURDAY || weekday == Calendar.SUNDAY) {
+                return "1"; // 周末
+            } else {
+                return "0";
+            }
+        }
+
+        return "0";
+    }
+
+    public List<JSONObject> getYearHoliday(String year) {
+        List<JSONObject> jsonObjects = new ArrayList<>();
+        String key = "holiday_" + year;
+        String json = redisUtil.get(key);
+        if (json == null || json.trim().equals("")) {
+            String re = this.getYearHolidayHttp(year);
+            if (re == null || re.trim().equals("")) {
+                throw new XiaoShiException("获取节假日信息异常");
+            }
+            jsonObjects = this.formatHoliday(re);
+            json = JSON.toJSONString(jsonObjects);
+            redisUtil.set(key, json);
+        } else {
+            jsonObjects = JSON.parseArray(json, JSONObject.class);
+        }
+        return jsonObjects;
+    }
+
+    public String getYearHolidayHttp(String year) {
+        String urlPath = "https://timor.tech/api/holiday/year/" + year;
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60000, TimeUnit.SECONDS)
+                .writeTimeout(60000, TimeUnit.SECONDS)
+                .readTimeout(60000, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(urlPath)
+                .get()
+                .header("User-Agent", "Mozilla/4.76")
+                .build();
+        Integer tryTime = 0;
+        String re = null;
+        while (tryTime < 3) {
+            try {
+
+                Response response = okHttpClient.newCall(request).execute();
+                // 判断请求是否成功
+                if (response.isSuccessful()) {
+                    // 打印服务端返回结果
+                    re = Objects.requireNonNull(response.body()).string();
+                    return re;
+                }
+                tryTime++;
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+//        StringBuilder re = new StringBuilder();
+//        try {
+//
+//
+//        URL url = new URL(urlPath);
+//        URLConnection connection = url.openConnection();
+//        connection.setRequestProperty("User-Agent", "Mozilla/4.76");
+//        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+//        String strRead;
+//        while ((strRead = reader.readLine()) != null) {
+//            re.append(strRead).append("\r\n");
+//        }
+//        reader.close();
+//        }
+//        catch (Exception e){
+//
+//        }
+        return re;
+    }
+
+    public List<JSONObject> formatHoliday(String json) {
+        List<JSONObject> jsonObjects = new ArrayList<>();
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        String holidayStr = jsonObject.getString("holiday");
+        JSONObject bodyJsonObject = JSONObject.parseObject(holidayStr);
+        for (String key : bodyJsonObject.keySet()) {
+            JSONObject mainObject = bodyJsonObject.getJSONObject(key);
+            jsonObjects.add(mainObject);
+        }
+        return jsonObjects;
+    }
+
+    public Date getWorkingDay(Date date) throws ParseException {
+        Boolean ifWorkingDate = false;
+        while (!ifWorkingDate) {
+            String re = this.isWorkingDay(date);
+            if (re.equals("1") || re.equals("2")) {
+                // 使用Calendar类加一天
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(date); // 将Date对象设置到Calendar中
+                calendar.add(Calendar.DATE, 1); // 增加一天。使用 Calendar.DAY_OF_MONTH 效果相同
+                date= calendar.getTime(); // 转换回Date对象
+            } else {
+                ifWorkingDate = true;
+                break;
+            }
+
+
+        }
+             return  date;
+    }
+}

+ 7 - 0
src/main/java/cn/cslg/pas/controller/outApi/DifyController.java

@@ -8,6 +8,7 @@ import cn.cslg.pas.common.model.dify.confessionSession.ConfessionSessionDetailVO
 import cn.cslg.pas.common.model.dify.generateDiscoveryResult.QueryDiscoveryPictureDTO;
 import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryPictureDTO;
 import cn.cslg.pas.common.model.dify.generatePatentResult.GeneratePatentResultDTO;
+import cn.cslg.pas.common.model.dify.generateRejection.GenerateRejectionDTO;
 import cn.cslg.pas.common.model.dify.oa.OaChatRecordAddDTO;
 import cn.cslg.pas.common.model.dify.oa.OaChatRecordQueryDTO;
 import cn.cslg.pas.common.model.dify.oa.OaGenerateResultDTO;
@@ -53,6 +54,7 @@ public class DifyController {
     private final PatentResultService patentResultService;
     private final OADifyService oaDifyService;
     private final OaChatRecordService oaChatRecordService;
+    private final GenerateRejectionService generateRejectionService;
     @RequestMapping(value = "/chatMessage", method = RequestMethod.POST, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
     @Operation(summary = "发送对话")
     public Flux<String> chatMessage(@RequestBody ChatMessageDTO chatMessageDTO) throws IOException {
@@ -164,4 +166,9 @@ public class DifyController {
          oaDifyService.generateOaResult(oaGenerateResultDTO);
         return  Response.success("生成成功");
     }
+    @RequestMapping(value = "/generateRegection", method = RequestMethod.POST)
+    @Operation(summary = "生成驳导函")
+    public Flux<String> oaGenerateResult(@RequestBody GenerateRejectionDTO generateRejectionDTO) throws Exception {
+        return   generateRejectionService.GenerateRejectionDTO(generateRejectionDTO);
+    }
 }

+ 29 - 0
src/main/java/cn/cslg/pas/service/common/XwpfTemplateService.java

@@ -0,0 +1,29 @@
+package cn.cslg.pas.service.common;
+
+import cn.cslg.pas.exception.ExceptionEnum;
+import cn.cslg.pas.exception.XiaoShiException;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import org.ddr.poi.html.HtmlRenderPolicy;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class XwpfTemplateService {
+    public XWPFTemplate getHtmlTemplate(Map<String, Object> map, String filePath) {
+        XWPFTemplate template = null;
+        try {
+            HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
+            ConfigureBuilder configureBuilder = Configure.builder().useSpringEL(false);
+            configureBuilder.bind("#this", htmlRenderPolicy);
+            Configure configure = configureBuilder.useSpringEL(false).build();
+            template = XWPFTemplate.compile(filePath, configure).render(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未匹配到模版文件");
+        }
+        return template;
+    }
+}

+ 385 - 0
src/main/java/cn/cslg/pas/service/dify/GenerateRejectionService.java

@@ -0,0 +1,385 @@
+package cn.cslg.pas.service.dify;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.model.dify.*;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.DiscoryResultVO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.QueryDiscoveryPictureDTO;
+import cn.cslg.pas.common.model.dify.generateDiscoveryResult.UpdateDiscoveryPictureDTO;
+import cn.cslg.pas.common.model.dify.generateRejection.GenerateRejectionDTO;
+import cn.cslg.pas.common.utils.*;
+import cn.cslg.pas.common.utils.commonUtils.HoliDayUtils;
+import cn.cslg.pas.common.vo.StarPatentVO;
+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.mapper.dify.ConfessionSessionMapper;
+import cn.cslg.pas.service.TemplateExportService;
+import cn.cslg.pas.service.business.ReportTempleService;
+import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.common.FileManagerService;
+import cn.cslg.pas.service.common.WordService;
+import cn.cslg.pas.service.common.XwpfTemplateService;
+import cn.cslg.pas.service.importPatent.ImportSinglePatentService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.deepoove.poi.XWPFTemplate;
+import com.google.gson.Gson;
+import jakarta.json.Json;
+import okhttp3.*;
+import okhttp3.Response;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import reactor.core.publisher.Flux;
+
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+@Service
+public class GenerateRejectionService {
+    @Autowired
+    private DifyService difyService;
+    @Value("${FileDownloadUrl}")
+    private String fileDownloadUrl;
+    @Value("${DIFY.url}")
+    private String url;
+    @Autowired
+    private ConfessionSessionService confessionSessionService;
+    @Autowired
+    private LoginUtils loginUtils;
+    @Value("${DIFY.generateRejectionKey}")
+    private String generateRejectionKey;
+    @Autowired
+    private FileManagerService fileManagerService;
+    @Autowired
+    private WordService wordService;
+    @Autowired
+    private AssoConfessionSessionFileService assoConfessionSessionFileService;
+    @Autowired
+    private ConfessionSessionMapper confessionSessionMapper;
+    @Autowired
+    private ReportTempleService reportTempleService;
+    @Autowired
+    private FileUtils fileUtils;
+    @Autowired
+    private XwpfTemplateService xwpfTemplateService;
+    @Autowired
+    private ImportSinglePatentService importSinglePatentService;
+    @Autowired
+    private HoliDayUtils holiDayUtils;
+
+    public Flux<String> GenerateRejectionDTO(GenerateRejectionDTO generateRejectionDTO) throws Exception {
+        DiscoryResultVO discoryResultVO = null;
+        Integer confessionSessionId = generateRejectionDTO.getConfessionSessionId();
+        String rejectionDecision = generateRejectionDTO.getRejectionDecision();
+        String reviewFiles = generateRejectionDTO.getReviewFiles();
+        String reviewSuggest = generateRejectionDTO.getReviewSuggest();
+        ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
+        String conversionId = confessionSession.getConversationId();
+        String createId = confessionSession.getCreateId();
+
+        OkHttpClient client = new OkHttpClient.Builder()
+                .connectTimeout(600, TimeUnit.SECONDS)
+                .writeTimeout(600, TimeUnit.SECONDS)
+                .readTimeout(600, TimeUnit.SECONDS)
+                .build();
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("rejection_decision", rejectionDecision);
+        map.put("review_files", reviewFiles);
+        map.put("review_suggest", reviewSuggest);
+
+        OAMessageDTO oaMessageDTO = new OAMessageDTO();
+        oaMessageDTO.setInputs(map);
+        oaMessageDTO.setResponseMode("streaming");
+        oaMessageDTO.setUser(createId);
+        oaMessageDTO.setQuery("生成驳回指导函");
+        oaMessageDTO.setConversationId(conversionId);
+        oaMessageDTO.setFiles(new ArrayList<>());
+
+        String param = new Gson().toJson(oaMessageDTO);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        Request request = new Request.Builder()
+                .url(url + "chat-messages")
+                .addHeader("Authorization", "Bearer " + generateRejectionKey)
+                .addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
+                .post(requestBody)
+                .build();
+
+        AtomicBoolean businessCompleted = new AtomicBoolean(false);
+
+
+        Flux<String> businessFlux = Flux.create(emitter -> {
+            client.newCall(request).enqueue(new Callback() {
+
+                @Override
+                public void onFailure(Call call, IOException e) {
+                    emitter.error(e);
+                }
+
+                @Override
+                public void onResponse(Call call, Response response) throws IOException {
+
+                    if (!response.isSuccessful()) {
+                        emitter.error(new IOException("Unexpected code: " + response));
+                        return;
+                    }
+
+                    try (Reader reader = response.body().charStream()) {
+                        BufferedReader bufferedReader = new BufferedReader(reader);
+                        String line;
+                        String prefixToRemove = "data: ";
+                        String runId = conversionId;
+                        while ((line = bufferedReader.readLine()) != null) {
+                            if (line.isEmpty()) {
+                                continue;
+                            }
+                            if (line.startsWith(prefixToRemove)) {
+                                line = line.substring(prefixToRemove.length());
+                            }
+                            try {
+                                JSONObject jsonObject = JSON.parseObject(line);
+                                String sessionConversationId = jsonObject.get("conversation_id").toString();
+                                String event = jsonObject.get("event").toString();
+                                if (StringUtils.isEmpty(runId)) {
+                                    if (StringUtils.isNotEmpty(sessionConversationId)) {
+                                        runId = sessionConversationId;
+                                        confessionSessionMapper.updateSingleField(confessionSessionId, "conversation_id", sessionConversationId);
+                                    }
+                                }
+                                if (event.equals("message")) {
+                                    String data = jsonObject.get("answer").toString();
+                                    JSONObject dataObject = null;
+                                    if (StringUtils.isNotEmpty(data)) {
+                                        try {
+                                            dataObject = JSON.parseObject(data);
+                                            String code = dataObject.get("code").toString();
+                                            if (StringUtils.equals(code, "200")) {
+                                                JSONObject object = dataObject.getJSONObject("data");
+                                                List<JSONObject> publicNos = getPubilcNos(object);
+                                                saveContent(confessionSession, publicNos);
+                                                generateDoc(generateRejectionDTO, confessionSessionId, object, publicNos);
+                                            }
+                                        } catch (Exception e) {
+
+                                        }
+                                    }
+
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                            emitter.next(line); // 将每行数据发送到 Flux
+                        }
+                    } catch (IOException e) {
+                        emitter.error(e);
+                    } finally {
+                        businessCompleted.set(true);
+                        emitter.complete();
+                    }
+                }
+            });
+        });
+
+        return businessFlux;
+
+    }
+
+    public Map<String, Object> loadMap(GenerateRejectionDTO generateRejectionDTO, JSONObject object, List<JSONObject> allPublicNos) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("case_volume", generateRejectionDTO.getCaseVolume());
+        map.put("review_count", generateRejectionDTO.getReviewCount());
+        map.put("review_suggest", generateRejectionDTO.getReviewSuggest());
+        JSONObject rejectionDecision = object.getJSONObject("rejection_decision");
+        String appNo = rejectionDecision.getString("appNo").replace(" ", "");
+        map.put("appNo", appNo);
+        rejectionDecision.put("appNo", appNo);
+        String title = rejectionDecision.getString("title").replace(" ", "");
+        map.put("title", title);
+        rejectionDecision.put("title", title);
+        String issuance = rejectionDecision.getString("issuance").replace(" ", "");
+        rejectionDecision.put("issuance", issuance);
+
+        try {
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+            Date issuanceDate = simpleDateFormat.parse(issuance);
+            Date reviewPeriod = DateUtils.getPlusMonthDate(issuanceDate, 3);
+            reviewPeriod = holiDayUtils.getWorkingDay(reviewPeriod);
+            String reviewPeriodStr = simpleDateFormat.format(reviewPeriod);
+            map.put("review_period", reviewPeriodStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        List<String> rejectionAnalysis = new ArrayList<>();
+        String rejectionAnalysisStr = object.getString("rejection_analysis");
+        List<String> rejectionAnalysisList = JSONArray.parseArray(rejectionAnalysisStr, String.class);
+        for (String item : rejectionAnalysisList) {
+            List<String> tem = cn.cslg.pas.common.utils.StringUtils.changeStringToString(item, "\r?\n+|<br>+");
+            rejectionAnalysis.addAll(tem);
+        }
+        map.put("rejection_analysis",rejectionAnalysis);
+        List<JSONObject> reviewFileList = new ArrayList<>();
+        List<JSONObject> reviewFiles = object.getJSONArray("review_files");
+        for (JSONObject jsonObject : reviewFiles) {
+            JSONObject stateOpinions = jsonObject.getJSONObject("state_opinions");
+            JSONObject examinationOpinion = jsonObject.getJSONObject("examination_opinion");
+            List<JSONObject> publicNos = examinationOpinion.getJSONArray("publicNos");
+            String itemPublicNosStr = null;
+            for (Integer i = 0; i < publicNos.size(); i++) {
+                JSONObject publicNo = publicNos.get(i);
+                Integer pIndex = publicNo.getInteger("index");
+                String pPublicNo = publicNo.getString("publicNo");
+                String sign = "、";
+                if (i == publicNos.size() - 1) {
+                    sign = "和";
+                }
+                if (itemPublicNosStr != null) {
+                    itemPublicNosStr = itemPublicNosStr + sign + "对比文件" + pIndex + "("+pPublicNo+")";
+                } else {
+                    itemPublicNosStr = "对比文件" + pIndex + "("+pPublicNo+")";
+                }
+            }
+            JSONObject obj = new JSONObject();
+            Integer num = jsonObject.getInteger("num");
+            obj.put("num", DataUtils.numberToChinese(num));
+
+            if (stateOpinions.getString("claimChange") != null) {
+                stateOpinions.put("claimChange", stateOpinions.getString("claimChange").replace(" ", ""));
+            }
+            if (stateOpinions.getString("difference_feature") != null) {
+                stateOpinions.put("difference_feature", stateOpinions.getString("difference_feature").replace("\\n", "").replace(" ", ""));
+            }
+            obj.put("state_opinions", stateOpinions);
+            if (examinationOpinion.getString("issuance") != null) {
+                examinationOpinion.put("issuance", examinationOpinion.getString("issuance").replace(" ", ""));
+            }
+            if (examinationOpinion.getString("reason") != null) {
+                examinationOpinion.put("reason", examinationOpinion.getString("reason").replace(" ", ""));
+            }
+            examinationOpinion.put("publicNos", itemPublicNosStr);
+            obj.put("examination_opinion", examinationOpinion);
+            reviewFileList.add(obj);
+        }
+        map.put("review_files", reviewFileList);
+        JSONObject lastReviewFile = reviewFileList.get(reviewFileList.size() - 1);
+        JSONObject lastExaminationOpinion = lastReviewFile.getJSONObject("examination_opinion");
+        String lastReason = lastExaminationOpinion.getString("reason");
+        rejectionDecision.put("reason", lastReason);
+        map.put("rejection_decision", rejectionDecision);
+        map.put("publicNos", allPublicNos);
+        return map;
+    }
+
+    public void generateDoc(GenerateRejectionDTO generateRejectionDTO, Integer confessionSessionId, JSONObject object, List<JSONObject> publicNos) {
+        ConfessionSession confessionSession = confessionSessionService.getById(confessionSessionId);
+        String content = confessionSession.getContent();
+        Map<String, Object> map = new HashMap<>();
+
+        map = this.loadMap(generateRejectionDTO, object, publicNos);
+        ReportTemple reportTemplate = reportTempleService.getById(26);
+        String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
+        //更新会话
+        String name = DateUtils.dateTimeToStr(new Date(), "yyyyMMdd");
+
+        String finalName = name + "-" + generateRejectionDTO.getCaseVolume() + "-驳回指导函";
+        //生成文档
+        String fileGuid = null;
+        try {
+            fileGuid = this.generateFile(map, templateFilePath, finalName);
+            LambdaUpdateWrapper<AssoConfessionSessionFile> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(AssoConfessionSessionFile::getConfessionSessionId, confessionSessionId).isNull(AssoConfessionSessionFile::getType);
+            assoConfessionSessionFileService.remove(wrapper);
+            AssoConfessionSessionFile assoConfessionSessionFile = new AssoConfessionSessionFile();
+            assoConfessionSessionFile.setGuid(fileGuid);
+            assoConfessionSessionFile.setConfessionSessionId(confessionSessionId);
+            assoConfessionSessionFile.insert();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "生成驳回指导函失败");
+        }
+
+    }
+
+    public String generateFile(Map<String, Object> map, String templateFilePath, String name) throws Exception {
+        XWPFTemplate xwpfTemplate = xwpfTemplateService.getHtmlTemplate(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(Collections.singletonList(file));
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new XiaoShiException("保存记录失败");
+        }
+        return ids.get(0);
+    }
+
+    public List<JSONObject> getPubilcNos(JSONObject jsonObject) {
+        //去重
+        List<JSONObject> patentLists = new ArrayList<>();
+        List<JSONObject> jsonObjectList = jsonObject.getJSONArray("review_files");
+        for (JSONObject fileObject : jsonObjectList) {
+            JSONObject exObject = fileObject.getJSONObject("examination_opinion");
+            List<JSONObject> publicNoList = exObject.getJSONArray("publicNos");
+            List<String> patentNos = patentLists.stream().map(item -> item.getString("publicNo")).collect(Collectors.toList());
+            List<JSONObject> jsonObjects = publicNoList.stream().filter(item -> !patentNos.contains(item.getString("publicNo"))).collect(Collectors.toList());
+            if (jsonObjects != null && jsonObjects.size() > 0) {
+                patentLists.addAll(jsonObjects);
+            }
+
+        }
+        //装载
+        this.loadPatentList(patentLists);
+        return patentLists;
+    }
+
+    public void saveContent(ConfessionSession confessionSession, List<JSONObject> patentLists) {
+        Integer confessionSessionId = confessionSession.getId();
+        String content = confessionSession.getContent();
+        JSONObject contentObject = new JSONObject();
+        if (content != null && !content.trim().equals("")) {
+            contentObject = JSON.parseObject(content);
+        }
+        contentObject.put("contrast_files", patentLists);
+        String reJson = JSON.toJSONString(contentObject);
+        confessionSessionMapper.updateSingleField(confessionSessionId, "content", reJson);
+    }
+
+    public void loadPatentList(List<JSONObject> jsonObjects) {
+        for (JSONObject jsonObject : jsonObjects) {
+            String publicNo = jsonObject.getString("publicNo");
+            StarPatentVO starPatentVO = importSinglePatentService.getPatentFromWeb(publicNo);
+            jsonObject.put("title", starPatentVO.getTI());
+            jsonObject.put("type", "pdf");
+            String appNo = starPatentVO.getAN();
+            try {
+                List<String> guids = importSinglePatentService.getPDFFromWeb(starPatentVO);
+                if (guids.size() > 0) {
+                    String guid = guids.get(guids.size() - 1);
+                    jsonObject.put("guid", guid);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+
+    }
+}

+ 26 - 16
src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java

@@ -78,8 +78,9 @@ public class ImportSinglePatentService {
     private PatentNoUtil patentNoUtil;
     @Autowired
     private WebVOTransformService webVOTransformService;
-     @Autowired
-     private EsLegalEventService esLegalEventService;
+    @Autowired
+    private EsLegalEventService esLegalEventService;
+
     public StarPatentVO getPatentFromWeb(String patentNo) {
         StarPatentVO starPatentVO = null;
         String dbType = "";
@@ -271,8 +272,8 @@ public class ImportSinglePatentService {
 
     }
 
-    public void getPDFFromWeb(StarPatentVO starPatentVO) throws Exception {
-
+    public List<String> getPDFFromWeb(StarPatentVO starPatentVO) throws Exception {
+        List<String> guids = new ArrayList<>();
         String usedPatentNo;
         if (starPatentVO.getPN() != null && !starPatentVO.getPN().equals("")) {
             usedPatentNo = starPatentVO.getPN();
@@ -281,6 +282,8 @@ public class ImportSinglePatentService {
         }
 
         String pdfUrl = "", pdfUrl1 = "", pdfUrl2 = "";
+        String guid1 = null;
+        String guid2 = null;
         //先根据公开号判断国家,若没有公开号再根据申请号判断,调用"获得中国专利pdf"接口,获得1个或2个pdf的url地址
         if ((starPatentVO.getPN() != null && starPatentVO.getPN().contains("CN")) || (starPatentVO.getPN() == null && starPatentVO.getPatentNo().contains("CN")) || (starPatentVO.getGN() != null && starPatentVO.getGN().contains("CN"))) {
 
@@ -299,19 +302,19 @@ public class ImportSinglePatentService {
 
 
                     if (pdfUrl1.contains("0A_CN_0.pdf")) {
-                        String guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
+                        guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
                         File file1 = FileUtils.getFileByUrl(pdfUrl1);
                         fileManagerService.uploadFileWithGuid(file1, guid1);
-                        String guid2 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
+                        guid2 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
                         File file2 = FileUtils.getFileByUrl(pdfUrl2);
                         fileManagerService.uploadFileWithGuid(file2, guid2);
                     } else {
-                        String guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
+                        guid2 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
                         File file1 = FileUtils.getFileByUrl(pdfUrl1);
-                        fileManagerService.uploadFileWithGuid(file1, guid1);
-                        String guid2 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
+                        fileManagerService.uploadFileWithGuid(file1, guid2);
+                        guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
                         File file2 = FileUtils.getFileByUrl(pdfUrl2);
-                        fileManagerService.uploadFileWithGuid(file2, guid2);
+                        fileManagerService.uploadFileWithGuid(file2, guid1);
                     }
                 } else {  //若只有一个
                     if (pdfUrlStr.contains("?")) {
@@ -320,13 +323,13 @@ public class ImportSinglePatentService {
                         pdfUrl1 = pdfUrlStr.substring(pdfUrlStr.indexOf("http"));
                     }
                     if (pdfUrl1.contains("0A_CN_0.pdf")) {
-                        String guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
+                        guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 0);
                         File file1 = FileUtils.getFileByUrl(pdfUrl1);
                         fileManagerService.uploadFileWithGuid(file1, guid1);
                     } else {
-                        String guid1 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
+                        guid2 = FormatUtil.getPDFFormat(starPatentVO.getAN(), 1);
                         File file1 = FileUtils.getFileByUrl(pdfUrl1);
-                        fileManagerService.uploadFileWithGuid(file1, guid1);
+                        fileManagerService.uploadFileWithGuid(file1, guid2);
                     }
                 }
                 //根据专利号调用"获得世界专利pdf"接口,获得pdf的url地址
@@ -339,11 +342,18 @@ public class ImportSinglePatentService {
 //                        return;
 //                    }
             if (!pdfUrl.equals("")) {
-                String guid1 = FormatUtil.getPDFFormat(usedPatentNo, 0);
+                guid1 = FormatUtil.getPDFFormat(usedPatentNo, 0);
                 File file1 = FileUtils.getFileByUrl(pdfUrl);
                 fileManagerService.uploadFileWithGuid(file1, guid1);
             }
         }
+        if (guid1 != null) {
+            guids.add(guid1);
+        }
+        if (guid2 != null) {
+            guids.add(guid2);
+        }
+        return guids;
     }
 
     public void getPictureFromWeb(StarPatentVO starPatentVO) throws Exception {
@@ -397,8 +407,8 @@ public class ImportSinglePatentService {
         }
         //添加法律事务
         if (contents.contains(6)) {
-            esLegalEventService.addEsLegalEvent(patent,starPatentVO.getANO());
-                    }
+            esLegalEventService.addEsLegalEvent(patent, starPatentVO.getANO());
+        }
 
         //装载权利要求
         if (contents.contains(2) || contents.contains(3)) {

+ 2 - 2
src/main/resources/application-dev.yml

@@ -69,7 +69,7 @@ PASUrl: http://localhost:8879
 FMSUrl: http://192.168.2.24:8803
 WDUrl: http://1.116.113.26:81
 PythonUrl: http://192.168.2.24:8001
-FileDownloadUrl: http://192.168.2.24:8803/fileManager/downloadFile?fileId=
+FileDownloadUrl: http://192.168.2.24:8803/fileManager/downloadFile?fileId=074e6aba766847dda3122ddac596f5dc
 FileSource: 1
 ES:
   patentVector: patent_vector
@@ -97,5 +97,5 @@ DIFY:
   discoveryResultKey: app-G5gnZ4s7GlMEIft79fk7hUR7
   aiPatentResultKey: app-KLneZ6O7qXL2DjKm169ltxJI
   OAApiKey2: app-UTUV4s0TkGMBqHBEF3oqAbVp
-
+  generateRejectionKey: app-kiUsL8SVRavXwLMCGnJEelHr
   url: http://192.168.2.24/v1/

+ 1 - 1
src/main/resources/application-testNetIn.yml

@@ -69,7 +69,7 @@ PASUrl: http://localhost:8880
 FMSUrl: http://localhost:8803
 WDUrl: http://1.116.113.26:81
 PythonUrl: http://localhost:8001
-FileDownloadUrl: https://xsip.cn/api/fileManager/downloadFile?fileId=
+FileDownloadUrl: https://xsip.cn/api/fileManager/downloadFile?fileId=df80fea8079c428baa623ba9ac68846f
 FileSource: 6
 ES:
   patentVector: patent_vector

BIN
src/main/resources/file/reportTemple/rejection.docx


File diff suppressed because it is too large
+ 128 - 0
src/test/java/cn/cslg/pas/service/dify/GenerateRejectionServiceTests.java


+ 60 - 0
src/test/java/cn/cslg/pas/utils/HolidayUtilTests.java

@@ -0,0 +1,60 @@
+package cn.cslg.pas.utils;
+
+import cn.cslg.pas.common.utils.commonUtils.HoliDayUtils;
+import cn.cslg.pas.common.vo.CompareLiteratureVO;
+import cn.cslg.pas.service.business.CustomFieldService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class HolidayUtilTests {
+    @Autowired
+    private HoliDayUtils holiDayUtils;
+
+    @Test
+    public void tet1() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = null;
+        try {
+            date = sdf.parse("2025-10-11");
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        String re = null;
+        try {
+            re = holiDayUtils.isWorkingDay(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        System.out.println(re);
+    }
+
+    @Test
+    public void getWorkingDay() {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = null;
+        try {
+            date = sdf.parse("2025-10-1");
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        try {
+         date=   holiDayUtils.getWorkingDay(date);
+       String re=  sdf.format(date);
+         System.out.println(re);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+    }
+}