|
|
@@ -0,0 +1,267 @@ |
|
|
|
package cn.com.taiji.msgw.manager.messageWaitSend; |
|
|
|
|
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import cn.com.taiji.common.model.dao.Pagination; |
|
|
|
import cn.com.taiji.core.repo.request.msgw.MsgwSendDetailsPageRequest; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException; |
|
|
|
import com.fasterxml.jackson.databind.JsonNode; |
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
|
|
|
|
import cn.com.taiji.common.manager.ManagerException; |
|
|
|
import cn.com.taiji.common.manager.net.http.ServiceHandleException; |
|
|
|
import cn.com.taiji.core.entity.dict.msgw.MessageResult; |
|
|
|
import cn.com.taiji.core.entity.dict.msgw.MessageType; |
|
|
|
import cn.com.taiji.core.entity.msgw.MsgwSendApply; |
|
|
|
import cn.com.taiji.core.entity.msgw.MsgwSendDetails; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ats.weiXin.WxMiniSendMessageRequest; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ats.weiXin.WxMpSendMessageRequest; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.message.HltSendShortRequest; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.message.QtkPushSendMessageRequest; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.message.QtzlEmailSendRequest; |
|
|
|
import cn.com.taiji.core.repo.jpa.msgw.MsgwSendApplyRepo; |
|
|
|
import cn.com.taiji.core.repo.jpa.msgw.MsgwSendDetailsRepo; |
|
|
|
import cn.com.taiji.msgw.dto.*; |
|
|
|
import cn.com.taiji.msgw.manager.AbstractCommManager; |
|
|
|
|
|
|
|
@Service |
|
|
|
public class MessageWaiSendManagerImpl extends AbstractCommManager implements MessageWaitSendManager { |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private MsgwSendApplyRepo sendApplyRepo; |
|
|
|
@Autowired |
|
|
|
private MsgwSendDetailsRepo sendDetailsRepo; |
|
|
|
|
|
|
|
// 消息重发 |
|
|
|
@Override |
|
|
|
public MessageRetryResponseDto messageRetry(MessageRetryRequestDto request) throws ManagerException { |
|
|
|
//核对该消息是需要创建-待发送消息记录 |
|
|
|
MsgwSendDetails sendDetails = sendDetailsRepo.findById(request.getSendDetailsId()).orElse(null); |
|
|
|
//3、判断状态,只有发送失败的消息的才可以支持消息重发 |
|
|
|
if (MessageResult.FAIL.equals(sendDetails.getSendResult())){ |
|
|
|
// 根据不同类型和渠道,发送对应的消息 |
|
|
|
try { |
|
|
|
sendMessageByQtkMessageAndQuartz(sendDetails); |
|
|
|
//4、修改消息列表的状态,改为已发送 |
|
|
|
sendDetails.setSendResult(MessageResult.SEND); |
|
|
|
} catch (ServiceHandleException e) { |
|
|
|
//4、修改消息列表的状态,改为发送失败 |
|
|
|
sendDetails.setSendResult(MessageResult.FAIL); |
|
|
|
sendDetails.setDescription(e.getMessage()); |
|
|
|
} catch (JsonProcessingException e) { |
|
|
|
throw new RuntimeException(e); |
|
|
|
} finally { |
|
|
|
LocalDateTime now = LocalDateTime.now(); |
|
|
|
sendDetails.setRetryNum(sendDetails.getRetryNum() + 1); |
|
|
|
sendDetails.setSendTime(now); |
|
|
|
sendDetailsRepo.save(sendDetails); |
|
|
|
} |
|
|
|
} |
|
|
|
MessageRetryResponseDto response = new MessageRetryResponseDto(); |
|
|
|
return response; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public MessageStatisticsResponseDto messageStatistics(MessageStatisticsRequestDto request) { |
|
|
|
LocalDateTime startDateTime = request.getStartDate(); |
|
|
|
LocalDateTime endDateTime = request.getEndDate(); |
|
|
|
MessageStatisticsResponseDto response = null; |
|
|
|
//统计所有消息 |
|
|
|
//总消息数 |
|
|
|
Long totalNum = sendDetailsRepo.countStatistics(null, null, startDateTime, endDateTime); |
|
|
|
//成功消息总数 |
|
|
|
Long successTotalNum = sendDetailsRepo.countStatistics(null, MessageResult.SEND, startDateTime, endDateTime); |
|
|
|
//失败消息总数 |
|
|
|
Long failTotalNum = sendDetailsRepo.countStatistics(null, MessageResult.FAIL, startDateTime, endDateTime); |
|
|
|
//待发送消息总数 |
|
|
|
Long waitTotalNum = sendDetailsRepo.countStatistics(null, MessageResult.WAIT, startDateTime, endDateTime); |
|
|
|
//过期消息总数 |
|
|
|
Long expiredTotalNum = sendDetailsRepo.countStatistics(null, MessageResult.EXPIRED, startDateTime, endDateTime); |
|
|
|
//取消消息总数 |
|
|
|
Long cancelTotalNum = sendDetailsRepo.countStatistics(null, MessageResult.CANCEL, startDateTime, endDateTime); |
|
|
|
|
|
|
|
|
|
|
|
if (request.getMessageType() == null) { |
|
|
|
response = new MessageStatisticsResponseDto(totalNum, successTotalNum, failTotalNum, waitTotalNum, expiredTotalNum, cancelTotalNum, |
|
|
|
totalNum, successTotalNum, failTotalNum, waitTotalNum, expiredTotalNum, cancelTotalNum); |
|
|
|
} else { |
|
|
|
//统计指定类型 |
|
|
|
Long specifiedTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), null, startDateTime, endDateTime); |
|
|
|
//成功消息总数 |
|
|
|
Long specifiedSuccessTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), MessageResult.SEND, startDateTime, endDateTime); |
|
|
|
//失败消息总数 |
|
|
|
Long specifiedFailTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), MessageResult.FAIL, startDateTime, endDateTime); |
|
|
|
//待发送消息总数 |
|
|
|
Long specifiedWaitTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), MessageResult.WAIT, startDateTime, endDateTime); |
|
|
|
//过期消息总数 |
|
|
|
Long specifiedExpiredTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), MessageResult.EXPIRED, startDateTime, endDateTime); |
|
|
|
//取消消息总数 |
|
|
|
Long specifiedCancelTotalNum = sendDetailsRepo.countStatistics(request.getMessageType(), MessageResult.CANCEL, startDateTime, endDateTime); |
|
|
|
|
|
|
|
response = new MessageStatisticsResponseDto(totalNum, successTotalNum, failTotalNum, waitTotalNum, expiredTotalNum, cancelTotalNum, |
|
|
|
specifiedTotalNum, specifiedSuccessTotalNum, specifiedFailTotalNum, specifiedWaitTotalNum, specifiedExpiredTotalNum, specifiedCancelTotalNum); |
|
|
|
} |
|
|
|
return response; |
|
|
|
} |
|
|
|
|
|
|
|
// 消息发送 |
|
|
|
public void sendMessageByQtkMessageAndQuartz(MsgwSendDetails sendDetails) throws ManagerException, JsonProcessingException { |
|
|
|
MessageType messageType = sendDetails.getMessageType(); |
|
|
|
//一、《web》 端消息推送 |
|
|
|
if (MessageType.WEB.equals(messageType)) { |
|
|
|
ObjectMapper mapper = new ObjectMapper(); |
|
|
|
JsonNode jsonNode = mapper.readTree(sendDetails.getRequestDataJson()); |
|
|
|
QtkPushSendMessageRequest sendMessageRequest = mapper.treeToValue(jsonNode, QtkPushSendMessageRequest.class); |
|
|
|
jsonPostRepeat(sendMessageRequest); |
|
|
|
} |
|
|
|
//二、《app》 端消息推送 |
|
|
|
// else if (MessageType.APP.equals(messageType)) { |
|
|
|
// //极光推送 |
|
|
|
// if (MessageChannel.JPUSH.equals(messageChannel) && StringUtils.hasText(cmdName)) { |
|
|
|
// //1、极光推送-全体App用户(android/ios)-通知栏通知 |
|
|
|
// if (cmdName.equals(ChannelCmd.JPUSHALLAPPN.name())) { |
|
|
|
// JpushAllAppNotificationRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllAppNotificationRequest.class); |
|
|
|
// jpushManager.sendWaitToAllAppNotification(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //2、极光推送-全体App用户(android/ios)-自定义消息 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLAPPM.name())) { |
|
|
|
// JpushAllAppMessageRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllAppMessageRequest.class); |
|
|
|
// jpushManager.sendWaitToAllAppMessage(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //3、极光推送-全体App用户(android/ios)-通知栏通知和自定义消息 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLAPPNM.name())) { |
|
|
|
// JpushAllAppNotificationMessageRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllAppNotificationMessageRequest.class); |
|
|
|
// jpushManager.sendWaitToAllAppNotificationMessage(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //4、极光推送-指定registrationId(android/ios)-通知栏通知 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLRIDN.name())) { |
|
|
|
// JpushAllRidNotificationRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllRidNotificationRequest.class); |
|
|
|
// jpushManager.sendWaitToAllRidNotification(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //5、极光推送-指定registrationId(android/ios)-自定义消息 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLRIDM.name())) { |
|
|
|
// JpushAllRidMessageRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllRidMessageRequest.class); |
|
|
|
// jpushManager.sendWaitToAllRidMessage(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //6、极光推送-指定registrationId(android/ios)-通知栏通知和自定义消息 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLRIDNM.name())) { |
|
|
|
// JpushAllRidNotificationMessageRequest request = JSON.parseObject(qtkMessage.getRequestJson(), JpushAllRidNotificationMessageRequest.class); |
|
|
|
// jpushManager.sendWaitToAllRidNotificationMessage(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// //批量导入 |
|
|
|
// else if (cmdName.equals(ChannelCmd.JPUSHALLAPPMIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllAppMessageImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// jpushManager.sendWaitToAllAppMessageImport(request, apiKey, qtkMessage, importMessageDto); |
|
|
|
// } else if (cmdName.equals(ChannelCmd.JPUSHALLAPPNIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllAppNotificationImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// jpushManager.sendWaitToAllAppNotificationImport(request, apiKey, qtkMessage, importMessageDto); |
|
|
|
// } else if (cmdName.equals(ChannelCmd.JPUSHALLAPPNMIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllAppNotificationMessageImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// jpushManager.sendWaitToAllAppNotificationMessageImport(request, apiKey, qtkMessage, importMessageDto); |
|
|
|
// } else if (cmdName.equals(ChannelCmd.JPUSHALLRIDMIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllRidMessageImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// |
|
|
|
// Map<String, String> ridMapByMobileList = jpushAllRidMessageImportSendHandler.getRidMapByMobileList(importMessageDto);//获取 |
|
|
|
// jpushManager.sendWaitToAllRidMessageImport(request, apiKey, qtkMessage, importMessageDto, ridMapByMobileList); |
|
|
|
// } else if (cmdName.equals(ChannelCmd.JPUSHALLRIDNIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllRidNotificationImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// |
|
|
|
// Map<String, String> ridMapByMobileList = jpushAllRidNotificationImportSendHandler.getRidMapByMobileList(importMessageDto);//获取 |
|
|
|
// jpushManager.sendWaitToAllRidNotificationImport(request, apiKey, qtkMessage, importMessageDto, ridMapByMobileList); |
|
|
|
// } else if (cmdName.equals(ChannelCmd.JPUSHALLRIDNMIMPORT.name())) { |
|
|
|
// MessageImportSendRequest request = JSON.parseObject(qtkMessage.getRequestJson(), MessageImportSendRequest.class); |
|
|
|
// ImportMessageDto importMessageDto = new ImportMessageDto(); |
|
|
|
// jpushAllRidNotificationMessageImportSendHandler.readExcel(request.getExcelUrl(), importMessageDto); //读取excel数据 |
|
|
|
// |
|
|
|
// Map<String, String> ridMapByMobileList = jpushAllRidNotificationMessageImportSendHandler.getRidMapByMobileList(importMessageDto);//获取 |
|
|
|
// jpushManager.sendWaitToAllRidNotificationMessageImport(request, apiKey, qtkMessage, importMessageDto, ridMapByMobileList); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
//三、《小程序》 端消息推送 |
|
|
|
else if (MessageType.MINI_PROGRAM.equals(messageType)) { |
|
|
|
//微信小程序 |
|
|
|
ObjectMapper mapper = new ObjectMapper(); |
|
|
|
JsonNode jsonNode = mapper.readTree(sendDetails.getRequestDataJson()); |
|
|
|
WxMiniSendMessageRequest wxMiniSendMessageRequest = mapper.treeToValue(jsonNode, WxMiniSendMessageRequest.class); |
|
|
|
jsonPostRepeat(wxMiniSendMessageRequest); |
|
|
|
} |
|
|
|
// else if(MessageType.ZFB_MINI.equals(messageType)){ |
|
|
|
// // TODO:panbing 2024/5/28 16:58 支付宝消息发送 |
|
|
|
// if(MessageChannel.ZFB_MINI==messageChannel){ |
|
|
|
// if(cmdName.equals(ChannelCmd.ZFBMINISENDMESSAGE.name())){ |
|
|
|
// ZfbMiniSendMessageRequest request = JSON.parseObject(qtkMessage.getRequestJson(), ZfbMiniSendMessageRequest.class); |
|
|
|
// zfbManager.sendMsg(request, apiKey, qtkMessage); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
//四、《短信》 端消息推送 |
|
|
|
else if (MessageType.SHORT.equals(messageType)) { |
|
|
|
//汇联通短信(统一会员平台) |
|
|
|
// 提取字段 |
|
|
|
ObjectMapper mapper = new ObjectMapper(); |
|
|
|
JsonNode jsonNode = mapper.readTree(sendDetails.getRequestDataJson()); |
|
|
|
String title = jsonNode.get("title").asText(); |
|
|
|
String mobile = jsonNode.get("mobile").asText(); |
|
|
|
String alarmMessage = jsonNode.get("alarmMessage").asText(); |
|
|
|
// 短信发送 |
|
|
|
HltSendShortRequest hltShortRequest = new HltSendShortRequest(); |
|
|
|
hltShortRequest.setTitle(title); |
|
|
|
hltShortRequest.setMessage(mobile); |
|
|
|
hltShortRequest.setMessage(alarmMessage); |
|
|
|
jsonPostRepeat(hltShortRequest); |
|
|
|
} |
|
|
|
//五、《邮件》 端消息推送 |
|
|
|
else if (MessageType.EMAIL.equals(messageType)) { |
|
|
|
ObjectMapper mapper = new ObjectMapper(); |
|
|
|
JsonNode jsonNode = mapper.readTree(sendDetails.getRequestDataJson()); |
|
|
|
// 邮件发送 |
|
|
|
QtzlEmailSendRequest emailSendRequest = mapper.treeToValue(jsonNode, QtzlEmailSendRequest.class); |
|
|
|
jsonPostRepeat(emailSendRequest); |
|
|
|
} |
|
|
|
//六、《公众号》 端消息推送 |
|
|
|
else if (MessageType.OFFICIAL_ACCOUNTS.equals(messageType)) { |
|
|
|
//1、微信公众号 |
|
|
|
ObjectMapper mapper = new ObjectMapper(); |
|
|
|
JsonNode jsonNode = mapper.readTree(sendDetails.getRequestDataJson()); |
|
|
|
WxMpSendMessageRequest wxMpSendMessageRequest = mapper.treeToValue(jsonNode, WxMpSendMessageRequest.class); |
|
|
|
jsonPostRepeat(wxMpSendMessageRequest); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public MessageSendDetailsResponseDto view(MessageSendDetailsRequestDto request) { |
|
|
|
MsgwSendDetails sendDetails = sendDetailsRepo.findById(request.getSendDetailsId()).orElse(null); |
|
|
|
MessageSendDetailsResponseDto response = new MessageSendDetailsResponseDto(); |
|
|
|
response.setSendDetails(sendDetails); |
|
|
|
return response; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Pagination page(MsgwSendDetailsPageRequest request) throws ManagerException { |
|
|
|
if (request.getMessageType().equals(null)){ |
|
|
|
throw new ManagerException("请输入类型!"); |
|
|
|
} |
|
|
|
return sendDetailsRepo.page(request); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |