From 3f36dcbf511a404ddd769160eb7db87b93d29534 Mon Sep 17 00:00:00 2001 From: bynt Date: Fri, 28 Oct 2022 14:25:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9dmp=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ad-platform-common-core/pom.xml | 4 + .../main/java/com/baiye/util/CacheKey.java | 6 ++ .../java/com/baiye/util/CompressUtil.java | 83 +++++++++++++++++++ .../main/java/com/baiye/util/MailUtil.java | 59 +++++++++---- .../main/java/com/baiye/util/MobileUtil.java | 4 +- .../config/properties/DeliveryProperties.java | 3 + .../com/baiye/timed/DeliveryBalanceTask.java | 49 ++++++++--- .../main/resources/config/application-dev.yml | 3 +- .../resources/config/application-prod.yml | 1 + pom.xml | 7 ++ .../config/properties/DeliveryProperties.java | 3 + .../module/controller/ClueController.java | 6 +- .../module/dao/DeliveryRecordRepository.java | 17 +++- .../com/baiye/module/service/ClueService.java | 17 ++-- .../module/service/DeliveryRecordService.java | 10 ++- .../module/service/impl/ClueServiceImpl.java | 63 +++++++------- .../impl/DeliveryRecordServiceImpl.java | 17 +++- .../java/com/baiye/task/MailSourceTask.java | 79 +++++++++++------- .../java/com/baiye/util/DecryptPnoUtil.java | 30 +++++++ .../src/main/resources/application-prod.yml | 3 +- .../src/main/resources/application-test.yml | 2 + 21 files changed, 355 insertions(+), 111 deletions(-) create mode 100644 ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CompressUtil.java diff --git a/ad-platform-common/ad-platform-common-core/pom.xml b/ad-platform-common/ad-platform-common-core/pom.xml index ffc263e2..4321618b 100644 --- a/ad-platform-common/ad-platform-common-core/pom.xml +++ b/ad-platform-common/ad-platform-common-core/pom.xml @@ -123,6 +123,10 @@ mail + + net.lingala.zip4j + zip4j + diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CacheKey.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CacheKey.java index 579b5c47..6291b1df 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CacheKey.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CacheKey.java @@ -56,4 +56,10 @@ public interface CacheKey { * 数据字典 */ String DICT_NAME = "dict::name:"; + + + /** + * dmp请求批次 + */ + String DMP_REQUEST_ID = "dmp::request::id"; } diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CompressUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CompressUtil.java new file mode 100644 index 00000000..51d2d951 --- /dev/null +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/CompressUtil.java @@ -0,0 +1,83 @@ +package com.baiye.util; + +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import net.lingala.zip4j.core.ZipFile; +import net.lingala.zip4j.exception.ZipException; +import net.lingala.zip4j.model.ZipParameters; +import net.lingala.zip4j.util.Zip4jConstants; + +import java.io.File; +import java.util.ArrayList; + +/** + * @author Enzo + * @date : 2022/10/24 + */ +public class CompressUtil { + private CompressUtil() { + } + + /** + * @param zipPath 压缩文件路径 + * @param filepath 文件路径 + * @param password 压缩密码 + */ + public static void decryptionCompression(String zipPath, String filepath, String password) { + try { + //创建压缩文件 + ZipFile zipFile = new ZipFile(zipPath); + ArrayList files = new ArrayList<>(); + files.add(new File(filepath)); + + //设置压缩文件参数 + ZipParameters parameters = new ZipParameters(); + //设置压缩方法 + parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); + + //设置压缩级别 + //DEFLATE_LEVEL_FASTEST - Lowest compression level but higher speed of compression + //DEFLATE_LEVEL_FAST - Low compression level but higher speed of compression + //DEFLATE_LEVEL_NORMAL - Optimal balance between compression level/speed + //DEFLATE_LEVEL_MAXIMUM - High compression level with a compromise of speed + //DEFLATE_LEVEL_ULTRA - Highest compression level but low speed + parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); + + //设置压缩文件加密 + parameters.setEncryptFiles(true); + + //设置加密方法 + parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); + + //设置aes加密强度 + parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); + + //设置密码 + parameters.setPassword(password); + + //添加文件到压缩文件 + zipFile.addFiles(files, parameters); + } catch (ZipException e) { + e.printStackTrace(); + } + } + + public static String unzipFiles(String fileUrl, String zipPath, String password) throws ZipException { + File file = new File(zipPath); + ZipFile zipFile = new ZipFile(file); + //设置文件编码,根据实际场景 + zipFile.setFileNameCharset(CharsetUtil.GBK); + if (zipFile.isEncrypted()) { + zipFile.setPassword(password); + } + String uuid = IdUtil.randomUUID(); + String filePath + = fileUrl.concat(StrPool.SLASH).concat(uuid); + zipFile.extractAll(filePath); + return filePath; + } + + +} diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MailUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MailUtil.java index 872bfde4..a8575238 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MailUtil.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MailUtil.java @@ -1,10 +1,14 @@ package com.baiye.util; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.CharsetUtil; +import com.baiye.constant.DefaultNumberConstants; import com.baiye.exception.BadRequestException; +import com.baiye.exception.CallException; import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; import javax.activation.DataHandler; import javax.activation.FileDataSource; @@ -12,12 +16,16 @@ import javax.mail.*; import javax.mail.internet.*; import java.io.*; import java.nio.file.Files; -import java.util.*; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Properties; /** * @author Enzo * @date 2022-10-22 13:49:33 */ +@Slf4j public class MailUtil { private MailUtil() { @@ -25,6 +33,7 @@ public class MailUtil { /** * 结合邮件返回 + * * @param username * @param password * @return @@ -43,11 +52,11 @@ public class MailUtil { Message[] messages = inbox.getMessages(); list.addAll(Arrays.asList(messages)); } catch (NoSuchProviderException e) { - e.printStackTrace(); - System.exit(1); + log.error("======================= open mail error time {} ==================", DateUtil.date()); + throw new CallException("没有找到该服务"); } catch (MessagingException e) { - e.printStackTrace(); - System.exit(2); + log.error("======================= open mail error time {} ==================", DateUtil.date()); + throw new CallException("获取邮箱失败"); } return list; } @@ -55,7 +64,7 @@ public class MailUtil { /** * 创建一封复杂邮件(文本+图片+附件) */ - public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String filename, String taskName, String customerId) throws Exception { + public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String filename, String taskName) throws Exception { // 1. 创建邮件对象 MimeMessage message = new MimeMessage(session); @@ -66,14 +75,14 @@ public class MailUtil { message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail, receiveMail, CharsetUtil.UTF_8)); // 4. Subject: 邮件主题 - message.setSubject(customerId, CharsetUtil.UTF_8); + message.setSubject(taskName, CharsetUtil.UTF_8); /* * 下面是邮件内容的创建: */ // 6. 创建文本“节点” - MimeBodyPart text = new MimeBodyPart(); + /*MimeBodyPart text = new MimeBodyPart(); // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片 text.setContent(taskName, "text/html;charset=UTF-8"); @@ -87,7 +96,7 @@ public class MailUtil { // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart, // 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart MimeBodyPart textImage = new MimeBodyPart(); - textImage.setContent(mmTextImage); + textImage.setContent(mmTextImage);*/ // 9. 创建附件“节点” MimeBodyPart attachment = new MimeBodyPart(); @@ -100,7 +109,7 @@ public class MailUtil { // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart ) MimeMultipart mm = new MimeMultipart(); - mm.addBodyPart(textImage); + // mm.addBodyPart(textImage); // 如果有多个附件,可以创建多个多次添加 mm.addBodyPart(attachment); // 混合关系 @@ -118,7 +127,7 @@ public class MailUtil { return message; } - public static void sendMail(String username, String password, String toUsername, String fileName, String customerId, String taskName) { + public static void sendMail(String username, String password, String toUsername, String fileName, String taskName) { try { // 1. 创建参数配置, 用于连接邮件服务器的参数配置 @@ -141,7 +150,7 @@ public class MailUtil { session.setDebug(Boolean.FALSE); // 3. 创建一封邮件 - MimeMessage message = createMimeMessage(session, username, toUsername, fileName, taskName, customerId); + MimeMessage message = createMimeMessage(session, username, toUsername, fileName, taskName); // 4. 根据 Session 获取邮件传输对象 Transport transport = session.getTransport(); @@ -175,7 +184,7 @@ public class MailUtil { } } } - return ""; + return CharSequenceUtil.EMPTY; } @@ -215,7 +224,10 @@ public class MailUtil { private static String saveFile(String fileName, InputStream in, String path) { String osName = System.getProperty("os.name"); - + File file = new File(path); + if (!file.exists()) { + file.mkdirs(); + } String separator; if (osName == null) { osName = ""; @@ -226,7 +238,8 @@ public class MailUtil { separator = "/"; } File storeFile = new File(path + separator + fileName); - try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(storeFile.toPath())); BufferedInputStream bis = new BufferedInputStream(in)) { + try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(storeFile.toPath())); + BufferedInputStream bis = new BufferedInputStream(in)) { int c; while ((c = bis.read()) != -1) { bos.write(c); @@ -238,4 +251,20 @@ public class MailUtil { return storeFile.getPath(); } + /** + * 获得邮件发件人 + * + * @param msg 邮件内容 + * @return + * @throws MessagingException + * @throws UnsupportedEncodingException + */ + public static String getFrom(MimeMessage msg) throws MessagingException { + Address[] froms = msg.getFrom(); + if (froms.length < DefaultNumberConstants.ONE_NUMBER) + throw new MessagingException("没有发件人!"); + InternetAddress address = (InternetAddress) froms[DefaultNumberConstants.ZERO_NUMBER]; + return address.getAddress(); + } + } diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MobileUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MobileUtil.java index c25a6c72..f73fcdb7 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MobileUtil.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/MobileUtil.java @@ -55,9 +55,7 @@ public class MobileUtil { public static boolean checkChinaMobile(String phone) { if (StringUtils.isNotBlank(phone)) { Pattern regexp = Pattern.compile(CHINA_MOBILE_PATTERN); - if (regexp.matcher(phone).matches()) { - return true; - } + return regexp.matcher(phone).matches(); } return false; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/config/properties/DeliveryProperties.java b/manage/ad-platform-management/src/main/java/com/baiye/config/properties/DeliveryProperties.java index 69f6a9ee..bb572ad3 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/config/properties/DeliveryProperties.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/config/properties/DeliveryProperties.java @@ -17,6 +17,9 @@ public class DeliveryProperties { @ApiModelProperty("文件地址") private String fileUrl; + @ApiModelProperty("压缩密码") + private String zipPassword; + @ApiModelProperty("customerId") private String customerId; diff --git a/manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java b/manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java index 2a50b3fd..8d97bbf5 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java @@ -2,19 +2,23 @@ package com.baiye.timed; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.text.StrPool; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.baiye.config.properties.DeliveryProperties; import com.baiye.constant.DefaultNumberConstants; -import com.baiye.modules.system.domain.*; -import com.baiye.modules.system.service.*; +import com.baiye.modules.system.domain.Company; +import com.baiye.modules.system.domain.PayFatherTemplate; +import com.baiye.modules.system.domain.TaskImei; +import com.baiye.modules.system.service.CompanyService; +import com.baiye.modules.system.service.DeliveryRecordService; +import com.baiye.modules.system.service.PayFatherTemplateService; +import com.baiye.modules.system.service.TaskImeiService; import com.baiye.modules.system.service.dto.ImeiDTO; -import com.baiye.util.CSVFileUtil; -import com.baiye.util.MailUtil; +import com.baiye.util.*; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -36,10 +41,14 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class DeliveryBalanceTask { + + private final RedisUtils redisUtils; + private final CompanyService companyService; private final TaskImeiService taskImeiService; + private final DeliveryProperties deliveryProperties; private final DeliveryRecordService deliveryRecordService; @@ -59,6 +68,7 @@ public class DeliveryBalanceTask { for (Map.Entry> map : listMap.entrySet()) { Long taskId = map.getKey(); List list = listMap.get(taskId); + log.info("=================== the task Id as {},upload size as {} ====================", taskId, list.size()); Long userId = list.get(DefaultNumberConstants.ZERO_NUMBER).getUserId(); Company companyByUserId = companyService.findCompanyByUserId(userId); if (ObjectUtil.isNotNull(companyByUserId) @@ -83,23 +93,36 @@ public class DeliveryBalanceTask { continue; } String fileUrl = deliveryProperties.getFileUrl(); + Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID); // 转换DTO List toList = Convert.toList(ImeiDTO.class, taskImeiList); - String taskImeiName = IdUtil.fastUUID(); + String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + Integer batch = ObjectUtil.isNull(num) ? DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER; + String taskImeiName = "BY".concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch)); + + String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName); // 保存文件 - String filePath = fileUrl.concat(StrPool.SLASH).concat(taskImeiName).concat(".csv"); - CSVFileUtil.createCsvFile(toList, filePath); + String csvPath = file.concat(".csv"); + CSVFileUtil.createCsvFile(toList, csvPath); + String zipPath = file.concat(".zip"); + // 设置压缩文件 + CompressUtil.decryptionCompression + (zipPath, csvPath, deliveryProperties.getZipPassword()); // 发送邮件 MailUtil.sendMail(deliveryProperties.getEmailAddress(), deliveryProperties.getEmailPassword(), - deliveryProperties.getToEmailAddress(), filePath, - deliveryProperties.getCustomerId(), taskImeiName); + deliveryProperties.getToEmailAddress(), zipPath, taskImeiName); + // 保存批次号 + redisUtils.set(CacheKey.DMP_REQUEST_ID, batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS); // 修改状态 修改余额 taskImeiService.updateBath(taskId, taskImeiName, DefaultNumberConstants.ONE_NUMBER); - deliveryRecordService.saveDeliveryRecord(filePath, taskImeiName, taskImeiList.size(), taskId, userId); + deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, taskImeiList.size(), taskId, userId); companyService.updateUserBalanceByCompanyId(sub.doubleValue(), companyByUserId.getId()); + // 删除文件 - FileUtil.del(filePath); + FileUtil.del(csvPath); + FileUtil.del(zipPath); + log.info("=========================== the csv path as {}, zip path as {} ========================", csvPath, zipPath); } } } diff --git a/manage/ad-platform-management/src/main/resources/config/application-dev.yml b/manage/ad-platform-management/src/main/resources/config/application-dev.yml index 4e33f7b6..f3e447ea 100644 --- a/manage/ad-platform-management/src/main/resources/config/application-dev.yml +++ b/manage/ad-platform-management/src/main/resources/config/application-dev.yml @@ -173,11 +173,12 @@ debt: platform: authToken: JI8AeA7POKsdGcBC + zipPassword: DB2022hjk213v1... fileUrl: /home/eladmin/mail/upload emailAddress: ensoze@outlook.com emailPassword: baiye2022 - toEmailAddress: ggggod_2022@outlook.com customerId: QISX0xz4l6fR3YL2sUNSpzM2 + toEmailAddress: ggggod_2022@outlook.com # 巨量引擎配置 ocean: diff --git a/manage/ad-platform-management/src/main/resources/config/application-prod.yml b/manage/ad-platform-management/src/main/resources/config/application-prod.yml index 9e8b3e72..c1039059 100644 --- a/manage/ad-platform-management/src/main/resources/config/application-prod.yml +++ b/manage/ad-platform-management/src/main/resources/config/application-prod.yml @@ -173,6 +173,7 @@ debt: platform: authToken: nqJpVSf3UcrEcVIH + zipPassword: DB2022hjk213v1... fileUrl: /home/eladmin/mail/upload emailAddress: ensoze@outlook.com emailPassword: baiye2022 diff --git a/pom.xml b/pom.xml index c34b9240..75c22380 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 23.0 5.23 0.11.1 + 1.3.2 5.1.1 1.5.4 1.1.24 @@ -247,6 +248,12 @@ mail ${mail.version} + + + net.lingala.zip4j + zip4j + ${zip4j.version} + diff --git a/services/ad-platform-source/src/main/java/com/baiye/config/properties/DeliveryProperties.java b/services/ad-platform-source/src/main/java/com/baiye/config/properties/DeliveryProperties.java index 24cd619f..b19f4a1d 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/config/properties/DeliveryProperties.java +++ b/services/ad-platform-source/src/main/java/com/baiye/config/properties/DeliveryProperties.java @@ -14,6 +14,9 @@ import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "platform") public class DeliveryProperties { + @ApiModelProperty("压缩密码") + private String zipPassword; + @ApiModelProperty("文件地址") private String fileUrl; diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java index 19b6bcc4..1e8130f1 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java @@ -202,11 +202,7 @@ public class ClueController { return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto); } - @PostMapping("/dmp/exchange") - @ApiOperation("dmp资源兑换") - public CommonResponse dmpClueExchange() { - return clueService.dmpClueExchange(); - } + @PostMapping("/count/memberStatus") @ApiOperation("未分配线索的总条数") diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/DeliveryRecordRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/DeliveryRecordRepository.java index 67ccf57b..4f9f354f 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/DeliveryRecordRepository.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/DeliveryRecordRepository.java @@ -3,6 +3,10 @@ package com.baiye.module.dao; import com.baiye.module.entity.DeliveryRecord; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; /** * @author Enzo @@ -15,5 +19,16 @@ public interface DeliveryRecordRepository extends JpaRepository findByTaskName(String taskName); + + /** + * 修改状态 + * @param num + * @param taskName + * @return + */ + @Modifying + @Query("UPDATE DeliveryRecord d set d.status = ?1 where d.taskName = ?2") + int updateStatus(Integer num, String taskName); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java index 34040c84..0f560e56 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java @@ -232,12 +232,6 @@ public interface ClueService { */ CommonResponse reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto); - /** - * dmp资源兑换 - * - * @return - */ - CommonResponse dmpClueExchange(); /** * 未分配线索的总条数 @@ -249,12 +243,21 @@ public interface ClueService { /** * 任务查找数量 - * * @param taskId * @return */ Integer findTaskNum(Long taskId); + /** + * 保存线索 + * + * @param phoneList + * @param taskId + * @param userId + * @param num + */ + void saveClue(List phoneList, Long taskId, Long userId, Integer num); + /** * 将拓客的线索回流到crm * diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/DeliveryRecordService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/DeliveryRecordService.java index 1142bc5c..8a2a6d87 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/DeliveryRecordService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/DeliveryRecordService.java @@ -10,8 +10,16 @@ public interface DeliveryRecordService { /** * 任务名称查找记录 + * @param taskName taskName + * @return 发送记录 + */ + DeliveryRecord findByTaskName(String taskName); + + /** + * 修改状态 + * @param num num * @param taskName * @return */ - DeliveryRecord findByTaskName(String taskName); + Boolean updateStatusByTaskName(Integer num, String taskName); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java index b31c033b..fd797f6c 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java @@ -704,40 +704,6 @@ public class ClueServiceImpl implements ClueService { return CommonResponse.createBySuccess(list); } - @Override - @Transactional(rollbackFor = Exception.class) - public CommonResponse dmpClueExchange() { - /*//条件 任务id - Long taskId = null; - List taskImeiList = taskImeiRepository.findAllByTaskId(taskId); - if (CollUtil.isNotEmpty(taskImeiList)) { - List clues = new ArrayList<>(); - //需要业务管理员用户id - Long userId = null; - for (TaskImei taskImei : taskImeiList) { - String imei = taskImei.getImei(); - //TODO imei解密 - String nid = ""; - - Clue clue = new Clue(); - clue.setNid(nid); - clue.setOrigin(5); - clue.setCreateBy(userId); - clues.add(clue); - } - //将imei转为线索 - saveClue(clues, taskId, DefaultNumberConstants.FOUR_NUMBER); - //修改任务总条数 - Integer taskNum = clueMiddleRepository.findTaskNum(taskId); - Task task = new Task(); - task.setId(taskId); - task.setTotalNumber(taskNum); - task.setIsDistribution(1); - taskClient.updateTask(task); - } -*/ - return null; - } @Override public Map countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) { @@ -799,6 +765,7 @@ public class ClueServiceImpl implements ClueService { taskClient.updateTask(task); } + private List> getOrganizeInfo(String startTime, String endTime, List organizeIds) { List clueMiddles = clueMiddleRepository.queryAllByTimeAndorganizeIds(startTime, endTime, organizeIds); Set ids = clueMiddles.stream().map(ClueMiddle::getOrganizeId).collect(Collectors.toSet()); @@ -1003,4 +970,32 @@ public class ClueServiceImpl implements ClueService { } return str; } + + + @Override + public void saveClue(List phoneList, Long taskId, Long userId, Integer num) { + if (CollUtil.isNotEmpty(phoneList)) { + for (String phone : phoneList) { + if (StringUtils.isNotBlank(phone)) { + boolean bool = MobileUtil.checkPhone(phone); + if (bool) { + Clue clue = new Clue(); + clue.setNid(phone); + clue.setCreateBy(userId); + clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER); + Clue save = clueRepository.save(clue); + ClueMiddle clueMiddle = new ClueMiddle(); + clueMiddle.setClueId(save.getId()); + clueMiddle.setClueType(num); + clueMiddle.setTaskId(taskId); + clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER); + clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER); + clueMiddleRepository.save(clueMiddle); + } + } + } + } + } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DeliveryRecordServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DeliveryRecordServiceImpl.java index 75093316..b17759cf 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DeliveryRecordServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DeliveryRecordServiceImpl.java @@ -1,5 +1,7 @@ package com.baiye.module.service.impl; +import cn.hutool.core.collection.CollUtil; +import com.baiye.constant.DefaultNumberConstants; import com.baiye.module.dao.DeliveryRecordRepository; import com.baiye.module.entity.DeliveryRecord; import com.baiye.module.service.DeliveryRecordService; @@ -7,6 +9,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.List; + /** * @author Enzo * @date : 2022/10/22 @@ -20,7 +24,18 @@ public class DeliveryRecordServiceImpl implements DeliveryRecordService { @Override public DeliveryRecord findByTaskName(String taskName) { - return deliveryRecordRepository.findByTaskName(taskName); + // 防止重复提交数据 + List byTaskName = + deliveryRecordRepository.findByTaskName(taskName); + if (CollUtil.isNotEmpty(byTaskName)) { + return byTaskName.get(DefaultNumberConstants.ZERO_NUMBER); + } + return null; + } + + @Override + public Boolean updateStatusByTaskName(Integer num, String taskName) { + return deliveryRecordRepository.updateStatus(num, taskName) > DefaultNumberConstants.ZERO_NUMBER; } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/task/MailSourceTask.java b/services/ad-platform-source/src/main/java/com/baiye/task/MailSourceTask.java index 9be908c7..d2cc8099 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/task/MailSourceTask.java +++ b/services/ad-platform-source/src/main/java/com/baiye/task/MailSourceTask.java @@ -1,35 +1,43 @@ package com.baiye.task; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.text.StrPool; import cn.hutool.core.text.csv.CsvData; import cn.hutool.core.text.csv.CsvReader; -import cn.hutool.core.text.csv.CsvRow; import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.util.ObjectUtil; import com.baiye.config.properties.DeliveryProperties; import com.baiye.constant.DefaultNumberConstants; import com.baiye.exception.BadRequestException; import com.baiye.feign.TaskClient; -import com.baiye.module.entity.Clue; import com.baiye.module.entity.DeliveryRecord; import com.baiye.module.entity.Task; import com.baiye.module.service.ClueService; import com.baiye.module.service.DeliveryRecordService; +import com.baiye.module.service.dto.SecretResponseBean; +import com.baiye.util.CompressUtil; +import com.baiye.util.DecryptPnoUtil; import com.baiye.util.MailUtil; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; import com.google.common.collect.Lists; -import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.mail.Flags; import javax.mail.Message; -import java.util.Date; +import javax.mail.internet.MimeMessage; +import java.io.File; import java.util.List; +import java.util.Objects; /** * @author Enzo @@ -49,58 +57,71 @@ public class MailSourceTask { private final DeliveryRecordService deliveryRecordService; - @Scheduled(cron = "0 0/1 * * * ? ") + @Scheduled(cron = "0 0/10 * * * ? ") @Transactional(rollbackFor = Exception.class) public void receiveMail() { // 获取邮件内容 List list = MailUtil.readMailByIMAP - (deliveryProperties.getEmailAddress(), - deliveryProperties.getEmailPassword()); + (deliveryProperties.getEmailAddress(), deliveryProperties.getEmailPassword()); if (CollUtil.isNotEmpty(list)) { try { for (Message message : list) { // 获取邮件的状态 Flags flags = message.getFlags(); // 获取未读的邮件内容 且与之对应 - if (!flags.contains(Flags.Flag.SEEN) - && deliveryProperties.getCustomerId().equals(message.getSubject())) { - String body = MailUtil.getBody(message); - // 获取文件内容 - String taskName = body.substring - (body.indexOf(">") + DefaultNumberConstants.ONE_NUMBER); - + if (!flags.contains(Flags.Flag.SEEN) && + deliveryProperties.getToEmailAddress().equalsIgnoreCase + (MailUtil.getFrom((MimeMessage) message))) { + String taskName = message.getSubject(); // 内容获取发送请求 - DeliveryRecord byTaskName = - deliveryRecordService.findByTaskName(taskName); - if (ObjectUtil.isNotNull(byTaskName)) { + DeliveryRecord byTaskName = deliveryRecordService.findByTaskName(taskName); + if (ObjectUtil.isNotNull(byTaskName) + && byTaskName.getStatus() == DefaultNumberConstants.ZERO_NUMBER) { Task task = new Task(); Long taskId = byTaskName.getTaskId(); CsvReader reader = CsvUtil.getReader(); - List clues = Lists.newArrayList(); + List phoneList = Lists.newArrayList(); + List decryptionList = Lists.newArrayList(); // 解析附件内容并保存文件 String path = MailUtil.saveAttachMent (message, deliveryProperties.getFileUrl()); + // 解压文件 + String unzipPath = + CompressUtil.unzipFiles(deliveryProperties.getFileUrl(), + path, deliveryProperties.getZipPassword()); + File file = new File(unzipPath); + File parseFile = Objects.requireNonNull + (file.listFiles())[DefaultNumberConstants.ZERO_NUMBER]; // 解析文件 - CsvData data = reader.read(FileUtil.file(path)); - List rows = data.getRows(); - for (CsvRow row : rows) { - Clue clue = new Clue(); - clue.setNid(row.get(DefaultNumberConstants.ZERO_NUMBER)); - clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER); - clue.setCreateBy(byTaskName.getUserId()); - clues.add(clue); + CsvData data = reader.read(parseFile); + + data.getRows().forEach(clue -> decryptionList.add + (clue.get(DefaultNumberConstants.ZERO_NUMBER))); + List> partitions = ListUtil.partition + (decryptionList, DefaultNumberConstants.TWO_HUNDRED); + for (List partition : partitions) { + String join = Joiner.on(StrPool.COMMA).join(partition); + SecretResponseBean responseBean + = DecryptPnoUtil.batchDecryptPno(Base64.encode + (StringUtils.substringBeforeLast(join, StrPool.COMMA))); + String phoneStr = Base64.decodeStr(responseBean.getTels()); + phoneList.addAll(Splitter.on(StrPool.COMMA).splitToList(phoneStr)); } // 将imei转为线索 - clueService.saveClue(clues, byTaskName.getTaskId(), DefaultNumberConstants.FOUR_NUMBER); + clueService.saveClue(phoneList, byTaskName.getTaskId(), + byTaskName.getUserId(), DefaultNumberConstants.FOUR_NUMBER); // 修改任务总条数 Integer taskNum = clueService.findTaskNum(taskId); task.setId(taskId); task.setTotalNumber(taskNum); task.setIsDistribution(DefaultNumberConstants.ONE_NUMBER); + + // 删除邮件 删除文件 + FileUtil.del(path); + FileUtil.del(unzipPath); taskClient.updateTask(task); - // 删除邮件 message.setFlag(Flags.Flag.DELETED, Boolean.TRUE); - FileUtil.del(path); + deliveryRecordService.updateStatusByTaskName(DefaultNumberConstants.ONE_NUMBER, taskName); } } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java b/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java index 1b23791c..cbcb91b8 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java +++ b/services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java @@ -2,6 +2,7 @@ package com.baiye.util; import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Console; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.Header; @@ -58,4 +59,33 @@ public class DecryptPnoUtil { + SecretConstant.SECRET_DECRYPT_YY_SIG + DateUtil.format(new Date(), SecretConstant.SECRET_DECRYPT_TIME_FORMATE)); } + + + + /** + * 批量解密 + * + * @param origins 待处理的加密数据 + * @return 处理后的解密数据 + */ + public static SecretResponseBean batchDecryptPno(String origins) { + + + HashMap paramMap = new HashMap<>(); + paramMap.put("sig", createSig()); + paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID); + paramMap.put("tels", origins); + + //链式构建请求 + String result = HttpRequest.post(SecretConstant.SECRET_DECRYPT_YY_URL) + .header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE) + .form(paramMap) + .timeout(2_000) + .execute().body(); + + Console.log(result); + + // 解析响应内容 + return JSONUtil.toBean(result, SecretResponseBean.class); + } } diff --git a/services/ad-platform-source/src/main/resources/application-prod.yml b/services/ad-platform-source/src/main/resources/application-prod.yml index bf2282f4..5ef2a8a5 100644 --- a/services/ad-platform-source/src/main/resources/application-prod.yml +++ b/services/ad-platform-source/src/main/resources/application-prod.yml @@ -80,8 +80,9 @@ save: ThreadNamePrefix: SaveFileTaskExecutor- platform: + zipPassword: DB2022hjk213v1... fileUrl: /home/eladmin/mail/down emailAddress: ensoze@outlook.com emailPassword: baiye2022 customerId: QISX0xz4l6fR3YL2sUNSpzM2 - + toEmailAddress: ggggod_2022@outlook.com diff --git a/services/ad-platform-source/src/main/resources/application-test.yml b/services/ad-platform-source/src/main/resources/application-test.yml index 156f7d5a..f319b370 100644 --- a/services/ad-platform-source/src/main/resources/application-test.yml +++ b/services/ad-platform-source/src/main/resources/application-test.yml @@ -80,7 +80,9 @@ save: ThreadNamePrefix: SaveFileTaskExecutor- platform: + zipPassword: DB2022hjk213v1... fileUrl: /home/eladmin/mail/down emailAddress: ensoze@outlook.com emailPassword: baiye2022 customerId: QISX0xz4l6fR3YL2sUNSpzM2 + toEmailAddress: ggggod_2022@outlook.com