Browse Source

20251127 专利状态监控

lrj 2 weeks ago
parent
commit
819048f4aa
46 changed files with 1675 additions and 157 deletions
  1. 1 0
      src/main/java/cn/cslg/pas/common/dto/PatentDTO.java
  2. 2 1
      src/main/java/cn/cslg/pas/common/importTask/ProjectQuartzSetDTO.java
  3. 10 0
      src/main/java/cn/cslg/pas/common/model/common/CommonPerson.java
  4. 9 0
      src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentErrorVO.java
  5. 12 0
      src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentResultVO.java
  6. 13 0
      src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentSuccessVO.java
  7. 3 0
      src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java
  8. 2 1
      src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java
  9. 2 0
      src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorUpdateDTO.java
  10. 8 1
      src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java
  11. 1 0
      src/main/java/cn/cslg/pas/common/utils/DataUtils.java
  12. 54 25
      src/main/java/cn/cslg/pas/common/utils/DateUtils2.java
  13. 19 0
      src/main/java/cn/cslg/pas/common/utils/ParseByteToFileUtils.java
  14. 8 2
      src/main/java/cn/cslg/pas/common/utils/StringUtils.java
  15. 56 0
      src/main/java/cn/cslg/pas/common/utils/commonUtils/QuartzUtils.java
  16. 1 0
      src/main/java/cn/cslg/pas/common/vo/ChinaLeagalStatus.java
  17. 2 0
      src/main/java/cn/cslg/pas/common/vo/ProjectPersonVO.java
  18. 2 32
      src/main/java/cn/cslg/pas/controller/CommonController.java
  19. 13 0
      src/main/java/cn/cslg/pas/controller/ProjectShareController.java
  20. 91 0
      src/main/java/cn/cslg/pas/controller/common/QuartzController.java
  21. 28 5
      src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java
  22. 1 0
      src/main/java/cn/cslg/pas/domain/business/PatentProject.java
  23. 35 0
      src/main/java/cn/cslg/pas/domain/project/MailSendRecord.java
  24. 2 0
      src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitor.java
  25. 34 0
      src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitorRecord.java
  26. 18 0
      src/main/java/cn/cslg/pas/mapper/project/MailSendRecordMapper.java
  27. 18 0
      src/main/java/cn/cslg/pas/mapper/project/PatentStatusMonitorRecordMapper.java
  28. 18 0
      src/main/java/cn/cslg/pas/mapper/project/PatentStatusUpdateRecordMapper.java
  29. 61 0
      src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java
  30. 12 2
      src/main/java/cn/cslg/pas/service/business/PatentProjectService.java
  31. 20 2
      src/main/java/cn/cslg/pas/service/business/SystemDictService.java
  32. 31 1
      src/main/java/cn/cslg/pas/service/business/es/EsLegalEventService.java
  33. 6 4
      src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java
  34. 106 0
      src/main/java/cn/cslg/pas/service/business/es/EsService.java
  35. 20 11
      src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java
  36. 5 2
      src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java
  37. 21 0
      src/main/java/cn/cslg/pas/service/project/MailSendRecordService.java
  38. 98 0
      src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorRecordService.java
  39. 136 26
      src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java
  40. 25 0
      src/main/java/cn/cslg/pas/service/project/PatentStatusUpdateRecord.java
  41. 44 0
      src/main/java/cn/cslg/pas/service/project/PatentStatusUpdateRecordService.java
  42. 0 1
      src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentJobService.java
  43. 294 39
      src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentStatusJobService.java
  44. 261 0
      src/main/java/cn/cslg/pas/service/quartzService/SysPatentStatusNoticeJobService.java
  45. 1 1
      src/main/resources/application-dev.yml
  46. 71 1
      src/test/java/cn/cslg/pas/test/QuartzTaskTests.java

+ 1 - 0
src/main/java/cn/cslg/pas/common/dto/PatentDTO.java

@@ -15,4 +15,5 @@ public class PatentDTO {
     private Long pageSize;
 
     private List<PatentColumnDTO> patents;
+    private List<Patent> orgPatents;
 }

+ 2 - 1
src/main/java/cn/cslg/pas/common/importTask/ProjectQuartzSetDTO.java

@@ -4,7 +4,8 @@ import lombok.Data;
 
 @Data
 public class ProjectQuartzSetDTO {
-  private   Integer projectId;
+    private Integer projectId;
     private Boolean ifUpdate;
     private String updateCycle;
+    private String notifyCycle;
 }

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

@@ -0,0 +1,10 @@
+package cn.cslg.pas.common.model.common;
+
+import lombok.Data;
+
+@Data
+public class CommonPerson {
+    private String id;
+    private String email;
+    private String name;
+}

+ 9 - 0
src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentErrorVO.java

@@ -0,0 +1,9 @@
+package cn.cslg.pas.common.model.project.monitorPatent;
+
+import lombok.Data;
+
+@Data
+public class MonitorPatentErrorVO {
+    private String patentNo;
+    private String errorMessage;
+}

+ 12 - 0
src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentResultVO.java

@@ -0,0 +1,12 @@
+package cn.cslg.pas.common.model.project.monitorPatent;
+
+import cn.cslg.pas.common.vo.ChinaLeagalStatus;
+import cn.cslg.pas.domain.es.LegalEvent;
+import lombok.Data;
+
+@Data
+public class MonitorPatentResultVO {
+   private String simpleOrgStatus;
+   private LegalEvent orgStatus;
+   private ChinaLeagalStatus lastStatus;
+}

+ 13 - 0
src/main/java/cn/cslg/pas/common/model/project/monitorPatent/MonitorPatentSuccessVO.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.common.model.project.monitorPatent;
+
+import cn.cslg.pas.common.vo.ChinaLeagalStatus;
+import cn.cslg.pas.domain.es.LegalEvent;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MonitorPatentSuccessVO {
+    private String patentNo;
+    private List<MonitorPatentResultVO> monitorPatentResultVOList;
+}

+ 3 - 0
src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorAddDTO.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas.common.patentProject;
 
+import cn.cslg.pas.common.model.common.CommonPerson;
 import cn.cslg.pas.common.model.request.StringRequest;
 import lombok.Data;
 
@@ -21,5 +22,7 @@ public class PatentStatusMonitorAddDTO {
     private String notifyCycle;
 
     private List<Integer> targetSSs;
+    private List<CommonPerson> notifyPeople;
+    private String parameters;
 
 }

+ 2 - 1
src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorQueryDTO.java

@@ -9,6 +9,7 @@ public class PatentStatusMonitorQueryDTO {
 
     private Integer projectId;
     private Integer status;
-
+    private Long current;
+    private Long size;
 
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorUpdateDTO.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas.common.patentProject;
 
+import cn.cslg.pas.common.model.common.CommonPerson;
 import lombok.Data;
 
 import java.util.List;
@@ -10,5 +11,6 @@ public class PatentStatusMonitorUpdateDTO {
     private Integer id;
     private List<Integer> targetSSs;
     private String notifyCycle;
+    private List<CommonPerson> notifyPeople;
 
 }

+ 8 - 1
src/main/java/cn/cslg/pas/common/patentProject/PatentStatusMonitorVO.java

@@ -1,6 +1,8 @@
 package cn.cslg.pas.common.patentProject;
 
+import cn.cslg.pas.common.model.common.CommonPerson;
 import cn.cslg.pas.common.model.common.CommonVO;
+import cn.cslg.pas.common.model.request.StringRequest;
 import lombok.Data;
 
 import java.util.Date;
@@ -8,6 +10,7 @@ import java.util.List;
 
 @Data
 public class PatentStatusMonitorVO extends CommonVO {
+    private Integer id;
     private Integer projectId;
 
     private String searchQuery;
@@ -22,8 +25,12 @@ public class PatentStatusMonitorVO extends CommonVO {
 
     private String notifyCycle;
 
-    private List<Integer> targetSss;
+    private List<Integer> targetSSs;
 
     private Integer status;
     private Integer type;
+    private List<CommonPerson> notifyPeople;
+    private StringRequest stringRequest;
+    private String parameters;
+    private List<String> patentNos;
 }

+ 1 - 0
src/main/java/cn/cslg/pas/common/utils/DataUtils.java

@@ -340,4 +340,5 @@ public class DataUtils {
         // 编译正则模式并匹配整个输入字符串
         return Pattern.matches(regex, input);
     }
+
 }

+ 54 - 25
src/main/java/cn/cslg/pas/common/utils/DateUtils2.java

@@ -253,17 +253,17 @@ public class DateUtils2 {
         // 判断是否是这周的第一天
 
         // 判断是否是这个月的第一天
-        boolean  ifMeetMonth = today.getDayOfMonth() >=7;
+        boolean ifMeetMonth = today.getDayOfMonth() >= 7;
 
         // 找到当前月份的第一天
         // 检查这个第一天是否也是季度的第一天
         // 季度月份是1月、4月、7月、10月
         boolean ifQuarter = (today.getMonthValue() % 3 == 1);
-        boolean ifMeetQuarterDay = today.getDayOfMonth() <7;
+        boolean ifMeetQuarterDay = today.getDayOfMonth() >= 7;
         // 判断是否是季度的第一天
-        Boolean ifMeetQuarter = !(ifQuarter&&ifMeetQuarterDay);
+        Boolean ifMeetQuarter = !(ifQuarter && ifMeetQuarterDay);
         // 判断是否是这年的第一天
-        boolean ifMeetYear = today.getDayOfYear() >=7;
+        boolean ifMeetYear = today.getDayOfYear() >= 7;
         CheckDateConditionVO checkDateConditionVO = new CheckDateConditionVO();
         checkDateConditionVO.setIfMeetMonth(ifMeetMonth);
         checkDateConditionVO.setIfMeetYear(ifMeetYear);
@@ -272,47 +272,48 @@ public class DateUtils2 {
     }
 
 
-    public static List<String> getWeekRange (LocalDate localDate){
-        List<String> ranges =new ArrayList<>();
+    public static List<String> getWeekRange(LocalDate localDate) {
+        List<String> ranges = new ArrayList<>();
         LocalDate firstDayOfWeek = localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
         LocalDate lastDayOfWeek = firstDayOfWeek.plusDays(6);
-        java.time.format.DateTimeFormatter formatter =java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
+        java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
         // 使用formatter将LocalDate转换为字符串
         String formattedDate1 = firstDayOfWeek.format(formatter);
-        String formattedDate2 =lastDayOfWeek.format(formatter);
+        String formattedDate2 = lastDayOfWeek.format(formatter);
         ranges.add(formattedDate1);
         ranges.add(formattedDate2);
         return ranges;
     }
 
-    public static List<String> getWDWeekRange(LocalDate localDate){
-        List<String> ranges =new ArrayList<>();
+    public static List<String> getWDWeekRange(LocalDate localDate) {
+        List<String> ranges = new ArrayList<>();
         LocalDate firstDayOfWeek = localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
         LocalDate lastDayOfWeek = firstDayOfWeek.plusDays(6);
-        java.time.format.DateTimeFormatter formatter =java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
+        java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
         // 使用formatter将LocalDate转换为字符串
         String formattedDate1 = firstDayOfWeek.format(formatter);
-        String formattedDate2 =lastDayOfWeek.format(formatter);
+        String formattedDate2 = lastDayOfWeek.format(formatter);
         ranges.add(formattedDate1);
         ranges.add(formattedDate2);
         return ranges;
     }
-    public static List<String> getMonthRange(LocalDate localDate){
-        List<String> ranges =new ArrayList<>();
+
+    public static List<String> getMonthRange(LocalDate localDate) {
+        List<String> ranges = new ArrayList<>();
         LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
-        LocalDate lastDayOfMonth= localDate.with(TemporalAdjusters.lastDayOfMonth());
-        java.time.format.DateTimeFormatter formatter =java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
+        LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
+        java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
         // 使用formatter将LocalDate转换为字符串
         String formattedDate1 = firstDayOfMonth.format(formatter);
-        String formattedDate2 =lastDayOfMonth.format(formatter);
+        String formattedDate2 = lastDayOfMonth.format(formatter);
         ranges.add(formattedDate1);
         ranges.add(formattedDate2);
         return ranges;
     }
 
-    public static List<String> getQuartzRange(LocalDate localDate){
+    public static List<String> getQuartzRange(LocalDate localDate) {
 
-        List<String> ranges =new ArrayList<>();
+        List<String> ranges = new ArrayList<>();
         // 计算当前季度的起始月份
         int startMonth = (localDate.getMonthValue() - 1) / 3 * 3 + 1;
 
@@ -324,30 +325,58 @@ public class DateUtils2 {
 
         // 获取当前季度的最后一天
         LocalDate lastDayOfQuarter = LocalDate.of(localDate.getYear(), endMonth, 1).minusDays(1);
-        java.time.format.DateTimeFormatter formatter =java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
+        java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
         // 使用formatter将LocalDate转换为字符串
         String formattedDate1 = firstDayOfQuarter.format(formatter);
-        String formattedDate2 =lastDayOfQuarter.format(formatter);
+        String formattedDate2 = lastDayOfQuarter.format(formatter);
         ranges.add(formattedDate1);
         ranges.add(formattedDate2);
         return ranges;
     }
 
-    public static List<String> getYearRange(LocalDate localDate){
-        List<String> ranges =new ArrayList<>();
+    public static List<String> getYearRange(LocalDate localDate) {
+        List<String> ranges = new ArrayList<>();
 
         // 获取当前年的第一天(1月1日)
         LocalDate firstDayOfYear = LocalDate.of(localDate.getYear(), 1, 1);
 
         // 获取当前年的最后一天(12月31日)
         LocalDate lastDayOfYear = LocalDate.of(localDate.getYear(), 12, 31);
-        java.time.format.DateTimeFormatter formatter =java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
+        java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd");
         String formattedDate1 = firstDayOfYear.format(formatter);
-        String formattedDate2 =lastDayOfYear.format(formatter);
+        String formattedDate2 = lastDayOfYear.format(formatter);
         ranges.add(formattedDate1);
         ranges.add(formattedDate2);
         return ranges;
     }
 
+    public static CheckDateConditionVO checkNotifyDateCycle(LocalDate today) {
+        if (today == null) {
+            today = LocalDate.now();
+        }
+        // 假设我们以周一为一周的第一天
+        DayOfWeek firstDayOfWeek = DayOfWeek.SUNDAY;
+        // 判断是否是这周的第一天
+        boolean ifMeetWeek = today.getDayOfWeek() == firstDayOfWeek;
+        // 判断是否是这个月的第一天
+        boolean ifMeetMonth = today.getDayOfMonth() == 7;
+
+        // 找到当前月份的第一天
+        // 检查这个第一天是否也是季度的第一天
+        // 季度月份是1月、4月、7月、10月
+        boolean ifQuarter = (today.getMonthValue() % 3 == 1);
+        boolean ifMeetQuarterDay = today.getDayOfMonth() == 7;
+        // 判断是否是季度的第一天
+        Boolean ifMeetQuarter = ifQuarter && ifMeetQuarterDay;
+        // 判断是否是这年的第一天
+        boolean ifMeetYear = today.getDayOfYear() == 7;
+        CheckDateConditionVO checkDateConditionVO = new CheckDateConditionVO();
+        checkDateConditionVO.setIfMeetMonth(ifMeetMonth);
+        checkDateConditionVO.setIfMeetYear(ifMeetYear);
+        checkDateConditionVO.setIfMeetQuarter(ifMeetQuarter);
+        checkDateConditionVO.setIfMeetWeek(ifMeetWeek);
+        return checkDateConditionVO;
+    }
+
 
 }

+ 19 - 0
src/main/java/cn/cslg/pas/common/utils/ParseByteToFileUtils.java

@@ -53,4 +53,23 @@ public class ParseByteToFileUtils {
         }
         return fileGuid;
     }
+    public String uploadFile2(byte[] fileData, Integer type,String name) throws IOException {
+        List<MultipartFile> multipartFiles = new ArrayList<>();
+        //保存生成地址
+        String fileName = "";
+        if (type.equals(1)) {
+            fileName = name + ".xls";
+        } else if (type.equals(2)) {
+            fileName = name + ".pdf";
+        }
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        MultipartFile multipartFile = this.convertBytesToMultipartFile(fileData, fileName);
+        multipartFiles.add(multipartFile);
+        List<String> fileGuids = fileManagerService.uploadFileGetGuid(multipartFiles);
+        String fileGuid = null;
+        if (!fileGuids.isEmpty()) {
+            fileGuid = fileGuids.get(0);
+        }
+        return fileGuid;
+    }
 }

+ 8 - 2
src/main/java/cn/cslg/pas/common/utils/StringUtils.java

@@ -183,9 +183,10 @@ public class StringUtils {
      * @return
      */
     public static Boolean isEmpty(String s) {
-        if (s == null || s.length() <= 0) {
+        if (s == null || s.trim().equals("")) {
             return true;
         }
+
         return false;
     }
 
@@ -240,6 +241,9 @@ public class StringUtils {
      * @return
      */
     public static List<String> changeStringToString(String str, String code) {
+        if (str == null || str.trim().equals("")) {
+            return new ArrayList<>();
+        }
         String[] split = split(str, code);
         List<String> lnums = new ArrayList<>();
         for (String s : split) {
@@ -427,6 +431,7 @@ public class StringUtils {
 
     /**
      * 判断是不是整数数字
+     *
      * @param s
      * @return
      */
@@ -439,6 +444,7 @@ public class StringUtils {
 
     /**
      * 判断是不是正整数数字
+     *
      * @param s
      * @return
      */
@@ -528,7 +534,7 @@ public class StringUtils {
     }
 
 
-    public static List<String> splitChineseText(String text,Integer textNum) {
+    public static List<String> splitChineseText(String text, Integer textNum) {
         List<String> chunks = new ArrayList<>();
         int start = 0;
         int textLength = text.length();

+ 56 - 0
src/main/java/cn/cslg/pas/common/utils/commonUtils/QuartzUtils.java

@@ -0,0 +1,56 @@
+package cn.cslg.pas.common.utils.commonUtils;
+
+import cn.cslg.pas.common.core.base.Cycle;
+import cn.cslg.pas.common.utils.DateUtils2;
+import cn.cslg.pas.common.utils.utilVO.CheckDateConditionVO;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class QuartzUtils {
+    public static List<String> getCnCycles() {
+        CheckDateConditionVO checkDateConditionVO = DateUtils2.checkDateCycleCondition(null);
+        Boolean ifMeetMonth = checkDateConditionVO.getIfMeetMonth();
+        Boolean ifMeetQuarter = checkDateConditionVO.getIfMeetQuarter();
+        Boolean ifMeetYear = checkDateConditionVO.getIfMeetYear();
+        List<String> cycles = new ArrayList<>();
+        cycles.add(Cycle.WEEK);
+
+        if (ifMeetMonth != null && ifMeetMonth) {
+            cycles.add(Cycle.MONTH);
+        }
+        if (ifMeetQuarter != null && ifMeetQuarter) {
+            cycles.add(Cycle.QUARTER);
+        }
+        if (ifMeetYear != null && ifMeetYear) {
+            cycles.add(Cycle.YEAR);
+        }
+        return cycles;
+
+    }
+    public static List<String> getNotifyCnCycles(LocalDate localDate) {
+
+        CheckDateConditionVO checkDateConditionVO = DateUtils2.checkNotifyDateCycle(localDate);
+        Boolean ifMeetMonth = checkDateConditionVO.getIfMeetMonth();
+        Boolean ifMeetQuarter = checkDateConditionVO.getIfMeetQuarter();
+        Boolean ifMeetYear = checkDateConditionVO.getIfMeetYear();
+        Boolean ifMeetWeek=checkDateConditionVO.getIfMeetWeek();
+        List<String> cycles = new ArrayList<>();
+        if(ifMeetWeek!=null&&ifMeetWeek){
+            cycles.add(Cycle.WEEK);
+        }
+
+        if (ifMeetMonth != null && ifMeetMonth) {
+            cycles.add(Cycle.MONTH);
+        }
+        if (ifMeetQuarter != null && ifMeetQuarter) {
+            cycles.add(Cycle.QUARTER);
+        }
+        if (ifMeetYear != null && ifMeetYear) {
+            cycles.add(Cycle.YEAR);
+        }
+        return cycles;
+
+    }
+}

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

@@ -176,4 +176,5 @@ public class ChinaLeagalStatus implements Serializable {
      */
     private String DETAIL;
 
+    private String SimpleStatus;
 }

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/ProjectPersonVO.java

@@ -31,4 +31,6 @@ public class ProjectPersonVO {
      * 创建时间
      */
     private Date createTime;
+
+    private String email;
 }

+ 2 - 32
src/main/java/cn/cslg/pas/controller/CommonController.java

@@ -148,22 +148,7 @@ public class CommonController {
     }
 
 
-    @PostMapping("addSysCycleJob")
-    @Operation(summary = "获得检索栏位")
-    public Response addSysCycleJob(@RequestBody QrtzTaskDTO qrtzTaskDTO) throws Exception {
-
-//        QuartzVO quartzVO = new QuartzVO();
-//        quartzVO.setJobName("sys_cycle_job");
-//        quartzVO.setJobGroupName("sys_cycle_job_group");
-//        quartzVO.setTriggerGroupName("sys_cycle_trigger_group");
-//        quartzVO.setTriggerName("sys_cycle_trigger");
-//        qrtzTaskDTO.setQuartzVO(quartzVO);
-//        qrtzTaskDTO.setJobClass("cn.cslg.pas.service.quartzService.SysImportPatentJobService");
-//        qrtzTaskDTO.setCron("0 0 0 * * ? *");
-//     qrtzTaskDTO.setCron("0/10 * * * * ?");
-        jobService.addJob(qrtzTaskDTO);
-        return Response.success("");
-    }
+
 
     @GetMapping("addAiUseRecord")
     @Operation(summary = "添加ai使用记录")
@@ -172,21 +157,6 @@ public class CommonController {
         return Response.success("");
     }
 
-    @PostMapping("deleteSysCycleJob")
-    @Operation(summary = "获得检索栏位")
-    public Response deleteSysCycleJob(@RequestBody QuartzVO quartzVO) throws Exception {
-
-//        QuartzVO quartzVO = new QuartzVO();
-//        quartzVO.setJobName("sys_cycle_job");
-//        quartzVO.setJobGroupName("sys_cycle_job_group");
-//        quartzVO.setTriggerGroupName("sys_cycle_trigger_group");
-//        quartzVO.setTriggerName("sys_cycle_trigger");
-//        qrtzTaskDTO.setQuartzVO(quartzVO);
-//        qrtzTaskDTO.setJobClass("cn.cslg.pas.service.quartzService.SysImportPatentJobService");
-//        qrtzTaskDTO.setCron("0 0 0 * * ? *");
-//     qrtzTaskDTO.setCron("0/10 * * * * ?");
-        jobService.deleteJob(quartzVO);
-        return Response.success("");
-    }
+
 
 }

+ 13 - 0
src/main/java/cn/cslg/pas/controller/ProjectShareController.java

@@ -7,6 +7,7 @@ import cn.cslg.pas.common.dto.business.AvoidDesignInsertDTO;
 import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.vo.ProjectPersonVO;
 import cn.cslg.pas.common.vo.business.AvoidDesignWholeVO;
 import cn.cslg.pas.exception.ConditionException;
 import cn.cslg.pas.exception.UnLoginException;
@@ -104,4 +105,16 @@ private ProjectService projectService;
 
         return Response.success(records);
     }
+
+
+    @Operation(summary = "查询专题库相关人员")
+    @PostMapping("/queryRelatedPerson")
+    public Response queryRelatedPerson(@RequestBody QueryProjectPersonDTO queryProjectPersonDTO) throws Exception {
+
+        List<Map<String,Object>> projectPersonVOS = assoProjectPersonService.queryRelatedPerson(queryProjectPersonDTO);
+
+
+        return Response.success(projectPersonVOS);
+    }
+
 }

+ 91 - 0
src/main/java/cn/cslg/pas/controller/common/QuartzController.java

@@ -0,0 +1,91 @@
+package cn.cslg.pas.controller.common;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.service.common.DifyService;
+import cn.cslg.pas.service.dify.ConfessionSessionService;
+import cn.cslg.pas.service.dify.DifyTempleExportService;
+import cn.cslg.pas.service.quartzService.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+
+@SuppressWarnings({"all"})
+@Tag(name = "外部人员调用接口")
+@RestController
+@RequestMapping(Constants.API_XiaoSHI + "/quartz")
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+
+public class QuartzController {
+    private final DifyService difyService;
+    private final ConfessionSessionService confessionSessionService;
+    @Autowired
+    private CacheUtils cacheUtils;
+    @Autowired
+    private LoginUtils loginUtils;
+    private final DifyTempleExportService difyTempleExportService;
+    private final SysImportPatentStatusJobService sysImportPatentStatusJobService;
+    private final SysPatentStatusNoticeJobService sysPatentStatusNoticeJobService;
+    private final JobService jobService;
+
+    //
+    @GetMapping("/monitorStatus")
+    @Operation(summary = "监控法律状态")
+    public Response monitorStatus() throws Exception {
+
+        sysImportPatentStatusJobService.monitorPatentStatus();
+        return Response.success("");
+    }
+
+    @GetMapping("/notifyStatus")
+    @Operation(summary = "法律状态通知")
+    public Response notifyPatentStatus() throws Exception {
+
+        sysPatentStatusNoticeJobService.notifyPatentStatus();
+        return Response.success("");
+    }
+
+    @PostMapping("addSysCycleJob")
+    @Operation(summary = "获得检索栏位")
+    public Response addSysCycleJob(@RequestBody QrtzTaskDTO qrtzTaskDTO) throws Exception {
+
+//        QuartzVO quartzVO = new QuartzVO();
+//        quartzVO.setJobName("sys_cycle_job");
+//        quartzVO.setJobGroupName("sys_cycle_job_group");
+//        quartzVO.setTriggerGroupName("sys_cycle_trigger_group");
+//        quartzVO.setTriggerName("sys_cycle_trigger");
+//        qrtzTaskDTO.setQuartzVO(quartzVO);
+//        qrtzTaskDTO.setJobClass("cn.cslg.pas.service.quartzService.SysImportPatentJobService");
+//        qrtzTaskDTO.setCron("0 0 0 * * ? *");
+//     qrtzTaskDTO.setCron("0/10 * * * * ?");
+        jobService.addJob(qrtzTaskDTO);
+        return Response.success("");
+    }
+
+
+    @PostMapping("deleteSysCycleJob")
+    @Operation(summary = "获得检索栏位")
+    public Response deleteSysCycleJob(@RequestBody QuartzVO quartzVO) throws Exception {
+
+//        QuartzVO quartzVO = new QuartzVO();
+//        quartzVO.setJobName("sys_cycle_job");
+//        quartzVO.setJobGroupName("sys_cycle_job_group");
+//        quartzVO.setTriggerGroupName("sys_cycle_trigger_group");
+//        quartzVO.setTriggerName("sys_cycle_trigger");
+//        qrtzTaskDTO.setQuartzVO(quartzVO);
+//        qrtzTaskDTO.setJobClass("cn.cslg.pas.service.quartzService.SysImportPatentJobService");
+//        qrtzTaskDTO.setCron("0 0 0 * * ? *");
+//     qrtzTaskDTO.setCron("0/10 * * * * ?");
+        jobService.deleteJob(quartzVO);
+        return Response.success("");
+    }
+}

+ 28 - 5
src/main/java/cn/cslg/pas/controller/project/PatentStatusMonitorController.java

@@ -2,10 +2,15 @@ package cn.cslg.pas.controller.project;
 
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.dto.TranslateDTO;
+import cn.cslg.pas.common.importTask.ProjectQuartzQueryDTO;
+import cn.cslg.pas.common.importTask.ProjectQuartzSetDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.patentProject.*;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.vo.TranslateVO;
+import cn.cslg.pas.domain.business.PatentProject;
 import cn.cslg.pas.domain.project.PatentStatusMonitor;
+import cn.cslg.pas.service.business.PatentProjectService;
 import cn.cslg.pas.service.common.TranslateService;
 import cn.cslg.pas.service.project.PatentStatusMonitorService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -25,13 +30,14 @@ import java.util.List;
 public class PatentStatusMonitorController {
     @Autowired
     private PatentStatusMonitorService patentStatusMonitorService;
-
+    @Autowired
+    private PatentProjectService patentProjectService;
 
     @Operation(summary = "添加专利状态监控任务")
     @PostMapping("/add")
     public Response add(@RequestBody PatentStatusMonitorAddDTO patentStatusMonitorAddDTO) throws Exception {
 
-            Integer id  = patentStatusMonitorService.add(patentStatusMonitorAddDTO);
+        Integer id = patentStatusMonitorService.add(patentStatusMonitorAddDTO);
 
         return Response.success(id);
     }
@@ -39,19 +45,36 @@ public class PatentStatusMonitorController {
     @Operation(summary = "查询专利状态监控任务")
     @PostMapping("/query")
     public Response query(@RequestBody PatentStatusMonitorQueryDTO patentStatusMonitorQueryDTO) throws Exception {
-        List<PatentStatusMonitorVO> patentStatusMonitorVOList = patentStatusMonitorService.query(patentStatusMonitorQueryDTO);
-        return Response.success(patentStatusMonitorVOList);
+       Records records = patentStatusMonitorService.query(patentStatusMonitorQueryDTO);
+        return Response.success(records);
     }
+
     @Operation(summary = "更新专利状态监控任务")
     @PostMapping("/update")
     public Response update(@RequestBody PatentStatusMonitorUpdateDTO patentStatusMonitorUpdateDTO) throws Exception {
-        Integer id= patentStatusMonitorService.updateMonitor(patentStatusMonitorUpdateDTO);
+        Integer id = patentStatusMonitorService.updateMonitor(patentStatusMonitorUpdateDTO);
         return Response.success(id);
     }
+
     @Operation(summary = "删除专利状态监控任务")
     @PostMapping("/delete")
     public Response delete(@RequestBody PatentStatusMonitorDeleteDTO patentStatusMonitorDeleteDTO) throws Exception {
         List<Integer> ids = patentStatusMonitorService.deleteMonitor(patentStatusMonitorDeleteDTO);
         return Response.success(ids);
     }
+
+
+        @Operation(summary = "设置定时更新周期")
+    @PostMapping("/updateNotifyCycle")
+    public Response updateNotifyCycle(@RequestBody ProjectQuartzSetDTO projectQuartzSetDTO) throws Exception {
+      PatentProject patentProject=  patentStatusMonitorService.setProjectNotifyCycle(projectQuartzSetDTO);
+        return  Response.success(patentProject.getProjectId());
+    }
+//
+    @Operation(summary = "查询更新周期")
+    @PostMapping("/queryNotifyCycle")
+    public Response queryNotifyCycle(@RequestBody ProjectQuartzQueryDTO projectQuartzDTO) throws Exception {
+        PatentProject patentProject = patentProjectService.queryProjectQuartz(projectQuartzDTO);
+        return Response.success(patentProject);
+    }
 }

+ 1 - 0
src/main/java/cn/cslg/pas/domain/business/PatentProject.java

@@ -39,4 +39,5 @@ public class PatentProject extends BaseEntity<PatentProject> {
     private Integer status;
 
     private String updateCycle;
+    private String notifyCycle;
 }

+ 35 - 0
src/main/java/cn/cslg/pas/domain/project/MailSendRecord.java

@@ -0,0 +1,35 @@
+package cn.cslg.pas.domain.project;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+/**
+ * @TableName mail_send_record
+ */
+@TableName(value = "mail_send_record")
+@Data
+public class MailSendRecord extends BaseEntity<MailSendRecord> {
+    //0专利状态监控通知
+    private Integer type;
+
+    private Integer projectId;
+
+    private String sendContent;
+
+    private String sendTo;
+
+    private String createId;
+
+    private Date createTime;
+    //发送方式 0邮件通知
+    private Integer sendWay;
+    private Integer fromId;
+}

+ 2 - 0
src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitor.java

@@ -42,5 +42,7 @@ public class PatentStatusMonitor extends BaseEntity<AssoComLiteratureFile> {
     private String patentList;
     //0专利号监控,1检索式监控
     private Integer type;
+    private String notifyPeople;
+    private String parameters;
 
 }

+ 34 - 0
src/main/java/cn/cslg/pas/domain/project/PatentStatusMonitorRecord.java

@@ -0,0 +1,34 @@
+package cn.cslg.pas.domain.project;
+
+import cn.cslg.pas.domain.BaseEntity;
+import cn.cslg.pas.domain.report.AssoComLiteratureFile;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+
+/**
+ * @TableName patent_status_monitor_record
+ */
+@TableName(value = "patent_status_monitor_record")
+@Data
+public class PatentStatusMonitorRecord extends BaseEntity<PatentStatusMonitorRecord> {
+
+    private Integer patentStatusMonitorId;
+
+    private String monitorPatents;
+
+    private String monitorErrorPatents;
+
+    private Integer projectId;
+
+    private Date createTime;
+
+    private Integer doneNumber;
+    private Integer status;
+}

+ 18 - 0
src/main/java/cn/cslg/pas/mapper/project/MailSendRecordMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.mapper.project;
+
+import cn.cslg.pas.domain.project.MailSendRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【mail_send_record(信息通知记录表)】的数据库操作Mapper
+* @createDate 2025-11-21 10:56:23
+* @Entity cn.cslg.pas.domain.novelty.domain.MailSendRecord
+*/
+public interface MailSendRecordMapper extends BaseMapper<MailSendRecord> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/cn/cslg/pas/mapper/project/PatentStatusMonitorRecordMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.mapper.project;
+
+import cn.cslg.pas.domain.project.PatentStatusMonitorRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【patent_status_monitor_record】的数据库操作Mapper
+* @createDate 2025-11-21 10:20:09
+* @Entity cn.cslg.pas.domain.novelty.domain.PatentStatusMonitorRecord
+*/
+public interface PatentStatusMonitorRecordMapper extends BaseMapper<PatentStatusMonitorRecord> {
+
+}
+
+
+
+

+ 18 - 0
src/main/java/cn/cslg/pas/mapper/project/PatentStatusUpdateRecordMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.mapper.project;
+
+import cn.cslg.pas.service.project.PatentStatusUpdateRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【patent_status_update_record(专利状态更新记录)】的数据库操作Mapper
+* @createDate 2025-11-21 11:32:15
+* @Entity cn.cslg.pas.domain.novelty.domain.PatentStatusUpdateRecord
+*/
+public interface PatentStatusUpdateRecordMapper extends BaseMapper<PatentStatusUpdateRecord> {
+
+}
+
+
+
+

+ 61 - 0
src/main/java/cn/cslg/pas/service/business/AssoProjectPersonService.java

@@ -6,6 +6,8 @@ import cn.cslg.pas.common.model.cronModel.Personnel;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.DataUtils;
+import cn.cslg.pas.common.utils.DateUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.vo.ProjectPersonVO;
 import cn.cslg.pas.domain.business.AssoProductPerson;
@@ -14,6 +16,7 @@ import cn.cslg.pas.domain.business.Project;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.AssoProductPersonMapper;
 import cn.cslg.pas.mapper.AssoProjectPersonMapper;
+import cn.cslg.pas.mapper.PatentProjectMapper;
 import cn.cslg.pas.service.permissions.PermissionService;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -27,7 +30,9 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -163,6 +168,7 @@ public class AssoProjectPersonService extends ServiceImpl<AssoProjectPersonMappe
             BeanUtils.copyProperties(assoProjectPerson, projectPersonVO);
             if (personnel1 != null) {
                 projectPersonVO.setPersonName(personnel1.getPersonnelName());
+                projectPersonVO.setEmail(personnel1.getPersonnelEmail());
             }
             if (personnel2 != null) {
                 projectPersonVO.setCreateName(personnel2.getPersonnelName());
@@ -275,4 +281,59 @@ public class AssoProjectPersonService extends ServiceImpl<AssoProjectPersonMappe
         }
 
     }
+
+
+    /**
+     * 查询分享记录
+     *
+     * @param queryProjectPersonDTO
+     * @return
+     */
+    public List<Map<String, Object>> queryRelatedPerson(QueryProjectPersonDTO queryProjectPersonDTO) {
+        Integer projectId = queryProjectPersonDTO.getProjectId();
+        LambdaQueryWrapper<AssoProjectPerson> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoProjectPerson::getProjectId, projectId);
+        List<String> ids = new ArrayList<>();
+
+        List<AssoProjectPerson> assoProjectPersonList = this.list(queryWrapper);
+         assoProjectPersonList= assoProjectPersonList.stream()
+                .filter(DataUtils.distinctByKey(AssoProjectPerson::getPersonId))
+                .collect(Collectors.toList());
+        Project project = projectService.getById(projectId);
+        String createId = project.getCreateId();
+        String headId = project.getHeadId();
+        AssoProjectPerson assoProjectPerson = assoProjectPersonList.stream().filter(item -> item.getPersonId().equals(createId)).findFirst().orElse(null);
+        if (assoProjectPerson == null) {
+            assoProjectPerson = new AssoProjectPerson();
+            assoProjectPerson.setProjectId(projectId);
+            assoProjectPerson.setPersonId(createId);
+            assoProjectPerson.setRole(0);
+            assoProjectPersonList.add(assoProjectPerson);
+        } else {
+            assoProjectPerson.setRole(0);
+        }
+        AssoProjectPerson assoProjectPerson2 = assoProjectPersonList.stream().filter(item -> item.getPersonId().equals(headId)).findFirst().orElse(null);
+        if (assoProjectPerson2 == null) {
+            assoProjectPerson2 = new AssoProjectPerson();
+            assoProjectPerson2.setProjectId(projectId);
+            assoProjectPerson2.setPersonId(createId);
+            assoProjectPerson2.setRole(1);
+            assoProjectPersonList.add(assoProjectPerson2);
+        } else {
+            if (assoProjectPerson2.getRole() > 1) {
+                assoProjectPerson2.setRole(1);
+            }
+
+        }
+        List<ProjectPersonVO> projectPersonVOS = this.loadData(assoProjectPersonList);
+        List<Map<String, Object>> lists = new ArrayList<>();
+        for (ProjectPersonVO projectPersonVO : projectPersonVOS) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", projectPersonVO.getPersonId());
+            map.put("name", projectPersonVO.getPersonName());
+            map.put("email", projectPersonVO.getEmail());
+            lists.add(map);
+        }
+        return lists;
+    }
 }

+ 12 - 2
src/main/java/cn/cslg/pas/service/business/PatentProjectService.java

@@ -29,6 +29,7 @@ import cn.cslg.pas.mapper.PatentProjectMapper;
 import cn.cslg.pas.service.business.es.EsCustomFieldService;
 import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.permissions.PermissionService;
+import cn.cslg.pas.service.project.PatentStatusMonitorService;
 import cn.cslg.pas.service.quartzService.JobService;
 import cn.cslg.pas.service.quartzService.QrtzTaskDTO;
 import cn.cslg.pas.service.quartzService.QuartzVO;
@@ -110,8 +111,7 @@ public class PatentProjectService extends ServiceImpl<PatentProjectMapper, Paten
     @Autowired
     private AssoProjectScenarioService assoProjectScenarioService;
 
-    @Autowired
-    private JobService jobService;
+
 
 
     @Override
@@ -993,10 +993,12 @@ public class PatentProjectService extends ServiceImpl<PatentProjectMapper, Paten
         Integer projectId = projectQuartzSetDTO.getProjectId();
         String updateCycle = projectQuartzSetDTO.getUpdateCycle();
         Boolean ifUpdate = projectQuartzSetDTO.getIfUpdate();
+        String notifyCycle = projectQuartzSetDTO.getNotifyCycle();
         PatentProject project = new PatentProject();
         project.setProjectId(projectId);
         project.setIfUpdate(projectQuartzSetDTO.getIfUpdate());
         project.setUpdateCycle(updateCycle);
+        project.setNotifyCycle(notifyCycle);
         if (ifUpdate != null && ifUpdate) {
             String crons = CronUtil.getCron(updateCycle);
             if (crons == null) {
@@ -1057,4 +1059,12 @@ public class PatentProjectService extends ServiceImpl<PatentProjectMapper, Paten
         return patentProject;
     }
 
+
+
+    public PatentProject getByProjectId(Integer projectId) {
+        LambdaQueryWrapper<PatentProject> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PatentProject::getProjectId, projectId);
+        PatentProject patentProject = this.getOne(queryWrapper, false);
+        return patentProject;
+    }
 }

+ 20 - 2
src/main/java/cn/cslg/pas/service/business/SystemDictService.java

@@ -31,8 +31,8 @@ public class SystemDictService extends ServiceImpl<SystemDictMapper, SystemDict>
             queryWrapper.in(SystemDict::getType, types);
         }
         List<SystemDict> systemDictList = this.list(queryWrapper);
-        types =systemDictList.stream().map(SystemDict::getType).collect(Collectors.toList());
-        types =types.stream().distinct().collect(Collectors.toList());
+        types = systemDictList.stream().map(SystemDict::getType).collect(Collectors.toList());
+        types = types.stream().distinct().collect(Collectors.toList());
         Set set = new HashSet();
         set.addAll(systemDictList);
         types.forEach(item -> {
@@ -114,4 +114,22 @@ public class SystemDictService extends ServiceImpl<SystemDictMapper, SystemDict>
         List<SystemDict> systemDictList = this.list(queryWrapper);
         return systemDictList;
     }
+
+    public List<SystemDict> getSystemDictByTypeAndValue(String type, List<String> values) {
+        LambdaQueryWrapper<SystemDict> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SystemDict::getType, type);
+        if (values != null) {
+            queryWrapper.in(SystemDict::getValue, values);
+        }
+        List<SystemDict> systemDictList = this.list(queryWrapper);
+        return systemDictList;
+    }
+
+    public List<SystemDict> getSystemDictByTypeAndSimpleLabel(String type, List<String> labels) {
+        LambdaQueryWrapper<SystemDict> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SystemDict::getType, type)
+                .in(SystemDict::getSimpleLabel, labels);
+        List<SystemDict> systemDictList = this.list(queryWrapper);
+        return systemDictList;
+    }
 }

+ 31 - 1
src/main/java/cn/cslg/pas/service/business/es/EsLegalEventService.java

@@ -11,6 +11,7 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import co.elastic.clients.elasticsearch._types.*;
 import co.elastic.clients.elasticsearch._types.query_dsl.Query;
 import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch._types.query_dsl.TermsQueryField;
 import co.elastic.clients.elasticsearch.core.*;
 import co.elastic.clients.elasticsearch.core.search.Hit;
 import com.alibaba.fastjson.JSON;
@@ -113,7 +114,7 @@ public class EsLegalEventService {
 
             } catch (Exception e) {
                 e.printStackTrace();
-                throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR,"删除事务错误");
+                throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "删除事务错误");
             }
             List<ChinaLeagalStatus> chinaLeagalStatuses = JSON.parseArray(cnLegalApiStr, ChinaLeagalStatus.class);
             chinaLeagalStatuses.forEach(item -> {
@@ -156,4 +157,33 @@ public class EsLegalEventService {
             return -1;
         }
     }
+
+    public Integer deleteByPatentNo(String patentNo, List<String> codes) throws IOException {
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("legal_event");
+
+        Query q1 = QueryBuilders.term(t -> t.field("app_no").value(patentNo));
+        //公开号
+        Query q2 = QueryBuilders.term(t -> t.field("public_no").value(patentNo));
+        //授权号
+        Query q3 = QueryBuilders.term(t -> t.field("grant_no").value(patentNo));
+        List<FieldValue> fieldValues = new ArrayList<>();
+
+        codes.forEach(item -> {
+            fieldValues.add(FieldValue.of(item));
+        });
+        Query q4 = QueryBuilders.terms(i -> i.field("code").terms(new TermsQueryField.Builder().value(fieldValues).build()));
+        Query query = QueryBuilders.bool(i -> i.should(q1, q2, q3));
+        Query query1 = QueryBuilders.bool(i -> i.must(query, q4));
+        DeleteByQueryRequest request = DeleteByQueryRequest.of(i -> i.index("legal_event").refresh(true).query(query1));
+        try {
+            client.deleteByQuery(request);
+            return 1;
+        } catch (IOException e) {
+            return -1;
+        }
+    }
+
+
 }

+ 6 - 4
src/main/java/cn/cslg/pas/service/business/es/EsPatentService.java

@@ -56,6 +56,7 @@ import com.alibaba.fastjson2.JSONObject;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.javassist.runtime.Desc;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -165,6 +166,7 @@ public class EsPatentService {
                 events.add(event);
             }
         }
+        events = events.stream().sorted(Comparator.comparing(LegalEvent::getEventDate).reversed()).collect(Collectors.toList());
         return events;
     }
 
@@ -1092,6 +1094,7 @@ public class EsPatentService {
         dto.setPageSize(size);
         return dto;
     }
+
     public Integer removeByNo(String no) {
         Query query = QueryBuilders.term(t -> t.field("patent_no.keyword").value(no));
 
@@ -1106,9 +1109,8 @@ public class EsPatentService {
     }
 
 
-
     //获取合并申请人
-    public  List<PatentMergePerson> getMergeApp2(Integer projectId, String id) throws IOException {
+    public List<PatentMergePerson> getMergeApp2(Integer projectId, String id) throws IOException {
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");
@@ -1139,7 +1141,7 @@ public class EsPatentService {
     }
 
     //获取合并权利人
-    public  List<PatentMergePerson> getMergeRight2(Integer projectId, String id) throws IOException {
+    public List<PatentMergePerson> getMergeRight2(Integer projectId, String id) throws IOException {
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");
@@ -1170,7 +1172,7 @@ public class EsPatentService {
     }
 
     //获取合并发明人
-    public  List<PatentMergePerson> getMergeInventor2(Integer projectId, String id) throws IOException {
+    public List<PatentMergePerson> getMergeInventor2(Integer projectId, String id) throws IOException {
         SearchRequest.Builder builder = new SearchRequest.Builder();
         //设置查询索引
         builder.index("patent");

+ 106 - 0
src/main/java/cn/cslg/pas/service/business/es/EsService.java

@@ -1666,6 +1666,112 @@ public class EsService {
         }
         return response.hits().total().value();
     }
+
+    /**
+     * 检索条件转换
+     *
+     * @param queryRequest 检索条件
+     * @return
+     */
+    public EsPatentCommonVO getEsPatentCommonVOFromRequest(QueryRequest queryRequest) throws Exception {
+        //this.judgeQueryPatentRoot(queryRequest);
+        PatentDTO dto = new PatentDTO();
+        Integer taskId = queryRequest.getTaskId();
+        String searchCondition = "";
+        Integer projectId = queryRequest.getProjectId();
+        Integer productId = queryRequest.getProductId();
+        String productFrom = queryRequest.getFrom();
+        Long current = queryRequest.getCurrent();
+        Long size = queryRequest.getSize();
+        String groupField = queryRequest.getGroupField();
+        Long startNumber = queryRequest.getStartNumber();
+        Long endNumber = queryRequest.getEndNumber();
+        //判断表达式
+        if (queryRequest instanceof StringRequest) {
+            searchCondition = ((StringRequest) queryRequest).getSearchQuery();
+            if (searchCondition == null) {
+                searchCondition = "";
+            }
+        } else if (queryRequest instanceof MapRequest) {
+            Map<String, Object> map = ((MapRequest) queryRequest).getSearchQuery();
+            StringBuilder stringBuilder = new StringBuilder();
+            for (String key : map.keySet()) {
+                Object value = map.get(key);
+                if (!"".contentEquals(stringBuilder)) {
+                    stringBuilder = stringBuilder.append(" AND ").append(key).append("=").append(value);
+                } else {
+                    stringBuilder = stringBuilder.append(key).append("=").append(value);
+                }
+            }
+            searchCondition = stringBuilder.toString();
+        }
+        //判断同族分组
+        String esField = "";
+        if (StringUtils.isNotEmpty(groupField) && !groupField.equals("0")) {
+            esField = this.getGroupField(groupField);
+        }
+        EsPatentCommonVO commonVO = new EsPatentCommonVO();
+        commonVO.setTaskId(taskId);
+        commonVO.setProjectId(projectId);
+        commonVO.setProductId(productId);
+        if (StringUtils.isNotEmpty(searchCondition) && searchCondition.contains("罒")) {
+            String replace = searchCondition.replace("罒", " OR ");
+            commonVO.setSearchCondition(replace);
+        } else {
+            commonVO.setSearchCondition(searchCondition);
+        }
+        commonVO.setProductFrom(productFrom);
+        commonVO.setCurrent(current);
+        commonVO.setSize(size);
+        commonVO.setEsField(esField);
+        commonVO.setCustomFields(queryRequest.getCustomFields());
+        commonVO.setOrderDTOList(queryRequest.getOrderDTOList());
+        commonVO.setSemanteme(queryRequest.getSemanteme());
+        commonVO.setStartNum(startNumber);
+        commonVO.setEndNum(endNumber);
+        return commonVO;
+    }
+
+
+    public PatentDTO esSearch2(QueryRequest queryRequest) throws Exception {
+        PatentDTO dto = new PatentDTO();
+        EsPatentCommonVO esPatentCommonVO = this.getEsPatentCommonVOFromRequest(queryRequest);
+        String esField = esPatentCommonVO.getEsField();
+        Long current = esPatentCommonVO.getCurrent();
+        Long size = esPatentCommonVO.getSize();
+        SearchRequest.Builder builder = this.getCommonPatent(esPatentCommonVO);
+        //解除最大条数限制
+        builder.trackTotalHits(i -> i.enabled(true));
+        SearchResponse<Patent> response = null;
+        try {
+            response = client.search(builder.build(), Patent.class);
+        } catch (Exception e) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "ES检索失败");
+        }
+        List<Patent> list = new ArrayList<>();
+        List<Hit<Patent>> hits = response.hits().hits();
+        long total = 0L;
+        if (StringUtils.isNotEmpty(esField)) {
+            Aggregate aggregate = response.aggregations().get("count");
+            total = aggregate.cardinality().value();
+        } else {
+            total = response.hits().total().value();
+        }
+        for (Hit<Patent> hit : hits) {
+            Double score = hit.score();
+
+            String str = String.format("%.4f", score);
+            double four = Double.parseDouble(str);
+            String id = hit.id();
+            Patent esMess = hit.source();
+            list.add(esMess);
+        }
+        dto.setTotal(total);
+        dto.setOrgPatents(list);
+        dto.setPageNum(current);
+        dto.setPageSize(size);
+        return dto;
+    }
 }
 
 

+ 20 - 11
src/main/java/cn/cslg/pas/service/common/PatentStarApiService.java

@@ -9,14 +9,13 @@ import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.importTaskModel.PatentApplicant;
 import cn.cslg.pas.common.utils.*;
-import cn.cslg.pas.common.vo.ContentVO;
-import cn.cslg.pas.common.vo.NoCacheVO;
-import cn.cslg.pas.common.vo.QueryExternalFamilyVO;
-import cn.cslg.pas.common.vo.StarPatentVO;
+import cn.cslg.pas.common.vo.*;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.domain.WebLoginConfig;
 import cn.cslg.pas.domain.business.RetrieveRecord;
 import cn.cslg.pas.domain.es.*;
+import cn.cslg.pas.exception.ExceptionEnum;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.WebLoginConfigService;
 
 
@@ -445,7 +444,7 @@ public class PatentStarApiService {
                 .addHeader("_timestamp", currentTimeMillis.toString())
                 .addHeader("_sign", signMd5)
                 .get().build();
-        String re="";
+        String re = "";
         // 发送请求获取响应
         while (tryTime < 3) {
             try {
@@ -519,7 +518,7 @@ public class PatentStarApiService {
      * 从专利之星获取中国专利法律状态
      */
     public String getCnLegalApi(String appNo) {
-        Integer tryTime=0;
+        Integer tryTime = 0;
         String url = "https://api.patentstar.com.cn/api/Patent/CnLegal/" + appNo;
         JSONObject configObject = this.getConfigObject(4, 2);
         String appId = configObject.getString("appId");
@@ -540,18 +539,18 @@ public class PatentStarApiService {
                 .addHeader("_timestamp", currentTimeMillis.toString())
                 .addHeader("_sign", signMd5)
                 .get().build();
-        String re="";
+        String re = "";
         // 发送请求获取响应
-        while (tryTime<3) {
+        while (tryTime < 3) {
             try {
 
                 Response response = okHttpClient.newCall(request).execute();
                 // 判断请求是否成功
                 if (response.isSuccessful()) {
                     // 打印服务端返回结果
-                    re=Objects.requireNonNull(response.body()).string();
-                    if(re.equals("{}")||re.contains("[")){
-                        tryTime=4;
+                    re = Objects.requireNonNull(response.body()).string();
+                    if (re.equals("{}") || re.contains("[")) {
+                        tryTime = 4;
                         return re;
                     }
                 }
@@ -1589,4 +1588,14 @@ public class PatentStarApiService {
         }
         return "";
     }
+
+    public List<ChinaLeagalStatus> getCNEvents(String ano) {
+        String cnLegalApiStr = this.getCnLegalApi(ano);
+        List<ChinaLeagalStatus> chinaLeagalStatuses = new ArrayList<>();
+        if (cnLegalApiStr != null && !cnLegalApiStr.equals("")) {
+            chinaLeagalStatuses = com.alibaba.fastjson.JSON.parseArray(cnLegalApiStr, ChinaLeagalStatus.class);
+
+        }
+        return chinaLeagalStatuses;
+    }
 }

+ 5 - 2
src/main/java/cn/cslg/pas/service/importPatent/ImportSinglePatentService.java

@@ -24,6 +24,7 @@ import cn.cslg.pas.domain.es.*;
 import cn.cslg.pas.exception.ExceptionEnum;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.business.ReportProjectService;
+import cn.cslg.pas.service.business.es.EsLegalEventService;
 import cn.cslg.pas.service.business.es.EsMergePersonService;
 import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.business.invalidReport.PatentClaimService;
@@ -77,7 +78,8 @@ public class ImportSinglePatentService {
     private PatentNoUtil patentNoUtil;
     @Autowired
     private WebVOTransformService webVOTransformService;
-
+     @Autowired
+     private EsLegalEventService esLegalEventService;
     public StarPatentVO getPatentFromWeb(String patentNo) {
         StarPatentVO starPatentVO = null;
         String dbType = "";
@@ -395,7 +397,8 @@ public class ImportSinglePatentService {
         }
         //添加法律事务
         if (contents.contains(6)) {
-        }
+            esLegalEventService.addEsLegalEvent(patent,starPatentVO.getANO());
+                    }
 
         //装载权利要求
         if (contents.contains(2) || contents.contains(3)) {

+ 21 - 0
src/main/java/cn/cslg/pas/service/project/MailSendRecordService.java

@@ -0,0 +1,21 @@
+package cn.cslg.pas.service.project;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.pas.domain.project.MailSendRecord;
+import cn.cslg.pas.mapper.project.MailSendRecordMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author admin
+* @description 针对表【mail_send_record(信息通知记录表)】的数据库操作Service实现
+* @createDate 2025-11-21 10:56:23
+*/
+@Service
+public class MailSendRecordService extends ServiceImpl<MailSendRecordMapper, MailSendRecord> {
+
+
+}
+
+
+
+

+ 98 - 0
src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorRecordService.java

@@ -0,0 +1,98 @@
+package cn.cslg.pas.service.project;
+
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentErrorVO;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentResultVO;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentSuccessVO;
+import cn.cslg.pas.common.vo.ChinaLeagalStatus;
+import cn.cslg.pas.domain.es.LegalEvent;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.pas.domain.project.PatentStatusMonitorRecord;
+import cn.cslg.pas.mapper.project.PatentStatusMonitorRecordMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author admin
+ * @description 针对表【patent_status_monitor_record】的数据库操作Service实现
+ * @createDate 2025-11-21 10:20:09
+ */
+@Service
+public class PatentStatusMonitorRecordService extends ServiceImpl<PatentStatusMonitorRecordMapper, PatentStatusMonitorRecord> {
+    public PatentStatusMonitorRecord add(Integer projectId, Integer patentStatusMonitorId, Date date) {
+        PatentStatusMonitorRecord patentStatusMonitorRecord = new PatentStatusMonitorRecord();
+        patentStatusMonitorRecord.setProjectId(projectId);
+        patentStatusMonitorRecord.setPatentStatusMonitorId(patentStatusMonitorId);
+        patentStatusMonitorRecord.setCreateTime(date);
+        patentStatusMonitorRecord.insert();
+        return patentStatusMonitorRecord;
+    }
+
+    public PatentStatusMonitorRecord UpdateErrorPatentMessage(PatentStatusMonitorRecord patentStatusMonitorRecord, String patentNo, String errorMessage) {
+        Integer id = patentStatusMonitorRecord.getId();
+        String errorPatentMessages = patentStatusMonitorRecord.getMonitorErrorPatents();
+        List<MonitorPatentErrorVO> monitorPatentErrorVOS = new ArrayList<>();
+        if (errorPatentMessages != null) {
+            monitorPatentErrorVOS = JSONArray.parseArray(errorPatentMessages, MonitorPatentErrorVO.class);
+        }
+        MonitorPatentErrorVO monitorPatentErrorVO = new MonitorPatentErrorVO();
+        monitorPatentErrorVO.setPatentNo(patentNo);
+        monitorPatentErrorVO.setErrorMessage(errorMessage);
+        monitorPatentErrorVOS.add(monitorPatentErrorVO);
+        errorPatentMessages = JSON.toJSONString(monitorPatentErrorVOS);
+        patentStatusMonitorRecord.setMonitorErrorPatents(errorPatentMessages);
+        patentStatusMonitorRecord.updateById();
+        return patentStatusMonitorRecord;
+    }
+
+    public PatentStatusMonitorRecord updateSuccessPatentMessage(PatentStatusMonitorRecord patentStatusMonitorRecord, String patentNo, List<LegalEvent> events, List<MonitorPatentResultVO> monitorPatentResultVOS) {
+        Integer id = patentStatusMonitorRecord.getId();
+        String successPatentMessages = patentStatusMonitorRecord.getMonitorPatents();
+        List<MonitorPatentSuccessVO> monitorPatentSuccessVOS = new ArrayList<>();
+        if (successPatentMessages != null) {
+            monitorPatentSuccessVOS = JSONArray.parseArray(successPatentMessages, MonitorPatentSuccessVO.class);
+        }
+
+        MonitorPatentSuccessVO monitorPatentSuccessVO = new MonitorPatentSuccessVO();
+        monitorPatentSuccessVO.setPatentNo(patentNo);
+        monitorPatentSuccessVO.setMonitorPatentResultVOList(monitorPatentResultVOS);
+        monitorPatentSuccessVOS.add(monitorPatentSuccessVO);
+        successPatentMessages = JSON.toJSONString(monitorPatentSuccessVOS);
+        patentStatusMonitorRecord.setMonitorPatents(successPatentMessages);
+        patentStatusMonitorRecord.updateById();
+        return patentStatusMonitorRecord;
+    }
+
+    public List<PatentStatusMonitorRecord> getByStatus(Integer monitorId, Integer status) {
+        LambdaQueryWrapper<PatentStatusMonitorRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PatentStatusMonitorRecord::getPatentStatusMonitorId, monitorId)
+                .eq(PatentStatusMonitorRecord::getStatus, status);
+        List<PatentStatusMonitorRecord> patentStatusMonitorRecords = this.list(queryWrapper);
+        return patentStatusMonitorRecords;
+    }
+
+    public void updateStatus(Integer monitorId, Integer status) {
+        LambdaUpdateWrapper<PatentStatusMonitorRecord> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(PatentStatusMonitorRecord::getStatus, status)
+                .eq(PatentStatusMonitorRecord::getId, monitorId);
+        this.update(updateWrapper);
+        return;
+    }
+
+    public PatentStatusMonitorRecord getLastDoneRecord(Integer monitorId, Integer status) {
+        LambdaQueryWrapper<PatentStatusMonitorRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PatentStatusMonitorRecord::getPatentStatusMonitorId, monitorId)
+                .eq(PatentStatusMonitorRecord::getStatus, status).orderByDesc(PatentStatusMonitorRecord::getCreateTime);
+       PatentStatusMonitorRecord patentStatusMonitorRecords = this.getOne(queryWrapper,false);
+        return patentStatusMonitorRecords;
+    }
+}
+
+
+
+

+ 136 - 26
src/main/java/cn/cslg/pas/service/project/PatentStatusMonitorService.java

@@ -3,25 +3,38 @@ package cn.cslg.pas.service.project;
 import cn.cslg.pas.common.core.base.Cycle;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
 import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.importTask.ProjectQuartzSetDTO;
+import cn.cslg.pas.common.model.common.CommonPerson;
+import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.patentProject.*;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.StringUtils;
+import cn.cslg.pas.domain.business.PatentProject;
 import cn.cslg.pas.exception.ExceptionEnum;
 import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.PatentProjectService;
 import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.common.LoadService;
+import cn.cslg.pas.service.permissions.PermissionService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.util.BeanUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.pas.domain.project.PatentStatusMonitor;
 import cn.cslg.pas.mapper.project.PatentStatusMonitorMapper;
+import com.google.gson.JsonArray;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -39,25 +52,37 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
     private LoadService loadService;
     @Autowired
     private EsService esService;
+    @Autowired
+    private PatentProjectService patentProjectService;
+    @Autowired
+    private PermissionService permissionService;
 
     public Integer add(PatentStatusMonitorAddDTO patentStatusMonitorAddDTO) {
         Integer loginId = loginUtils.getId();
         Integer maxSize = 50;
         PatentStatusMonitor patentStatusMonitor = new PatentStatusMonitor();
+
         List<String> isAdd = patentStatusMonitorAddDTO.getIsAdd();
         List<String> isDelete = patentStatusMonitorAddDTO.getIsDelete();
         Long startNumber = patentStatusMonitorAddDTO.getStartNumber();
         Long endNumber = patentStatusMonitorAddDTO.getEndNumber();
-        String notifyCycle = patentStatusMonitorAddDTO.getNotifyCycle();
         List<Integer> targetSSs = patentStatusMonitorAddDTO.getTargetSSs();
         StringRequest stringRequest = patentStatusMonitorAddDTO.getStringRequest();
+        Integer projectId = patentStatusMonitorAddDTO.getProjectId();
+        List<CommonPerson> commonPeople = patentStatusMonitorAddDTO.getNotifyPeople();
+        String parameters = patentStatusMonitorAddDTO.getParameters();
         List<String> patentNos = new ArrayList<>();
+        PatentProject patentProject = patentProjectService.getByProjectId(projectId);
+        String notifyCycle = patentProject.getNotifyCycle();
+        if (notifyCycle == null || notifyCycle.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "周期不可为空");
+        }
         Integer type = 0;
         //判断是哪种监控
         //检索式导入
         if ((startNumber == null
                 || endNumber == null
-                || startNumber < endNumber)
+                || endNumber <= startNumber)
                 && (isAdd == null || isAdd.size() == 0)
                 && (isDelete == null || isDelete.size() == 0)) {
             type = 1;
@@ -87,20 +112,18 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
         //当选择了范围,则证明是范围选择专利号,需要判断专利号数量
         if (type == 0) {
             if (patentNos.size() > maxSize) {
-                throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "选择专利数量不允许超过50");
+                throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "选择专利数量不允许超过50");
             }
         }
 
 
-        this.check(notifyCycle);
-
         if (isAdd != null && isAdd.size() > 0) {
             String isAddStr = StringUtils.join(isAdd, ",");
             patentStatusMonitor.setIsAdd(isAddStr);
         }
         if (patentNos != null && patentNos.size() > 0) {
             String patentNosStr = StringUtils.join(patentNos, ",");
-            patentStatusMonitor.setIsAdd(patentNosStr);
+            patentStatusMonitor.setPatentList(patentNosStr);
         }
         if (isDelete != null && isDelete.size() > 0) {
             String isDeleteStr = StringUtils.join(isDelete, ",");
@@ -116,25 +139,40 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
         patentStatusMonitor.setStartNumber(startNumber);
         patentStatusMonitor.setNotifyCycle(notifyCycle);
         patentStatusMonitor.setType(type);
+        patentStatusMonitor.setProjectId(projectId);
+        patentStatusMonitor.setParameters(parameters);
         if (stringRequest != null) {
             String searchQuery = JSON.toJSONString(stringRequest);
             patentStatusMonitor.setSearchQuery(searchQuery);
         }
+        if (commonPeople != null) {
+            String commonPeopleStr = JSON.toJSONString(commonPeople);
+            patentStatusMonitor.setNotifyPeople(commonPeopleStr);
+        }
         patentStatusMonitor.insert();
         return patentStatusMonitor.getId();
     }
 
-    public List<PatentStatusMonitorVO> query(PatentStatusMonitorQueryDTO patentStatusMonitorQueryDTO) {
+    public Records query(PatentStatusMonitorQueryDTO patentStatusMonitorQueryDTO) {
         Integer projectId = patentStatusMonitorQueryDTO.getProjectId();
         Integer status = patentStatusMonitorQueryDTO.getStatus();
+        Long current = patentStatusMonitorQueryDTO.getCurrent();
+        Long size = patentStatusMonitorQueryDTO.getSize();
         LambdaQueryWrapper<PatentStatusMonitor> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(PatentStatusMonitor::getProjectId, projectId);
         if (status != null) {
             queryWrapper.eq(PatentStatusMonitor::getStatus, status);
         }
-        List<PatentStatusMonitor> patentStatusMonitors = this.list(queryWrapper);
+        queryWrapper.orderByDesc(PatentStatusMonitor::getCreateTime);
+        IPage<PatentStatusMonitor> patentStatusMonitorIPage = this.page(new Page<>(current, size), queryWrapper);
+        Records records = new Records();
+        records.setCurrent(current);
+        records.setSize(size);
+        records.setTotal(patentStatusMonitorIPage.getTotal());
+        List<PatentStatusMonitor> patentStatusMonitors = patentStatusMonitorIPage.getRecords();
         List<PatentStatusMonitorVO> list = this.loadVo(patentStatusMonitors);
-        return list;
+        records.setData(list);
+        return records;
     }
 
     private List<PatentStatusMonitorVO> loadVo(List<PatentStatusMonitor> patentStatusMonitors) {
@@ -145,24 +183,43 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
             patentStatusMonitorVO.setEndNumber(patentStatusMonitor.getEndNumber());
             patentStatusMonitorVO.setStartNumber(patentStatusMonitor.getStartNumber());
             patentStatusMonitorVO.setCreateTime(patentStatusMonitor.getCreateTime());
+            patentStatusMonitorVO.setId(patentStatusMonitor.getId());
+            patentStatusMonitorVO.setParameters(patentStatusMonitor.getParameters());
+            patentStatusMonitorVO.setCreateId(patentStatusMonitor.getCreateId());
+            String patentStr = patentStatusMonitor.getPatentList();
+            if (patentStr != null) {
+                List<String> patentList = StringUtils.changeStringToString(patentStr, ",");
+                patentStatusMonitorVO.setPatentNos(patentList);
+            }
             String targetSss = patentStatusMonitor.getTargetSss();
             String isAdd = patentStatusMonitor.getIsAdd();
             String isDelete = patentStatusMonitor.getIsDelete();
+            String notifyPeople = patentStatusMonitor.getNotifyPeople();
+            String searchQuery = patentStatusMonitor.getSearchQuery();
             if (targetSss != null && !targetSss.isEmpty()) {
                 List<Integer> targetSssList = StringUtils.changeStringToInteger(targetSss, ",");
-                patentStatusMonitorVO.setTargetSss(targetSssList);
+                patentStatusMonitorVO.setTargetSSs(targetSssList);
             }
             if (isAdd != null && !isAdd.isEmpty()) {
                 List<String> isAddList = StringUtils.changeStringToString(isAdd, ",");
                 patentStatusMonitorVO.setIsAdd(isAddList);
             }
             if (isDelete != null && !isDelete.isEmpty()) {
-                List<Integer> targetSssList = StringUtils.changeStringToInteger(targetSss, ",");
-                patentStatusMonitorVO.setTargetSss(targetSssList);
+                List<String> isDeleteList = StringUtils.changeStringToString(isDelete, ",");
+                patentStatusMonitorVO.setIsDelete(isDeleteList);
+            }
+            if (notifyPeople != null) {
+                List<CommonPerson> commonPeople = JSONArray.parseArray(notifyPeople, CommonPerson.class);
+                this.formatNotifyPerson(commonPeople);
+                patentStatusMonitorVO.setNotifyPeople(commonPeople);
+            }
+            if (searchQuery != null) {
+                StringRequest stringRequest = JSON.parseObject(searchQuery, StringRequest.class);
+                patentStatusMonitorVO.setStringRequest(stringRequest);
             }
-
             patentStatusMonitorVOList.add(patentStatusMonitorVO);
         }
+
         if (patentStatusMonitorVOList.size() > 0) {
             loadService.loadCommonVO(patentStatusMonitorVOList);
         }
@@ -174,16 +231,19 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
         String targetSS = null;
         Integer id = patentStatusMonitorUpdateDTO.getId();
         List<Integer> targetSSs = patentStatusMonitorUpdateDTO.getTargetSSs();
-        String notifyCycle = patentStatusMonitorUpdateDTO.getNotifyCycle();
-        this.check(notifyCycle);
+        List<CommonPerson> commonPeople = patentStatusMonitorUpdateDTO.getNotifyPeople();
         if (targetSSs != null && targetSSs.size() > 0) {
             targetSS = StringUtils.join(targetSSs, ",");
         }
 
         LambdaUpdateWrapper<PatentStatusMonitor> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.set(PatentStatusMonitor::getTargetSss, targetSS)
-                .eq(PatentStatusMonitor::getId, id)
-                .set(PatentStatusMonitor::getNotifyCycle, notifyCycle);
+                .eq(PatentStatusMonitor::getId, id);
+        if (commonPeople != null) {
+            String commonPeopleStr = JSON.toJSONString(commonPeople);
+            updateWrapper.set(PatentStatusMonitor::getNotifyPeople, commonPeopleStr);
+        }
+        this.update(updateWrapper);
         return id;
     }
 
@@ -194,16 +254,13 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
         return ids;
     }
 
-    private void check(String notifyCycle) {
-        if (notifyCycle == null ||
-                !notifyCycle.equals(Cycle.MONTH) ||
-                !notifyCycle.equals(Cycle.DAY) ||
-                !notifyCycle.equals(Cycle.QUARTER) ||
-                !notifyCycle.equals(Cycle.WEEK) ||
-                !notifyCycle.equals(Cycle.YEAR)) {
-            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "周期非法输入");
-        }
 
+    public List<PatentStatusMonitor> getAllRunning(List<String> cycles) {
+        LambdaQueryWrapper<PatentStatusMonitor> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PatentStatusMonitor::getStatus, 1);
+        queryWrapper.in(PatentStatusMonitor::getNotifyCycle, cycles);
+        List<PatentStatusMonitor> patentStatusMonitors = this.list(queryWrapper);
+        return patentStatusMonitors;
     }
 
     public List<PatentStatusMonitor> getAllRunning() {
@@ -212,6 +269,59 @@ public class PatentStatusMonitorService extends ServiceImpl<PatentStatusMonitorM
         List<PatentStatusMonitor> patentStatusMonitors = this.list(queryWrapper);
         return patentStatusMonitors;
     }
+
+    public void formatNotifyPerson(List<CommonPerson> commonPeople) {
+        if (commonPeople == null || commonPeople.size() == 0) {
+            return;
+        }
+        List<String> personIds = commonPeople.stream().filter(item -> item.getId() != null).map(CommonPerson::getId).collect(Collectors.toList());
+        if (personIds == null || personIds.size() == 0) {
+            return;
+        }
+        List<Personnel> personnels = new ArrayList<>();
+        //查询创建人名称
+        if (personIds != null && personIds.size() != 0) {
+
+            try {
+                String res = permissionService.getPersonnelByIdsFromPCS(personIds);
+                JSONObject jsonObject = JSONObject.parseObject(res);
+                personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+        for (CommonPerson commonPerson : commonPeople) {
+            if (commonPerson.getId() != null) {
+                Personnel personnel = personnels.stream().filter(item -> item.getId().equals(commonPerson.getId())).findFirst().orElse(null);
+                commonPerson.setEmail(personnel.getPersonnelEmail());
+                commonPerson.setName(personnel.getPersonnelName());
+            }
+        }
+
+    }
+
+    public void updateCycle(Integer projectId, String cycle) {
+        LambdaUpdateWrapper<PatentStatusMonitor> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(PatentStatusMonitor::getNotifyCycle, cycle)
+                .eq(PatentStatusMonitor::getProjectId, projectId);
+        this.update(updateWrapper);
+        return;
+    }
+    public PatentProject setProjectNotifyCycle(ProjectQuartzSetDTO projectQuartzSetDTO) {
+        Integer projectId = projectQuartzSetDTO.getProjectId();
+        String notifyCylce = projectQuartzSetDTO.getNotifyCycle();
+        PatentProject project = patentProjectService.getProjectQuartz(projectId);
+        if (project == null) {
+            patentProjectService.addProjectQuartz(projectQuartzSetDTO);
+        } else {
+            project.setNotifyCycle(notifyCylce);
+            project.updateById();
+        }
+        //周期统一更新
+        this.updateCycle(projectId, notifyCylce);
+        return project;
+    }
 }
 
 

+ 25 - 0
src/main/java/cn/cslg/pas/service/project/PatentStatusUpdateRecord.java

@@ -0,0 +1,25 @@
+package cn.cslg.pas.service.project;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @TableName patent_status_update_record
+ */
+@TableName(value ="patent_status_update_record")
+@Data
+public class PatentStatusUpdateRecord extends BaseEntity<PatentStatusUpdateRecord> {
+    private Integer id;
+
+    private String patentNo;
+
+    private String orgStatus;
+
+    private String nowStatus;
+
+    private Date occurredTime;
+    private Integer patentMonitorId;
+}

+ 44 - 0
src/main/java/cn/cslg/pas/service/project/PatentStatusUpdateRecordService.java

@@ -0,0 +1,44 @@
+package cn.cslg.pas.service.project;
+
+import cn.cslg.pas.common.vo.ChinaLeagalStatus;
+import cn.cslg.pas.domain.es.LegalEvent;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.pas.mapper.project.PatentStatusUpdateRecordMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author admin
+ * @description 针对表【patent_status_update_record(专利状态更新记录)】的数据库操作Service实现
+ * @createDate 2025-11-21 11:32:15
+ */
+@Service
+public class PatentStatusUpdateRecordService extends ServiceImpl<PatentStatusUpdateRecordMapper, PatentStatusUpdateRecord> {
+    public PatentStatusUpdateRecord add(Integer patentMonitorId, String patentNo, Date date, List<LegalEvent> events, List<ChinaLeagalStatus> chinaLeagalStatuses) {
+        PatentStatusUpdateRecord patentStatusUpdateRecord = new PatentStatusUpdateRecord();
+        patentStatusUpdateRecord.setPatentNo(patentNo);
+        patentStatusUpdateRecord.setPatentMonitorId(patentMonitorId);
+        String org = JSONArray.toJSONString(events);
+        String nowStatus = JSONArray.toJSONString(chinaLeagalStatuses);
+        patentStatusUpdateRecord.setNowStatus(nowStatus);
+        patentStatusUpdateRecord.setOrgStatus(org);
+        patentStatusUpdateRecord.setOccurredTime(date);
+        patentStatusUpdateRecord.insert();
+        return patentStatusUpdateRecord;
+    }
+    public PatentStatusUpdateRecord getByPatentNo(String patentNo , Date date) {
+        LambdaQueryWrapper<PatentStatusUpdateRecord> queryWrapper =new LambdaQueryWrapper<>();
+        queryWrapper.eq(PatentStatusUpdateRecord::getPatentNo,patentNo)
+                .eq(PatentStatusUpdateRecord::getOccurredTime,date);
+        PatentStatusUpdateRecord patentStatusUpdateRecord =this.getOne(queryWrapper,false);
+        return patentStatusUpdateRecord;
+    }
+}
+
+
+
+

+ 0 - 1
src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentJobService.java

@@ -62,7 +62,6 @@ public class SysImportPatentJobService extends QuartzJobBean {
             List<ImportTaskCondition> importTaskConditions = importTaskConditionService.list(queryWrapper1);
 
             importTaskConditions.forEach(item -> {
-
                 PatentProject project = patentProjects.stream().filter(t -> t.getProjectId().equals(item.getProjectId())).findFirst().orElse(null);
                              importTaskService.addImportTaskByCondition(item, project);
 

+ 294 - 39
src/main/java/cn/cslg/pas/service/quartzService/SysImportPatentStatusJobService.java

@@ -2,20 +2,43 @@ package cn.cslg.pas.service.quartzService;
 
 import cn.cslg.pas.common.core.base.Cycle;
 import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentErrorVO;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentResultVO;
+import cn.cslg.pas.common.model.request.StringRequest;
+import cn.cslg.pas.common.utils.DataUtils;
+import cn.cslg.pas.common.utils.DateUtils;
 import cn.cslg.pas.common.utils.DateUtils2;
 import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.common.utils.utilVO.CheckDateConditionVO;
+import cn.cslg.pas.common.vo.*;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.domain.business.ImportTaskCondition;
 import cn.cslg.pas.domain.business.PatentProject;
+import cn.cslg.pas.domain.business.SystemDict;
+import cn.cslg.pas.domain.es.LegalEvent;
 import cn.cslg.pas.domain.es.Patent;
 import cn.cslg.pas.domain.project.PatentStatusMonitor;
+import cn.cslg.pas.domain.project.PatentStatusMonitorRecord;
+import cn.cslg.pas.exception.ExceptionEnum;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.MailSendService;
-import cn.cslg.pas.service.business.ImportTaskConditionService;
-import cn.cslg.pas.service.business.ImportTaskService;
-import cn.cslg.pas.service.business.PatentProjectService;
+import cn.cslg.pas.service.business.*;
+import cn.cslg.pas.service.business.es.EsCustomFieldService;
+import cn.cslg.pas.service.business.es.EsLegalEventService;
 import cn.cslg.pas.service.business.es.EsPatentService;
+import cn.cslg.pas.service.business.es.EsService;
+import cn.cslg.pas.service.common.PatentStarApiService;
+import cn.cslg.pas.service.importPatent.ImportSinglePatentService;
+import cn.cslg.pas.service.importPatent.WebVOTransformService;
+import cn.cslg.pas.service.project.PatentStatusMonitorRecordService;
 import cn.cslg.pas.service.project.PatentStatusMonitorService;
+import cn.cslg.pas.service.project.PatentStatusUpdateRecord;
+import cn.cslg.pas.service.project.PatentStatusUpdateRecordService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import org.quartz.DisallowConcurrentExecution;
@@ -23,11 +46,12 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -38,6 +62,16 @@ public class SysImportPatentStatusJobService extends QuartzJobBean {
     private final MailSendService mailSendService;
     private final PatentStatusMonitorService patentStatusMonitorService;
     private final EsPatentService esPatentService;
+    private final PatentStarApiService patentStarApiService;
+    private final EsService esService;
+    private final ImportSinglePatentService importSinglePatentService;
+    private final EsLegalEventService esLegalEventService;
+    private final WebVOTransformService webVOTransformService;
+    private final CustomFieldService customFieldService;
+    private final EsCustomFieldService esCustomFieldService;
+    private final SystemDictService systemDictService;
+    private final PatentStatusUpdateRecordService patentStatusUpdateRecordService;
+    private final PatentStatusMonitorRecordService patentStatusMonitorRecordService;
 
     @Override
     public void executeInternal(JobExecutionContext context) throws JobExecutionException {
@@ -49,65 +83,286 @@ public class SysImportPatentStatusJobService extends QuartzJobBean {
 
 
     public void monitorPatentStatus() {
+        LocalDate currentDate = LocalDate.now();
+        Date date = Date.from(currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+
         List<PatentStatusMonitor> patentStatusMonitors = patentStatusMonitorService.getAllRunning();
         for (PatentStatusMonitor patentStatusMonitor : patentStatusMonitors) {
-            List<String> successNos = new ArrayList<>();
-            List<Map<String, Object>> errorNos = new ArrayList<>();
+            Integer id = patentStatusMonitor.getId();
             Integer type = patentStatusMonitor.getType();
+            String target = patentStatusMonitor.getTargetSss();
+            Integer projectId = patentStatusMonitor.getProjectId();
+            String searchQuery = patentStatusMonitor.getSearchQuery();
+            List<String> targetSSIds = StringUtils.changeStringToString(target, ",");
+            List<String> targetSS = this.getTargetSS(targetSSIds);
+            PatentStatusMonitorRecord patentStatusMonitorRecord = patentStatusMonitorRecordService.add(projectId, id, date);
             if (type == 0) {
                 String patentNosStr = patentStatusMonitor.getPatentList();
                 List<String> patentNosList = StringUtils.changeStringToString(patentNosStr, ",");
                 for (String patentNo : patentNosList) {
+                    this.updatePatentStatus(patentNo, projectId, targetSS, date, patentStatusMonitorRecord);
+                }
+            } else {
+                try {
+                    StringRequest stringRequest = JSONObject.parseObject(searchQuery, StringRequest.class);
+                    Long current = 1l;
+                    stringRequest.setSize(50l);
+                    stringRequest.setCurrent(current);
 
+                    PatentDTO patentDTO = esService.esSearch2(stringRequest);
+                    Long total = patentDTO.getTotal();
+                    Long allSize = total / 50l;
+                    if (total % 50l != 0) {
+                        allSize += 1;
+                    }
+
+                    for (long i = 0; i < allSize; i++) {
+                        stringRequest.setCurrent(i + 1l);
+                        PatentDTO patentDTO2 = esService.esSearch2(stringRequest);
+                        List<Patent> patents = patentDTO2.getOrgPatents();
+                        for (Patent patent : patents) {
+                            String patentNo = patent.getPatentNo();
+                            this.updatePatentStatus(patentNo, projectId, targetSS, date, patentStatusMonitorRecord);
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
             }
+            patentStatusMonitorRecord.setStatus(1);
+            patentStatusMonitorRecord.updateById();
         }
     }
 
-    public void addErrorMessage(String patentNos, String message, List<Map<String, Object>> errorNos) {
-        Map<String, Object> map = new HashMap<>();
-        map.put("patentNo", patentNos);
-        map.put("message", message);
-        errorNos.add(map);
+    public String updatePatentStatus(String patentNo, Integer projectId, List<String> targetSs, Date nowDate, PatentStatusMonitorRecord patentStatusMonitorRecord) {
+        Integer id = patentStatusMonitorRecord.getId();
+        try {
+            PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
+            if (patentWithIdVO == null) {
+
+                patentStatusMonitorRecordService.UpdateErrorPatentMessage(patentStatusMonitorRecord, patentNo, "专题库");
+                return "";
+            }
+            Patent patent = patentWithIdVO.getPatent();
+
+
+            String appNo = patent.getAppNo();
+            if (appNo == null) {
+                patentStatusMonitorRecordService.UpdateErrorPatentMessage(patentStatusMonitorRecord, patentNo, "没有申请号");
+                return "";
+            }
+            if (!appNo.startsWith("CN")) {
+                patentStatusMonitorRecordService.UpdateErrorPatentMessage(patentStatusMonitorRecord, patentNo, "非中国专利");
+                return "";
+            }
+
+            List<ChinaLeagalStatus> chinaLeagalStatuses = new ArrayList<>();
+            List<LegalEvent> events = new ArrayList<>();
+            PatentStatusUpdateRecord patentStatusUpdateRecord = patentStatusUpdateRecordService.getByPatentNo(patentNo, nowDate);
+            if (patentStatusUpdateRecord != null) {
+                String orgStatus = patentStatusUpdateRecord.getOrgStatus();
+                String nowStatus = patentStatusUpdateRecord.getNowStatus();
+                events = JSONArray.parseArray(orgStatus, LegalEvent.class);
+                chinaLeagalStatuses = JSONArray.parseArray(nowStatus, ChinaLeagalStatus.class);
+            } else {
+                String rowAppNo = appNo.substring(2, appNo.length() - 2);
+                events = esPatentService.getLegalEvents(patentNo);
+                chinaLeagalStatuses = patentStarApiService.getCNEvents(rowAppNo);
+
+            }
+
+            if (chinaLeagalStatuses.size() == 0) {
+                return "";
+            }
+
+            //作差查看是否有更新的
+            List<ChinaLeagalStatus> updateLeagals = getUpdateLeagals(chinaLeagalStatuses, events);
+            //如果有,更新法律状态以及专利信息
+            if (updateLeagals.size() > 0) {
+                updateLeagals = updateLeagals.stream().sorted(Comparator.comparing(ChinaLeagalStatus::getLegalDate)).collect(Collectors.toList());
+                //专利更新
+                if (patentStatusUpdateRecord == null) {
+                    patentStatusUpdateRecordService.add(id, patentNo, nowDate, events, chinaLeagalStatuses);
+                    this.updatePatent(updateLeagals, patentWithIdVO, new ArrayList<String>());
+                }
+                List<MonitorPatentResultVO> monitorPatentResultVOS = this.getMonitorResult(events, updateLeagals, targetSs);
+                if (monitorPatentResultVOS != null && monitorPatentResultVOS.size() > 0) {
+                    List<EsCustomFieldDTO> esCustomFieldDTOList = this.getEsCustomFieldDTOList(projectId, monitorPatentResultVOS);
+                    this.addPatentCustomFiled(esCustomFieldDTOList, patentWithIdVO);
+                    patentStatusMonitorRecordService.updateSuccessPatentMessage(patentStatusMonitorRecord, patentNo, events, monitorPatentResultVOS);
+                }
+            }
+        } catch (Exception e) {
+            patentStatusMonitorRecordService.UpdateErrorPatentMessage(patentStatusMonitorRecord, patentNo, "专利数据入库错误");
+
+            e.printStackTrace();
+        }
+        return "";
     }
 
-    public void updatePatentStatus(String patentNo, List<String> successNos, List<Map<String, Object>> errorNos) {
-        PatentNoVO patentNoVO = new PatentNoVO();
-        patentNoVO.setPatentNo(patentNo);
-        try {
-            PatentColumnDTO patentColumnDTO = esPatentService.selectPatentDetail(patentNoVO);
-            if (patentColumnDTO == null) {
-                return;
+    public List<ChinaLeagalStatus> getUpdateLeagals(List<ChinaLeagalStatus> chinaLeagalStatuses, List<LegalEvent> events) {
+        if (events == null || events.size() == 0) {
+            return chinaLeagalStatuses;
+        }
+        List<ChinaLeagalStatus> updateLeagalStatus = new ArrayList<>();
+        for (ChinaLeagalStatus chinaLeagalStatus : chinaLeagalStatuses) {
+            String code = chinaLeagalStatus.getLegalCode();
+            LegalEvent legalEvent = events.stream().filter(item -> item.getCode().equals(code)).findFirst().orElse(null);
+            if (legalEvent == null) {
+                updateLeagalStatus.add(chinaLeagalStatus);
+            }
+        }
+
+        return updateLeagalStatus;
+    }
+
+    public void updatePatent(List<ChinaLeagalStatus> updateLeagals, PatentWithIdVO patentWithIdVO, List<String> targetSS) {
+        Patent oldPatent = patentWithIdVO.getPatent();
+        String oldPatentNo = oldPatent.getPatentNo();
+        StarPatentVO starPatentVO = importSinglePatentService.getPatentFromWeb(oldPatentNo);
+        if (starPatentVO == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未检索到专利");
+        }
+
+        Patent patent = new Patent();
+        //装载基本信息
+        patent.setPatentNo(oldPatent.getPatentNo());
+        patent = importSinglePatentService.getPatentCataloguingFromWeb(starPatentVO);
+
+
+        List<LegalEvent> legalEvents = new ArrayList<>();
+        for (ChinaLeagalStatus item : updateLeagals) {
+            LegalEvent legalEvent1 = new LegalEvent();
+            legalEvent1.setEventDate(item.getLegalDate());
+            legalEvent1.setCode(item.getLegalCode());
+            legalEvent1.setAppNo(patent.getAppNo());
+            legalEvent1.setGrantNo(patent.getGrantNo());
+            legalEvent1.setPublicNo(patent.getPublicNo());
+            legalEvent1.setDescription(item.getLegalStatusInfo());
+            legalEvent1.setName(item.getLegalStatus());
+            legalEvents.add(legalEvent1);
+            try {
+                String reId = esLegalEventService.addLegalEvent(legalEvent1);
+            } catch (Exception e) {
+                throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, e.getMessage());
             }
+        }
+        webVOTransformService.transLegalEvent(patent, legalEvents);
+        try {
+            importSinglePatentService.getPDFFromWeb(starPatentVO);
         } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (!ObjectUtils.isEmpty(patent)) {
+            esService.updatePatentShouldWait(patent, patentWithIdVO.getId());
 
         }
+    }
 
-        //获取专利的法律状态
-        //获取专利最新的法律状态
-        //对比
-        //若有变化,对专利进行更新
+    public List<EsCustomFieldDTO> getEsCustomFieldDTOList(Integer projectId, List<MonitorPatentResultVO> monitorPatentResultVOS) {
+        UploadParamsVO.Field field = new UploadParamsVO.Field();
+        field.setKey("专利法律状态监控:6");
+        List<String> fieldValues = new ArrayList<>();
+        for (MonitorPatentResultVO monitorPatentResultVO : monitorPatentResultVOS) {
+            ChinaLeagalStatus legalEvent = monitorPatentResultVO.getLastStatus();
+            String dateName = DateUtils.dateTimeToStr(legalEvent.getLegalDate(), "yyyy-MM-dd");
+            String message = legalEvent.getSimpleStatus();
+            String fieldValue = message + "\\" + dateName;
+            fieldValues.add(fieldValue);
+        }
+        field.setFieldList(fieldValues);
+        List<EsCustomFieldDTO> esCustomFieldDTOList = customFieldService.getFieldDTOByStrings(Arrays.asList(field), projectId, null);
+        return esCustomFieldDTOList;
     }
 
-    public List<String> getCnCycles() {
-        CheckDateConditionVO checkDateConditionVO = DateUtils2.checkDateCycleCondition(null);
-        Boolean ifMeetMonth = checkDateConditionVO.getIfMeetMonth();
-        Boolean ifMeetQuarter = checkDateConditionVO.getIfMeetQuarter();
-        Boolean ifMeetYear = checkDateConditionVO.getIfMeetYear();
-        List<String> cycles = new ArrayList<>();
-        cycles.add(Cycle.WEEK);
+    public void addPatentCustomFiled(List<EsCustomFieldDTO> esCustomFieldDTOS, PatentWithIdVO patentWithIdVO) {
+        String patentId = patentWithIdVO.getId();
+        Patent patent = patentWithIdVO.getPatent();
+        if (esCustomFieldDTOS != null && esCustomFieldDTOS.size() > 0) {
+            for (EsCustomFieldDTO esCustomFieldDTO : esCustomFieldDTOS
+            ) {
+                esCustomFieldDTO.setPatentId(patentId);
+                if (esCustomFieldDTO.getOptionType() == null) {
+                    esCustomFieldDTO.setOptionType(1);
+                }
+                esCustomFieldDTO.setOptionType(esCustomFieldDTO.getOptionType());
+                esCustomFieldDTO.setPatentNo(patent.getPatentNo());
+                try {
+                    esCustomFieldService.addCustomField(esCustomFieldDTO);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+            }
 
-        if (ifMeetMonth != null && ifMeetMonth) {
-            cycles.add(Cycle.MONTH);
         }
-        if (ifMeetQuarter != null && ifMeetQuarter) {
-            cycles.add(Cycle.QUARTER);
+    }
+
+    public List<String> getTargetSS(List<String> targetIds) {
+        if (targetIds == null || targetIds.size() == 0) {
+            return new ArrayList<>();
         }
-        if (ifMeetYear != null && ifMeetYear) {
-            cycles.add(Cycle.YEAR);
+        List<SystemDict> systemDictList = systemDictService.getSystemDictByTypeAndValue("PATENT_MONITOR_STATUS", targetIds);
+        List<String> targetss = systemDictList.stream().map(SystemDict::getLabel).collect(Collectors.toList());
+        return targetss;
+    }
+
+    public List<MonitorPatentResultVO> getMonitorResult(List<LegalEvent> legalEvents, List<ChinaLeagalStatus> chinaLeagalStatuses, List<String> targetSSs) {
+        List<MonitorPatentResultVO> monitorPatentResultVOS = new ArrayList<>();
+        //获取法律状态字典
+        List<SystemDict> systemDictList = systemDictService.getSystemDictByTypeAndSimpleLabel("PATENT_STATUS2", targetSSs);
+        //装载更新后的法律状态的简单法律状态
+        this.getSimpleStatus(chinaLeagalStatuses, systemDictList);
+        //
+        String simpleOrgStatus = "";
+        LegalEvent legalEvent = null;
+        if (legalEvents != null && legalEvents.size() > 0) {
+            legalEvents = legalEvents.stream().sorted(Comparator.comparing(LegalEvent::getEventDate).reversed()).collect(Collectors.toList());
+            List<SystemDict> systemDictAll = systemDictService.getSystemDictByTypeAndValue("PATENT_STATUS2", null);
+            for (LegalEvent legalEvent1 : legalEvents) {
+                String orgStatus = legalEvent1.getDescription();
+                SystemDict systemDict = systemDictAll.stream().filter(item -> item.getRemark().equals(orgStatus)).findFirst().orElse(null);
+                if (systemDict != null && !StringUtils.isEmpty(systemDict.getSimpleLabel())) {
+                    simpleOrgStatus = systemDict.getSimpleLabel();
+                    break;
+                }
+            }
+
+        }
+        for (String tagetSs : targetSSs) {
+            //获取更新后的法律状态
+            ChinaLeagalStatus chinaLeagalStatus = chinaLeagalStatuses.stream().filter(item -> item.getSimpleStatus() != null && item.getSimpleStatus().equals(tagetSs)).findFirst().orElse(null);
+            //获取当前法律状态的状态
+            if (chinaLeagalStatus == null) {
+                return monitorPatentResultVOS;
+            }
+            if (chinaLeagalStatus.getSimpleStatus().equals(simpleOrgStatus)) {
+                return monitorPatentResultVOS;
+            }
+            MonitorPatentResultVO monitorPatentResultVO = new MonitorPatentResultVO();
+            monitorPatentResultVO.setSimpleOrgStatus(simpleOrgStatus);
+            monitorPatentResultVO.setOrgStatus(legalEvent);
+            monitorPatentResultVO.setLastStatus(chinaLeagalStatus);
+            monitorPatentResultVOS.add(monitorPatentResultVO);
         }
-        return cycles;
+        return monitorPatentResultVOS;
+    }
 
+    public String getSimpleStatus(String remark, List<SystemDict> systemDictList) {
+        SystemDict systemDict = systemDictList.stream().filter(item -> item.getRemark().equals(remark)).findFirst().orElse(null);
+        if (systemDict != null) {
+            return systemDict.getSimpleLabel();
+        }
+        return null;
+    }
+
+    public void getSimpleStatus(List<ChinaLeagalStatus> chinaLeagalStatuses, List<SystemDict> systemDictList) {
+        for (ChinaLeagalStatus chinaLeagalStatus : chinaLeagalStatuses) {
+            SystemDict systemDict = systemDictList.stream().filter(item -> item.getRemark().equals(chinaLeagalStatus.getLegalStatusInfo())).findFirst().orElse(null);
+            if (systemDict != null) {
+                chinaLeagalStatus.setSimpleStatus(systemDict.getSimpleLabel());
+            }
+        }
     }
 }
 

+ 261 - 0
src/main/java/cn/cslg/pas/service/quartzService/SysPatentStatusNoticeJobService.java

@@ -0,0 +1,261 @@
+package cn.cslg.pas.service.quartzService;
+
+import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentExport.PatentExportVO;
+import cn.cslg.pas.common.model.common.CommonPerson;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentResultVO;
+import cn.cslg.pas.common.model.project.monitorPatent.MonitorPatentSuccessVO;
+import cn.cslg.pas.common.utils.*;
+import cn.cslg.pas.common.utils.commonUtils.QuartzUtils;
+import cn.cslg.pas.common.vo.ChinaLeagalStatus;
+import cn.cslg.pas.common.vo.ConfigVOS.PatentConfigVO;
+import cn.cslg.pas.common.vo.FieldValueVO;
+import cn.cslg.pas.common.vo.PatentWithIdVO;
+import cn.cslg.pas.common.vo.es.EsPatentFieldsVO;
+import cn.cslg.pas.common.vo.es.InnerPatentFieldsVO;
+import cn.cslg.pas.domain.business.Project;
+import cn.cslg.pas.domain.business.SystemDict;
+import cn.cslg.pas.domain.es.LegalEvent;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.domain.project.MailSendRecord;
+import cn.cslg.pas.domain.project.PatentStatusMonitor;
+import cn.cslg.pas.domain.project.PatentStatusMonitorRecord;
+import cn.cslg.pas.exception.ExceptionEnum;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.factorys.PatentExportFactory.GetValueImp;
+import cn.cslg.pas.factorys.PatentExportFactory.PatentExportFactory;
+import cn.cslg.pas.service.MailSendService;
+import cn.cslg.pas.service.business.CommonService;
+import cn.cslg.pas.service.business.PatentExportService;
+import cn.cslg.pas.service.business.ProjectService;
+import cn.cslg.pas.service.business.SystemDictService;
+import cn.cslg.pas.service.business.es.EsPatentService;
+import cn.cslg.pas.service.business.es.EsService;
+import cn.cslg.pas.service.project.PatentStatusMonitorRecordService;
+import cn.cslg.pas.service.project.PatentStatusMonitorService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@DisallowConcurrentExecution
+@RequiredArgsConstructor
+@Service
+public class SysPatentStatusNoticeJobService extends QuartzJobBean {
+    private final MailSendService mailSendService;
+    private final PatentStatusMonitorService patentStatusMonitorService;
+    private final PatentStatusMonitorRecordService patentStatusMonitorRecordService;
+    private final PatentExportService patentExportService;
+    private final EsService esService;
+    private final PatentExportFactory patentExportFactory;
+    private final SystemDictService systemDictService;
+
+    private final ParseByteToFileUtils parseByteToFileUtils;
+    private final ProjectService projectService;
+    private final RabbitMQUtils rabbitMQUtils;
+
+    @Override
+    public void executeInternal(JobExecutionContext context) throws JobExecutionException {
+
+        mailSendService.sendSysCycleStartEmail("系统专利状态监控通知开始");
+        this.notifyPatentStatus();
+
+    }
+
+
+    public void notifyPatentStatus() {
+        LocalDate localDate =LocalDate.of(2025,11,30);
+        List<String> cycles = QuartzUtils.getNotifyCnCycles(localDate);
+        List<PatentStatusMonitor> patentStatusMonitors = patentStatusMonitorService.getAllRunning(cycles);
+        for (PatentStatusMonitor patentStatusMonitor : patentStatusMonitors) {
+            Integer id = patentStatusMonitor.getId();
+            //查询监控记录
+            List<PatentStatusMonitorRecord> patentStatusMonitorRecords = patentStatusMonitorRecordService.getByStatus(id, 1);
+
+            for (PatentStatusMonitorRecord patentStatusMonitorRecord : patentStatusMonitorRecords) {
+                String notifyPeopleStr = patentStatusMonitor.getNotifyPeople();
+                if(StringUtils.isEmpty(notifyPeopleStr)){
+                    return;
+                }
+                this.sendMessage(patentStatusMonitor, patentStatusMonitorRecord);
+                patentStatusMonitorRecord.setStatus(2);
+                patentStatusMonitorRecord.updateById();
+            }
+        }
+    }
+
+    public void sendMessage(PatentStatusMonitor patentStatusMonitor, PatentStatusMonitorRecord patentStatusMonitorRecord) {
+        List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Arrays.asList("PATENT_STATUS_EXPORT_FIELD"));
+        SystemDict systemDict = systemDictList.get(0);
+        String exportFieldStr = systemDict.getRemark();
+        List<PatentExportVO> patentExportVOs = JSONArray.parseArray(exportFieldStr, PatentExportVO.class);
+        List<String> headers = patentExportVOs.stream().map(PatentExportVO::getName).collect(Collectors.toList());
+        headers.add("变更前法律状态");
+        headers.add("法律状态变更时间");
+        headers.add("变更后法律状态");
+        headers.add("变更理由");
+        String json = CommonService.readJsonFile("patent.json");
+        List<PatentConfigVO> patentConfigVOS = JSON.parseArray(json, PatentConfigVO.class);
+
+        HSSFWorkbook hssfWorkbook = patentExportService.getExportHssWorkbook(headers);
+        HSSFCellStyle commonCellStyle = patentExportService.getComCellStyle(hssfWorkbook);
+        HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);
+
+
+        String patentsMessageStr = patentStatusMonitorRecord.getMonitorPatents();
+        if (!StringUtils.isEmpty(patentsMessageStr)) {
+            Integer projectId =patentStatusMonitor.getProjectId();
+            List<MonitorPatentSuccessVO> monitorPatentSuccessVOS = JSONArray.parseArray(patentsMessageStr, MonitorPatentSuccessVO.class);
+            for (int i = 0; i < monitorPatentSuccessVOS.size(); i++) {
+                MonitorPatentSuccessVO monitorPatentSuccessVO = monitorPatentSuccessVOS.get(i);
+                this.loadPatentCell(monitorPatentSuccessVO, patentExportVOs, patentConfigVOS, hssfSheet, commonCellStyle, i);
+            }
+
+            String fileGuid = "";
+            try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                hssfWorkbook.write(out);
+                if (out.toByteArray() != null && out.toByteArray().length != 0) {
+                    Date date =new Date();
+                    String DateStr =DateUtils.formatDate(date,"YYYYMMdd");
+                    Project project = projectService.getById(projectId);
+                    String projectName = project.getName();
+                    String name = DateStr+"-"+projectName+"-"+"专利状态监控";
+                    fileGuid = parseByteToFileUtils.uploadFile2(out.toByteArray(), 1,name);
+                }
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            this.sendEmail(patentStatusMonitor, patentStatusMonitorRecord, fileGuid);
+        }
+
+    }
+
+    public void loadPatentCell(MonitorPatentSuccessVO monitorPatentSuccessVO, List<PatentExportVO> patentExportVOS, List<PatentConfigVO> patentConfigVOS, HSSFSheet sheet, HSSFCellStyle commonCellStyle, Integer index) {
+        HSSFRow row = sheet.createRow(index + 1);
+        String patentNo = monitorPatentSuccessVO.getPatentNo();
+        List<MonitorPatentResultVO> monitorPatentResultVOS = monitorPatentSuccessVO.getMonitorPatentResultVOList();
+        PatentColumnDTO patent = null;
+        try {
+            PatentWithIdVO patentWithIdVO = esService.getIdByPatentNo(patentNo);
+            Patent patent1 = patentWithIdVO.getPatent();
+            patent = esService.getPatentColumnDTO(patent1, null, patentWithIdVO.getId(), "1");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        row.setHeight((short) 800);
+        int allSize = patentExportVOS.size();
+        for (int j = 0; j < patentExportVOS.size(); j++) {
+            String column = patentExportVOS.get(j).getValue();
+            String name = patentExportVOS.get(j).getName();
+            String type = patentExportVOS.get(j).getType();
+            // 使用反射获取属性值
+            Object value = GenerateObjectUtil.getPropertyValue(patent, column);
+            if (value != null) {
+                PatentConfigVO patentConfigVO = patentConfigVOS.stream().filter(item -> item.getValue().equals(column)).findFirst().orElse(null);
+                String exportClass = patentConfigVO.getExportClass();
+                GetValueImp getValueImp = patentExportFactory.getClass(exportClass);
+                if (getValueImp != null) {
+                    String reValue = getValueImp.getValue(value);
+                    HSSFCell cell = row.createCell(j);
+                    cell.setCellStyle(commonCellStyle);
+                    cell.setCellValue(reValue);
+                }
+            }
+        }
+
+        //装载专利原始状态栏位
+        String simpleStatus = monitorPatentResultVOS.get(0).getSimpleOrgStatus();
+        HSSFCell cell = row.createCell(allSize);
+        cell.setCellStyle(commonCellStyle);
+        cell.setCellValue(simpleStatus);
+
+        //装载修改时间栏位
+        List<String> dateValues = new ArrayList<>();
+        List<String> nowStatuses = new ArrayList<>();
+        List<String> reasons = new ArrayList<>();
+        for (MonitorPatentResultVO monitorPatentResultVO : monitorPatentResultVOS) {
+            ChinaLeagalStatus last = monitorPatentResultVO.getLastStatus();
+            Date date = last.getLegalDate();
+            String formatDate = DateUtils.formatDate(date, "YYYY-MM-dd");
+            dateValues.add(formatDate);
+            String status = last.getSimpleStatus();
+            nowStatuses.add(status);
+            String description = last.getDETAIL();
+            reasons.add(description);
+        }
+        String dateValuesStr = StringUtils.join(dateValues, "\n");
+        String nowStatusesStr = StringUtils.join(nowStatuses, "\n");
+        String resonStr = StringUtils.join(reasons, "\n");
+        HSSFCell cell1 = row.createCell(allSize + 1);
+        cell1.setCellStyle(commonCellStyle);
+        cell1.setCellValue(dateValuesStr);
+        HSSFCell cell2 = row.createCell(allSize + 2);
+        cell2.setCellStyle(commonCellStyle);
+        cell2.setCellValue(nowStatusesStr);
+        HSSFCell cell3 = row.createCell(allSize + 3);
+        cell3.setCellStyle(commonCellStyle);
+        cell3.setCellValue(resonStr);
+    }
+
+    public void sendEmail(PatentStatusMonitor patentStatusMonitor, PatentStatusMonitorRecord patentStatusMonitorRecord, String fileId) {
+        String notifyPeopleStr = patentStatusMonitor.getNotifyPeople();
+        List<CommonPerson> commonPeople = JSONArray.parseArray(notifyPeopleStr, CommonPerson.class);
+        patentStatusMonitorService.formatNotifyPerson(commonPeople);
+        Integer projectId = patentStatusMonitor.getProjectId();
+        Project project = projectService.getById(projectId);
+        String projectName = project.getName();
+        Map<String, Object> map = new LinkedHashMap<>();
+        String title = "专利状态监控通知";
+        map.put("title", title);
+        map.put("template", "mail/monitorPatentStatus.html");
+        map.put("img", "/logo.png");
+        String patentsMessageStr = patentStatusMonitorRecord.getMonitorPatents();
+        List<MonitorPatentSuccessVO> monitorPatentSuccessVOS = JSONArray.parseArray(patentsMessageStr, MonitorPatentSuccessVO.class);
+
+
+        String[] filesArray = new String[]{fileId};
+        map.put("files", filesArray);
+
+        for (CommonPerson commonPerson : commonPeople) {
+            map.put("email", commonPerson.getEmail());
+            map.put("value1", commonPerson.getName());
+            map.put("value2", projectName);
+            map.put("value3", monitorPatentSuccessVOS.size());
+            rabbitMQUtils.sendEmailMessage(map);
+        }
+
+        MailSendRecord mailSendRecord = new MailSendRecord();
+        String personStr = JSONObject.toJSONString(commonPeople);
+        String contentStr = JSONObject.toJSONString(map);
+        mailSendRecord.setSendTo(personStr);
+        mailSendRecord.setProjectId(projectId);
+        mailSendRecord.setCreateId(patentStatusMonitor.getCreateId());
+        mailSendRecord.setSendWay(0);
+        mailSendRecord.setSendContent(contentStr);
+        mailSendRecord.setType(0);
+        mailSendRecord.setFromId(patentStatusMonitorRecord.getId());
+        mailSendRecord.insert();
+    }
+}
+
+

+ 1 - 1
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=f785dde5b96344e9a98563b6666b1da4
 FileSource: 1
 ES:
   patentVector: patent_vector

+ 71 - 1
src/test/java/cn/cslg/pas/test/QuartzTaskTests.java

@@ -1,11 +1,16 @@
 package cn.cslg.pas.test;
 
+import cn.cslg.pas.common.dto.es.EsCustomFieldDTO;
 import cn.cslg.pas.common.utils.FileUtils;
 import cn.cslg.pas.common.utils.GenerateObjectUtil;
+import cn.cslg.pas.common.vo.UploadParamsVO;
 import cn.cslg.pas.controller.AvoidDesignController;
 import cn.cslg.pas.service.MailSendService;
 import cn.cslg.pas.service.business.AvoidDesignService;
+import cn.cslg.pas.service.business.CustomFieldService;
+import cn.cslg.pas.service.business.es.EsLegalEventService;
 import cn.cslg.pas.service.quartzService.SysImportPatentJobService;
+import cn.cslg.pas.service.quartzService.SysImportPatentStatusJobService;
 import cn.cslg.pas.service.test.*;
 import cn.hutool.crypto.SecureUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -14,6 +19,8 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -27,6 +34,12 @@ public class QuartzTaskTests {
     private MailSendService mailSendService;
     @Autowired
     private SysImportPatentJobService sysImportPatentJobService;
+    @Autowired
+    private CustomFieldService customFieldService;
+    @Autowired
+    private SysImportPatentStatusJobService sysImportPatentStatusJobService;
+    @Autowired
+    private EsLegalEventService esLegalEventService;
 
     @Test
     public void testUpdate() {
@@ -38,8 +51,65 @@ public class QuartzTaskTests {
     public void testUpdate2() {
         sysImportPatentJobService.addChinesePatent();
     }
+
     @Test
-    public void test3(){
+    public void test3() {
         FileUtils.deleteFolder("D:\\PAS_nBase\\4feb04e4-877f-4786-8561-0a0ac5c544d6");
     }
+
+    @Test
+    public void test4() {
+        UploadParamsVO.Field field = new UploadParamsVO.Field();
+        field.setKey("专利法律状态监控:6");
+        field.setFieldList(Arrays.asList("zhangsan\\李四"));
+        List<EsCustomFieldDTO> esCustomFieldDTOList = customFieldService.getFieldDTOByStrings(Arrays.asList(field), 619, null);
+        System.out.println(esCustomFieldDTOList);
+    }
+
+    @Test
+    public void test6() throws Exception {
+        List<String> patentNos = Arrays.asList("CN202420681085.3", "CN202430486598.4","CN202420681073.0");
+        patentNos.forEach(item -> {
+
+            try {
+                esLegalEventService.deleteByPatentNo(item);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        });
+
+    }
+
+    @Test
+    public void test5() {
+        sysImportPatentStatusJobService.monitorPatentStatus();
+    }
+
+
+    @Test
+    public void deleteRighthuifu() throws Exception {
+        List<String> patentNos = Arrays.asList("CN201510304634.0");
+        patentNos.forEach(item -> {
+
+            try {
+                esLegalEventService.deleteByPatentNo(item);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        });
+
+    }
+    @Test
+    public void deleteRightzhuanyi() throws Exception {
+        List<String> patentNos = Arrays.asList("CN200710015109.2");
+        patentNos.forEach(item -> {
+            try {
+                esLegalEventService.deleteByPatentNo(item,Arrays.asList("012002","015001","015003","016002","016001"));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        });
+
+    }
+
 }