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<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[]{});
|
|
///----------------设预警检测的bean方法解发验证是否解发预警,返回true,即发生预警------------------
|
boolean b=false;
|
//-----反射调bean,要改
|
//b=xxxxx.month(dtService);
|
///----------------设预警检测的bean方法解发验证是否解发预警,返回true,即发生预警------------------
|
if (b) {
|
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));
|
}
|
}
|
}
|
}
|
}
|
/**
|
* 单个预警
|
*
|
* @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<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));
|
}
|
}
|
}
|
}
|
}
|
|
|
/**
|
* 根据提醒内容中的表属性,进行拼接成标准格式
|
*
|
* @param content 预警内容
|
* @param concatField 组合字段
|
* @param tableNameAndAlias 表名及别名
|
* @param fieldAndAlias 字段名及别名
|
* @param fieldReference 字段及参照
|
* @return
|
*/
|
public Object[] parseWarningContent(String warnContent, StringBuilder concatField, Map<String, String> tableNameAndAlias, Map<String, String> fieldAndAlias, Map<String, String> 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<String, String> tableNameAndAlias, Map<String, String> fieldAndAlias, Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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);
|
}
|
}
|