Ver código fonte

添加 一次性导出上个月报告

zero 1 semana atrás
pai
commit
80162f06f7

+ 15 - 0
src/main/java/com/cslg/ppa/common/utils/DateUtil.java

@@ -26,6 +26,7 @@ import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
@@ -362,6 +363,20 @@ public class DateUtil {
 	}
 
 	/**
+	 * 获取当前日期的上月第一天 String 对象
+	 */
+	public static String getFirstDayOfMonthStr() {
+		return LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+	}
+
+	/**
+	 * 获取当前日期的上月最后一天 String 对象
+	 */
+	public static String getLastDayOfMonthStr() {
+		return LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+	}
+
+	/**
 	 * 判断两个 Date 对象的日期部分是否相等(忽略时间)
 	 */
 	public static boolean isDateEqualIgnoreTime(Date date1, Date date2) {

+ 6 - 0
src/main/java/com/cslg/ppa/controller/ReportController.java

@@ -82,4 +82,10 @@ public class ReportController {
         return Response.success(guid);
     }
 
+    @Operation(summary = "一键导出上个月报告信息")
+    @GetMapping("/oneClickExport")
+    public String oneClickExport() {
+        String guid = reportService.oneClickExport();
+        return Response.success(guid);
+    }
 }

+ 11 - 0
src/main/java/com/cslg/ppa/dto/OneClickExportDTO.java

@@ -0,0 +1,11 @@
+package com.cslg.ppa.dto;
+
+import lombok.Data;
+
+@Data
+public class OneClickExportDTO {
+
+    private String beginTime;
+
+    private String endTime;
+}

+ 4 - 0
src/main/java/com/cslg/ppa/mapper/ArticleInfoMapper.java

@@ -1,8 +1,10 @@
 package com.cslg.ppa.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cslg.ppa.dto.OneClickExportDTO;
 import com.cslg.ppa.dto.SelectArticleInfoDTO;
 import com.cslg.ppa.entity.ArticleInfo;
+import com.cslg.ppa.vo.OneClickExportVO;
 import com.cslg.ppa.vo.SelectArticleInfoVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -15,4 +17,6 @@ public interface ArticleInfoMapper extends BaseMapper<ArticleInfo> {
     List<SelectArticleInfoVO> selectArticleInfoList(@Param("vo") SelectArticleInfoDTO vo);
 
     Long selectArticleInfoCount(@Param("vo") SelectArticleInfoDTO vo);
+
+    List<OneClickExportVO> selectArticleList(@Param("vo") OneClickExportDTO vo);
 }

+ 3 - 1
src/main/java/com/cslg/ppa/service/ArticleInfoService.java

@@ -40,7 +40,9 @@ public class ArticleInfoService extends ServiceImpl<ArticleInfoMapper, ArticleIn
     public void batchAddArticleInfo(List<GetArticleInfoDTO> articleInfoDTOS) {
         if (!CollectionUtils.isEmpty(articleInfoDTOS)) {
             for (GetArticleInfoDTO articleInfoDTO : articleInfoDTOS) {
-                this.addArticleInfo(articleInfoDTO);
+                if (StringUtils.isNotEmpty(articleInfoDTO.getTitle())) {
+                    this.addArticleInfo(articleInfoDTO);
+                }
             }
         }
     }

+ 86 - 4
src/main/java/com/cslg/ppa/service/ReportService.java

@@ -6,17 +6,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cslg.ppa.common.core.auth.Response;
 import com.cslg.ppa.common.exception.ExceptionEnum;
 import com.cslg.ppa.common.exception.XiaoShiException;
+import com.cslg.ppa.common.utils.DateUtil;
 import com.cslg.ppa.common.utils.FileUtils;
 import com.cslg.ppa.dto.*;
 import com.cslg.ppa.entity.*;
 import com.cslg.ppa.entity.commom.Records;
+import com.cslg.ppa.mapper.ArticleInfoMapper;
 import com.cslg.ppa.mapper.AssoReportArticleMapper;
 import com.cslg.ppa.mapper.ReportMapper;
 import com.cslg.ppa.service.commom.FileManagerService;
-import com.cslg.ppa.vo.ExportReportDetailVO;
-import com.cslg.ppa.vo.ExportReportVO;
-import com.cslg.ppa.vo.SelectAssoReportArticleVO;
-import com.cslg.ppa.vo.SelectReportListVO;
+import com.cslg.ppa.vo.*;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -58,6 +57,10 @@ public class ReportService extends ServiceImpl<ReportMapper, Report> {
     private ReportMapper reportMapper;
     @Autowired
     private AssoReportArticleMapper assoReportArticleMapper;
+    @Autowired
+    private ArticleInfoMapper articleInfoMapper;
+
+    private static final List<String> SPECIAL_KEYWORDS = Arrays.asList("活动", "研讨", "座谈会", "举办", "举行", "培训", "课堂");
 
     public String selectReportList(SelectReportListDTO vo) {
         LambdaQueryWrapper<Report> wrapper = new LambdaQueryWrapper<>();
@@ -258,6 +261,85 @@ public class ReportService extends ServiceImpl<ReportMapper, Report> {
         return fileGuid;
     }
 
+    public String oneClickExport() {
+        OneClickExportDTO vo = new OneClickExportDTO();
+        vo.setBeginTime(DateUtil.getFirstDayOfMonthStr());
+        vo.setEndTime(DateUtil.getLastDayOfMonthStr());
+        List<OneClickExportVO> articleVOS = articleInfoMapper.selectArticleList(vo);
+        List<ExportReportVO> reportVOS = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(articleVOS)) {
+            Map<String, List<OneClickExportVO>> map = articleVOS.stream().collect(Collectors.groupingBy(OneClickExportVO::getCategoryName));
+            if (!CollectionUtils.isEmpty(map)) {
+                for (String key : map.keySet()) {
+                    ExportReportVO reportVO = new ExportReportVO();
+                    reportVO.setCategoryName(key);
+                    List<OneClickExportVO> reportArticleVOS = map.get(key);
+                    List<ExportReportDetailVO> detailVOS = new ArrayList<>();
+                    if (!CollectionUtils.isEmpty(reportArticleVOS)) {
+                        int i = 1;
+                        for (OneClickExportVO reportArticleVO : reportArticleVOS) {
+                            Integer categoryId = reportArticleVO.getCategoryId();
+                            String title = reportArticleVO.getTitle();
+                            if (categoryId == 2 && SPECIAL_KEYWORDS.stream().anyMatch(title::contains)) {
+                                continue;
+                            }
+                            ExportReportDetailVO detailVO = new ExportReportDetailVO();
+                            detailVO.setTitle(i + "、" + title);
+                            detailVO.setDigest(reportArticleVO.getDigest());
+                            String htmlLink = "<a href='" + reportArticleVO.getArticleUrl() + "'>" + reportArticleVO.getArticleUrl() + "</a>";
+                            detailVO.setArticle_url(htmlLink);
+                            detailVOS.add(detailVO);
+                            i++;
+                        }
+                    }
+                    reportVO.setDetailVOS(detailVOS);
+                    reportVOS.add(reportVO);
+                }
+            }
+        }
+
+        List<ExportReportDetailVO> list = new ArrayList<>();
+        List<ExportReportDetailVO> list1 = new ArrayList<>();
+        List<ExportReportDetailVO> list2 = new ArrayList<>();
+        List<ExportReportDetailVO> list3 = new ArrayList<>();
+        List<ExportReportDetailVO> list4 = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(reportVOS)) {
+            for (ExportReportVO reportVO : reportVOS) {
+                String categoryName = reportVO.getCategoryName();
+                if (StringUtils.equals(categoryName, "国家知识产权局")) {
+                    list.addAll(reportVO.getDetailVOS());
+                } else if (StringUtils.equals(categoryName, "地方相关法律法规")) {
+                    list1.addAll(reportVO.getDetailVOS());
+                } else if (StringUtils.equals(categoryName, "判例")) {
+                    list2.addAll(reportVO.getDetailVOS());
+                } else if (StringUtils.equals(categoryName, "国外相关资讯")) {
+                    list3.addAll(reportVO.getDetailVOS());
+                } else if (StringUtils.equals(categoryName, "行业资讯")) {
+                    list4.addAll(reportVO.getDetailVOS());
+                }
+            }
+        }
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("country_list", list);
+        map.put("local_list", list1);
+        map.put("case_list", list2);
+        map.put("foreign_list", list3);
+        map.put("business_list", list4);
+        ReportTemple reportTemplate = reportTempleService.getById(1);
+        String templateFilePath = fileUtils.getPath(reportTemplate.getTemplatePath());
+        String reportName = "";
+        //生成文档
+        String fileGuid = null;
+        try {
+            fileGuid = this.generateReportFile(map, templateFilePath, reportName);
+            //todo 后续添加导出记录
+        } catch (Exception e) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "导出资讯报告失败");
+        }
+        return fileGuid;
+    }
+
     public String generateReportFile(Map<String, Object> map, String templateFilePath, String name) throws Exception {
         XWPFTemplate xwpfTemplate = this.getHtmlTemplate(map, templateFilePath);
         String fileName = name + ".docx";

+ 27 - 0
src/main/java/com/cslg/ppa/vo/OneClickExportVO.java

@@ -0,0 +1,27 @@
+package com.cslg.ppa.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class OneClickExportVO {
+
+    private Integer articleId;
+
+    private String title;
+
+    private String digest;
+
+    private Integer categoryId;
+
+    private String categoryName;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date publicTime;
+
+    private String articleUrl;
+}

BIN
src/main/resources/file/article-export.docx


+ 22 - 0
src/main/resources/mapper/ArticleInfoMapper.xml

@@ -66,4 +66,26 @@
         </where>
     </select>
 
+
+    <select id="selectArticleList" resultType="com.cslg.ppa.vo.OneClickExportVO">
+        select ai.id as articleId,
+        ai.title,
+        ai.digest,
+        ai.category_id,
+        ai.public_time,
+        ai.article_url,
+        ca.name as categoryName
+        from article_info ai
+        left join category ca on ca.id = ai.category_id
+        <where>
+            <if test="vo.beginTime != null">
+                and ai.public_time &gt;= #{vo.beginTime}
+            </if>
+            <if test="vo.endTime != null">
+                and ai.public_time &lt;= #{vo.endTime}
+            </if>
+        </where>
+        order by ai.public_time desc,ai.id desc
+    </select>
+
 </mapper>

+ 18 - 4
src/test/java/com/cslg/ppa/PpaApplicationTests.java

@@ -7,15 +7,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cslg.ppa.common.okhttp.MyCookieStore;
 import com.cslg.ppa.common.utils.DateUtil;
-import com.cslg.ppa.dto.GetArticleInfoDTO;
-import com.cslg.ppa.dto.ReportDTO;
-import com.cslg.ppa.dto.SelectArticleInfoDTO;
-import com.cslg.ppa.dto.SelectCategoryListDTO;
+import com.cslg.ppa.dto.*;
 import com.cslg.ppa.entity.ArticleInfo;
 import com.cslg.ppa.entity.Category;
 import com.cslg.ppa.entity.SourceInfo;
 import com.cslg.ppa.entity.commom.Article;
 import com.cslg.ppa.entity.commom.WxResultBody;
+import com.cslg.ppa.mapper.ArticleInfoMapper;
 import com.cslg.ppa.mapper.CategoryMapper;
 import com.cslg.ppa.mapper.ReportMapper;
 import com.cslg.ppa.mapper.SourceInfoMapper;
@@ -26,6 +24,7 @@ import com.cslg.ppa.service.ReportService;
 import com.cslg.ppa.service.commom.DifyService;
 import com.cslg.ppa.service.commom.FileManagerService;
 import com.cslg.ppa.service.commom.WeiXinApi;
+import com.cslg.ppa.vo.OneClickExportVO;
 import okhttp3.Cookie;
 import okhttp3.HttpUrl;
 import org.apache.commons.io.IOUtils;
@@ -95,6 +94,8 @@ class PpaApplicationTests {
     private GetZhiNanZhenArticleService getZhiNanZhenArticleService;
     @Autowired
     private GetCNIPRArticleService getCNIPRArticleService;
+    @Autowired
+    private ArticleInfoMapper articleInfoMapper;
 
     @Test
     void contextLoads() {
@@ -407,4 +408,17 @@ class PpaApplicationTests {
 
 //        getIprDailyArticleService.getDigest("http://www.iprdaily.cn/news_40675.html");
     }
+
+
+    @Test
+    void test1() {
+        final String firstDayOfMonthStr = DateUtil.getFirstDayOfMonthStr();
+        final String lastDayOfMonthStr = DateUtil.getLastDayOfMonthStr();
+
+        OneClickExportDTO vo = new OneClickExportDTO();
+        vo.setBeginTime(DateUtil.getFirstDayOfMonthStr());
+        vo.setEndTime(DateUtil.getLastDayOfMonthStr());
+        List<OneClickExportVO> articleVOS = articleInfoMapper.selectArticleList(vo);
+        System.out.println(articleVOS);
+    }
 }