| | |
| | | package cn.gistack.alerts.notice.service.impl; |
| | | |
| | | import cn.com.flaginfo.sdk.cmc.api.result.ComResult; |
| | | import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendDataResult; |
| | | import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest; |
| | | import cn.gistack.alerts.alarmRule.entity.AlarmRecord; |
| | | import cn.gistack.alerts.alarmRule.entity.AlarmRecordDetail; |
| | | import cn.gistack.alerts.alarmRule.entity.AlarmRule; |
| | | import cn.gistack.alerts.alarmRule.entity.AlarmRuleDetail; |
| | | import cn.gistack.alerts.alarmRule.service.AlarmRecordService; |
| | | import cn.gistack.alerts.alarmRule.vo.AlarmRecordDetailVO; |
| | | import cn.gistack.alerts.notice.constant.ZnwhColumnConstant; |
| | | import cn.gistack.alerts.notice.constant.ZtApiUrlConstant; |
| | | import cn.gistack.alerts.notice.constant.ZtConfigConstant; |
| | | import cn.gistack.alerts.notice.enums.PersonEnum; |
| | | import cn.gistack.alerts.notice.util.FormatUtil; |
| | | import cn.gistack.alerts.push.service.IPushService; |
| | | import cn.gistack.alerts.sms.entity.SmsRecord; |
| | | import cn.gistack.alerts.sms.entity.SmsResult; |
| | | import cn.gistack.alerts.sms.entity.SmsTemplate; |
| | | import cn.gistack.alerts.sms.service.ISmsTemplateService; |
| | | import cn.gistack.alerts.sms.vo.SmsRequestTemplate; |
| | | import cn.gistack.alerts.sms.vo.Temp; |
| | | import cn.gistack.alerts.sse.server.SSEServer; |
| | | import cn.gistack.common.utils.SpringContextUtil; |
| | | import cn.gistack.sm.intelligentCall.feign.OutCallClient; |
| | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.google.common.collect.Lists; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springblade.core.secure.utils.AuthUtil; |
| | | import org.springblade.core.tool.api.R; |
| | | import org.springblade.core.tool.utils.DateUtil; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.HttpEntity; |
| | | import org.springframework.http.HttpHeaders; |
| | |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Component |
| | | @Slf4j |
| | | public class NoticeHandle { |
| | | |
| | | |
| | |
| | | // 告警内容 |
| | | List<List<String>> lists = new ArrayList<>(); |
| | | Set<String> set = new HashSet<>(); |
| | | |
| | | // 查询对应的角色信息 |
| | | List<String> roles = sysClient.getRoleNames(alarmRuleDetail.getAlarmPerson()).getData(); |
| | | |
| | | for (int i = 0; i < jsonArray.size(); i++) { |
| | | if (null!=adCode){ |
| | | // city_cd,county_cd 过滤数据 |
| | | String county_cd = jsonArray.getJSONObject(i).getString("county_cd"); |
| | | if (null!= county_cd && county_cd.equals(adCode)) { |
| | | jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set); |
| | | // jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set); |
| | | jointDataV2(jsonArray, columnsList, alarmRuleDetail,roles ,flag, personLists, lists, i,uuid,set); |
| | | } |
| | | }else { |
| | | jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set); |
| | | // jointData(jsonArray, columnsList, alarmRuleDetail, flag, personLists, lists, i,uuid,set); |
| | | jointDataV2(jsonArray, columnsList, alarmRuleDetail,roles, flag, personLists, lists, i,uuid,set); |
| | | } |
| | | log.info("告警人员信息:{}",personLists.toString()); |
| | | } |
| | | // 设置信息 |
| | | smsRequestTemplate.setPersonVOList(personLists); |
| | | smsRequestTemplate.setTemplateContent(lists); |
| | | } |
| | | |
| | | private void jointDataV2(JSONArray jsonArray, List<String> columnsList, AlarmRuleDetail alarmRuleDetail, List<String> roles, Boolean flag, List<PersonVO> personLists, List<List<String>> lists, int i, String uuid, Set<String> set) { |
| | | // 根据水库编号,所在区域查询需要发送的人员手机号及设置 |
| | | JSONObject jsonObject = jsonArray.getJSONObject(i); |
| | | String res_cd = jsonObject.getString("res_cd"); |
| | | String res_nm = jsonObject.getString("res_nm"); |
| | | String town_nm = jsonObject.getString("town_nm"); |
| | | String county_nm = jsonObject.getString("county_nm"); |
| | | String city_nm = jsonObject.getString("city_nm"); |
| | | log.info("当前为第{}个水库,行政区划:{}-{}-{},水库编码:{},水库名称:{}",i+1,city_nm,county_nm,town_nm,res_cd,res_nm); |
| | | String tempStr = uuid + res_cd; |
| | | // 去重水库操作,如果有重复的水库则不操作 |
| | | if (!set.contains(tempStr)) { |
| | | set.add(tempStr); |
| | | // 取出测站编码 |
| | | String stcd = jsonArray.getJSONObject(i).getString("stcd"); |
| | | if (StringUtil.isBlank(stcd)) { |
| | | stcd = jsonArray.getJSONObject(i).getString("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 if(flag){ |
| | | //如果显示日期,但是中台没传日期,就使用当前时间 |
| | | Date now = DateUtil.now(); |
| | | String formatTm = DateUtil.format(now, DateUtil.PATTERN_DATETIME); |
| | | // 加入天,时,分 |
| | | day = formatTm.substring(8, 10); |
| | | hour = formatTm.substring(11, 13); |
| | | minute = formatTm.substring(14, 16); |
| | | }else{ |
| | | flag = false; |
| | | } |
| | | // 获取告警人员信息 |
| | | // getAlarmPersonList(jsonArray, columnsList, alarmRuleDetail,flag, personLists, lists, i, res_cd, day, hour, minute, stcd); |
| | | getAlarmPersonListV2(jsonArray, columnsList, alarmRuleDetail,roles,flag, personLists, lists, i, res_cd, day, hour, minute, stcd); |
| | | } |
| | | |
| | | } |
| | | |
| | | private void getAlarmPersonListV2(JSONArray jsonArray, List<String> columnsList, AlarmRuleDetail alarmRuleDetail, List<String> roles, Boolean flag, List<PersonVO> personLists, List<List<String>> lists, int i, String res_cd, String day, String hour, String minute, String stcd) { |
| | | // 查询告警人员信息 |
| | | // List<PersonVO> personVOList = getPersonListByResGuid(res_cd, alarmRuleDetail.getAlarmPerson()); |
| | | List<PersonVO> personVOList = getPersonListByResGuidV2(res_cd, roles); |
| | | if (personVOList.size() > 0) { |
| | | for (PersonVO personVO : personVOList) { |
| | | List<String> list = new ArrayList<>(); |
| | | list.add(stcd); |
| | | list.add(res_cd); |
| | | list.add(personVO.getPhone()); |
| | | if (flag) { |
| | | // 如果是电话告警,需要把日期拼到一起 |
| | | if (alarmRuleDetail.getAlarmMode().equals("电话")){ |
| | | String tem = day + "日" + hour + "时" + minute + "分"; |
| | | list.add(tem); |
| | | }else { |
| | | list.add(day); |
| | | list.add(hour); |
| | | list.add(minute); |
| | | } |
| | | } |
| | | // 变量将值放入集合中 |
| | | for (String column : columnsList) { |
| | | String[] split = column.split(","); |
| | | String format = ""; |
| | | // 内容处理 |
| | | format = addAlarmContent(jsonArray, i, split, format); |
| | | // 加入集合 |
| | | list.add(format); |
| | | } |
| | | lists.add(list); |
| | | } |
| | | } |
| | | personLists.addAll(personVOList); |
| | | |
| | | } |
| | | |
| | | private List<PersonVO> getPersonListByResGuidV2(String res_cd, List<String> roles) { |
| | | List<String> personList = new ArrayList<>(); |
| | | List<String> areaList = new ArrayList<>(); |
| | | // 遍历 |
| | | for (String role : roles) { |
| | | 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,String.join(",",areaList)); |
| | | list.addAll(personVOList); |
| | | } |
| | | //2. 根据水库编号及责任人类型查询相关责任人信息 |
| | | if (personList.size() > 0) { |
| | | List<PersonVO> personVOList1 = attResManagePersonClient.getPersonListByResGuid(res_cd, String.join(",", personList)); |
| | | // 合并人员数据 |
| | | list.addAll(personVOList1); |
| | | } |
| | | // 返回数据 |
| | | return list; |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | set.add(tempStr); |
| | | // 取出测站编码 |
| | | String stcd = jsonArray.getJSONObject(i).getString("stcd"); |
| | | if (StringUtil.isBlank(stcd)) { |
| | | stcd = jsonArray.getJSONObject(i).getString("cd"); |
| | | } |
| | | // 判断时间是否存在 |
| | | String tm = jsonArray.getJSONObject(i).getString("tm"); |
| | | String day = ""; |
| | |
| | | // 超汛限水位 |
| | | if (s.equals("over_z")) { |
| | | String is_danger_res = "is_danger_res"; |
| | | if (jsonArray.getJSONObject(i).getString(is_danger_res).equals("true")) { |
| | | if (null!= jsonArray.getJSONObject(i).getString(is_danger_res) && jsonArray.getJSONObject(i).getString(is_danger_res).equals("true")) { |
| | | format = format + "控制运用水位" + jsonArray.getJSONObject(i).getString(s); |
| | | } else if (jsonArray.getJSONObject(i).getString(is_danger_res).equals("false")) { |
| | | } else if (null!= jsonArray.getJSONObject(i).getString(is_danger_res) && jsonArray.getJSONObject(i).getString(is_danger_res).equals("false")) { |
| | | format = format + "汛限水位" + jsonArray.getJSONObject(i).getString(s); |
| | | } else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | |
| | | format = format + "已漫过坝顶" + (-parseDouble); |
| | | } |
| | | }else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | } |
| | | } else if (s.equals("ms_flag")) { |
| | | // 水位 |
| | | String ms_flag = "ms_flag"; |
| | | if (null!= jsonArray.getJSONObject(i).getString(ms_flag) && jsonArray.getJSONObject(i).getString(ms_flag).equals("sy")) { |
| | | format = format + "渗压"; |
| | | } else if (null!= jsonArray.getJSONObject(i).getString(ms_flag) && jsonArray.getJSONObject(i).getString(ms_flag).equals("sl")) { |
| | | format = format + "渗流" ; |
| | | } else if (null!= jsonArray.getJSONObject(i).getString(ms_flag) && jsonArray.getJSONObject(i).getString(ms_flag).equals("by")) { |
| | | format = format + "白蚁" ; |
| | | } else if (null!= jsonArray.getJSONObject(i).getString(ms_flag) && jsonArray.getJSONObject(i).getString(ms_flag).equals("bx")) { |
| | | format = format + "变形" ; |
| | | } else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | } |
| | | } else { |
| | |
| | | if (activeProfile.equals("prod")){ |
| | | url = ZtApiUrlConstant.url_prefix_prod + url; |
| | | } |
| | | if (activeProfile.equals("test")){ |
| | | url = ZtApiUrlConstant.url_prefix_test + url; |
| | | } |
| | | //设置请求头 |
| | | HttpHeaders headers = new HttpHeaders(); |
| | | headers.add(ZtConfigConstant.header_key, ZtConfigConstant.header_value); |
| | |
| | | return map; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 保存站内信记录(水库合并) |
| | | * @param smsRequestTemplate |
| | | * @param alarmRule |
| | | * @return |
| | | */ |
| | | public Map<String, Object> saveInStationInfoMerge(SmsRequestTemplate smsRequestTemplate, AlarmRule alarmRule) { |
| | | // 取出数据 |
| | | SMSSendRequest request = new SMSSendRequest(); |
| | | SmsTemplate smsTemplate = smsRequestTemplate.getSmsTemplate(); |
| | | request.setTemplateId(smsTemplate.getTemplateId()); |
| | | List<List<String>> templateContent = smsRequestTemplate.getTemplateContent(); |
| | | |
| | | List<MessageRecord> messageRecordList = new ArrayList<>(); |
| | | List<Temp> tempList = new ArrayList<>(); |
| | | // 合并数据 |
| | | for (List<String> list : templateContent) { |
| | | Temp temp = new Temp(); |
| | | temp.setPhone(list.get(1)); |
| | | temp.setReservoirCode(list.get(0)); |
| | | temp.setReservoirName(list.get(3)); |
| | | temp.setAlarmRecordId(list.get(list.size()-1)); |
| | | // 放入临时集合 |
| | | tempList.add(temp); |
| | | } |
| | | |
| | | // 按手机号分组 |
| | | Map<String, List<Temp>> listMap = tempList.stream().collect(Collectors.groupingBy(Temp::getPhone)); |
| | | |
| | | |
| | | listMap.forEach((s, temps) -> { |
| | | StringBuilder builder = new StringBuilder(); |
| | | StringBuilder smsRecordBuilder = new StringBuilder(); |
| | | builder.append(s).append(","); |
| | | // 站内信其实不用分组,与短信发送结构保持一致, |
| | | List<List<Temp>> lists = Lists.partition(new ArrayList<>(temps), 7000); |
| | | for (List<Temp> list : lists) { |
| | | List<AlarmRecordDetailVO> alarmRecordDetailList = new ArrayList<>(); |
| | | // 设置站内信记录信息 |
| | | MessageRecord messageRecord = new MessageRecord(); |
| | | |
| | | // 遍历 |
| | | for (Temp temp : list) { |
| | | builder.append(temp.getReservoirName()).append(","); |
| | | smsRecordBuilder.append(temp.getReservoirName()).append(","); |
| | | AlarmRecordDetailVO alarmRecordDetail = new AlarmRecordDetailVO(); |
| | | alarmRecordDetail.setReservoirNumber(temp.getReservoirCode()); |
| | | alarmRecordDetail.setAlarmRecordId(Long.parseLong(temp.getAlarmRecordId())); |
| | | alarmRecordDetail.setAlarmMode("站内信"); |
| | | alarmRecordDetail.setPhone(temp.getPhone()); |
| | | alarmRecordDetail.setReservoirName(temp.getReservoirName()); |
| | | // 加入集合 |
| | | alarmRecordDetailList.add(alarmRecordDetail); |
| | | } |
| | | |
| | | |
| | | String row = builder.substring(0, builder.length() - 1); |
| | | // 组装数据 |
| | | String[] titleArr = smsRequestTemplate.getTitle().split(","); |
| | | String[][] dyns = new String[2][titleArr.length]; |
| | | dyns[0] = titleArr; |
| | | dyns[1] = row.split(","); |
| | | // 内容处理 |
| | | String str = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s"); |
| | | // 短信内容拼接(完成发送的结果信息) |
| | | String substring = smsRecordBuilder.substring(0, smsRecordBuilder.length() - 1); |
| | | // 格式转换 |
| | | String format = String.format(str, substring.split(",")); |
| | | |
| | | |
| | | messageRecord.setTheme(alarmRule.getRuleName()); |
| | | messageRecord.setSender(AuthUtil.getUserId().toString()); |
| | | messageRecord.setSource("智能告警"); |
| | | messageRecord.setStatus(0); |
| | | |
| | | // 删除 最后一个 告警记录id |
| | | list.remove(list.size() - 1); |
| | | // 删除 0 水库编码 |
| | | list.remove(0); |
| | | |
| | | // 设置手机号 |
| | | // messageRecord.setRecipient(list.get(0)); |
| | | messageRecord.setContent(format); |
| | | // 放入集合 |
| | | messageRecordList.add(messageRecord); |
| | | |
| | | } |
| | | }); |
| | | |
| | | // 保存告警记录详情信息 |
| | | if (smsRequestTemplate.getIsSendStation()) { |
| | | saveMessageRecord(messageRecordList); |
| | | } |
| | | Map<String, Object> map = new HashMap<>(2); |
| | | // 返回 |
| | | return map; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 保存站内信记录信息 |
| | | * @param messageRecordList |