实现根据表单参数名通过逻辑判断后进行消息推送,推送内容可以根据正则将@符号包裹的字符串(表单参数名)进行替换,替换成表单参数名对应的数据;
前端界面展示:
后端代码:
按钮消息推送配置类:
@Data
@ApiModel(value = "按钮消息推送配置")
public class ActButtonMsgPushDTO {
/**
* 表单参数
*/
private String formKey;
/**
* 逻辑规则
*/
private String logicRule;
/**
* 数值
*/
private String value;
/**
* 推送类型
*/
private String pushType;
/**
* 接收人
*/
private String recipient;
/**
* 消息
*/
private String msg;
}
逻辑判断枚举类:
public enum LogicJudgeEnum {
/**
等于
*/
EQ("eq") {
@Override
public Boolean judge(String val, String rule) {
return val.equals(rule);
}
},
/**
不等于
*/
NE("ne") {
@Override
public Boolean judge(String val, String rule) {
return !val.equals(rule);
}
},
/**
大于
*/
GT("gt") {
@Override
public Boolean judge(String val, String rule) {
int res = val.compareTo(rule);
return res > 0;
}
},
/**
大于等于
*/
GE("ge") {
@Override
public Boolean judge(String val, String rule) {
int res = val.compareTo(rule);
return res >= 0;
}
},
/**
小于
*/
LT("lt") {
@Override
public Boolean judge(String val, String rule) {
int res = val.compareTo(rule);
return res < 0;
}
},
/**
小于等于
*/
LE("le") {
@Override
public Boolean judge(String val, String rule) {
int res = val.compareTo(rule);
return res <= 0;
}
},
/**
开头匹配
*/
START_WITH("startWith") {
@Override
public Boolean judge(String val, String rule) {
return val.startsWith(rule);
}
},
/**
结尾匹配
*/
END_WITH("endWith") {
@Override
public Boolean judge(String val, String rule) {
return val.endsWith(rule);
}
},
/**
为空
*/
IS_NULL("isNull") {
@Override
public Boolean judge(String val, String rule) {
return StringUtils.isBlank(val);
}
},
/**
不为空
*/
IS_NOT_NULL("isNotNull") {
@Override
public Boolean judge(String val, String rule) {
return StringUtils.isNotBlank(val);
}
},
/**
在列表中
*/
IN("in") {
@Override
public Boolean judge(String val, String rule) {
String[] split = rule.split(",");
List<String> ruleList = Arrays.asList(split);
return ruleList.contains(val);
}
},
/**
不在列表中
*/
NOT_IN("notIn") {
@Override
public Boolean judge(String val, String rule) {
String[] split = rule.split(",");
List<String> ruleList = Arrays.asList(split);
return !ruleList.contains(val);
}
};
private final String name;
LogicJudgeEnum(String name)
{
this.name = name;
}
public String getName() {
return name;
}
public abstract Boolean judge(String val, String rule);
public static Boolean commonJudge(String type, String val, String rule){
for (LogicJudgeEnum value : LogicJudgeEnum.values()) {
if (value.getName().equals(type)){
return value.judge(val, rule);
}
}
return null;
}
}
逻辑推送功能实现:
public class Test {
public static void main(String[] args) {
Map<String, Object> formData = new HashMap<>();
formData.put("remark", "hello world");
String msgPush = "[{"recipient":"user1,user2","msg":"content:@remark@"}]";
msgPush(formData, msgPush, "admin");
// 接收人:user1; 消息内容:content:hello world
// 接收人:user2; 消息内容:content:hello world
}
/**
* 消息逻辑推送
* @param formData
* @param msgPush
* @param startUser
*/
public static void msgPush(Map<String, Object> formData, String msgPush, String startUser) {
List<ActButtonMsgPushDTO> msgPushs = JSON.parseArray(msgPush, ActButtonMsgPushDTO.class);
if(msgPushs.size() == 0) {
return;
}
for (ActButtonMsgPushDTO item : msgPushs) {
String formKey = item.getFormKey();
String value = item.getValue();
String logicRule = item.getLogicRule();
boolean judge = false;
if (StringUtils.isBlank(logicRule)) {
// 逻辑判断为空直接赋true
judge = true;
} else {
judge = LogicJudgeEnum.commonJudge(logicRule, formData.get(formKey).toString(), value);
}
// 逻辑判断通过进行消息推送
if(!judge) {
break;
}
String pushType = item.getPushType();
String recipient = item.getRecipient();
// 为空自动赋值发起人
if(StringUtils.isBlank(recipient)) {
recipient = startUser;
}
// 内容处理,替换表单数据
String msg = item.getMsg();
// 正则匹配以@开头和结尾的单词
Pattern pattern = Pattern.compile("@\w+@");
Matcher matcher = pattern.matcher(msg);
// 查找所有匹配的字符串
while (matcher.find()) {
String matcherItem = matcher.group();
// 去掉开头和结尾的@字符
String mFormKey = matcher.group().replaceAll("^@+|@+$", "");
msg = msg.replaceAll(matcherItem, formData.get(mFormKey).toString());
}
// 接收人
List<String> recipients = Arrays.asList(recipient.split(","));
// 为空默认使用dingtalk
if(StringUtils.isBlank(pushType)) {
pushType = "dingTalk";
}
for (String uItem : recipients) {
if("dingTalk".equals(pushType)) {
// 模拟钉钉推送
System.out.println("接收人:" +uItem + "; 消息内容:" + msg);
}
}
}
}
}