wl
2022-11-11 e1008dbb1fa76874a28c06913b95c16d18acdfa7
ycl-platform/src/main/java/com/ycl/service/message/impl/MessageServiceImpl.java
@@ -1,26 +1,42 @@
package com.ycl.service.message.impl;
import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.net.url.UrlPath;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.common.constant.ChannelCode;
import com.ycl.common.util.CommonUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycl.controller.video.common.constant.ChannelCode;
import com.ycl.controller.video.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.entity.user.UmsAdmin;
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.service.message.Provider;
import com.ycl.service.message.Sender;
import com.ycl.service.message.factory.InnerFactory;
import com.ycl.service.message.factory.MailFactory;
import com.ycl.service.message.factory.SmsFactory;
import com.ycl.utils.MD5Util;
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.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.stream.Collectors;
@@ -35,78 +51,162 @@
@Service
public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> 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
    public Message sendMessage(MessageParam messageParam) {
        Message message = null;
        Provider provider = null;
        switch (messageParam.getChannelCode())
        {
            //内站发送
            case ChannelCode.INNER:
                provider = new InnerFactory();
                break;
    @Transactional(rollbackFor = Exception.class)
    public String sendMessage(Message message) {
        Message savedMessage = messageMapper.selectOne(new LambdaQueryWrapper<Message>()
                .eq(Message::getTargetTo, message.getTargetTo())
                .eq(Message::getTargetFrom, message.getTargetFrom()));
        if (savedMessage != null) {
            messageMapper.deleteById(savedMessage);
        }
        ArrayList<Long> ids = new ArrayList<>();
        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());
            this.save(sendMessage);
            ids.add(sendMessage.getId());
        }
        switch (message.getChannelCode()) {
            //邮件发送
            case ChannelCode.SMS:
                provider = new MailFactory();
                sendSMS(message, ids);
                break;
             //短信发送
            //短信发送
            case ChannelCode.MAIL:
                provider = new SmsFactory();
                sendMail(message);
                break;
            default:
                throw new ApiException("未匹配到该类型");
        }
        Sender sender = provider.produce();
        sender.sendMessage(messageParam);
        return message;
        return "send message success!";
    }
    @SneakyThrows
    private void sendSMS(Message message, List<Long> mesIds) {
        String context = "【" + message.getHead() + "】" + message.getBody();
        String addSerial = "";
        SendReq sendReq = new SendReq();
        sendReq.setEcName(ecName);
        sendReq.setApId(apId);
        sendReq.setSign(sign);
        sendReq.setContext(context);
        String[] ids = message.getTargetTo().split(",");
        String[] mobiles = new String[ids.length];
        for (int i = 0; i < ids.length; i++) {
            mobiles[i] = umsAdminMapper.selectById(ids[i]).getMobile();
        }
        sendReq.setMobiles(StringUtils.join(mobiles, ","));
        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<String> stringHttpEntity = new HttpEntity<>(Base64Utils.encodeToString(objectMapper.writeValueAsBytes(mac)), httpHeaders);
        SendRes sendRes = objectMapper.readValue(restTemplate.postForEntity(url, stringHttpEntity, String.class).getBody(), SendRes.class);
        Message sendedMessage = new Message();
        if (sendRes.getRspcod().equals("success")) {
            for (Long id : mesIds) {
                sendedMessage.setStatus(2);
                sendedMessage.setRespondResult("发送成功");
                sendedMessage.setId(id);
                sendedMessage.setUpdateTime(new Date());
                sendedMessage.setSendTime(new Date());
                messageMapper.updateById(sendedMessage);
            }
        } else {
            for (Long id : mesIds) {
                sendedMessage.setStatus(3);
                sendedMessage.setRespondResult("发送失败");
                sendedMessage.setSendTime(new Date());
                sendedMessage.setId(id);
                sendedMessage.setUpdateTime(new Date());
                messageMapper.updateById(sendedMessage);
            }
        }
    }
    //发送邮件
    @SneakyThrows
    private void sendMail(Message message) {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(sendHost);
        javaMailSender.setUsername(userName);
        javaMailSender.setPassword(password);
        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 IPage<Message> list(MessageParam messageParam) {
    public Page<Message> list(MessageParam messageParam) {
        Page<Message> page = new Page<>(messageParam.getCurrent(), messageParam.getPageSize());
        LambdaQueryWrapper<Message> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Message::getParentId, 0);
        if (!CommonUtils.isEmpty(messageParam.getHead())) {
            queryWrapper.eq(Message::getHead, messageParam.getHead());
        }
        if (!CommonUtils.isEmpty(messageParam.getChannelCode())) {
            queryWrapper.eq(Message::getChannelCode, messageParam.getChannelCode());
        }
        if (!CommonUtils.isEmpty(messageParam.getStatus())) {
            queryWrapper.eq(Message::getStatus, messageParam.getStatus());
        }
        queryWrapper.orderByDesc(Message::getCreateTime);
        Page<Message> result = baseMapper.selectPage(page, queryWrapper);
        List<Message> messages = result.getRecords();
        if (!CommonUtils.isEmpty(messages)) {
            List<Long> ids = messages.stream().map(e -> Long.parseLong(e.getTargetFrom().trim())).collect(Collectors.toList());
            LambdaQueryWrapper<UmsAdmin> queryUSers = new LambdaQueryWrapper<>();
            queryUSers.in(UmsAdmin::getId, ids);
            List<UmsAdmin> users = umsAdminMapper.selectList(queryUSers);
            if (!CommonUtils.isEmpty(users)) {
                for (UmsAdmin user : users) {
                    for (Message message : messages) {
                        if (message.getTargetFrom().equals(user.getId()+"")) {
                            message.setTargetFrom(user.getUsername());
                        }
                    }
                }
            }
        }
        return result;
        return messageMapper.selectMessagePage(page,messageParam);
    }
    @Override
    public Boolean deleteMessages(List<Long> ids) {
        LambdaQueryWrapper<Message> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(Message::getId, ids).or().in(Message::getParentId,ids);
        queryWrapper.in(Message::getId, ids).or().in(Message::getParentId, ids);
        List<Message> messages = baseMapper.selectList(queryWrapper);
        if (CommonUtils.isNotEmpty(messages)) {
            List<Long>  deleteIds = messages.stream().map(Message::getId).collect(Collectors.toList());
            List<Long> deleteIds = messages.stream().map(Message::getId).collect(Collectors.toList());
            baseMapper.deleteBatchIds(deleteIds);
        }
        return true;