| | |
| | | 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; |
| | |
| | | |
| | | @Autowired |
| | | BaseDao baseDao; |
| | | |
| | | @Autowired |
| | | private ApplicationContext applicationContext; |
| | | |
| | | @Autowired |
| | | FlowService flowService; |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | /** |
| | | * 单个预警 |
| | | * |
| | |
| | | while (s >= 0) { |
| | | int c = warnContent.indexOf("{#", s); |
| | | if (c == -1) { |
| | | concatField.append(", uuid "); |
| | | break; |
| | | } |
| | | int m = warnContent.indexOf("#}", c); |