消息逻辑推送

108 阅读2分钟

实现根据表单参数名通过逻辑判断后进行消息推送,推送内容可以根据正则将@符号包裹的字符串(表单参数名)进行替换,替换成表单参数名对应的数据;

前端界面展示:

20977257e90fbbfc0bb6cfe9ffdf9af5.png

后端代码:

按钮消息推送配置类:

@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);
                }
            }
        }
    }
}