fix:使用模板引擎消息模板

This commit is contained in:
nieziyan 2024-01-05 16:23:12 +08:00
parent e5fbffe637
commit 57d4d58a7a
14 changed files with 154 additions and 123 deletions

View File

@ -37,13 +37,13 @@ public enum MessageTypeEnum {
*/
String type;
String value;
/**
* 类型说明
*/
String note;
String value;
public String getNote() {
return note;
}
@ -60,9 +60,7 @@ public enum MessageTypeEnum {
this.type = type;
}
public String getValue() {
return value;
}
public String getValue() { return value;}
/**
* 获取字典数据
@ -81,12 +79,18 @@ public enum MessageTypeEnum {
}
public static MessageTypeEnum typeOf(String type) {
for (MessageTypeEnum e : MessageTypeEnum.values()) {
if (e.getValue().equals(type)) {
return e;
}
for (MessageTypeEnum messageType : MessageTypeEnum.values()) {
if (messageType.getType().equals(type))
return messageType;
}
return null;
}
public static MessageTypeEnum valueOf1(String value) {
for (MessageTypeEnum messageType : MessageTypeEnum.values()) {
if (messageType.getValue().equals(value))
return messageType;
}
return null;
}
}

View File

@ -10,13 +10,13 @@ public class DataTool {
private final Map<String, Object> data = new HashMap<>();
public DataTool put(Object value) {
data.put(String.format("${%d}", counter), value);
data.put(String.format("p%d", counter), value);
counter++;
return this;
}
public DataTool put(String key, Object value) {
data.put(String.format("${%s}", key), value);
data.put(key, value);
return this;
}

View File

@ -1,17 +1,12 @@
package org.jeecg.common.util;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.DefaultTemplateResolver;
import org.thymeleaf.templateresolver.StringTemplateResolver;
import org.jeecg.modules.base.service.ISysMessageTemplateService;
import java.util.Map;
/*
@ -19,21 +14,20 @@ import java.util.Map;
* */
public class TemplateUtil {
private static final RedisUtil redisUtil;
private static final ISysMessageTemplateService templateService;
static {
redisUtil = SpringContextUtils.getBean(RedisUtil.class);
templateService = SpringContextUtils.getBean(ISysMessageTemplateService.class);
}
public static MessageDTO parse(String code, Map<String, Object> data){
String key = RedisConstant.PREFIX_TEMPLATE + code;
MessageDTO messageDTO = new MessageDTO();
if (!redisUtil.hasKey(key))
SysMessageTemplate template = templateService.getOne(code);
// 如果没有消息模板
if(ObjectUtil.isNull(template))
return messageDTO;
SysMessageTemplate template = (SysMessageTemplate) redisUtil.get(key);
String templateName = template.getTemplateName();
String templateContent = template.getTemplateContent();
messageDTO.setTitle(templateName);
if (MapUtil.isEmpty(data))
return messageDTO;
@ -44,14 +38,13 @@ public class TemplateUtil {
}
public static MessageDTO parse(String title, String code, Map<String, Object> data) {
String key = RedisConstant.PREFIX_TEMPLATE + code;
MessageDTO messageDTO = new MessageDTO();
if (!redisUtil.hasKey(key))
SysMessageTemplate template = templateService.getOne(code);
// 如果没有消息模板
if(ObjectUtil.isNull(template))
return messageDTO;
SysMessageTemplate template = (SysMessageTemplate) redisUtil.get(key);
String templateName = template.getTemplateName();
String templateContent = template.getTemplateContent();
messageDTO.setTitle(StrUtil.isBlank(title) ? templateName : title);
if (MapUtil.isEmpty(data))
return messageDTO;

View File

@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.modules.base.entity.Rule;
import org.jeecg.modules.base.enums.Enabled;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@ -109,4 +111,12 @@ public class AlarmRule implements Serializable {
@TableField(exist = false)
private Rule rule;
/* 数据库表中以下两个属性均有默认值
新增规则缓存到Redis中,也为这两个属性设置默认值
*/
public AlarmRule(){
this.enabled = Enabled.ENABLED.getValue();
this.notification = MessageTypeEnum.ALL.getValue();
}
}

View File

@ -1,4 +1,4 @@
package org.jeecg.modules.message.mapper;
package org.jeecg.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.message.mapper.SysMessageTemplateMapper">
<mapper namespace="org.jeecg.modules.base.mapper.SysMessageTemplateMapper">
</mapper>

View File

@ -1,4 +1,4 @@
package org.jeecg.modules.message.service;
package org.jeecg.modules.base.service;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.base.service.JeecgService;
@ -21,6 +21,8 @@ public interface ISysMessageTemplateService extends JeecgService<SysMessageTempl
*/
List<SysMessageTemplate> selectByCode(String code);
SysMessageTemplate getOne(String code);
Result<?> addOrUpdate(SysMessageTemplate template);
Result<?> delById(String id);

View File

@ -1,4 +1,4 @@
package org.jeecg.modules.message.service.impl;
package org.jeecg.modules.base.service.impl;
import cn.hutool.core.util.ArrayUtil;
import org.jeecg.common.api.vo.Result;
@ -7,21 +7,16 @@ import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.system.base.service.impl.JeecgServiceImpl;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
import org.jeecg.modules.message.mapper.SysMessageTemplateMapper;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.base.mapper.SysMessageTemplateMapper;
import org.jeecg.modules.base.service.ISysMessageTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description: 消息模板
* @Author: jeecg-boot
* @Date: 2019-04-09
* @Version: V1.0
*/
@Service
public class SysMessageTemplateServiceImpl extends JeecgServiceImpl<SysMessageTemplateMapper, SysMessageTemplate> implements ISysMessageTemplateService {
@ -35,6 +30,19 @@ public class SysMessageTemplateServiceImpl extends JeecgServiceImpl<SysMessageTe
return baseMapper.selectByCode(code);
}
@Override
public SysMessageTemplate getOne(String code) {
String key = PREFIX + code;
if (redisUtil.hasKey(key))
return (SysMessageTemplate) redisUtil.get(key);
Optional<SysMessageTemplate> first = selectByCode(code).stream().findFirst();
if (!first.isPresent())
return null;
SysMessageTemplate template = first.get();
redisUtil.set(key, template);
return template;
}
@Override
@Transactional
public Result<?> addOrUpdate(SysMessageTemplate template) {

View File

@ -47,16 +47,16 @@ public class TemplateManager {
@Autowired
private SystemClient systemClient;
private final String templateKey = "template";
private final String TEMPLATEKEY = "template";
private final ConcurrentMap<String, JdbcTemplate> templateMap = new ConcurrentHashMap<>();
private void setTemplate(JdbcTemplate template){
templateMap.put(templateKey, template);
templateMap.put(TEMPLATEKEY, template);
}
public JdbcTemplate getTemplate(){
return templateMap.get(templateKey);
return templateMap.get(TEMPLATEKEY);
}
/*

View File

@ -33,7 +33,6 @@ import org.springframework.data.redis.connection.stream.ObjectRecord;
import org.springframework.data.redis.connection.stream.RecordId;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
import static org.jeecg.common.constant.enums.MessageTypeEnum.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
@ -59,7 +58,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
private AnalysisResultService analysisResultService;
private IAlarmAnalysisNuclideAvgService nuclideAvgService;
private final String comma = SymbolConstant.COMMA;
private final String COMMA = SymbolConstant.COMMA;
public AnalysisConsumer(String groupName, String consumerName) {
this.groupName = groupName;
@ -127,7 +126,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
String nuclidesStr = rule.getNuclides();
if (StrUtil.isBlank(nuclidesStr)) continue;
Set<String> names = nuclides.keySet();
List<String> follow = ListUtil.toList(nuclidesStr.split(comma));
List<String> follow = ListUtil.toList(nuclidesStr.split(COMMA));
// 推送过来的核素集合与所关注核素集合取交集
Collection<String> cross = CollectionUtil.intersection(names, follow);
if (CollUtil.isEmpty(cross)) continue;
@ -150,7 +149,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
String conditionStr = info.getConditions();
String betaOrGamma = info.getBetaOrGamma();
String datasource = info.getDatasource();
List<String> conditions = ListUtil.toList(conditionStr.split(comma));
List<String> conditions = ListUtil.toList(conditionStr.split(COMMA));
for (String con : conditions) {
Condition condition = Condition.valueOf1(con);
if (ObjectUtil.isNotNull(condition)){
@ -158,7 +157,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
case FIRST_FOUND: // 首次发现该元素
firstDetected = firstDetected(betaOrGamma,datasource,nuclideNames);
if (CollUtil.isNotEmpty(firstDetected)){
String message = "First discovery of nuclides: [" + StrUtil.join(comma,firstDetected) + "]";
String message = "First discovery of nuclides: [" + StrUtil.join(COMMA,firstDetected) + "]";
alarmInfo.append(message);
}
break;
@ -169,14 +168,14 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
String nuclide = nuclideInfo.getNuclide();
String threshold = nuclideInfo.getThreshold();
String message = "Nuclide " + nuclide + "is above average: " + threshold;
alarmInfo.append(comma).append(message);
alarmInfo.append(COMMA).append(message);
}
}
break;
case MEANWHILE: // 同时出现两种及以上核素
if (nuclideNames.size() >= 2){
String message = "Simultaneously detecting nuclides: [" + StrUtil.join(comma,nuclideNames) + "]";
alarmInfo.append(comma).append(message);
String message = "Simultaneously detecting nuclides: [" + StrUtil.join(COMMA,nuclideNames) + "]";
alarmInfo.append(COMMA).append(message);
}
break;
default:
@ -191,7 +190,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
SampleType sampleType = SampleType.typeOf(betaOrGamma);
if (ObjectUtil.isNotNull(sampleType))
logInfo.setSampleType(sampleType.getValue());
if (alarmInfo.toString().startsWith(comma))
if (alarmInfo.toString().startsWith(COMMA))
alarmInfo = new StringBuilder(StrUtil.sub(alarmInfo.toString(), 1, alarmInfo.length()));
logInfo.setAlarmInfo(alarmInfo.toString());
if (CollUtil.isNotEmpty(moreThanAvg))

View File

@ -2,17 +2,17 @@ package org.jeecg.modules.message;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.modules.base.entity.postgre.SysUser;
import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.HashMap;
import java.util.List;
@ -20,7 +20,6 @@ import java.util.Map;
import java.util.stream.Collectors;
import static org.jeecg.common.constant.enums.MessageTypeEnum.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
/**
* 消息推送 (站内|邮箱|短信)
@ -31,10 +30,10 @@ import static org.jeecg.common.util.TokenUtils.getTempToken;
@Component
public class SendMessage {
private final String Sms = "Phone";
private final String Email = "Email";
private final String System = "Username";
private final String comma = SymbolConstant.COMMA;
private final String SMS = "Phone";
private final String EMAIL = "Email";
private final String SYSTEM = "Username";
private final String COMMA = SymbolConstant.COMMA;
@Autowired
private ISysBaseAPI sysBaseAPI;
@ -52,34 +51,40 @@ public class SendMessage {
public void send(MessageDTO messageDTO, String groupId, String notific){
Map<String, String> contact = getContact(groupId);
if (StrUtil.isBlank(notific)) return;
List<String> ways = ListUtil.toList(notific.split(comma));
if (ways.contains(ALL.getValue())){
ways = ListUtil.toList(XT.getValue(), YJ.getValue(),SMS.getValue());
}
List<String> ways = ListUtil.toList(StrUtil.split(notific, COMMA));
if (ways.contains(ALL.getValue()))
ways = ListUtil.toList(XT.getValue(), YJ.getValue(), MessageTypeEnum.SMS.getValue());
for (String way : ways) {
if(way.equals(XT.getValue())){// 1.推送系统消息
String toSys = contact.get(System);
if (StrUtil.isNotBlank(toSys)){
MessageTypeEnum messageType = valueOf1(way);
if (ObjectUtil.isNotNull(messageType)){
switch (messageType){
case XT: // 站内消息
String toSys = contact.get(SYSTEM);
if (StrUtil.isBlank(toSys)) continue;
messageDTO.setToUser(toSys);
messageDTO.setType(XT.getType());
sysBaseAPI.sendMessage(messageDTO);
}
} else if (way.equals(YJ.getValue())) {// 2.推送邮箱
String toEmail = contact.get(Email);
if (StrUtil.isNotBlank(toEmail)){
break;
case YJ: // 邮箱消息
String toEmail = contact.get(EMAIL);
if (StrUtil.isBlank(toEmail)) continue;
// messageDTO.setToUser(toEmail);
messageDTO.setType(YJ.getType());
Map<String, String> userEmail = new HashMap<>(contact);
MapUtil.removeAny(userEmail, Sms, Email, System);
MapUtil.removeAny(userEmail, SMS, EMAIL, SYSTEM);
messageDTO.setUserEmail(userEmail);
sysBaseAPI.sendMessage(messageDTO);
}
} else if (way.equals(SMS.getValue())) {// 3.推送短信
String toSms = contact.get(Sms);
if (StrUtil.isNotBlank(toSms)){
break;
case SMS: // 手机短信
String toSms = contact.get(SMS);
if (StrUtil.isBlank(toSms)) continue;
messageDTO.setToUser(toSms);
messageDTO.setType(SMS.getType());
messageDTO.setType(MessageTypeEnum.SMS.getType());
sysBaseAPI.sendMessage(messageDTO);
break;
default:
break;
}
}
}
@ -95,27 +100,21 @@ public class SendMessage {
// 查询用户信息
List<SysUser> sysUsers = sysUserService.listByIds(userIds);
// 用户名
String usernameList = sysUsers.stream()
.filter(user -> StrUtil.isNotBlank(user.getUsername()))
.map(SysUser::getUsername)
.collect(Collectors.joining(comma));
String usernameList = sysUsers.stream().map(SysUser::getUsername).filter(StrUtil::isNotBlank)
.collect(Collectors.joining(COMMA));
// 邮箱
String emailList = sysUsers.stream()
.filter(user -> StrUtil.isNotBlank(user.getEmail()))
.map(SysUser::getEmail)
.collect(Collectors.joining(comma));
String emailList = sysUsers.stream().map(SysUser::getEmail).filter(StrUtil::isNotBlank)
.collect(Collectors.joining(COMMA));
// 用户名-邮箱Map
Map<String, String> userEmail = sysUsers.stream()
.collect(Collectors.toMap(SysUser::getUsername, SysUser::getEmail));
// 手机号码
String phoneList = sysUsers.stream()
.filter(user -> StrUtil.isNotBlank(user.getPhone()))
.map(SysUser::getPhone)
.collect(Collectors.joining(comma));
String phoneList = sysUsers.stream().map(SysUser::getPhone).filter(StrUtil::isNotBlank)
.collect(Collectors.joining(COMMA));
Map<String,String> result = new HashMap<>();
result.put(System,usernameList);
result.put(Email,emailList);
result.put(Sms,phoneList);
result.put(SYSTEM, usernameList);
result.put(EMAIL, emailList);
result.put(SMS, phoneList);
result.putAll(userEmail);
return result;
}

View File

@ -1,7 +1,6 @@
package org.jeecg.modules.message.controller;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -16,15 +15,13 @@ import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.message.entity.MsgParams;
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.message.util.PushMsgUtil;
import org.jeecg.modules.base.service.ISysMessageTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Map;
/**

View File

@ -8,7 +8,7 @@ import org.jeecg.modules.message.entity.SysMessage;
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
import org.jeecg.modules.message.handle.enums.SendMsgStatusEnum;
import org.jeecg.modules.message.service.ISysMessageService;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.base.service.ISysMessageTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@ -19,6 +19,7 @@ import org.jeecg.common.api.dto.OnlineAuthDTO;
import org.jeecg.common.api.dto.message.*;
import org.jeecg.common.aspect.UrlMatchEnum;
import org.jeecg.common.constant.*;
import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.common.desensitization.util.SensitiveInfoUtil;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.api.ISysBaseAPI;
@ -35,7 +36,7 @@ import org.jeecg.modules.message.handle.impl.EmailPushMsgHandle;
import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle;
import org.jeecg.modules.message.handle.impl.SmsSendMsgHandle;
import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;
import org.jeecg.modules.message.service.ISysMessageTemplateService;
import org.jeecg.modules.base.service.ISysMessageTemplateService;
import org.jeecg.modules.message.websocket.WebSocket;
import org.jeecg.modules.system.mapper.*;
import org.jeecg.modules.system.service.*;
@ -1233,7 +1234,6 @@ public class SysBaseApiImpl implements ISysBaseAPI {
}*/
public void sendTemplateMessage(MessageDTO message) {
String type = message.getType();
String title = message.getTitle();
String code = message.getTemplateCode();
if(StrUtil.isNotBlank(code)){
@ -1252,25 +1252,44 @@ public class SysBaseApiImpl implements ISysBaseAPI {
message.setTitle(title).setContent(content);
}
}
if(XT.getType().equals(type)){ // 站内消息
String type = message.getType();
MessageTypeEnum messageType = typeOf(type);
if (ObjectUtil.isNotNull(messageType)){
switch (messageType){
case XT: // 站内消息
systemSendMsgHandle.sendMessage(message);
}else if(YJ.getType().equals(type)){ // 邮箱消息
break;
case YJ: // 邮箱消息
emailPushMsgHandle.sendMessage(message);
} else if (SMS.getType().equals(type)) { // 手机短信
break;
case SMS: // 手机短信
smsSendMsgHandle.sendMessage(message);
break;
default:
break;
}
}
}
@Override
public void sendMessage(MessageDTO message) {
String type = message.getType();
if(XT.getType().equals(type)){ // 站内消息
MessageTypeEnum messageType = typeOf(type);
if (ObjectUtil.isNotNull(messageType)){
switch (messageType){
case XT: // 站内消息
systemSendMsgHandle.sendMessage(message);
}else if(YJ.getType().equals(type)){ // 邮箱消息
break;
case YJ: // 邮箱消息
emailPushMsgHandle.sendMessage(message);
} else if (SMS.getType().equals(type)) { // 手机短信
break;
case SMS: // 手机短信
smsSendMsgHandle.sendMessage(message);
break;
default:
break;
}
}
}