houzhongjian
2024-09-14 818a0170d8f2950d52cc7300a302356bbc523236
提交 | 用户 | 时间
e7c126 1 package com.iailab.module.system.service.notify;
H 2
3 import cn.hutool.core.util.ReUtil;
4 import cn.hutool.core.util.StrUtil;
5 import com.iailab.framework.common.pojo.PageResult;
6 import com.iailab.framework.common.util.object.BeanUtils;
7 import com.iailab.module.system.controller.admin.notify.vo.template.NotifyTemplatePageReqVO;
8 import com.iailab.module.system.controller.admin.notify.vo.template.NotifyTemplateSaveReqVO;
9 import com.iailab.module.system.dal.dataobject.notify.NotifyTemplateDO;
10 import com.iailab.module.system.dal.mysql.notify.NotifyTemplateMapper;
11 import com.iailab.module.system.dal.redis.RedisKeyConstants;
12 import com.google.common.annotations.VisibleForTesting;
13 import lombok.extern.slf4j.Slf4j;
14 import org.springframework.cache.annotation.CacheEvict;
15 import org.springframework.cache.annotation.Cacheable;
16 import org.springframework.stereotype.Service;
17 import org.springframework.validation.annotation.Validated;
18
19 import javax.annotation.Resource;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.regex.Pattern;
23
24 import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
25 import static com.iailab.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_CODE_DUPLICATE;
26 import static com.iailab.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_NOT_EXISTS;
27
28 /**
29  * 站内信模版 Service 实现类
30  *
31  * @author xrcoder
32  */
33 @Service
34 @Validated
35 @Slf4j
36 public class NotifyTemplateServiceImpl implements NotifyTemplateService {
37
38     /**
39      * 正则表达式,匹配 {} 中的变量
40      */
41     private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}");
42
43     @Resource
44     private NotifyTemplateMapper notifyTemplateMapper;
45
46     @Override
47     public Long createNotifyTemplate(NotifyTemplateSaveReqVO createReqVO) {
48         // 校验站内信编码是否重复
49         validateNotifyTemplateCodeDuplicate(null, createReqVO.getCode());
50
51         // 插入
52         NotifyTemplateDO notifyTemplate = BeanUtils.toBean(createReqVO, NotifyTemplateDO.class);
53         notifyTemplate.setParams(parseTemplateContentParams(notifyTemplate.getContent()));
54         notifyTemplateMapper.insert(notifyTemplate);
55         return notifyTemplate.getId();
56     }
57
58     @Override
59     @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE,
60             allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理
61     public void updateNotifyTemplate(NotifyTemplateSaveReqVO updateReqVO) {
62         // 校验存在
63         validateNotifyTemplateExists(updateReqVO.getId());
64         // 校验站内信编码是否重复
65         validateNotifyTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode());
66
67         // 更新
68         NotifyTemplateDO updateObj = BeanUtils.toBean(updateReqVO, NotifyTemplateDO.class);
69         updateObj.setParams(parseTemplateContentParams(updateObj.getContent()));
70         notifyTemplateMapper.updateById(updateObj);
71     }
72
73     @VisibleForTesting
74     public List<String> parseTemplateContentParams(String content) {
75         return ReUtil.findAllGroup1(PATTERN_PARAMS, content);
76     }
77
78     @Override
79     @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE,
80             allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理
81     public void deleteNotifyTemplate(Long id) {
82         // 校验存在
83         validateNotifyTemplateExists(id);
84         // 删除
85         notifyTemplateMapper.deleteById(id);
86     }
87
88     private void validateNotifyTemplateExists(Long id) {
89         if (notifyTemplateMapper.selectById(id) == null) {
90             throw exception(NOTIFY_TEMPLATE_NOT_EXISTS);
91         }
92     }
93
94     @Override
95     public NotifyTemplateDO getNotifyTemplate(Long id) {
96         return notifyTemplateMapper.selectById(id);
97     }
98
99     @Override
100     @Cacheable(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, key = "#code",
101             unless = "#result == null")
102     public NotifyTemplateDO getNotifyTemplateByCodeFromCache(String code) {
103         return notifyTemplateMapper.selectByCode(code);
104     }
105
106     @Override
107     public PageResult<NotifyTemplateDO> getNotifyTemplatePage(NotifyTemplatePageReqVO pageReqVO) {
108         return notifyTemplateMapper.selectPage(pageReqVO);
109     }
110
111     @VisibleForTesting
112     void validateNotifyTemplateCodeDuplicate(Long id, String code) {
113         NotifyTemplateDO template = notifyTemplateMapper.selectByCode(code);
114         if (template == null) {
115             return;
116         }
117         // 如果 id 为空,说明不用比较是否为相同 id 的字典类型
118         if (id == null) {
119             throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code);
120         }
121         if (!template.getId().equals(id)) {
122             throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code);
123         }
124     }
125
126     /**
127      * 格式化站内信内容
128      *
129      * @param content 站内信模板的内容
130      * @param params  站内信内容的参数
131      * @return 格式化后的内容
132      */
133     @Override
134     public String formatNotifyTemplateContent(String content, Map<String, Object> params) {
135         return StrUtil.format(content, params);
136     }
137
138 }