package cn.gistack.alerts.notice.service.impl;
|
|
import cn.gistack.alerts.alarmRule.entity.AlarmRecord;
|
import cn.gistack.alerts.alarmRule.entity.AlarmRule;
|
import cn.gistack.alerts.alarmRule.service.AlarmRecordService;
|
import cn.gistack.alerts.alarmRule.service.AlarmRuleService;
|
import cn.gistack.alerts.sms.service.ISmsTemplateService;
|
import cn.gistack.sm.intelligentCall.constant.ZtConstant;
|
import cn.gistack.alerts.notice.constant.PtInfoConstant;
|
import cn.gistack.alerts.notice.constant.ZtApiDataColumnConstant;
|
import cn.gistack.alerts.notice.constant.ZtApiUrlConstant;
|
import cn.gistack.alerts.notice.enums.PersonEnum;
|
import cn.gistack.alerts.notice.util.FormatUtil;
|
import cn.gistack.sm.sjztmd.vo.PersonVO;
|
import cn.gistack.sm.sjztmd.feign.IAttResManagePersonClient;
|
import cn.gistack.alerts.sms.entity.SmsTemplate;
|
import cn.gistack.alerts.sms.service.SmsService;
|
import cn.gistack.alerts.sms.vo.SmsRequestTemplate;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.HttpEntity;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpMethod;
|
import org.springframework.http.ResponseEntity;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.MultiValueMap;
|
import org.springframework.web.client.RestTemplate;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 通知策略
|
*
|
* @author zhongrj
|
* @date 2023-05-30
|
*/
|
@Component
|
public class NoticeStrategyImpl {
|
|
@Autowired
|
private SmsService smsService;
|
|
@Autowired
|
private AlarmRuleService alarmRuleService;
|
|
@Autowired
|
private AlarmRecordService alarmRecordService;
|
|
@Autowired
|
private ISmsTemplateService smsTemplateService;
|
|
@Autowired
|
private RestTemplate restTemplate;
|
|
@Autowired
|
private IAttResManagePersonClient attResManagePersonClient;
|
|
|
/**
|
* 短信发送数据组装
|
*
|
* @param jsonArray
|
* @param templateId
|
* @param alarmRule
|
* @param columnsList 列名集合信息
|
* @param flag
|
* @return
|
*/
|
private SmsRequestTemplate getSendSmsTemplate(JSONArray jsonArray,
|
String templateId,
|
AlarmRule alarmRule,
|
List<String> columnsList,
|
Boolean flag) {
|
// 通过模板id 查询模板相关信息
|
SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id",templateId).eq("is_deleted",0));
|
if (null != smsTemplate) {
|
SmsRequestTemplate smsRequestTemplate = new SmsRequestTemplate();
|
// 设置模板信息
|
smsRequestTemplate.setSmsTemplate(smsTemplate);
|
// 解析模板并设置 title
|
smsRequestTemplate.setTitle(FormatUtil.composeMessage(smsTemplate.getContent()));
|
// 列名数据转换
|
getColumnData(jsonArray, columnsList,smsRequestTemplate,alarmRule,flag);
|
//返回
|
return smsRequestTemplate;
|
}
|
return null;
|
}
|
|
/**
|
* 列名数据转换
|
* @param jsonArray
|
* @param columnsList
|
* @param smsRequestTemplate
|
* @param flag
|
* @return
|
*/
|
private void getColumnData(JSONArray jsonArray,
|
List<String> columnsList,
|
SmsRequestTemplate smsRequestTemplate,
|
AlarmRule alarmRule,
|
Boolean flag) {
|
List<PersonVO> personLists = new ArrayList<>();
|
List<List<String>> lists = new ArrayList<>();
|
for (int i = 0; i < jsonArray.size(); i++) {
|
// 根据水库编号,所在区域查询需要发送的人员手机号及设置
|
String res_cd = jsonArray.getJSONObject(i).getString("res_cd");
|
// 判断时间是否存在
|
String tm = jsonArray.getJSONObject(i).getString("tm");
|
String day = "";
|
String hour = "";
|
String minute = "";
|
if (null!=tm && !tm.equals("") && flag){
|
flag = true;
|
// 加入天,时,分
|
day = tm.substring(8,10);
|
hour = tm.substring(11,13);
|
minute = tm.substring(14,16);
|
}else {
|
flag = false;
|
}
|
// 查询告警人员信息
|
List<PersonVO> personVOList = getPersonListByResGuid(res_cd,alarmRule);
|
if (personVOList.size() > 0) {
|
for (PersonVO personVO : personVOList) {
|
List<String> list = new ArrayList<>();
|
list.add(res_cd);
|
list.add(personVO.getPhone());
|
if (flag) {
|
list.add(day);
|
list.add(hour);
|
list.add(minute);
|
}
|
// 变量将值放入集合中
|
for (String column : columnsList) {
|
String[] split = column.split(",");
|
String format = "";
|
for (String s : split) {
|
format = format + jsonArray.getJSONObject(i).getString(s);
|
}
|
list.add(format);
|
}
|
lists.add(list);
|
}
|
}
|
personLists.addAll(personVOList);
|
}
|
// 设置信息
|
smsRequestTemplate.setPersonVOList(personLists);
|
smsRequestTemplate.setTemplateContent(lists);
|
}
|
|
/**
|
* 保存告警记录信息
|
* @param list
|
* @param alarmRule 告警规则
|
* @return
|
*/
|
private AlarmRecord saveAlarmRecord(List<String> list,AlarmRule alarmRule) {
|
AlarmRecord alarmRecord = new AlarmRecord();
|
// 设置相关信息
|
alarmRecord.setAlarmRuleId(alarmRule.getId().toString());
|
alarmRecord.setReservoirNumber(list.get(0));
|
alarmRecord.setAlarmCondition(alarmRule.getRuleRemark());
|
// 新增
|
boolean save = alarmRecordService.save(alarmRecord);
|
if (save){
|
return alarmRecord;
|
}
|
// 返回
|
return null;
|
}
|
|
/**
|
* 查询告警人员信息
|
* @param res_cd 水库 guid
|
* @param alarmRule
|
* @return
|
*/
|
private List<PersonVO> getPersonListByResGuid(String res_cd,AlarmRule alarmRule) {
|
// 查询对应的角色信息
|
String roles = alarmRule.getAlarmPerson();
|
String[] roleArray = roles.split(",");
|
List<String> personList = new ArrayList<>();
|
List<String> areaList = new ArrayList<>();
|
// 遍历
|
for (String role : roleArray) {
|
if (role.contains("责任人")){
|
personList.add(PersonEnum.findByName(role).getType().toString());
|
}else {
|
areaList.add(role);
|
}
|
}
|
// 根据角色,水库编号查询对应的告警人员信息
|
List<PersonVO> list = new ArrayList<>();
|
//1. 根据水库编号查询除责任人之外的人员信息
|
if (areaList.size() > 0) {
|
List<PersonVO> personVOList = attResManagePersonClient.getUserListByResGuid(res_cd);
|
list.addAll(personVOList);
|
}
|
//2. 根据水库编号及责任人类型查询相关责任人信息
|
List<PersonVO> personVOList1 = attResManagePersonClient.getPersonListByResGuid(res_cd,String.join(",",personList));
|
// 合并人员数据
|
list.addAll(personVOList1);
|
// 返回数据
|
return list;
|
}
|
|
/**
|
* 默认实现
|
*
|
* @param arg1 告警规则名称
|
* @param arg2
|
* @return
|
*/
|
public String doSomethingDefault(String arg1, String arg2) {
|
// 默认业务逻辑处理...
|
return "默认实现";
|
}
|
|
/**
|
* 策略1: 水位信息接收不到
|
*
|
* @param arg1 告警规则名称
|
* @param arg2
|
* @return
|
*/
|
public String waterInfoNotHandle(String arg1, String arg2) {
|
// 查询当前策略对应的告警规则信息
|
AlarmRule alarmRule = alarmRuleService.getOne(new QueryWrapper<AlarmRule>().eq("rule_name", arg1));
|
if (null!=alarmRule) {
|
// 调用中台服务接口查询数据
|
JSONArray ztData = getZtData("", ZtApiUrlConstant.res_z_null_api);
|
// 只发短信,将发短信信息组装好
|
SmsRequestTemplate smsRequestTemplate = getSendSmsTemplate(ztData, "2431012216668",alarmRule, ZtApiDataColumnConstant.waterInfoNotList,false);
|
// 拼接内容后面的联系方式,当前模板拼接平台服务电话
|
// 遍历,拼接平台服务电话
|
for (List<String> list : smsRequestTemplate.getTemplateContent()) {
|
// 添加平台电话
|
list.add(PtInfoConstant.serverPhone);
|
// 保存告警记录信息
|
AlarmRecord alarmRecord = saveAlarmRecord(list,alarmRule);
|
if (null != alarmRecord) {
|
list.add(alarmRecord.getId().toString());
|
}
|
}
|
// 调用短信服务
|
smsService.sendSignMsg(smsRequestTemplate);
|
}
|
// 返回
|
return "水位信息接收不到";
|
}
|
|
/**
|
* 策略2: 水位数据异常
|
*
|
* @param arg1 告警规则名称
|
* @param arg2
|
* @return
|
*/
|
public String waterDataExcHandle(String arg1, String arg2) {
|
// 查询当前策略对应的告警规则信息
|
AlarmRule alarmRule = alarmRuleService.getOne(new QueryWrapper<AlarmRule>().eq("rule_name", arg1));
|
if (null!=alarmRule) {
|
// 调用中台服务接口查询数据
|
JSONArray ztData = getZtData("", ZtApiUrlConstant.res_z_not_normal_api);
|
// 只发短信,将发短信信息组装好
|
SmsRequestTemplate smsRequestTemplate
|
= getSendSmsTemplate(ztData, "2431012248591",alarmRule, ZtApiDataColumnConstant.waterDataExcList,false);
|
// 拼接后面内容
|
for (List<String> list : smsRequestTemplate.getTemplateContent()) {
|
// 保存告警记录信息
|
AlarmRecord alarmRecord = saveAlarmRecord(list,alarmRule);
|
if (null != alarmRecord) {
|
list.add(alarmRecord.getId().toString());
|
}
|
}
|
// 调用短信服务
|
smsService.sendSignMsg(smsRequestTemplate);
|
}
|
// 返回
|
return "水位数据异常";
|
}
|
|
/**
|
* 策略3: 水位超低于死水位(水库技术责任人、巡查责任人)
|
*
|
* @param arg1 告警规则名称
|
* @param arg2
|
* @return
|
*/
|
public String waterLessDeadHandle(String arg1, String arg2) {
|
// 查询当前策略对应的告警规则信息
|
AlarmRule alarmRule = alarmRuleService.getOne(new QueryWrapper<AlarmRule>().eq("rule_name", arg1));
|
if (null!=alarmRule) {
|
// 调用中台服务接口查询数据
|
JSONArray ztData = getZtData("", ZtApiUrlConstant.res_diff_dead_z_api);
|
// 只发短信,将发短信信息组装好
|
SmsRequestTemplate smsRequestTemplate = getSendSmsTemplate(ztData, "2431012248594",alarmRule, ZtApiDataColumnConstant.waterLessDeadList,true);
|
// 拼接内容后面的联系方式,当前模板县水利部人员姓名电话
|
// 遍历,拼接县水利部人员电话
|
for (List<String> list : smsRequestTemplate.getTemplateContent()) {
|
// 查询县水利部人员(通过水库编号)
|
// list.add("测试:13112341234");
|
// 保存告警记录信息
|
AlarmRecord alarmRecord = saveAlarmRecord(list,alarmRule);
|
if (null != alarmRecord) {
|
list.add(alarmRecord.getId().toString());
|
}
|
}
|
// 调用短信服务
|
smsService.sendSignMsg(smsRequestTemplate);
|
}
|
// 返回
|
return "水位超低于死水位";
|
}
|
|
/**
|
* 策略4: 水位高于死水位,低于旱警水位
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterMoreDeadLessHJHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略5: 水位接近汛限告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterComeOverHandle(String arg1, String arg2) {
|
// 查询当前策略对应的告警规则信息
|
AlarmRule alarmRule = alarmRuleService.getOne(new QueryWrapper<AlarmRule>().eq("rule_name", arg1));
|
if (null!=alarmRule) {
|
// 调用中台服务接口查询数据
|
JSONArray ztData = getZtData("", ZtApiUrlConstant.res_diff_dead_z_api);
|
// 只发送站内信
|
SmsRequestTemplate smsRequestTemplate = getSendSmsTemplate(ztData, "znxsw10000001",alarmRule, ZtApiDataColumnConstant.waterLessDeadList,true);
|
// 拼接内容后面的联系方式,当前模板县水利部人员姓名电话
|
// 遍历,拼接县水利部人员电话
|
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);
|
// 市县水利部门人员姓名电话(暂时不要)
|
// list.add("测试:13112341234");
|
// 保存告警记录信息
|
AlarmRecord alarmRecord = saveAlarmRecord(list,alarmRule);
|
if (null != alarmRecord) {
|
list.add(alarmRecord.getId().toString());
|
// list.add("999");
|
}
|
}
|
// 保存站内信记录信息
|
smsService.saveInStationInfo(smsRequestTemplate);
|
}
|
return "水位接近汛限告警";
|
}
|
|
/**
|
* 策略6: 水位初次超汛限告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterFirstOverHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略7: 水位小幅超汛限告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterSmallScaleOverHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略8: 水位大幅超汛限告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterBigScaleOverHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略9: 水位接近设计洪水位告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterComeDesignHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略10: 水位超设计洪水位告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterMoreDesignHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略11: 水位超校核洪水位告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterMoreCheckHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略12: 近1h水位陡升
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterComeOneHourUpHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略13: 近1h水位陡降
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String waterComeOneHourDownHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略14: 暴雨降雨预警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String rainstormHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略15: 已降大雨告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String alreadyHeavyRainHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略16: 已降暴雨告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String alreadyRainstormHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略17: 2小时降雨告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String twoHourRainHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 策略18: 6小时降雨告警
|
*
|
* @param arg1
|
* @param arg2
|
* @return
|
*/
|
public String sixHourRainHandle(String arg1, String arg2) {
|
// 业务逻辑处理 2...
|
return "";
|
}
|
|
/**
|
* 调用中台接口查询数据
|
*
|
* @param params
|
* @param url
|
* @return
|
*/
|
private JSONArray getZtData(String params, String url) {
|
//设置请求头
|
HttpHeaders headers = new HttpHeaders();
|
headers.add(ZtConstant.header_key, ZtConstant.header_value);
|
//封装请求头
|
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
|
try {
|
//有请求头,有参数请求
|
ResponseEntity<String> responseEntity =
|
restTemplate.exchange(url + params,
|
HttpMethod.GET,
|
formEntity,
|
String.class);
|
JSONObject jsonObject = JSON.parseObject(responseEntity.getBody());
|
JSONArray jsonArray = JSONArray.parseArray(jsonObject.get("data").toString());
|
// 返回
|
return jsonArray;
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
}
|