package com.product.administration.service; 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.stereotype.Service; import com.product.administration.config.CmnConst; import com.product.common.lang.StringUtils; import com.product.core.config.Global; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.websocket.service.WebsocketMesssageServiceThread; import com.product.email.util.SmtpSendMail; import com.product.text.message.util.HttpSmsSendUtil; import com.product.tool.flow.service.FlowService; import com.product.util.BaseUtil; @Service("warnTask") public class EarlyWarningServer { @Autowired BaseDao baseDao; @Autowired FlowService flowService; public BaseDao getBaseDao() { return baseDao; } public void setBaseDao(BaseDao baseDao) { this.baseDao = baseDao; } /** * 预警任务 */ public void warningTask() { // 获取所有预警配置 DataTableEntity dtWarningConfig = baseDao.listTable(CmnConst.PRODUCT_SYS_EARLY_WARNING, "config_status=1"); if (!BaseUtil.dataTableIsEmpty(dtWarningConfig)) { // 遍历预警配置 for (int i = 0; i < dtWarningConfig.getRows(); i++) { FieldSetEntity fseWarningConfig = dtWarningConfig.getFieldSetEntity(i); singleWarningTask(fseWarningConfig); } } } /** * 预警-给定uuid单个预警,通常为定时任务触发 * * @param uuid */ public void triggerSingleWarningTask(String uuid) { try { FieldSetEntity fseWarningConfig = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_EARLY_WARNING, uuid, false); if (!"1".equals(fseWarningConfig.getString(CmnConst.CONFIG_STATUS))) { throw new BaseException(SystemCode.WARN_NO_NORMAL_STATUS_RECORD); } singleWarningTask(fseWarningConfig); } catch (Exception e) { 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 tableNameAndAlias = new HashMap<>(); //相关表名-->表别名,tableName-->tableName1 Map fieldAndAlias = new HashMap<>(); //相关字段-->字段别名,tableName.fieldName-->tableName1fieldName Map 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 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 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 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)); } } } } } /** * 单个预警 * * @param fseWarningConfig */ private void singleWarningTask(FieldSetEntity fseWarningConfig) { 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 tableNameAndAlias = new HashMap<>(); //相关表名-->表别名,tableName-->tableName1 Map fieldAndAlias = new HashMap<>(); //相关字段-->字段别名,tableName.fieldName-->tableName1fieldName Map 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 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 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 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)); } } } } } /** * 根据提醒内容中的表属性,进行拼接成标准格式 * * @param content 预警内容 * @param concatField 组合字段 * @param tableNameAndAlias 表名及别名 * @param fieldAndAlias 字段名及别名 * @param fieldReference 字段及参照 * @return */ public Object[] parseWarningContent(String warnContent, StringBuilder concatField, Map tableNameAndAlias, Map fieldAndAlias, Map fieldReference) { int s = 0; String tableAndField = null; while (s >= 0) { int c = warnContent.indexOf("{#", s); if (c == -1) { concatField.append(", uuid "); break; } int m = warnContent.indexOf("#}", c); s = c + 2; //表名.字段名 tableAndField = warnContent.substring(s, m); //获取表名 String relationTable = tableAndField.split("\\.")[0]; //表别名 String relationTableAlias = relationTable + "1"; //字段名 String fieldName = tableAndField.split("\\.")[1]; if (tableNameAndAlias.get(relationTable) == null) { concatField.append(","); concatField.append(relationTableAlias); concatField.append(".uuid "); concatField.append(relationTableAlias); concatField.append("uuid"); fieldAndAlias.put(relationTable + ".uuid", relationTable + "1uuid"); tableNameAndAlias.put(relationTable, relationTableAlias); } //生成字段别名-->表名1字段名 String tableFieldAlias = tableAndField.replace(".", "1"); if (fieldAndAlias.get(tableAndField) == null) { fieldAndAlias.put(tableAndField, tableFieldAlias); concatField.append(","); concatField.append(relationTableAlias + "." + fieldName); concatField.append(" "); concatField.append(tableFieldAlias); fieldReference.put(tableFieldAlias, getReferenceByField(tableAndField)); } } return new Object[]{concatField, tableNameAndAlias, fieldAndAlias, fieldReference}; } /** * 根据提醒内容中的表属性,进行拼接成标准格式 * * @param flowParam 预警内容 * @param concatField 组合字段 * @param tableNameAndAlias 表名及别名 * @param fieldAndAlias 字段名及别名 * @param fieldReference 字段及参照 * @return */ public Object[] parseFlowParam(String flowParam, StringBuilder concatField, Map tableNameAndAlias, Map fieldAndAlias, Map fieldReference) { String[] warnAndFlows = flowParam.split(","); for (int i = 0; i < warnAndFlows.length; i++) { String[] warnAndFlow = warnAndFlows[i].split("="); String tableAndField = warnAndFlow[0]; //获取表名 String relationTable = tableAndField.split("\\.")[0]; //表别名 String relationTableAlias = relationTable + "1"; //字段名 String fieldName = tableAndField.split("\\.")[1]; if (tableNameAndAlias.get(relationTable) == null) { concatField.append(","); concatField.append(relationTableAlias); concatField.append(".uuid "); concatField.append(relationTableAlias); concatField.append("uuid"); fieldAndAlias.put(relationTable + ".uuid", relationTable + "1uuid"); tableNameAndAlias.put(relationTable, relationTableAlias); } //生成字段别名-->表名1字段名 String tableFieldAlias = tableAndField.replace(".", "1"); if (fieldAndAlias.get(tableAndField) == null) { fieldAndAlias.put(tableAndField, tableFieldAlias); concatField.append(","); concatField.append(relationTableAlias + "." + fieldName); concatField.append(" "); concatField.append(tableFieldAlias); fieldReference.put(tableFieldAlias, getReferenceByField(tableAndField)); } } return new Object[]{concatField, tableNameAndAlias, fieldAndAlias, fieldReference}; } /** * 根据表名和字段的获取对应参照 * * @param tableAndField 表别名.字段名 * @return 参照名 */ public String getReferenceByField(String tableAndField) { String[] tableField = tableAndField.replace("1.", ".").split("\\."); String tableName = tableField[0]; String fieldName = tableField[1]; FieldSetEntity fseTableInfo = baseDao.getFieldSetEntityByFilter("product_sys_datamodel_table", "table_name=?", new Object[]{tableName}, false); FieldSetEntity fseFieldInfo = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_DATAMODEL_FIELD, "table_uuid=? and field_name=?", new Object[]{fseTableInfo.getUUID(), fieldName}, false); if (fseFieldInfo == null) { throw new BaseException("", "", this.getClass(), ""); } String fieldType = fseFieldInfo.getString(CmnConst.FIELD_TYPE); if (CmnConst.USERID.equals(fieldType)) { return CmnConst.USERID; } else { return fseFieldInfo.getString(CmnConst.FIELD_REFERENCE); } } /** * 生成关联SQL * * @param tableNameAndAlias * @param subTable 当前表 * @return */ public String createTableRelation(Map tableNameAndAlias, String subTable) { //关联SQL StringBuilder relationSql = new StringBuilder(); relationSql.append(subTable + " "); relationSql.append(subTable + "1"); //判断是否使用子表 if (tableNameAndAlias != null) { //根据关联子表生成关联SQL for (String mainTableName : tableNameAndAlias.keySet()) { //获取外键字段 String foreignKey = baseDao.getSubTableRelation(mainTableName, subTable); if (!StringUtils.isEmpty(foreignKey)) { relationSql.append(" LEFT JOIN "); relationSql.append(mainTableName + " "); relationSql.append(mainTableName + "1"); relationSql.append(" ON "); relationSql.append(mainTableName + "1.uuid="); relationSql.append(subTable + "1." + foreignKey); } } } return relationSql.toString(); } public String getContentByTableSource(FieldSetEntity fse, String content, Map concatFieldReference) { if (content.indexOf("{#") == -1) { return content; } content = content.replace(".", "1"); return replaceParamText(content, fse, concatFieldReference); } /** * 替换文本参数 * * @param paramText 原文本 * @param fseData 业务数据 * @return 新文本 * @throws BaseException */ public String replaceParamText(String paramText, FieldSetEntity fseData, Map concatFieldReference) throws BaseException { String str = paramText; // 系统参数{{参数名:sys}} Pattern p3 = Pattern.compile("(\\{\\{)([\\w]+)(:sys\\}\\})"); // 普通业务参数{{参数名}} Pattern p4 = Pattern.compile("(\\{\\#)([\\w]+)(\\#\\})"); StringBuffer sb1 = new StringBuffer(); Matcher m = p3.matcher(str); while (m.find()) { String group = m.group(2); String replaceValue = SystemParamReplace.replaceSystemParameter(group); if (StringUtils.isEmpty(replaceValue)) { continue; } m.appendReplacement(sb1, replaceValue); } m.appendTail(sb1); StringBuffer sb2 = new StringBuffer(); if (fseData != null) { m = p4.matcher(sb1); while (m.find()) { String group = m.group(2); String value = fseData.getString(group); if (null != value) { if (StringUtils.isEmpty(concatFieldReference.get(group))) { m.appendReplacement(sb2, value); } else { m.appendReplacement(sb2, parseReference(concatFieldReference.get(group), value, fseData)); } } } m.appendTail(sb2); } return sb2.toString(); } /** * 参照替换 * * @param referenceName * @param originValue * @param fseData * @return */ public String parseReference(String referenceName, String originValue, FieldSetEntity fseData) { if (CmnConst.USERID.equals(referenceName)) { //人员 FieldSetEntity fseUser = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_USERS, "user_id=?", new Object[]{originValue}, false); if (fseUser == null) { throw new BaseException("", "", this.getClass(), ""); } else { return fseUser.getString(CmnConst.USER_NAME); } } else if (referenceName.indexOf("》") > -1) { //数据字典 referenceName.replace("《", "").replace("》", ""); FieldSetEntity fseDict = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_DICT, "dict_name=? AND dict_value=?", new Object[]{referenceName, originValue}, false); if (fseDict == null) { throw new BaseException("", "", this.getClass(), ""); } else { return fseDict.getString(CmnConst.DICT_LABEL); } } else { //高级参照 FieldSetEntity fsePrompt = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_PROMPT, "prompt_name=?", new Object[]{referenceName}, false); if (fsePrompt == null) { throw new BaseException("", "", this.getClass(), ""); } else { String valueField = fsePrompt.getString("value_field"); String viewField = fsePrompt.getString("view_fields"); String sourceTable = fsePrompt.getString("source_table"); FieldSetEntity fsePromptData = baseDao.getFieldSetEntityByFilter(sourceTable, valueField + "=?", new Object[]{originValue}, false); if (fsePromptData != null) { return fsePromptData.getString(viewField); } } } return originValue; } /** * 解析条件表达式 * * @param warnCOnditon * @param tableNameAndAlias * @return */ public String parseWarnCondition(String warnConditon, Map tableNameAndAlias) { for (String tableName : tableNameAndAlias.keySet()) { if (warnConditon.indexOf(tableName) > -1) { warnConditon = warnConditon.replace(tableName, tableNameAndAlias.get(tableName)); } } warnConditon = warnConditon.replace("{#", "").replace("#}", ""); warnConditon = warnConditon.replace("{%", "").replace("%}", ""); return warnConditon; } /** * 预警发邮件解析 * * @param content * @param receiver */ public void parseMail(String content, String receiver) { String[] user_ids = receiver.split(","); for (int i = 0; i < user_ids.length; i++) { FieldSetEntity fseStaff = baseDao.getFieldSetEntityByFilter("product_sys_staffs", "user_id=?", new Object[]{user_ids[i]}, false); if (fseStaff == null) { continue; } String org_level_uuid = fseStaff.getString(CmnConst.ORG_LEVEL_UUID); String userEmail = fseStaff.getString("staff_email"); FieldSetEntity fseCompanySmtp = baseDao.getFieldSetEntityByFilter("product_sys_company_email_smtp", "org_level_uuid=?", new Object[]{org_level_uuid}, false); FieldSetEntity fseMailInfo = new FieldSetEntity(); fseMailInfo.setTableName(CmnConst.PRODUCT_SYS_MAIL_SEND); fseMailInfo.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid); fseMailInfo.setValue(CmnConst.ADDRESSEE, userEmail); fseMailInfo.setValue(CmnConst.MAIL_TITLE, "预警信息"); fseMailInfo.setValue(CmnConst.MAIL_CONTENT, content); if (fseCompanySmtp != null) { fseMailInfo.setValue(CmnConst.SMTP_SERVER_HOST, fseCompanySmtp.getString(CmnConst.SMTP_SERVER_HOST)); fseMailInfo.setValue(CmnConst.SMTP_SERVER_PORT, fseCompanySmtp.getString(CmnConst.SMTP_SERVER_PORT)); fseMailInfo.setValue(CmnConst.SMTP_USERNAME, fseCompanySmtp.getString(CmnConst.SMTP_USERNAME)); fseMailInfo.setValue(CmnConst.SMTP_LICENSE_CODE, fseCompanySmtp.getString(CmnConst.SMTP_LICENSE_CODE)); } else { fseMailInfo.setValue(CmnConst.SMTP_SERVER_HOST, Global.getSystemConfig("spring.mail.host", "")); fseMailInfo.setValue(CmnConst.SMTP_SERVER_PORT, Global.getSystemConfig("spring.mail.port", "")); fseMailInfo.setValue(CmnConst.SMTP_USERNAME, Global.getSystemConfig("spring.mail.username", "")); fseMailInfo.setValue(CmnConst.SMTP_LICENSE_CODE, Global.getSystemConfig("spring.mail.password", "")); } fseMailInfo.setValue("send_mode", "smtp"); SmtpSendMail.sendMail(fseMailInfo, null); //创建人和创建时间 if (SpringMVCContextHolder.getCurrentUser() != null) { fseMailInfo.setValue(CmnConst.CREATED_BY, SpringMVCContextHolder.getCurrentUser().getUser_id()); } fseMailInfo.setValue(CmnConst.CREATED_UTC_DATETIME, new Date()); baseDao.add(fseMailInfo); } } /** * 预警发短信解析 * * @param content * @param receiver */ public void parseSMS(String content, String receiver) { String[] user_ids = receiver.split(","); for (int i = 0; i < user_ids.length; i++) { FieldSetEntity fseuser = baseDao.getFieldSetEntityByFilter("product_sys_users", "user_id=?", new Object[]{user_ids[i]}, false); FieldSetEntity fseStaff = baseDao.getFieldSetEntityByFilter("product_sys_staffs", "user_id=?", new Object[]{user_ids[i]}, false); if (fseStaff == null) { continue; } String org_level_uuid = fseStaff.getString(CmnConst.ORG_LEVEL_UUID); String userPhone = fseuser.getString("user_phone_number"); FieldSetEntity fseMessageInfo = new FieldSetEntity(); fseMessageInfo.setTableName(CmnConst.PRODUCT_SYS_MESSAGE_SEND); fseMessageInfo.setValue(CmnConst.ORG_LEVEL_UUID, org_level_uuid); fseMessageInfo.setValue("send_user", "2"); fseMessageInfo.setValue("receive_user", userPhone); fseMessageInfo.setValue("content", content); FieldSetEntity fseCompanyMessage = baseDao.getFieldSetEntityByFilter("product_sys_company_email_smtp", "org_level_uuid=?", new Object[]{org_level_uuid}, false); if (fseCompanyMessage != null) { fseMessageInfo.setValue(CmnConst.USER_ACCOUNT, fseCompanyMessage.getString(CmnConst.USER_ACCOUNT)); fseMessageInfo.setValue(CmnConst.SECRETKEY, fseCompanyMessage.getString(CmnConst.SECRETKEY)); fseMessageInfo.setValue(CmnConst.ECNAME, fseCompanyMessage.getString(CmnConst.ECNAME)); fseMessageInfo.setValue(CmnConst.SIGN, fseCompanyMessage.getString(CmnConst.SIGN)); fseMessageInfo.setValue(CmnConst.ADDSERIAL, fseCompanyMessage.getString(CmnConst.ADDSERIAL)); fseMessageInfo.setValue(CmnConst.URL, fseCompanyMessage.getString(CmnConst.URL)); fseMessageInfo.setValue(CmnConst.TREATY, fseCompanyMessage.getString(CmnConst.TREATY)); } else { fseMessageInfo.setValue(CmnConst.USER_ACCOUNT, "zgctjt"); fseMessageInfo.setValue(CmnConst.SECRETKEY, "zgctjt2019"); fseMessageInfo.setValue(CmnConst.ECNAME, "自贡市城市建设投资开发集团有限公司"); fseMessageInfo.setValue(CmnConst.SIGN, "9OOWx4mtn"); fseMessageInfo.setValue(CmnConst.ADDSERIAL, ""); fseMessageInfo.setValue(CmnConst.URL, "http://112.35.1.155:1992/sms/norsubmit"); fseMessageInfo.setValue(CmnConst.TREATY, "HTTP"); } fseMessageInfo.setValue("send_mode", "smtp"); HttpSmsSendUtil.sendMsg(fseMessageInfo); fseMessageInfo.setValue(CmnConst.CREATED_BY, 1); fseMessageInfo.setValue(CmnConst.CREATED_UTC_DATETIME, new Date()); baseDao.add(fseMessageInfo); } } /** * 自动发起流程 * * @param flowCode * @param flowParam * @param fseService * @param fieldAndAlias */ public void autoStartFlow(String warnName, String flowCode, String flowParam, FieldSetEntity fseService, Map fieldAndAlias, Integer createdBy) { if (flowCode == null) { return; } FieldSetEntity fseFlowService = new FieldSetEntity(); String[] warnAndFlows = flowParam.split(","); for (int i = 0; i < warnAndFlows.length; i++) { String[] warnAndFlow = warnAndFlows[i].split("="); String warnField = warnAndFlow[0]; String flowField = warnAndFlow[1]; fseFlowService.setTableName(flowField.split("\\.")[0]); fseFlowService.setValue(flowField.split("\\.")[1], fseService.getObject(fieldAndAlias.get(warnField.replace("{#", "").replace("#}", "")))); } baseDao.add(fseFlowService); FieldSetEntity fseFLow = new FieldSetEntity(); fseFLow.setTableName(fseFlowService.getTableName()); fseFLow.setValue("flow_title", warnName); fseFLow.setValue("uuid", fseFlowService.getUUID()); fseFLow.setValue("type_code", flowCode); fseFLow.setValue("accepters", createdBy); flowService.autoSendFlow(fseFLow); } }