zelong.shao

task|发送提醒邮件

Showing 23 changed files with 348 additions and 30 deletions
......@@ -20,4 +20,6 @@ public class BaseDao {
protected ConsignmentExtMapper consignmentExtMapper;
@Autowired
protected AttachmentExtMapper attachmentExtMapper;
@Autowired
protected EmailMapper emailMapper;
}
\ No newline at end of file
......
package com.fedex.connect.customer.repository.repo;
import com.fedex.connect.common.model.biz.Email;
public interface IEmailRepository {
void save(Email entity);
}
package com.fedex.connect.customer.repository.repo.impl;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.customer.repository.base.BaseDao;
import com.fedex.connect.customer.repository.repo.IEmailRepository;
import org.springframework.stereotype.Repository;
@Repository
public class EmailRepositoryImpl extends BaseDao implements IEmailRepository {
public void save(Email entity){
if(entity != null) {
if (entity.getId() == null || entity.getId() <= 0) {
emailMapper.insertSelective(entity);
} else if (entity.getId() != null && entity.getId() > 0){
emailMapper.updateByPrimaryKeySelective(entity);
}
}
}
}
......@@ -16,5 +16,7 @@ public class BaseService {
@Autowired
protected IUserConsignmentMappingRepository userConsignmentMappingRepository;
@Autowired
protected IEmailRepository emailRepository;
@Autowired
protected IPushObRepository pushObRepository;
}
\ No newline at end of file
......
package com.fedex.connect.customer.service.biz;
import com.fedex.connect.common.model.biz.Consignment;
import com.fedex.connect.common.model.sys.User;
public interface IEmailService {
void saveNotificationEmail(Consignment consignment, User user) throws Exception;
}
package com.fedex.connect.customer.service.biz.impl;
import com.fedex.connect.common.dependencies.date.vo.ResponseVo;
import com.fedex.connect.common.dependencies.enums.base.StatusEnum;
import com.fedex.connect.common.dependencies.util.AssignmentFieldUtils;
import com.fedex.connect.common.dependencies.util.ResponseUtils;
import com.fedex.connect.common.model.biz.*;
import com.fedex.connect.common.model.sys.User;
import com.fedex.connect.customer.data.bo.AddBo;
......@@ -12,6 +9,7 @@ import com.fedex.connect.customer.enums.ResponseCode;
import com.fedex.connect.customer.service.base.BaseService;
import com.fedex.connect.customer.service.biz.IAttachmentService;
import com.fedex.connect.customer.service.biz.IConsignmentService;
import com.fedex.connect.customer.service.biz.IEmailService;
import com.fedex.connect.customer.util.service.biz.ConsignmentUtil;
import com.fedex.connect.customer.util.service.biz.PushObUtil;
import com.fedex.connect.customer.util.service.biz.UploadRecordUtil;
......@@ -22,7 +20,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
......@@ -46,6 +43,8 @@ public class ConsignmentServiceImpl extends BaseService implements IConsignmentS
private PushObUtil pushObUtil;
@Autowired
private IAttachmentService attachmentService;
@Autowired
private IEmailService emailService;
/**
* @Author Szl
......@@ -154,13 +153,13 @@ public class ConsignmentServiceImpl extends BaseService implements IConsignmentS
/**
* 保存或更新运单表
*/
consignmentRepository.save(consignment);
consignmentRepository.saveOrUpdate(consignment);
//设置上传记录表运单ID
uploadRecord.setConsignmentId(consignment.getId());
/**
* 保存上传记录表
*/
uploadRecordRepository.save(uploadRecord);
uploadRecordRepository.saveOrUpdate(uploadRecord);
//设置附件表运单id,上传记录表id
Optional.ofNullable(attachmentList).orElse(new ArrayList<>()).stream().filter(Objects::nonNull).forEach(p->{
p.setBizId(consignment.getId());
......@@ -169,7 +168,7 @@ public class ConsignmentServiceImpl extends BaseService implements IConsignmentS
/**
* 保存附件表信息
*/
attachmentRepository.saveAll(attachmentList);
attachmentRepository.saveOrUpdateAll(attachmentList);
//用户uuid与运单uuid不一致,则需要添加用户运单中间表信息
if(!user.getUserUuid().equals(consignment.getUserUuid())){
/**
......@@ -184,7 +183,7 @@ public class ConsignmentServiceImpl extends BaseService implements IConsignmentS
/**
* 初始化插入预清关文件推送任务日志
*/
userConsignmentMappingRepository.save(userConsignmentMapping);
userConsignmentMappingRepository.saveOrUpdate(userConsignmentMapping);
}
}
/**
......@@ -196,8 +195,12 @@ public class ConsignmentServiceImpl extends BaseService implements IConsignmentS
*/
PushOb pushOb = pushObUtil.initPushOb(consignment,user);
/**
* 初始化插入提醒发件人邮件日志
*/
emailService.saveNotificationEmail(consignment,user);
/**
* 推送进口文件主表
*/
pushObRepository.save(pushOb);
pushObRepository.saveOrUpdate(pushOb);
}
}
\ No newline at end of file
......
package com.fedex.connect.customer.service.biz.impl;
import com.fedex.connect.common.model.biz.Consignment;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.common.model.sys.User;
import com.fedex.connect.customer.service.base.BaseService;
import com.fedex.connect.customer.service.biz.IEmailService;
import com.fedex.connect.customer.util.service.biz.EmailUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmailServiceImpl extends BaseService implements IEmailService {
@Autowired
private EmailUtil emailUtil;
/**
* @Author Szl
* @Description 功能说明 如果新建运单不是该账号UUID下的运单,则发邮件通知到该运单所属用户,告知运单已被其他用户创建上传。
* @Date 2024/11/20
* @param consignment
* @param user
* @return void
*/
@Override
public void saveNotificationEmail(Consignment consignment, User user) throws Exception {
if (!StringUtils.isEmpty(consignment.getUserUuid()) && consignment.getUserUuid().equals(user.getUserUuid())){
return;
}
/**
* 初始化Email对象
*/
Email email = new Email();
emailUtil.initNotificationEmail(email,consignment);
/**
* 保存入库
*/
emailRepository.save(email);
}
}
package com.fedex.connect.customer.util.service.biz;
import com.fedex.connect.common.dependencies.enums.biz.EmailStatusEnum;
import com.fedex.connect.common.dependencies.enums.biz.EmailTypeEnum;
import com.fedex.connect.common.dependencies.util.AssignmentFieldUtils;
import com.fedex.connect.common.model.biz.Consignment;
import com.fedex.connect.common.model.biz.Email;
import org.springframework.stereotype.Component;
@Component
public class EmailUtil {
public void initNotificationEmail(Email email, Consignment consignment) throws Exception{
email.setBizId(consignment.getId());
email.setBizCode(consignment.getConsignmentCode());
email.setToAddress(consignment.getShipperEmail());
email.setSubject("");
email.setSubject("");
email.setTypeName(EmailTypeEnum.NOTIFICATION_SENDER.getMsg());
email.setTypeCode(EmailTypeEnum.NOTIFICATION_SENDER.getCode());
email.setStatusName(EmailStatusEnum.PENDING.getMsg());
email.setStatusCode(EmailStatusEnum.PENDING.getCode());
AssignmentFieldUtils.assignmentTableBaseField(email);
}
}
......@@ -6,26 +6,27 @@ package com.fedex.connect.common.dependencies.enums.biz;
* @Date 2024/11/19
*/
public enum EmailStatusEnum {
PENDING(0L,"pending","待发送"),
SUCCESS(1L,"success","发送成功"),
FAILED(2L,"failed","发送失败"),
PENDING("emailStatus_01","pending","待发送"),
SUCCESS("emailStatus_02","success","发送成功"),
FAILED("emailStatus_03","failed","发送失败"),
;
private Long code;
private String code;
private String enMsg;
private String msg;
EmailStatusEnum(Long code, String enMsg,String msg) {
EmailStatusEnum(String code, String enMsg,String msg) {
this.code = code;
this.enMsg = enMsg;
this.msg = msg;
}
public Long getCode() {
public String getCode() {
return code;
}
public void setCode(Long code) {
public void setCode(String code) {
this.code = code;
}
......
......@@ -6,24 +6,26 @@ package com.fedex.connect.common.dependencies.enums.biz;
* @Date 2024/11/19
*/
public enum EmailTypeEnum {
PUSH_CON_FILE(0L,"pushConFile","推送预清关文件"),
PUSH_CON_FILE("emailType_01","pushConFile","推送预清关文件"),
NOTIFICATION_SENDER("emailType_02","notificationSender","提醒发件人"),
;
private Long code;
private String code;
private String enMsg;
private String msg;
EmailTypeEnum(Long code, String enMsg,String msg) {
EmailTypeEnum(String code, String enMsg,String msg) {
this.code = code;
this.enMsg = enMsg;
this.msg = msg;
}
public Long getCode() {
public String getCode() {
return code;
}
public void setCode(Long code) {
public void setCode(String code) {
this.code = code;
}
......
......@@ -50,7 +50,7 @@ url:
fcl:
login:
url: http://exportdeclarationuat-tw.dmz.apac.fedex.com/icleartw/auth/wlgnLogin
redjrectLogin: http://localhost:8080/ImpPer/#/redjrectLogin
redjrectLogin: http://192.168.1.251/time.html
twidx:
url: http://exportdeclarationuat-tw.apac.fedex.com
interface:
......
package com.fedex.connect.task.job;
import com.fedex.connect.task.annotation.ProcessingInterval;
import com.fedex.connect.task.service.biz.IDuplicateConsignmentEmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @Author Szl
* @Description 类说明 发邮件通知到该运单所属用户,告知运单已被其他用户创建上传
* @Date 2024/11/20
*/
@Component
public class DuplicateConsignmentEmailJob {
@Autowired
private IDuplicateConsignmentEmailService duplicateConsignmentEmailService;
@ProcessingInterval
@Scheduled(cron = "${export.task.allocation.pushConFile}")
public void pushConsignmentFileTask() {
duplicateConsignmentEmailService.duplicateConsignmentEmail();
}
}
......@@ -9,7 +9,7 @@ import java.util.List;
@Mapper
public interface EmailExtMapper {
List<Email> findConPushEmails(String typeCode,String statusCode);
List<Email> findEmailsByDic(String typeCode,String statusCode);
@Delete("DELETE FROM T_BIZ_EMAIL WHERE ID = #{id}")
void deleteById(@Param("id") Long id);
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fedex.connect.task.repository.dao.EmailExtMapper">
<select id="findConPushEmails" resultType="com.fedex.connect.common.model.biz.Email">
<select id="findEmailsByDic" resultType="com.fedex.connect.common.model.biz.Email">
SELECT *
FROM (
SELECT *
......
......@@ -5,7 +5,7 @@ import com.fedex.connect.common.model.biz.Email;
import java.util.List;
public interface IEmailRepository {
List<Email> findConPushEmails(String typeCode,String statusCode);
List<Email> findEmailsByDic(String typeCode,String statusCode);
void deleteById(Long id);
......
......@@ -9,8 +9,8 @@ import java.util.List;
@Repository
public class EmailRepositoryImpl extends AbstractDaoRepository implements IEmailRepository {
public List<Email> findConPushEmails(String typeCode,String statusCode){
return emailExtMapper.findConPushEmails(typeCode,statusCode);
public List<Email> findEmailsByDic(String typeCode,String statusCode){
return emailExtMapper.findEmailsByDic(typeCode,statusCode);
}
@Override
......
package com.fedex.connect.task.repository.repo.log.impl;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.common.model.log.EmailHistory;
import com.fedex.connect.task.repository.base.AbstractDaoRepository;
import com.fedex.connect.task.repository.repo.log.IEmailHistoryRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class EmailHistoryRepositoryImpl extends AbstractDaoRepository implements IEmailHistoryRepository {
......
package com.fedex.connect.task.service.biz;
public interface IDuplicateConsignmentEmailService {
void duplicateConsignmentEmail();
}
package com.fedex.connect.task.service.biz.impl;
import com.fedex.connect.common.dependencies.cache.CacheSystem;
import com.fedex.connect.common.dependencies.enums.biz.EmailStatusEnum;
import com.fedex.connect.common.dependencies.enums.biz.EmailTypeEnum;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.task.data.dto.MailConfigDto;
import com.fedex.connect.task.service.base.BaseService;
import com.fedex.connect.task.service.biz.IDuplicateConsignmentEmailService;
import com.fedex.connect.task.utils.sys.DuplicateEmailUtil;
import com.fedex.connect.task.utils.sys.EmailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author Szl
* @Description 类说明 发送邮件通知用户
* @Date 2024/11/20
*/
@Service
public class DuplicateConsignmentEmailServiceImpl extends BaseService implements IDuplicateConsignmentEmailService {
@Autowired
private CacheSystem cacheSystem;
@Autowired
private EmailUtil emailUtil;
@Autowired
private DuplicateEmailUtil duplicateEmailUtil;
@Override
public void duplicateConsignmentEmail(){
/**
* 查询邮件发送日志表中状态为待推送且类型为“提醒发件人”的数据
*/
List<Email> emails = iEmailExtRepository.findEmailsByDic(cacheSystem.getDicEmailType(EmailTypeEnum.NOTIFICATION_SENDER.getEnMsg()).getCode(),
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg()).getCode());
/**
* 发送邮件
*/
for (Email email : emails) {
/**
* 构造邮件dto
*/
MailConfigDto mailConfigDto = new MailConfigDto();
duplicateEmailUtil.createMailConfigDto(mailConfigDto);
/**
* 发送邮件
*/
boolean result = emailUtil.sendMail(mailConfigDto);
/**
* 更新邮件实体
*/
duplicateEmailUtil.updateEmail(result,email,cacheSystem);
/**
* 更新数据库
*/
duplicateEmailUtil.saveEmail(email);
}
}
}
......@@ -55,7 +55,7 @@ public class PushConsignmentFileServiceImpl extends BaseService implements IPush
String tempPath = "";
String finalPath = "";
//查询需要发送的数据
List<Email> conPushEmails = iEmailExtRepository.findConPushEmails(cacheSystem.getDicEmailType(EmailTypeEnum.PUSH_CON_FILE.getEnMsg()).getCode(),
List<Email> conPushEmails = iEmailExtRepository.findEmailsByDic(cacheSystem.getDicEmailType(EmailTypeEnum.PUSH_CON_FILE.getEnMsg()).getCode(),
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg()).getCode());
for (Email conPushEmail : conPushEmails) {
......
......@@ -29,7 +29,6 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -244,7 +243,7 @@ public class ConFileEmailUtil {
String fileName = String.format("%s%s%s%s",
"",
"",
new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()),
DateUtil.yyyyMMddHHmmss(new Date()),
extension
);
String basePath = "";
......
package com.fedex.connect.task.utils.sys;
import com.fedex.connect.common.dependencies.cache.CacheSystem;
import com.fedex.connect.common.dependencies.enums.biz.EmailStatusEnum;
import com.fedex.connect.common.model.bi.DictionaryEntries;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.common.model.log.EmailHistory;
import com.fedex.connect.task.data.dto.MailConfigDto;
import com.fedex.connect.task.repository.repo.biz.IEmailRepository;
import com.fedex.connect.task.repository.repo.log.IEmailHistoryRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
@Component
public class DuplicateEmailUtil {
@Autowired
private IEmailRepository emailRepository;
@Autowired
private IEmailHistoryRepository emailHistoryRepository;
/**
* @Author Szl
* @Description 功能说明 初始化邮件dto
* @Date 2024/11/20
* @param mailConfigDto
* @return com.fedex.connect.task.data.dto.MailConfigDto
*/
public MailConfigDto createMailConfigDto(MailConfigDto mailConfigDto){
mailConfigDto.setHost("");
mailConfigDto.setPort("");
mailConfigDto.setAuth("");
//设置代理
mailConfigDto.setProxyStartFlag("");
mailConfigDto.setProxyHost("");
mailConfigDto.setProxyPort("");
//发件人
mailConfigDto.setFrom("");
//发件人密码
mailConfigDto.setPassword("");
//ce接收人
mailConfigDto.setTo("");
//设置邮件标题
mailConfigDto.setSubject("");
//设置邮件内容
mailConfigDto.setContent("");
return mailConfigDto;
}
/**
* @Author Szl
* @Description 功能说明 更新Email状态
* @Date 2024/11/20
* @param result
* @param email
* @param cacheSystem
* @return com.fedex.connect.common.model.biz.Email
*/
public void updateEmail(boolean result, Email email, CacheSystem cacheSystem){
DictionaryEntries pending = cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg());
DictionaryEntries success = cacheSystem.getDicEmailStatus(EmailStatusEnum.SUCCESS.getEnMsg());
DictionaryEntries failed = cacheSystem.getDicEmailStatus(EmailStatusEnum.FAILED.getEnMsg());
email.setSendTime(new Date());
if (result){
email.setTypeCode(success.getCode());
email.setTypeName(success.getEnglishName());
}else {
if (email.getSendNum()<3){
email.setTypeCode(pending.getCode());
email.setTypeName(pending.getEnglishName());
email.setSendNum(email.getSendNum()+1);
}else {
email.setTypeCode(failed.getCode());
email.setTypeName(failed.getEnglishName());
}
}
}
/**
* @Author Szl
* @Description 功能说明 保存email信息入库
* @Date 2024/11/20
* @param email
* @return void
*/
@Transactional
public void saveEmail(Email email){
if (EmailStatusEnum.PENDING.getCode().equals(email.getTypeCode())){
emailRepository.save(email);
}else {
EmailHistory emailHistory = new EmailHistory();
BeanUtils.copyProperties(email, emailHistory);
emailRepository.deleteById(email.getId());
emailHistoryRepository.save(emailHistory);
}
}
}
......@@ -18,6 +18,13 @@ import java.util.Properties;
@Slf4j
@Component
public class EmailUtil {
/**
* @Author Szl
* @Description 功能说明 发送邮件
* @Date 2024/11/20
* @param mailConfig
* @return boolean
*/
public static boolean sendMail(MailConfigDto mailConfig) {
System.setProperty("mail.mime.splitlongparameters","false");
try {
......