Browse Source

fix 新增下发短信

tjf 3 years ago
parent
commit
7c6b4865a0

+ 4 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/DateUtils.java

@@ -155,6 +155,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return calendar.getTime();
     }
 
+    public static String getDateNow() {
+        return dateTimeNow(YYYYMMDD);
+    }
+
 
     /**
      * 指定日期的的开始时间

+ 61 - 0
boman-web-core/pom.xml

@@ -129,6 +129,67 @@
             <scope>compile</scope>
         </dependency>
 
+
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.22</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <!--短信回执需要的依赖-->
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>alicom-mns-receive</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>aliyun-java-sdk-dybaseapi</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>aliyun-sdk-mns</artifactId>
+            <version>1.1.8</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>httpasyncclient</artifactId>
+            <version>4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>httpcore-nio</artifactId>
+            <version>4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alicom</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 133 - 0
boman-web-core/src/main/java/com/boman/web/core/controller/SendSmsController.java

@@ -0,0 +1,133 @@
+package com.boman.web.core.controller;
+
+import java.util.List;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.boman.common.core.utils.SecurityUtils;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.common.core.utils.poi.ExcelUtil;
+import com.boman.common.core.web.controller.BaseController;
+import com.boman.domain.TableDataInfo;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.web.core.service.sendSms.ISendSmsService;
+import com.boman.web.core.utils.SendSmsUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.boman.web.core.domain.SendSms;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 中考下发短信日志Controller
+ * 
+ * @author boman
+ * @date 2022-07-11
+ */
+@RestController
+@RequestMapping("/sendSms")
+public class SendSmsController extends BaseController
+{
+    @Autowired
+    private ISendSmsService sendSmsService;
+
+    /**
+     * 查询中考下发短信日志列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SendSms sendSms)
+    {
+        startPage();
+        List<SendSms> list = sendSmsService.selectSendSmsList(sendSms);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取中考下发短信日志详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(sendSmsService.selectSendSmsById(id));
+    }
+
+    /**
+     * 新增中考下发短信日志
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody SendSms sendSms)
+    {
+        return toAjax(sendSmsService.insertSendSms(sendSms));
+    }
+
+    /**
+     * 修改中考下发短信日志
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody SendSms sendSms)
+    {
+        return toAjax(sendSmsService.updateSendSms(sendSms));
+    }
+
+    /**
+     * 删除中考下发短信日志
+     */
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(sendSmsService.deleteSendSmsByIds(ids));
+    }
+
+
+    /**
+     * 导入发送短信的中考录取数据
+     * @param file
+     * @param updateSupport
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<SendSms> util = new ExcelUtil<SendSms>(SendSms.class);
+        List<SendSms> userList = util.importExcel(file.getInputStream());
+        String operName = SecurityUtils.getUsername();
+        String message = sendSmsService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 单独发送短信的接口
+     */
+    @PostMapping("/sendSmsOnly")
+    public AjaxResult sendSms(@RequestBody SendSms sendSms) {
+        String phone = sendSms.getPhone();
+        if (StringUtils.isBlank(phone)) {
+            return AjaxResult.error("未获取到手机号");
+        }
+        String templateName = sendSms.getTemplateName();
+        if (StringUtils.isBlank(templateName)) {
+            return AjaxResult.error("未获取到模板名称");
+        }
+        try {
+            //"{\"name\":\"" + code + "\",\"reportNumber\":\"" + code + "\"}"
+            QuerySendDetailsResponse querySendDetailsResponse = SendSmsUtils.sendSmsAndQuery(phone, "{\"ticketId\":\"" + sendSms.getTicketId() + "\",\"name\":\"" + sendSms.getName() + "\",\"result\":\"" + sendSms.getResult() + "\"}", templateName);
+            String ok = querySendDetailsResponse.getCode();
+            if ("OK".equals(ok)) {
+                return AjaxResult.success("发送成功");
+            } else {
+                return AjaxResult.error(querySendDetailsResponse.getMessage());
+            }
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        return AjaxResult.error("发送失败");
+    }
+}

+ 161 - 0
boman-web-core/src/main/java/com/boman/web/core/domain/SendSms.java

@@ -0,0 +1,161 @@
+package com.boman.web.core.domain;
+
+import com.boman.domain.BaseEntity;
+import com.boman.domain.annotation.Excel;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 中考下发短信日志对象 send_sms
+ * 
+ * @author boman
+ * @date 2022-07-11
+ */
+public class SendSms extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String id;
+
+    /** 发送的手机号 */
+    @Excel(name = "发送的手机号")
+    private String phone;
+    /**
+     * 准考证号码
+     */
+    private String ticketId;
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     *录取结果
+     */
+    private String result;
+
+
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String status;
+
+    /** 发送内容 */
+    @Excel(name = "发送内容")
+    private String content;
+
+    /** 修改时间 */
+    private String modifyDate;
+
+    /**
+     * 模板名称
+     */
+    private String templateName;
+
+    /** 是否删除 */
+    private String isDel;
+
+    public String getTicketId() {
+        return ticketId;
+    }
+
+    public void setTicketId(String ticketId) {
+        this.ticketId = ticketId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public void setTemplateName(String templateName) {
+        this.templateName = templateName;
+    }
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setPhone(String phone) 
+    {
+        this.phone = phone;
+    }
+
+    public String getPhone() 
+    {
+        return phone;
+    }
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setModifyDate(String modifyDate) 
+    {
+        this.modifyDate = modifyDate;
+    }
+
+    public String getModifyDate() 
+    {
+        return modifyDate;
+    }
+    public void setIsDel(String isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public String getIsDel() 
+    {
+        return isDel;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("phone", getPhone())
+            .append("status", getStatus())
+            .append("content", getContent())
+            .append("modifyDate", getModifyDate())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("isDel", getIsDel())
+            .toString();
+    }
+}

+ 61 - 0
boman-web-core/src/main/java/com/boman/web/core/mapper/SendSmsMapper.java

@@ -0,0 +1,61 @@
+package com.boman.web.core.mapper;
+
+import java.util.List;
+import com.boman.web.core.domain.SendSms;
+
+/**
+ * 中考下发短信日志Mapper接口
+ * 
+ * @author boman
+ * @date 2022-07-11
+ */
+public interface SendSmsMapper 
+{
+    /**
+     * 查询中考下发短信日志
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 中考下发短信日志
+     */
+    public SendSms selectSendSmsById(String id);
+
+    /**
+     * 查询中考下发短信日志列表
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 中考下发短信日志集合
+     */
+    public List<SendSms> selectSendSmsList(SendSms sendSms);
+
+    /**
+     * 新增中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    public int insertSendSms(SendSms sendSms);
+
+    /**
+     * 修改中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    public int updateSendSms(SendSms sendSms);
+
+    /**
+     * 删除中考下发短信日志
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 结果
+     */
+    public int deleteSendSmsById(String id);
+
+    /**
+     * 批量删除中考下发短信日志
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSendSmsByIds(String[] ids);
+}

+ 71 - 0
boman-web-core/src/main/java/com/boman/web/core/service/sendSms/ISendSmsService.java

@@ -0,0 +1,71 @@
+package com.boman.web.core.service.sendSms;
+
+import java.util.List;
+import com.boman.web.core.domain.SendSms;
+
+/**
+ * 中考下发短信日志Service接口
+ * 
+ * @author boman
+ * @date 2022-07-11
+ */
+public interface ISendSmsService 
+{
+    /**
+     * 查询中考下发短信日志
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 中考下发短信日志
+     */
+    public SendSms selectSendSmsById(String id);
+
+    /**
+     * 查询中考下发短信日志列表
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 中考下发短信日志集合
+     */
+    public List<SendSms> selectSendSmsList(SendSms sendSms);
+
+    /**
+     * 新增中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    public int insertSendSms(SendSms sendSms);
+
+    /**
+     * 修改中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    public int updateSendSms(SendSms sendSms);
+
+    /**
+     * 批量删除中考下发短信日志
+     * 
+     * @param ids 需要删除的中考下发短信日志主键集合
+     * @return 结果
+     */
+    public int deleteSendSmsByIds(String[] ids);
+
+    /**
+     * 删除中考下发短信日志信息
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 结果
+     */
+    public int deleteSendSmsById(String id);
+
+    /**
+     * 导入用户数据
+     *
+     * @param smsList 数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param operName 操作用户
+     * @return 结果
+     */
+    public String importUser(List<SendSms> smsList, Boolean isUpdateSupport, String operName);
+}

+ 147 - 0
boman-web-core/src/main/java/com/boman/web/core/service/sendSms/Impl/SendSmsServiceImpl.java

@@ -0,0 +1,147 @@
+package com.boman.web.core.service.sendSms.Impl;
+
+import java.util.List;
+
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.boman.common.core.exception.CustomException;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.domain.dto.AjaxResult;
+import com.boman.web.core.service.sendSms.ISendSmsService;
+import com.boman.web.core.utils.SendSmsUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.boman.web.core.mapper.SendSmsMapper;
+import com.boman.web.core.domain.SendSms;
+
+/**
+ * 中考下发短信日志Service业务层处理
+ * 
+ * @author boman
+ * @date 2022-07-11
+ */
+@Service
+public class SendSmsServiceImpl implements ISendSmsService
+{
+    @Autowired
+    private SendSmsMapper sendSmsMapper;
+
+    /**
+     * 查询中考下发短信日志
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 中考下发短信日志
+     */
+    @Override
+    public SendSms selectSendSmsById(String id)
+    {
+        return sendSmsMapper.selectSendSmsById(id);
+    }
+
+    /**
+     * 查询中考下发短信日志列表
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 中考下发短信日志
+     */
+    @Override
+    public List<SendSms> selectSendSmsList(SendSms sendSms)
+    {
+        return sendSmsMapper.selectSendSmsList(sendSms);
+    }
+
+    /**
+     * 新增中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    @Override
+    public int insertSendSms(SendSms sendSms)
+    {
+        sendSms.setCreateTime(DateUtils.getNowDate());
+        return sendSmsMapper.insertSendSms(sendSms);
+    }
+
+    /**
+     * 修改中考下发短信日志
+     * 
+     * @param sendSms 中考下发短信日志
+     * @return 结果
+     */
+    @Override
+    public int updateSendSms(SendSms sendSms)
+    {
+        sendSms.setUpdateTime(DateUtils.getNowDate());
+        return sendSmsMapper.updateSendSms(sendSms);
+    }
+
+    /**
+     * 批量删除中考下发短信日志
+     * 
+     * @param ids 需要删除的中考下发短信日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSendSmsByIds(String[] ids)
+    {
+        return sendSmsMapper.deleteSendSmsByIds(ids);
+    }
+
+    /**
+     * 删除中考下发短信日志信息
+     * 
+     * @param id 中考下发短信日志主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSendSmsById(String id)
+    {
+        return sendSmsMapper.deleteSendSmsById(id);
+    }
+
+
+    @Override
+    public String importUser(List<SendSms> smsList, Boolean isUpdateSupport, String operName) {
+        if (StringUtils.isNull(smsList) || smsList.size() == 0) {
+            throw new CustomException("导入数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+
+        String templateCode = "";
+
+        for (SendSms sms : smsList) {
+            // 防止有空行,手机号是必须要有的
+            String phone = sms.getPhone();
+            if (StringUtils.isEmpty(phone)) {
+                continue;
+            }
+            try {
+                QuerySendDetailsResponse querySendDetailsResponse = SendSmsUtils.sendSmsAndQuery(phone, "{\"ticketId\":\"" + sms.getTicketId() + "\",\"name\":\"" + sms.getName() + "\",\"result\":\"" + sms.getResult() + "\"}", templateCode);
+                String ok = querySendDetailsResponse.getCode();
+                if ("OK".equals(ok)) {
+                    successNum++;
+                    successMsg.append("<br/>").append(successNum).append("、手机号 ").append(sms.getPhone()).append(" 发送成功");
+                } else {
+                    failureNum++;
+                    failureMsg.append("<br/>").append(failureNum).append("、手机号 ").append(sms.getPhone()).append(" 发送失败,原因是: ").append(querySendDetailsResponse.getMessage());
+                }
+            } catch (ClientException e) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、手机号 ").append(sms.getPhone()).append(" 发送失败");
+            }
+            if (failureNum > 0) {
+                failureMsg.insert(0, "很抱歉,发送失败!共 " + failureNum + " 条,错误如下:");
+                return failureMsg.toString();
+            } else {
+                successMsg.insert(0, "短信已全部发送成功!共 " + successNum + " 条,数据如下:");
+            }
+
+        }
+        return successMsg.toString();
+    }
+}

+ 161 - 0
boman-web-core/src/main/java/com/boman/web/core/utils/SendSmsUtils.java

@@ -0,0 +1,161 @@
+package com.boman.web.core.utils;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.domain.dto.AjaxResult;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    /**
+     * 产品名称:云通信短信API产品,开发者无需替换
+     */
+    static final String PRODUCT = "Dysmsapi";
+    /**
+     * 产品域名,开发者无需替换
+     */
+    static final String DOMAIN = "dysmsapi.aliyuncs.com";
+
+    /**
+     * TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+     */
+
+    //短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+    static final String SIGN_NAME = "";
+
+    /**
+     * 发送短信接口
+     * @param phone
+     * @return
+     * @throws ClientException
+     */
+    public static SendSmsResponse sendSms(String phone,String code ,String templateCode ) throws ClientException {
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象-具体描述见控制台-文档部分内容
+        SendSmsRequest request = new SendSmsRequest();
+        //必填:待发送手机号 多个手机号用逗号分割
+        request.setPhoneNumbers(phone);
+        //必填:短信签名-SIGN_NAME
+        request.setSignName(SIGN_NAME);
+        //必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode(templateCode);
+        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        request.setTemplateParam(code);
+        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+        //request.setOutId("2345");
+        //hint 此处可能会抛出异常,注意catch
+        return acsClient.getAcsResponse(request);
+    }
+
+
+    /**
+     * 短信查验接口
+     * @param bizId
+     * @param phone
+     * @return
+     * @throws ClientException
+     */
+    public static QuerySendDetailsResponse querySendDetails(String bizId, String phone,String accessKeyId,String accessKeySecret) throws ClientException {
+
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象
+        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
+        //必填-号码
+        request.setPhoneNumber(phone);
+        //可选-流水号
+        request.setBizId(bizId);
+        //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
+        request.setSendDate(DateUtils.getDateNow());
+        //必填-页大小
+        request.setPageSize(10L);
+        //必填-当前页码从1开始计数
+        request.setCurrentPage(1L);
+
+        //hint 此处可能会抛出异常,注意catch
+        QuerySendDetailsResponse querySendDetailsResponse = null;
+        try {
+            querySendDetailsResponse = acsClient.getAcsResponse(request);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        return querySendDetailsResponse;
+    }
+
+    //生成X位验证码
+    public static String getCode(Integer num) {
+        String[] codes = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            int j = (int) (Math.random() * 10);
+            code.append(codes[j]);
+        }
+        return code.toString();
+    }
+
+    /**
+     * 发送短信并且查验接口
+     * @param phone
+     * @param code 短信发送替换内容
+     * @param templateCode 模板名称
+     * @return
+     * @throws ClientException
+     */
+    public static QuerySendDetailsResponse sendSmsAndQuery(String phone,String code ,String templateCode) throws ClientException {
+
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象-具体描述见控制台-文档部分内容
+        SendSmsRequest request = new SendSmsRequest();
+        //必填:待发送手机号 多个手机号用逗号分割
+        request.setPhoneNumbers(phone);
+        //必填:短信签名-SIGN_NAME
+        request.setSignName(SIGN_NAME);
+        //必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode(templateCode);
+        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        request.setTemplateParam(code);
+        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+        //request.setOutId("2345");
+        //hint 此处可能会抛出异常,注意catch
+        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+        QuerySendDetailsResponse querySendDetailsResponse = SendSmsUtils.querySendDetails(sendSmsResponse.getBizId(), phone, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        return querySendDetailsResponse;
+    }
+}

+ 91 - 0
boman-web-core/src/main/resources/mapper/SendSmsMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.boman.web.core.mapper.SendSmsMapper">
+    
+    <resultMap type="com.boman.web.core.domain.SendSms" id="SendSmsResult">
+        <result property="id"    column="id"    />
+        <result property="phone"    column="phone"    />
+        <result property="status"    column="status"    />
+        <result property="content"    column="content"    />
+        <result property="modifyDate"    column="modify_date"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="isDel"    column="is_del"    />
+    </resultMap>
+
+    <sql id="selectSendSmsVo">
+        select id, phone, status, content, modify_date, create_by, create_time, update_by, update_time, is_del from send_sms
+    </sql>
+
+    <select id="selectSendSmsList" parameterType="SendSms" resultMap="SendSmsResult">
+        <include refid="selectSendSmsVo"/>
+        <where>  
+            <if test="phone != null  and phone != ''"> and phone like concat('%', #{phone}, '%')</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+    </select>
+    
+    <select id="selectSendSmsById" parameterType="String" resultMap="SendSmsResult">
+        <include refid="selectSendSmsVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertSendSms" parameterType="SendSms">
+        insert into send_sms
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="phone != null">phone,</if>
+            <if test="status != null">status,</if>
+            <if test="content != null">content,</if>
+            <if test="modifyDate != null">modify_date,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="isDel != null and isDel != ''">is_del,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="phone != null">#{phone},</if>
+            <if test="status != null">#{status},</if>
+            <if test="content != null">#{content},</if>
+            <if test="modifyDate != null">#{modifyDate},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="isDel != null and isDel != ''">#{isDel},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSendSms" parameterType="SendSms">
+        update send_sms
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="phone != null">phone = #{phone},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="modifyDate != null">modify_date = #{modifyDate},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="isDel != null and isDel != ''">is_del = #{isDel},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSendSmsById" parameterType="String">
+        delete from send_sms where id = #{id}
+    </delete>
+
+    <delete id="deleteSendSmsByIds" parameterType="String">
+        delete from send_sms where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>