|
@@ -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;
|
|
|
}
|
|
|
}
|