zm
2024-10-18 ac2e912c9dd7bafc9101775462fbe7060ce27a91
Merge branch 'dev' of http://nonxin.cn:8090/r/product/product-server-administration/V2.0.0 into dev
已修改1个文件
230 ■■■■■ 文件已修改
src/main/java/com/product/administration/service/EarlyWarningServer.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/administration/service/EarlyWarningServer.java
@@ -78,7 +78,237 @@
            SpringMVCContextHolder.getSystemLogger().error(e);
        }
    }
    /**
     * 单个预警,特殊预警已经有预警的数据了,别的业务主动调此方法,去发送预警消息
     *
     * @param configUuid
     * @param dtService预警的业务数据
     */
    public void warningCreate(String configUuid,DataTableEntity dtService) {
        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 mainTableAlias = mainTableName + "1";                                                //主表别名
//
//        String warnCondition = fseWarningConfig.getString(CmnConst.CONDITION_EXPRESSION_HIDE);    //预警表达式
        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);            //固定接收人
        String flowReceiver = fseWarningConfig.getString(CmnConst.FLOW_RELATED_PERSON);        //流程相关人
//
        String flowFixedUser = fseWarningConfig.getString(CmnConst.FLOW_FIX_USER);                //流程固定发起人
        String flowBusinessUser = fseWarningConfig.getString(CmnConst.FLOW_BUSINESS_USER);        //流程动态发起人
//
        String flowCode = fseWarningConfig.getString(CmnConst.FLOW_CODE);                        //流程type_code
        String flowParam = fseWarningConfig.getString(CmnConst.FLOW_PARAM);                        //流程参数转换
//
//        //获取发送消息频率
        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
        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);
        }
//
//        //解析预警条件
//        if (!StringUtils.isEmpty(warnCondition)) {
//            parseWarningContent(warnCondition, concatField, tableNameAndAlias, fieldAndAlias, fieldReference);
//        }
//
        //解析流程参数
        if (!StringUtils.isEmpty(flowParam)) {
            parseWarningContent(flowParam, concatField, tableNameAndAlias, fieldAndAlias, fieldReference);
        }
        //解析流程发起人
        if (StringUtils.isEmpty(flowFixedUser) && !StringUtils.isEmpty(flowBusinessUser)) {
//                    parseWarningContent(flowBusinessUser,concatField,tableNameAndAlias,fieldAndAlias,fieldReference);
        }
//
//        //生成主子表关联SQL
//        String relationSQL = createTableRelation(tableNameAndAlias, mainTableName);
//
//        StringBuilder serviceSQL = new StringBuilder();
//        serviceSQL.append(" SELECT ");
//        serviceSQL.append(concatField.subSequence(1, concatField.length()));
//        serviceSQL.append(" FROM ");
//        serviceSQL.append(relationSQL);
//        serviceSQL.append(" WHERE ");
//        serviceSQL.append(parseWarnCondition(warnCondition, tableNameAndAlias));
//
//        //查询符合预警的数据
//        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);
            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());
            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);
                }
            }
            //以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)) {
                    //如果已经存在预警信息 根据cron表达式判断是否需要再次预警
                    Date preTime = ff.get(serviceId).getDate("early_warning_datetime");
                    if (preTime != null) {
                        long time = new Date().getTime() - preTime.getTime();
                        if (time < seconds * 1000) {
                            continue;
                        }
                    }
                }
                //信息接收人
                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)) {
                    FieldSetEntity fseOrgnaiztion = baseDao.getFieldSetEntity("product_sys_organizational_structure_storage", fixedReceiver, false);
                    if (!StringUtils.isEmpty(fseOrgnaiztion.getString("staff_ids"))) {
                        String[] splitReceiver = fseOrgnaiztion.getString("staff_ids").split(",");
                        for (int k = 0; k < splitReceiver.length; k++) {
                            FieldSetEntity fseStaff = baseDao.getFieldSetEntityByFilter("product_sys_staffs", "staff_id=?", new Object[]{splitReceiver[k]}, false);
                            receiverSet.add(fseStaff.getString(CmnConst.USER_ID));
                        }
                    }
                }
                //装载流程相关人
                if (!StringUtils.isEmpty(flowReceiver)) {
                }
                //暂时替换提醒内容
                warnContent = SystemParamReplace.replaceParams(warnContent, fseService);
                String content = getContentByTableSource(fseService, warnContent, fieldReference);
                String allReceiver = SetUtils.set2String(receiverSet, ",");
                //自动生成预警日志信息
                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.DATA_UUID, serviceId);
                fse.setValue(CmnConst.WARNING_CONTENT, content);
                fse.setValue(CmnConst.RECEIVER, allReceiver);
                fse.setValue(CmnConst.WARNING_METHOD, warnMethod);
                baseDao.add(fse);
                //发送信息
                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=" + fse.getUUID(), CmnConst.PRODUCT_SYS_EARLY_WARNING_INFO, fse.getUUID(), 1, 0, 0);
                        } else if ("2".equals(send_method[k])) {    //电子邮件
                            parseMail(content, allReceiver);
                        } else if ("3".equals(send_method[k])) {    //短信消息
                            parseSMS(content, allReceiver);
                        }
                    }
                }
                //发起流程
                if (!StringUtils.isEmpty(flowFixedUser)) {
                    autoStartFlow(fseWarningConfig.getString("config_name"), flowCode, flowParam, fseService, fieldAndAlias, Integer.valueOf(flowFixedUser));
                } else {
                    if (!StringUtils.isEmpty(flowBusinessUser)) {
                        autoStartFlow(fseWarningConfig.getString("config_name"), flowCode, flowParam, fseService, fieldAndAlias, fseService.getInteger(flowBusinessUser));
                    }
                }
            }
        }
    }
    /**
     * 单个预警
     *