增加邮件内容

master
bynt 2 years ago
parent 573f009f43
commit 948bccee7c

@ -118,6 +118,11 @@
<artifactId>emoji-java</artifactId>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</dependency>
</dependencies>

@ -131,6 +131,12 @@ public class DefaultNumberConstants {
public static final int TWO_HUNDRED = 200;
/**
* 500
*/
public static final int FIVE_HUNDRED = 500;
/**
* 201
*/

@ -0,0 +1,241 @@
package com.baiye.util;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.CharsetUtil;
import com.baiye.exception.BadRequestException;
import com.google.common.collect.Lists;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
/**
* @author Enzo
* @date 2022-10-22 13:49:33
*/
public class MailUtil {
private MailUtil() {
}
/**
*
* @param username
* @param password
* @return
*/
public static List<Message> readMailByIMAP(String username, String password) {
List<Message> list = Lists.newArrayList();
Properties props = System.getProperties();
//设置电子邮件协议
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("outlook.office365.com", username, password);
Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.getMessages();
list.addAll(Arrays.asList(messages));
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.exit(1);
} catch (MessagingException e) {
e.printStackTrace();
System.exit(2);
}
return list;
}
/**
* ++
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String filename, String taskName, String customerId) throws Exception {
// 1. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, sendMail, CharsetUtil.UTF_8));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail, receiveMail, CharsetUtil.UTF_8));
// 4. Subject: 邮件主题
message.setSubject(customerId, CharsetUtil.UTF_8);
/*
* :
*/
// 6. 创建文本“节点”
MimeBodyPart text = new MimeBodyPart();
// 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
text.setContent(taskName, "text/html;charset=UTF-8");
// 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
MimeMultipart mmTextImage = new MimeMultipart();
mmTextImage.addBodyPart(text);
// 关联关系
mmTextImage.setSubType("related");
// 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
// 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
// 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
MimeBodyPart textImage = new MimeBodyPart();
textImage.setContent(mmTextImage);
// 9. 创建附件“节点”
MimeBodyPart attachment = new MimeBodyPart();
// 读取本地文件
DataHandler dh2 = new DataHandler(new FileDataSource(filename));
// 将附件数据添加到“节点”
attachment.setDataHandler(dh2);
// 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
// 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(textImage);
// 如果有多个附件,可以创建多个多次添加
mm.addBodyPart(attachment);
// 混合关系
mm.setSubType("mixed");
// 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
message.setContent(mm);
// 12. 设置发件时间
message.setSentDate(new Date());
// 13. 保存上面的所有设置
message.saveChanges();
return message;
}
public static void sendMail(String username, String password, String toUsername, String fileName, String customerId, String taskName) {
try {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
// 参数配置
Properties props = new Properties();
// 使用的协议JavaMail规范要求
props.setProperty("mail.transport.protocol", "smtp");
// 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.host", "smtp.office365.com");
// 需要请求认证
props.setProperty("mail.smtp.auth", "true");
// 开启STARTTLS
props.setProperty("mail.smtp.starttls.enable", "true");
// 开启 SSL 连接, 以及更详细的发送步骤请看上一篇: 基于 JavaMail 的 Java 邮件发送:简单邮件发送
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
// 设置为debug模式, 可以查看详细的发送 log
session.setDebug(Boolean.FALSE);
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, username, toUsername, fileName, taskName, customerId);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器
// 这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
transport.connect(username, password);
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static String getBody(Part part) throws MessagingException, IOException {
if (part.isMimeType("text/*")) {
return part.getContent().toString();
}
if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
String body = getBody(bodyPart);
if (!body.isEmpty()) {
return body;
}
}
}
return "";
}
public static String saveAttachMent(Part part, String path) throws Exception {
String fileName;
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null) &&
((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
if (fileName.toLowerCase().contains("gb2312")) {
fileName = MimeUtility.decodeText(fileName);
}
return saveFile(fileName, mpart.getInputStream(), path);
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart, path);
} else {
fileName = mpart.getFileName();
if ((fileName != null) && (fileName.toLowerCase().contains("GB2312"))) {
fileName = MimeUtility.decodeText(fileName);
return saveFile(fileName, mpart.getInputStream(), path);
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent(), path);
}
return CharSequenceUtil.EMPTY;
}
/**
*
*/
private static String saveFile(String fileName, InputStream in, String path) {
String osName = System.getProperty("os.name");
String separator;
if (osName == null) {
osName = "";
}
if (osName.toLowerCase().contains("win")) {
separator = "\\";
} else {
separator = "/";
}
File storeFile = new File(path + separator + fileName);
try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(storeFile.toPath())); BufferedInputStream bis = new BufferedInputStream(in)) {
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
} catch (Exception exception) {
throw new BadRequestException("文件保存失败!");
}
return storeFile.getPath();
}
}

@ -7,8 +7,8 @@ spring:
cloud:
nacos:
discovery:
# server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:172.16.190.245}:${NACOS_PORT:8848}
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
# server-addr: ${NACOS_HOST:172.16.190.245}:${NACOS_PORT:8848}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml

@ -0,0 +1,47 @@
package com.baiye.model.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseDeliveryRecord {
@ApiModelProperty("任务id")
@Column(name = "task_id")
private Long taskId;
@ApiModelProperty("用户id")
@Column(name = "user_id")
private Long userId;
@ApiModelProperty("任务名称")
@Column(name = "task_name")
private String taskName;
@Column(name = "status")
private Integer status;
@ApiModelProperty("上传链接")
@Column(name = "upload_url")
private String uploadUrl;
@ApiModelProperty("下载链接")
@Column(name = "down_url")
private String downUrl;
@ApiModelProperty("任务数量")
@Column(name = "num")
private Integer num;
}

@ -0,0 +1,35 @@
package com.baiye.config.properties;
import lombok.Data;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "platform")
public class DeliveryProperties {
@ApiModelProperty("文件地址")
private String fileUrl;
@ApiModelProperty("customerId")
private String customerId;
@ApiModelProperty("emailAddress")
private String emailAddress;
@ApiModelProperty("emailPassword")
private String emailPassword;
@ApiModelProperty("toEmailAddress")
private String toEmailAddress;
@ApiModelProperty("回调地址")
private String responseUrl;
}

@ -159,6 +159,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/pay/aliPay/pay-notify").permitAll()
.antMatchers("/api/oceanEngine/callback").permitAll()
.antMatchers("/api/oceanEngine/select/**").permitAll()
.antMatchers("/api/taskImei/**").permitAll()
// 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型
// GET
.antMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])).permitAll()

@ -0,0 +1,31 @@
package com.baiye.modules.system.domain;
import com.baiye.model.entity.BaseDeliveryRecord;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Getter
@Setter
@Entity
@Table(name = "tb_delivery_record")
@ApiModel(value = "DeliveryRecord")
public class DeliveryRecord extends BaseDeliveryRecord implements Serializable {
private static final long serialVersionUID = 824742721180952896L;
@Id
@ApiModelProperty(value = "线索表主键id自动递增")
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}

@ -43,6 +43,13 @@ public class PayFatherTemplate implements Serializable {
@ApiModelProperty(value = "双呼费用")
private Double doubleCallFee;
@Column(name = "dmp_delivery_fee")
@NotNull(message = "投流费用", groups = {AddGroup.class})
@ApiModelProperty(value = "投流费用")
private Double dmpDeliveryFee;
@Column(name = "roll_call_fee")
@NotNull(message = "点呼费用不能为空", groups = {AddGroup.class})
@ApiModelProperty(value = "点呼费用")

@ -1,4 +1,4 @@
package com.baiye.module.entity;
package com.baiye.modules.system.domain;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
@ -8,6 +8,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
/**
* @author jt
@ -24,6 +25,10 @@ public class TaskImei implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "user_id")
@Column(name = "user_id")
private Long userId;
@Column(name = "task_id")
@ApiModelProperty(value = "动态任务id")
@JsonSerialize(using = ToStringSerializer.class)
@ -33,7 +38,25 @@ public class TaskImei implements Serializable {
@ApiModelProperty(value = "imei")
private String imei;
@Column(name = "status")
@ApiModelProperty(value = "状态 0-未兑换 1-已兑换")
private Integer status;
@Column(name = "task_name")
@ApiModelProperty(value = "任务名称")
private String taskName;
@Column(name = "tag")
@ApiModelProperty(value = "tag")
private String tag;
@Column(name = "create_time")
@ApiModelProperty(value = "createTime")
private Date createTime;
@Column(name = "update_time")
@ApiModelProperty(value = "updateTime")
private Date updateTime;
}

@ -0,0 +1,13 @@
package com.baiye.modules.system.repository;
import com.baiye.modules.system.domain.DeliveryRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author Enzo
* @date : 2022/10/18
*/
public interface DeliveryRecordRepository extends
JpaRepository<DeliveryRecord, Long>, JpaSpecificationExecutor<DeliveryRecord> {
}

@ -0,0 +1,56 @@
package com.baiye.modules.system.repository;
import cn.hutool.core.date.DateTime;
import com.baiye.modules.system.domain.TaskImei;
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 org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* @author jt
*/
@Repository
public interface TaskImeiRepository extends JpaRepository<TaskImei, Long>, JpaSpecificationExecutor<TaskImei> {
/**
* id
* @param taskId
* @return
*/
List<TaskImei> findAllByTaskId(Long taskId);
/**
*
* @param num
* @return
*/
List<TaskImei> findByStatus(Integer num);
/**
*
*
* @param status
* @param updateDate
* @param taskName
* @return
*/
@Modifying
@Query("UPDATE TaskImei i set i.status = ?1,i.updateTime = ?2 where i.taskName = ?3")
int updateImeiByTaskName(Integer status, Date updateDate, String taskName);
/**
*
* @param num
* @param taskImeiName
* @param date
* @param taskId
* @return
*/
@Modifying
@Query("UPDATE TaskImei i set i.status = ?1,i.taskName = ?2,i.updateTime = ?3 where i.taskId = ?4")
int updateImeiByTaskNameId(Integer num, String taskImeiName, DateTime date, Long taskId);
}

@ -0,0 +1,38 @@
package com.baiye.modules.system.rest;
import com.baiye.http.CommonResponse;
import com.baiye.modules.system.service.TaskImeiService;
import com.baiye.modules.system.service.dto.PlatformTransmitDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
/**
* @author Enzo
* @date : 2022/10/18
*/
@RestController
@RequiredArgsConstructor
@Api(tags = "系统:角色管理")
@RequestMapping("/api/taskImei")
public class TaskImeiController {
private final TaskImeiService taskImeiService;
@ApiOperation("修改用户")
@GetMapping("/updateImei")
public ResponseEntity<Object> update(@RequestParam("taskName") String taskName) {
taskImeiService.updateImeiByTaskName(taskName);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("接受ad-back任务资源")
@PostMapping("/callback/add")
public CommonResponse<Object> acceptAdBackSource(@RequestBody PlatformTransmitDTO transmitDTO) {
return Boolean.TRUE.equals(taskImeiService.acceptAdBackSource(transmitDTO)) ?
CommonResponse.createBySuccess() : CommonResponse.createByError();
}
}

@ -103,4 +103,11 @@ public interface CompanyService {
* @param companyId
*/
void updateCompanyTypeById(Integer companyType, Long companyId);
/**
* id
* @param userId
* @return
*/
Company findCompanyByUserId(Long userId);
}

@ -0,0 +1,19 @@
package com.baiye.modules.system.service;
/**
* @author Enzo
* @date : 2022/10/18
*/
public interface DeliveryRecordService {
/**
*
*
* @param filePath
* @param taskName
* @param num
* @param taskId
* @param userId
* @return
*/
Boolean saveDeliveryRecord(String filePath, String taskName, Integer num, Long taskId, Long userId);
}

@ -33,4 +33,10 @@ public interface PayComboService {
Object query(PayComboQueryCriteria payComboQueryCriteria);
/**
* id
* @param payComboId
* @return
*/
PayCombo findById(Long payComboId);
}

@ -0,0 +1,17 @@
package com.baiye.modules.system.service;
import com.baiye.modules.system.domain.PayComboUser;
/**
* @author Enzo
* @date : 2022/10/18
*/
public interface PayComboUserService {
/**
*
* @param userId
* @return
*/
PayComboUser findTemplateByUserId(Long userId);
}

@ -46,4 +46,11 @@ public interface PayFatherTemplateService {
* @return
*/
void replace(Long replaceId, Long templateId);
/**
* id
* @param fatherTemplateId
* @return
*/
PayFatherTemplate findById(Long fatherTemplateId);
}

@ -0,0 +1,51 @@
package com.baiye.modules.system.service;
import com.baiye.modules.system.domain.TaskImei;
import com.baiye.modules.system.service.dto.PlatformTransmitDTO;
import java.util.List;
/**
* @author Enzo
* @date : 2022/10/18
*/
public interface TaskImeiService {
/**
*
* @param num
* @return
*/
List<TaskImei> findByStatus(Integer num);
/**
*
* @param transmitDTO
* @return
*/
Boolean acceptAdBackSource(PlatformTransmitDTO transmitDTO);
/**
*
* @param taskImeiList
* @return
*/
Boolean updateBath(List<TaskImei> taskImeiList);
/**
*
* @param taskName
* @return
*/
Boolean updateImeiByTaskName(String taskName);
/**
*
* @param taskId
* @param taskImeiName
* @param num
* @return
*/
Boolean updateBath(Long taskId, String taskImeiName, Integer num);
}

@ -0,0 +1,31 @@
package com.baiye.modules.system.service.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
public class DeliveryDecryptDTO {
@ApiModelProperty(value = "16-64位ID双方协商不存会响应404")
private String customerId;
@ApiModelProperty(value = "批次任务名称")
private String taskName;
@ApiModelProperty(value = "回调地址,任务兑换完成后通知的地址")
private String respUrl;
@ApiModelProperty(value = "0为上传中1为上传结束")
private Integer taskStatus;
@ApiModelProperty(value = "内容为MD5格式每次最多500条")
private List<String> dList;
}

@ -0,0 +1,18 @@
package com.baiye.modules.system.service.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
public class DeliveryDecryptResponseDTO {
@ApiModelProperty("结果")
private Boolean result;
@ApiModelProperty("请求返回信息/错误说明")
private String msg;
}

@ -0,0 +1,25 @@
package com.baiye.modules.system.service.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/10/21
*/
@Data
public class ImeiDTO implements Serializable {
private static final long serialVersionUID = -3271582444610218303L;
@ApiModelProperty(value = "imei")
private String imei;
@ApiModelProperty(value = "tag")
private String tag;
}

@ -13,6 +13,8 @@ public class PlatformTransmitDTO {
private Long taskId;
private Long userId;
private String authToken;
private List<PlateFormDTO> list;

@ -163,4 +163,10 @@ public class CompanyServiceImpl implements CompanyService {
public void updateCompanyTypeById(Integer companyType, Long companyId) {
companyRepository.updateCompanyTypeById(companyType, companyId);
}
@Override
public Company findCompanyByUserId(Long userId) {
return companyRepository.findByUserId(userId);
}
}

@ -0,0 +1,31 @@
package com.baiye.modules.system.service.impl;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.system.domain.DeliveryRecord;
import com.baiye.modules.system.repository.DeliveryRecordRepository;
import com.baiye.modules.system.service.DeliveryRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Service
@RequiredArgsConstructor
public class DeliveryRecordServiceImpl implements DeliveryRecordService {
private final DeliveryRecordRepository deliveryRecordRepository;
@Override
public Boolean saveDeliveryRecord(String filePath, String taskName, Integer num, Long taskId, Long userId) {
DeliveryRecord deliveryRecord = new DeliveryRecord();
deliveryRecord.setNum(num);
deliveryRecord.setUserId(userId);
deliveryRecord.setTaskId(taskId);
deliveryRecord.setTaskName(taskName);
deliveryRecord.setUploadUrl(filePath);
deliveryRecord.setStatus(DefaultNumberConstants.ZERO_NUMBER);
return deliveryRecordRepository.save(deliveryRecord).getId() != null;
}
}

@ -124,5 +124,10 @@ public class PayComboServiceImpl implements PayComboService {
QueryHelp.getPredicate(root, payComboQueryCriteria, criteriaBuilder)));
}
@Override
public PayCombo findById(Long payComboId) {
return payComboRepository.findById(payComboId).orElseGet(PayCombo::new);
}
}

@ -0,0 +1,25 @@
package com.baiye.modules.system.service.impl;
import com.baiye.modules.system.domain.PayComboUser;
import com.baiye.modules.system.repository.PayComboUserRepository;
import com.baiye.modules.system.service.PayComboUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PayComboUserServiceImpl implements PayComboUserService {
private final PayComboUserRepository payComboUserRepository;
@Override
public PayComboUser findTemplateByUserId(Long userId) {
return payComboUserRepository.findTemplateByUserId(userId);
}
}

@ -1,6 +1,7 @@
package com.baiye.modules.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.modules.system.domain.Company;
@ -46,9 +47,11 @@ public class PayFatherTemplateServiceImpl implements PayFatherTemplateService {
@Transactional(rollbackFor = Exception.class)
public void add(PayFatherTemplate payFatherTemplate) {
payFatherTemplate.setStatus(DefaultNumberConstants.ZERO_NUMBER);
String deliveryFee = new DecimalFormat("#.00").format(payFatherTemplate.getDmpDeliveryFee());
String doubleCall = new DecimalFormat("#.00").format(payFatherTemplate.getDoubleCallFee());
String rollCall = new DecimalFormat("#.00").format(payFatherTemplate.getRollCallFee());
payFatherTemplate.setDoubleCallFee(Double.parseDouble(doubleCall));
payFatherTemplate.setDmpDeliveryFee(Double.parseDouble(deliveryFee));
payFatherTemplate.setRollCallFee(Double.parseDouble(rollCall));
payFatherTemplateRepository.save(payFatherTemplate);
}
@ -59,6 +62,7 @@ public class PayFatherTemplateServiceImpl implements PayFatherTemplateService {
Integer status = payFatherTemplate.getStatus();
String name = payFatherTemplate.getName();
Double doubleCallFee = payFatherTemplate.getDoubleCallFee();
Double deliveryFee = payFatherTemplate.getDmpDeliveryFee();
Double rollCallFee = payFatherTemplate.getRollCallFee();
PayFatherTemplate updateTemplate = payFatherTemplateRepository.findById(payFatherTemplate.getId()).orElseGet(PayFatherTemplate::new);
if (status != null){
@ -73,6 +77,9 @@ public class PayFatherTemplateServiceImpl implements PayFatherTemplateService {
if (rollCallFee != null){
updateTemplate.setRollCallFee(rollCallFee);
}
if (ObjectUtil.isNotNull(deliveryFee)) {
updateTemplate.setRollCallFee(deliveryFee);
}
payFatherTemplateRepository.save(updateTemplate);
}
@ -133,4 +140,9 @@ public class PayFatherTemplateServiceImpl implements PayFatherTemplateService {
companyRepository.saveAll(companyList);
}
}
@Override
public PayFatherTemplate findById(Long fatherTemplateId) {
return payFatherTemplateRepository.findById(fatherTemplateId).orElseGet(PayFatherTemplate::new);
}
}

@ -0,0 +1,86 @@
package com.baiye.modules.system.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.system.domain.TaskImei;
import com.baiye.modules.system.repository.TaskImeiRepository;
import com.baiye.modules.system.service.TaskImeiService;
import com.baiye.modules.system.service.dto.PlateFormDTO;
import com.baiye.modules.system.service.dto.PlatformTransmitDTO;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class TaskImeiServiceImpl implements TaskImeiService {
@Value("${platform.authToken}")
private String authToken;
private final TaskImeiRepository taskImeiRepository;
@Override
public List<TaskImei> findByStatus(Integer num) {
return taskImeiRepository.findByStatus(num);
}
/**
* dmp
*
* @param transmitDTO
*/
@Override
public Boolean acceptAdBackSource(PlatformTransmitDTO transmitDTO) {
if (StringUtils.isNotBlank(transmitDTO.getAuthToken())
&& transmitDTO.getAuthToken().equalsIgnoreCase(authToken)) {
List<TaskImei> imeiList = Lists.newArrayList();
for (PlateFormDTO plateForm : transmitDTO.getList()) {
TaskImei taskImei = new TaskImei();
taskImei.setTag(plateForm.getTag());
taskImei.setImei(plateForm.getImei());
taskImei.setCreateTime(DateUtil.date());
taskImei.setUserId(transmitDTO.getUserId());
taskImei.setTaskId(transmitDTO.getTaskId());
taskImei.setStatus(DefaultNumberConstants.ZERO_NUMBER);
imeiList.add(taskImei);
}
taskImeiRepository.saveAll(imeiList);
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
public Boolean updateBath(List<TaskImei> taskImeiList) {
return taskImeiRepository.saveAll(taskImeiList).size() == taskImeiList.size();
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateImeiByTaskName(String taskName) {
return taskImeiRepository.updateImeiByTaskName
(DefaultNumberConstants.ONE_NUMBER, DateUtil.date(), taskName)
> DefaultNumberConstants.ZERO_NUMBER;
}
@Override
public Boolean updateBath(Long taskId, String taskImeiName, Integer num) {
return taskImeiRepository.updateImeiByTaskNameId
(num, taskImeiName, DateUtil.date(), taskId) > DefaultNumberConstants.ZERO_NUMBER;
}
}

@ -0,0 +1,111 @@
package com.baiye.timed;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
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.service.dto.ImeiDTO;
import com.baiye.util.CSVFileUtil;
import com.baiye.util.MailUtil;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class DeliveryBalanceTask {
private final CompanyService companyService;
private final TaskImeiService taskImeiService;
private final DeliveryProperties deliveryProperties;
private final DeliveryRecordService deliveryRecordService;
private final PayFatherTemplateService payFatherTemplateService;
@Scheduled(cron = "0 0/30 * * * ? ")
@Transactional(rollbackFor = Exception.class)
public void cashResources() {
// 查询所有未兑换的
List<TaskImei> imeiList = taskImeiService.findByStatus(DefaultNumberConstants.ZERO_NUMBER);
if (CollUtil.isNotEmpty(imeiList)) {
// 根据任务id分组
Map<Long, List<TaskImei>> listMap = imeiList.stream()
.collect(Collectors.groupingBy(TaskImei::getTaskId));
for (Map.Entry<Long, List<TaskImei>> map : listMap.entrySet()) {
Long taskId = map.getKey();
List<TaskImei> list = listMap.get(taskId);
Long userId = list.get(DefaultNumberConstants.ZERO_NUMBER).getUserId();
Company companyByUserId = companyService.findCompanyByUserId(userId);
if (ObjectUtil.isNotNull(companyByUserId)
&& ObjectUtil.isNotNull(companyByUserId.getTemplateId())) {
// 查找模板
PayFatherTemplate template =
payFatherTemplateService.findById(companyByUserId.getTemplateId());
if (ObjectUtil.isNotNull(template) &&
ObjectUtil.isNotNull(template.getDmpDeliveryFee())) {
// 每次100000 数据
List<List<TaskImei>> lists = Lists.partition
(list, DefaultNumberConstants.ONE_HUNDRED_THOUSAND);
// 批量发送
for (List<TaskImei> taskImeiList : lists) {
// 大于100 进行兑换
if (taskImeiList.size() >= DefaultNumberConstants.ONE_HUNDRED) {
BigDecimal decimal = NumberUtil.mul(template.getDmpDeliveryFee(), BigDecimal.valueOf(taskImeiList.size()));
BigDecimal sub = NumberUtil.sub(companyByUserId.getUserBalance(), decimal);
// 判断余额
if (sub.compareTo(BigDecimal.valueOf
(DefaultNumberConstants.ZERO_NUMBER)) < DefaultNumberConstants.ZERO_NUMBER) {
continue;
}
String fileUrl = deliveryProperties.getFileUrl();
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, taskImeiList);
String taskImeiName = IdUtil.fastUUID();
// 保存文件
String filePath = fileUrl.concat(StrPool.SLASH).concat(taskImeiName).concat(".csv");
CSVFileUtil.createCsvFile(toList, filePath);
// 发送邮件
MailUtil.sendMail(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword(),
deliveryProperties.getToEmailAddress(), filePath,
deliveryProperties.getCustomerId(), taskImeiName);
// 修改状态 修改余额
taskImeiService.updateBath(taskId, taskImeiName, DefaultNumberConstants.ONE_NUMBER);
deliveryRecordService.saveDeliveryRecord(filePath, taskImeiName, taskImeiList.size(), taskId, userId);
companyService.updateUserBalanceByCompanyId(sub.doubleValue(), companyByUserId.getId());
// 删除文件
FileUtil.del(filePath);
}
}
}
}
}
}
}
}

@ -0,0 +1,54 @@
package com.baiye.util;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.text.csv.CsvWriter;
import cn.hutool.core.util.CharsetUtil;
import com.baiye.exception.BadRequestException;
import com.baiye.modules.system.service.dto.ImeiDTO;
import com.google.common.collect.Lists;
import org.apache.poi.ss.formula.functions.T;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Enzo
* @date : 2022/10/21
*/
public class CSVFileUtil {
/**
* csv
*
* @param result
* @param fileName
*/
public static void createCsvFile(List<ImeiDTO> result, String fileName) {
try {
//构造文件
File csvFile = new File(fileName);
//导入HuTool中CSV工具包的CsvWriter类
//设置导出字符类型, CHARSET_UTF_8
CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
//通过CsvWriter中的write方法写入数据
for (ImeiDTO dto : result) {
writer.writeLine(dto.getImei(), dto.getTag());
}
writer.close();
} catch (Exception e) {
throw new BadRequestException("生成文件失败");
}
}
public static void main(String[] args) {
List<ImeiDTO> list = Lists.newArrayList();
ImeiDTO dto = new ImeiDTO();
dto.setImei("123");
dto.setTag("234");
list.add(dto);
createCsvFile(list, "E:\\test.csv");
}
}

@ -171,6 +171,13 @@ debt:
qrcodeLogo: /home/eladmin/qrcode/qrcode.jpg
reqUrl: /qrcode/
platform:
authToken: JI8AeA7POKsdGcBC
fileUrl: /home/eladmin/mail/upload
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
toEmailAddress: ggggod_2022@outlook.com
customerId: QISX0xz4l6fR3YL2sUNSpzM2
# 巨量引擎配置
ocean:

@ -170,6 +170,14 @@ debt:
qrcodeUrl: /home/eladmin/qrcode/
qrcodeLogo: /home/eladmin/qrcode/qrcode.jpg
reqUrl: /qrcode/
platform:
authToken: nqJpVSf3UcrEcVIH
fileUrl: /home/eladmin/mail/upload
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
toEmailAddress: ggggod_2022@outlook.com
customerId: QISX0xz4l6fR3YL2sUNSpzM2
# 巨量引擎配置
ocean:
engine:

@ -31,6 +31,7 @@
<properties>
<jwt.version>3.9.0</jwt.version>
<mail.version>1.4</mail.version>
<poi.version>4.0.0</poi.version>
<oshi.version>5.7.1</oshi.version>
<guava.version>23.0</guava.version>
@ -239,6 +240,13 @@
<artifactId>emoji-java</artifactId>
<version>${emoji.version}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${mail.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

@ -0,0 +1,35 @@
package com.baiye.config.properties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "platform")
public class DeliveryProperties {
@ApiModelProperty("文件地址")
private String fileUrl;
@ApiModelProperty("customerId")
private String customerId;
@ApiModelProperty("emailAddress")
private String emailAddress;
@ApiModelProperty("emailPassword")
private String emailPassword;
@ApiModelProperty("toEmailAddress")
private String toEmailAddress;
@ApiModelProperty("回调地址")
private String responseUrl;
}

@ -0,0 +1,29 @@
package com.baiye.feign;
import com.baiye.feign.fallback.OrganizeClientFallback;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @author jt
*/
@FeignClient(value = "ad-platform-management", fallback = OrganizeClientFallback.class)
public interface TaskImeiClient {
String PAY_PREFIX = "/api/taskImei";
/**
*
*
* @param taskName
* @return
*/
@ApiOperation("根据状态获取")
@GetMapping(PAY_PREFIX + "/updateImei")
ResponseEntity<Void> updateImei(@RequestParam("taskName") String taskName);
}

@ -0,0 +1,19 @@
package com.baiye.feign.fallback;
import com.baiye.feign.TaskImeiClient;
import com.baiye.module.entity.OceanEngineToken;
import org.springframework.http.ResponseEntity;
import java.util.List;
/**
* @author jt
*/
public class TaskImeiClientFallback implements TaskImeiClient {
@Override
public ResponseEntity<Void> updateImei(String taskName) {
return null;
}
}

@ -2,6 +2,7 @@ package com.baiye.module.controller;
import com.baiye.http.CommonResponse;
import com.baiye.module.service.FormSourceService;
import com.baiye.module.service.dto.DeliveryTransmitDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@ -32,11 +33,4 @@ public class FromTaskApi {
return formSourceService.acceptFormSource(json);
}
@ApiOperation("接受ad-back任务资源")
@PostMapping("/callback/add")
public CommonResponse<Object> acceptAdBackSource(@RequestBody String json) {
log.info("json======{}", json);
formSourceService.acceptAdBackSource(json);
return CommonResponse.createBySuccess();
}
}

@ -0,0 +1,19 @@
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;
/**
* @author Enzo
* @date : 2022/10/18
*/
public interface DeliveryRecordRepository extends JpaRepository<DeliveryRecord, Long>, JpaSpecificationExecutor<DeliveryRecord> {
/**
*
* @param taskName
* @return
*/
DeliveryRecord findByTaskName(String taskName);
}

@ -1,16 +0,0 @@
package com.baiye.module.dao;
import com.baiye.module.entity.TaskImei;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author jt
*/
@Repository
public interface TaskImeiRepository extends JpaRepository<TaskImei, Long>, JpaSpecificationExecutor<TaskImei> {
List<TaskImei> findAllByTaskId(Long taskId);
}

@ -0,0 +1,31 @@
package com.baiye.module.entity;
import com.baiye.model.entity.BaseDeliveryRecord;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Getter
@Setter
@Entity
@Table(name = "tb_delivery_record")
@ApiModel(value = "DeliveryRecord")
public class DeliveryRecord extends BaseDeliveryRecord implements Serializable {
private static final long serialVersionUID = 824742721180952896L;
@Id
@ApiModelProperty(value = "线索表主键id自动递增")
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}

@ -246,4 +246,11 @@ public interface ClueService {
* @return
*/
Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria);
/**
*
* @param taskId
* @return
*/
Integer findTaskNum(Long taskId);
}

@ -0,0 +1,17 @@
package com.baiye.module.service;
import com.baiye.module.entity.DeliveryRecord;
/**
* @author Enzo
* @date : 2022/10/22
*/
public interface DeliveryRecordService {
/**
*
* @param taskName
* @return
*/
DeliveryRecord findByTaskName(String taskName);
}

@ -8,5 +8,4 @@ import java.util.Map;
public interface FormSourceService {
Map<String, Object> acceptFormSource(String json);
void acceptAdBackSource(String json);
}

@ -0,0 +1,28 @@
package com.baiye.module.service.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
public class DeliveryTransmitDTO {
@NotBlank
@ApiModelProperty("16-64位用户ID")
private String customerId;
@NotBlank
@ApiModelProperty("任务名称")
private String taskName;
@NotBlank
@ApiModelProperty("任务文件下载地址")
private String dUrl;
}

@ -0,0 +1,13 @@
package com.baiye.module.service.dto;
import lombok.Data;
/**
* @author Enzo
* @date : 2022/10/22
*/
@Data
public class MailDTO {
private String imei;
private String tag;
}

@ -63,7 +63,6 @@ public class ClueServiceImpl implements ClueService {
private final OceanEngineClueIdRepository oceanEngineClueIdRepository;
private static SimpleDateFormat timeOne = new SimpleDateFormat("yyyyMMddHHmmssSSS");
private final TaskImeiRepository taskImeiRepository;
@Override
@Transactional(rollbackFor = Exception.class)
@ -677,7 +676,7 @@ public class ClueServiceImpl implements ClueService {
@Override
@Transactional(rollbackFor = Exception.class)
public CommonResponse<Object> dmpClueExchange() {
//条件 任务id
/*//条件 任务id
Long taskId = null;
List<TaskImei> taskImeiList = taskImeiRepository.findAllByTaskId(taskId);
if (CollUtil.isNotEmpty(taskImeiList)) {
@ -705,7 +704,7 @@ public class ClueServiceImpl implements ClueService {
task.setIsDistribution(1);
taskClient.updateTask(task);
}
*/
return null;
}
@ -724,6 +723,11 @@ public class ClueServiceImpl implements ClueService {
return map;
}
@Override
public Integer findTaskNum(Long taskId) {
return clueMiddleRepository.findTaskNum(taskId);
}
private List<HashMap<String, Object>> getOrganizeInfo(String startTime, String endTime, List<Long> organizeIds) {
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndorganizeIds(startTime, endTime, organizeIds);
Set<Long> ids = clueMiddles.stream().map(ClueMiddle::getOrganizeId).collect(Collectors.toSet());

@ -0,0 +1,26 @@
package com.baiye.module.service.impl;
import com.baiye.module.dao.DeliveryRecordRepository;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.service.DeliveryRecordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2022/10/22
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class DeliveryRecordServiceImpl implements DeliveryRecordService {
private final DeliveryRecordRepository deliveryRecordRepository;
@Override
public DeliveryRecord findByTaskName(String taskName) {
return deliveryRecordRepository.findByTaskName(taskName);
}
}

@ -3,6 +3,7 @@ package com.baiye.module.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.json.JSONArray;
@ -10,15 +11,17 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.feign.TaskClient;
import com.baiye.feign.TaskImeiClient;
import com.baiye.model.dto.TaskQueryCriteria;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueRepository;
import com.baiye.module.dao.TaskImeiRepository;
import com.baiye.module.dao.DeliveryRecordRepository;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.entity.Task;
import com.baiye.module.entity.TaskImei;
import com.baiye.module.service.FormSourceService;
import com.baiye.module.service.dto.DeliveryTransmitDTO;
import com.baiye.util.MobileUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -26,9 +29,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -40,13 +41,19 @@ import java.util.Map;
public class FormSourceServiceImpl implements FormSourceService {
private final TaskClient taskClient;
private final TaskImeiClient taskImeiClient;
private final ClueRepository clueRepository;
private final ClueMiddleRepository clueMiddleRepository;
private final TaskImeiRepository taskImeiRepository;
private final DeliveryRecordRepository deliveryRecordRepository;
@Value("${storage.private-key}")
private String privatePath;
/**
* @param json
* @return
@ -121,29 +128,6 @@ public class FormSourceServiceImpl implements FormSourceService {
return map;
}
/**
* dmp
*
* @param json
*/
@Override
public void acceptAdBackSource(String json) {
JSONObject jsonObject = JSONUtil.parseObj(json);
Long taskId = jsonObject.getLong("taskId");
JSONArray list = jsonObject.getJSONArray("list");
if (list != null && list.size() > 0) {
List<TaskImei> taskImeiList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
JSONObject imeiJson = list.getJSONObject(i);
TaskImei taskImei = new TaskImei();
taskImei.setImei(imeiJson.getStr("imei"));
taskImei.setTag(imeiJson.getStr("tag"));
taskImei.setTaskId(taskId);
taskImeiList.add(taskImei);
}
taskImeiRepository.saveAll(taskImeiList);
}
}
private String decry(String data) {
FileReader fileReader = new FileReader(privatePath);
@ -152,4 +136,6 @@ public class FormSourceServiceImpl implements FormSourceService {
RSA rsa = new RSA(privateKey, null);
return rsa.decryptStr(data, KeyType.PrivateKey);
}
}

@ -0,0 +1,113 @@
package com.baiye.task;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
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.util.MailUtil;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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 java.util.List;
/**
* @author Enzo
* @date : 2022/10/22
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MailSourceTask {
private final TaskClient taskClient;
private final ClueService clueService;
private final DeliveryProperties deliveryProperties;
private final DeliveryRecordService deliveryRecordService;
@Scheduled(cron = "0 0/1 * * * ? ")
@Transactional(rollbackFor = Exception.class)
public void receiveMail() {
// 获取邮件内容
List<Message> list = MailUtil.readMailByIMAP
(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);
// 内容获取发送请求
DeliveryRecord byTaskName =
deliveryRecordService.findByTaskName(taskName);
if (ObjectUtil.isNotNull(byTaskName)) {
Task task = new Task();
Long taskId = byTaskName.getTaskId();
CsvReader reader = CsvUtil.getReader();
List<Clue> clues = Lists.newArrayList();
// 解析附件内容并保存文件
String path = MailUtil.saveAttachMent
(message, deliveryProperties.getFileUrl());
// 解析文件
CsvData data = reader.read(FileUtil.file(path));
List<CsvRow> 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);
}
// 将imei转为线索
clueService.saveClue(clues, byTaskName.getTaskId(), DefaultNumberConstants.FOUR_NUMBER);
// 修改任务总条数
Integer taskNum = clueService.findTaskNum(taskId);
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(DefaultNumberConstants.ONE_NUMBER);
taskClient.updateTask(task);
// 删除邮件
message.setFlag(Flags.Flag.DELETED, Boolean.TRUE);
FileUtil.del(path);
}
}
}
} catch (Exception e) {
log.error("=================== the receive mail error time as {} ===========", DateUtil.date());
throw new BadRequestException("接收邮件失败");
}
}
}
}

@ -77,3 +77,5 @@ save:
maxPoolSize: 16
queueCapacity: 3
ThreadNamePrefix: SaveFileTaskExecutor-

@ -77,3 +77,10 @@ save:
maxPoolSize: 16
queueCapacity: 3
ThreadNamePrefix: SaveFileTaskExecutor-
platform:
fileUrl: /home/eladmin/mail/down
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
customerId: QISX0xz4l6fR3YL2sUNSpzM2

@ -77,3 +77,9 @@ save:
maxPoolSize: 16
queueCapacity: 3
ThreadNamePrefix: SaveFileTaskExecutor-
platform:
fileUrl: /home/eladmin/mail/down
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
customerId: QISX0xz4l6fR3YL2sUNSpzM2

Loading…
Cancel
Save