caozixuan 4 rokov pred
rodič
commit
c9982dafad

+ 163 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/BasicMessage.java

@@ -0,0 +1,163 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.base.BaseEntity;
+import com.qmth.distributed.print.business.enums.MessageEnum;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 短信消息表
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+@TableName("basic_message")
+public class BasicMessage extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 手机号
+     */
+    @TableField("mobile_number")
+    private String mobileNumber;
+
+    /**
+     * 业务id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("business_id")
+    private Long businessId;
+
+    /**
+     * 业务操作
+     */
+    @TableField("business_operate")
+    private String businessOperate;
+
+    /**
+     * 消息模板代码
+     */
+    @TableField("template_code")
+    private String templateCode;
+
+    /**
+     * 变量参数内容
+     */
+    @TableField("variable_params")
+    private String variableParams;
+
+    /**
+     * 模板内容
+     */
+    @TableField("template_content")
+    private String templateContent;
+
+    /**
+     * 消息类型
+     */
+    @TableField("message_type")
+    private MessageEnum messageType;
+
+    /**
+     * 消息发送状态
+     */
+    @TableField("send_status")
+    private String sendStatus;
+
+    /**
+     * 消息发送结果
+     */
+    @TableField("send_result")
+    private String sendResult;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(Long businessId) {
+        this.businessId = businessId;
+    }
+
+    public String getBusinessOperate() {
+        return businessOperate;
+    }
+
+    public void setBusinessOperate(String businessOperate) {
+        this.businessOperate = businessOperate;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public void setTemplateCode(String templateCode) {
+        this.templateCode = templateCode;
+    }
+
+    public String getVariableParams() {
+        return variableParams;
+    }
+
+    public void setVariableParams(String variableParams) {
+        this.variableParams = variableParams;
+    }
+
+    public String getTemplateContent() {
+        return templateContent;
+    }
+
+    public void setTemplateContent(String templateContent) {
+        this.templateContent = templateContent;
+    }
+
+    public MessageEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(MessageEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    public String getSendStatus() {
+        return sendStatus;
+    }
+
+    public void setSendStatus(String sendStatus) {
+        this.sendStatus = sendStatus;
+    }
+
+    public String getSendResult() {
+        return sendResult;
+    }
+
+    public void setSendResult(String sendResult) {
+        this.sendResult = sendResult;
+    }
+}

+ 35 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/MessageEnum.java

@@ -0,0 +1,35 @@
+package com.qmth.distributed.print.business.enums;
+
+/**
+ * @Description: 发送消息枚举类
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+public enum MessageEnum {
+
+    NOTICE_OF_AUDIT_PASS("审核通过通知","SMS_1474165652","【审核通过】XX您好,【XXXX】(课程)、【XXXX】(试卷编号)试卷入库申请已通过,您可在卷库里进行查看已审核通过的试卷!"),
+    NOTICE_OF_AUDIT_NOT_PASS("审核不通过通知","SMS_147416565","【审核不通过】XX您好,【XXXX】(课程)、【XXXX】(试卷编号)试卷入库申请未通过,您可查看审核意见后重新提交入库申请!"),
+    ;
+
+    MessageEnum(String name, String templateCode, String templateContent) {
+        this.name = name;
+        this.templateCode = templateCode;
+        this.templateContent = templateContent;
+    }
+
+    private final String name;
+    private final String templateCode;
+    private final String templateContent;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public String getTemplateContent() {
+        return templateContent;
+    }
+}

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicMessageMapper.java

@@ -0,0 +1,12 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.BasicMessage;
+
+/**
+ * @Description: 短信消息发送接口
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+public interface BasicMessageMapper extends BaseMapper<BasicMessage> {
+}

+ 24 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicMessageService.java

@@ -0,0 +1,24 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.entity.BasicMessage;
+import com.qmth.distributed.print.business.enums.MessageEnum;
+
+/**
+ * @Description: 短信消息发送
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+public interface BasicMessageService extends IService<BasicMessage> {
+
+    /**
+     * 保存消息发送日志(以下参数必传)
+     * @param userId 接收人id
+     * @param mobileNumber 接收人电话
+     * @param businessId 业务id
+     * @param variableParams 变量参数
+     * @param createId 发送人id
+     * @param messageType 消息类型
+     */
+    void saveMessageSendLog(Long userId, String mobileNumber, Long businessId, String variableParams, Long createId, MessageEnum messageType);
+}

+ 137 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicMessageServiceImpl.java

@@ -0,0 +1,137 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.config.DictionaryConfig;
+import com.qmth.distributed.print.business.entity.BasicMessage;
+import com.qmth.distributed.print.business.entity.BasicVerifyCode;
+import com.qmth.distributed.print.business.entity.SysConfig;
+import com.qmth.distributed.print.business.enums.MessageEnum;
+import com.qmth.distributed.print.business.mapper.BasicMessageMapper;
+import com.qmth.distributed.print.business.service.BasicMessageService;
+import com.qmth.distributed.print.business.service.SysConfigService;
+import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @Description: 短信消息发送
+ * @Author: CaoZixuan
+ * @Date: 2021-04-28
+ */
+@Service
+public class BasicMessageServiceImpl extends ServiceImpl<BasicMessageMapper, BasicMessage> implements BasicMessageService {
+    @Resource
+    private SysConfigService sysConfigService;
+    @Resource
+    private DictionaryConfig dictionaryConfig;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveMessageSendLog(Long userId,String mobileNumber,Long businessId,String variableParams,Long createId,MessageEnum messageType) {
+        // 其他方法调用所传入的参数,必须校验有值
+        this.checkData(userId,mobileNumber,businessId,variableParams,createId,messageType);
+
+        // code和content
+        String templateCode = messageType.getTemplateCode();
+        String templateContent = messageType.getTemplateContent();
+
+
+        // 短信提示系统是否启用配置验证
+        SysConfig sysConfig = sysConfigService.getByKey("sys.message.enable");
+        if (sysConfig.getConfigValue() == null) {
+            throw ExceptionResultEnum.ERROR.exception("短信消息提示启用开关未设置");
+        }
+        if (sysConfig.getConfigValue().equals("false")) {
+            throw ExceptionResultEnum.ERROR.exception("短信消息提示已关闭");
+        }
+
+        try {
+            System.setProperty("sun.net.client.defaultConnectTimeout", "180000");
+            System.setProperty("sun.net.client.defaultReadTimeout", "18000");
+            // 初始化ascClient需要的几个参数
+            final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
+            final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
+            // 替换成你的AK
+            final String accessKeyId = dictionaryConfig.smsDomain().getAliyunSMSKey();// 你的accessKeyId,参考本文档步骤2
+            final String accessKeySecret = dictionaryConfig.smsDomain().getAliyunSMSSecret();// 你的accessKeySecret,参考本文档步骤2
+            // 初始化ascClient,暂时不支持多region(请勿修改)
+            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+            IAcsClient acsClient = new DefaultAcsClient(profile);
+            // 组装请求对象
+            SendSmsRequest request = new SendSmsRequest();
+            // 使用post提交
+            request.setMethod(MethodType.POST);
+            // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
+            request.setPhoneNumbers(mobileNumber);
+            // 必填:短信签名-可在短信控制台中找到
+            request.setSignName(dictionaryConfig.smsDomain().getAliyunSMSSignName());
+            // 必填:短信模板-可在短信控制台中找到
+            request.setTemplateCode(templateCode);
+            // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+            // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
+            request.setTemplateParam(variableParams);
+            // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
+            // request.setSmsUpExtendCode("90997");
+            // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+//             request.setOutId("yourOutId");
+            // 请求失败这里会抛ClientException异常
+
+            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+
+            if (sendSmsResponse.getCode() != null) {
+                BasicMessage basicMessage = new BasicMessage();
+                // 传入的必填字段
+                basicMessage.setUserId(userId);
+                basicMessage.setMobileNumber(mobileNumber);
+                basicMessage.setBusinessId(businessId);
+                basicMessage.setVariableParams(variableParams);
+                basicMessage.setCreateId(createId);
+                basicMessage.setMessageType(messageType);
+
+                // 经过处理的新字段
+                basicMessage.setId(SystemConstant.getDbUuid());
+                basicMessage.setBusinessOperate(messageType.getName());
+                basicMessage.setCreateTime(System.currentTimeMillis());
+                basicMessage.setTemplateCode(templateCode);
+                basicMessage.setTemplateContent(templateContent);
+                basicMessage.setSendStatus(sendSmsResponse.getCode());
+                basicMessage.setSendResult(sendSmsResponse.getMessage());
+                this.save(basicMessage);
+            } else {
+                throw ExceptionResultEnum.ERROR.exception(sendSmsResponse.getMessage());
+            }
+        }catch (ClientException e){
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    private void checkData(Object ... objects){
+        for (Object object : objects) {
+            if (object instanceof String){
+                String param = String.valueOf(object);
+                if (param.length() == 0 || param.equals("null")){
+                    throw ExceptionResultEnum.ERROR.exception("调用发送短信方法时必传参数缺失");
+                }
+            }else if (object instanceof Long){
+                Long param = SystemConstant.convertIdToLong(String.valueOf(object));
+                if (param == null || param == 0){
+                    throw ExceptionResultEnum.ERROR.exception("调用发送短信方法时必传参数缺失");
+                }
+            }
+        }
+    }
+}

+ 24 - 3
distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

@@ -3,10 +3,10 @@ package com.qmth.distributed.print;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.qmth.distributed.print.api.ExamDetailController;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
+import com.qmth.distributed.print.business.entity.BasicMessage;
 import com.qmth.distributed.print.business.entity.ExamDetail;
-import com.qmth.distributed.print.business.service.BasicTemplateOrgService;
-import com.qmth.distributed.print.business.service.ExamDetailService;
-import com.qmth.distributed.print.business.service.ExamPrintPlanService;
+import com.qmth.distributed.print.business.enums.MessageEnum;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.ConvertUtil;
 import com.qmth.distributed.print.business.util.OssUtil;
 import com.qmth.distributed.print.common.util.HexUtils;
@@ -38,6 +38,10 @@ public class ServiceTest {
     private ExamDetailController examDetailController;
     @Resource
     OssUtil ossUtil;
+    @Resource
+    private BasicMessageService basicMessageService;
+    @Resource
+    private BasicVerifyCodeService basicVerifyCodeService;
 
 
     @Test
@@ -81,4 +85,21 @@ public class ServiceTest {
 //        ossUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)));
     }
 
+    @Test
+    public void sendMessage(){
+        Long userId = 1L;
+        String mobileNumber = "18903719928";
+        Long businessId = 1L;
+        String variableParams = "{\"code\":\"" + "123456" + "\"}";
+        Long createId = 1L;
+        MessageEnum messageType = MessageEnum.NOTICE_OF_AUDIT_NOT_PASS;
+
+        basicMessageService.saveMessageSendLog(userId,mobileNumber,businessId,variableParams,createId,messageType);
+    }
+
+    @Test
+    public void sendVerifyCode(){
+        basicVerifyCodeService.sendVeirfyCode("18903719928",1L);
+    }
+
 }