Parcourir la source

短信发送的逻辑,迁移到 yudao-core-service 模块下

YunaiV il y a 3 ans
Parent
commit
8e2388d52d
77 fichiers modifiés avec 1008 ajouts et 630 suppressions
  1. 4 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
  2. 5 5
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java
  3. 5 5
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java
  4. 4 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java
  5. 3 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java
  6. 5 5
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java
  7. 7 7
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java
  8. 11 8
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java
  9. 10 7
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
  10. 2 0
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java
  11. 1 6
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java
  12. 3 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java
  13. 3 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java
  14. 2 2
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java
  15. 2 2
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java
  16. 1 1
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
  17. 1 1
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java
  18. 1 1
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
  19. 2 2
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java
  20. 3 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java
  21. 3 8
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java
  22. 5 5
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java
  23. 1 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
  24. 4 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java
  25. 4 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java
  26. 0 17
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java
  27. 7 4
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
  28. 1 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java
  29. 3 3
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java
  30. 1 1
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java
  31. 3 46
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java
  32. 2 25
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java
  33. 6 6
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java
  34. 2 50
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java
  35. 12 91
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java
  36. 3 16
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java
  37. 1 6
      yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java
  38. 10 7
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
  39. 2 3
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java
  40. 12 11
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java
  41. 4 4
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java
  42. 10 100
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java
  43. 11 36
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java
  44. 7 7
      yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java
  45. 6 0
      yudao-core-service/pom.xml
  46. 1 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java
  47. 3 3
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java
  48. 2 2
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java
  49. 3 3
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java
  50. 13 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java
  51. 16 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java
  52. 11 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java
  53. 17 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
  54. 3 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java
  55. 0 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/package-info.java
  56. 1 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java
  57. 1 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java
  58. 1 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java
  59. 4 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java
  60. 1 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java
  61. 4 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java
  62. 42 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java
  63. 11 10
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java
  64. 56 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java
  65. 36 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java
  66. 30 32
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java
  67. 72 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java
  68. 105 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java
  69. 20 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java
  70. 26 0
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java
  71. 5 3
      yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java
  72. 31 33
      yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java
  73. 149 0
      yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java
  74. 71 0
      yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java
  75. 2 0
      yudao-core-service/src/test/resources/sql/clean.sql
  76. 73 2
      yudao-core-service/src/test/resources/sql/create_tables.sql
  77. 3 2
      更新日志.md

+ 4 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java

@@ -4,13 +4,13 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.*;
 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
-import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
@@ -43,7 +43,7 @@ public class SysAuthController {
     @Resource
     private SysAuthService authService;
     @Resource
-    private SysUserService userService;
+    private SysUserCoreService userCoreService;
     @Resource
     private SysRoleService roleService;
     @Resource
@@ -64,7 +64,7 @@ public class SysAuthController {
     @ApiOperation("获取登录用户的权限信息")
     public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
         // 获得用户信息
-        SysUserDO user = userService.getUser(getLoginUserId());
+        SysUserDO user = userCoreService.getUser(getLoginUserId());
         if (user == null) {
             return null;
         }

+ 5 - 5
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysUserSessionController.java

@@ -1,17 +1,17 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.auth;
 
-import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
-import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageItemRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysUserSessionConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 5 - 5
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/logger/SysOperateLogController.java

@@ -1,20 +1,20 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.logger;
 
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;

+ 4 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SmsCallbackController.java

@@ -2,10 +2,10 @@ package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
 
 import cn.hutool.core.util.URLUtil;
 import cn.hutool.extra.servlet.ServletUtil;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.framework.sms.core.enums.SmsChannelEnum;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 public class SmsCallbackController {
 
     @Resource
-    private SysSmsService smsService;
+    private SysSmsCoreService smsCoreService;
 
     @PostMapping("/sms/yunpian")
     @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档")
@@ -33,7 +33,7 @@ public class SmsCallbackController {
     @OperateLog(enable = false)
     public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable {
         String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode
-        smsService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text);
+        smsCoreService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text);
         return "SUCCESS"; // 约定返回 SUCCESS 为成功
     }
 
@@ -42,7 +42,7 @@ public class SmsCallbackController {
     @OperateLog(enable = false)
     public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
         String text = ServletUtil.getBody(request);
-        smsService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
+        smsCoreService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
         return success(true);
     }
 

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsChannelController.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.*;
 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;

+ 5 - 5
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsLogController.java

@@ -1,16 +1,16 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsLogConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;

+ 7 - 7
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/sms/SysSmsTemplateController.java

@@ -1,14 +1,14 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.sms;
 
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*;
+import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
+import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.*;
-import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -32,7 +32,7 @@ public class SysSmsTemplateController {
     @Resource
     private SysSmsTemplateService smsTemplateService;
     @Resource
-    private SysSmsService smsService;
+    private SysSmsCoreService smsCoreService;
 
     @PostMapping("/create")
     @ApiOperation("创建短信模板")
@@ -91,7 +91,7 @@ public class SysSmsTemplateController {
     @ApiOperation("发送短信")
     @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')")
     public CommonResult<Long> sendSms(@Valid @RequestBody SysSmsTemplateSendReqVO sendReqVO) {
-        return success(smsService.sendSingleSms(sendReqVO.getMobile(), null, null,
+        return success(smsCoreService.sendSingleSms(sendReqVO.getMobile(), null, null,
                 sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams()));
     }
 

+ 11 - 8
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.java

@@ -1,20 +1,21 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.user;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
 import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -42,6 +43,8 @@ public class SysUserController {
     @Resource
     private SysUserService userService;
     @Resource
+    private SysUserCoreService userCoreService;
+    @Resource
     private SysDeptService deptService;
 
     @PostMapping("/create")
@@ -113,7 +116,7 @@ public class SysUserController {
     @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
     @PreAuthorize("@ss.hasPermission('system:user:query')")
     public CommonResult<SysUserRespVO> getInfo(@RequestParam("id") Long id) {
-        return success(SysUserConvert.INSTANCE.convert(userService.getUser(id)));
+        return success(SysUserConvert.INSTANCE.convert(userCoreService.getUser(id)));
     }
 
     @GetMapping("/export")

+ 10 - 7
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java

@@ -1,10 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.user;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
-import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
@@ -12,12 +8,17 @@ import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
+import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -30,9 +31,9 @@ import javax.validation.Valid;
 import java.io.IOException;
 import java.util.List;
 
+import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY;
 
 @Api(tags = "用户个人中心")
 @RestController
@@ -44,6 +45,8 @@ public class SysUserProfileController {
     @Resource
     private SysUserService userService;
     @Resource
+    private SysUserCoreService userCoreService;
+    @Resource
     private SysDeptService deptService;
     @Resource
     private SysPostService postService;
@@ -58,7 +61,7 @@ public class SysUserProfileController {
     @ApiOperation("获得登录用户信息")
     public CommonResult<SysUserProfileRespVO> profile() {
         // 获得用户基本信息
-        SysUserDO user = userService.getUser(getLoginUserId());
+        SysUserDO user = userCoreService.getUser(getLoginUserId());
         SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user);
         // 获得用户角色
         List<SysRoleDO> userRoles = roleService.getRolesFromCache(permissionService.listUserRoleIs(user.getId()));

+ 2 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/vo/user/SysUserImportExcelVO.java

@@ -8,6 +8,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
 
 /**
  * 用户 Excel 导入 VO
@@ -16,6 +17,7 @@ import lombok.NoArgsConstructor;
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
 public class SysUserImportExcelVO {
 
     @ExcelProperty("登录名称")

+ 1 - 6
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java

@@ -2,18 +2,13 @@ package cn.iocoder.yudao.adminserver.modules.system.convert.auth;
 
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuIdEnum;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.security.core.LoginUser;
-import me.zhyd.oauth.model.AuthCallback;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/logger/SysOperateLogConvert.java

@@ -1,12 +1,12 @@
 package cn.iocoder.yudao.adminserver.modules.system.convert.logger;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsChannelConvert.java

@@ -1,12 +1,12 @@
 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelSimpleRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 2 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsLogConvert.java

@@ -1,9 +1,9 @@
 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExcelVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogRespVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 2 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/sms/SysSmsTemplateConvert.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.convert.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java

@@ -8,7 +8,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java

@@ -1,9 +1,9 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger;
 
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
 
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 2 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsChannelMapper.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
 
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
 

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsLogMapper.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
 
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

+ 3 - 8
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java

@@ -1,15 +1,13 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms;
 
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
+import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
 
-import java.util.Date;
 import java.util.List;
 
 @Mapper
@@ -47,7 +45,4 @@ public interface SysSmsTemplateMapper extends BaseMapperX<SysSmsTemplateDO> {
         return selectCount("channel_id", channelId);
     }
 
-    @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
-    Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
-
 }

+ 5 - 5
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/user/SysUserMapper.java

@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user;
 
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -19,14 +19,14 @@ public interface SysUserMapper extends BaseMapperX<SysUserDO> {
         return selectOne(new QueryWrapper<SysUserDO>().eq("username", username));
     }
 
-    default SysUserDO selectByMobile(String mobile) {
-        return selectOne(new QueryWrapper<SysUserDO>().eq("mobile", mobile));
-    }
-
     default SysUserDO selectByEmail(String email) {
         return selectOne(new QueryWrapper<SysUserDO>().eq("email", email));
     }
 
+    default SysUserDO selectByMobile(String mobile) {
+        return selectOne(new QueryWrapper<SysUserDO>().eq("mobile", mobile));
+    }
+
     default PageResult<SysUserDO> selectPage(SysUserPageReqVO reqVO, Collection<Long> deptIds) {
         return selectPage(reqVO, new QueryWrapperX<SysUserDO>()
                 .likeIfPresent("username", reqVO.getUsername())

+ 1 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.adminserver.modules.system.enums;
 
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import javafx.beans.binding.MapExpression;
 
 /**
  * System 错误码枚举类
@@ -85,10 +86,6 @@ public interface SysErrorCodeConstants {
     ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在");
     ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002011001, "已经存在编码为【{}】的短信模板");
 
-    // ========== 短信发送 1002012000 ==========
-    ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在");
-    ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失");
-
     // ========== 错误码模块 1002013000 ==========
     ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在");
     ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码");

+ 4 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsSendConsumer.java

@@ -1,8 +1,8 @@
 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
 
+import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
 import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
-import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -19,12 +19,12 @@ import javax.annotation.Resource;
 public class SysSmsSendConsumer extends AbstractStreamMessageListener<SysSmsSendMessage> {
 
     @Resource
-    private SysSmsService smsService;
+    private SysSmsCoreService smsCoreService;
 
     @Override
     public void onMessage(SysSmsSendMessage message) {
         log.info("[onMessage][消息内容({})]", message);
-        smsService.doSendSms(message);
+        smsCoreService.doSendSms(message);
     }
 
 }

+ 4 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/consumer/sms/SysSmsTemplateRefreshConsumer.java

@@ -1,8 +1,8 @@
 package cn.iocoder.yudao.adminserver.modules.system.mq.consumer.sms;
 
-import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
+import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -18,12 +18,12 @@ import javax.annotation.Resource;
 public class SysSmsTemplateRefreshConsumer extends AbstractChannelMessageListener<SysSmsTemplateRefreshMessage> {
 
     @Resource
-    private SysSmsTemplateService smsTemplateService;
+    private SysSmsTemplateCoreService smsTemplateCoreService;
 
     @Override
     public void onMessage(SysSmsTemplateRefreshMessage message) {
         log.info("[onMessage][收到 SmsTemplate 刷新消息]");
-        smsTemplateService.initLocalCache();
+        smsTemplateCoreService.initLocalCache();
     }
 
 }

+ 0 - 17
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/producer/sms/SysSmsProducer.java

@@ -3,7 +3,6 @@ package cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms;
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsChannelRefreshMessage;
-import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
 import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsTemplateRefreshMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -25,22 +24,6 @@ public class SysSmsProducer {
     @Resource
     private StringRedisTemplate stringRedisTemplate;
 
-    /**
-     * 发送 {@link SysSmsSendMessage} 消息
-     *
-     * @param logId 短信日志编号
-     * @param mobile 手机号
-     * @param channelId 渠道编号
-     * @param apiTemplateId 短信模板编号
-     * @param templateParams 短信模板参数
-     */
-    public void sendSmsSendMessage(Long logId, String mobile,
-                                   Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
-        SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
-        message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
-        RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
-    }
-
     /**
      * 发送 {@link SysSmsChannelRefreshMessage} 消息
      */

+ 7 - 4
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java

@@ -7,7 +7,6 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAu
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
@@ -15,9 +14,11 @@ import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaServ
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
@@ -62,6 +63,8 @@ public class SysAuthServiceImpl implements SysAuthService {
     @Resource
     private SysUserService userService;
     @Resource
+    private SysUserCoreService userCoreService;
+    @Resource
     private SysPermissionService permissionService;
     @Resource
     private SysCaptchaService captchaService;
@@ -86,7 +89,7 @@ public class SysAuthServiceImpl implements SysAuthService {
     @Override
     public LoginUser mockLogin(Long userId) {
         // 获取用户编号对应的 SysUserDO
-        SysUserDO user = userService.getUser(userId);
+        SysUserDO user = userCoreService.getUser(userId);
         if (user == null) {
             throw new UsernameNotFoundException(String.valueOf(userId));
         }
@@ -201,7 +204,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         }
 
         // 自动登录
-        SysUserDO user = userService.getUser(socialUsers.get(0).getUserId());
+        SysUserDO user = userCoreService.getUser(socialUsers.get(0).getUserId());
         if (user == null) {
             throw exception(USER_NOT_EXISTS);
         }
@@ -292,7 +295,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         }
 
         // 重新加载 SysUserDO 信息
-        SysUserDO user = userService.getUser(loginUser.getId());
+        SysUserDO user = userCoreService.getUser(loginUser.getId());
         if (user == null || CommonStatusEnum.DISABLE.getStatus().equals(user.getStatus())) {
             throw exception(AUTH_TOKEN_EXPIRED); // 校验 token 时,用户被禁用的情况下,也认为 token 过期,方便前端跳转到登录界面
         }

+ 1 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysUserSessionServiceImpl.java

@@ -3,18 +3,16 @@ package cn.iocoder.yudao.adminserver.modules.system.service.auth.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysUserSessionService;
-import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
-import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
 import com.google.common.collect.Lists;

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/impl/SysOperateLogServiceImpl.java

@@ -2,17 +2,17 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.logger.SysOperateLogConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper;
 import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysOperateLogService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.string.StrUtils;
+import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.AsyncResult;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelService.java

@@ -1,10 +1,10 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 
 import javax.validation.Valid;
 import java.util.Collection;

+ 3 - 46
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogService.java

@@ -1,63 +1,20 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
-import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 /**
- * 短信日志 Service 实现类
+ * 短信日志 Service 接口
  *
  * @author zzf
  * @date 13:48 2021/3/2
  */
 public interface SysSmsLogService {
 
-    /**
-     * 创建短信日志
-     *
-     * @param mobile 手机号
-     * @param userId 用户编号
-     * @param userType 用户类型
-     * @param isSend 是否发送
-     * @param template 短信模板
-     * @param templateContent 短信内容
-     * @param templateParams 短信参数
-     * @return 发送日志编号
-     */
-    Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
-                      SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
-
-    /**
-     * 更新日志的发送结果
-     *
-     * @param id 日志编号
-     * @param sendCode 发送结果的编码
-     * @param sendMsg 发送结果的提示
-     * @param apiSendCode 短信 API 发送结果的编码
-     * @param apiSendMsg 短信 API 发送失败的提示
-     * @param apiRequestId 短信 API 发送返回的唯一请求 ID
-     * @param apiSerialNo 短信 API 发送返回的序号
-     */
-    void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
-                             String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo);
-
-    /**
-     * 更新日志的接收结果
-     *
-     * @param id 日志编号
-     * @param success 是否接收成功
-     * @param receiveTime 用户接收时间
-     * @param apiReceiveCode API 接收结果的编码
-     * @param apiReceiveMsg API 接收结果的说明
-     */
-    void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg);
-
     /**
      * 获得短信日志分页
      *

+ 2 - 25
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateService.java

@@ -1,16 +1,15 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
 import javax.validation.Valid;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 短信模板 Service 接口
@@ -20,11 +19,6 @@ import java.util.Map;
  */
 public interface SysSmsTemplateService {
 
-    /**
-     * 初始化短信模板的本地缓存
-     */
-    void initLocalCache();
-
     /**
      * 获得短信模板
      *
@@ -33,23 +27,6 @@ public interface SysSmsTemplateService {
      */
     SysSmsTemplateDO getSmsTemplateByCode(String code);
 
-    /**
-     * 获得短信模板,从缓存中
-     *
-     * @param code 模板编码
-     * @return 短信模板
-     */
-    SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code);
-
-    /**
-     * 格式化短信内容
-     *
-     * @param content 短信模板的内容
-     * @param params 内容的参数
-     * @return 格式化后的内容
-     */
-    String formatSmsTemplateContent(String content, Map<String, Object> params);
-
     /**
      * 创建短信模板
      *

+ 6 - 6
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java

@@ -1,19 +1,19 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
-import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsChannelConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper;
 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
+import cn.iocoder.yudao.framework.sms.core.property.SmsChannelProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -25,9 +25,9 @@ import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
-import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN;
 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 
 /**
  * 短信渠道Service实现类

+ 2 - 50
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsLogServiceImpl.java

@@ -1,23 +1,16 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
 
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Date;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
 
 /**
  * 短信日志 Service 实现类
@@ -32,47 +25,6 @@ public class SysSmsLogServiceImpl implements SysSmsLogService {
     @Resource
     private SysSmsLogMapper smsLogMapper;
 
-    @Override
-    public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
-                             SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
-        SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder();
-        // 根据是否要发送,设置状态
-        logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus()
-                : SysSmsSendStatusEnum.IGNORE.getStatus());
-        // 设置手机相关字段
-        logBuilder.mobile(mobile).userId(userId).userType(userType);
-        // 设置模板相关字段
-        logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType());
-        logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId());
-        // 设置渠道相关字段
-        logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
-        // 设置接收相关字段
-        logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus());
-
-        // 插入数据库
-        SysSmsLogDO logDO = logBuilder.build();
-        smsLogMapper.insert(logDO);
-        return logDO.getId();
-    }
-
-    @Override
-    public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
-                                    String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) {
-        SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS
-                : SysSmsSendStatusEnum.FAILURE;
-        smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date())
-                .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
-                .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
-    }
-
-    @Override
-    public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) {
-        SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS
-                : SysSmsReceiveStatusEnum.FAILURE;
-        smsLogMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime)
-                .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
-    }
-
     @Override
     public PageResult<SysSmsLogDO> getSmsLogPage(SysSmsLogPageReqVO pageReqVO) {
         return smsLogMapper.selectPage(pageReqVO);

+ 12 - 91
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java

@@ -1,40 +1,36 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ReUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
-import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
-import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.sms.SysSmsTemplateConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsChannelService;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
+import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
+import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableMap;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
 import java.util.regex.Pattern;
 
-import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 
 /**
  * 短信模板Service实现类
@@ -51,24 +47,6 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
      */
     private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}");
 
-    /**
-     * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
-     * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高
-     */
-    private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L;
-
-    /**
-     * 短信模板缓存
-     * key:短信模板编码 {@link SysSmsTemplateDO#getCode()}
-     *
-     * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
-     */
-    private volatile Map<String, SysSmsTemplateDO> smsTemplateCache;
-    /**
-     * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新
-     */
-    private volatile Date maxUpdateTime;
-
     @Resource
     private SysSmsTemplateMapper smsTemplateMapper;
 
@@ -81,68 +59,11 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
     @Resource
     private SysSmsProducer smsProducer;
 
-    /**
-     * 初始化 {@link #smsTemplateCache} 缓存
-     */
-    @Override
-    @PostConstruct
-    public void initLocalCache() {
-        // 获取短信模板列表,如果有更新
-        List<SysSmsTemplateDO> smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime);
-        if (CollUtil.isEmpty(smsTemplateList)) {
-            return;
-        }
-
-        // 写入缓存
-        ImmutableMap.Builder<String, SysSmsTemplateDO> builder = ImmutableMap.builder();
-        smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO));
-        smsTemplateCache = builder.build();
-        assert smsTemplateList.size() > 0; // 断言,避免告警
-        maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();
-        log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size());
-    }
-
-    @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
-    public void schedulePeriodicRefresh() {
-        initLocalCache();
-    }
-
-    /**
-     * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。
-     * 如果未发生变化,则返回空
-     *
-     * @param maxUpdateTime 当前短信模板的最大更新时间
-     * @return 短信模板列表
-     */
-    private List<SysSmsTemplateDO> loadSmsTemplateIfUpdate(Date maxUpdateTime) {
-        // 第一步,判断是否要更新。
-        if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
-            log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]");
-        } else { // 判断数据库中是否有更新的短信模板
-            if (smsTemplateMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) {
-                return null;
-            }
-            log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]");
-        }
-        // 第二步,如果有更新,则从数据库加载所有短信模板
-        return smsTemplateMapper.selectList();
-    }
-
     @Override
     public SysSmsTemplateDO getSmsTemplateByCode(String code) {
         return smsTemplateMapper.selectByCode(code);
     }
 
-    @Override
-    public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) {
-        return smsTemplateCache.get(code);
-    }
-
-    @Override
-    public String formatSmsTemplateContent(String content, Map<String, Object> params) {
-        return StrUtil.format(content, params);
-    }
-
     @VisibleForTesting
     public List<String> parseTemplateContentParams(String content) {
         return ReUtil.findAllGroup1(PATTERN_PARAMS, content);

+ 3 - 16
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserService.java

@@ -1,16 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.user;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserCreateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserExportReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportExcelVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserImportRespVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 
 import java.io.InputStream;
@@ -104,14 +99,6 @@ public interface SysUserService {
      */
     SysUserDO getUserByUsername(String username);
 
-    /**
-     * 通过用户 ID 查询用户
-     *
-     * @param id 用户ID
-     * @return 用户对象信息
-     */
-    SysUserDO getUser(Long id);
-
     /**
      * 获得用户分页列表
      *

+ 1 - 6
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/user/impl/SysUserServiceImpl.java

@@ -11,12 +11,12 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
 import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -159,11 +159,6 @@ public class SysUserServiceImpl implements SysUserService {
         return userMapper.selectByUsername(username);
     }
 
-    @Override
-    public SysUserDO getUser(Long id) {
-        return userMapper.selectById(id);
-    }
-
     @Override
     public PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO) {
         return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId()));

+ 10 - 7
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java

@@ -1,19 +1,20 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.auth;
 
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
-import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
-import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.security.core.LoginUser;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl;
 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
+import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
 import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
@@ -51,6 +52,8 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
     @MockBean
     private SysUserService userService;
     @MockBean
+    private SysUserCoreService userCoreService;
+    @MockBean
     private SysPermissionService permissionService;
     @MockBean
     private AuthenticationManager authenticationManager;
@@ -98,7 +101,7 @@ public class SysAuthServiceImplTest extends BaseDbUnitTest {
         Long userId = randomLongId();
         // mock 方法 01
         SysUserDO user = randomPojo(SysUserDO.class, o -> o.setId(userId));
-        when(userService.getUser(eq(userId))).thenReturn(user);
+        when(userCoreService.getUser(eq(userId))).thenReturn(user);
         // mock 方法 02
         Set<Long> roleIds = randomSet(Long.class);
         when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus()))))

+ 2 - 3
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysUserSessionServiceImplTest.java

@@ -3,14 +3,13 @@ package cn.iocoder.yudao.adminserver.modules.system.service.auth;
 import cn.hutool.core.date.DateUtil;
 import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.auth.SysUserSessionMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysUserSessionServiceImpl;
-import cn.iocoder.yudao.adminserver.modules.system.service.logger.SysLoginLogService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.auth.SysUserSessionDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.redis.auth.SysLoginUserCoreRedisDAO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;

+ 12 - 11
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/logger/SysOperateLogServiceImplTest.java

@@ -2,34 +2,35 @@ package cn.iocoder.yudao.adminserver.modules.system.service.logger;
 
 import cn.hutool.core.map.MapUtil;
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
-import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
-import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger.SysOperateLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.logger.SysOperateLogMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.logger.impl.SysOperateLogServiceImpl;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
-import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.framework.operatelog.core.dto.OperateLogCreateReqDTO;
+import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
+import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.when;
 

+ 4 - 4
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsChannelServiceTest.java

@@ -2,18 +2,18 @@ package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsChannelMapper;
 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;

+ 10 - 100
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsLogServiceTest.java

@@ -2,35 +2,32 @@ package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
 import cn.hutool.core.map.MapUtil;
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsLogDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsLogMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsLogServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 
-import static cn.hutool.core.util.RandomUtil.randomBoolean;
 import static cn.hutool.core.util.RandomUtil.randomEle;
-import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
 * {@link SysSmsLogServiceImpl} 的单元测试类
@@ -46,93 +43,6 @@ public class SysSmsLogServiceTest extends BaseDbUnitTest {
     @Resource
     private SysSmsLogMapper smsLogMapper;
 
-    @Test
-    public void testCreateSmsLog() {
-        // 准备参数
-        String mobile = randomString();
-        Long userId = randomLongId();
-        Integer userType = randomEle(UserTypeEnum.values()).getValue();
-        Boolean isSend = randomBoolean();
-        SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class,
-                o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()));
-        String templateContent = randomString();
-        Map<String, Object> templateParams = randomTemplateParams();
-        // mock 方法
-
-        // 调用
-        Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend,
-                templateDO, templateContent, templateParams);
-        // 断言
-        SysSmsLogDO logDO = smsLogMapper.selectById(logId);
-        assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(),
-                logDO.getSendStatus());
-        assertEquals(mobile, logDO.getMobile());
-        assertEquals(userType, logDO.getUserType());
-        assertEquals(userId, logDO.getUserId());
-        assertEquals(templateDO.getId(), logDO.getTemplateId());
-        assertEquals(templateDO.getCode(), logDO.getTemplateCode());
-        assertEquals(templateDO.getType(), logDO.getTemplateType());
-        assertEquals(templateDO.getChannelId(), logDO.getChannelId());
-        assertEquals(templateDO.getChannelCode(), logDO.getChannelCode());
-        assertEquals(templateContent, logDO.getTemplateContent());
-        assertEquals(templateParams, logDO.getTemplateParams());
-        assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus());
-    }
-
-    @Test
-    public void testUpdateSmsSendResult() {
-        // mock 数据
-        SysSmsLogDO dbSmsLog = randomSmsLogDO(
-                o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()));
-        smsLogMapper.insert(dbSmsLog);
-        // 准备参数
-        Long id = dbSmsLog.getId();
-        Integer sendCode = randomInteger();
-        String sendMsg = randomString();
-        String apiSendCode = randomString();
-        String apiSendMsg = randomString();
-        String apiRequestId = randomString();
-        String apiSerialNo = randomString();
-
-        // 调用
-        smsLogService.updateSmsSendResult(id, sendCode, sendMsg,
-                apiSendCode, apiSendMsg, apiRequestId, apiSerialNo);
-        // 断言
-        dbSmsLog = smsLogMapper.selectById(id);
-        assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus()
-                : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus());
-        assertNotNull(dbSmsLog.getSendTime());
-        assertEquals(sendMsg, dbSmsLog.getSendMsg());
-        assertEquals(apiSendCode, dbSmsLog.getApiSendCode());
-        assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg());
-        assertEquals(apiRequestId, dbSmsLog.getApiRequestId());
-        assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo());
-    }
-
-    @Test
-    public void testUpdateSmsReceiveResult() {
-        // mock 数据
-        SysSmsLogDO dbSmsLog = randomSmsLogDO(
-                o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()));
-        smsLogMapper.insert(dbSmsLog);
-        // 准备参数
-        Long id = dbSmsLog.getId();
-        Boolean success = randomBoolean();
-        Date receiveTime = randomDate();
-        String apiReceiveCode = randomString();
-        String apiReceiveMsg = randomString();
-
-        // 调用
-        smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
-        // 断言
-        dbSmsLog = smsLogMapper.selectById(id);
-        assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus()
-                : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus());
-        assertEquals(receiveTime, dbSmsLog.getReceiveTime());
-        assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode());
-        assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg());
-    }
-
     @Test
     public void testGetSmsLogPage() {
        // mock 数据

+ 11 - 36
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsTemplateServiceTest.java

@@ -1,43 +1,39 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.sms;
 
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
-import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
-import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
-import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsChannelDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
 import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsChannelDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClient;
+import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
+import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
+import cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO;
 import com.google.common.collect.Lists;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
-import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.function.Consumer;
 
-import static cn.hutool.core.bean.BeanUtil.getFieldValue;
 import static cn.hutool.core.util.RandomUtil.randomEle;
 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.eq;
@@ -66,27 +62,6 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
     @MockBean
     private SysSmsProducer smsProducer;
 
-    @Test
-    @SuppressWarnings("unchecked")
-    void testInitLocalCache() {
-        // mock 数据
-        SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO();
-        smsTemplateMapper.insert(smsTemplate01);
-        SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO();
-        smsTemplateMapper.insert(smsTemplate02);
-
-        // 调用
-        smsTemplateService.initLocalCache();
-        // 断言 deptCache 缓存
-        Map<String, SysSmsTemplateDO> smsTemplateCache = (Map<String, SysSmsTemplateDO>) getFieldValue(smsTemplateService, "smsTemplateCache");
-        assertEquals(2, smsTemplateCache.size());
-        assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode()));
-        assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode()));
-        // 断言 maxUpdateTime 缓存
-        Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime");
-        assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime);
-    }
-
     @Test
     public void testParseTemplateContentParams() {
         // 准备参数

+ 7 - 7
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/user/SysUserServiceImplTest.java

@@ -3,21 +3,21 @@ package cn.iocoder.yudao.adminserver.modules.system.service.user;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
-import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.user.SysUserMapper;
-import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
+import cn.iocoder.yudao.adminserver.modules.system.service.user.impl.SysUserServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
@@ -36,9 +36,9 @@ import java.util.function.Consumer;
 import static cn.hutool.core.util.RandomUtil.randomBytes;
 import static cn.hutool.core.util.RandomUtil.randomEle;
 import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 import static org.assertj.core.util.Lists.newArrayList;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -243,7 +243,7 @@ public class SysUserServiceImplTest extends BaseDbUnitTest {
         // 调用数据
         userService.deleteUser(userId);
         // 校验结果
-        assertNull(userService.getUser(userId));
+        assertNull(userMapper.selectById(userId));
         // 校验调用次数
         verify(permissionService, times(1)).processUserDeleted(eq(userId));
     }

+ 6 - 0
yudao-core-service/pom.xml

@@ -67,6 +67,12 @@
             <artifactId>yudao-spring-boot-starter-config</artifactId>
         </dependency>
 
+        <!-- 消息队列相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mq</artifactId>
+        </dependency>
+
         <!-- Test 测试相关 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsChannelDO.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsChannelDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
 
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsLogDO.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsLogDO.java

@@ -1,10 +1,10 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsReceiveStatusEnum;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsSendStatusEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;

+ 2 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java

@@ -1,8 +1,8 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.sms.SysSmsTemplateTypeEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;

+ 3 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/user/SysUserDO.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/user/SysUserDO.java

@@ -1,9 +1,9 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.common.SysSexEnum;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.framework.mybatis.core.type.JsonLongSetTypeHandler;
-import cn.iocoder.yudao.adminserver.modules.system.enums.common.SysSexEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -16,7 +16,7 @@ import java.util.Set;
 /**
  * 管理后台的用户 DO
  *
- * @author ruoyi
+ * @author 芋道源码
  */
 @TableName(value = "sys_user", autoResultMap = true)
 @Data

+ 13 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsLogCoreMapper.java

@@ -0,0 +1,13 @@
+package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface SysSmsLogCoreMapper extends BaseMapperX<SysSmsLogDO> {
+}

+ 16 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/sms/SysSmsTemplateCoreMapper.java

@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Date;
+
+@Mapper
+public interface SysSmsTemplateCoreMapper extends BaseMapperX<SysSmsTemplateDO> {
+
+    @Select("SELECT id FROM sys_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
+    Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
+
+}

+ 11 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/user/SysUserCoreMapper.java

@@ -0,0 +1,11 @@
+package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserCoreMapper extends BaseMapperX<SysUserDO> {
+
+}

+ 17 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.coreservice.modules.system.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * System 错误码枚举类
+ *
+ * system 系统,使用 1-006-000-000 段
+ */
+public interface SysErrorCodeConstants {
+
+    // ========== 短信发送 1006000000 ==========
+    ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1006000000, "手机号不存在");
+    ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1006000001, "模板参数({})缺失");
+    ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1006000000, "短信模板不存在");
+
+}

+ 3 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/common/SysSexEnum.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/common/SysSexEnum.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.common;
+package cn.iocoder.yudao.coreservice.modules.system.enums.common;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -11,12 +11,14 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum SysSexEnum {
+
     /** 男 */
     MALE(1),
     /** 女 */
     FEMALE(2),
     /* 未知 */
     UNKNOWN(3);
+
     /**
      * 性别
      */

+ 0 - 1
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/package-info.java

@@ -1 +0,0 @@
-package cn.iocoder.yudao.coreservice.modules.system.enums;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsReceiveStatusEnum.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsReceiveStatusEnum.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
+package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsSendStatusEnum.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsSendStatusEnum.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
+package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/sms/SysSmsTemplateTypeEnum.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/sms/SysSmsTemplateTypeEnum.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.sms;
+package cn.iocoder.yudao.coreservice.modules.system.enums.sms;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 4 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 占位
+ */
+package cn.iocoder.yudao.coreservice.modules.system.mq.message;

+ 1 - 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/mq/message/sms/SysSmsSendMessage.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/message/sms/SysSmsSendMessage.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.mq.message.sms;
+package cn.iocoder.yudao.coreservice.modules.system.mq.message.sms;
 
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.mq.core.stream.StreamMessage;

+ 4 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 占位
+ */
+package cn.iocoder.yudao.coreservice.modules.system.mq.producer;

+ 42 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/mq/producer/sms/SysSmsCoreProducer.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms;
+
+import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
+import cn.iocoder.yudao.framework.common.core.KeyValue;
+import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Sms 短信相关消息的 Core Producer
+ *
+ * @author zzf
+ * @date 2021/3/9 16:35
+ */
+@Slf4j
+@Component
+public class SysSmsCoreProducer {
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 发送 {@link SysSmsSendMessage} 消息
+     *
+     * @param logId 短信日志编号
+     * @param mobile 手机号
+     * @param channelId 渠道编号
+     * @param apiTemplateId 短信模板编号
+     * @param templateParams 短信模板参数
+     */
+    public void sendSmsSendMessage(Long logId, String mobile,
+                                   Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
+        SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
+        message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
+        RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
+    }
+
+}

+ 11 - 10
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsService.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreService.java

@@ -1,21 +1,22 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.sms;
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
 
-import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
+import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
 
 import java.util.List;
 import java.util.Map;
 
 /**
- * 短信Service接口
- * 只支持异步,因此没有返回值
+ * 短信 Service Core 接口
  *
- * @author zzf
- * @date 2021/1/25 9:24
+ * 接入方,通过调用 send 开头的方法,创建发送短信的任务到 MQ 中
+ * 后续,yudao-admin-server 监听 MQ,执行真正的短信发送逻辑
+ *
+ * @author 芋道源码
  */
-public interface SysSmsService {
+public interface SysSmsCoreService {
 
     /**
-     * 发送单条短信给用户(管理员)
+     * 发送单条短信给后台用户
      *
      * 在 mobile 为空时,使用 userId 加载对应管理员的手机号
      *
@@ -29,7 +30,7 @@ public interface SysSmsService {
                               String templateCode, Map<String, Object> templateParams);
 
     /**
-     * 发送单条短信给用户(会员)
+     * 发送单条短信给前台用户
      *
      * 在 mobile 为空时,使用 userId 加载对应会员的手机号
      *
@@ -40,7 +41,7 @@ public interface SysSmsService {
      * @return 发送日志编号
      */
     Long sendSingleSmsToMember(String mobile, Long userId,
-                              String templateCode, Map<String, Object> templateParams);
+                               String templateCode, Map<String, Object> templateParams);
 
     Long sendSingleSms(String mobile, Long userId, Integer userType,
                        String templateCode, Map<String, Object> templateParams);

+ 56 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 短信日志 Core Service 接口
+ *
+ * @author zzf
+ * @date 13:48 2021/3/2
+ */
+public interface SysSmsLogCoreService {
+
+    /**
+     * 创建短信日志
+     *
+     * @param mobile 手机号
+     * @param userId 用户编号
+     * @param userType 用户类型
+     * @param isSend 是否发送
+     * @param template 短信模板
+     * @param templateContent 短信内容
+     * @param templateParams 短信参数
+     * @return 发送日志编号
+     */
+    Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
+                      SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
+
+    /**
+     * 更新日志的发送结果
+     *
+     * @param id 日志编号
+     * @param sendCode 发送结果的编码
+     * @param sendMsg 发送结果的提示
+     * @param apiSendCode 短信 API 发送结果的编码
+     * @param apiSendMsg 短信 API 发送失败的提示
+     * @param apiRequestId 短信 API 发送返回的唯一请求 ID
+     * @param apiSerialNo 短信 API 发送返回的序号
+     */
+    void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
+                             String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo);
+
+    /**
+     * 更新日志的接收结果
+     *
+     * @param id 日志编号
+     * @param success 是否接收成功
+     * @param receiveTime 用户接收时间
+     * @param apiReceiveCode API 接收结果的编码
+     * @param apiReceiveMsg API 接收结果的说明
+     */
+    void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg);
+
+}

+ 36 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateCoreService.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+
+import java.util.Map;
+
+/**
+ * 短信模板 Core Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface SysSmsTemplateCoreService {
+
+    /**
+     * 初始化短信模板的本地缓存
+     */
+    void initLocalCache();
+
+    /**
+     * 获得短信模板,从缓存中
+     *
+     * @param code 模板编码
+     * @return 短信模板
+     */
+    SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code);
+
+    /**
+     * 格式化短信内容
+     *
+     * @param content 短信模板的内容
+     * @param params 内容的参数
+     * @return 格式化后的内容
+     */
+    String formatSmsTemplateContent(String content, Map<String, Object> params);
+
+}

+ 30 - 32
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/impl/SysSmsServiceImpl.java → yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsCoreServiceImpl.java

@@ -1,7 +1,15 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.sms.impl;
+package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
+import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -10,16 +18,7 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
 import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.user.SysUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
-import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsLogService;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsService;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.SysSmsTemplateService;
-import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
 import com.google.common.annotations.VisibleForTesting;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
@@ -28,36 +27,35 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
 
 /**
- * 短信日志Service实现类
+ * 短信 Service Core 实现
  *
- * @author zzf
- * @date 2021/1/25 9:25
+ * @author 芋道源码
  */
 @Service
-@Slf4j
-public class SysSmsServiceImpl implements SysSmsService {
+public class SysSmsCoreServiceImpl implements SysSmsCoreService {
 
     @Resource
-    private SysSmsTemplateService smsTemplateService;
+    private SysUserCoreService sysUserCoreService;
     @Resource
-    private SysSmsLogService smsLogService;
+    private SysSmsTemplateCoreService smsTemplateCoreService;
     @Resource
-    private SysSmsProducer smsProducer;
+    private SysSmsLogCoreService smsLogCoreService;
+
     @Resource
     private SmsClientFactory smsClientFactory;
 
     @Resource
-    private SysUserService userService;
+    private SysSmsCoreProducer smsCoreProducer;
 
     @Override
     public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) {
         // 如果 mobile 为空,则加载用户编号对应的手机号
         if (StrUtil.isEmpty(mobile)) {
-            SysUserDO user = userService.getUser(userId);
+            SysUserDO user = sysUserCoreService.getUser(userId);
             if (user != null) {
                 mobile = user.getMobile();
             }
@@ -83,12 +81,13 @@ public class SysSmsServiceImpl implements SysSmsService {
 
         // 创建发送日志
         Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志
-        String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
-        Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
+        String content = smsTemplateCoreService.formatSmsTemplateContent(template.getContent(), templateParams);
+        Long sendLogId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
 
         // 发送 MQ 消息,异步执行发送短信
         if (isSend) {
-            smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams);
+            smsCoreProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(),
+                    template.getApiTemplateId(), newTemplateParams);
         }
         return sendLogId;
     }
@@ -102,10 +101,10 @@ public class SysSmsServiceImpl implements SysSmsService {
     @VisibleForTesting
     public SysSmsTemplateDO checkSmsTemplateValid(String templateCode) {
         // 获得短信模板。考虑到效率,从缓存中获取
-        SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
+        SysSmsTemplateDO template = smsTemplateCoreService.getSmsTemplateByCodeFromCache(templateCode);
         // 短信模板不存在
         if (template == null) {
-            throw exception(SMS_TEMPLATE_NOT_EXISTS);
+            throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS);
         }
         return template;
     }
@@ -138,6 +137,7 @@ public class SysSmsServiceImpl implements SysSmsService {
         return mobile;
     }
 
+
     @Override
     public void doSendSms(SysSmsSendMessage message) {
         // 获得渠道对应的 SmsClient 客户端
@@ -146,7 +146,7 @@ public class SysSmsServiceImpl implements SysSmsService {
         // 发送短信
         SmsCommonResult<SmsSendRespDTO> sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(),
                 message.getApiTemplateId(), message.getTemplateParams());
-        smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
+        smsLogCoreService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
                 sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(),
                 sendResult.getData() != null ? sendResult.getData().getSerialNo() : null);
     }
@@ -161,11 +161,9 @@ public class SysSmsServiceImpl implements SysSmsService {
         if (CollUtil.isEmpty(receiveResults)) {
             return;
         }
-        // 更新短信日志的接收结果. 因为量一般不打,所以先使用 for 循环更新
-        receiveResults.forEach(result -> {
-            smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSuccess(), result.getReceiveTime(),
-                    result.getErrorCode(), result.getErrorCode());
-        });
+        // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
+        receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(result.getLogId(),
+                result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorCode()));
     }
 
 }

+ 72 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsLogCoreServiceImpl.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsLogCoreService;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 短信日志 Core Service 实现类
+ *
+ * @author zzf
+ * @date 2021/1/25 9:25
+ */
+@Slf4j
+@Service
+public class SysSmsLogCoreServiceImpl implements SysSmsLogCoreService {
+
+    @Resource
+    private SysSmsLogCoreMapper smsLogCoreMapper;
+
+    @Override
+    public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
+                             SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
+        SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder();
+        // 根据是否要发送,设置状态
+        logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus()
+                : SysSmsSendStatusEnum.IGNORE.getStatus());
+        // 设置手机相关字段
+        logBuilder.mobile(mobile).userId(userId).userType(userType);
+        // 设置模板相关字段
+        logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType());
+        logBuilder.templateContent(templateContent).templateParams(templateParams).apiTemplateId(template.getApiTemplateId());
+        // 设置渠道相关字段
+        logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
+        // 设置接收相关字段
+        logBuilder.receiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus());
+
+        // 插入数据库
+        SysSmsLogDO logDO = logBuilder.build();
+        smsLogCoreMapper.insert(logDO);
+        return logDO.getId();
+    }
+
+    @Override
+    public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
+                                    String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) {
+        SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS
+                : SysSmsSendStatusEnum.FAILURE;
+        smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date())
+                .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
+                .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
+    }
+
+    @Override
+    public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg) {
+        SysSmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? SysSmsReceiveStatusEnum.SUCCESS
+                : SysSmsReceiveStatusEnum.FAILURE;
+        smsLogCoreMapper.updateById(SysSmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()).receiveTime(receiveTime)
+                .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
+    }
+
+}

+ 105 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/impl/SysSmsTemplateCoreServiceImpl.java

@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsTemplateCoreService;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信模板 Core Service 接口
+ *
+ * @author 芋道源码
+ */
+@Service
+@Slf4j
+public class SysSmsTemplateCoreServiceImpl implements SysSmsTemplateCoreService {
+
+    /**
+     * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
+     * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高
+     */
+    private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L;
+
+    /**
+     * 短信模板缓存
+     * key:短信模板编码 {@link SysSmsTemplateDO#getCode()}
+     *
+     * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
+     */
+    private volatile Map<String, SysSmsTemplateDO> smsTemplateCache;
+    /**
+     * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新
+     */
+    private volatile Date maxUpdateTime;
+
+    @Resource
+    private SysSmsTemplateCoreMapper smsTemplateCoreMapper;
+
+    @Override
+    @PostConstruct
+    public void initLocalCache() {
+        // 获取短信模板列表,如果有更新
+        List<SysSmsTemplateDO> smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime);
+        if (CollUtil.isEmpty(smsTemplateList)) {
+            return;
+        }
+
+        // 写入缓存
+        ImmutableMap.Builder<String, SysSmsTemplateDO> builder = ImmutableMap.builder();
+        smsTemplateList.forEach(sysSmsTemplateDO -> builder.put(sysSmsTemplateDO.getCode(), sysSmsTemplateDO));
+        smsTemplateCache = builder.build();
+        assert smsTemplateList.size() > 0; // 断言,避免告警
+        maxUpdateTime = smsTemplateList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime();
+        log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size());
+    }
+
+    /**
+     * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。
+     * 如果未发生变化,则返回空
+     *
+     * @param maxUpdateTime 当前短信模板的最大更新时间
+     * @return 短信模板列表
+     */
+    private List<SysSmsTemplateDO> loadSmsTemplateIfUpdate(Date maxUpdateTime) {
+        // 第一步,判断是否要更新。
+        if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
+            log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]");
+        } else { // 判断数据库中是否有更新的短信模板
+            if (smsTemplateCoreMapper.selectExistsByUpdateTimeAfter(maxUpdateTime) == null) {
+                return null;
+            }
+            log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]");
+        }
+        // 第二步,如果有更新,则从数据库加载所有短信模板
+        return smsTemplateCoreMapper.selectList();
+    }
+
+    @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
+    public void schedulePeriodicRefresh() {
+        initLocalCache();
+    }
+
+    @Override
+    public SysSmsTemplateDO getSmsTemplateByCodeFromCache(String code) {
+        return smsTemplateCache.get(code);
+    }
+
+    @Override
+    public String formatSmsTemplateContent(String content, Map<String, Object> params) {
+        return StrUtil.format(content, params);
+    }
+
+}

+ 20 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/SysUserCoreService.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.user;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+
+/**
+ * 后台用户 Service Core 接口
+ *
+ * @author 芋道源码
+ */
+public interface SysUserCoreService {
+
+    /**
+     * 通过用户 ID 查询用户
+     *
+     * @param id 用户ID
+     * @return 用户对象信息
+     */
+    SysUserDO getUser(Long id);
+
+}

+ 26 - 0
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/user/impl/SysUserCoreServiceImpl.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.user.impl;
+
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.user.SysUserCoreMapper;
+import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 后台用户 Service Core 实现
+ *
+ * @author 芋道源码
+ */
+@Service
+public class SysUserCoreServiceImpl implements SysUserCoreService {
+
+    @Resource
+    private SysUserCoreMapper userCoreMapper;
+
+    @Override
+    public SysUserDO getUser(Long id) {
+        return userCoreMapper.selectById(id);
+    }
+
+}

+ 5 - 3
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/logger/SysLoginLogServiceImplTest.java

@@ -1,6 +1,5 @@
 package cn.iocoder.yudao.coreservice.modules.system.service.logger;
 
-import cn.hutool.core.util.RandomUtil;
 import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.logger.SysLoginLogDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.logger.SysLoginLogCoreMapper;
@@ -8,6 +7,7 @@ import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeE
 import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.impl.SysLoginLogCoreServiceImpl;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
 import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
 import org.junit.jupiter.api.Test;
@@ -15,6 +15,7 @@ import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
 
+import static cn.hutool.core.util.RandomUtil.randomEle;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
 
 @Import(SysLoginLogCoreServiceImpl.class)
@@ -30,8 +31,9 @@ public class SysLoginLogServiceImplTest extends BaseDbUnitTest {
     public void testCreateLoginLog() {
         SysLoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(SysLoginLogCreateReqDTO.class, vo -> {
             // 指定随机的范围,避免超出范围入库失败
-            vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
-            vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult());
+            vo.setUserType(randomEle(UserTypeEnum.values()).getValue());
+            vo.setLogType(randomEle(SysLoginLogTypeEnum.values()).getType());
+            vo.setResult(randomEle(SysLoginResultEnum.values()).getResult());
             vo.setTraceId(TracerUtils.getTraceId());
         });
 

+ 31 - 33
yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/sms/SysSmsServiceTest.java → yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsCoreServiceTest.java

@@ -1,6 +1,10 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.sms;
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
 
 import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.mq.message.sms.SysSmsSendMessage;
+import cn.iocoder.yudao.coreservice.modules.system.mq.producer.sms.SysSmsCoreProducer;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsCoreServiceImpl;
 import cn.iocoder.yudao.framework.common.core.KeyValue;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -9,10 +13,6 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
 import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
 import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
-import cn.iocoder.yudao.adminserver.modules.system.mq.message.sms.SysSmsSendMessage;
-import cn.iocoder.yudao.adminserver.modules.system.mq.producer.sms.SysSmsProducer;
-import cn.iocoder.yudao.adminserver.modules.system.service.sms.impl.SysSmsServiceImpl;
 import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
 import org.assertj.core.util.Lists;
 import org.junit.jupiter.api.Test;
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import static cn.hutool.core.util.RandomUtil.randomEle;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.*;
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.*;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -32,21 +32,21 @@ import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.*;
 
 /**
- * {@link SysSmsServiceImpl} 的单元测试类
+ * {@link SysSmsCoreService} 的单元测试类
  *
  * @author 芋道源码
  */
-public class SysSmsServiceTest extends BaseMockitoUnitTest {
+public class SysSmsCoreServiceTest extends BaseMockitoUnitTest {
 
     @InjectMocks
-    private SysSmsServiceImpl smsService;
+    private SysSmsCoreServiceImpl smsCoreService;
 
     @Mock
-    private SysSmsTemplateService smsTemplateService;
+    private SysSmsTemplateCoreService smsTemplateCoreService;
     @Mock
-    private SysSmsLogService smsLogService;
+    private SysSmsLogCoreService smsLogCoreService;
     @Mock
-    private SysSmsProducer smsProducer;
+    private SysSmsCoreProducer smsCoreProducer;
     @Mock
     private SmsClientFactory smsClientFactory;
 
@@ -68,21 +68,21 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
             o.setContent("验证码为{code}, 操作为{op}");
             o.setParams(Lists.newArrayList("code", "op"));
         });
-        when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
+        when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
         String content = randomString();
-        when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
+        when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
                 .thenReturn(content);
         // mock SmsLogService 的方法
         Long smsLogId = randomLongId();
-        when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template),
+        when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template),
                 eq(content), eq(templateParams))).thenReturn(smsLogId);
 
         // 调用
-        Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
+        Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
         // 断言
         assertEquals(smsLogId, resultSmsLogId);
         // 断言调用
-        verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile),
+        verify(smsCoreProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile),
                 eq(template.getChannelId()), eq(template.getApiTemplateId()),
                 eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login"))));
     }
@@ -105,21 +105,21 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
             o.setContent("验证码为{code}, 操作为{op}");
             o.setParams(Lists.newArrayList("code", "op"));
         });
-        when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
+        when(smsTemplateCoreService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template);
         String content = randomString();
-        when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
+        when(smsTemplateCoreService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams)))
                 .thenReturn(content);
         // mock SmsLogService 的方法
         Long smsLogId = randomLongId();
-        when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template),
+        when(smsLogCoreService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template),
                 eq(content), eq(templateParams))).thenReturn(smsLogId);
 
         // 调用
-        Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
+        Long resultSmsLogId = smsCoreService.sendSingleSms(mobile, userId, userType, templateCode, templateParams);
         // 断言
         assertEquals(smsLogId, resultSmsLogId);
         // 断言调用
-        verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(),
+        verify(smsCoreProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(),
                 anyLong(), any(), anyList());
     }
 
@@ -130,8 +130,8 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
         // mock 方法
 
         // 调用,并断言异常
-        assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode),
-                SMS_TEMPLATE_NOT_EXISTS);
+        assertServiceException(() -> smsCoreService.checkSmsTemplateValid(templateCode),
+                SMS_SEND_TEMPLATE_NOT_EXISTS);
     }
 
     @Test
@@ -143,7 +143,7 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
         // mock 方法
 
         // 调用,并断言异常
-        assertServiceException(() -> smsService.buildTemplateParams(template, templateParams),
+        assertServiceException(() -> smsCoreService.buildTemplateParams(template, templateParams),
                 SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code");
     }
 
@@ -153,7 +153,7 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
         // mock 方法
 
         // 调用,并断言异常
-        assertServiceException(() -> smsService.checkMobile(null),
+        assertServiceException(() -> smsCoreService.checkMobile(null),
                 SMS_SEND_MOBILE_NOT_EXISTS);
     }
 
@@ -171,9 +171,9 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
                 eq(message.getTemplateParams()))).thenReturn(sendResult);
 
         // 调用
-        smsService.doSendSms(message);
+        smsCoreService.doSendSms(message);
         // 断言
-        verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()),
+        verify(smsLogCoreService, times(1)).updateSmsSendResult(eq(message.getLogId()),
                 eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()),
                 eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo()));
     }
@@ -190,12 +190,10 @@ public class SysSmsServiceTest extends BaseMockitoUnitTest {
         List<SmsReceiveRespDTO> receiveResults = randomPojoList(SmsReceiveRespDTO.class);
 
         // 调用
-        smsService.receiveSmsStatus(channelCode, text);
+        smsCoreService.receiveSmsStatus(channelCode, text);
         // 断言
-        receiveResults.forEach(result -> {
-            smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
-                    eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()));
-        });
+        receiveResults.forEach(result -> smsLogCoreService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
+                eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
     }
 
 }

+ 149 - 0
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsLogCoreServiceTest.java

@@ -0,0 +1,149 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
+
+import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsLogDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsLogCoreMapper;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsReceiveStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsSendStatusEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsLogCoreServiceImpl;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import static cn.hutool.core.util.RandomUtil.randomBoolean;
+import static cn.hutool.core.util.RandomUtil.randomEle;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+* {@link SysSmsLogCoreServiceImpl} 的单元测试类
+*
+* @author 芋道源码
+*/
+@Import(SysSmsLogCoreServiceImpl.class)
+public class SysSmsLogCoreServiceTest extends BaseDbUnitTest {
+
+    @Resource
+    private SysSmsLogCoreServiceImpl smsLogCoreService;
+
+    @Resource
+    private SysSmsLogCoreMapper smsLogCoreMapper;
+
+    @Test
+    public void testCreateSmsLog() {
+        // 准备参数
+        String mobile = randomString();
+        Long userId = randomLongId();
+        Integer userType = randomEle(UserTypeEnum.values()).getValue();
+        Boolean isSend = randomBoolean();
+        SysSmsTemplateDO templateDO = randomPojo(SysSmsTemplateDO.class,
+                o -> o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()));
+        String templateContent = randomString();
+        Map<String, Object> templateParams = randomTemplateParams();
+        // mock 方法
+
+        // 调用
+        Long logId = smsLogCoreService.createSmsLog(mobile, userId, userType, isSend,
+                templateDO, templateContent, templateParams);
+        // 断言
+        SysSmsLogDO logDO = smsLogCoreMapper.selectById(logId);
+        assertEquals(isSend ? SysSmsSendStatusEnum.INIT.getStatus() : SysSmsSendStatusEnum.IGNORE.getStatus(),
+                logDO.getSendStatus());
+        assertEquals(mobile, logDO.getMobile());
+        assertEquals(userType, logDO.getUserType());
+        assertEquals(userId, logDO.getUserId());
+        assertEquals(templateDO.getId(), logDO.getTemplateId());
+        assertEquals(templateDO.getCode(), logDO.getTemplateCode());
+        assertEquals(templateDO.getType(), logDO.getTemplateType());
+        assertEquals(templateDO.getChannelId(), logDO.getChannelId());
+        assertEquals(templateDO.getChannelCode(), logDO.getChannelCode());
+        assertEquals(templateContent, logDO.getTemplateContent());
+        assertEquals(templateParams, logDO.getTemplateParams());
+        assertEquals(SysSmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus());
+    }
+
+    @Test
+    public void testUpdateSmsSendResult() {
+        // mock 数据
+        SysSmsLogDO dbSmsLog = randomSmsLogDO(
+                o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()));
+        smsLogCoreMapper.insert(dbSmsLog);
+        // 准备参数
+        Long id = dbSmsLog.getId();
+        Integer sendCode = randomInteger();
+        String sendMsg = randomString();
+        String apiSendCode = randomString();
+        String apiSendMsg = randomString();
+        String apiRequestId = randomString();
+        String apiSerialNo = randomString();
+
+        // 调用
+        smsLogCoreService.updateSmsSendResult(id, sendCode, sendMsg,
+                apiSendCode, apiSendMsg, apiRequestId, apiSerialNo);
+        // 断言
+        dbSmsLog = smsLogCoreMapper.selectById(id);
+        assertEquals(CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS.getStatus()
+                : SysSmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus());
+        assertNotNull(dbSmsLog.getSendTime());
+        assertEquals(sendMsg, dbSmsLog.getSendMsg());
+        assertEquals(apiSendCode, dbSmsLog.getApiSendCode());
+        assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg());
+        assertEquals(apiRequestId, dbSmsLog.getApiRequestId());
+        assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo());
+    }
+
+    @Test
+    public void testUpdateSmsReceiveResult() {
+        // mock 数据
+        SysSmsLogDO dbSmsLog = randomSmsLogDO(
+                o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()));
+        smsLogCoreMapper.insert(dbSmsLog);
+        // 准备参数
+        Long id = dbSmsLog.getId();
+        Boolean success = randomBoolean();
+        Date receiveTime = randomDate();
+        String apiReceiveCode = randomString();
+        String apiReceiveMsg = randomString();
+
+        // 调用
+        smsLogCoreService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
+        // 断言
+        dbSmsLog = smsLogCoreMapper.selectById(id);
+        assertEquals(success ? SysSmsReceiveStatusEnum.SUCCESS.getStatus()
+                : SysSmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus());
+        assertEquals(receiveTime, dbSmsLog.getReceiveTime());
+        assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode());
+        assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg());
+    }
+
+    // ========== 随机对象 ==========
+
+    @SafeVarargs
+    private static SysSmsLogDO randomSmsLogDO(Consumer<SysSmsLogDO>... consumers) {
+        Consumer<SysSmsLogDO> consumer = (o) -> {
+            o.setTemplateParams(randomTemplateParams());
+            o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围
+            o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围
+            o.setSendStatus(randomEle(SysSmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围
+            o.setReceiveStatus(randomEle(SysSmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围
+        };
+        return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers));
+    }
+
+
+    private static Map<String, Object> randomTemplateParams() {
+        return MapUtil.<String, Object>builder().put(randomString(), randomString())
+                .put(randomString(), randomString()).build();
+    }
+}

+ 71 - 0
yudao-core-service/src/test/java/cn/iocoder/yudao/coreservice/modules/system/service/sms/SysSmsTemplateServiceTest.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.coreservice.modules.system.service.sms;
+
+import cn.iocoder.yudao.coreservice.BaseDbUnitTest;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.sms.SysSmsTemplateCoreMapper;
+import cn.iocoder.yudao.coreservice.modules.system.enums.sms.SysSmsTemplateTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.sms.impl.SysSmsTemplateCoreServiceImpl;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import static cn.hutool.core.bean.BeanUtil.getFieldValue;
+import static cn.hutool.core.util.RandomUtil.randomEle;
+import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+* {@link SysSmsTemplateCoreServiceImpl} 的单元测试类
+*
+* @author 芋道源码
+*/
+@Import(SysSmsTemplateCoreServiceImpl.class)
+public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
+
+    @Resource
+    private SysSmsTemplateCoreServiceImpl smsTemplateCoreService;
+
+    @Resource
+    private SysSmsTemplateCoreMapper smsTemplateCoreMapper;
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void testInitLocalCache() {
+        // mock 数据
+        SysSmsTemplateDO smsTemplate01 = randomSmsTemplateDO();
+        smsTemplateCoreMapper.insert(smsTemplate01);
+        SysSmsTemplateDO smsTemplate02 = randomSmsTemplateDO();
+        smsTemplateCoreMapper.insert(smsTemplate02);
+
+        // 调用
+        smsTemplateCoreService.initLocalCache();
+        // 断言 deptCache 缓存
+        Map<String, SysSmsTemplateDO> smsTemplateCache = (Map<String, SysSmsTemplateDO>) getFieldValue(smsTemplateCoreService, "smsTemplateCache");
+        assertEquals(2, smsTemplateCache.size());
+        assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode()));
+        assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode()));
+        // 断言 maxUpdateTime 缓存
+        Date maxUpdateTime = (Date) getFieldValue(smsTemplateCoreService, "maxUpdateTime");
+        assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime);
+    }
+
+    // ========== 随机对象 ==========
+
+    @SafeVarargs
+    private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) {
+        Consumer<SysSmsTemplateDO> consumer = (o) -> {
+            o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
+            o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围
+        };
+        return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers));
+    }
+
+}

+ 2 - 0
yudao-core-service/src/test/resources/sql/clean.sql

@@ -5,3 +5,5 @@ DELETE FROM "inf_api_error_log";
 -- sys 开头的 DB
 DELETE FROM "sys_user_session";
 DELETE FROM "sys_dict_data";
+DELETE FROM "sys_sms_template";
+DELETE FROM "sys_sms_log";

+ 73 - 2
yudao-core-service/src/test/resources/sql/create_tables.sql

@@ -56,7 +56,7 @@ CREATE TABLE IF NOT EXISTS "inf_api_access_log" (
     "update_time" timestamp not null default current_timestamp,
     "deleted" bit not null default false,
     primary key ("id")
-    ) COMMENT 'API 访问日志表';
+) COMMENT 'API 访问日志表';
 
 CREATE TABLE IF NOT EXISTS "inf_api_error_log" (
     "id" integer not null GENERATED BY DEFAULT AS IDENTITY,
@@ -87,4 +87,75 @@ CREATE TABLE IF NOT EXISTS "inf_api_error_log" (
     "update_time" timestamp not null default current_timestamp,
     "deleted" bit not null default false,
     primary key ("id")
-    ) COMMENT '系统异常日志';
+) COMMENT '系统异常日志';
+
+CREATE TABLE IF NOT EXISTS "sys_sms_template" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "type" tinyint NOT NULL,
+    "status" tinyint NOT NULL,
+    "code" varchar(63) NOT NULL,
+    "name" varchar(63) NOT NULL,
+    "content" varchar(255) NOT NULL,
+    "params" varchar(255) NOT NULL,
+    "remark" varchar(255) DEFAULT NULL,
+    "api_template_id" varchar(63) NOT NULL,
+    "channel_id" bigint NOT NULL,
+    "channel_code" varchar(63) NOT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '短信模板';
+
+CREATE TABLE IF NOT EXISTS "sys_sms_log" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "channel_id" bigint NOT NULL,
+    "channel_code" varchar(63) NOT NULL,
+    "template_id" bigint NOT NULL,
+    "template_code" varchar(63) NOT NULL,
+    "template_type" tinyint NOT NULL,
+    "template_content" varchar(255) NOT NULL,
+    "template_params" varchar(255) NOT NULL,
+    "api_template_id" varchar(63) NOT NULL,
+    "mobile" varchar(11) NOT NULL,
+    "user_id" bigint DEFAULT '0',
+    "user_type" tinyint DEFAULT '0',
+    "send_status" tinyint NOT NULL DEFAULT '0',
+    "send_time" timestamp DEFAULT NULL,
+    "send_code" int DEFAULT NULL,
+    "send_msg" varchar(255) DEFAULT NULL,
+    "api_send_code" varchar(63) DEFAULT NULL,
+    "api_send_msg" varchar(255) DEFAULT NULL,
+    "api_request_id" varchar(255) DEFAULT NULL,
+    "api_serial_no" varchar(255) DEFAULT NULL,
+    "receive_status" tinyint NOT NULL DEFAULT '0',
+    "receive_time" timestamp DEFAULT NULL,
+    "api_receive_code" varchar(63) DEFAULT NULL,
+    "api_receive_msg" varchar(255) DEFAULT NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '短信日志';
+
+CREATE TABLE IF NOT EXISTS `sys_login_log` (
+    `id`          bigint(20)   NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    `log_type`    bigint(4)    NOT NULL,
+    "user_id" bigint not null default '0',
+    "user_type" tinyint NOT NULL,
+    `trace_id`    varchar(64)  NOT NULL DEFAULT '',
+    `username`    varchar(50)  NOT NULL DEFAULT '',
+    `result`      tinyint(4)   NOT NULL,
+    `user_ip`     varchar(50)  NOT NULL,
+    `user_agent`  varchar(512) NOT NULL,
+    `creator`   varchar(64)           DEFAULT '',
+    `create_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    `updater`   varchar(64)           DEFAULT '',
+    `update_time` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `deleted`     bit(1)       NOT NULL DEFAULT '0',
+    PRIMARY KEY (`id`)
+) COMMENT ='系统访问记录';

+ 3 - 2
更新日志.md

@@ -16,9 +16,10 @@
 
 * 新增管理后台的企业微信、钉钉等社交登录
 * 新增用户前台(例如说,用户使用的小程序)的后端项目 `yudao-user-server`
-* 新增公共服务 `yudao-core-service` 项目,通过 Jar 包的方式,提供 `yudao-user-server` 和 `yudao-admin-server` 的共享逻辑的复用
+* 新增公共服务 `yudao-core-service` 项目,通过 Jar 包的方式,提供 `yudao-user-server` 和 `yudao-admin-server` 的共享逻辑的复用
 * 新增用户前台的手机登录、验证码登录 
-* 修复管理后台的用户头像上传 404 的问题
+* 修复管理后台的用户头像上传 404 的问题,原因是请求路径不对
+* 修复用户导入失败的问题,原因是 Lombok 链式与 cglib 读取属性有冲突
 
 ## [v1.0.0] 2021.05.03