杜洪波
2024-11-15 1e48c6297625c22677634b9144383dd95ded511e
设备预警提醒频率
已修改1个文件
208 ■■■■ 文件已修改
src/main/java/com/product/administration/service/EarlyWarningServer.java 208 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/administration/service/EarlyWarningServer.java
@@ -82,16 +82,9 @@
        }
    }
    
    public static void main(String[] args) {
        String content = "设备 奥的斯 ADS-00001 ,参数 电压 达到 【参数值】 ,形成 二级 故障 ";
        String replacedContent = content.replace("【参数值】", "2.23");
        System.out.println(replacedContent);
    }
    /**
     * 特殊预警
     * 预警数据来源于其它业务(bean调用该方法),验证条件来源于其它业务(bean调用)
     * 预警数据来源于其它业务(对象方法调用),验证条件来源于其它业务(bean调用)
     * 数据替换依然来源于配置表
     *
     * @param configUuid
@@ -110,7 +103,20 @@
        String serviceReceiver = fseWarningConfig.getString(CmnConst.BUSINESS_RELATED_PERSON); //业务相关人员(表名.字段名)
        String fixedReceiver = fseWarningConfig.getString(CmnConst.FIXED_RECEIVER);            //固定接收人
        //获取发送消息频率
        Double cronExpression = fseWarningConfig.getDouble("reminder_frequency");
        //发送消息的频率 1.23 小数点前面代表天 小数点后面代表小时
        double seconds = 0;
        if (cronExpression != null && cronExpression > 0) {
            //将发送消息频率转换为小时
            double hours = cronExpression * 24;
            //将发送消息频率转换为分钟
            double minutes = hours * 60;
            //将发送消息频率转换为秒
            seconds = minutes * 60;
        }
        Map<String, String> tableNameAndAlias = new HashMap<>();//相关表名-->表别名,tableName-->tableName1
        Map<String, String> fieldAndAlias = new HashMap<>();    //相关字段-->字段别名,tableName.fieldName-->tableName1fieldName
@@ -127,7 +133,6 @@
        
        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);
@@ -140,17 +145,55 @@
            e.printStackTrace();
        }
        if (!BaseUtil.dataTableIsEmpty(dtParmFault)) {
            Map<String, String> mapUserWarnMessage = new HashMap<>();
            // 获取相关设备历史最新预警
            Object[] limitParam = dtParmFault.getFieldAllValues("unique_key");
            StringBuilder sqlWarnHistory = new StringBuilder();
            sqlWarnHistory.append("SELECT e.* \n");
            sqlWarnHistory.append("FROM product_sys_early_warning_info e \n");
            sqlWarnHistory.append("JOIN ( \n");
            sqlWarnHistory.append(" SELECT data_uuid, MAX(early_warning_datetime) AS latest_datetime \n");
            sqlWarnHistory.append(" FROM product_sys_early_warning_info ");
            sqlWarnHistory.append(" WHERE early_warning_uuid=? and (").append(BaseUtil.buildQuestionMarkFilter("data_uuid", limitParam, true)).append(") \n");
            sqlWarnHistory.append(" GROUP BY data_uuid \n");
            sqlWarnHistory.append(") AS latest ON e.data_uuid = latest.data_uuid AND e.early_warning_datetime = latest.latest_datetime");
            DataTableEntity dtLastWarn = baseDao.listTable(sqlWarnHistory.toString(), new Object[] {configUuid});
            Map<String, FieldSetEntity> mapLastWarn = new HashMap<>();
            if (!DataTableEntity.isEmpty(dtLastWarn)) {
                for (int j = 0; j < dtLastWarn.getRows(); j++) {
                    FieldSetEntity fse = dtLastWarn.getFieldSetEntity(j);
                    mapLastWarn.put(fse.getString("data_uuid"), fse);
                }
            }
            // 遍历预警数据
            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);
                String deviceUUID = fseParamFault.getString(mapFields.get("device_code_field"));
                String paramType = fseParamFault.getString(mapFields.get("param_type_field"));
                String faultGrade = fseParamFault.getString("fault_grade_uuid");
                // 业务uuid(该数据特指:设备,参数)
                String uniqueKey = fseParamFault.getString("unique_key");
                // 判断是否预警
                if (mapLastWarn.containsKey(uniqueKey) && !StringUtils.isEmpty(cronExpression)) {
                    //如果已经存在预警信息 根据cron表达式判断是否需要再次预警
                    Date lastWarnTime = mapLastWarn.get(uniqueKey).getDate("early_warning_datetime");
                    if (lastWarnTime != null) {
                        long time = new Date().getTime() - lastWarnTime.getTime();
                        if (time < seconds * 1000) {
                            continue;
                        }
                    }
                }
                // 获取视图数据
                StringBuilder sqlData = new StringBuilder();
                sqlData.append("SELECT ").append(concatField.subSequence(1, concatField.length())).append(" \n");
                sqlData.append("FROM ").append(mainTableName).append(" " + tableNameAndAlias.get(mainTableName)).append(" \n");
                sqlData.append("WHERE ").append("device_number = ? AND param_config_uuid = ? AND uuid = ?");
                FieldSetEntity fseService = baseDao.getFieldSetEntityBySQL(sqlData.toString(),
                        new Object[] {deviceUUID, paramType, faultGrade}, false);
                //信息接收人
                Set<String> receiverSet = Sets.newTreeSet();
@@ -171,13 +214,13 @@
                // 若是勾选了直属领导,那么一并添加上 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");
                    directLeaderSql.append("SELECT l.user_id,l.show_name,l.direct_leader_code,l.tricode \n");
                    directLeaderSql.append("FROM product_sys_staffs l \n");
                    directLeaderSql.append("INNER JOIN ( \n");
                    directLeaderSql.append(" SELECT user_id,show_name,direct_leader_code,tricode \n");
                    directLeaderSql.append(" FROM product_sys_staffs \n");
                    directLeaderSql.append(" 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++) {
@@ -198,54 +241,35 @@
                //暂时替换提醒内容
                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);
                            }
//                content = content.replace("【参数值】", fseParamFault.getString(fseParamFault.getString("target_value_field")));
                String allReceiver = SetUtils.set2String(receiverSet, ",");
                //自动生成预警日志信息
                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);
                fseWarnLog.setValue(CmnConst.DATA_UUID, uniqueKey);
//                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);
                        }
                    }
                }
            }
        }
    }
    /**
@@ -331,46 +355,36 @@
        //查询符合预警的数据
        DataTableEntity dtService = baseDao.listTable(serviceSQL.toString(), new Object[]{});
        if (!BaseUtil.dataTableIsEmpty(dtService)) {
            List<String> collect = dtService.getData().stream().map(item -> item.getString(mainTableAlias + "uuid")).collect(Collectors.toList());
            //预警uuid
            String warnUUID = fseWarningConfig.getUUID();
            //将预警uuid放到collect 的第一个
            collect.add(0, warnUUID);
            Object[] serviceCollect = dtService.getFieldAllValues(mainTableAlias + "uuid");
            StringBuilder sql = new StringBuilder();
            //查询是否已经存在预警如有相同data_uuid的数据查询出最近的一条根据预警时间字段 early_warning_datetime
//            SELECT e.*
//            FROM product_sys_early_warning_info e
//            JOIN (
//                    SELECT data_uuid, MAX(early_warning_datetime) AS latest_datetime
//                    FROM product_sys_early_warning_info
//                    GROUP BY data_uuid
//            ) AS latest
//            ON e.data_uuid = latest.data_uuid AND e.early_warning_datetime = latest.latest_datetime;
            sql.append("SELECT e.* FROM product_sys_early_warning_info e JOIN (");
            sql.append("SELECT data_uuid, MAX(early_warning_datetime) AS latest_datetime FROM product_sys_early_warning_info ");
            sql.append(" where early_warning_uuid=? and (").append(BaseUtil.buildQuestionMarkFilter("data_uuid", collect.size(), true)).append(") ");
            sql.append("GROUP BY data_uuid) AS latest ON e.data_uuid = latest.data_uuid AND e.early_warning_datetime = latest.latest_datetime");
            DataTableEntity dt = baseDao.listTable(sql.toString(), collect.toArray());
            sql.append("SELECT e.* \n");
            sql.append("FROM product_sys_early_warning_info e \n");
            sql.append("JOIN ( \n");
            sql.append(" SELECT data_uuid, MAX(early_warning_datetime) AS latest_datetime \n");
            sql.append(" FROM product_sys_early_warning_info \n");
            sql.append(" WHERE early_warning_uuid=? and (").append(BaseUtil.buildQuestionMarkFilter("data_uuid", serviceCollect, true)).append(") \n");
            sql.append(" GROUP BY data_uuid \n");
            sql.append(") AS latest ON e.data_uuid = latest.data_uuid AND e.early_warning_datetime = latest.latest_datetime");
            DataTableEntity dtLastWarn = baseDao.listTable(sql.toString(), new Object[] {fseWarningConfig.getUUID()});
            Map<String, FieldSetEntity> ff = new HashMap<>();
            if (!DataTableEntity.isEmpty(dt)) {
                for (int j = 0; j < dt.getRows(); j++) {
                    FieldSetEntity fse = dt.getFieldSetEntity(j);
                    ff.put(fse.getString("data_uuid"), fse);
            Map<String, FieldSetEntity> mapListWarn = new HashMap<>();
            if (!DataTableEntity.isEmpty(dtLastWarn)) {
                for (int j = 0; j < dtLastWarn.getRows(); j++) {
                    FieldSetEntity fse = dtLastWarn.getFieldSetEntity(j);
                    mapListWarn.put(fse.getString("data_uuid"), fse);
                }
            }
            //以data_uuid 进行分组
            for (int j = 0; j < dtService.getRows(); j++) {
                FieldSetEntity fseService = dtService.getFieldSetEntity(j);
                //业务uuid
                String serviceId = fseService.getString(mainTableAlias + "uuid");
                if (ff.containsKey(serviceId) && StringUtils.isEmpty(cronExpression)) {
                if (mapListWarn.containsKey(serviceId) && !StringUtils.isEmpty(cronExpression)) {
                    //如果已经存在预警信息 根据cron表达式判断是否需要再次预警
                    Date preTime = ff.get(serviceId).getDate("early_warning_datetime");
                    Date preTime = mapListWarn.get(serviceId).getDate("early_warning_datetime");
                    if (preTime != null) {
                        long time = new Date().getTime() - preTime.getTime();
                        if (time < seconds * 1000) {
@@ -440,7 +454,7 @@
                FieldSetEntity fse = new FieldSetEntity();
                fse.setTableName(CmnConst.PRODUCT_SYS_EARLY_WARNING_INFO);
                fse.setValue(CmnConst.EARLY_WARNING_DATETIME, new Date());
                fse.setValue(CmnConst.EARLY_WARNING_UUID, warnUUID);
                fse.setValue(CmnConst.EARLY_WARNING_UUID, fseWarningConfig.getUUID());
                fse.setValue(CmnConst.DATA_UUID, serviceId);
                fse.setValue(CmnConst.WARNING_CONTENT, content);
                fse.setValue(CmnConst.RECEIVER, allReceiver);