zelong.shao

task|邮件调整

Showing 29 changed files with 623 additions and 235 deletions
......@@ -10,8 +10,8 @@ import java.util.List;
*/
public enum EmailTypeEnum {
PUSH_CON_FILE("emailType_01","Push Pre-Customs Clearance Files","推送预清关文件"),
NOTIFICATION_SENDER("emailType_02","notificationSender","提醒发件人"),
SEND_FAILED_EMAIL("emailType_03","sendFailedEmail","错误邮件预警"),
NOTIFICATION_SENDER("emailType_02","Remind Sender","提醒发件人"),
SEND_FAILED_EMAIL("emailType_03", "Error Email Alert","错误邮件预警"),
;
......
......@@ -29,7 +29,7 @@ public class ClearanceEmailTemplate implements EmailTemplate {
}
interface CLEARANCE_TITLE{
String TITLE = "";
String TITLE = "Push Pre-Customs Clearance Files";
}
interface CLEARANCE_BODY{
......
package com.fedex.connect.common.dependencies.template.clearanceEmail;
import org.springframework.stereotype.Component;
import java.text.MessageFormat;
@Component
public class DuplicateEmailTemplate implements EmailTemplate {
/**
* 模板标题格式化返回内容
*/
@Override
public String getTitle(Object ... arguments) {
return MessageFormat.format(DuplicateEmailTemplate.CLEARANCE_TITLE.TITLE,arguments);
}
/**
* 邮件说明
*/
@Override
public String getDescription(Object... arguments) {
return CLEARANCE_BODY.DESCRIPTION;
}
/**
* 模板内容
*/
@Override
public String getBody(Object ... arguments) {
return MessageFormat.format(DuplicateEmailTemplate.CLEARANCE_BODY.BODY,arguments);
}
interface CLEARANCE_TITLE{
String TITLE = "Sender Reminder:";
}
interface CLEARANCE_BODY{
String DESCRIPTION = "<p>Sender Reminder: The task will poll every {0} minutes after the system starts.</p>\n";
String BODY = "<div><div style='margin-left:4%;'>" +
"<p align='center'><img src='{0}'></p>" +
"<p align='center'><img src='{1}'></p>" +
"<p>Import Pre-Clearance System Notification:</p>" +
"<p>&nbsp;&nbsp;&nbsp;&nbsp;{2}The consignment has been created and uploaded by another user.</p>" +
"</font><br/><br/>";
}
}
......@@ -19,7 +19,7 @@ public class SendFailedEmailTemplate implements EmailTemplate {
*/
@Override
public String getBody(Object ... arguments) {
return FAILED_EMAIL_BODY.TABLE;
return MessageFormat.format(FAILED_EMAIL_BODY.TABLE,arguments);
}
/**
......@@ -32,28 +32,28 @@ public class SendFailedEmailTemplate implements EmailTemplate {
interface FAILED_EMAIL_TITLE{
String TITLE = "失败预警";
String TITLE = "Failure Alert";
}
interface FAILED_EMAIL_BODY{
String DESCRIPTION = "<p>1.【文件推送】任务,系统启动后每{0}分钟轮巡一次。</p>\n" +
" <p>2.【推送预清关文件】任务,系统启动后每{1}分钟轮巡一次。</p>\n" +
" <p>3.【提醒发件人】任务,系统启动后每{2}分钟轮巡一次。</p>\n" +
" <p>备注:邮件发送机制:</p>\n" +
" <p>该预警邮件任务,系统启动后每{3}分钟执行一次,当日上述3个定时任务,有任何一个任务的最终判定为失败的记录数量大于{4},则自动发送邮件通知FedEX IT,每个接口显示最新{5}条失败运单号、当日调用总次数、当日调用失败总次数。</p>\n" +
" <p style=\"font-size:10px;\">(注:所有任务相关的数字均可以在系统配置界面调整)</p>";
String DESCRIPTION = "<p>1.[File Push] Task: The system performs a polling every {0} minutes after startup.</p>\n" +
" <p>2.[Push Pre-Clearance File] Task: The system performs a polling every {1} minutes after startup.</p>\n" +
" <p>3.[Remind Sender] Task: The system performs a polling every {2} minutes after startup.</p>\n" +
" <p>Note: Email Sending Mechanism:</p>\n" +
" <p>This alert email task is executed every {3} minutes after the system starts. If any of the three scheduled tasks mentioned above have a final determination of failed records exceeding {4} for the day, an email notification will be automatically sent to FedEx IT. Each interface will display the latest {5} failed tracking numbers, the total number of calls made during the day, and the total number of failed calls for the day.</p>\n" +
" <p style=\"font-size:10px;\">(Note: All task-related numbers can be adjusted in the system configuration interface.)</p>";
String TABLE = "<table style=\"width: 100%;table-layout: fixed;padding: 20px;width: 100%;border-collapse: collapse;\">\n" +
"<tr>\n" +
"<td style=\"border: 0px;text-align: left;padding: 8px;\">\n" +
"<div style=\"margin: auto;padding: 20px;\">\n" +
"<h2 style=\"text-align: center;\">接口调用失败详情</h2>\n" +
"<h2 style=\"text-align: center;\">Task Push Failure Details</h2>\n" +
"<table style=\"width: 100%;border-collapse: collapse;\">\n" +
"<tr>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">任务名称</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">失败的运单号</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">总数</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">失败数量</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">Task Name</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">Failed Tracking Number</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">Total Number</th>\n" +
"<th style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;background-color: #593BB7;color: white;\">Failure Count</th>\n" +
"</tr>\n" +
"{0}\n" +
"</table>\n" +
......
package com.fedex.connect.task.aspect;
import com.fedex.connect.common.dependencies.util.DateUtil;
import com.fedex.connect.common.model.sys.ParamConfig;
import com.fedex.connect.task.annotation.ProcessingInterval;
import com.fedex.connect.task.repository.repo.sys.IParamConfigRepository;
......@@ -11,14 +10,11 @@ import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Objects;
......@@ -44,7 +40,7 @@ public class ExecuteAspect {
* @param pjp
* @return
*/
@Around(value = "executePointCut()")
@Around(value = "@annotation(processingTime)")
public Object executeAround(ProceedingJoinPoint pjp, ProcessingInterval processingTime){
Object obj = null;
try {
......
......@@ -20,4 +20,59 @@ public class PropertiesConfig {
@Value("${rpc.url.rpcKafkaReceive2}")
private String rpcKafkaReceive146;
/**
* 发件人的邮箱的SMTP服务器地址
*/
@Value("${export.mail.smtp.host}")
private String host ;
/**
* auth 需要请求认证
*/
@Value("${export.mail.needauth}")
private String auth ;
/**
* 发送服务器的端口号
* @return
*/
@Value("${export.mail.smtp.port}")
private String port;
/**
* 是否启用代理(uat,prod 在外网,需要使用代理)
*/
@Value("${export.mail.proxy.startFlag}")
private String proxyStartFlag;
/**
* 代理服务器地址
*/
@Value("${export.mail.proxy.host}")
private String proxyHost;
/**
* 代理服务器端口
*/
@Value("${export.mail.proxy.port}")
private String proxyPort;
@Value("${export.mail.mailAccountFlag}")
private String mailAccountFlag;
@Value("${url.baseUrl}")
String baseUrl;
@Value("${url.fedex}")
String fedex;
@Value("${url.line}")
String line;
@Value("${export.mail.sendEmail.account}")
String emailAccount;
@Value("${export.mail.sendEmail.password}")
String emailPassword;
}
\ No newline at end of file
......
......@@ -6,4 +6,7 @@ import lombok.Data;
public class PortFileDto {
private String destIataCode;
private String zipPath;
private String shipperContactName;
private String shipperEmail;
private String shipperPhone;
}
......
......@@ -5,4 +5,7 @@ import lombok.Data;
public class PushZipEmailDto {
private String destIataCode;
private String filePath;
private String shipperContactName;
private String shipperEmail;
private String shipperPhone;
}
......
......@@ -25,11 +25,11 @@ public class EmailJob {
* @param
* @return void
*/
@ProcessingInterval(paramCode = ParamConfigConstants.TASK_PARAM_KEYS.NOTIFICATION_SENDER_EMAIL_INTERVAL)
@Scheduled(cron = "${export.task.allocation.sendOb}")
public void notificationSenderTask() {
duplicateConsignmentEmailService.duplicateConsignmentEmail();
}
//@ProcessingInterval(paramCode = ParamConfigConstants.TASK_PARAM_KEYS.NOTIFICATION_SENDER_EMAIL_INTERVAL)
//@Scheduled(cron = "${export.task.allocation.sendOb}")
//public void notificationSenderTask() {
// duplicateConsignmentEmailService.duplicateConsignmentEmail();
//}
/**
* @Author Szl
......@@ -47,11 +47,11 @@ public class EmailJob {
/**
* 发送失败邮件提醒
*/
@ProcessingInterval(paramCode = ParamConfigConstants.TASK_PARAM_KEYS.SEND_FAIL_ALERT_INTERVAL)
@Scheduled(cron = "${export.task.allocation.warningEmail}")
public void sendingFailedEmailAlert() {
sendWarningEmail.sendFailedEmail();
}
//@ProcessingInterval(paramCode = ParamConfigConstants.TASK_PARAM_KEYS.SEND_FAIL_ALERT_INTERVAL)
//@Scheduled(cron = "${export.task.allocation.sendOb}")
//public void sendingFailedEmailAlert() {
// sendWarningEmail.sendFailedEmail();
//}
}
......
......@@ -24,7 +24,7 @@ public class Imp001Job {
@ProcessingInterval(paramCode = ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_INTERVAL)
@Scheduled(cron = "${export.task.allocation.sendOb}")
public void sendObTask() {
sendObService.sendOb();
//sendObService.sendOb();
}
/**
......@@ -33,6 +33,6 @@ public class Imp001Job {
@ProcessingInterval
@Scheduled(cron = "${export.task.allocation.sendObRetry}")
public void sendObRetryTask() {
sendObService.sendObRetry();
//sendObService.sendObRetry();
}
}
......
......@@ -39,4 +39,6 @@ public class AbstractDaoRepository {
protected ParamConfigExtMapper paramConfigExtMapper;
@Autowired
protected ConsignmentMapper consignmentMapper;
@Autowired
protected EmailHistoryExtMapper emailHistoryExtMapper;
}
\ No newline at end of file
......
......@@ -9,7 +9,7 @@ import java.util.List;
@Mapper
public interface AttachmentExtMapper {
@Select("SELECT a.FILE_PATH, c.DEST_IATA_CODE, c.CONSIGNMENT_CODE " +
@Select("SELECT a.FILE_PATH, c.DEST_IATA_CODE, c.CONSIGNMENT_CODE, c.SHIPPER_CONTACT_NAME, c.SHIPPER_EMAIL, c.SHIPPER_PHONE " +
"FROM T_BIZ_ATTACHMENT a " +
"JOIN T_BIZ_CONSIGNMENT c ON a.BIZ_ID = c.ID " +
"WHERE a.BIZ_ID = #{bizId}")
......
package com.fedex.connect.task.repository.dao;
import com.fedex.connect.common.model.log.EmailHistory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface EmailHistoryExtMapper {
@Select("<script>" +
"SELECT * " +
"FROM T_LOG_EMAIL_HISTORY " +
"WHERE MODIFY_TIME >= TO_DATE(#{modifyTime}, 'YYYY-MM-DD')" +
"</script>")
List<EmailHistory> findEmailsByModifyTime(@Param("modifyTime") String modifyTime);
}
......@@ -28,8 +28,8 @@ public interface PushObMapperExt {
@Select("<script>" +
"SELECT * " +
"FROM T_BIZ_EMAIL " +
"WHERE MODIFY_TIME &gt;= #{modifyTime}" +
"FROM T_BIZ_PUSH_OB " +
"WHERE MODIFY_TIME >= TO_DATE(#{modifyTime}, 'YYYY-MM-DD')" +
"</script>")
List<PushOb> findPushObByModifyTime(@Param("modifyTime") String modifyTime);
}
\ No newline at end of file
......
......@@ -8,7 +8,7 @@
FROM T_BIZ_EMAIL
WHERE TYPE_CODE = #{typeCode}
AND STATUS_CODE = #{statusCode}
ORDER BY CREATED_DATE DESC
ORDER BY CREATE_TIME DESC
)
WHERE ROWNUM &lt; #{rowLimit}
</select>
......
......@@ -2,6 +2,11 @@ package com.fedex.connect.task.repository.repo.log;
import com.fedex.connect.common.model.log.EmailHistory;
import java.util.List;
public interface IEmailHistoryRepository {
void saveOrUpdate(EmailHistory entity);
List<EmailHistory> findEmailsByModifyTime(String modifyTime);
}
......
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;
......@@ -21,4 +20,9 @@ public class EmailHistoryRepositoryImpl extends AbstractDaoRepository implements
}
}
}
@Override
public List<EmailHistory> findEmailsByModifyTime(String modifyTime) {
return emailHistoryExtMapper.findEmailsByModifyTime(modifyTime);
}
}
......
package com.fedex.connect.task.service.biz;
public interface IPushObService {
/**
* @Author mt
* @Description 推送Imp001报文数据zip包文件
* @Date 2024/8/2
* @param
* @return void
*/
void sendOb();
/**
* @Author mt
* @Description 推送Imp001文件错误重试
* @Date 2024/8/2
* @param
* @return void
*/
void sendObRetry();
///**
// * @Author mt
// * @Description 推送Imp001报文数据zip包文件
// * @Date 2024/8/2
// * @param
// * @return void
// */
//void sendOb();
///**
// * @Author mt
// * @Description 推送Imp001文件错误重试
// * @Date 2024/8/2
// * @param
// * @return void
// */
//void sendObRetry();
}
\ No newline at end of file
......
......@@ -38,7 +38,7 @@ public class DuplicateConsignmentEmailServiceImpl extends BaseService implements
* 查询邮件发送日志表中状态为待推送且类型为“提醒发件人”的数据
*/
List<Email> emails = iEmailExtRepository.findEmailsByDic(cacheSystem.getDicEmailType(EmailTypeEnum.NOTIFICATION_SENDER.getCode()).getCode(),
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg()).getCode(), ParamConfigConstants.TASK_PARAM_KEYS.NOTIFICATION_SENDER_EMAIL_NUMBER);
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getCode()).getCode(), ParamConfigConstants.TASK_PARAM_KEYS.NOTIFICATION_SENDER_EMAIL_NUMBER);
/**
* 发送邮件
*/
......@@ -47,7 +47,7 @@ public class DuplicateConsignmentEmailServiceImpl extends BaseService implements
* 构造邮件dto
*/
MailConfigDto mailConfigDto = new MailConfigDto();
duplicateEmailUtil.createMailConfigDto(mailConfigDto);
duplicateEmailUtil.createMailConfigDto(mailConfigDto,email);
/**
* 发送邮件
*/
......
......@@ -56,21 +56,27 @@ public class PushConsignmentFileServiceImpl extends BaseService implements IPush
String tempPath = "";
String finalPath = "";
//查询需要发送的数据
List<Email> conPushEmails = iEmailExtRepository.findEmailsByDic(cacheSystem.getDicEmailType(EmailTypeEnum.PUSH_CON_FILE.getEnMsg()).getCode(),
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg()).getCode(),ParamConfigConstants.TASK_PARAM_KEYS.PUSH_CON_NUMBER);
List<Email> conPushEmails = iEmailExtRepository.findEmailsByDic(cacheSystem.getDicEmailType(EmailTypeEnum.PUSH_CON_FILE.getCode()).getCode(),
cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getCode()).getCode(),ParamConfigConstants.TASK_PARAM_KEYS.PUSH_CON_NUMBER);
for (Email conPushEmail : conPushEmails) {
//获取待发送的文件并打zip包
PortFileDto portFileDto = new PortFileDto();
List<PushZipEmailDto> attachmentDetailsByBizId = attachmentExtRepository.findAttachmentDetailsByBizId(conPushEmail.getBizId());
portFileDto = conFileEmailUtil.getPortZipMap(portFileDto, attachmentDetailsByBizId, tempPath, finalPath, zipUtils);
//发送邮件
MailConfigDto mailMessageReqDto = new MailConfigDto();
boolean result = conFileEmailUtil.sendEmail(portFileDto, emailUtil,mailMessageReqDto);
//根据是否成功发送邮件对文件进行备份
String filePath = conFileEmailUtil.backFile(portFileDto.getZipPath(), nioFileUtils,result);
//更新邮件记录表
conFileEmailUtil.createEmail(cacheSystem,conPushEmail,mailMessageReqDto,result,filePath);
boolean result = true;
try {
//获取待发送的文件并打zip包
PortFileDto portFileDto = new PortFileDto();
List<PushZipEmailDto> attachmentDetailsByBizId = attachmentExtRepository.findAttachmentDetailsByBizId(conPushEmail.getBizId());
portFileDto = conFileEmailUtil.getPortZipMap(portFileDto, attachmentDetailsByBizId, tempPath, finalPath, zipUtils);
//发送邮件
MailConfigDto mailMessageReqDto = new MailConfigDto();
result = conFileEmailUtil.sendEmail(portFileDto, emailUtil,mailMessageReqDto,conPushEmail);
//根据是否成功发送邮件对文件进行备份
String filePath = conFileEmailUtil.backFile(portFileDto.getZipPath(), nioFileUtils,result);
//更新邮件记录表
conFileEmailUtil.createEmail(cacheSystem,conPushEmail,mailMessageReqDto,result,filePath);
}catch (Exception e){
log.error("推送清关文件邮件异常",e);
result = false;
}
//保存入库
conFileEmailUtil.saveEmail(conPushEmail,result);
}
......
......@@ -8,9 +8,7 @@ import com.fedex.connect.common.model.sys.ParamConfig;
import com.fedex.connect.task.data.bo.Imp001GenerateBo;
import com.fedex.connect.task.service.base.BaseService;
import com.fedex.connect.task.service.biz.IPushObService;
import com.fedex.connect.task.utils.biz.imp001.Imp001GenerateUtil;
import com.fedex.connect.task.utils.biz.imp001.Imp001PushUtil;
import com.fedex.connect.task.utils.biz.imp001.Imp001RecordLogUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -27,87 +25,87 @@ import java.util.Objects;
@Slf4j
@Service
public class PushObServiceImpl extends BaseService implements IPushObService {
@Autowired
Imp001GenerateUtil imp001GenerateUtil;
@Autowired
Imp001PushUtil imp001PushUtil;
@Autowired
Imp001RecordLogUtil imp001RecordLogUtil;
/**
* 推送OB报文数据zip包文件
*/
@Override
public void sendOb() {
//获取每次处理数据量量参数
ParamConfig paramConfig = paramConfigRepository.findValueByCode(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER);
Long rownum = Long.parseLong(paramConfig.getValue());
//获取需要处理的记录
List<PushOb> pushObList = pushObRepository.findPushOb(PushObStatusEnum.TO_BE_SENT.getCode(),rownum);
//推送imp001数据
this.pushOb(pushObList);
}
/**
* 推送OB文件错误重试
*/
@Override
public void sendObRetry() {
//获取每次处理数据量量参数
Map<String,ParamConfig> paramConfig = paramConfigRepository.findValueByCodes(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER,
ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_RETRY_NUMBER);
//推送IMP001重试处理数量
ParamConfig retryNumConfig = paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_RETRY_NUMBER);
Long retryNum = Long.parseLong(retryNumConfig.getCode());
//推送IMP001定时任务处理数量
ParamConfig rownumConfig = paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER);
Long rownum = Long.parseLong(rownumConfig.getCode());
//获取需要重新处理的记录:处理4次以下,并且推送失败的
List<PushOb> errPushObLog = pushObRepository.findErrPushOb(retryNum, PushObStatusEnum.PUSH_FAILED.getCode(),rownum);
if (errPushObLog!=null && !errPushObLog.isEmpty()){
log.info("sendObRetryTask : sendObRetry size: "+errPushObLog.size());
//重新推送tw001数据
this.pushOb(errPushObLog);
}else{
log.info("sendObRetryTask : No data found for sendObRetry!");
}
}
/**
* @Author mt
* @Description 推送tw001数据
* @Date 2024/5/29
* @param pushObList
* @return void
*/
private void pushOb(List<PushOb> pushObList){
Utils.listOf(pushObList).stream().filter(Objects::nonNull).forEach(ob ->{
boolean flag = false;
String errorMsg = "";
Imp001GenerateBo imp001GenerateBo = null;
try {
//生成tw001 json对象dto
imp001GenerateBo = imp001GenerateUtil.generateImp001Json(ob);
//根据tw001 json对象生成并且推送zip包
imp001PushUtil.pushImp001(imp001GenerateBo);
flag = true;
}catch(Exception ex){
log.error("pushOb error : ",ex);
errorMsg = ex.getMessage();
flag = false;
}finally{
/**
* 如果生成失败,推送失败,则不会记录推送日志明细,更新推送日志表。
* 记录日志,并且备份
*/
if(flag){
//推送成功
imp001RecordLogUtil.pushSuccessRecordLog(imp001GenerateBo, ob);
}else{
//推送失败
imp001RecordLogUtil.pushFailRecordLog(imp001GenerateBo, ob, errorMsg);
}
}
});
}
//@Autowired
//Imp001GenerateUtil imp001GenerateUtil;
//@Autowired
//Imp001PushUtil imp001PushUtil;
//@Autowired
//Imp001RecordLogUtil imp001RecordLogUtil;
//
///**
// * 推送OB报文数据zip包文件
// */
//@Override
//public void sendOb() {
// //获取每次处理数据量量参数
// ParamConfig paramConfig = paramConfigRepository.findValueByCode(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER);
// Long rownum = Long.parseLong(paramConfig.getValue());
// //获取需要处理的记录
// List<PushOb> pushObList = pushObRepository.findPushOb(PushObStatusEnum.TO_BE_SENT.getCode(),rownum);
// //推送imp001数据
// this.pushOb(pushObList);
//}
//
///**
// * 推送OB文件错误重试
// */
//@Override
//public void sendObRetry() {
// //获取每次处理数据量量参数
// Map<String,ParamConfig> paramConfig = paramConfigRepository.findValueByCodes(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER,
// ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_RETRY_NUMBER);
// //推送IMP001重试处理数量
// ParamConfig retryNumConfig = paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_RETRY_NUMBER);
// Long retryNum = Long.parseLong(retryNumConfig.getCode());
// //推送IMP001定时任务处理数量
// ParamConfig rownumConfig = paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.PUSH_IMP001_NUMBER);
// Long rownum = Long.parseLong(rownumConfig.getCode());
// //获取需要重新处理的记录:处理4次以下,并且推送失败的
// List<PushOb> errPushObLog = pushObRepository.findErrPushOb(retryNum, PushObStatusEnum.PUSH_FAILED.getCode(),rownum);
// if (errPushObLog!=null && !errPushObLog.isEmpty()){
// log.info("sendObRetryTask : sendObRetry size: "+errPushObLog.size());
// //重新推送tw001数据
// this.pushOb(errPushObLog);
// }else{
// log.info("sendObRetryTask : No data found for sendObRetry!");
// }
//}
//
///**
// * @Author mt
// * @Description 推送tw001数据
// * @Date 2024/5/29
// * @param pushObList
// * @return void
// */
//private void pushOb(List<PushOb> pushObList){
// Utils.listOf(pushObList).stream().filter(Objects::nonNull).forEach(ob ->{
// boolean flag = false;
// String errorMsg = "";
// Imp001GenerateBo imp001GenerateBo = null;
// try {
// //生成tw001 json对象dto
// imp001GenerateBo = imp001GenerateUtil.generateImp001Json(ob);
// //根据tw001 json对象生成并且推送zip包
// imp001PushUtil.pushImp001(imp001GenerateBo);
// flag = true;
// }catch(Exception ex){
// log.error("pushOb error : ",ex);
// errorMsg = ex.getMessage();
// flag = false;
// }finally{
// /**
// * 如果生成失败,推送失败,则不会记录推送日志明细,更新推送日志表。
// * 记录日志,并且备份
// */
// if(flag){
// //推送成功
// imp001RecordLogUtil.pushSuccessRecordLog(imp001GenerateBo, ob);
// }else{
// //推送失败
// imp001RecordLogUtil.pushFailRecordLog(imp001GenerateBo, ob, errorMsg);
// }
// }
// });
//}
}
\ No newline at end of file
......
package com.fedex.connect.task.service.sys.impl;
import com.fedex.connect.common.dependencies.util.DateUtil;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.common.model.biz.PushOb;
import com.fedex.connect.common.model.log.EmailHistory;
import com.fedex.connect.common.model.sys.ParamConfig;
import com.fedex.connect.task.config.PropertiesConfig;
import com.fedex.connect.task.data.dto.MailConfigDto;
import com.fedex.connect.task.data.dto.SendFailedEmailDto;
import com.fedex.connect.task.service.base.BaseService;
......@@ -28,6 +29,9 @@ public class SendFailedEmailAlertServiceImpl extends BaseService implements ISen
@Autowired
private EmailUtil emailUtil;
@Autowired
private PropertiesConfig propertiesConfig;
/**
* @Author Szl
* @Description 功能说明 推送错误预警邮件
......@@ -45,7 +49,7 @@ public class SendFailedEmailAlertServiceImpl extends BaseService implements ISen
* 查询需要发送邮件的记录
*/
String date = DateUtil.format(new Date());
List<Email> emails = sendFailedEmailUtil.getEmails(date);
List<EmailHistory> emails = sendFailedEmailUtil.getEmails(date);
/**
* 查询推送文件集合
*/
......@@ -61,7 +65,7 @@ public class SendFailedEmailAlertServiceImpl extends BaseService implements ISen
/**
* 构建发送邮件dto
*/
MailConfigDto mailConfigDto = sendFailedEmailUtil.createMailConfigDto(emailBody);
MailConfigDto mailConfigDto = sendFailedEmailUtil.createMailConfigDto(emailBody,propertiesConfig);
/**
* 发送邮件
*/
......
......@@ -4,6 +4,7 @@ import com.fedex.connect.common.dependencies.cache.CacheSystem;
import com.fedex.connect.common.dependencies.contants.BaseConstants;
import com.fedex.connect.common.dependencies.contants.BaseSeparatorConstants;
import com.fedex.connect.common.dependencies.enums.biz.EmailStatusEnum;
import com.fedex.connect.common.dependencies.i18n.LocaleMessageUtil;
import com.fedex.connect.common.dependencies.template.clearanceEmail.ClearanceEmailTemplate;
import com.fedex.connect.common.dependencies.util.DateUtil;
import com.fedex.connect.common.dependencies.util.NIOFileUtils;
......@@ -11,6 +12,7 @@ import com.fedex.connect.common.dependencies.util.ZipUtils;
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.config.PropertiesConfig;
import com.fedex.connect.task.data.bo.MailAttachmentBo;
import com.fedex.connect.task.data.dto.MailConfigDto;
import com.fedex.connect.task.data.dto.PortFileDto;
......@@ -24,6 +26,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.io.File;
import java.io.FileOutputStream;
......@@ -32,6 +35,7 @@ import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
/**
* @Author Szl
......@@ -54,6 +58,12 @@ public class ConFileEmailUtil {
@Autowired
private IEmailHistoryRepository emailHistoryRepository;
@Autowired
private PropertiesConfig propertiesConfig;
@Autowired
protected LocaleMessageUtil lmUtil;
/**
* @Author Szl
* @Description 功能说明 根据运单打包,一票一个zip包
......@@ -75,12 +85,17 @@ public class ConFileEmailUtil {
if (file.exists()) {
filesList.add(file);
}
portFileDto.setShipperContactName(pushZipEmailDto.getShipperContactName());
portFileDto.setShipperEmail(pushZipEmailDto.getShipperEmail());
portFileDto.setShipperPhone(pushZipEmailDto.getShipperPhone());
}
String date = DateUtil.yyyyMMddHHmmss(new Date());
String fileName = date + BaseSeparatorConstants.SEPARATOR_UNDERLINE + portCode + BaseConstants.FILE_SUFFIX_KEYS.ZIP;
String fileNameTemp = date + BaseSeparatorConstants.SEPARATOR_UNDERLINE + portCode + BaseConstants.FILE_SUFFIX_KEYS.ZIP + BaseConstants.FILE_SUFFIX_KEYS.TEMP;
FileOutputStream fos = null;
if (CollectionUtils.isEmpty(filesList)){
return portFileDto;
}
try {
fos = new FileOutputStream(tempPath + fileNameTemp);
zipUtils.toZip(filesList, fos);
......@@ -118,7 +133,7 @@ public class ConFileEmailUtil {
* @param portFileDto
* @return void
*/
public boolean sendEmail(PortFileDto portFileDto,EmailUtil emailUtil,MailConfigDto mailMessageReqDto){
public boolean sendEmail(PortFileDto portFileDto,EmailUtil emailUtil,MailConfigDto mailMessageReqDto,Email conPushEmail){
/**
* 获取邮件地址
*/
......@@ -126,7 +141,7 @@ public class ConFileEmailUtil {
/**
* 构建发送邮件对象
*/
this.createMailMessageReqDto(emailAddress, portFileDto,mailMessageReqDto);
this.createMailMessageReqDto(emailAddress, portFileDto,mailMessageReqDto,propertiesConfig,conPushEmail);
/**
* 发送邮件
*/
......@@ -143,32 +158,75 @@ public class ConFileEmailUtil {
* @param portFileDto
* @return com.fedex.connect.task.data.dto.MailMessageReqDto
*/
private MailConfigDto createMailMessageReqDto(String emailAddress, PortFileDto portFileDto,MailConfigDto mailConfigDto){
mailConfigDto.setHost("");
mailConfigDto.setPort("");
mailConfigDto.setAuth("");
private MailConfigDto createMailMessageReqDto(String emailAddress, PortFileDto portFileDto,MailConfigDto mailConfigDto,PropertiesConfig propertiesConfig,Email conPushEmail){
mailConfigDto.setHost(propertiesConfig.getHost());
mailConfigDto.setPort(propertiesConfig.getPort());
mailConfigDto.setAuth(propertiesConfig.getAuth());
//设置代理
mailConfigDto.setProxyStartFlag("");
mailConfigDto.setProxyHost("");
mailConfigDto.setProxyPort("");
//发件人
mailConfigDto.setFrom("");
//发件人密码
mailConfigDto.setPassword("");
mailConfigDto.setProxyStartFlag(propertiesConfig.getProxyStartFlag());
mailConfigDto.setProxyHost(propertiesConfig.getProxyHost());
mailConfigDto.setProxyPort(propertiesConfig.getProxyPort());
//ce接收人
mailConfigDto.setTo(emailAddress);
//设置邮件标题
mailConfigDto.setSubject(clearanceEmailTemplate.getTitle());
//设置邮件内容
mailConfigDto.setContent(clearanceEmailTemplate.getBody());
String body = this.generateContent("zelong.shao@erry.com", propertiesConfig.getEmailAccount(), portFileDto, conPushEmail.getBizCode());
mailConfigDto.setContent(body);
//放入文件列表
List<MailAttachmentBo> srcFiles = new ArrayList<>();
File file = new File(portFileDto.getZipPath());
srcFiles.add(new MailAttachmentBo(file, ""));
mailConfigDto.setFileList(srcFiles);
if (!StringUtils.isEmpty(portFileDto.getZipPath())){
List<MailAttachmentBo> srcFiles = new ArrayList<>();
File file = new File(portFileDto.getZipPath());
srcFiles.add(new MailAttachmentBo(file, ""));
mailConfigDto.setFileList(srcFiles);
}
if (propertiesConfig.getEnv().equalsIgnoreCase("dev")
|| propertiesConfig.getEnv().equalsIgnoreCase("test")
) {
//ce接收人
mailConfigDto.setTo("zelong.shao@erry.com");
mailConfigDto.setCcAccount("");
mailConfigDto.setReceiveAccount("zelong.shao@erry.com");
//发件人
mailConfigDto.setFrom(propertiesConfig.getEmailAccount());
//发件人密码
mailConfigDto.setPassword(propertiesConfig.getEmailPassword());
mailConfigDto.setMailAccountFlag(propertiesConfig.getMailAccountFlag());
mailConfigDto.setSenderAccount(propertiesConfig.getEmailAccount());
mailConfigDto.setSenderPassword(propertiesConfig.getEmailPassword());
}
return mailConfigDto;
}
private String generateContent( String to,String from, PortFileDto portFileDto,String consignmentCode){
//String consignmentCodeMessage = Optional.ofNullable(lmUtil.getMessage("business_field_31009")).orElse("Consignment Code");
//String liaisons = Optional.ofNullable(lmUtil.getMessage("business_field_31010")).orElse("Contact Person");
//String email = Optional.ofNullable(lmUtil.getMessage("business_field_31011")).orElse("Contact Person's Email");
//String tel = Optional.ofNullable(lmUtil.getMessage("business_field_31012")).orElse("Contact Phone");
StringBuilder content = new StringBuilder();
content.append("<font size=\"4\"><br/> " );
content.append("Consignment Code" + ":" + Optional.ofNullable(consignmentCode).orElse(""));
content.append("<br/> " );
content.append("Contact Person" + ":" + Optional.ofNullable(portFileDto.getShipperContactName()).orElse(""));
content.append("<br/> " );
content.append("Contact Person's Email" + ":" + Optional.ofNullable(portFileDto.getShipperEmail()).orElse(""));
content.append("<br/> " );
content.append("Contact Phone" + ":" + Optional.ofNullable(portFileDto.getShipperPhone()).orElse(""));
content.append("</font><br/><br/> " );
content.append("<div style=\"color:#808080;font-style:Arial;font-size:14px;\">" +
"This email was to send declaration files uploaded by customer on the FedEx online declaration platform to " +
Optional.ofNullable(to).orElse("edd@fedex.com") +
" through " +
Optional.ofNullable(from).orElse("donotreply@fedex.com") +
", please do not reply</div>");
return content.toString();
}
/**
* @Author Szl
* @Description 功能说明 根据口岸获取邮件地址
......@@ -177,7 +235,7 @@ public class ConFileEmailUtil {
* @return java.lang.String
*/
private String getEmailAddress(PortFileDto portFileDto){
if (BaseConstants.CONSIGNMENT_TABLE_COLUMN_KEYS.DEST_IATA_CODE.equals(portFileDto.getDestIataCode())){
if (BaseConstants.CONSIGNMENT_TABLE_COLUMN_KEYS.DEST_IATA_CODE.equals(portFileDto.getDestIataCode()) || StringUtils.isEmpty(portFileDto.getDestIataCode())){
portFileDto.setDestIataCode("OTHER");
}
String emailByPortCode = portclearEmailMappingExtRepository.findEmailByPortCode(portFileDto.getDestIataCode());
......@@ -198,9 +256,9 @@ public class ConFileEmailUtil {
* @return void
*/
public void createEmail(CacheSystem cacheSystem, Email conPushEmail, MailConfigDto mailMessageReqDto, boolean result,String filePath){
DictionaryEntries pending = cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getEnMsg());
DictionaryEntries success = cacheSystem.getDicEmailStatus(EmailStatusEnum.SUCCESS.getEnMsg());
DictionaryEntries failed = cacheSystem.getDicEmailStatus(EmailStatusEnum.FAILED.getEnMsg());
DictionaryEntries pending = cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getCode());
DictionaryEntries success = cacheSystem.getDicEmailStatus(EmailStatusEnum.SUCCESS.getCode());
DictionaryEntries failed = cacheSystem.getDicEmailStatus(EmailStatusEnum.FAILED.getCode());
conPushEmail.setToAddress(mailMessageReqDto.getTo());
conPushEmail.setCcAddress(mailMessageReqDto.getCc());
conPushEmail.setSubject(mailMessageReqDto.getSubject());
......
package com.fedex.connect.task.utils.sys;
import com.fedex.connect.common.dependencies.cache.CacheSystem;
import com.fedex.connect.common.dependencies.contants.ParamConfigConstants;
import com.fedex.connect.common.dependencies.enums.biz.EmailStatusEnum;
import com.fedex.connect.common.dependencies.template.clearanceEmail.DuplicateEmailTemplate;
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.common.model.sys.ParamConfig;
import com.fedex.connect.task.config.PropertiesConfig;
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 com.fedex.connect.task.repository.repo.sys.IParamConfigRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -24,6 +29,15 @@ public class DuplicateEmailUtil {
@Autowired
private IEmailHistoryRepository emailHistoryRepository;
@Autowired
private PropertiesConfig propertiesConfig;
@Autowired
private DuplicateEmailTemplate duplicateEmailTemplate;
@Autowired
private IParamConfigRepository paramConfigRepository;
/**
* @Author Szl
* @Description 功能说明 初始化邮件dto
......@@ -31,29 +45,74 @@ public class DuplicateEmailUtil {
* @param mailConfigDto
* @return com.fedex.connect.task.data.dto.MailConfigDto
*/
public MailConfigDto createMailConfigDto(MailConfigDto mailConfigDto){
mailConfigDto.setHost("");
mailConfigDto.setPort("");
mailConfigDto.setAuth("");
public MailConfigDto createMailConfigDto(MailConfigDto mailConfigDto,Email email){
mailConfigDto.setHost(propertiesConfig.getHost());
mailConfigDto.setPort(propertiesConfig.getPort());
mailConfigDto.setAuth(propertiesConfig.getAuth());
//设置代理
mailConfigDto.setProxyStartFlag("");
mailConfigDto.setProxyHost("");
mailConfigDto.setProxyPort("");
//发件人
mailConfigDto.setFrom("");
//发件人密码
mailConfigDto.setPassword("");
mailConfigDto.setProxyStartFlag(propertiesConfig.getProxyStartFlag());
mailConfigDto.setProxyHost(propertiesConfig.getProxyHost());
mailConfigDto.setProxyPort(propertiesConfig.getProxyPort());
//ce接收人
mailConfigDto.setTo("");
mailConfigDto.setTo(email.getToAddress());
mailConfigDto.setCcAccount(email.getCcAddress());
mailConfigDto.setReceiveAccount(email.getToAddress());
//设置邮件标题
mailConfigDto.setSubject("");
//设置邮件内容
mailConfigDto.setContent("");
mailConfigDto.setSubject(duplicateEmailTemplate.getTitle());
String emailBody = this.createEmailBody(email.getBizCode());
mailConfigDto.setContent(emailBody);
if (propertiesConfig.getEnv().equalsIgnoreCase("dev")
|| propertiesConfig.getEnv().equalsIgnoreCase("test")
) {
//发件人
mailConfigDto.setFrom(propertiesConfig.getEmailAccount());
//发件人密码
mailConfigDto.setPassword(propertiesConfig.getEmailPassword());
mailConfigDto.setMailAccountFlag(propertiesConfig.getMailAccountFlag());
mailConfigDto.setSenderAccount(propertiesConfig.getEmailAccount());
mailConfigDto.setSenderPassword(propertiesConfig.getEmailPassword());
}
return mailConfigDto;
}
/**
* @Author Szl
* @Description 功能说明 构建邮件body
* @Date 2024/11/22
* @param bizCode
* @return void
*/
private String createEmailBody(String bizCode){
/**
* 邮件备注
*/
StringBuffer remarks = new StringBuffer();
ParamConfig paramConfig = paramConfigRepository.findValueByCode(ParamConfigConstants.TASK_PARAM_KEYS.NOTIFICATION_SENDER_EMAIL_INTERVAL);
this.buildBottom(remarks,paramConfig.getValue());
/**
* 添加模板
*/
return duplicateEmailTemplate.getBody(propertiesConfig.getBaseUrl()+propertiesConfig.getLine(),
propertiesConfig.getBaseUrl()+propertiesConfig.getFedex(),
bizCode, remarks);
}
/**
* @Author Szl
* @Description 功能说明 构建底部备注
* @Date 2024/11/21
* @param remarks
* @return void
*/
private void buildBottom(StringBuffer remarks, String paramConfig){
remarks.append(duplicateEmailTemplate.getDescription(paramConfig));
}
/**
* @Author Szl
* @Description 功能说明 更新Email状态
* @Date 2024/11/20
* @param result
......@@ -62,21 +121,21 @@ public class DuplicateEmailUtil {
* @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());
DictionaryEntries pending = cacheSystem.getDicEmailStatus(EmailStatusEnum.PENDING.getCode());
DictionaryEntries success = cacheSystem.getDicEmailStatus(EmailStatusEnum.SUCCESS.getCode());
DictionaryEntries failed = cacheSystem.getDicEmailStatus(EmailStatusEnum.FAILED.getCode());
email.setSendTime(new Date());
if (result){
email.setTypeCode(success.getCode());
email.setTypeName(success.getEnglishName());
email.setStatusCode(success.getCode());
email.setStatusName(success.getEnglishName());
}else {
if (email.getSendNum()<3){
email.setTypeCode(pending.getCode());
email.setTypeName(pending.getEnglishName());
email.setStatusCode(pending.getCode());
email.setStatusName(pending.getEnglishName());
email.setSendNum(email.getSendNum()+1);
}else {
email.setTypeCode(failed.getCode());
email.setTypeName(failed.getEnglishName());
email.setStatusCode(failed.getCode());
email.setStatusName(failed.getEnglishName());
}
}
}
......
......@@ -7,10 +7,10 @@ import com.fedex.connect.common.dependencies.enums.biz.EmailTypeEnum;
import com.fedex.connect.common.dependencies.enums.biz.PushObStatusEnum;
import com.fedex.connect.common.dependencies.template.clearanceEmail.SendFailedEmailTemplate;
import com.fedex.connect.common.dependencies.util.AssignmentFieldUtils;
import com.fedex.connect.common.model.biz.Email;
import com.fedex.connect.common.model.biz.PushOb;
import com.fedex.connect.common.model.log.EmailHistory;
import com.fedex.connect.common.model.sys.ParamConfig;
import com.fedex.connect.task.config.PropertiesConfig;
import com.fedex.connect.task.data.dto.MailConfigDto;
import com.fedex.connect.task.data.dto.SendFailedEmailDto;
import com.fedex.connect.task.repository.repo.biz.IEmailRepository;
......@@ -44,8 +44,8 @@ public class SendFailedEmailUtil {
* @param
* @return java.util.List<com.fedex.connect.common.model.biz.Email>
*/
public List<Email> getEmails(String date){
return emailRepository.findEmailsByModifyTime(date);
public List<EmailHistory> getEmails(String date){
return emailHistoryRepository.findEmailsByModifyTime(date);
}
/**
......@@ -64,7 +64,7 @@ public class SendFailedEmailUtil {
* @param emails
* @return java.util.List<com.fedex.connect.task.data.dto.SendFailedEmailDto>
*/
public List<SendFailedEmailDto> createSendFailedEmailDto(List<Email> emails,List<PushOb> obs,Map<String, ParamConfig> paramConfig){
public List<SendFailedEmailDto> createSendFailedEmailDto(List<EmailHistory> emails,List<PushOb> obs,Map<String, ParamConfig> paramConfig){
List<SendFailedEmailDto> emailDto = this.getEmailDto(emails,paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.FAILED_EMAIL_CON_NUMBER).getValue());
if (!CollectionUtils.isEmpty(obs)){
SendFailedEmailDto obDto = this.getObDto(obs,paramConfig.get(ParamConfigConstants.TASK_PARAM_KEYS.FAILED_EMAIL_CON_NUMBER).getValue());
......@@ -98,18 +98,18 @@ public class SendFailedEmailUtil {
* @param emails
* @return java.util.List<com.fedex.connect.task.data.dto.SendFailedEmailDto>
*/
private List<SendFailedEmailDto> getEmailDto(List<Email> emails,String size){
private List<SendFailedEmailDto> getEmailDto(List<EmailHistory> emails,String size){
// 定义所有可能的 TYPE_CODE
List<String> allTypeCodes = EmailTypeEnum.getFailedAlertCodes();
// 按 TYPE_CODE 分组
Map<String, List<Email>> groupedEmails = emails.stream()
.collect(Collectors.groupingBy(Email::getTypeCode));
Map<String, List<EmailHistory>> groupedEmails = emails.stream()
.collect(Collectors.groupingBy(EmailHistory::getTypeCode));
// 处理每个 TYPE_CODE
List<SendFailedEmailDto> results = allTypeCodes.stream()
.map(typeCode -> {
List<Email> emailList = groupedEmails.getOrDefault(typeCode, Collections.emptyList());
List<EmailHistory> emailList = groupedEmails.getOrDefault(typeCode, Collections.emptyList());
// 1. 统计 STATUS_CODE 为 FAILED 的数量
long statusCodeCount = emailList.stream()
......@@ -118,9 +118,9 @@ public class SendFailedEmailUtil {
// 2. 获取 MODIFY_TIME 最晚的 10 个 BIZ_CODE
List<String> latestBizCodes = emailList.stream()
.sorted(Comparator.comparing(Email::getModifyTime).reversed())
.sorted(Comparator.comparing(EmailHistory::getModifyTime).reversed())
.limit(Long.parseLong(size))
.map(Email::getBizCode)
.map(EmailHistory::getBizCode)
.collect(Collectors.toList());
// 3. 统计 TYPE_CODE 的总数量
......@@ -168,9 +168,13 @@ public class SendFailedEmailUtil {
*/
private StringBuilder getTableRows(List<SendFailedEmailDto> sendFailedEmailDto,StringBuilder tableRows){
for (SendFailedEmailDto failedEmailDto : sendFailedEmailDto) {
String bizCodesStr = failedEmailDto.getBizCodes().stream()
.filter(Objects::nonNull) // 过滤掉 null 值
.map(String::trim) // 去除每个元素的前后空格
.collect(Collectors.joining(","));
tableRows.append("<tr>" +
"<td style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;\">"+EmailTypeEnum.getEnMsgByCode(failedEmailDto.getTypeCode())+"</td>" +
"<td style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;\">"+ failedEmailDto.getBizCodes() +"</td>" +
"<td style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;\">"+ bizCodesStr +"</td>" +
"<td style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;\">"+ failedEmailDto.getTotalCount() +"</td>" +
"<td style=\"border: 1px solid #dddddd;text-align: left;padding: 8px;\">"+ failedEmailDto.getStatusCodeCount() +"</td>" +
"</tr>");
......@@ -205,25 +209,36 @@ public class SendFailedEmailUtil {
* @param body
* @return com.fedex.connect.task.data.dto.MailConfigDto
*/
public MailConfigDto createMailConfigDto(String body){
public MailConfigDto createMailConfigDto(String body, PropertiesConfig propertiesConfig){
MailConfigDto mailConfigDto = new MailConfigDto();
mailConfigDto.setHost("");
mailConfigDto.setPort("");
mailConfigDto.setAuth("");
mailConfigDto.setHost(propertiesConfig.getHost());
mailConfigDto.setPort(propertiesConfig.getPort());
mailConfigDto.setAuth(propertiesConfig.getAuth());
//设置代理
mailConfigDto.setProxyStartFlag("");
mailConfigDto.setProxyHost("");
mailConfigDto.setProxyPort("");
//发件人
mailConfigDto.setFrom("");
//发件人密码
mailConfigDto.setPassword("");
//ce接收人
mailConfigDto.setTo("");
mailConfigDto.setProxyStartFlag(propertiesConfig.getProxyStartFlag());
mailConfigDto.setProxyHost(propertiesConfig.getProxyHost());
mailConfigDto.setProxyPort(propertiesConfig.getProxyPort());
//设置邮件标题
mailConfigDto.setSubject("");
//设置邮件内容
mailConfigDto.setSubject(sendFailedEmailTemplate.getTitle());
mailConfigDto.setContent(body);
if (propertiesConfig.getEnv().equalsIgnoreCase("dev")
|| propertiesConfig.getEnv().equalsIgnoreCase("test")
) {
//ce接收人
mailConfigDto.setTo("zelong.shao@erry.com");
mailConfigDto.setCcAccount("");
mailConfigDto.setReceiveAccount("zelong.shao@erry.com");
//发件人
mailConfigDto.setFrom(propertiesConfig.getEmailAccount());
//发件人密码
mailConfigDto.setPassword(propertiesConfig.getEmailPassword());
mailConfigDto.setMailAccountFlag(propertiesConfig.getMailAccountFlag());
mailConfigDto.setSenderAccount(propertiesConfig.getEmailAccount());
mailConfigDto.setSenderPassword(propertiesConfig.getEmailPassword());
}
return mailConfigDto;
}
......@@ -242,13 +257,13 @@ public class SendFailedEmailUtil {
email.setSubject(mailConfigDto.getSubject());
email.setBody(mailConfigDto.getContent());
email.setTypeCode(EmailTypeEnum.SEND_FAILED_EMAIL.getCode());
email.setTypeName(EmailTypeEnum.SEND_FAILED_EMAIL.getMsg());
email.setTypeName(EmailTypeEnum.SEND_FAILED_EMAIL.getEnMsg());
if (result){
email.setStatusCode(EmailStatusEnum.SUCCESS.getCode());
email.setStatusName(EmailStatusEnum.SUCCESS.getMsg());
email.setStatusName(EmailStatusEnum.SUCCESS.getEnMsg());
}else {
email.setStatusCode(EmailStatusEnum.FAILED.getCode());
email.setStatusName(EmailStatusEnum.FAILED.getMsg());
email.setStatusName(EmailStatusEnum.FAILED.getEnMsg());
}
email.setSendNum(DigitConstants.DIGIT_ONE_LONG);
email.setSendTime(new Date());
......
......@@ -20,6 +20,19 @@ export:
sendObRetry: 0 0/1 * * * ?
#发送邮件到预清关组
pushConFile: 0 0/1 * * * ?
mail:
smtp:
host: smtp.qiye.aliyun.com
port: 25
needauth: true
proxy:
startFlag: false
host: sin-proxy.apac.fedex.com
port: 3128
mailAccountFlag: true
sendEmail:
account: tao.mo@erry.com
password: xiaozhen!1
rpc:
url:
......@@ -37,4 +50,9 @@ tw001:
#备份目录
bak: ${tw001.path.basePath}BAK/
#异常目录
error: ${tw001.path.basePath}ERROR/
\ No newline at end of file
error: ${tw001.path.basePath}ERROR/
url:
baseUrl: http://localhost:8084/ImpPer/
fedex: fedex.png
line: line.png
\ No newline at end of file
......
#******************系统操作日志记录,中文展示******************
business_log_20001=添加运单
business_log_20002=提交运单
business_log_20003=运单查询
business_log_20004=运单详细信息查询
business_log_20005=根据运单ID查询用户上传记录
business_log_20006=运单历史上传记录查询
system_exception_20003=提示信息过长,未保存成功
#******************鉴权相关提示,需要做国际化******************
#authentication包
system_exception_10001=没有访问权限
system_exception_10002=没有通过权限认证
system_exception_10003=登录身份异常
system_exception_10004=登录超过8小时,请重新登录
system_exception_10005=登录已过期
system_exception_10006=登录已过期,请重新登录
#******************业务相关、需要做国际化******************
#*********用于字段描述使用,不单独使用**********
business_field_31001=发货人计费账号
business_field_31002=运单ID
business_field_31003=运单号
business_field_31004=原产国编码
business_field_31005=原产国名称
business_field_31006=目的国编码
business_field_31007=目的国全称
business_field_31008=文件业务类型
business_field_31009=Consignment Code
business_field_31010=Contact Person
business_field_31011=Contact Person's Email
business_field_31012=Contact Phone
#*********具体响应到前端**********
business_exception_30001=#{0}必填字段未填写
business_exception_30002=单次最多可查询1000个运单号码
business_exception_30003=#{0}不正确,请重新输入
business_exception_30004=The waybill you entered is generated by another user, whether continue uploading? Confirm, Cancel. No more prompts in the future for the same situation.
business_exception_30005=The waybill you entered is generated by another account, whether continue uploading? Confirm, Cancel. No more prompts in the future for the same situation.
business_exception_30006=附件上传不符合标准
business_exception_30007=所有上传文件数量不超过#{0}个文件
business_exception_30008=所有上传文件总大小不超过#{0}M
business_exception_30009=运单或发票未上传
business_exception_30010=文件类型不在:运单、发票、箱单、其他
business_exception_30011=该运单已被其他人创建,不可以重复创建
business_exception_30012=UUID不一致
business_exception_30013=文件名为:#{0},上传失败,请检查后重试
business_exception_30014=运单信息加载失败,请稍后重试
business_success_30015=提交成功
business_exception_30016=运单提交失败
\ No newline at end of file
#******************系统操作日志记录,中文展示******************
business_log_20001=添加运单
business_log_20002=提交运单
business_log_20003=运单查询
business_log_20004=运单详细信息查询
business_log_20005=根据运单ID查询用户上传记录
business_log_20006=运单历史上传记录查询
system_exception_20003=提示信息过长,未保存成功
#******************鉴权相关提示,需要做国际化******************
#authentication包
system_exception_10001=没有访问权限
system_exception_10002=没有通过权限认证
system_exception_10003=登录身份异常
system_exception_10004=登录超过8小时,请重新登录
system_exception_10005=登录已过期
system_exception_10006=登录已过期,请重新登录
#******************业务相关、需要做国际化******************
#*********用于字段描述使用,不单独使用**********
business_field_31001=发货人计费账号
business_field_31002=运单ID
business_field_31003=运单号
business_field_31004=原产国编码
business_field_31005=原产国名称
business_field_31006=目的国编码
business_field_31007=目的国全称
business_field_31008=文件业务类型
business_field_31009=Consignment Code
business_field_31010=Contact Person
business_field_31011=Contact Person's Email
business_field_31012=Contact Phone
#*********具体响应到前端**********
business_exception_30001=${0}必填字段未填写
business_exception_30002=单次最多可查询1000个运单号码
business_exception_30003=${0}不正确,请重新输入
business_exception_30004=The waybill you entered is generated by another user, whether continue uploading? Confirm, Cancel. No more prompts in the future for the same situation.
business_exception_30005=The waybill you entered is generated by another account, whether continue uploading? Confirm, Cancel. No more prompts in the future for the same situation.
business_exception_30006=附件上传不符合标准
business_exception_30007=所有上传文件数量不超过50个文件
business_exception_30008=所有上传文件总大小不超过50M
business_exception_30009=运单或发票未上传
business_exception_30010=文件类型不在:运单、发票、箱单、其他
business_exception_30011=该运单已被其他人创建,不可以重复创建
business_exception_30012=UUID不一致
business_exception_30013=文件名为:#{0},上传失败,请检查后重试
business_exception_30014=运单信息加载失败,请稍后重试
business_success_30015=提交成功
business_exception_30016=运单提交失败
\ No newline at end of file