ソースを参照

fix 新增下发短信,增加批量发送

tjf 3 年 前
コミット
8c47d1006d

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

@@ -141,6 +141,12 @@
             <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <!--阿里短信服务新版-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.15</version>
+        </dependency>
 
         <!--短信回执需要的依赖-->
         <dependency>

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

@@ -96,10 +96,13 @@ public class SendSmsController extends BaseController
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
     {
+        long startTimeSql = System.currentTimeMillis();
         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);
+        long endTimeSql = System.currentTimeMillis() - startTimeSql;
+        System.out.println("执行批量下发短信共:" + endTimeSql + "ms");
         return AjaxResult.success(message);
     }
 
@@ -120,14 +123,11 @@ public class SendSmsController extends BaseController
             //"{\"name\":\"" + code + "\",\"reportNumber\":\"" + code + "\"}"
             QuerySendDetailsResponse querySendDetailsResponse = SendSmsUtils.sendSmsAndQuery(phone, "{\"ticketId\":\"" + sendSms.getTicketId() + "\",\"name\":\"" + sendSms.getName() + "\",\"result\":\"" + sendSms.getResult() + "\"}", templateName);
             String ok = querySendDetailsResponse.getCode();
-            String message = querySendDetailsResponse.getMessage();
             if ("OK".equals(ok)) {
-                sendSms.setContent(message);
                 sendSms.setStatus("发送成功");
                 sendSmsService.insertSendSms(sendSms);
                 return AjaxResult.success("发送成功");
             } else {
-                sendSms.setContent(message);
                 sendSms.setStatus("发送失败");
                 sendSmsService.insertSendSms(sendSms);
                 return AjaxResult.error(querySendDetailsResponse.getMessage());

+ 114 - 62
boman-web-core/src/main/java/com/boman/web/core/service/sendSms/Impl/SendSmsServiceImpl.java

@@ -1,7 +1,10 @@
 package com.boman.web.core.service.sendSms.Impl;
 
+import java.util.ArrayList;
 import java.util.List;
 
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
 import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
 import com.aliyuncs.exceptions.ClientException;
 import com.boman.common.core.exception.CustomException;
@@ -9,7 +12,9 @@ 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.SendBatchSmsUtils;
 import com.boman.web.core.utils.SendSmsUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.boman.web.core.mapper.SendSmsMapper;
@@ -17,146 +22,193 @@ import com.boman.web.core.domain.SendSms;
 
 /**
  * 中考下发短信日志Service业务层处理
- * 
+ *
  * @author boman
  * @date 2022-07-11
  */
 @Service
-public class SendSmsServiceImpl implements ISendSmsService
-{
+public class SendSmsServiceImpl implements ISendSmsService {
     @Autowired
     private SendSmsMapper sendSmsMapper;
 
     /**
      * todo 短信模板名称,需要替换
      */
-    static final String TEMPLATE_CODE = "";
+    static final String TEMPLATE_CODE = "SMS_245245018";
 
     /**
      * 查询中考下发短信日志
-     * 
+     *
      * @param id 中考下发短信日志主键
      * @return 中考下发短信日志
      */
     @Override
-    public SendSms selectSendSmsById(String id)
-    {
+    public SendSms selectSendSmsById(String id) {
         return sendSmsMapper.selectSendSmsById(id);
     }
 
     /**
      * 查询中考下发短信日志列表
-     * 
+     *
      * @param sendSms 中考下发短信日志
      * @return 中考下发短信日志
      */
     @Override
-    public List<SendSms> selectSendSmsList(SendSms sendSms)
-    {
+    public List<SendSms> selectSendSmsList(SendSms sendSms) {
         return sendSmsMapper.selectSendSmsList(sendSms);
     }
 
     /**
      * 新增中考下发短信日志
-     * 
+     *
      * @param sendSms 中考下发短信日志
      * @return 结果
      */
     @Override
-    public int insertSendSms(SendSms sendSms)
-    {
+    public int insertSendSms(SendSms sendSms) {
         sendSms.setCreateTime(DateUtils.getNowDate());
         return sendSmsMapper.insertSendSms(sendSms);
     }
 
     /**
      * 修改中考下发短信日志
-     * 
+     *
      * @param sendSms 中考下发短信日志
      * @return 结果
      */
     @Override
-    public int updateSendSms(SendSms sendSms)
-    {
+    public int updateSendSms(SendSms sendSms) {
         sendSms.setUpdateTime(DateUtils.getNowDate());
         return sendSmsMapper.updateSendSms(sendSms);
     }
 
     /**
      * 批量删除中考下发短信日志
-     * 
+     *
      * @param ids 需要删除的中考下发短信日志主键
      * @return 结果
      */
     @Override
-    public int deleteSendSmsByIds(String[] ids)
-    {
+    public int deleteSendSmsByIds(String[] ids) {
         return sendSmsMapper.deleteSendSmsByIds(ids);
     }
 
     /**
      * 删除中考下发短信日志信息
-     * 
+     *
      * @param id 中考下发短信日志主键
      * @return 结果
      */
     @Override
-    public int deleteSendSmsById(String id)
-    {
+    public int deleteSendSmsById(String id) {
         return sendSmsMapper.deleteSendSmsById(id);
     }
 
 
+    /**
+     * 批量发短信导入
+     *
+     * @param smsList         数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @param operName        操作用户
+     * @return
+     */
     @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();
+        int maxNums = 2; //每次最多发送100条,我们一次批量发100条
+        int times = 0;// 循环几个100  用List的长度 除 100
+        int size = 0; //
 
-        for (SendSms sms : smsList) {
-            // 防止有空行,手机号是必须要有的
-            String phone = sms.getPhone();
-            if (StringUtils.isEmpty(phone)) {
-                continue;
-            }
-            sms.setCreateBy(operName);
-            try {
-                QuerySendDetailsResponse querySendDetailsResponse = SendSmsUtils.sendSmsAndQuery(phone, "{\"ticketId\":\"" + sms.getTicketId() + "\",\"name\":\"" + sms.getName() + "\",\"result\":\"" + sms.getResult() + "\"}", TEMPLATE_CODE);
-                String ok = querySendDetailsResponse.getCode();
-                String message = querySendDetailsResponse.getMessage();
+        List<String> phoneList = new ArrayList<>();
+        List<String> templateList = new ArrayList<>();
+        List<String> signNameList = new ArrayList<>();
+        StringBuffer phoneNumberJson;
+        StringBuffer templateParamJson;
+        StringBuffer signNameJson;
+        //返回提示
+        String backResult = "";
+        size = smsList.size();
+        if (size < 2) {
+            times = 1;
+        } else {
+            times = (size - 1) / maxNums + 1; //为什么要-1 因为如果是200的时候,理论上次数应该是2,而不是3,如果是101,那么次数也是2,这样就保证次数准确。
+        }
 
-                if ("OK".equals(ok)) {
-                    successNum++;
-                    successMsg.append("<br/>").append(successNum).append("、手机号 ").append(sms.getPhone()).append(" 发送成功");
-                    sms.setContent(message);
-                    sms.setStatus("发送成功");
-                    sendSmsMapper.insertSendSms(sms);
-                } else {
-                    failureNum++;
-                    failureMsg.append("<br/>").append(failureNum).append("、手机号 ").append(sms.getPhone()).append(" 发送失败,原因是: ").append(querySendDetailsResponse.getMessage());
-                    sms.setContent(message);
-                    sms.setStatus("发送失败");
-                    sendSmsMapper.insertSendSms(sms);
+        for (int j = 0; j < times; j++) {
+            if (j > 0 && (j * maxNums + 1 > size)) { //边界判定,如果刚好是100条,那么times的值为2,这时候j 为1的时候 101 大于100结束循环,100条以内不生效
+                break;
+            } else {
+                phoneNumberJson = new StringBuffer();
+                templateParamJson = new StringBuffer();
+                signNameJson = new StringBuffer();
+                phoneNumberJson.append("[");
+                templateParamJson.append("[");
+                signNameJson.append("[");
+                for (int k = j * maxNums; k < size && k < (j + 1) * maxNums; k++) {
+                    // 防止有空行,手机号是必须要有的
+                    String phone = smsList.get(k).getPhone();
+                    if (StringUtils.isEmpty(phone)) {
+                        continue;
+                    }
+                    phoneNumberJson.append("\"" + smsList.get(k).getPhone() + "\",");
+                    signNameJson.append("\"潜山市数据资源局\",");
+                    templateParamJson.append("{\"ticketId\":\"" + smsList.get(k).getTicketId() + "\",\"name\":\"" + smsList.get(k).getName() + "\",\"result\":\"" + smsList.get(k).getResult() + "\"},");
                 }
-            } catch (ClientException e) {
-                failureNum++;
-                failureMsg.append("<br/>").append(failureNum).append("、手机号 ").append(sms.getPhone()).append(" 发送失败");
-                sms.setStatus("发送失败");
-                sms.setContent("手机号:"+sms.getPhone()+"准考证号:"+sms.getTicketId()+"录取结果:"+sms.getResult());
-                sendSmsMapper.insertSendSms(sms);
+                phoneNumberJson.deleteCharAt(phoneNumberJson.length() - 1);//移除最后一个逗号字符,
+                templateParamJson.deleteCharAt(templateParamJson.length() - 1);//移除最后一个逗号字符
+                signNameJson.deleteCharAt(signNameJson.length() - 1);
+                phoneNumberJson.append("]");
+                templateParamJson.append("]");
+                signNameJson.append("]");
+                phoneList.add(phoneNumberJson.toString());
+                templateList.add(templateParamJson.toString());
+                signNameList.add(signNameJson.toString());
             }
-            if (failureNum > 0) {
-                failureMsg.insert(0, "很抱歉,发送失败!共 " + failureNum + " 条,错误如下:");
-                return failureMsg.toString();
-            } else {
-                successMsg.insert(0, "短信已全部发送成功!共 " + successNum + " 条,数据如下:");
+            //组装请求对象
+            if (times == phoneList.size()) {
+                for (int i = 0; i < times; i++) {
+                    long startTimeSql = System.currentTimeMillis();
+                    SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest();
+                    //组装电话号码
+                    sendBatchSmsRequest.setPhoneNumberJson(phoneList.get(i));
+                    //签名名称
+                    sendBatchSmsRequest.setSignNameJson(signNameList.get(i));
+                    //替换参数
+                    sendBatchSmsRequest.setTemplateParamJson(templateList.get(i));
+                    //固定的模板名称
+                    sendBatchSmsRequest.setTemplateCode(TEMPLATE_CODE);
+                    long endTimeSql = System.currentTimeMillis() - startTimeSql;
+                    System.out.println("执行批量下发短信计算:"+i+"次,时间" + endTimeSql + "ms");
+                    long startTimeSend = System.currentTimeMillis();
+                    SendBatchSmsResponse sendBatchSmsResponse = SendBatchSmsUtils.sendBatchSms(sendBatchSmsRequest);
+                    long endTimeSend = System.currentTimeMillis() - startTimeSend;
+                    System.out.println("执行批量下发短信接口请求:" + endTimeSend + "ms");
+                    SendSms sendSms = new SendSms();
+                    if (sendBatchSmsResponse != null) {
+                        String code = sendBatchSmsResponse.getBody().getCode();
+                        if (sendBatchSmsResponse.getBody().getCode() != null && "OK".equals(code)) {
+                            sendSms.setStatus("发送成功");
+                            sendSms.setPhone(String.join(",", phoneList));
+                            sendSms.setCreateBy(operName);
+                            sendSmsMapper.insertSendSms(sendSms);
+                            //批量请求发送短信成功
+                            System.out.println("批量短信发送成功:" + phoneList.get(i).split(",").length + "条");
+                            backResult = backResult +"第"+i+"次批量成功  ";
+                        } else {
+                            sendSms.setPhone(String.join(",", phoneList));
+                            sendSms.setStatus("发送失败");
+                            sendSms.setCreateBy(operName);
+                            sendSmsMapper.insertSendSms(sendSms);
+                            System.out.println("批量短信发送失败!");
+                            backResult = backResult +"第"+i+"次批量失败  ";
+                        }
+                    }
+                }
             }
-
         }
-        return successMsg.toString();
+        return backResult;
     }
 }

+ 65 - 0
boman-web-core/src/main/java/com/boman/web/core/utils/SendBatchSmsUtils.java

@@ -0,0 +1,65 @@
+package com.boman.web.core.utils;
+
+/**
+ * @author tjf
+ * @Date: 2022/07/12/16:49
+ * 阿里云发送短信新版
+ */
+
+import com.aliyun.tea.*;
+import com.aliyun.dysmsapi20170525.models.*;
+import com.aliyun.teaopenapi.models.*;
+import com.aliyun.teautil.models.*;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.exceptions.ClientException;
+
+public class SendBatchSmsUtils {
+
+    //短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+    static final String SIGN_NAME = "潜山市数据资源局";
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @param accessKeyId
+     * @param accessKeySecret
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
+        Config config = new Config()
+                // 您的 AccessKey ID
+                .setAccessKeyId(accessKeyId)
+                // 您的 AccessKey Secret
+                .setAccessKeySecret(accessKeySecret);
+        // 访问的域名
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws ClientException
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest){
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendBatchSmsUtils.createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+            RuntimeOptions runtime = new RuntimeOptions();
+            SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
+            return sendBatchSmsResponse;
+            // 复制代码运行请自行打印 API 的返回值
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+}

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

@@ -35,7 +35,7 @@ public class SendSmsUtils {
     //短信参数
     static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
     static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
-    static final String SIGN_NAME = "";
+    static final String SIGN_NAME = "潜山市数据资源局";
 
     /**
      * 发送短信接口