WeChatWorkScheduleServiceImpl.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package edp.davinci.service.impl;
  2. import com.alibaba.druid.util.StringUtils;
  3. import com.alibaba.fastjson.JSONObject;
  4. import edp.core.common.quartz.ScheduleService;
  5. import edp.core.utils.CollectionUtils;
  6. import edp.core.utils.FileUtils;
  7. import edp.core.utils.MD5Util;
  8. import edp.davinci.core.enums.CronJobMediaType;
  9. import edp.davinci.dao.CronJobMapper;
  10. import edp.davinci.dao.UserMapper;
  11. import edp.davinci.dto.cronJobDto.CronJobConfig;
  12. import edp.davinci.model.CronJob;
  13. import edp.davinci.model.User;
  14. import edp.davinci.service.screenshot.ImageContent;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.web.client.RestTemplate;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.File;
  21. import java.io.FileInputStream;
  22. import java.io.InputStream;
  23. import java.security.MessageDigest;
  24. import java.util.Base64;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. @Slf4j
  29. @Service("weChatWorkScheduleService")
  30. public class WeChatWorkScheduleServiceImpl extends BaseScheduleService implements ScheduleService {
  31. @Autowired
  32. private CronJobMapper cronJobMapper;
  33. @Autowired
  34. private UserMapper userMapper;
  35. @Autowired
  36. private RestTemplate restTemplate;
  37. @Override
  38. public void execute(long jobId) throws Exception {
  39. CronJob cronJob = cronJobMapper.getById(jobId);
  40. if (null == cronJob || StringUtils.isEmpty(cronJob.getConfig())) {
  41. scheduleLogger.error("CronJob({}) config is empty", jobId);
  42. return;
  43. }
  44. cronJobMapper.updateExecLog(jobId, "");
  45. CronJobConfig cronJobConfig = null;
  46. try {
  47. cronJobConfig = JSONObject.parseObject(cronJob.getConfig(), CronJobConfig.class);
  48. } catch (Exception e) {
  49. scheduleLogger.error("Cronjob({}) parse config({}) error:{}", jobId, cronJob.getConfig(), e.getMessage());
  50. return;
  51. }
  52. if (StringUtils.isEmpty(cronJobConfig.getType())) {
  53. scheduleLogger.error("Cronjob({}) config type is empty", jobId);
  54. return;
  55. }
  56. scheduleLogger.info("CronJob({}) is start! --------------", jobId);
  57. List<ImageContent> images = null;
  58. User creator = userMapper.getById(cronJob.getCreateBy());
  59. if (cronJobConfig.getType().equals(CronJobMediaType.IMAGE.getType())) {
  60. images = generateImages(jobId, cronJobConfig, creator.getId());
  61. }
  62. if (CollectionUtils.isEmpty(images)) {
  63. scheduleLogger.warn("CronJob({}) image is empty", jobId);
  64. return;
  65. }
  66. String url = cronJobConfig.getWebHookUrl();
  67. for (ImageContent imageContent : images) {
  68. if (null == imageContent || imageContent.getImageFile() == null) {
  69. log.error("CronJob({}) image is null!", cronJob.getId());
  70. return;
  71. }
  72. File imageContentFile = imageContent.getImageFile();
  73. // 将大于2M的图片进行压缩
  74. if (imageContentFile.length() > (2 * 1024 * 1024)) {
  75. scheduleLogger.info("Image size must be less than 2M, the size is {} !", imageContentFile.length());
  76. scheduleLogger.info("Image start to compressed!", imageContentFile.getPath());
  77. File file = FileUtils.compressedImage(imageContent.getImageFile().getPath());
  78. scheduleLogger.info("Image compressed successfully! the size is {}.", file.length());
  79. imageContent.setImageFile(file);
  80. scheduleLogger.info("The original image has been replaced with a new image, path:{}!", imageContentFile.getPath());
  81. }
  82. scheduleLogger.info("CronJob({}) is ready to request WeChatWork API", cronJob.getId());
  83. Map<String, Object> weChatWorkMap = new HashMap<>();
  84. weChatWorkMap.put("msgtype", "image");
  85. Map<String, String> mbMap = getMD5AndBase64(imageContent.getImageFile());
  86. Map<String, String> imageMap = new HashMap<>();
  87. imageMap.put("base64", mbMap.get("base64"));
  88. imageMap.put("md5", mbMap.get("md5"));
  89. weChatWorkMap.put("image", imageMap);
  90. restTemplate.postForEntity(url, weChatWorkMap, null).toString();
  91. scheduleLogger.info("CronJob({}) is success to request WeChatWork API", cronJob.getId());
  92. }
  93. scheduleLogger.info("CronJob({}) is finish! --------------", jobId);
  94. }
  95. /**
  96. * 根据图片地址获取MD5和Base64
  97. *
  98. * @param file 图片
  99. * @return
  100. */
  101. private Map<String, String> getMD5AndBase64(File file) {
  102. Map<String, String> resMap = new HashMap<>();
  103. try (InputStream in = new FileInputStream(file);
  104. ByteArrayOutputStream bytesOut = new ByteArrayOutputStream((int) file.length());) {
  105. byte[] buf = new byte[1024];
  106. int len = -1;
  107. while ((len = in.read(buf)) != -1) {
  108. bytesOut.write(buf, 0, len);
  109. }
  110. bytesOut.flush();
  111. // 图片内容的base64编码
  112. String base64 = encode(bytesOut.toByteArray());
  113. resMap.put("base64", base64);
  114. // 图片内容(base64编码前)的md5值
  115. MessageDigest md = MessageDigest.getInstance("md5");
  116. md.update(bytesOut.toByteArray());
  117. byte b[] = md.digest();
  118. resMap.put("md5", MD5Util.byteToString(b));
  119. return resMap;
  120. } catch (Exception e) {
  121. log.error(e.toString(), e);
  122. }
  123. return null;
  124. }
  125. private static String encode(byte[] data) {
  126. return Base64.getEncoder().encodeToString(data);
  127. }
  128. }