From c0cc0778ae520c614e2adde9eb48d3f56529edc8 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 10 Apr 2024 16:37:06 +0800
Subject: [PATCH] 变形告警,渗流告警

---
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java |  263 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 259 insertions(+), 4 deletions(-)

diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java
index fb854ab..b1f30aa 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/notice/service/impl/NoticeHandle.java
@@ -1,20 +1,26 @@
 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;
@@ -29,8 +35,12 @@
 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;
@@ -45,8 +55,10 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Component
+@Slf4j
 public class NoticeHandle {
 
 
@@ -145,20 +157,141 @@
 		// 告警内容
 		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;
+
 	}
 
 	/**
@@ -189,6 +322,9 @@
 			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 = "";
@@ -282,9 +418,9 @@
 			// 超汛限水位
 			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);
@@ -318,6 +454,20 @@
 						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 {
@@ -514,6 +664,9 @@
 		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);
@@ -602,6 +755,108 @@
 		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

--
Gitblit v1.9.3