| | |
| | | package cn.gistack.alerts.notice.service.impl; |
| | | |
| | | 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.service.AlarmRecordService; |
| | | 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.SmsTemplate; |
| | | import cn.gistack.alerts.sms.service.ISmsTemplateService; |
| | | import cn.gistack.alerts.sms.vo.SmsRequestTemplate; |
| | | import cn.gistack.alerts.sse.server.SSEServer; |
| | | import cn.gistack.common.utils.SpringContextUtil; |
| | | import cn.gistack.sm.message.entity.MessageRecord; |
| | | import cn.gistack.sm.message.feign.IMessageClient; |
| | | import cn.gistack.sm.sjztmd.feign.IAttResManagePersonClient; |
| | | import cn.gistack.sm.sjztmd.vo.PersonVO; |
| | | import cn.gistack.system.feign.ISysClient; |
| | | import cn.gistack.system.user.entity.User; |
| | | import cn.gistack.system.user.feign.IUserClient; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.nacos.shaded.com.google.gson.JsonObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import org.jetbrains.annotations.NotNull; |
| | | import org.springblade.core.secure.utils.AuthUtil; |
| | | import org.springblade.core.tool.api.R; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.HttpEntity; |
| | | import org.springframework.http.HttpHeaders; |
| | |
| | | import org.springframework.util.MultiValueMap; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | @Component |
| | | public class NoticeHandle { |
| | |
| | | @Autowired |
| | | private RestTemplate restTemplate; |
| | | |
| | | @Autowired |
| | | private IMessageClient messageClient; |
| | | |
| | | @Autowired |
| | | private IUserClient userClient; |
| | | |
| | | @Autowired |
| | | private IPushService pushService; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 短信发送数据组装 |
| | |
| | | * @param alarmRule |
| | | * @param columnsList 列名集合信息 |
| | | * @param flag 是否包含日期 |
| | | * @param adCode 行政区编号 |
| | | * @param adCode 行政区编号(是否过滤区县数据) |
| | | * @param uuid 本次执行临时编号 |
| | | * @return |
| | | */ |
| | | public SmsRequestTemplate getSendSmsTemplate(JSONArray jsonArray, |
| | |
| | | AlarmRule alarmRule, |
| | | List<String> columnsList, |
| | | Boolean flag, |
| | | String adCode) { |
| | | String adCode, |
| | | String uuid) { |
| | | // 通过模板id 查询模板相关信息 |
| | | SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id",templateId).eq("is_deleted",0)); |
| | | if (null != smsTemplate) { |
| | | SmsRequestTemplate smsRequestTemplate = new SmsRequestTemplate(); |
| | | smsRequestTemplate.setAlarmRule(alarmRule); |
| | | // 设置模板信息 |
| | | smsRequestTemplate.setSmsTemplate(smsTemplate); |
| | | // 解析模板并设置 title |
| | | smsRequestTemplate.setTitle(FormatUtil.composeMessage(smsTemplate.getContent())); |
| | | // 列名数据转换 |
| | | getColumnData(jsonArray, columnsList,smsRequestTemplate,alarmRule,flag,adCode); |
| | | getColumnData(jsonArray, columnsList,smsRequestTemplate,alarmRule,flag,adCode,uuid); |
| | | //返回 |
| | | return smsRequestTemplate; |
| | | } |
| | |
| | | * @param smsRequestTemplate |
| | | * @param flag |
| | | * @param adCode |
| | | * @param uuid |
| | | * @return |
| | | */ |
| | | private void getColumnData(JSONArray jsonArray, |
| | |
| | | SmsRequestTemplate smsRequestTemplate, |
| | | AlarmRule alarmRule, |
| | | Boolean flag, |
| | | String adCode) { |
| | | String adCode, |
| | | String uuid) { |
| | | List<PersonVO> personLists = new ArrayList<>(); |
| | | List<List<String>> lists = new ArrayList<>(); |
| | | Set<String> set = new HashSet<>(); |
| | | 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 (county_cd.equals(adCode)) { |
| | | jointData(jsonArray, columnsList, alarmRule, flag, personLists, lists, i); |
| | | if (null!= county_cd && county_cd.equals(adCode)) { |
| | | jointData(jsonArray, columnsList, alarmRule, flag, personLists, lists, i,uuid,set); |
| | | } |
| | | }else { |
| | | jointData(jsonArray, columnsList, alarmRule, flag, personLists, lists, i); |
| | | jointData(jsonArray, columnsList, alarmRule, flag, personLists, lists, i,uuid,set); |
| | | } |
| | | } |
| | | // 设置信息 |
| | |
| | | * @param i |
| | | * @return |
| | | */ |
| | | private void jointData(JSONArray jsonArray, List<String> columnsList, AlarmRule alarmRule, Boolean flag, List<PersonVO> personLists, List<List<String>> lists, int i) { |
| | | private void jointData(JSONArray jsonArray, |
| | | List<String> columnsList, |
| | | AlarmRule alarmRule, |
| | | Boolean flag, |
| | | List<PersonVO> personLists, |
| | | List<List<String>> lists, |
| | | int i, |
| | | String uuid, |
| | | Set<String> set) { |
| | | // 根据水库编号,所在区域查询需要发送的人员手机号及设置 |
| | | 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; |
| | | String tempStr = uuid + res_cd; |
| | | // 去重水库操作,如果有重复的水库则不操作 |
| | | if (!set.contains(tempStr)) { |
| | | set.add(tempStr); |
| | | // 取出测站编码 |
| | | String stcd = jsonArray.getJSONObject(i).getString("stcd"); |
| | | // 判断时间是否存在 |
| | | 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; |
| | | } |
| | | // 获取告警人员信息 |
| | | getAlarmPersonList(jsonArray, columnsList, alarmRule, flag, personLists, lists, i, res_cd, day, hour, minute, stcd); |
| | | } |
| | | // 获取告警人员信息 |
| | | getAlarmPersonList(jsonArray, columnsList, alarmRule, flag, personLists, lists, i, res_cd, day, hour, minute); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param personLists |
| | | * @param lists |
| | | * @param i |
| | | * @param res_cd |
| | | * @param day |
| | | * @param hour |
| | | * @param minute |
| | | * @param res_cd 水库编码 |
| | | * @param day 日期 |
| | | * @param hour 小时 |
| | | * @param minute 分钟 |
| | | * @param stcd 测站编码 |
| | | */ |
| | | private void getAlarmPersonList(JSONArray jsonArray, |
| | | List<String> columnsList, |
| | |
| | | String res_cd, |
| | | String day, |
| | | String hour, |
| | | String minute) { |
| | | String minute, |
| | | String stcd) { |
| | | // 查询告警人员信息 |
| | | List<PersonVO> personVOList = getPersonListByResGuid(res_cd, alarmRule); |
| | | 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) { |
| | |
| | | String[] split = column.split(","); |
| | | String format = ""; |
| | | for (String s : split) { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | // 超汛限水位 |
| | | if (s.equals("over_z")) { |
| | | String is_danger_res = "is_danger_res"; |
| | | if (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")) { |
| | | format = format + "超过汛限水位" + jsonArray.getJSONObject(i).getString(s); |
| | | } else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | } |
| | | } else if (s.equals("rz")) { |
| | | // 水位 |
| | | String rz = "rz"; |
| | | if (null==jsonArray.getJSONObject(i).getString(rz)) { |
| | | format = format + "无数据"; |
| | | } else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s) + "米"; |
| | | } |
| | | } else if (s.equals("alarm_val")) { |
| | | // 小时雨量 |
| | | String alarm_type = "alarm_type"; |
| | | if (null!=jsonArray.getJSONObject(i).getString(alarm_type) && !jsonArray.getJSONObject(i).getString(alarm_type).equals("")) { |
| | | format = format + jsonArray.getJSONObject(i).getString(alarm_type) + "小时坝前点雨量" + jsonArray.getJSONObject(i).getString(s); |
| | | }else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | } |
| | | } else { |
| | | format = format + jsonArray.getJSONObject(i).getString(s); |
| | | } |
| | | } |
| | | list.add(format); |
| | | } |
| | |
| | | AlarmRecord alarmRecord = alarmRecordService.getOne(new QueryWrapper<AlarmRecord>() |
| | | .eq("temp_code",uuid) |
| | | .eq("alarm_rule_id",alarmRule.getId()) |
| | | .eq("reservoir_number",list.get(0)) |
| | | .eq("reservoir_number",list.get(1)) |
| | | ); |
| | | if (null!=alarmRecord) { |
| | | // 删除测站编号 |
| | | list.remove(0); |
| | | return alarmRecord; |
| | | }else { |
| | | AlarmRecord alarm = new AlarmRecord(); |
| | | // 设置相关信息 |
| | | alarm.setAlarmRuleId(alarmRule.getId().toString()); |
| | | |
| | | alarm.setReservoirNumber(list.get(0)); |
| | | // 分别设置测站编号和水库编码 |
| | | alarm.setAlarmSurveyStationCode(list.get(0)); |
| | | alarm.setReservoirNumber(list.get(1)); |
| | | alarm.setAlarmCondition(alarmRule.getRuleRemark()); |
| | | alarm.setTempCode(uuid); |
| | | // 新增 |
| | | boolean save = alarmRecordService.save(alarm); |
| | | // 删除测站编号 |
| | | list.remove(0); |
| | | if (save) { |
| | | return alarm; |
| | | } |
| | |
| | | list.addAll(personVOList); |
| | | } |
| | | //2. 根据水库编号及责任人类型查询相关责任人信息 |
| | | List<PersonVO> personVOList1 = attResManagePersonClient.getPersonListByResGuid(res_cd,String.join(",",personList)); |
| | | // 合并人员数据 |
| | | list.addAll(personVOList1); |
| | | if (personList.size() > 0) { |
| | | List<PersonVO> personVOList1 = attResManagePersonClient.getPersonListByResGuid(res_cd, String.join(",", personList)); |
| | | // 合并人员数据 |
| | | list.addAll(personVOList1); |
| | | } |
| | | // 返回数据 |
| | | return list; |
| | | } |
| | |
| | | */ |
| | | public void addPatrolTechnologyInfo(List<String> list) { |
| | | // 查询巡查责任人姓名,技术责任人姓名信息 |
| | | List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(0),"4,5"); |
| | | List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(1),"4,5"); |
| | | if (personVOList.size()>0) { |
| | | String xczrr = ""; |
| | | String jszrr = ""; |
| | | String xczrr = "-"; |
| | | String jszrr = "-"; |
| | | for (PersonVO personVO : personVOList) { |
| | | if (personVO.getType().equals("5")) { |
| | | xczrr = personVO.getName(); |
| | |
| | | list.add(jszrr); |
| | | }else { |
| | | // 巡查责任人姓名 |
| | | list.add(""); |
| | | list.add("-"); |
| | | // 技术责任人姓名 |
| | | list.add(""); |
| | | list.add("-"); |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | public void addCityCountyBusinessPersonInfo(List<String> list) { |
| | | // 根据水库编号查询市县水利部人员姓名及联系方式 |
| | | List<PersonVO> personVOList = attResManagePersonClient.getCityCountyPersonListByResGuid(list.get(0)); |
| | | List<PersonVO> personVOList = attResManagePersonClient.getCityCountyPersonListByResGuid(list.get(1)); |
| | | if (personVOList.size()>0){ |
| | | // 如果没有找到人员? |
| | | StringBuilder builder = new StringBuilder(); |
| | | for (PersonVO personVO : personVOList) { |
| | | builder.append(personVO.getName()).append(":").append(personVO.getPhone()).append(","); |
| | | builder.append(personVO.getName()).append(":").append(personVO.getPhone()).append(";"); |
| | | } |
| | | // 拼接水利部人员信息 |
| | | list.add(builder.substring(0,builder.length()-1)); |
| | | }else { |
| | | list.add(""); |
| | | list.add("-"); |
| | | } |
| | | } |
| | | |
| | |
| | | public void addWaterMoreDesignPatrolTechnologyInfo(List<String> list,String personTypes) { |
| | | String[] split = personTypes.split(","); |
| | | // 查询巡查责任人姓名,技术责任人姓名信息 |
| | | List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(0),personTypes); |
| | | List<PersonVO> personVOList = attResManagePersonClient.getPersonListByResGuid(list.get(1),personTypes); |
| | | if (personVOList.size()>0) { |
| | | String xzzrr = " "; |
| | | String zgzrr = " "; |
| | | String jszrr = " "; |
| | | String xczrr = " "; |
| | | String xzzrr = "-"; |
| | | String zgzrr = "-"; |
| | | String jszrr = "-"; |
| | | String xczrr = "-"; |
| | | for (PersonVO personVO : personVOList) { |
| | | String str = null!=personVO.getPhone() ? ":"+personVO.getPhone():""; |
| | | String str = null!=personVO.getPhone() ? ":"+personVO.getPhone():"-"; |
| | | if (personVO.getType().equals(split[0])) { |
| | | xzzrr = personVO.getName() + str; |
| | | } |
| | |
| | | list.add(xczrr); |
| | | }else { |
| | | for (String type : split) { |
| | | list.add(""); |
| | | list.add("-"); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 保存站内信记录信息 |
| | | * @param smsRequestTemplate |
| | | * @param alarmRule |
| | | * @return |
| | | */ |
| | | public Map<String, Object> saveInStationInfo(SmsRequestTemplate smsRequestTemplate, AlarmRule alarmRule) { |
| | | // 取出数据 |
| | | SMSSendRequest request = new SMSSendRequest(); |
| | | SmsTemplate smsTemplate = smsRequestTemplate.getSmsTemplate(); |
| | | request.setTemplateId(smsTemplate.getTemplateId()); |
| | | List<List<String>> templateContent = smsRequestTemplate.getTemplateContent(); |
| | | // 先保存结果记录 |
| | | List<AlarmRecordDetail> alarmRecordDetailList = new ArrayList<>(); |
| | | List<MessageRecord> messageRecordList = new ArrayList<>(); |
| | | Set<String> phoneSet = new HashSet<>(); |
| | | // 遍历处理 |
| | | for (List<String> list : templateContent) { |
| | | // 设置站内信记录信息 |
| | | MessageRecord messageRecord = new MessageRecord(); |
| | | messageRecord.setTheme(alarmRule.getRuleName()); |
| | | messageRecord.setSender(AuthUtil.getUserId().toString()); |
| | | messageRecord.setSource("智能告警"); |
| | | messageRecord.setStatus(0); |
| | | |
| | | // 设置告警记录信息 |
| | | AlarmRecordDetail alarmRecordDetail = new AlarmRecordDetail(); |
| | | alarmRecordDetail.setReservoirNumber(list.get(0)); |
| | | alarmRecordDetail.setAlarmRecordId(Long.parseLong(list.get(list.size() - 1))); |
| | | alarmRecordDetail.setAlarmMode("站内信"); |
| | | // 未读 |
| | | alarmRecordDetail.setStatus(1); |
| | | // 删除 最后一个 告警记录id |
| | | list.remove(list.size() - 1); |
| | | // 删除 0 水库编码 |
| | | list.remove(0); |
| | | |
| | | alarmRecordDetail.setPhone(list.get(0)); |
| | | // 设置手机号 |
| | | request.setUserNumber(list.get(0)); |
| | | messageRecord.setRecipient(list.get(0)); |
| | | phoneSet.add(list.get(0)); |
| | | // 内容处理 |
| | | String s = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s"); |
| | | // 需要删除最前面的手机号 |
| | | list.remove(0); |
| | | // 格式转换 |
| | | String format = String.format(s, list.toArray()); |
| | | // 设置内容 |
| | | request.setMessageContent(format); |
| | | messageRecord.setContent(format); |
| | | // 保存记录 |
| | | alarmRecordDetail.setAlarmContent(format); |
| | | alarmRecordDetail.setCreateTime(new Date()); |
| | | // 放入集合 |
| | | alarmRecordDetailList.add(alarmRecordDetail); |
| | | messageRecordList.add(messageRecord); |
| | | } |
| | | // 保存告警记录详情信息 |
| | | if (smsRequestTemplate.getIsSendStation()) { |
| | | saveMessageRecord(messageRecordList); |
| | | } |
| | | Map<String, Object> map = new HashMap<>(2); |
| | | // 返回 |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 保存站内信记录信息 |
| | | * @param messageRecordList |
| | | */ |
| | | public void saveMessageRecord(List<MessageRecord> messageRecordList) { |
| | | // 遍历,查询对应的用户id |
| | | for (MessageRecord messageRecord : messageRecordList) { |
| | | // 通过手机号获取用户id信息 |
| | | R<List<User>> listR = userClient.userInfoByPhone("000000", messageRecord.getRecipient()); |
| | | messageRecord.setRecipient(listR.getData().get(0).getId().toString()); |
| | | } |
| | | //给app推送消息 |
| | | pushService.pushMessageList(messageRecordList); |
| | | |
| | | // 保存记录 |
| | | messageClient.saveMessageRecord(messageRecordList); |
| | | // 发起通知 |
| | | // 遍历 |
| | | for (MessageRecord messageRecord : messageRecordList) { |
| | | Map<String, Object> map = new HashMap<>(2); |
| | | // 查询当前用户未读消息个数 |
| | | map.put("count",messageClient.getNotReadNumber(messageRecord.getRecipient())); |
| | | map.put("record",messageRecord); |
| | | SSEServer.sendMessage("web:"+messageRecord.getRecipient(),new JSONObject(map).toJSONString()); |
| | | } |
| | | } |
| | | } |