From 3dbc786738cdf005fac8ae5c27023e39a0554a68 Mon Sep 17 00:00:00 2001 From: cjl <909710561@qq.com> Date: Wed, 24 Jan 2024 15:43:42 +0800 Subject: [PATCH] fix:疾控中心设备分钟数据导出 --- screen-job/src/main/java/com/moral/api/util/EmailSpringUtil.java | 115 ++++++++++++++ screen-job/src/main/resources/mapper/DeviceMapper.xml | 22 ++ screen-job/src/main/java/com/moral/api/util/DataListener.java | 47 +++++ screen-job/src/main/java/com/moral/api/service/DeviceService.java | 4 screen-job/src/main/java/com/moral/api/util/ExcelUtil.java | 31 +++ screen-job/src/main/java/com/moral/api/config/emile/EmailToLongConfig.java | 21 ++ screen-job/src/main/java/com/moral/api/controller/PubController.java | 44 +++++ screen-job/pom.xml | 22 ++ screen-job/src/main/java/com/moral/api/task/EmilTask.java | 68 ++++++++ screen-job/src/main/resources/application-dev.yml | 12 + screen-job/src/main/resources/application-qa.yml | 12 + screen-job/src/main/java/com/moral/api/util/DeviceExcelDTO.java | 50 ++++++ screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java | 5 screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java | 6 14 files changed, 453 insertions(+), 6 deletions(-) diff --git a/screen-job/pom.xml b/screen-job/pom.xml index 7ad595f..5d1fbf3 100644 --- a/screen-job/pom.xml +++ b/screen-job/pom.xml @@ -34,6 +34,28 @@ <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + <version>3.1.1</version> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-email</artifactId> + <version>1.5</version> + </dependency> + + <dependency> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + <version>1.4.7</version> + </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> diff --git a/screen-job/src/main/java/com/moral/api/config/emile/EmailToLongConfig.java b/screen-job/src/main/java/com/moral/api/config/emile/EmailToLongConfig.java new file mode 100644 index 0000000..b030855 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/config/emile/EmailToLongConfig.java @@ -0,0 +1,21 @@ +package com.moral.api.config.emile; + +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +/** + * @ClassName EmailToLongConfig + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 14:58 + * @Version 1.0 + */ +@Configuration +public class EmailToLongConfig { + @PostConstruct + private void init(){ + // ������������������������������������������������������������������.bin������������ + System.setProperty("mail.mime.splitlongparameters","false"); + } +} diff --git a/screen-job/src/main/java/com/moral/api/controller/PubController.java b/screen-job/src/main/java/com/moral/api/controller/PubController.java index 59d40d1..e9eb49c 100644 --- a/screen-job/src/main/java/com/moral/api/controller/PubController.java +++ b/screen-job/src/main/java/com/moral/api/controller/PubController.java @@ -1,6 +1,9 @@ package com.moral.api.controller; import com.moral.api.service.*; +import com.moral.api.util.DeviceExcelDTO; +import com.moral.api.util.EmailSpringUtil; +import com.moral.api.util.ExcelUtil; import com.moral.api.util.HttpUtils; import com.moral.constant.ResultMessage; import com.moral.util.DateUtils; @@ -10,13 +13,15 @@ import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ByteArrayResource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import javax.mail.MessagingException; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.*; /** * @ClassName UserController @@ -46,6 +51,10 @@ private HistoryHourlyService historyHourlyService; @Autowired private HistoryMonthlyService historyMonthlyService; + @Autowired + private DeviceService deviceService; + @Autowired + private EmailSpringUtil emailSpringUtil; @GetMapping("insertHistoryDaily") @ApiOperation(value = "���������������", notes = "���������������") @@ -159,5 +168,32 @@ } } - + @GetMapping("excelDevice") + @ApiOperation(value = "excle", notes = "excle") + public void excelDevice() throws IOException { + String startTime = DateUtils.dateToDateString(DateUtils.addDays(new Date(),-1),DateUtils.yyyy_MM_dd_EN); + List<DeviceExcelDTO> list = deviceService.ListDeviceExcel(startTime,null,72); + String path = Objects.requireNonNull(this.getClass().getClassLoader().getResource("")).getPath(); + String fileName = String.format("%s������������������-%s.xlsx",path,startTime); + ByteArrayOutputStream out = null; + try { + // ������excel������ + out = ExcelUtil.generateExcel(list, DeviceExcelDTO.class); + // ������������ + String content = startTime+"������������������������������"; + String toMail = "909710561@qq.com"; + emailSpringUtil.sendEmail("������������������",content,false,"909710561@qq.com", + toMail,"null",null, fileName, new ByteArrayResource(out.toByteArray())); + } catch (IOException e) { + log.error(String.format("������excel������������������%s",e)); + e.printStackTrace(); + } catch (MessagingException e) { + log.error(String.format("������������������������������%s",e)); + e.printStackTrace(); + }finally { + if(out != null){ + out.close(); + } + } + } } diff --git a/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java b/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java index 4bb2d15..38337bf 100644 --- a/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java +++ b/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java @@ -2,6 +2,10 @@ import com.moral.api.entity.Device; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.moral.api.util.DeviceExcelDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * <p> @@ -13,4 +17,5 @@ */ public interface DeviceMapper extends BaseMapper<Device> { + List<DeviceExcelDTO> ListDeviceExcel(@Param("startTime") String startTime,@Param("endTime") String endTime,@Param("id") int id); } diff --git a/screen-job/src/main/java/com/moral/api/service/DeviceService.java b/screen-job/src/main/java/com/moral/api/service/DeviceService.java index 7e15c10..afe166d 100644 --- a/screen-job/src/main/java/com/moral/api/service/DeviceService.java +++ b/screen-job/src/main/java/com/moral/api/service/DeviceService.java @@ -2,6 +2,7 @@ import com.moral.api.entity.Device; import com.baomidou.mybatisplus.extension.service.IService; +import com.moral.api.util.DeviceExcelDTO; import java.util.List; @@ -30,4 +31,7 @@ **/ List<Device> getDateByOrgId(int orgId); + + List<DeviceExcelDTO> ListDeviceExcel(String startTime,String endTime,int id); + } diff --git a/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java index d624a60..0ecca0e 100644 --- a/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java +++ b/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java @@ -6,6 +6,7 @@ import com.moral.api.mapper.DeviceMapper; import com.moral.api.service.DeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.util.DeviceExcelDTO; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; @@ -74,4 +75,9 @@ devices = deviceMapper.selectList(wrapper_device); return devices; } + + @Override + public List<DeviceExcelDTO> ListDeviceExcel(String startTime, String endTime, int id) { + return this.baseMapper.ListDeviceExcel(startTime,endTime,id); + } } \ No newline at end of file diff --git a/screen-job/src/main/java/com/moral/api/task/EmilTask.java b/screen-job/src/main/java/com/moral/api/task/EmilTask.java new file mode 100644 index 0000000..3473efd --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/task/EmilTask.java @@ -0,0 +1,68 @@ +package com.moral.api.task; + +import com.moral.api.service.DeviceService; +import com.moral.api.util.DeviceExcelDTO; +import com.moral.api.util.EmailSpringUtil; +import com.moral.api.util.ExcelUtil; +import com.moral.util.DateUtils; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.stereotype.Component; + +import javax.mail.MessagingException; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @ClassName EmaleTask + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 15:33 + * @Version 1.0 + */ +@Component +@Slf4j +public class EmilTask { + @Autowired + private DeviceService deviceService; + @Autowired + private EmailSpringUtil emailSpringUtil; + @XxlJob("emilTask") + public ReturnT emilTask()throws IOException { + String startTime = DateUtils.dateToDateString(DateUtils.addDays(new Date(),-1),DateUtils.yyyy_MM_dd_EN); + List<DeviceExcelDTO> list = deviceService.ListDeviceExcel(startTime,null,72); + String path = Objects.requireNonNull(this.getClass().getClassLoader().getResource("")).getPath(); + String fileName = String.format("%s������������������-%s.xlsx",path,startTime); + ByteArrayOutputStream out = null; + try { + // ������excel������ + out = ExcelUtil.generateExcel(list, DeviceExcelDTO.class); + // ������������ + String content = startTime+"������������������������������"; + String toMail = "ad@7drlb.com"; + emailSpringUtil.sendEmail("������������������",content,false,"909710561@qq.com", + toMail,"909710561@qq.com",null, fileName, new ByteArrayResource(out.toByteArray())); + } catch (IOException e) { + log.error(String.format("������excel������������������%s",e)); + e.printStackTrace(); + return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); + } catch (MessagingException e) { + log.error(String.format("������������������������������%s",e)); + e.printStackTrace(); + return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); + }finally { + if(out != null){ + out.close(); + } + } + return ReturnT.SUCCESS; + + } +} diff --git a/screen-job/src/main/java/com/moral/api/util/DataListener.java b/screen-job/src/main/java/com/moral/api/util/DataListener.java new file mode 100644 index 0000000..51ae3f7 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/util/DataListener.java @@ -0,0 +1,47 @@ +package com.moral.api.util; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.util.ConverterUtils; +import groovy.transform.EqualsAndHashCode; +import org.apache.poi.ss.formula.functions.T; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @ClassName DataListener + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 11:10 + * @Version 1.0 + */ +@EqualsAndHashCode(callSuper = true) +public class DataListener extends AnalysisEventListener<T> { + /** + * ������������������ + */ + private final List<T> dataList = new ArrayList<>(); + + @Override + public void invoke(T data, AnalysisContext context) { + dataList.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) { + this.invokeHeadMap(ConverterUtils.convertToStringMap(headMap,context),context); + } + + public List<T> getDataList() { + return dataList; + } + +} diff --git a/screen-job/src/main/java/com/moral/api/util/DeviceExcelDTO.java b/screen-job/src/main/java/com/moral/api/util/DeviceExcelDTO.java new file mode 100644 index 0000000..a449542 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/util/DeviceExcelDTO.java @@ -0,0 +1,50 @@ +package com.moral.api.util; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @ClassName DeviceExcelDTO + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 11:13 + * @Version 1.0 + */ +@Data +public class DeviceExcelDTO implements Serializable { + @ExcelProperty(value = "������������") + private String name; + + @ExcelProperty(value = "������") + @DateTimeFormat(value = "yyyy-MM-dd HH:mm") + private Date time; + + @ExcelProperty(value = "PM2.5") + private BigDecimal a34004; + + @ExcelProperty(value = "������") + private BigDecimal a01001; + + @ExcelProperty(value = "������") + private BigDecimal a01002; + + @ExcelProperty(value = "������") + private BigDecimal a00e13; + + @ExcelProperty(value = "������������") + private BigDecimal a00e19; + + @ExcelProperty(value = "������") + private BigDecimal a31001; + + @ExcelProperty(value = "TVOC") + private BigDecimal a99054; + + +} diff --git a/screen-job/src/main/java/com/moral/api/util/EmailSpringUtil.java b/screen-job/src/main/java/com/moral/api/util/EmailSpringUtil.java new file mode 100644 index 0000000..3cfe940 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/util/EmailSpringUtil.java @@ -0,0 +1,115 @@ +package com.moral.api.util; + +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.mail.MailProperties; +import org.springframework.core.io.InputStreamSource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.activation.FileDataSource; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.util.List; + +/** + * @ClassName EmailSpringUtil + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 13:23 + * @Version 1.0 + */ +@Component +@AllArgsConstructor +public class EmailSpringUtil { + private final JavaMailSender javaMailSender; + private final MailProperties mailProperties; + /** + * ������������ + * + * @param subject ������������ + * @param content ������������ + * @param contentIsHtml ���������������html������ + * @param fromMailPersonalName ��������������� + * @param toMail ��������������� + * @param ccMail ��������������� + * @param bccMail ��������������������� + * @param fileNames ��������������������������� + * @throws GeneralSecurityException + * @throws UnsupportedEncodingException + * @throws MessagingException + */ + public void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName, + String toMail, String ccMail, String bccMail, List<String> fileNames) throws MessagingException, UnsupportedEncodingException { + MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(mailProperties.getUsername(), fromMailPersonalName); + helper.setTo(toMail); + if (!ObjectUtils.isEmpty(ccMail)) { + helper.setCc(ccMail); + } + if (!ObjectUtils.isEmpty(bccMail)) { + helper.setBcc(bccMail); + } + helper.setSubject(subject); + helper.setText(content, contentIsHtml); + // ������������������������������fileName������������������������������������������������������������������ + if (!CollectionUtils.isEmpty(fileNames)) { + for (String fileName : fileNames) { + FileDataSource fileDataSource = new FileDataSource(fileName); + helper.addAttachment(fileDataSource.getName(), fileDataSource); + } + } + javaMailSender.send(message); + } + + public void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName, + String toMail, String ccMail, String bccMail, File[] files) throws MessagingException, UnsupportedEncodingException { + MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(mailProperties.getUsername(), fromMailPersonalName); + helper.setTo(toMail); + if (!ObjectUtils.isEmpty(ccMail)) { + helper.setCc(ccMail); + } + if (!ObjectUtils.isEmpty(bccMail)) { + helper.setBcc(bccMail); + } + helper.setSubject(subject); + helper.setText(content, contentIsHtml); + // ������������������������������fileName������������������������������������������������������������������ + if (!ObjectUtils.isEmpty(files)) { + for (File file : files) { + helper.addAttachment(file.getName(), file); + } + } + javaMailSender.send(message); + } + + public void sendEmail(String subject, String content, boolean contentIsHtml, String fromMailPersonalName, + String toMail, String ccMail, String bccMail, String fileName, InputStreamSource fileInput) throws MessagingException, UnsupportedEncodingException { + MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(mailProperties.getUsername(), fromMailPersonalName); + helper.setTo(toMail); + if (!ObjectUtils.isEmpty(ccMail)) { + helper.setCc(ccMail); + } + if (!ObjectUtils.isEmpty(bccMail)) { + helper.setBcc(bccMail); + } + helper.setSubject(subject); + helper.setText(content, contentIsHtml); + // ������������������������������fileName������������������������������������������������������������������ + if (fileInput != null) { + helper.addAttachment(fileName, fileInput); + } + javaMailSender.send(message); + } +} diff --git a/screen-job/src/main/java/com/moral/api/util/ExcelUtil.java b/screen-job/src/main/java/com/moral/api/util/ExcelUtil.java new file mode 100644 index 0000000..d5eb93c --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/util/ExcelUtil.java @@ -0,0 +1,31 @@ +package com.moral.api.util; + +import com.alibaba.excel.EasyExcel; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * @ClassName ExcelUtil + * @Description TODO + * @Author @cjl + * @Date 2024-01-24 11:12 + * @Version 1.0 + */ +public class ExcelUtil { + public static <T> File generateExcel(String fileName, List<T> dataList, Class<T> clazz) throws IOException { + // ������������ + File excel = new File(fileName); + // excel������ + EasyExcel.write(excel,clazz).sheet(0).doWrite(dataList); + return excel; + } + public static <T> ByteArrayOutputStream generateExcel(List<T> dataList, Class<T> clazz) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + // excel������ + EasyExcel.write(out,clazz).sheet(0).doWrite(dataList); + return out; + } +} diff --git a/screen-job/src/main/resources/application-dev.yml b/screen-job/src/main/resources/application-dev.yml index c05e54a..a2d70c8 100644 --- a/screen-job/src/main/resources/application-dev.yml +++ b/screen-job/src/main/resources/application-dev.yml @@ -66,7 +66,17 @@ driver-class-name: com.mysql.cj.jdbc.Driver max-conn-lifetime-millis: 20 test-on-return: false - + mail: + host: smtp.qq.com # ������������������(���������),������������QQ��������������� + username: 909710561@qq.com # ��������������� - ��������� + password: vimrublcqpktbdjh # ���������������������������������QQ������������SMTP������������������QQ������ + properties: + mail: + smtp: + auth: true # ��������������������������������������������������������������������������� + starttls: #SMTP������������:���������������TLS������������ + enable: true + required: true mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: diff --git a/screen-job/src/main/resources/application-qa.yml b/screen-job/src/main/resources/application-qa.yml index 6a60364..520e023 100644 --- a/screen-job/src/main/resources/application-qa.yml +++ b/screen-job/src/main/resources/application-qa.yml @@ -66,7 +66,17 @@ driver-class-name: com.mysql.cj.jdbc.Driver max-conn-lifetime-millis: 20 test-on-return: false - + mail: + host: smtp.qq.com # ������������������(���������),������������QQ��������������� + username: 909710561@qq.com # ��������������� - ��������� + password: vimrublcqpktbdjh # ���������������������������������QQ������������SMTP������������������QQ������ + properties: + mail: + smtp: + auth: true # ��������������������������������������������������������������������������� + starttls: #SMTP������������:���������������TLS������������ + enable: true + required: true mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: diff --git a/screen-job/src/main/resources/mapper/DeviceMapper.xml b/screen-job/src/main/resources/mapper/DeviceMapper.xml index f3c46db..762cfa8 100644 --- a/screen-job/src/main/resources/mapper/DeviceMapper.xml +++ b/screen-job/src/main/resources/mapper/DeviceMapper.xml @@ -28,4 +28,26 @@ <result column="town_code" property="townCode"/> </resultMap> +<select id="ListDeviceExcel" resultType="com.moral.api.util.DeviceExcelDTO"> + SELECT + t1.mac, + t.NAME, + t1.time, + cast( t1.`value` -> '$.a34004' AS DOUBLE ) AS a34004, + cast( t1.`value` -> '$.a01001' AS DOUBLE ) AS a01001, + cast( t1.`value` -> '$.a01002' AS DOUBLE ) AS a01002, + cast( t1.`value` -> '$.a00e13' AS DOUBLE ) AS a00e13, + cast( t1.`value` -> '$.a00e19' AS DOUBLE ) AS a00e19, + cast( t1.`value` -> '$.a31001' AS DOUBLE ) AS a31001, + cast( t1.`value` -> '$.a99054' AS DOUBLE ) AS a99054 + FROM + device t + LEFT JOIN history_minutely_202401 t1 ON t1.mac = t.mac + WHERE + t.organization_id = #{id} + AND date(t1.time) <![CDATA[=]]> #{startTime} + ORDER BY + t1.time, + t1.mac +</select> </mapper> \ No newline at end of file -- Gitblit v1.8.0