skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsRecord.java
@@ -1,6 +1,10 @@ package cn.gistack.alerts.sms.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModel; @@ -9,16 +13,26 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.springblade.core.tenant.mp.TenantEntity; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * 短信发送记录 * @author Administrator */ @Data @TableName("sm_sms_record") @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel(value = "sm_sms_record对象", description = "短信发送记录") public class SmsRecord extends TenantEntity { public class SmsRecord{ @JsonSerialize(using = ToStringSerializer.class) @ApiModelProperty("主键id") @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** * 模板id */ @@ -30,12 +44,6 @@ */ @ApiModelProperty(value = "手机号") private String tel; /** * 手机号(废弃) */ @ApiModelProperty(value = "手机号(废弃)") private String phone; /** * 消息内容 @@ -62,10 +70,25 @@ private String responseMsg; /** * 响应消息 * 发送结果ID */ @ApiModelProperty(value = "响应消息") @ApiModelProperty(value = "发送结果ID") @JsonSerialize(using = ToStringSerializer.class) private Long resultId; @JsonSerialize(using = ToStringSerializer.class) @ApiModelProperty("创建人") private Long createUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("创建时间") private Date createTime; @ApiModelProperty("业务状态") private Integer status; @TableLogic @ApiModelProperty("是否已删除") private Integer isDeleted; } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/constant/ZtApiDataColumnConstant.java
@@ -40,4 +40,15 @@ add("rz"); }}; /** * 水位初次超汛限告警(水库技术责任人、巡查责任人) */ public static List<String> waterFirstOverList = new ArrayList<String>() {{ add("town_nm"); add("res_nm"); add("rz"); add("over_z"); }}; } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/constant/ZtApiUrlConstant.java
@@ -23,4 +23,9 @@ */ public static final String res_diff_dead_z_api = "http://10.42.6.192/services/1234567890ABCDEFGHIJKLMN/res/diff_dead_z"; /** * 水位初次超汛限告警 */ public static final String over_z_res_api = "http://10.10.2.192/services/1234567890ABCDEFGHIJKLMN/over_z_res"; } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeStrategyImpl.java
@@ -66,7 +66,7 @@ * @param templateId * @param alarmRule * @param columnsList 列名集合信息 * @param flag * @param flag 是否包含日期 * @return */ private SmsRequestTemplate getSendSmsTemplate(JSONArray jsonArray, @@ -210,6 +210,29 @@ } /** * 依次添加巡查责任人,技术责任人信息 * @param list */ private void addPatrolTechnologyInfo(List<String> list) { // 查询巡查责任人姓名,技术责任人姓名信息 List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(0),"4,5"); String xczrr = ""; String jszrr = ""; for (PersonVO personVO : personVOList) { if (personVO.getType().equals("5")){ xczrr = personVO.getName(); } if (personVO.getType().equals("4")){ jszrr = personVO.getName(); } } // 巡查责任人姓名 list.add(xczrr); // 技术责任人姓名 list.add(jszrr); } /** * 默认实现 * * @param arg1 告警规则名称 @@ -349,22 +372,7 @@ // 遍历,拼接县水利部人员电话 for (List<String> list : smsRequestTemplate.getTemplateContent()) { // 后面依次拼接 巡查责任人姓名,技术责任人姓名,市县水利部门人员姓名电话(暂时不要) // 查询巡查责任人姓名,技术责任人姓名信息 List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(0),"4,5"); String xczrr = ""; String jszrr = ""; for (PersonVO personVO : personVOList) { if (personVO.getType().equals("5")){ xczrr = personVO.getName(); } if (personVO.getType().equals("4")){ jszrr = personVO.getName(); } } // 巡查责任人姓名 list.add(xczrr); // 技术责任人姓名 list.add(jszrr); addPatrolTechnologyInfo(list); // 市县水利部门人员姓名电话(暂时不要) // list.add("测试:13112341234"); // 保存告警记录信息 @@ -380,6 +388,8 @@ return "水位接近汛限告警"; } /** * 策略6: 水位初次超汛限告警 * @@ -388,8 +398,29 @@ * @return */ public String waterFirstOverHandle(String arg1, String arg2) { // 业务逻辑处理 2... return ""; // 查询当前策略对应的告警规则信息 AlarmRule alarmRule = alarmRuleService.getOne(new QueryWrapper<AlarmRule>().eq("rule_name", arg1)); if (null!=alarmRule) { // 调用中台服务接口查询数据 JSONArray ztData = getZtData("", ZtApiUrlConstant.over_z_res_api); // 只发短信,将发短信信息组装好 SmsRequestTemplate smsRequestTemplate = getSendSmsTemplate(ztData, "2431012216671",alarmRule, ZtApiDataColumnConstant.waterFirstOverList,true); // 拼接后面内容 for (List<String> list : smsRequestTemplate.getTemplateContent()) { // 依次拼接巡查责任人,技术责任人姓名 addPatrolTechnologyInfo(list); // 保存告警记录信息 AlarmRecord alarmRecord = saveAlarmRecord(list,alarmRule); if (null != alarmRecord) { list.add(alarmRecord.getId().toString()); } } // 调用短信服务 smsService.sendSignMsg(smsRequestTemplate); } // 返回 return "水位初次超汛限告警"; } /** skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java
@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import static cn.gistack.common.cache.CacheNames.PHONE_KEY; @@ -72,7 +73,7 @@ /** * 短信动态内容发送通用方法(仅支持 具名变量 {手机号码:11} 模式的模板) * request 必须包含手机号,模板id,拼接好的内容 * request * @param smsRequest * @return */ @@ -254,7 +255,7 @@ /** * 发送 具名 变量模板短信 * 发送 具名 变量模板短信(告警定制) * @param smsRequest 发送对象 * @return */ @@ -262,4 +263,15 @@ public R sendSignMsg(@RequestBody SmsRequestTemplate smsRequest){ return R.data(smsService.sendSignMsg(smsRequest)); } /** * 发送降雨短信 * @param params 发送对象 * @return */ @PostMapping("/sendSignRainMsg") public R sendSignRainMsg(@RequestBody Map<String,Object> params){ return R.data(smsService.sendSignRainMsg(params)); } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsRecordController.java
@@ -8,7 +8,6 @@ import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; @@ -26,7 +25,7 @@ @RestController @RequestMapping("/smsRecord/smsRecord") @AllArgsConstructor public class SmsRecordController extends BladeController { public class SmsRecordController{ private ISmsRecordService smsRecordService; skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.java
@@ -21,4 +21,11 @@ * @return */ List<SmsRecordVO> selectSmsRecordPage(IPage<SmsRecordVO> page,@Param("smsRecord") SmsRecordVO smsRecord); /** * 批量插入记录 * @param list * @return */ int batchSaveSendRecord(@Param("list") List<SmsRecord> list); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.xml
@@ -5,8 +5,8 @@ <!--自定义分页列表查询--> <select id="selectSmsRecordPage" resultType="cn.gistack.alerts.sms.vo.SmsRecordVO"> select * from sm_sms_record where 1=1 and is_deleted = 0 <if test="smsRecord.phone!=null and smsRecord.phone!=''"> and phone like concat(concat('%',#{smsRecord.phone}),'%') <if test="smsRecord.tel!=null and smsRecord.tel!=''"> and tel like concat(concat('%',#{smsRecord.tel}),'%') </if> <if test="smsRecord.content!=null and smsRecord.content!=''"> and content like concat(concat('%',#{smsRecord.content}),'%') @@ -17,4 +17,23 @@ order by id desc </select> <!--批量新增--> <insert id="batchSaveSendRecord" parameterType="cn.gistack.alerts.sms.entity.SmsRecord" useGeneratedKeys="true" keyProperty="id"> insert into sm_sms_record (id,template_id,tel,content,response_status,response_msg,result_id,is_deleted,create_time) <foreach collection="list" item="item" index="index" separator=","> ( #{item.id}, #{item.templateId}, #{item.tel}, #{item.content}, #{item.responseStatus}, #{item.responseMsg}, #{item.resultId}, 0,now() ) </foreach> </insert> </mapper> skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/ISmsRecordService.java
@@ -3,9 +3,11 @@ import cn.gistack.alerts.sms.entity.SmsRecord; import cn.gistack.alerts.sms.vo.SmsRecordVO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import com.baomidou.mybatisplus.extension.service.IService; public interface ISmsRecordService extends BaseService<SmsRecord> { import java.util.List; public interface ISmsRecordService extends IService<SmsRecord> { /** * 自定义分页列表查询 @@ -14,4 +16,10 @@ * @return */ Object selectSmsRecordPage(IPage<SmsRecordVO> page, SmsRecordVO smsRecord); /** * 批量插入记录 * @param list */ int batchSaveSendRecord(List<SmsRecord> list); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java
@@ -25,7 +25,7 @@ List<String> phoneNumbers); /** * 发送 具名 变量模板短信 * 发送 具名 变量模板短信 (告警定制) * @param smsRequestTemplate * @return */ @@ -55,4 +55,11 @@ * @return */ Map<String, Object> saveInStationInfo(SmsRequestTemplate smsRequestTemplate); /** * 发送降雨短信 * @param params 发送对象 * @return */ Object sendSignRainMsg(Map<String, Object> params); } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsRecordServiceImpl.java
@@ -5,15 +5,17 @@ import cn.gistack.alerts.sms.service.ISmsRecordService; import cn.gistack.alerts.sms.vo.SmsRecordVO; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; /** * 短信发送记录 * @author zhongrj */ @Service public class SmsRecordServiceImpl extends BaseServiceImpl<SmsRecordMapper, SmsRecord> implements ISmsRecordService { public class SmsRecordServiceImpl extends ServiceImpl<SmsRecordMapper, SmsRecord> implements ISmsRecordService { /** * 自定义分页列表查询 @@ -30,4 +32,14 @@ // 查询返回 return page.setRecords(baseMapper.selectSmsRecordPage(page,smsRecord)); } /** * 批量插入记录 * @param list * @return */ @Override public int batchSaveSendRecord(List<SmsRecord> list) { return baseMapper.batchSaveSendRecord(list); } } skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -15,10 +15,14 @@ import cn.gistack.alerts.sms.service.SmsService; import cn.gistack.alerts.sms.util.SmsUtils; import cn.gistack.alerts.sms.vo.SmsRequestTemplate; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.springblade.core.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 短信发送服务实现层 @@ -65,7 +69,7 @@ } /** * 发送 具名 变量模板短信 * 发送 具名 变量模板短信(告警定制) * @param smsRequestTemplate * @return */ @@ -194,12 +198,34 @@ } /** * 发送 具名 变量模板短信--批量一次发送 * @param title 具名变量头 * 发送降雨短信--批量一次发送 * @param params 具名变量头 * @return */ public Object sendSignMsg(String title, String datas, SMSSendRequest request, Integer type, SmsTemplate smsTemplate) { String[] titleArr = title.split(","); @Override public Object sendSignRainMsg(Map<String, Object> params) { String[] titleArr = params.get("title").toString().split(","); String data = params.get("data").toString(); String templateId = params.get("templateId").toString(); String content = params.get("content").toString(); List<String> phones = (List<String>)params.get("phones"); List<String> errPhones = new ArrayList<>(); // 手机号去重 Set<String> hashSet = new HashSet<>(); for (String phone : phones) { hashSet.add(phone); } StringBuilder builder = new StringBuilder(); // 变量 for (String phone : hashSet) { if (validator(phone)){ builder.append(phone+","+data).append(";"); }else { // 异常手机号 errPhones.add(phone); } } String datas = builder.toString(); String[] rows = datas.split(";"); String[][] dyns = new String[rows.length + 1][titleArr.length]; dyns[0] = titleArr; @@ -210,22 +236,45 @@ } //请求参数 DynSMSSendRequest sendRequest = new DynSMSSendRequest(); sendRequest.setTemplateId(request.getTemplateId()); sendRequest.setTemplateId(templateId); sendRequest.setDynData(dyns); // 发送 ComResult<DynSMSSendDataResult> resultComResult = SmsUtils.dynSendMethod(sendRequest); SMSSendRequest request = new SMSSendRequest(); request.setTemplateId(templateId); request.setMessageContent(content); request.setUserNumber(""); // 先保存结果记录 SmsResult smsResult = saveSendResult(request, rows.length); SmsRecord smsRecord = new SmsRecord(); if (null != smsResult){ // 保存记录 smsRecord = saveSendRecord(request, resultComResult.getCode().toString(), resultComResult.getMsg(), smsResult.getId()); List<SmsRecord> list = new ArrayList<>(); // 遍历保存 for (String phone : hashSet) { SmsRecord smsRecord = new SmsRecord(); smsRecord.setId(IdWorker.getId()); smsRecord.setTel(phone); smsRecord.setContent(content); smsRecord.setTemplateId(templateId); smsRecord.setResultId(smsResult.getId()); smsRecord.setResponseStatus(resultComResult.getCode().toString()); smsRecord.setResponseMsg(resultComResult.getMsg()); // 加入集合 list.add(smsRecord); } // 批量保存记录 smsRecordService.batchSaveSendRecord(list); } Map<String, Object> map = new HashMap<>(2); map.put("smsRecord",smsRecord); map.put("smsResult",smsResult); Integer diff = phones.size() - hashSet.size(); if (resultComResult.getCode()==0){ String successMsg = "发送成功!共提交号码 "+phones.size()+" 个,其中重复号码 "+diff+" 个,错误号码 " +errPhones.size()+" 个,发送成功号码 "+ hashSet.size() + " 个。"; // 返回 return R.data(200,successMsg,null); } String errorMsg = "发送失败!共提交号码 "+phones.size()+" 个,其中重复号码 "+diff+" 个,错误号码 "+errPhones.size()+ " 个,发送异常号码 "+ hashSet.size()+" 个,异常原因" + resultComResult.getMsg() + "。"; // 返回 return map; return R.data(400,errorMsg,null); } @@ -274,5 +323,23 @@ return smsRecord; } /** * 校验手机号码 */ public static boolean validator(String phone) { if (null!=phone && !phone.equals("")) { String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$"; if (phone.length() != 11) { return false; } else { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(phone); boolean isMatch = m.matches(); return isMatch; } } return false; } }