diff --git a/ruoyi-models/ruoyi-message/pom.xml b/ruoyi-models/ruoyi-message/pom.xml index 0b5aba006bc4808b5083a1510608f4773284ff26..43b5a0192ea6f7077d35d8c531d26f10da7e961c 100644 --- a/ruoyi-models/ruoyi-message/pom.xml +++ b/ruoyi-models/ruoyi-message/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ruoyi-models - com.ruoyi.geekxd + com.ruoyi 3.8.9-G 4.0.0 @@ -19,27 +19,21 @@ - com.ruoyi.geekxd + com.ruoyi ruoyi-framework - com.ruoyi.geekxd + com.ruoyi ruoyi-common - - - com.ruoyi.geekxd - ruoyi-tfa-phone - - - - com.ruoyi.geekxd - ruoyi-tfa-email + com.ruoyi + ruoyi-auth-starter + \ No newline at end of file diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageSystemController.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageSystemController.java index 9d9a9bf8d81319c4ddf504c38bc731e910ec5824..f76cf28f57e45c9c6cfc287f784e06fb943f6363 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageSystemController.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageSystemController.java @@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; @@ -114,101 +113,46 @@ public class MessageSystemController extends BaseController /** * 批量发送消息 */ - @Operation(summary = "发送消息") - @Log(title = "发送消息", businessType = BusinessType.INSERT) + @Operation(summary = "批量发送消息") + @Log(title = "批量发送消息", businessType = BusinessType.INSERT) @PostMapping @Transactional public AjaxResult batchAdd(@RequestBody List messageSystemList) { try { messageSystemList.forEach(messageSystemService::processMessageSystem); messageSystemService.batchInsertMessageSystem(messageSystemList); - return AjaxResult.success("消息发送成功!"); + return AjaxResult.success("消息发送成功!"); } catch (Exception e) { return AjaxResult.error("消息发送失败", e); } } /** - * 用户点击标题调整信息状态 + * 点击信息详情状态调整为已读 */ - @Operation(summary = "用户点击标题调整信息状态") + @Operation(summary = "点击信息详情状态调整为已读") @PostMapping("/{messageId}") public AjaxResult update(@PathVariable Long messageId){ return success(messageSystemService.updateState(messageId)); } /** - * 查询平台用户 sendMode 进行过滤。 + * 统一查询系统资源信息(角色、部门、用户) + * + * @param type 查询类型:role-角色信息, dept-部门信息, user-用户信息, usersbyrole-根据角色查用户, usersbydept-根据部门查用户, usersbysendmode-根据发送方式查用户 + * @param id 可选参数,当查询特定角色或部门下的用户时使用 + * @param sendMode 可选参数,当查询特定发送方式的用户时使用(phone/email) + * @return 查询结果 */ - @Operation(summary = "查询平台用户") - @GetMapping("/selectUser") - public AjaxResult selectUser(@RequestParam(required = false) String sendMode) { + @Operation(summary = "统一查询系统资源信息") + @GetMapping("/systemResource") + public AjaxResult getSystemResource(@RequestParam String type, @RequestParam(required = false) Long id, + @RequestParam(required = false) String sendMode) { try { - // 非空检查并提供默认值 - if (sendMode == null || sendMode.trim().isEmpty()) { - sendMode = "default"; - } - List list; - switch (sendMode) { - case "1": list = messageSystemService.getUsersFilteredBySendMode("phone"); break; // 短信 - case "2": list = messageSystemService.getUsersFilteredBySendMode("email"); break;// 邮件 - default: list = messageSystemService.selectUser(); break; //默认查询全部的用户 - } - return success(list); + Object result = messageSystemService.querySystemResource(type, id, sendMode); + return AjaxResult.success(result); } catch (ServiceException e) { return AjaxResult.error(e.getMessage()); } } - - /** - * 查询角色信息 - */ - @Operation(summary = "查询角色") - @GetMapping("/selectRole") - public AjaxResult selectRole() { - return success(messageSystemService.selectRole()); - } - - /** - * 查询所有部门信息 - */ - @Operation(summary = "查询部门") - @GetMapping("/selectDept") - public AjaxResult selectDept() { - return success(messageSystemService.selectDept()); - } - - /** - * 根据角色ID获取所有符合条件的用户信息。 - * - * @param roleId 角色ID - * @return 用户信息列表 - */ - @Operation(summary = "根据角色Id查询所有符合条件的用户信息") - @GetMapping("/getUsersByRole/{roleId}") - public AjaxResult selectUsersByRoleId(@PathVariable Long roleId) { - return success(messageSystemService.selectUsersByRoleId(roleId)); - } - - /** - * 根据部门ID获取所有符合条件的用户信息。 - * - * @param deptId 部门ID - * @return 用户信息列表 - */ - @Operation(summary = "根据部门Id查询所有符合条件的用户信息") - @GetMapping("/getUserNameByDeptId/{deptId}") - public AjaxResult getUserNameByDeptId(@PathVariable Long deptId) { - return success(messageSystemService.getUserNameByDeptId(deptId)); - } - - /** - * 查询模版签名 - * @return 模版信息列表 - */ - @Operation(summary = "查询模版签名") - @GetMapping("/selecTemplates") - public AjaxResult selecTemplates() { - return success(messageSystemService.selecTemplates()); - } } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageTemplateController.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageTemplateController.java index 5888d2b542ed2a1a5e46b28ecd896f50d579d78b..6d3af0bcf63a557343ad568694a34dd07ea60969 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageTemplateController.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageTemplateController.java @@ -113,4 +113,14 @@ public class MessageTemplateController extends BaseController { return toAjax(messageTemplateService.deleteMessageTemplateByTemplateIds(templateIds)); } + + /** + * 查询模版签名 + * @return 模版信息列表 + */ + @Operation(summary = "查询模版下拉框") + @GetMapping("/selecTemplates") + public AjaxResult selecTemplates() { + return success(messageTemplateService.selecTemplates()); + } } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageVariableController.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageVariableController.java index a9f715a3ebdfeb5c16f08d0628eb83cc065355a3..6fba84a24bbd3e79c2780dc7ce5a1555ffac38d1 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageVariableController.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/controller/MessageVariableController.java @@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; @@ -22,7 +21,6 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.modelMessage.domain.MessageVariable; import com.ruoyi.modelMessage.service.IMessageVariableService; -import com.ruoyi.modelMessage.utils.MessageSystemUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,9 +40,6 @@ public class MessageVariableController extends BaseController @Autowired private IMessageVariableService messageVariableService; - @Autowired - private MessageSystemUtils messageVariableUtils; - /** * 查询变量管理列表 */ @@ -122,18 +117,9 @@ public class MessageVariableController extends BaseController /** * 查询变量 */ - @Operation(summary = "查询变量") + @Operation(summary = "查询变量下拉框") @GetMapping("/selectMessageVariable") public AjaxResult selectMessageVariable() { return success(messageVariableService.selectMessageVariable()); } - - /** - * 根据变量类型生成不同的变量内容 - */ - @Operation(summary = "根据内置变量生成不同内容") - @GetMapping("/generate") - public AjaxResult generateVariableContent(@RequestParam String variableContent) { - return success(messageVariableUtils.generateVariableContent(variableContent)); - } } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/enums/BuiltInVariableType.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/enums/BuiltInVariableType.java new file mode 100644 index 0000000000000000000000000000000000000000..b0c7063bd270f9c37950064666d4a9ca024df3f9 --- /dev/null +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/enums/BuiltInVariableType.java @@ -0,0 +1,100 @@ +package com.ruoyi.modelMessage.enums; + +import com.ruoyi.auth.common.utils.RandomCodeUtil; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.modelMessage.domain.MessageSystem; + +public enum BuiltInVariableType { + TIME("time", "HH:mm:ss") { + @Override + public String generateValue(MessageSystem message) { + return DateUtils.dateTimeNow(format); + } + }, + DATE("date", "yyyy-MM-dd") { + @Override + public String generateValue(MessageSystem message) { + return DateUtils.dateTimeNow(format); + } + }, + DATETIME("datetime", "yyyy-MM-dd HH:mm:ss") { + @Override + public String generateValue(MessageSystem message) { + return DateUtils.dateTimeNow(format); + } + }, + ADDRESSER("addresser", null) { + @Override + public String generateValue(MessageSystem message) { + return SecurityUtils.getUsername(); + } + }, + CODE("code", null) { + @Override + public String generateValue(MessageSystem message) { + return RandomCodeUtil.numberCode(CODE_LENGTH); + } + }, + RANDOMN_DIGITS("RandomnDigits", null) { + @Override + public String generateValue(MessageSystem message) { + return RandomCodeUtil.numberCode(CODE_LENGTH); + } + }, + RANDOMN_CHARACTERS("RandomnCharacters", null) { + @Override + public String generateValue(MessageSystem message) { + return RandomCodeUtil.code(CODE_LENGTH); + } + }, + RANDOMN_DIGIT_LETTERS("RandomN-digitLetters", null) { + @Override + public String generateValue(MessageSystem message) { + return RandomCodeUtil.code(CODE_LENGTH); + } + }, + RANDOMN_DIGIT_LETTERS_ALT("RandomNDigitLetters", null) { + @Override + public String generateValue(MessageSystem message) { + return RandomCodeUtil.code(CODE_LENGTH); + } + }, + RECIPIENTS("recipients", null) { + @Override + public String generateValue(MessageSystem message) { + return message.getMessageRecipient(); + } + }; + + private final String identifier; + protected final String format; + private static final int CODE_LENGTH = 6; + + BuiltInVariableType(String identifier, String format) { + this.identifier = identifier; + this.format = format; + } + + public String getIdentifier() { + return identifier; + } + + public abstract String generateValue(MessageSystem message); + + public static BuiltInVariableType fromIdentifier(String identifier) { + if (identifier == null) return null; + for (BuiltInVariableType type : values()) { + if (type.identifier.equals(identifier)) { + return type; + } + } + return null; + } + + public static boolean isBuiltInVariable(String identifier) { + return fromIdentifier(identifier) != null; + } +} + + diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageSystemMapper.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageSystemMapper.java index cee9bf7a2024a1529fe981c250593494c8fb454a..ec2fb4e8d2f356f08f89654fb73ffc1c0760f058 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageSystemMapper.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageSystemMapper.java @@ -9,7 +9,6 @@ import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.modelMessage.domain.MessageSystem; -import com.ruoyi.modelMessage.domain.MessageTemplate; /** * 消息管理Mapper接口 @@ -80,14 +79,7 @@ public interface MessageSystemMapper public List selectDept(); // 根据发送方式过滤用户 (短信或邮箱) - @Select("") - List selectUserBySendMode(String filterType); + public List selectUserBySendMode(String filterType); //将信息状态未读信息变为已读 @Update("update message_system set message_status = 1 where message_id = #{messageId} and message_recipient = #{userName}") @@ -112,10 +104,6 @@ public interface MessageSystemMapper @Select("SELECT u.user_name FROM sys_user u JOIN sys_user_role ur ON u.user_id = ur.user_id WHERE ur.role_id = #{roleId}") public List selectUsersByRoleId(Long roleId); - //查询模版签名 - @Select("SELECT template_id,template_code FROM `message_template`") - public List selecTemplates(); - //批量发送信息 public int batchInsertMessageSystem(List messageSystemList); } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageTemplateMapper.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageTemplateMapper.java index 31092e9371ddd7750ce817967b080accc59dd608..ed3f94a7eeb3d1a81c0eb49338599f31783874e8 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageTemplateMapper.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/mapper/MessageTemplateMapper.java @@ -70,4 +70,8 @@ public interface MessageTemplateMapper */ @Select("SELECT template_code,template_variable,template_content FROM `message_template` WHERE template_code = #{templateCode}") public MessageTemplate selectMessageTemplateByTemplateCode(String templateCode); + + //查询模版签名 + @Select("SELECT template_id,template_code FROM `message_template`") + public List selecTemplates(); } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageSystemService.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageSystemService.java index 94763e36e8835d20acd6e7b65501dd67dbfa0b1c..47b142fc414900403e45b3b775e6ebfd1ce4f3e2 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageSystemService.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageSystemService.java @@ -2,11 +2,7 @@ package com.ruoyi.modelMessage.service; import java.util.List; -import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.modelMessage.domain.MessageSystem; -import com.ruoyi.modelMessage.domain.MessageTemplate; /** * 消息管理Service接口 @@ -64,45 +60,22 @@ public interface IMessageSystemService */ public int deleteMessageSystemByMessageId(Long messageId); - //查询系统资源用户信息 - public List selectUser(); - - //将信息状态未读信息变为已读 + //点击信息详情状态调整为已读 public int updateState(Long messageId); //根据发送方式 执行不同操作 public void processMessageSystem(MessageSystem messageSystem); - // 根据发送方式过滤用户 (短信或邮箱) - public List getUsersFilteredBySendMode(String filterType); - - //查询角色信息 然后根据角色把消息发给某角色 - public List selectRole(); - - //查询部门信息 然后根据部门把消息发给某部门 - public List selectDept(); - - /** - * 根据角色ID获取用户列表。 - * - * @param roleId 角色ID - * @return - * - * */ - public List selectUsersByRoleId(Long roleId); - - /** - * 根据部门ID获取用户列表。 - * - * @param deptId 部门ID - * @return - * - * */ - public List getUserNameByDeptId(Long deptId); - - // 查询模版签名 - public List selecTemplates(); - // 批量发送信息 public int batchInsertMessageSystem(List messageSystemList); + + /** + * 统一查询系统资源信息(角色、部门、用户) + * + * @param type 查询类型:role-角色信息, dept-部门信息, user-用户信息, usersbyrole-根据角色查用户, usersbydept-根据部门查用户, usersbysendmode-根据发送方式查用户 + * @param id 可选参数,当查询特定角色或部门下的用户时使用 + * @param sendMode 可选参数,当查询特定发送方式的用户时使用(phone/email) + * @return 查询结果 + */ + public Object querySystemResource(String type, Long id, String sendMode); } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageTemplateService.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageTemplateService.java index c6df315d5a3014fb3d287e3f6cc7e69e6e2aacc4..6c738567eef354d0066a91a44511f666c019be72 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageTemplateService.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/IMessageTemplateService.java @@ -59,4 +59,7 @@ public interface IMessageTemplateService * @return 结果 */ public int deleteMessageTemplateByTemplateId(Long templateId); + + // 查询模版签名 + public List selecTemplates(); } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageSystemServiceImpl.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageSystemServiceImpl.java index fb115d5f9e0ab497e91d4aa15b339bc24035a8fc..16c8f19c863bfee17db957fb815dab5bcf50152c 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageSystemServiceImpl.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageSystemServiceImpl.java @@ -1,8 +1,16 @@ package com.ruoyi.modelMessage.service.impl; -import java.util.Date; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,8 +18,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.alibaba.fastjson2.JSONObject; -import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; @@ -19,10 +25,13 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.modelMessage.domain.MessageSystem; import com.ruoyi.modelMessage.domain.MessageTemplate; +import com.ruoyi.modelMessage.domain.MessageVariable; +import com.ruoyi.modelMessage.enums.BuiltInVariableType; import com.ruoyi.modelMessage.enums.SendMode; import com.ruoyi.modelMessage.mapper.MessageSystemMapper; +import com.ruoyi.modelMessage.mapper.MessageTemplateMapper; +import com.ruoyi.modelMessage.mapper.MessageVariableMapper; import com.ruoyi.modelMessage.service.IMessageSystemService; -import com.ruoyi.modelMessage.utils.MessageSystemUtils; import com.ruoyi.tfa.email.utils.EmailUtil; import com.ruoyi.tfa.phone.config.DySmsConfig; import com.ruoyi.tfa.phone.domain.DySmsTemplate; @@ -44,7 +53,10 @@ public class MessageSystemServiceImpl implements IMessageSystemService { private MessageSystemMapper messageSystemMapper; @Autowired - private MessageSystemUtils messageSystemUtils; + private MessageTemplateMapper messageTemplateMapper; + + @Autowired + private MessageVariableMapper messageVariableMapper; /** * 查询消息管理 @@ -76,11 +88,6 @@ public class MessageSystemServiceImpl implements IMessageSystemService { */ @Override public int insertMessageSystem(MessageSystem messageSystem) { - messageSystem.setMessageStatus("0"); // 默认发送信息为未读状态 - messageSystem.setCreateBy(SecurityUtils.getUsername()); - messageSystem.setUpdateBy(SecurityUtils.getUsername()); - messageSystem.setCreateTime(DateUtils.getNowDate()); - messageSystem.setUpdateTime(DateUtils.getNowDate()); return messageSystemMapper.insertMessageSystem(messageSystem); } @@ -118,12 +125,6 @@ public class MessageSystemServiceImpl implements IMessageSystemService { return messageSystemMapper.deleteMessageSystemByMessageId(messageId); } - // 查询系统资源用户信息 - @Override - public List selectUser() { - return messageSystemMapper.selectUser(); - } - // 收件人为本人的话点击信息详情的时候然后把状态未读信息修改为已读 @Override public int updateState(Long messageId) { @@ -131,76 +132,71 @@ public class MessageSystemServiceImpl implements IMessageSystemService { return result; } - // 根据发送方式过滤用户 (短信或邮箱) - @Override - public List getUsersFilteredBySendMode(String filterType) { - return messageSystemMapper.selectUserBySendMode(filterType); - } - - // 查询角色信息 然后根据角色把消息发给某角色 - @Override - public List selectRole() { - return messageSystemMapper.selectRole(); - } - - // 查询部门信息 然后根据部门把消息发给某部门 - @Override - public List selectDept() { - return messageSystemMapper.selectDept(); - } - - /** - * 根据角色ID获取对应用户信息。 - * - * @param roleId 角色ID - * @return 符合条件的用户列表 - */ - @Override - public List selectUsersByRoleId(Long roleId) { - List roleList = messageSystemMapper.selectUsersByRoleId(roleId); - return roleList; - } - - /** - * 根据角色ID获取用户ID列表。 - * - * @param roleId 角色ID - * @return 用户ID列表 - */ - @Override - public List getUserNameByDeptId(Long deptId) { - List depts = messageSystemMapper.getUserNameByDeptId(deptId); - return depts; - } - - // 查询模版签名 - @Override - public List selecTemplates() { - List templates = messageSystemMapper.selecTemplates(); - return templates; - } - /** * 批量发送信息 */ @Override public int batchInsertMessageSystem(List messageSystemList) { - String username = SecurityUtils.getUsername(); - Date nowDate = DateUtils.getNowDate(); for (MessageSystem messageSystem : messageSystemList) { messageSystem.setMessageStatus("0"); // 默认发送信息为未读状态 - messageSystem.setCreateBy(username); - messageSystem.setUpdateBy(username); - messageSystem.setCreateTime(nowDate); - messageSystem.setUpdateTime(nowDate); + messageSystem.setCreateBy(SecurityUtils.getUsername()); + messageSystem.setUpdateBy(SecurityUtils.getUsername()); + messageSystem.setCreateTime(DateUtils.getNowDate()); + messageSystem.setUpdateTime(DateUtils.getNowDate()); } int result = messageSystemMapper.batchInsertMessageSystem(messageSystemList); if (result <= 0) { - throw new ServiceException("消息发送失败!"); + throw new ServiceException("消息发送失败!"); } return result; } + /** + * 统一查询系统资源信息(角色、部门、用户) + * + * @param type 查询类型:role-角色信息, dept-部门信息, user-用户信息, usersbyrole-根据角色查用户, usersbydept-根据部门查用户, usersbysendmode-根据发送方式查用户 + * @param id 可选参数,当查询特定角色或部门下的用户时使用 + * @param sendMode 可选参数,当查询特定发送方式的用户时使用(phone/email) + * @return 查询结果 + */ + @Override + public Object querySystemResource(String type, Long id, String sendMode) { + switch (type.toLowerCase()) { + case "role": + return messageSystemMapper.selectRole(); + case "dept": + return messageSystemMapper.selectDept(); + case "user": + return messageSystemMapper.selectUser(); + case "usersbyrole": + if (id == null) { + throw new ServiceException("查询角色,角色Id不能为空"); + } + return messageSystemMapper.selectUsersByRoleId(id); + case "usersbydept": + if (id == null) { + throw new ServiceException("查询部门,部门Id不能为空"); + } + return messageSystemMapper.getUserNameByDeptId(id); + case "usersbysendmode": + return getUsersBySendMode(sendMode); + default: + throw new ServiceException("不支持的查询类型: " + type); + } + } + + // 根据传递的值进行过滤筛选不符合的用户 + private List getUsersBySendMode(String sendMode) { + if (sendMode == null || sendMode.trim().isEmpty()) { + sendMode = "default"; + } + switch (sendMode) { + case "1": return messageSystemMapper.selectUserBySendMode("phone"); + case "2": return messageSystemMapper.selectUserBySendMode("email"); + default: return messageSystemMapper.selectUser(); + } + } + /** * 根据 MessageSystem 对象的 sendMode 属性处理消息的发送方式 */ @@ -209,12 +205,13 @@ public class MessageSystemServiceImpl implements IMessageSystemService { if (messageSystem == null || messageSystem.getSendMode() == null) { throw new ServiceException("无效的消息系统对象或发送方式!"); } + String sendModeStr = messageSystem.getSendMode(); SendMode sendMode; try { sendMode = SendMode.fromCode(sendModeStr); } catch (IllegalArgumentException e) { - throw new ServiceException("类型转换失败: " + sendModeStr); + throw new ServiceException("不支持的消息发送方式: " + sendModeStr); } switch (sendMode) { case PHONE: @@ -227,7 +224,7 @@ public class MessageSystemServiceImpl implements IMessageSystemService { sendPlatformMessage(messageSystem); break; default: - throw new ServiceException("未知的发送方式!"); + throw new ServiceException("不支持的发送方式: " + sendMode); } } @@ -238,9 +235,9 @@ public class MessageSystemServiceImpl implements IMessageSystemService { String notificationContent = messageSystem.getMessageContent(); try { String filledMessage = notificationContent.startsWith("SMS_") - ? messageSystemUtils.processTemplateMessage(messageSystem, notificationContent) + ? processTemplateMessage(messageSystem, notificationContent) : notificationContent; // 是自定义输入,使用用户输入的内容 - log.info("平台内容: {}", filledMessage); + log.info("平台发送成功: {}", filledMessage); messageSystem.setMessageContent(filledMessage); } catch (Exception e) { log.error("发送平台消息时发生异常: ", e); @@ -254,13 +251,13 @@ public class MessageSystemServiceImpl implements IMessageSystemService { public void handleEmailNotification(MessageSystem messageSystem) { String email = messageSystem.getCode(); if (StringUtils.isEmpty(email)) { - throw new ServiceException("邮箱地址不能为空!"); + throw new ServiceException("邮箱不能为空!"); } try { String filledMessage = messageSystem.getMessageContent().startsWith("SMS_") - ? messageSystemUtils.processTemplateMessage(messageSystem, messageSystem.getMessageContent()) + ? processTemplateMessage(messageSystem, messageSystem.getMessageContent()) : messageSystem.getMessageContent(); // 是自定义输入,则直接使用用户提供的内容 - log.info("邮件内容: {}", filledMessage); + log.info("邮件发送成功: {}", filledMessage); messageSystem.setMessageContent(filledMessage); EmailUtil.sendMessage(email, "通知", filledMessage); } catch (Exception e) { @@ -276,30 +273,224 @@ public class MessageSystemServiceImpl implements IMessageSystemService { public void sendNotificationMessage(MessageSystem messageSystem) { String phone = messageSystem.getCode(); if (StringUtils.isEmpty(phone)) { - throw new ServiceException("手机号码为空!"); + throw new ServiceException("手机号码不能为空!"); + } + // 检查短信配置 + if (dySmsConfig == null || dySmsConfig.getTemplate() == null || dySmsConfig.getTemplate().isEmpty()) { + throw new ServiceException("短信配置或模板未正确加载"); } try { - // 解析并处理模板消息 - Map parsedParams = messageSystemUtils.parseInput(messageSystem.getMessageContent()); + // 解析消息内容获取模板信息和参数 + Map parsedParams= parseInput(messageSystem.getMessageContent()); String templateCode = (String) parsedParams.get("templateCode"); - DySmsTemplate dySmsTemplate = null; - if (templateCode != null) { - dySmsTemplate = dySmsConfig.getTemplate().get(templateCode); - Map params = (Map) parsedParams.get("params"); - // 提取模板中的变量名并填充内置变量 - List variableNames = (List) parsedParams.get("variableNames"); - messageSystemUtils.fillBuiltInVariables(params, messageSystem, variableNames); - String filledMessage = messageSystemUtils.fillTemplate((String) parsedParams.get("templateContent"), - params); - messageSystem.setMessageContent(filledMessage); - JSONObject templateParamJson = new JSONObject(params); - DySmsUtil.sendSms(phone, dySmsTemplate, templateParamJson); - } else { - DySmsUtil.sendSms(phone, null, null); + if (templateCode == null) { + throw new ServiceException("消息内容中未包含有效的模板代码"); + } + // 查找匹配的模板 + DySmsTemplate dySmsTemplate = dySmsConfig.getTemplate().get(templateCode); + // 如果直接匹配失败,尝试通过模板代码匹配 + if (dySmsTemplate == null) { + for (DySmsTemplate template : dySmsConfig.getTemplate().values()) { + if (templateCode.equals(template.getTemplateCode())) { + dySmsTemplate = template; + break; + } + } + } + // 如果还是没找到且只有一个模板,直接使用 + if (dySmsTemplate == null && dySmsConfig.getTemplate().size() == 1) { + dySmsTemplate = dySmsConfig.getTemplate().values().iterator().next(); + } + if (dySmsTemplate == null) { + throw new ServiceException("未找到短信模板: " + templateCode + ",请检查配置"); } + // 获取并填充参数 + Map params = (Map) parsedParams.get("params"); + List variableNames = (List) parsedParams.get("variableNames"); + fillBuiltInVariables(params, messageSystem, new HashSet<>(variableNames)); + // 获取模板内容并填充变量,生成最终的消息内容 + String templateContent = (String) parsedParams.get("templateContent"); + if (templateContent != null) { + String filledContent = fillTemplate(templateContent, params); + messageSystem.setMessageContent(filledContent); // 更新为填充后的内容 + } + // 构造 JSON 参数并发送短信 + JSONObject templateParamJson = new JSONObject(params); + DySmsUtil.sendSms(phone, dySmsTemplate, templateParamJson); + log.info("短信发送成功 - 手机号: {}, 模板: {}, 参数: {}", phone, templateCode, templateParamJson); } catch (Exception e) { log.error("发送短信时发生异常: ", e); throw new ServiceException("发送短信异常:" + e.getMessage()); } } + + /** + * 解析输入字符串,提取模板代码和参数 + */ + public Map parseInput(String input) { + if (input == null || input.trim().isEmpty()) { + throw new ServiceException("输入内容不能为空!"); + } + String templateCode = null; + String queryParams = ""; + // 支持 SMS_ 开头的模板代码或者配置中的模板名 + if (input.startsWith("SMS_")) { + int templateCodeEndIndex = input.indexOf('?'); + if (templateCodeEndIndex != -1) { + templateCode = input.substring(0, templateCodeEndIndex); + queryParams = input.substring(templateCodeEndIndex + 1); + } else { + templateCode = input; + } + } + MessageTemplate templateContent = null; + List variableNames = new ArrayList<>(); + if (templateCode != null) { + templateContent = messageTemplateMapper.selectMessageTemplateByTemplateCode(templateCode); + if (templateContent == null) { + throw new ServiceException("未找到该模版签名! " + templateCode); + } + variableNames = extractVariableNamesFromTemplate(templateContent); + } + Map params = new HashMap<>(); + if (!queryParams.isEmpty()) { + for (String param : queryParams.split("&")) { + String[] keyValue = param.split("=", 2); + if (keyValue.length != 2) { + throw new ServiceException("无效的参数格式: " + param + ",请使用 key=value 格式"); + } + String value = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8); + params.put(keyValue[0], value); + } + } + if (templateContent != null) { + for (String varName : variableNames) { + params.putIfAbsent(varName, null); + } + } + return Map.of( "templateCode", templateCode, "params", params, + "templateContent", templateContent != null ? templateContent.getTemplateContent() : input, + "variableNames", variableNames ); + } + + /** + * 提取模板中的变量名 + */ + public List extractVariableNamesFromTemplate(MessageTemplate templateContent) { + List variableNames = new ArrayList<>(); + Pattern pattern = Pattern.compile("\\$\\{(.*?)\\}"); + Matcher matcher = pattern.matcher(templateContent.getTemplateContent()); + while (matcher.find()) { + variableNames.add(matcher.group(1)); + } + return variableNames; + } + + /** + * 填充模板内容 + */ + public String fillTemplate(String template, Map params) { + StringBuilder sb = new StringBuilder(template); + for (Map.Entry entry : params.entrySet()) { + String key = "${" + entry.getKey() + "}"; + String value = Optional.ofNullable(entry.getValue()).orElse(""); + + int index; + while ((index = sb.indexOf(key)) != -1) { + sb.replace(index, index + key.length(), value); + } + } + return sb.toString(); + } + + /** + * 清除内置变量的随机数字 + */ + public void clearBuiltInVariables(Map params) { + List builtInVariables = messageVariableMapper.selectMessageVariable(); + for (MessageVariable variable : builtInVariables) { + String variableContent = variable.getVariableContent(); + params.remove(variableContent); + } + } + + /** + * 处理模板消息并填充所有类型的变量 + */ + @SuppressWarnings("unchecked") + public String processTemplateMessage(MessageSystem messageSystem, String notificationContent) throws Exception { + Map parsedParams = parseInput(notificationContent); + String templateCode = (String) parsedParams.get("templateCode"); + MessageTemplate templateContent = null; + if (templateCode != null) { + templateContent = messageTemplateMapper.selectMessageTemplateByTemplateCode(templateCode); + } + Map params = (Map) parsedParams.get("params"); + List variableNames = new ArrayList<>(); + if (templateContent != null) { + variableNames = extractVariableNamesFromTemplate(templateContent); + } + Set variableNameSet = new HashSet<>(variableNames); + clearBuiltInVariables(params); + fillBuiltInVariables(params, messageSystem, variableNameSet); + for (String varName : variableNameSet) { + if (!params.containsKey(varName) || params.get(varName) == null) { + params.put(varName, "[变量未设置: " + varName + "]"); + } + } + String templateContentStr = templateContent != null ? + templateContent.getTemplateContent() : notificationContent; + return fillTemplate(templateContentStr, params); + } + + /** + * 填充所有类型的变量 + */ + public void fillBuiltInVariables(Map params, MessageSystem message, Set variableNameSet) { + List allVariables = messageVariableMapper.selectMessageVariables(new ArrayList<>(variableNameSet)); + for (MessageVariable variable : allVariables) { + String variableType = variable.getVariableType(); + String variableContent = variable.getVariableContent(); + String variableName = variable.getVariableName(); + if ("内置变量".equals(variableType)) { + boolean matchByContent = variableNameSet.contains(variableContent); + boolean matchByName = variableNameSet.contains(variableName); + if (matchByContent || matchByName) { + String keyToUse = matchByContent ? variableContent : variableName; + // 处理内置变量 + if (BuiltInVariableType.isBuiltInVariable(variableContent)) { + // 只有当参数不存在或为空时才生成内置变量的值 + if (!params.containsKey(keyToUse) || params.get(keyToUse) == null || params.get(keyToUse).isEmpty()) { + params.put(keyToUse, BuiltInVariableType.fromIdentifier(variableContent).generateValue(message)); + } + } else if ("recipients".equals(variableContent) || "收件人".equals(variableName)) { + // 收件人变量总是使用实际的收件人信息 + params.put(keyToUse, message.getMessageRecipient()); + } + } + } else if ("指定文本".equals(variableType)) { + if (BuiltInVariableType.isBuiltInVariable(variableContent) && variableNameSet.contains(variableContent)) { + // 只有当参数不存在或为空时才生成内置变量的值 + if (!params.containsKey(variableContent) || params.get(variableContent) == null || params.get(variableContent).isEmpty()) { + params.put(variableContent, BuiltInVariableType.fromIdentifier(variableContent).generateValue(message)); + } + } else if ("recipients".equals(variableContent) && variableNameSet.contains(variableName)) { + params.put(variableName, message.getMessageRecipient()); + } else if (variableNameSet.contains(variableName)) { + if (!params.containsKey(variableName) || params.get(variableName) == null) { + params.put(variableName, variableContent); + } + } + } else { + if (BuiltInVariableType.isBuiltInVariable(variableContent) && variableNameSet.contains(variableContent)) { + // 只有当参数不存在或为空时才生成内置变量的值 + if (!params.containsKey(variableContent) || params.get(variableContent) == null || params.get(variableContent).isEmpty()) { + params.put(variableContent, BuiltInVariableType.fromIdentifier(variableContent).generateValue(message)); + } + } else if ("recipients".equals(variableContent) && variableNameSet.contains(variableName)) { + params.put(variableName, message.getMessageRecipient()); + } + } + } + } } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageTemplateServiceImpl.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageTemplateServiceImpl.java index 2933003f7c977e7613ac115accd46a13f49f252b..27d59aaac1b0521f868cf45bcfc0827c033b6b3d 100644 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageTemplateServiceImpl.java +++ b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/service/impl/MessageTemplateServiceImpl.java @@ -101,4 +101,11 @@ public class MessageTemplateServiceImpl implements IMessageTemplateService { return messageTemplateMapper.deleteMessageTemplateByTemplateId(templateId); } + + // 查询模版签名 + @Override + public List selecTemplates() { + List templates = messageTemplateMapper.selecTemplates(); + return templates; + } } diff --git a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/utils/MessageSystemUtils.java b/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/utils/MessageSystemUtils.java deleted file mode 100644 index 325c56f727f801c4396b0dbc75584be41ad4c1d1..0000000000000000000000000000000000000000 --- a/ruoyi-models/ruoyi-message/src/main/java/com/ruoyi/modelMessage/utils/MessageSystemUtils.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.ruoyi.modelMessage.utils; - -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.modelMessage.domain.MessageSystem; -import com.ruoyi.modelMessage.domain.MessageTemplate; -import com.ruoyi.modelMessage.domain.MessageVariable; -import com.ruoyi.modelMessage.mapper.MessageTemplateMapper; -import com.ruoyi.modelMessage.mapper.MessageVariableMapper; - -@Component -public class MessageSystemUtils { - - private static final String NUMERIC_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - private static final int CODE_LENGTH = 6; - - @Autowired - private MessageTemplateMapper messageTemplateMapper; - - @Autowired - private MessageVariableMapper messageVariableMapper; - - /** - * 解析输入字符串,提取模板代码和参数 - * - * @param input 输入字符串 - * @return 解析结果 - */ - public Map parseInput(String input) { - if (input == null) { - throw new ServiceException("输入内容不能为空!"); - } - String templateCode = null; - String queryParams = ""; - if (input.startsWith("SMS_")) { - int templateCodeEndIndex = input.indexOf('?'); - if (templateCodeEndIndex != -1) { - templateCode = input.substring(0, templateCodeEndIndex); - queryParams = input.substring(templateCodeEndIndex + 1); - } else { - templateCode = input; - } - } - MessageTemplate templateContent = null; - List variableNames = new ArrayList<>(); - if (templateCode != null) { - templateContent = messageTemplateMapper.selectMessageTemplateByTemplateCode(templateCode); - if (templateContent == null) { - throw new ServiceException("未找到该模版签名! " + templateCode); - } - variableNames = extractVariableNamesFromTemplate(templateContent); - } - - Map params = new HashMap<>(); - if (!queryParams.isEmpty()) { - for (String param : queryParams.split("&")) { - String[] keyValue = param.split("=", 2); - if (keyValue.length != 2) { - throw new ServiceException("无效的参数格式:" + param); - } - params.put(keyValue[0], URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8)); - } - } - if (templateContent != null) { - for (String varName : variableNames) { - if (!params.containsKey(varName)) { - params.put(varName, null); //默认先不传递 等自动填充值 - } - } - } - return Map.of("templateCode", templateCode, "params", params, - "templateContent", templateContent != null ? templateContent.getTemplateContent() : input, - "variableNames", variableNames); - } - - /** - * 提取模板中的变量名 - * - * @param templateContent 模板内容 - * @return 变量名列表 - */ - public List extractVariableNamesFromTemplate(MessageTemplate templateContent) { - List variableNames = new ArrayList<>(); - Pattern pattern = Pattern.compile("\\$\\{(.*?)\\}"); - Matcher matcher = pattern.matcher(templateContent.getTemplateContent()); - while (matcher.find()) { - variableNames.add(matcher.group(1)); - } - return variableNames; - } - - /** - * 填充模板 - * - * @param template 模板 - * @param params 参数 - * @return 填充后的模板 - */ - public String fillTemplate(String template, Map params) { - String filledTemplate = template; - for (Map.Entry entry : params.entrySet()) { - filledTemplate = filledTemplate.replace("${" + entry.getKey() + "}", entry.getValue()); - } - return filledTemplate; - } - - /** - * 清除内置变量的随机数字 - * - * @param params 参数 - */ - public void clearBuiltInVariables(Map params) { - List builtInVariables = messageVariableMapper.selectMessageVariable(); - for (MessageVariable variable : builtInVariables) { - String variableContent = variable.getVariableContent(); - params.remove(variableContent); - } - } - - /** - * 处理模板消息并填充内置变量 - */ - public String processTemplateMessage(MessageSystem messageSystem, String notificationContent) throws Exception { - Map parsedParams = parseInput(notificationContent); - String templateCode = (String) parsedParams.get("templateCode"); - MessageTemplate templateContent = null; - - if (templateCode != null) { - templateContent = messageTemplateMapper.selectMessageTemplateByTemplateCode(templateCode); //查询获取模版内容 - } - - @SuppressWarnings("unchecked") - Map params = (Map) parsedParams.get("params"); - - // 检查参数 - List variableNames = new ArrayList<>(); - if (templateContent != null) { - variableNames = extractVariableNamesFromTemplate(templateContent); - for (String varName : variableNames) { - if (!params.containsKey(varName)) { - throw new ServiceException("缺少参数: " + varName); - } - } - } - clearBuiltInVariables(params); // 清除内置变量 - fillBuiltInVariables(params, messageSystem, variableNames); - // 如果未找到模板,使用原始内容作为模板 - String templateContentStr = templateContent != null ? templateContent.getTemplateContent() : notificationContent; - return fillTemplate(templateContentStr, params); - } - - /** - * 填充内置变量 - * - * @param params 参数 - * @param message 消息 - * @param variableNames 变量名列表 - */ - public void fillBuiltInVariables(Map params, MessageSystem message, List variableNames) { - List builtInVariables = messageVariableMapper.selectMessageVariables(variableNames); - for (MessageVariable variable : builtInVariables) { - String variableContent = variable.getVariableContent(); - String variableValue = "recipients".equals(variableContent) ? message.getMessageRecipient() : generateVariableContent(variableContent); - params.putIfAbsent(variableContent, variableValue); - } - } - - /** - * 生成变量内容 - * - * @param variableContent 变量内容 - * @return 生成的变量内容 - */ - public String generateVariableContent(String variableContent) { - switch (variableContent) { - case "time": - return DateUtils.dateTimeNow("HH:mm:ss"); //发送时间 - case "date": - return DateUtils.dateTimeNow("yyyy-MM-dd"); //发送日期 - case "datetime": - return DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss"); //发送日期+时间 - case "addresser": - return SecurityUtils.getUsername(); //发件人 - case "code": - case "RandomnDigits": - case "RandomnCharacters": - case "RandomN-digitLetters": - return generateRandomCode(CODE_LENGTH); //随机数字+英文 - default: - throw new ServiceException("不明确的类型 " + variableContent); - } - } - - /** - * 生成指定长度的随机数字字符串 数字+英文 - * - * @param length 长度 - * @return 随机数字字符串 - */ - public String generateRandomCode(int length) { - Random random = new Random(); - StringBuilder codeBuilder = new StringBuilder(length); - for (int i = 0; i < length; i++) { - int index = random.nextInt(NUMERIC_CHARACTERS.length()); - char randomChar = NUMERIC_CHARACTERS.charAt(index); - codeBuilder.append(randomChar); - } - return codeBuilder.toString(); - } -} diff --git a/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageSystemMapper.xml b/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageSystemMapper.xml index 3ba71d3f4a9b3145ead79d7c1e7c1d8bcdcedcde..7f13324b5154489fb8ec3aaaf535c841e0714add 100644 --- a/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageSystemMapper.xml +++ b/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageSystemMapper.xml @@ -114,5 +114,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" NOW(), #{item.remark} ) - - \ No newline at end of file + + + \ No newline at end of file diff --git a/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageVariableMapper.xml b/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageVariableMapper.xml index ce956845a4d9037b54d8fd155e861fe37a91530c..e89f028dc0b1f4b0002f8302c40f7a3e06225b31 100644 --- a/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageVariableMapper.xml +++ b/ruoyi-models/ruoyi-message/src/main/resources/mapper/modelMessage/MessageVariableMapper.xml @@ -84,7 +84,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"