From 15f28dcd351bd484c4082c9f8c7bb96c76bf929b Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Mon, 3 Nov 2025 17:24:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(personal):=20=E4=BF=AE=E6=94=B9=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E6=A0=A1=E9=AA=8C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在UserDTO中增加验证码字段用于手机号修改校验 - 修改用户信息时增加短信验证码校验逻辑 - 新增验证码错误提示信息到i18n配置 - 扩展SysMessageService支持区分已注册/未注册手机号验证 --- .../common/core/exception/ErrorCodes.java | 167 ++-- .../resources/i18n/messages_zh_CN.properties | 3 +- .../pig4cloud/pigx/admin/api/dto/UserDTO.java | 54 +- .../controller/SysMessageController.java | 21 +- .../pigx/admin/service/SysMessageService.java | 14 +- .../service/impl/SysMessageServiceImpl.java | 764 +++++++++--------- .../service/impl/SysUserServiceImpl.java | 11 +- 7 files changed, 544 insertions(+), 490 deletions(-) diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java index 08c223cb1..4e2bb402e 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java @@ -8,106 +8,111 @@ package com.pig4cloud.pigx.common.core.exception; */ public interface ErrorCodes { - /** - * 系统编码错误 - */ - String SYS_PARAM_CONFIG_ERROR = "sys.param.config.error"; + /** + * 系统编码错误 + */ + String SYS_PARAM_CONFIG_ERROR = "sys.param.config.error"; - /** - * 系统内置参数不能删除 - */ - String SYS_PARAM_DELETE_SYSTEM = "sys.param.delete.system"; + /** + * 系统内置参数不能删除 + */ + String SYS_PARAM_DELETE_SYSTEM = "sys.param.delete.system"; - /** - * 用户已存在 - */ - String SYS_USER_USERNAME_EXISTING = "sys.user.username.existing"; + /** + * 用户已存在 + */ + String SYS_USER_USERNAME_EXISTING = "sys.user.username.existing"; - /** - * 用户已存在 - */ - String SYS_USER_PHONE_EXISTING = "sys.user.phone.existing"; + /** + * 用户已存在 + */ + String SYS_USER_PHONE_EXISTING = "sys.user.phone.existing"; - /** - * 用户原密码错误,修改失败 - */ - String SYS_USER_UPDATE_PASSWORDERROR = "sys.user.update.passwordError"; + /** + * 用户原密码错误,修改失败 + */ + String SYS_USER_UPDATE_PASSWORDERROR = "sys.user.update.passwordError"; - /** - * 用户信息为空 - */ - String SYS_USER_USERINFO_EMPTY = "sys.user.userInfo.empty"; + /** + * 用户信息为空 + */ + String SYS_USER_USERINFO_EMPTY = "sys.user.userInfo.empty"; - /** - * 获取当前用户信息失败 - */ - String SYS_USER_QUERY_ERROR = "sys.user.query.error"; + /** + * 获取当前用户信息失败 + */ + String SYS_USER_QUERY_ERROR = "sys.user.query.error"; - String SYS_USER_IMPORT_SUCCEED = "sys.user.import.succeed"; + String SYS_USER_IMPORT_SUCCEED = "sys.user.import.succeed"; - /** - * 部门名称不存在 - */ - String SYS_DEPT_DEPTNAME_INEXISTENCE = "sys.dept.deptName.inexistence"; + /** + * 部门名称不存在 + */ + String SYS_DEPT_DEPTNAME_INEXISTENCE = "sys.dept.deptName.inexistence"; - /** - * 岗位名称不存在 - */ - String SYS_POST_POSTNAME_INEXISTENCE = "sys.post.postName.inexistence"; + /** + * 岗位名称不存在 + */ + String SYS_POST_POSTNAME_INEXISTENCE = "sys.post.postName.inexistence"; - /** - * 岗位名称或编码已经存在 - */ - String SYS_POST_NAMEORCODE_EXISTING = "sys.post.nameOrCode.existing"; + /** + * 岗位名称或编码已经存在 + */ + String SYS_POST_NAMEORCODE_EXISTING = "sys.post.nameOrCode.existing"; - /** - * 角色名称不存在 - */ - String SYS_ROLE_ROLENAME_INEXISTENCE = "sys.role.roleName.inexistence"; + /** + * 角色名称不存在 + */ + String SYS_ROLE_ROLENAME_INEXISTENCE = "sys.role.roleName.inexistence"; - /** - * 角色名或角色编码已经存在 - */ - String SYS_ROLE_NAMEORCODE_EXISTING = "sys.role.nameOrCode.existing"; + /** + * 角色名或角色编码已经存在 + */ + String SYS_ROLE_NAMEORCODE_EXISTING = "sys.role.nameOrCode.existing"; - /** - * 菜单存在下级节点 删除失败 - */ - String SYS_MENU_DELETE_EXISTING = "sys.menu.delete.existing"; + /** + * 菜单存在下级节点 删除失败 + */ + String SYS_MENU_DELETE_EXISTING = "sys.menu.delete.existing"; - /** - * 系统内置字典不允许删除 - */ - String SYS_DICT_DELETE_SYSTEM = "sys.dict.delete.system"; + /** + * 系统内置字典不允许删除 + */ + String SYS_DICT_DELETE_SYSTEM = "sys.dict.delete.system"; - /** - * 系统内置字典不能修改 - */ - String SYS_DICT_UPDATE_SYSTEM = "sys.dict.update.system"; + /** + * 系统内置字典不能修改 + */ + String SYS_DICT_UPDATE_SYSTEM = "sys.dict.update.system"; - /** - * 验证码发送频繁 - */ - String SYS_APP_SMS_OFTEN = "sys.app.sms.often"; + /** + * 验证码发送频繁 + */ + String SYS_APP_SMS_OFTEN = "sys.app.sms.often"; - /** - * 手机号未注册 - */ - String SYS_APP_PHONE_UNREGISTERED = "sys.app.phone.unregistered"; + /** + * 系统应用短信错误编码 + */ + String SYS_APP_SMS_ERROR = "sys.app.sms.error"; - /** - * 企微调用接口错误 - */ - String SYS_CONNECT_CP_DEPT_SYNC_ERROR = "sys.connect.cp.dept.sync.error"; + /** + * 手机号未注册 + */ + String SYS_APP_PHONE_UNREGISTERED = "sys.app.phone.unregistered"; - /** - * 企微调用接口错误 - */ - String SYS_CONNECT_CP_USER_SYNC_ERROR = "sys.connect.cp.user.sync.error"; + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_DEPT_SYNC_ERROR = "sys.connect.cp.dept.sync.error"; - /** - * 用户信息为空 - */ - String APP_USER_USERINFO_EMPTY = "app.user.userInfo.empty"; + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_USER_SYNC_ERROR = "sys.connect.cp.user.sync.error"; + + /** + * 用户信息为空 + */ + String APP_USER_USERINFO_EMPTY = "app.user.userInfo.empty"; } diff --git a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties index 0699ff526..96cff7f7b 100644 --- a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties @@ -2,7 +2,7 @@ sys.user.update.passwordError=\u539F\u5BC6\u7801\u9519\u8BEF\uFF0C\u4FEE\u6539\u sys.user.query.error=\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u5931\u8D25 sys.user.import.succeed=\u7528\u6237\u5BFC\u5165\u6210\u529F\uFF0C\u9ED8\u8BA4\u5BC6\u7801\u4E3A\u624B\u673A\u53F7 sys.user.username.existing={0} \u7528\u6237\u540D\u5DF2\u5B58\u5728 -sys.user.phone.existing={0} \u624b\u673a\u53f7\u5df2\u5b58\u5728 +sys.user.phone.existing={0} \u624B\u673A\u53F7\u5DF2\u5B58\u5728 sys.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A sys.dept.deptName.inexistence={0} \u90E8\u95E8\u540D\u79F0\u4E0D\u5B58\u5728 sys.post.postName.inexistence={0} \u5C97\u4F4D\u540D\u79F0\u4E0D\u5B58\u5728 @@ -13,6 +13,7 @@ sys.param.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u53C2\u6570\u4E0D\u80FD\u5220\u sys.param.config.error={0} \u7CFB\u7EDF\u53C2\u6570\u914D\u7F6E\u9519\u8BEF sys.menu.delete.existing=\u83DC\u5355\u542B\u6709\u4E0B\u7EA7\u4E0D\u80FD\u5220\u9664 sys.app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41 +sys.app.sms.error=\u9A8C\u8BC1\u7801\u9519\u8BEF sys.app.phone.unregistered={0} \u624B\u673A\u53F7\u672A\u6CE8\u518C sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u5220\u9664 sys.dict.update.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u4FEE\u6539 diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java index 19b9d22b9..7a93923ec 100644 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/UserDTO.java @@ -35,33 +35,39 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) public class UserDTO extends SysUser { - /** - * 角色ID - */ - @Schema(description = "角色id集合") - private List role; + /** + * 角色ID + */ + @Schema(description = "角色id集合") + private List role; - /** - * 部门id - */ - @Schema(description = "部门id") - private Long deptId; + /** + * 部门id + */ + @Schema(description = "部门id") + private Long deptId; - /** - * 部门id集合(支持多部门) - */ - @Schema(description = "部门id集合") - private List deptIds; + /** + * 部门id集合(支持多部门) + */ + @Schema(description = "部门id集合") + private List deptIds; - /** - * 岗位ID - */ - private List post; + /** + * 岗位ID + */ + private List post; - /** - * 新密码 - */ - @Schema(description = "新密码") - private String newpassword1; + /** + * 新密码 + */ + @Schema(description = "新密码") + private String newpassword1; + + /** + * 验证码 + */ + @Schema(description = "验证码") + private String code; } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java index a9a78a766..978211887 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMessageController.java @@ -182,18 +182,31 @@ public class SysMessageController { } /** - * 发送短信验证码 - * @param mobile 手机号 + * 发送短信(验证码) + * + * @param mobile 手机号 (需要注册,对外提供,安全性第一) * @return {@link R } */ @Inner(value = false) @GetMapping("/send/smsCode") public R sendSmsCode(@RequestParam String mobile) { - return sysMessageService.sendSmsCode(mobile); + return sysMessageService.sendSmsCode(mobile, true); + } + + /** + * 发送内部短信验证码 + * + * @param mobile 手机号码 (系统内不一定存在) + * @return 发送结果 + */ + @GetMapping("/send/smsInnerCode") + public R sendSmsInnerCode(@RequestParam String mobile) { + return sysMessageService.sendSmsCode(mobile, false); } /** * 发送短信 + * * @param messageSmsDTO 消息 短信 DTO * @return {@link R } */ @@ -204,6 +217,7 @@ public class SysMessageController { /** * 发送邮件 + * * @param messageEmailDTO 留言内容 电子邮件 DTO * @return {@link R } */ @@ -214,6 +228,7 @@ public class SysMessageController { /** * 发送 webhook + * * @param messageHookDTO 消息挂钩 DTO * @return {@link R } */ diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java index 400acd4ff..14ccb1699 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMessageService.java @@ -37,6 +37,7 @@ public interface SysMessageService extends IService { /** * 读取信息 + * * @param id id * @return true/false */ @@ -44,6 +45,7 @@ public interface SysMessageService extends IService { /** * 获取信息 + * * @param id id * @return messageVO */ @@ -61,13 +63,16 @@ public interface SysMessageService extends IService { /** * 发送手机验证码 - * @param mobile mobile - * @return code + * + * @param mobile 手机号码 + * @param registered 是否已注册 + * @return 发送结果 */ - R sendSmsCode(String mobile); + R sendSmsCode(String mobile, boolean registered); /** * 发送短信 + * * @param messageSmsDTO 消息 短信 DTO * @return {@link R } */ @@ -75,6 +80,7 @@ public interface SysMessageService extends IService { /** * 发送邮件 + * * @param messageEmailDTO 留言内容 电子邮件 DTO * @return {@link R } */ @@ -82,6 +88,7 @@ public interface SysMessageService extends IService { /** * 发送钩子消息 + * * @param messageHookDTO 消息挂钩 DTO * @return {@link R } */ @@ -89,6 +96,7 @@ public interface SysMessageService extends IService { /** * 列出 Hook 业务代码 + * * @param messageHookDTO 消息钩子 DTO * @return {@link R } */ diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java index cebfeb7bc..b48263765 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMessageServiceImpl.java @@ -97,428 +97,438 @@ import java.util.Objects; @Service @RequiredArgsConstructor public class SysMessageServiceImpl extends ServiceImpl - implements SysMessageService { + implements SysMessageService { - /** - * 支持短信服务商 - */ - private static final Class[] SUPPORT_CONFIG_CLAZZ = { AlibabaConfig.class, CloopenConfig.class, CtyunConfig.class, - EmayConfig.class, HuaweiConfig.class, JdCloudConfig.class, NeteaseConfig.class, TencentConfig.class, - UniConfig.class, YunpianConfig.class, ZhutongConfig.class, DingZhongConfig.class, QiNiuConfig.class }; + /** + * 支持短信服务商 + */ + private static final Class[] SUPPORT_CONFIG_CLAZZ = {AlibabaConfig.class, CloopenConfig.class, CtyunConfig.class, + EmayConfig.class, HuaweiConfig.class, JdCloudConfig.class, NeteaseConfig.class, TencentConfig.class, + UniConfig.class, YunpianConfig.class, ZhutongConfig.class, DingZhongConfig.class, QiNiuConfig.class}; - private final RemoteLogService remoteLogService; + private final RemoteLogService remoteLogService; - private final SysSystemConfigMapper sysSystemConfigMapper; + private final SysSystemConfigMapper sysSystemConfigMapper; - private final SysMessageRelationMapper relationMapper; + private final SysMessageRelationMapper relationMapper; - private final SysUserMapper userMapper; + private final SysUserMapper userMapper; - private final SysFileMapper fileMapper; + private final SysFileMapper fileMapper; - private final FileTemplate fileTemplate; + private final FileTemplate fileTemplate; - /** - * 发送信息 - * @param id id - * @return true/false - */ - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean sendMessage(Long id) { - // 更新信息状态 - SysMessageEntity sysMessage = new SysMessageEntity(); - sysMessage.setSendFlag(YesNoEnum.YES.getCode()); - baseMapper.update(sysMessage, Wrappers.lambdaQuery().eq(SysMessageEntity::getId, id)); - return Boolean.TRUE; - } + /** + * 发送信息 + * + * @param id id + * @return true/false + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean sendMessage(Long id) { + // 更新信息状态 + SysMessageEntity sysMessage = new SysMessageEntity(); + sysMessage.setSendFlag(YesNoEnum.YES.getCode()); + baseMapper.update(sysMessage, Wrappers.lambdaQuery().eq(SysMessageEntity::getId, id)); + return Boolean.TRUE; + } - /** - * 保存消息及其关联关系 - * @param sysMessage 消息对象 - * @return 是否保存成功 - */ - @Transactional(rollbackFor = Exception.class) - public Boolean saveOrUpdateMessage(SysMessageVO sysMessage) { - SysMessageEntity messageEntity = new SysMessageEntity(); - BeanUtils.copyProperties(sysMessage, messageEntity); + /** + * 保存消息及其关联关系 + * + * @param sysMessage 消息对象 + * @return 是否保存成功 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean saveOrUpdateMessage(SysMessageVO sysMessage) { + SysMessageEntity messageEntity = new SysMessageEntity(); + BeanUtils.copyProperties(sysMessage, messageEntity); - if (Objects.isNull(sysMessage.getId())) { - baseMapper.insert(messageEntity); - } - else { - baseMapper.updateById(sysMessage); - } + if (Objects.isNull(sysMessage.getId())) { + baseMapper.insert(messageEntity); + } else { + baseMapper.updateById(sysMessage); + } - // 删除原有用户 - relationMapper.delete(Wrappers.lambdaQuery() - .eq(SysMessageRelationEntity::getMsgId, messageEntity.getId())); + // 删除原有用户 + relationMapper.delete(Wrappers.lambdaQuery() + .eq(SysMessageRelationEntity::getMsgId, messageEntity.getId())); - List userList = sysMessage.getUserList(); - if (CollUtil.isNotEmpty(userList)) { - userList.forEach(user -> { - SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); - relationEntity.setMsgId(messageEntity.getId()); - relationEntity.setUserId(user.getId()); - relationMapper.insert(relationEntity); - }); - } - else { - userMapper.selectList(Wrappers.emptyWrapper()).stream().map(SysUser::getUserId).forEach(userId -> { - SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); - relationEntity.setMsgId(messageEntity.getId()); - relationEntity.setUserId(userId); - relationMapper.insert(relationEntity); - }); - } - return Boolean.TRUE; - } + List userList = sysMessage.getUserList(); + if (CollUtil.isNotEmpty(userList)) { + userList.forEach(user -> { + SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); + relationEntity.setMsgId(messageEntity.getId()); + relationEntity.setUserId(user.getId()); + relationMapper.insert(relationEntity); + }); + } else { + userMapper.selectList(Wrappers.emptyWrapper()).stream().map(SysUser::getUserId).forEach(userId -> { + SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); + relationEntity.setMsgId(messageEntity.getId()); + relationEntity.setUserId(userId); + relationMapper.insert(relationEntity); + }); + } + return Boolean.TRUE; + } - /** - * 获取用户的信息列表 - * @return list - */ - @Override - public IPage pageUserMessage(Page page, SysMessageVO sysMessage) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .selectAll(SysMessageEntity.class) - .select(SysMessageRelationEntity::getReadFlag) - .leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId) - .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()) - .eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode()) - .eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory()) - .eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag, - sysMessage.getReadFlag()) - .orderByDesc(SysMessageEntity::getSort) - .orderByDesc(SysMessageEntity::getCreateTime); - return baseMapper.selectJoinPage(page, SysMessageVO.class, wrapper); - } + /** + * 获取用户的信息列表 + * + * @return list + */ + @Override + public IPage pageUserMessage(Page page, SysMessageVO sysMessage) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(SysMessageEntity.class) + .select(SysMessageRelationEntity::getReadFlag) + .leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId) + .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()) + .eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode()) + .eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory()) + .eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag, + sysMessage.getReadFlag()) + .orderByDesc(SysMessageEntity::getSort) + .orderByDesc(SysMessageEntity::getCreateTime); + return baseMapper.selectJoinPage(page, SysMessageVO.class, wrapper); + } - /** - * 读取信息 - * @param id id - * @return true/false - */ - @Override - public Boolean readMessage(Long id) { - SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); - relationEntity.setReadFlag(YesNoEnum.YES.getCode()); - relationMapper.update(relationEntity, - Wrappers.lambdaQuery() - .eq(SysMessageRelationEntity::getMsgId, id) - .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId())); - return Boolean.TRUE; - } + /** + * 读取信息 + * + * @param id id + * @return true/false + */ + @Override + public Boolean readMessage(Long id) { + SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); + relationEntity.setReadFlag(YesNoEnum.YES.getCode()); + relationMapper.update(relationEntity, + Wrappers.lambdaQuery() + .eq(SysMessageRelationEntity::getMsgId, id) + .eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId())); + return Boolean.TRUE; + } - /** - * 获取信息 - * @param id id - * @return messageVO - */ - @Override - public SysMessageVO getMessage(Long id) { - SysMessageEntity messageEntity = baseMapper.selectById(id); - SysMessageVO SysMessageVO = new SysMessageVO(); - BeanUtils.copyProperties(messageEntity, SysMessageVO); + /** + * 获取信息 + * + * @param id id + * @return messageVO + */ + @Override + public SysMessageVO getMessage(Long id) { + SysMessageEntity messageEntity = baseMapper.selectById(id); + SysMessageVO SysMessageVO = new SysMessageVO(); + BeanUtils.copyProperties(messageEntity, SysMessageVO); - // 全体通知 - if (messageEntity.getAllFlag().equals(YesNoEnum.YES.getCode())) { - return SysMessageVO; - } - List userIdList = relationMapper - .selectList(Wrappers.lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id)) - .stream() - .map(SysMessageRelationEntity::getUserId) - .toList(); + // 全体通知 + if (messageEntity.getAllFlag().equals(YesNoEnum.YES.getCode())) { + return SysMessageVO; + } + List userIdList = relationMapper + .selectList(Wrappers.lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id)) + .stream() + .map(SysMessageRelationEntity::getUserId) + .toList(); - if (CollUtil.isNotEmpty(userIdList)) { - List orgNodeUserVoList = userMapper.selectByIds(userIdList).stream().map(user -> { - OrgTreeVO nodeUserVo = new OrgTreeVO(); - nodeUserVo.setId(user.getUserId()); - nodeUserVo.setAvatar(user.getAvatar()); - nodeUserVo.setName(user.getName()); - return nodeUserVo; - }).toList(); + if (CollUtil.isNotEmpty(userIdList)) { + List orgNodeUserVoList = userMapper.selectByIds(userIdList).stream().map(user -> { + OrgTreeVO nodeUserVo = new OrgTreeVO(); + nodeUserVo.setId(user.getUserId()); + nodeUserVo.setAvatar(user.getAvatar()); + nodeUserVo.setName(user.getName()); + return nodeUserVo; + }).toList(); - SysMessageVO.setUserList(orgNodeUserVoList); - } + SysMessageVO.setUserList(orgNodeUserVoList); + } - return SysMessageVO; - } + return SysMessageVO; + } - /** - * 查询用户阅读情况 - * @param page 分页 - * @param messageId 消息ID - * @param name 姓名 - * @return page - */ - @Override - public Page pageUserRead(Page page, Long messageId, String name) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .selectAll(SysMessageRelationEntity.class) - .select(SysUser::getUsername, SysUser::getName, SysUser::getUserId) - .select(SysMessageEntity::getTitle) - .leftJoin(SysUser.class, SysUser::getUserId, SysMessageRelationEntity::getUserId) - .leftJoin(SysMessageEntity.class, SysMessageEntity::getId, SysMessageRelationEntity::getMsgId) - .eq(SysMessageRelationEntity::getMsgId, messageId) - .like(StrUtil.isNotBlank(name), SysUser::getName, name); - return relationMapper.selectJoinPage(page, SysMessageReadVO.class, wrapper); - } + /** + * 查询用户阅读情况 + * + * @param page 分页 + * @param messageId 消息ID + * @param name 姓名 + * @return page + */ + @Override + public Page pageUserRead(Page page, Long messageId, String name) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(SysMessageRelationEntity.class) + .select(SysUser::getUsername, SysUser::getName, SysUser::getUserId) + .select(SysMessageEntity::getTitle) + .leftJoin(SysUser.class, SysUser::getUserId, SysMessageRelationEntity::getUserId) + .leftJoin(SysMessageEntity.class, SysMessageEntity::getId, SysMessageRelationEntity::getMsgId) + .eq(SysMessageRelationEntity::getMsgId, messageId) + .like(StrUtil.isNotBlank(name), SysUser::getName, name); + return relationMapper.selectJoinPage(page, SysMessageReadVO.class, wrapper); + } - /** - * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 - * @param mobile mobile - * @return code - */ - @Override - public R sendSmsCode(String mobile) { - List userList = TenantBroker - .noneAs(() -> userMapper.selectList(Wrappers.query().lambda().eq(SysUser::getPhone, mobile))); + /** + * 发送手机验证码 + * + * @param mobile 手机号码 + * @param registered 是否已注册 + * @return 发送结果 + */ + @Override + public R sendSmsCode(String mobile, boolean registered) { + List userList = TenantBroker + .noneAs(() -> userMapper.selectList(Wrappers.query().lambda().eq(SysUser::getPhone, mobile))); - if (CollUtil.isEmpty(userList)) { - log.info("手机号未注册:{}", mobile); - return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, mobile)); - } + if (registered && CollUtil.isEmpty(userList)) { + log.info("手机号未注册:{}", mobile); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, mobile)); + } - String codeObj = RedisUtils - .get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile); + String codeObj = RedisUtils + .get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile); - if (StrUtil.isNotBlank(codeObj)) { - log.info("手机号验证码未过期:{},{}", mobile, codeObj); - return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); - } + if (StrUtil.isNotBlank(codeObj)) { + log.info("手机号验证码未过期:{},{}", mobile, codeObj); + return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_OFTEN)); + } - String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); - log.info("手机号生成验证码成功:{},{}", mobile, code); - RedisUtils.set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, - SecurityConstants.CODE_TIME); + String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); + log.info("手机号生成验证码成功:{},{}", mobile, code); + RedisUtils.set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, + SecurityConstants.CODE_TIME); - // 发送 - return this.sendSms(MessageSmsDTO.builder() - .mobile(mobile) - .biz(SmsBizCodeEnum.SMS_NORMAL_CODE.getCode()) - .param(code) - .build()); - } + // 发送 + return this.sendSms(MessageSmsDTO.builder() + .mobile(mobile) + .biz(SmsBizCodeEnum.SMS_NORMAL_CODE.getCode()) + .param(code) + .build()); + } - /** - * 发送短信 - * @param messageSmsDTO 消息 短信 DTO - * @return {@link R } - */ - @Override - public R sendSms(MessageSmsDTO messageSmsDTO) { + /** + * 发送短信 + * + * @param messageSmsDTO 消息 短信 DTO + * @return {@link R } + */ + @Override + public R sendSms(MessageSmsDTO messageSmsDTO) { - // 根据业务编码获取短信通道配置 - List configEntityList = sysSystemConfigMapper - .selectList(Wrappers.lambdaQuery() - .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.SMS.getValue()) - .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) - .eq(SysSystemConfigEntity::getConfigKey, messageSmsDTO.getBizCode())); - if (CollUtil.isEmpty(configEntityList)) { - return R.failed("发送失败,短信通道配置不存在"); - } + // 根据业务编码获取短信通道配置 + List configEntityList = sysSystemConfigMapper + .selectList(Wrappers.lambdaQuery() + .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.SMS.getValue()) + .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) + .eq(SysSystemConfigEntity::getConfigKey, messageSmsDTO.getBizCode())); + if (CollUtil.isEmpty(configEntityList)) { + return R.failed("发送失败,短信通道配置不存在"); + } - SysSystemConfigEntity configEntity = configEntityList.get(0); - JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); + SysSystemConfigEntity configEntity = configEntityList.get(0); + JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); - // 组装SMS4J 的发送对象 - SmsBlend smsBlend = SmsFactory.getSmsBlend(messageSmsDTO.getBizCode()); - if (Objects.isNull(smsBlend)) { - Class targetClass = Arrays.stream(SUPPORT_CONFIG_CLAZZ) - .filter(config -> config.getSimpleName() - .toLowerCase() - .contains(configMap.getStr(MessageSmsDTO.Fields.supplier))) - .findFirst() - .orElseThrow(() -> new CheckedException("发送失败,短信通道配置不存在")); - BaseConfig baseConfig = (BaseConfig) JSONUtil.toBean(configEntity.getConfigValue(), targetClass); + // 组装SMS4J 的发送对象 + SmsBlend smsBlend = SmsFactory.getSmsBlend(messageSmsDTO.getBizCode()); + if (Objects.isNull(smsBlend)) { + Class targetClass = Arrays.stream(SUPPORT_CONFIG_CLAZZ) + .filter(config -> config.getSimpleName() + .toLowerCase() + .contains(configMap.getStr(MessageSmsDTO.Fields.supplier))) + .findFirst() + .orElseThrow(() -> new CheckedException("发送失败,短信通道配置不存在")); + BaseConfig baseConfig = (BaseConfig) JSONUtil.toBean(configEntity.getConfigValue(), targetClass); - // 如果渠道扩展参数不为空则增加特性化参数 - if (StrUtil.isNotBlank(configMap.getStr(MessageSmsDTO.Fields.extParams))) { - JSONObject extParams = configMap.getJSONObject(MessageSmsDTO.Fields.extParams); - BeanUtil.copyProperties(extParams, baseConfig); - } + // 如果渠道扩展参数不为空则增加特性化参数 + if (StrUtil.isNotBlank(configMap.getStr(MessageSmsDTO.Fields.extParams))) { + JSONObject extParams = configMap.getJSONObject(MessageSmsDTO.Fields.extParams); + BeanUtil.copyProperties(extParams, baseConfig); + } - baseConfig.setConfigId(configEntity.getConfigKey()); - SmsFactory.createSmsBlend(baseConfig); - smsBlend = SmsFactory.getSmsBlend(messageSmsDTO.getBizCode()); - } + baseConfig.setConfigId(configEntity.getConfigKey()); + SmsFactory.createSmsBlend(baseConfig); + smsBlend = SmsFactory.getSmsBlend(messageSmsDTO.getBizCode()); + } - // 异步发送短信 - SysLogDTO sysLog = SysLogUtils.getSysLog(); - Long start = System.currentTimeMillis(); - sysLog.setTenantId(TenantContextHolder.getTenantId()); - for (String mobile : messageSmsDTO.getMobiles()) { - smsBlend.sendMessageAsync(mobile, configMap.getStr(MessageSmsDTO.Fields.templateId), - messageSmsDTO.getParams(), smsResponse -> { - log.info("发送短信结果:{}", smsResponse); - sysLog.setTitle(String.format("发送短信 %s", mobile)); - sysLog.setLogType(LogTypeEnum.NORMAL.getType()); - sysLog.setServiceId(SystemConfigTypeEnum.SMS.getValue()); - sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageSmsDTO)); - sysLog.setTime(System.currentTimeMillis() - start); - sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(smsResponse)); - remoteLogService.saveLog(sysLog); - }); - } - return R.ok(); - } + // 异步发送短信 + SysLogDTO sysLog = SysLogUtils.getSysLog(); + Long start = System.currentTimeMillis(); + sysLog.setTenantId(TenantContextHolder.getTenantId()); + for (String mobile : messageSmsDTO.getMobiles()) { + smsBlend.sendMessageAsync(mobile, configMap.getStr(MessageSmsDTO.Fields.templateId), + messageSmsDTO.getParams(), smsResponse -> { + log.info("发送短信结果:{}", smsResponse); + sysLog.setTitle(String.format("发送短信 %s", mobile)); + sysLog.setLogType(LogTypeEnum.NORMAL.getType()); + sysLog.setServiceId(SystemConfigTypeEnum.SMS.getValue()); + sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageSmsDTO)); + sysLog.setTime(System.currentTimeMillis() - start); + sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(smsResponse)); + remoteLogService.saveLog(sysLog); + }); + } + return R.ok(); + } - /** - * 发送钩子消息 - * @param messageHookDTO 消息挂钩 DTO - * @return {@link R } - */ - @Override - public R sendHook(MessageHookDTO messageHookDTO) { + /** + * 发送钩子消息 + * + * @param messageHookDTO 消息挂钩 DTO + * @return {@link R } + */ + @Override + public R sendHook(MessageHookDTO messageHookDTO) { - // 根据业务编码获取短信通道配置 - List configEntityList = sysSystemConfigMapper - .selectList(Wrappers.lambdaQuery() - .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.WEBHOOK.getValue()) - .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) - .eq(SysSystemConfigEntity::getConfigKey, messageHookDTO.getBizCode())); - if (CollUtil.isEmpty(configEntityList)) { - return R.failed("发送失败,短信通道配置不存在"); - } + // 根据业务编码获取短信通道配置 + List configEntityList = sysSystemConfigMapper + .selectList(Wrappers.lambdaQuery() + .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.WEBHOOK.getValue()) + .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) + .eq(SysSystemConfigEntity::getConfigKey, messageHookDTO.getBizCode())); + if (CollUtil.isEmpty(configEntityList)) { + return R.failed("发送失败,短信通道配置不存在"); + } - SysSystemConfigEntity configEntity = configEntityList.get(0); - JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); - String supplier = configMap.getStr("supplier"); + SysSystemConfigEntity configEntity = configEntityList.get(0); + JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); + String supplier = configMap.getStr("supplier"); - // 根据配置创建服务实例并注册 - OaSender alarm = OaFactory.getSmsOaBlend(messageHookDTO.getBizCode()); - if (Objects.isNull(alarm)) { - if (StrUtil.equalsAnyIgnoreCase(OaType.DING_TALK.toString(), supplier)) { - DingTalkConfig dingTalkConfig = new DingTalkConfig(); - dingTalkConfig.setConfigId(messageHookDTO.getBizCode()); - dingTalkConfig.setSign(configMap.getStr("sign")); - dingTalkConfig.setTokenId(configMap.getStr("tokenId")); - OaFactory.createAndRegisterOaSender(dingTalkConfig); - } - if (StrUtil.equalsAnyIgnoreCase(OaType.BYTE_TALK.toString(), supplier)) { - ByteTalkConfig byteTalkConfig = new ByteTalkConfig(); - byteTalkConfig.setConfigId(messageHookDTO.getBizCode()); - byteTalkConfig.setSign(configMap.getStr("sign")); - byteTalkConfig.setTokenId(configMap.getStr("tokenId")); - OaFactory.createAndRegisterOaSender(byteTalkConfig); - } + // 根据配置创建服务实例并注册 + OaSender alarm = OaFactory.getSmsOaBlend(messageHookDTO.getBizCode()); + if (Objects.isNull(alarm)) { + if (StrUtil.equalsAnyIgnoreCase(OaType.DING_TALK.toString(), supplier)) { + DingTalkConfig dingTalkConfig = new DingTalkConfig(); + dingTalkConfig.setConfigId(messageHookDTO.getBizCode()); + dingTalkConfig.setSign(configMap.getStr("sign")); + dingTalkConfig.setTokenId(configMap.getStr("tokenId")); + OaFactory.createAndRegisterOaSender(dingTalkConfig); + } + if (StrUtil.equalsAnyIgnoreCase(OaType.BYTE_TALK.toString(), supplier)) { + ByteTalkConfig byteTalkConfig = new ByteTalkConfig(); + byteTalkConfig.setConfigId(messageHookDTO.getBizCode()); + byteTalkConfig.setSign(configMap.getStr("sign")); + byteTalkConfig.setTokenId(configMap.getStr("tokenId")); + OaFactory.createAndRegisterOaSender(byteTalkConfig); + } - if (StrUtil.equalsAnyIgnoreCase(OaType.WE_TALK.toString(), supplier)) { - WeTalkConfig weTalkConfig = new WeTalkConfig(); - weTalkConfig.setConfigId(messageHookDTO.getBizCode()); - weTalkConfig.setSign(configMap.getStr("sign")); - weTalkConfig.setTokenId(configMap.getStr("tokenId")); - OaFactory.createAndRegisterOaSender(weTalkConfig); - } - alarm = OaFactory.getSmsOaBlend(messageHookDTO.getBizCode()); - } + if (StrUtil.equalsAnyIgnoreCase(OaType.WE_TALK.toString(), supplier)) { + WeTalkConfig weTalkConfig = new WeTalkConfig(); + weTalkConfig.setConfigId(messageHookDTO.getBizCode()); + weTalkConfig.setSign(configMap.getStr("sign")); + weTalkConfig.setTokenId(configMap.getStr("tokenId")); + OaFactory.createAndRegisterOaSender(weTalkConfig); + } + alarm = OaFactory.getSmsOaBlend(messageHookDTO.getBizCode()); + } - Request request = new Request(); - request.setContent(messageHookDTO.getMessageContent()); - request.setTitle(messageHookDTO.getMessageTitle()); - request.setMessageUrl(messageHookDTO.getMessageUrl()); - request.setPicUrl(messageHookDTO.getPicUrl()); - request.setIsNoticeAll(messageHookDTO.isNoticeAll()); - request.setPhoneList(messageHookDTO.getPhoneList()); + Request request = new Request(); + request.setContent(messageHookDTO.getMessageContent()); + request.setTitle(messageHookDTO.getMessageTitle()); + request.setMessageUrl(messageHookDTO.getMessageUrl()); + request.setPicUrl(messageHookDTO.getPicUrl()); + request.setIsNoticeAll(messageHookDTO.isNoticeAll()); + request.setPhoneList(messageHookDTO.getPhoneList()); - SysLogDTO sysLog = SysLogUtils.getSysLog(); - sysLog.setTenantId(TenantContextHolder.getTenantId()); - Long start = System.currentTimeMillis(); - alarm.senderAsync(request, - MessageType.valueOf(String.format("%s_%s", supplier, messageHookDTO.getMessageType()).toUpperCase()), - response -> { - log.info("发送Hook结果:{}", response); - sysLog.setTitle(String.format("发送Hook %s", messageHookDTO.getBizCode())); - sysLog.setLogType(LogTypeEnum.NORMAL.getType()); - sysLog.setServiceId(SystemConfigTypeEnum.WEBHOOK.getValue()); - sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageHookDTO)); - sysLog.setTime(System.currentTimeMillis() - start); - sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(response)); - remoteLogService.saveLog(sysLog); - }); - return R.ok(); - } + SysLogDTO sysLog = SysLogUtils.getSysLog(); + sysLog.setTenantId(TenantContextHolder.getTenantId()); + Long start = System.currentTimeMillis(); + alarm.senderAsync(request, + MessageType.valueOf(String.format("%s_%s", supplier, messageHookDTO.getMessageType()).toUpperCase()), + response -> { + log.info("发送Hook结果:{}", response); + sysLog.setTitle(String.format("发送Hook %s", messageHookDTO.getBizCode())); + sysLog.setLogType(LogTypeEnum.NORMAL.getType()); + sysLog.setServiceId(SystemConfigTypeEnum.WEBHOOK.getValue()); + sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageHookDTO)); + sysLog.setTime(System.currentTimeMillis() - start); + sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(response)); + remoteLogService.saveLog(sysLog); + }); + return R.ok(); + } - /** - * 发送邮件 - * @param messageEmailDTO 留言内容 电子邮件 DTO - * @return {@link R } - */ - @SneakyThrows - @Override - public R sendEmail(MessageEmailDTO messageEmailDTO) { - // 根据业务编码获取短信通道配置 - List configEntityList = sysSystemConfigMapper - .selectList(Wrappers.lambdaQuery() - .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.EMAIL.getValue()) - .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) - .eq(SysSystemConfigEntity::getConfigKey, messageEmailDTO.getBizCode())); - if (CollUtil.isEmpty(configEntityList)) { - return R.failed("发送失败,通道配置不存在"); - } - SysSystemConfigEntity configEntity = configEntityList.get(0); - JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); + /** + * 发送邮件 + * + * @param messageEmailDTO 留言内容 电子邮件 DTO + * @return {@link R } + */ + @SneakyThrows + @Override + public R sendEmail(MessageEmailDTO messageEmailDTO) { + // 根据业务编码获取短信通道配置 + List configEntityList = sysSystemConfigMapper + .selectList(Wrappers.lambdaQuery() + .eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.EMAIL.getValue()) + .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()) + .eq(SysSystemConfigEntity::getConfigKey, messageEmailDTO.getBizCode())); + if (CollUtil.isEmpty(configEntityList)) { + return R.failed("发送失败,通道配置不存在"); + } + SysSystemConfigEntity configEntity = configEntityList.get(0); + JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue()); - List tempFileList = new ArrayList<>(); - if (CollUtil.isNotEmpty(messageEmailDTO.getAttachmentList())) { - TenantContextHolder.setTenantSkip(); - for (String fileName : messageEmailDTO.getAttachmentList()) { - SysFile sysFile = fileMapper - .selectOne(Wrappers.lambdaQuery().eq(SysFile::getFileName, fileName)); - S3Object s3Object = fileTemplate.getObject(sysFile.getBucketName(), sysFile.getDir(), fileName); - File file = FileUtil.file(FileUtil.getTmpDirPath(), sysFile.getOriginal()); - tempFileList.add(file); - IoUtil.copy(s3Object.getObjectContent(), FileUtil.getOutputStream(file)); - } - } + List tempFileList = new ArrayList<>(); + if (CollUtil.isNotEmpty(messageEmailDTO.getAttachmentList())) { + TenantContextHolder.setTenantSkip(); + for (String fileName : messageEmailDTO.getAttachmentList()) { + SysFile sysFile = fileMapper + .selectOne(Wrappers.lambdaQuery().eq(SysFile::getFileName, fileName)); + S3Object s3Object = fileTemplate.getObject(sysFile.getBucketName(), sysFile.getDir(), fileName); + File file = FileUtil.file(FileUtil.getTmpDirPath(), sysFile.getOriginal()); + tempFileList.add(file); + IoUtil.copy(s3Object.getObjectContent(), FileUtil.getOutputStream(file)); + } + } - MailAccount account = new MailAccount(); - account.setHost(configMap.getStr("smtpServer")); - account.setPort(configMap.getInt("port")); - account.setAuth(configMap.getBool("isAuth")); - account.setSslEnable(configMap.getBool("isSSL")); - account.setFrom(configMap.getStr("username")); - account.setUser(configMap.getStr("username")); - account.setPass(configMap.getStr("password")); + MailAccount account = new MailAccount(); + account.setHost(configMap.getStr("smtpServer")); + account.setPort(configMap.getInt("port")); + account.setAuth(configMap.getBool("isAuth")); + account.setSslEnable(configMap.getBool("isSSL")); + account.setFrom(configMap.getStr("username")); + account.setUser(configMap.getStr("username")); + account.setPass(configMap.getStr("password")); - // 渲染模板 - TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig()); - Template template = engine.getTemplate(configMap.getStr("html")); - String result = template.render(messageEmailDTO.getHtmlValues()); + // 渲染模板 + TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig()); + Template template = engine.getTemplate(configMap.getStr("html")); + String result = template.render(messageEmailDTO.getHtmlValues()); - Long start = System.currentTimeMillis(); - MailUtil.send(account, messageEmailDTO.getMailAddress(), messageEmailDTO.getCcList(), - messageEmailDTO.getBccList(), messageEmailDTO.getTitle(), result, true, - tempFileList.toArray(new File[0])); - Long end = System.currentTimeMillis(); - // 写入日志 - SysLogDTO sysLog = SysLogUtils.getSysLog(); - sysLog.setTitle(String.format("发送邮件 %s", messageEmailDTO.getTitle())); - sysLog.setLogType(LogTypeEnum.NORMAL.getType()); - sysLog.setServiceId(SystemConfigTypeEnum.EMAIL.getValue()); - sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageEmailDTO)); - sysLog.setTenantId(TenantContextHolder.getTenantId()); - sysLog.setTime(end - start); - remoteLogService.saveLog(sysLog); - // 删除临时文件 - tempFileList.forEach(FileUtil::del); - return R.ok(); - } + Long start = System.currentTimeMillis(); + MailUtil.send(account, messageEmailDTO.getMailAddress(), messageEmailDTO.getCcList(), + messageEmailDTO.getBccList(), messageEmailDTO.getTitle(), result, true, + tempFileList.toArray(new File[0])); + Long end = System.currentTimeMillis(); + // 写入日志 + SysLogDTO sysLog = SysLogUtils.getSysLog(); + sysLog.setTitle(String.format("发送邮件 %s", messageEmailDTO.getTitle())); + sysLog.setLogType(LogTypeEnum.NORMAL.getType()); + sysLog.setServiceId(SystemConfigTypeEnum.EMAIL.getValue()); + sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageEmailDTO)); + sysLog.setTenantId(TenantContextHolder.getTenantId()); + sysLog.setTime(end - start); + remoteLogService.saveLog(sysLog); + // 删除临时文件 + tempFileList.forEach(FileUtil::del); + return R.ok(); + } - /** - * 列出 Hook 业务代码 - * @param messageHookDTO 消息钩子 DTO - * @return {@link R } - */ - @Override - public R listHookBizCode(MessageHookDTO messageHookDTO) { - List configEntityList = sysSystemConfigMapper - .selectList(Wrappers.lambdaQuery() - .eq(SysSystemConfigEntity::getConfigType, messageHookDTO.getMessageType()) - .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())); - return R.ok(configEntityList); - } + /** + * 列出 Hook 业务代码 + * + * @param messageHookDTO 消息钩子 DTO + * @return {@link R } + */ + @Override + public R listHookBizCode(MessageHookDTO messageHookDTO) { + List configEntityList = sysSystemConfigMapper + .selectList(Wrappers.lambdaQuery() + .eq(SysSystemConfigEntity::getConfigType, messageHookDTO.getMessageType()) + .eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())); + return R.ok(configEntityList); + } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index 2a1f7b43c..337f37494 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -267,12 +267,21 @@ public class SysUserServiceImpl extends ServiceImpl impl public R updateUserInfo(UserDTO userDto) { Long userId = SecurityUtils.getUser().getId(); SysUser sysUser = new SysUser(); - sysUser.setPhone(userDto.getPhone()); sysUser.setUserId(userId); sysUser.setAvatar(userDto.getAvatar()); sysUser.setNickname(userDto.getNickname()); sysUser.setName(userDto.getName()); sysUser.setEmail(userDto.getEmail()); + + // 校验手机号 + if (StrUtil.isNotBlank(userDto.getPhone())) { + Object codeObj = RedisUtils.get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + + StringPool.AT + userDto.getPhone()); + if (!StrUtil.equals(userDto.getCode(), codeObj.toString())) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_APP_SMS_ERROR)); + } + } + return R.ok(this.updateById(sysUser)); }