杜洪波
2024-11-13 5b48f8c427c78340680a6c3860c67ad18c4f627b
src/main/java/com/product/administration/service/EarlyWarningServer.java
@@ -1,18 +1,18 @@
package com.product.administration.service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.cron.CronUtil;
import com.google.common.collect.Sets;
import com.product.administration.config.SystemCode;
import com.product.common.collect.SetUtils;
import com.product.quartz.util.CronUtils;
import com.product.util.SystemParamReplace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import com.product.administration.config.CmnConst;
@@ -34,6 +34,9 @@
   @Autowired
   BaseDao baseDao;
   @Autowired
   private ApplicationContext applicationContext;
   @Autowired
   FlowService flowService;
@@ -78,7 +81,173 @@
         SpringMVCContextHolder.getSystemLogger().error(e);
      }
   }
   public static void main(String[] args) {
      String content = "设备 奥的斯 ADS-00001 ,参数 电压 达到 【参数值】 ,形成 二级 故障 ";
      String replacedContent = content.replace("【参数值】", "2.23");
      System.out.println(replacedContent);
   }
   /**
    * 特殊预警
    * 预警数据来源于其它业务(bean调用该方法),验证条件来源于其它业务(bean调用)
    * 数据替换依然来源于配置表
    *
    * @param configUuid
    * @param dtService 预警的业务数据,关联设备数据
    */
   public void warningCreate(String configUuid, DataTableEntity dtServiceData, Map<String, String> mapFields) {
      FieldSetEntity fseWarningConfig = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_EARLY_WARNING, configUuid, false);
      if (!"1".equals(fseWarningConfig.getString(CmnConst.CONFIG_STATUS))) {
         throw new BaseException(SystemCode.WARN_NO_NORMAL_STATUS_RECORD);
      }
      String mainTableName = fseWarningConfig.getString(CmnConst.SOURCE_TABLE);              //主表名
      String warnContent = fseWarningConfig.getString(CmnConst.WARNING_CONTENT_HIDE);        //提醒内容
      String warnMethod = fseWarningConfig.getString(CmnConst.WARNING_METHOD);               //预警方式
      String serviceReceiver = fseWarningConfig.getString(CmnConst.BUSINESS_RELATED_PERSON); //业务相关人员(表名.字段名)
      String fixedReceiver = fseWarningConfig.getString(CmnConst.FIXED_RECEIVER);            //固定接收人
      Map<String, String> tableNameAndAlias = new HashMap<>();//相关表名-->表别名,tableName-->tableName1
      Map<String, String> fieldAndAlias = new HashMap<>();    //相关字段-->字段别名,tableName.fieldName-->tableName1fieldName
      Map<String, String> fieldReference = new HashMap<>();   //组合相关字段的参照,tableName1fieldName-->referenceName
      StringBuilder concatField = new StringBuilder();        //组合相关字段,tableName1.fieldName tableName1fieldName
      //解析业务相关人员
      if (!StringUtils.isEmpty(serviceReceiver)) {
         parseWarningContent(serviceReceiver, concatField, tableNameAndAlias, fieldAndAlias, fieldReference);
      }
      //解析预警内容
      if (!StringUtils.isEmpty(warnContent)) {
         parseWarningContent(warnContent, concatField, tableNameAndAlias, fieldAndAlias, fieldReference);
      }
      DataTableEntity dtParmFault = null;
      String beanAndMehtod = fseWarningConfig.getString("bean");
      //-----反射调bean,要改
      Object bean = applicationContext.getBean(beanAndMehtod.split("\\.")[0]);
      try {
         Method method = bean.getClass().getMethod(beanAndMehtod.split("\\.")[1], DataTableEntity.class, Map.class);
         dtParmFault = (DataTableEntity)method.invoke(bean, dtServiceData, mapFields);
      } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
         e.printStackTrace();
      } catch (NoSuchMethodException e) {
         e.printStackTrace();
      } catch (SecurityException e) {
         e.printStackTrace();
      }
      if (!BaseUtil.dataTableIsEmpty(dtParmFault)) {
         Map<String, String> mapUserWarnMessage = new HashMap<>();
         for (int j = 0; j < dtParmFault.getRows(); j++) {
            FieldSetEntity fseParamFault = dtParmFault.getFieldSetEntity(j);
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT ").append(concatField.subSequence(1, concatField.length())).append(" \n");
            sql.append("FROM ").append(mainTableName).append(" " + tableNameAndAlias.get(mainTableName)).append(" \n");
            sql.append("WHERE ").append("device_number = ? AND param_config_uuid = ? AND uuid = ?");
            // 获取视图数据
            FieldSetEntity fseService = baseDao.getFieldSetEntityBySQL(sql.toString(),
                  new Object[] {fseParamFault.getString(mapFields.get("device_code_field")), fseParamFault.getString(mapFields.get("param_type_field")), fseParamFault.getString("fault_grade_uuid")}, false);
            //信息接收人
            Set<String> receiverSet = Sets.newTreeSet();
            //装载业务接收人
            String tempStr;
            if (!StringUtils.isEmpty(serviceReceiver)) {
               String[] splitReceiver = serviceReceiver.replace("{#", "").replace("#}", "").split(",");
               for (int k = 0; k < splitReceiver.length; k++) {
                  tempStr = fseService.getString(fieldAndAlias.get(splitReceiver[k]));
                  if (!StringUtils.isEmpty(tempStr)) {
                     for (String singlePerson : tempStr.split(",")) {
                        receiverSet.add(singlePerson);
                     }
                  }
               }
            }
            // 若是勾选了直属领导,那么一并添加上 6c 2022年3月22日 09:25:43
            if ("1".equals(fseWarningConfig.getString(CmnConst.DIRECT_LEADER_FLAG)) && !receiverSet.isEmpty()) {
               StringBuilder directLeaderSql = new StringBuilder(256);
               directLeaderSql.append("\nselect l.user_id,l.show_name,l.direct_leader_code,l.tricode");
               directLeaderSql.append("\nfrom product_sys_staffs l");
               directLeaderSql.append("\ninner join (");
               directLeaderSql.append("\n    select user_id,show_name,direct_leader_code,tricode");
               directLeaderSql.append("\n    from product_sys_staffs");
               directLeaderSql.append("\n    where ").append(BaseUtil.buildQuestionMarkFilter("user_id", receiverSet.size(), true));
               directLeaderSql.append("\n) p on l.tricode=p.direct_leader_code");
               DataTableEntity directLeaderDte = baseDao.listTable(directLeaderSql.toString(), receiverSet.toArray());
               FieldSetEntity directLeaderFse;
               for (int k = 0; k < directLeaderDte.getRows(); k++) {
                  directLeaderFse = directLeaderDte.getFieldSetEntity(k);
                  receiverSet.add(directLeaderFse.getString(CmnConst.USER_ID));
               }
            }
            //装载固定接收人
            if (!StringUtils.isEmpty(fixedReceiver)) {
               String[] splitReceiver = fixedReceiver.split(",");
               for (int k = 0; k < splitReceiver.length; k++) {
                  FieldSetEntity fseStaff = baseDao.getFieldSetEntityByFilter("product_sys_users", "user_id=?", new Object[]{splitReceiver[k]}, false);
                  receiverSet.add(fseStaff.getString(CmnConst.USER_ID));
               }
            }
            //暂时替换提醒内容
            warnContent = SystemParamReplace.replaceParams(warnContent, fseService);
            String content = getContentByTableSource(fseService, warnContent, fieldReference);
            content = content.replace("【参数值】", fseParamFault.getString(fseParamFault.getString("collect_value_field")));
            System.out.println(content);
            System.out.println(fseParamFault.getString(fseParamFault.getString("collect_value_field")));
            System.out.println(content.replace("【参数值】", fseParamFault.getString(fseParamFault.getString("collect_value_field"))));
            //遍历发送人,及发送内容
            Iterator<String> iterator = receiverSet.iterator();
             while (iterator.hasNext()) {
                String fruit = iterator.next();
                if (mapUserWarnMessage.containsKey(fruit)) {
                   String allContent = mapUserWarnMessage.get(fruit);
                   allContent += "\n"+ content;
                   mapUserWarnMessage.put(fruit, allContent);
               } else {
                  mapUserWarnMessage.put(fruit, content);
               }
             }
         }
         if (!mapUserWarnMessage.isEmpty()) {
            for (Map.Entry<String, String> entry : mapUserWarnMessage.entrySet()) {
               String allReceiver = entry.getKey();
               String content = entry.getValue();
               //自动生成预警日志信息
               FieldSetEntity fseWarnLog = new FieldSetEntity(CmnConst.PRODUCT_SYS_EARLY_WARNING_INFO);
               fseWarnLog.setValue(CmnConst.EARLY_WARNING_DATETIME, new Date());
               fseWarnLog.setValue(CmnConst.EARLY_WARNING_UUID, configUuid);
//               fse.setValue(CmnConst.DATA_UUID, serviceId);
               fseWarnLog.setValue(CmnConst.WARNING_CONTENT, content);
               fseWarnLog.setValue(CmnConst.RECEIVER, allReceiver);
               fseWarnLog.setValue(CmnConst.WARNING_METHOD, warnMethod);
               baseDao.add(fseWarnLog);
               //发送信息
               if (!StringUtils.isEmpty(warnMethod)) {
                  String[] send_method = warnMethod.split(",");
                  for (int k = 0; k < send_method.length; k++) {
                     if ("1".equals(send_method[k])) {    //系统消息
                        WebsocketMesssageServiceThread.getInstance().appendMessage(allReceiver, content, "预警消息", 1, "31", CmnConst.BUTTON_URL_WARN_MESSAGE_INFO + "?uuid=" + fseWarnLog.getUUID(), CmnConst.PRODUCT_SYS_EARLY_WARNING_INFO, fseWarnLog.getUUID(), 1, 0, 0);
                     } else if ("2".equals(send_method[k])) {    //电子邮件
                        parseMail(content, allReceiver);
                     } else if ("3".equals(send_method[k])) {    //短信消息
                        parseSMS(content, allReceiver);
                     }
                  }
               }
            }
         }
      }
   }
   /**
    * 单个预警
    *
@@ -321,6 +490,7 @@
      while (s >= 0) {
         int c = warnContent.indexOf("{#", s);
         if (c == -1) {
            concatField.append(", uuid ");
            break;
         }
         int m = warnContent.indexOf("#}", c);