package com.ycl.service.message.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycl.common.constant.ChannelCode;
import com.ycl.common.util.CommonUtils;
import com.ycl.dto.message.MessageParam;
import com.ycl.entity.message.Message;
import com.ycl.entity.message.SendReq;
import com.ycl.entity.message.SendRes;
import com.ycl.exception.ApiException;
import com.ycl.mapper.message.MessageMapper;
import com.ycl.mapper.user.UmsAdminMapper;
import com.ycl.service.message.IMessageService;
import com.ycl.utils.MD5Util;
import com.ycl.vo.message.MessageVO;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Base64Utils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.stream.Collectors;
/**
*
* 消息 服务实现类
*
*
* @author mg
* @since 2022-10-08
*/
@Service
public class MessageServiceImpl extends ServiceImpl implements IMessageService {
@Value("${e-mail.sendHost}")
private String sendHost;
@Value("${e-mail.username}")
private String userName;
@Value("${e-mail.password}")
private String password;
@Value(value = "${SMS.ecName}")
private String ecName; //集团客户名称
@Value(value = "${SMS.apId}")
private String apId; //用户名
@Value(value = "${SMS.sign}")
private String sign; //网关签名编码,必填,签名编码在中国移动集团开通帐号后分配,可以在云MAS网页端管理子系统-SMS接口管理功能中下载。
@Value(value = "${SMS.url}")
private String url;
@Resource
private UmsAdminMapper umsAdminMapper;
@Resource
private MessageMapper messageMapper;
@Resource
RestTemplate restTemplate;
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public void sendSMS(Message message) {
Integer messageStatus = sendMessages(message);
if (messageStatus == 2) {
message.setStatus(2);
message.setRespondResult("发送成功");
}
if (messageStatus == 3) {
message.setStatus(3);
message.setRespondResult("发送失败");
}
message.setUpdateTime(new Date());
message.setSendTime(new Date());
messageMapper.updateById(message);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void sendMessage(Message message) {
// Message savedMessage = messageMapper.selectOne(new LambdaQueryWrapper()
// .eq(Message::getTargetTo, message.getTargetTo())
// .eq(Message::getTargetFrom, message.getTargetFrom())
// .eq(Message::getBody, message.getBody())
// .eq(Message::getStatus, 1)
// .eq(Message::getHead, message.getHead()));
// if (savedMessage != null) {
// messageMapper.deleteById(savedMessage);
// }
ArrayList ids = new ArrayList<>();
message.setTargetFrom(umsAdminMapper.selectById(message.getCreateUser()).getUsername());
if (message.getId() == null) {
for (String receive : message.getTargetTo().split(",")) {
Message sendMessage = new Message();
BeanUtils.copyProperties(message, sendMessage);
sendMessage.setCreateTime(new Date());
sendMessage.setSendTime(new Date());
sendMessage.setTargetTo(receive);
sendMessage.setSendTime(new Date());
sendMessage.setPhoneNumber(message.getTargetTo());
if (ChannelCode.INNER.equals(message.getChannelCode())) {
sendMessage.setIsView(0);
}
this.save(sendMessage);
ids.add(sendMessage);
}
}
// switch (message.getChannelCode()) {
// //短信发送
// case ChannelCode.SMS:
// sendSMS(message, ids);
// break;
// //邮件发送
// case ChannelCode.MAIL:
// sendMail(message);
// break;
// case ChannelCode.INNER:
// break;
// default:
// throw new ApiException("未匹配到该类型");
// }
}
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public void sendSMS(Message message, List messageList) {
List mobiles = new ArrayList<>();
List mesIds = new ArrayList<>();
for (Message m : messageList) {
mobiles.add(m.getPhoneNumber());
mesIds.add(m.getId());
}
message.setPhoneNumber(StringUtils.join(mobiles, ","));
Integer messageStatus = sendMessages(message);
Message messaged = new Message();
for (Long id : mesIds) {
if (messageStatus == 2) {
messaged.setStatus(2);
messaged.setRespondResult("发送成功");
}
if (messageStatus == 3) {
messaged.setStatus(3);
messaged.setRespondResult("发送失败");
}
messaged.setId(id);
messaged.setUpdateTime(new Date());
messaged.setSendTime(new Date());
messageMapper.updateById(messaged);
}
}
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public void sendMessageByPhone(Message message) {
Message sendMessage = new Message();
BeanUtils.copyProperties(message, sendMessage);
sendMessage.setCreateTime(new Date());
sendMessage.setSendTime(new Date());
sendMessage.setSendTime(new Date());
sendMessage.setTargetFrom(umsAdminMapper.selectById(message.getCreateUser()).getUsername());
this.save(sendMessage);
Integer messageStatus = sendMessages(message);
Message messaged = new Message();
if (messageStatus == 2) {
messaged.setStatus(2);
messaged.setRespondResult("发送成功");
}
if (messageStatus == 3) {
messaged.setStatus(3);
messaged.setRespondResult("发送失败");
}
messaged.setId(sendMessage.getId());
messaged.setUpdateTime(new Date());
messaged.setSendTime(new Date());
messageMapper.updateById(messaged);
}
@SneakyThrows
private Integer sendMessages(Message message) {
String context = "【" + message.getHead() + "】" + message.getBody();
String addSerial = "";
SendReq sendReq = new SendReq();
sendReq.setEcName(ecName);
sendReq.setApId(apId);
sendReq.setSign(sign);
sendReq.setContext(context);
sendReq.setMobiles(message.getPhoneNumber());
sendReq.setAddSerial(addSerial);
StringBuffer mac = new StringBuffer();
mac.append(ecName);
mac.append(apId);
mac.append(sendReq.getMobiles());
mac.append(context);
mac.append(sign);
mac.append(addSerial);
sendReq.setMac(MD5Util.md5Encrypt32Lower(mac.toString()));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
HttpEntity stringHttpEntity = new HttpEntity<>(Base64Utils.encodeToString(objectMapper.writeValueAsBytes(mac)), httpHeaders);
ResponseEntity response = restTemplate.postForEntity(url + "/sms/submit", sendReq, String.class);
if(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank( response.getBody())) {
SendRes sendRes = objectMapper.readValue(response.getBody(), SendRes.class);
if (sendRes.getRspcod().equals("success")) {
return 2;
} else {
return 3;
}
}
return 3;
}
//发送邮件
@SneakyThrows
private void sendMail(Message message) {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(sendHost);
javaMailSender.setUsername(userName);
javaMailSender.setPassword(password);
javaMailSender.setPort(465);
Properties properties = new Properties();
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");//必须是字符串而不能是boolean否则报错
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.timeout", "1000");
properties.put("mail.smtp.host", sendHost);
javaMailSender.setJavaMailProperties(properties);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setText(message.getBody());
helper.setSubject(message.getHead());
helper.setFrom(userName);
String[] ids = message.getTargetTo().split(",");
String[] address = new String[ids.length];
for (int i = 0; i < ids.length; i++) {
address[i] = umsAdminMapper.selectById(ids[i]).getEmail();
}
helper.setTo(address);
javaMailSender.send(mimeMessage);
}
@Override
public Page list(MessageParam messageParam) {
Page page = new Page<>(messageParam.getCurrent(), messageParam.getPageSize());
return messageMapper.selectMessagePage(page, messageParam);
}
@Override
public Page queryMyMessage(Page page, Long userId) {
List list = list();
ArrayList ids = new ArrayList<>();
list.forEach(item -> {
String targetTo = item.getTargetTo();
if (StringUtils.isNotBlank(targetTo)) {
String[] split = targetTo.split(",");
for (String s : split) {
if (userId.equals(Long.getLong(s))) {
ids.add(item.getId());
break;
}
}
}
});
if (CollUtil.isEmpty(ids)) {
return new Page<>();
}
return baseMapper.selectPage(page, new QueryWrapper().lambda().in(Message::getId, ids));
}
@Override
public Boolean deleteMessages(List ids) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Message::getId, ids).or().in(Message::getParentId, ids);
List messages = baseMapper.selectList(queryWrapper);
if (CommonUtils.isNotEmpty(messages)) {
List deleteIds = messages.stream().map(Message::getId).collect(Collectors.toList());
baseMapper.deleteBatchIds(deleteIds);
}
return true;
}
}