skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsTemplate.java
@@ -69,7 +69,7 @@ private String remark; /** * 短信类型 * 短信类型(登录,告警,,,) */ @ApiModelProperty(value = "短信类型") private Integer smsType; skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java
@@ -8,21 +8,28 @@ import cn.gistack.alerts.sms.entity.SmsRequest; import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.excel.SendRainSmsExcel; import cn.gistack.alerts.sms.excel.SendSmsExcel; import cn.gistack.alerts.sms.listener.ExcelListener; import cn.gistack.alerts.sms.service.SmsService; import cn.gistack.alerts.sms.util.SmsUtils; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import cn.gistack.alerts.sms.vo.SmsResponseVO; import cn.gistack.sm.intelligentCall.excel.CallExcel; import cn.gistack.system.user.entity.User; import cn.gistack.system.user.feign.IUserClient; import com.alibaba.excel.EasyExcel; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -222,4 +229,38 @@ // 导入并返回 return R.data(smsService.batchSendSms(map)); } /** * 导入表格发送预警短信 * @param file excel文件 * @param templateId 模板id * @param param 通用参数 * @param content 发送内容 * @return */ @PostMapping("/import-send-sms") public R importSendSms(MultipartFile file,String templateId,String param,String content){ ExcelListener<SendSmsExcel> listener = new ExcelListener<>(); //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据 try { EasyExcel.read(file.getInputStream(), SendSmsExcel.class, listener).headRowNumber(1).sheet(0).doRead(); } catch (IOException e) { e.printStackTrace(); } List<SendSmsExcel> list = listener.getDatas(); // 导入并返回 return R.data(smsService.importSendSms(list,templateId,param,content)); } /** * 导出模板 */ @GetMapping("/export-template") @ApiOperation(value = "导出模板") public void exportTemplate(HttpServletResponse response) { List<SendSmsExcel> list = new ArrayList<>(); ExcelUtil.export(response, "短信发送数据模板", "短信发送数据表", list, SendSmsExcel.class); } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/excel/SendSmsExcel.java
New file @@ -0,0 +1,22 @@ package cn.gistack.alerts.sms.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; import lombok.Data; import java.io.Serializable; @Data @ColumnWidth(25) @HeadRowHeight(20) @ContentRowHeight(18) public class SendSmsExcel implements Serializable { private static final long serialVersionUID = 1L; @ColumnWidth(15) @ExcelProperty("手机号码") private String phone; } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.xml
@@ -17,6 +17,9 @@ <if test="smsTemplate.type!=null and smsTemplate.type!=''"> and type = #{smsTemplate.type} </if> <if test="smsTemplate.smsType!=null"> and sms_type = #{smsTemplate.smsType} </if> <if test="smsTemplate.noticeMode!=null and smsTemplate.noticeMode!=''"> and notice_mode = #{smsTemplate.noticeMode} </if> skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java
@@ -7,6 +7,7 @@ import cn.gistack.alerts.sms.entity.SmsRequest; import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.excel.SendRainSmsExcel; import cn.gistack.alerts.sms.excel.SendSmsExcel; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import cn.gistack.alerts.sms.vo.SmsResponseVO; @@ -105,4 +106,14 @@ * @return */ Object batchSendSms(Map<String, Object> map); /** * 导入表格发送预警短信 * @param list 集合数据 * @param templateId 模板id * @param param 通用参数 * @param content 发送内容 * @return */ Object importSendSms(List<SendSmsExcel> list,String templateId,String param, String content); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -18,6 +18,7 @@ import cn.gistack.alerts.sms.entity.SmsResult; import cn.gistack.alerts.sms.entity.SmsTemplate; import cn.gistack.alerts.sms.excel.SendRainSmsExcel; import cn.gistack.alerts.sms.excel.SendSmsExcel; import cn.gistack.alerts.sms.service.ISmsRecordService; import cn.gistack.alerts.sms.service.ISmsResultService; import cn.gistack.alerts.sms.service.ISmsTemplateService; @@ -27,12 +28,14 @@ import cn.gistack.alerts.sms.vo.SmsResponseVO; import cn.gistack.alerts.sms.vo.Temp; import cn.gistack.sm.intelligentCall.entity.CallNotFillRecord; import cn.gistack.sm.intelligentCall.excel.CallExcel; import cn.gistack.sm.intelligentCall.feign.OutCallClient; import cn.gistack.sm.message.entity.MessageRecord; import cn.gistack.sm.sjztmd.feign.IAttResManagePersonClient; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.springblade.core.redis.cache.BladeRedis; import org.springblade.core.secure.utils.AuthUtil; @@ -980,4 +983,82 @@ // 返回 return batchSendSmsMap; } /** * 导入表格发送预警短信 * @param list 集合数据 * @param templateId 模板id * @param param 通用参数 * @param content 发送内容 * @return */ @Override public Object importSendSms(List<SendSmsExcel> list,String templateId,String param, String content) { // 查询短信模板 SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id", templateId)); // 判断模板是否为具名变量模板(目前已筛选出都是具名变量模板) // 判断模板中是否包含参数,如果无参数,对比是否传参数 boolean validate = validatorParam(smsTemplate,param); if (!validate){ return R.data(400,"参数个数不对应,请检查后修改导入!",null); } // 转换 List<String> stringList = list.stream().map(SendSmsExcel::getPhone).collect(Collectors.toList()); // 获取水库个数 List<String> errPhones = new ArrayList<>(); // 去重 Set<String> hashSet = new HashSet<>(stringList); // 拼接短信标题数组 String [] titleArr = getSmsTitleArr(smsTemplate); // 批量发送不能超过1000 个号码,需分组发送 List<String> arrayList = new ArrayList<>(hashSet); List<List<String>> partition = Lists.partition(arrayList, 1000); int i = 0; String errMsg = ""; for (List<String> phoneList : partition) { HashSet<String> sets = new HashSet<>(phoneList); // 批量发送短信 Map<String, Object> batchSendSmsMap = batchSendSms(sets, titleArr, param, smsTemplate,errPhones); // 取出发送结果 ComResult<DynSMSSendDataResult> resultComResult = (ComResult<DynSMSSendDataResult>) batchSendSmsMap.get("resultComResult"); // if(!resultComResult.getCode().equals(0)){ i++; errMsg = resultComResult.getMsg(); break; } } if (i>0){ // 返回resultComResult return R.data(400,"发送失败!" + errMsg,null); } // 返回resultComResult return R.data(200,"发送成功!",null); } /** * 校验参数 * @param smsTemplate * @param param */ private boolean validatorParam(SmsTemplate smsTemplate, String param) { int length = 0; if (null!= param && !param.equals("")) { length = Arrays.asList(param.split(",")).size(); } // 解析模板 String str = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s"); int countChar = countChar(str, '%'); if (length==countChar){ return true; }else { return false; } } public int countChar(String str, char target) { String targetStr = String.valueOf(target); String replacedStr = str.replaceAll(targetStr, ""); return str.length() - replacedStr.length(); } }