| | |
| | | SpringMVCContextHolder.getSystemLogger().error(e); |
| | | } |
| | | } |
| | | /** |
| | | * 单个预警,特殊预警已经有预警的数据了,别的业务主动调此方法,去发送预警消息 |
| | | * |
| | | * @param fseWarningConfig |
| | | * @param dtService预警的业务数据 |
| | | */ |
| | | public void warningCreate(FieldSetEntity fseWarningConfig,DataTableEntity dtService) { |
| | | |
| | | 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)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 单个预警 |
| | | * |