xucaiqin 1 mês atrás
pai
commit
1ac29e95f4
66 arquivos alterados com 1248 adições e 2530 exclusões
  1. 21 0
      sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/feign/SmsApiService.java
  2. 20 0
      sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/model/GetSmsDto.java
  3. 22 0
      sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/model/SendSmsDto.java
  4. 11 5
      sckw-modules/sckw-message/pom.xml
  5. 0 2
      sckw-modules/sckw-message/src/main/java/com/sckw/message/MessageApplication.java
  6. 0 34
      sckw-modules/sckw-message/src/main/java/com/sckw/message/consumer/SckwMessageConsumer.java
  7. 0 36
      sckw-modules/sckw-message/src/main/java/com/sckw/message/consumer/SckwSmsConsumer.java
  8. 0 125
      sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/MessageController.java
  9. 41 20
      sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/SmsController.java
  10. 0 41
      sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/background/SmsBackgroundController.java
  11. 0 39
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageMapper.java
  12. 0 47
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageUserMapper.java
  13. 0 16
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsMapper.java
  14. 13 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsRecordMapper.java
  15. 13 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsTemplateMapper.java
  16. 13 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsVerifyCodeMapper.java
  17. 0 20
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dubbo/SmsInfoServiceImpl.java
  18. 46 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/feign/SmsApiServiceImpl.java
  19. 0 61
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmMessage.java
  20. 0 41
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmMessageUser.java
  21. 0 52
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSms.java
  22. 188 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsRecord.java
  23. 125 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsTemplate.java
  24. 82 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsVerifyCode.java
  25. 0 20
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/TestMessaging.java
  26. 24 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/BatchSendSmsBo.java
  27. 21 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/GetVerifyCodeBo.java
  28. 23 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsBo.java
  29. 26 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsRecordQueryBo.java
  30. 20 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsTemplateQueryBo.java
  31. 20 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/VerifyCodeBo.java
  32. 0 91
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/MessageListDTO.java
  33. 0 72
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/SelectMessagesDTO.java
  34. 0 60
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/UserMsgCenterLatestMsgDTO.java
  35. 0 32
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/UserMsgCenterReqDTO.java
  36. 0 33
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/DeleteMessagesReqVO.java
  37. 0 28
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/FindMessagesReqVO.java
  38. 0 29
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/GetSmsVerifyCoderReqVO.java
  39. 0 21
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/MessagesStatisticsReqVO.java
  40. 0 28
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/MockMessageReq.java
  41. 0 26
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/ReadMessagesReqVO.java
  42. 0 51
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/SelectMessagesReqVO.java
  43. 0 26
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/SendSmsVerifyCoderReqVO.java
  44. 0 38
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/StatisticsMessagesReqVO.java
  45. 0 83
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/KwmMessageListResVO.java
  46. 0 67
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/MessagesStatisticsResVO.java
  47. 0 65
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/UserCenterMsgVO.java
  48. 0 37
      sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/UserMsgCenterResVO.java
  49. 0 27
      sckw-modules/sckw-message/src/main/java/com/sckw/message/producer/DelayProducer.java
  50. 0 185
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageService.java
  51. 0 194
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageUserService.java
  52. 12 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsRecordService.java
  53. 0 32
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsService.java
  54. 12 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsTemplateService.java
  55. 12 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsVerifyCodeService.java
  56. 0 335
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/MessageService.java
  57. 0 89
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwMessageHandlerService.java
  58. 0 78
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java
  59. 19 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsHelper.java
  60. 308 56
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java
  61. 15 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsRecordServiceImpl.java
  62. 15 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsTemplateServiceImpl.java
  63. 15 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsVerifyCodeServiceImpl.java
  64. 111 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/utils/SmsUtil.java
  65. 0 105
      sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageMapper.xml
  66. 0 83
      sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageUserMapper.xml

+ 21 - 0
sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/feign/SmsApiService.java

@@ -0,0 +1,21 @@
+package com.sckw.message.api.feign;
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.message.api.model.GetSmsDto;
+import com.sckw.message.api.model.SendSmsDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+
+@FeignClient(name = "sckw-ng-message", contextId = "SmsInfoApi")
+public interface SmsApiService {
+
+    @PostMapping(value = "/sms/getVerifyCode")
+    BaseResult<Object> getVerifyCode(GetSmsDto getSmsDto);
+
+    @PostMapping(value = "/sms/sendVerifyCode")
+    BaseResult<Object> sendVerifyCode(@RequestBody @Validated SendSmsDto sendSmsDto);
+
+}

+ 20 - 0
sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/model/GetSmsDto.java

@@ -0,0 +1,20 @@
+package com.sckw.message.api.model;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * @author xucaiqin
+ * @date 2026-05-07 11:13:39
+ */
+@Data
+public class GetSmsDto {
+    @NotBlank(message = "手机号不能为空")
+    private String mobile;
+
+    @NotBlank(message = "业务类型不能为空")
+    private String bizType;
+
+    private Boolean delete = true;
+
+}

+ 22 - 0
sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/model/SendSmsDto.java

@@ -0,0 +1,22 @@
+package com.sckw.message.api.model;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author xucaiqin
+ * @date 2026-05-07 11:13:39
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SendSmsDto {
+    @NotBlank(message = "手机号不能为空")
+    private String mobile;
+
+    @NotBlank(message = "业务类型不能为空")
+    private String bizType;
+
+}

+ 11 - 5
sckw-modules/sckw-message/pom.xml

@@ -48,11 +48,11 @@
             <version>${basic.version}</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-stream</artifactId>
-            <version>${basic.version}</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.sckw</groupId>-->
+<!--            <artifactId>sckw-common-stream</artifactId>-->
+<!--            <version>${basic.version}</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.sckw</groupId>
@@ -83,6 +83,12 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>4.5.1</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springdoc</groupId>
             <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>

+ 0 - 2
sckw-modules/sckw-message/src/main/java/com/sckw/message/MessageApplication.java

@@ -2,13 +2,11 @@ package com.sckw.message;
 
 import com.sckw.remote.annotation.SckwRemoteApplication;
 import com.sckw.startup.annotation.SckwCloudApplication;
-import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
 import org.springframework.boot.SpringApplication;
 
 /**
  * @author admin
  */
-@EnableAutoDataSourceProxy
 @SckwRemoteApplication
 @SckwCloudApplication
 public class MessageApplication {

+ 0 - 34
sckw-modules/sckw-message/src/main/java/com/sckw/message/consumer/SckwMessageConsumer.java

@@ -1,34 +0,0 @@
-package com.sckw.message.consumer;
-
-import com.alibaba.fastjson.JSON;
-import com.sckw.message.service.SckwMessageHandlerService;
-import com.sckw.stream.model.SckwMessage;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.function.Consumer;
-
-/**
- * @desc: message消费相关
- * @author: yzc
- * @date: 2023-06-09 15:32
- */
-@Configuration
-@RequiredArgsConstructor
-@Slf4j
-public class SckwMessageConsumer {
-    private final SckwMessageHandlerService sckwMessageHandlerService;
-
-    @Bean
-    public Consumer<SckwMessage> sckwMessage() {
-        return sckwMessage -> {
-            try {
-                sckwMessageHandlerService.handler(sckwMessage);
-            } catch (Exception e) {
-                log.error("处理message消息:{}异常", JSON.toJSONString(sckwMessage), e);
-            }
-        };
-    }
-}

+ 0 - 36
sckw-modules/sckw-message/src/main/java/com/sckw/message/consumer/SckwSmsConsumer.java

@@ -1,36 +0,0 @@
-package com.sckw.message.consumer;
-
-import com.alibaba.fastjson.JSON;
-import com.sckw.message.service.SckwSmsHandlerService;
-import com.sckw.stream.model.SckwSms;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.function.Consumer;
-
-/**
- * @desc: 短信消息消费
- * @author: yzc
- * @date: 2023-06-09 15:29
- */
-@Configuration
-@RequiredArgsConstructor
-@Slf4j
-public class SckwSmsConsumer {
-
-    private final SckwSmsHandlerService sckwSmsHandlerService;
-
-    @Bean
-    public Consumer<SckwSms> sckwSms() {
-        return sckwSms -> {
-            try {
-                sckwSmsHandlerService.handler(sckwSms);
-            } catch (Exception e) {
-                log.error("处理发送短信消息:{}异常", JSON.toJSONString(sckwSms), e);
-            }
-        };
-    }
-
-}

+ 0 - 125
sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/MessageController.java

@@ -1,125 +0,0 @@
-package com.sckw.message.controller;
-
-import com.sckw.core.model.page.PageRes;
-import com.sckw.core.utils.BeanUtils;
-import com.sckw.core.web.response.BaseResult;
-import com.sckw.core.web.response.HttpResult;
-import com.sckw.message.model.KwmMessage;
-import com.sckw.message.model.dto.SelectMessagesDTO;
-import com.sckw.message.model.vo.req.DeleteMessagesReqVO;
-import com.sckw.message.model.vo.req.ReadMessagesReqVO;
-import com.sckw.message.model.vo.req.SelectMessagesReqVO;
-import com.sckw.message.model.vo.req.StatisticsMessagesReqVO;
-import com.sckw.message.model.vo.res.KwmMessageListResVO;
-import com.sckw.message.service.MessageService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.validation.Valid;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @desc: 消息相关接口
- * @author: yzc
- * @date: 2023-06-09 15:13
- */
-@RestController
-@RequestMapping(value = "/kwmMessage")
-@RequiredArgsConstructor
-@Tag(name = "消息管理", description = "消息管理")
-public class MessageController {
-
-    private final MessageService messageService;
-
-    /**
-     * @param id
-     * @return com.sckw.core.web.response.HttpResult
-     * @desc: 获取消息详情
-     * @author: yzc
-     * @date: 2023-06-13 16:17
-     */
-    @GetMapping("/detail")
-    public HttpResult detail(@RequestParam Long id) {
-        KwmMessage message = messageService.detail(id);
-        return HttpResult.ok("获取消息详情成功", message);
-    }
-
-    @PostMapping(value = "/count", produces = MediaType.APPLICATION_JSON_VALUE)
-    @Operation(summary = "我的未读消息")
-    public BaseResult<Long> count(@RequestBody @Valid SelectMessagesReqVO params) {
-        Long res = messageService.count(BeanUtils.copyProperties(params, SelectMessagesDTO.class));
-        return BaseResult.success(res, "查询成功");
-    }
-
-    /**
-     * @param params
-     * @return com.sckw.core.web.response.HttpResult
-     * @desc: 分页查询消息
-     * @author: yzc
-     * @date: 2023-06-09 15:12
-     */
-    @PostMapping(value = "/select", produces = MediaType.APPLICATION_JSON_VALUE)
-    @Operation(summary = "分页查询消息")
-    public BaseResult<PageRes<KwmMessageListResVO>> select(@RequestBody @Valid SelectMessagesReqVO params) {
-        PageRes<KwmMessageListResVO> res = messageService.select(BeanUtils.copyProperties(params, SelectMessagesDTO.class));
-        return BaseResult.success(res, "分页查询消息成功");
-    }
-
-    /**
-     * @desc: 消息列表统计查询
-     * @author: yzc
-     * @date: 2023-08-22 10:57
-     * @Param params:
-     * @return: com.sckw.core.web.response.HttpResult
-     */
-    @PostMapping(value = "/statistic", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult statistic(@RequestBody @Valid StatisticsMessagesReqVO params) {
-        return HttpResult.ok("消息列表统计查询成功", messageService.statistics(params));
-    }
-
-    @PostMapping(value = "/mock", produces = MediaType.APPLICATION_JSON_VALUE)
-    @Operation(summary = "模拟数据")
-    public HttpResult mock() {
-        messageService.mock();
-        return HttpResult.ok("读取消息成功");
-    }
-
-    /**
-     * @param readMessagesReqVO
-     * @return com.sckw.core.web.response.HttpResult
-     * @desc: 消息已读
-     * @author: yzc
-     * @date: 2023-06-09 14:21
-     */
-    @PostMapping(value = "/read", produces = MediaType.APPLICATION_JSON_VALUE)
-    @Operation(summary = "标记消息已读")
-    public HttpResult read(@RequestBody @Valid ReadMessagesReqVO readMessagesReqVO) {
-        messageService.read(readMessagesReqVO);
-        return HttpResult.ok("读取消息成功");
-    }
-
-    /**
-     * @param deleteMessagesReqVO
-     * @return com.sckw.core.web.response.HttpResult
-     * @desc: 删除消息
-     * @author: yzc
-     * @date: 2023-06-09 14:21
-     */
-    @PostMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult delete(@RequestBody @Valid DeleteMessagesReqVO deleteMessagesReqVO) {
-        messageService.delete(deleteMessagesReqVO);
-        return HttpResult.ok("删除消息成功");
-    }
-
-    /**
-     * @desc: 用户消息中心
-     * @author: yzc
-     * @date: 2023-09-07 14:57
-     * @return: com.sckw.core.web.response.HttpResult
-     */
-    @GetMapping("/userMsgCenter")
-    public HttpResult userMsgCenter() {
-        return HttpResult.ok("获取用户消息中心成功", messageService.userMsgCenter());
-    }
-}

+ 41 - 20
sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/SmsController.java

@@ -1,42 +1,63 @@
 package com.sckw.message.controller;
 
 import com.sckw.core.web.response.HttpResult;
-import com.sckw.message.model.vo.req.SendSmsVerifyCoderReqVO;
+import com.sckw.message.model.bo.*;
 import com.sckw.message.service.SmsService;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-/**
- * @author: yzc
- * @date: 2023-06-08 10:58
- * @description: 短信相關接口
- */
 
 @RestController
-@RequestMapping(value = "/kwmSms")
+@RequestMapping(value = "/sms")
 @RequiredArgsConstructor
-@Slf4j
 public class SmsController {
 
     private final SmsService smsService;
 
     /**
-     * @desc: 发送验证码
-     * @author: yzc
-     * @date: 2023-06-15 15:06
-     * @Param param:
-     * @return: com.sckw.core.web.response.HttpResult
+     * 发送验证码
+     * @param smsBo
+     * @return
      */
     @PostMapping(value = "/sendVerifyCode", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult sendVerifyCode(@Valid @RequestBody SendSmsVerifyCoderReqVO param) {
-        smsService.sendVerifyCode(param);
+    public HttpResult sendVerifyCode(@Valid @RequestBody SmsBo smsBo) {
+        smsService.sendVerifyCode(smsBo);
         return HttpResult.ok();
     }
 
+
+    @PostMapping(value = "/send", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult sendSms(@Valid @RequestBody SmsBo smsBo) {
+        smsService.sendSms(smsBo);
+        return HttpResult.ok();
+    }
+
+    @PostMapping(value = "/batchSend", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult batchSendSms(@Valid @RequestBody BatchSendSmsBo batchSendSmsBo) {
+        smsService.batchSendSms(batchSendSmsBo);
+        return HttpResult.ok();
+    }
+
+    @PostMapping(value = "/record/page", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult pageRecord(@RequestBody SmsRecordQueryBo queryBo) {
+        return HttpResult.ok(smsService.pageRecord(queryBo));
+    }
+
+    @GetMapping(value = "/record/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult getRecordDetail(@PathVariable Long id) {
+        return HttpResult.ok(smsService.getRecordDetail(id));
+    }
+
+    @PostMapping(value = "/template/page", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult pageTemplate(@RequestBody SmsTemplateQueryBo queryBo) {
+        return HttpResult.ok(smsService.pageTemplate(queryBo));
+    }
+
+    @GetMapping(value = "/template/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult getTemplateDetail(@PathVariable Long id) {
+        return HttpResult.ok(smsService.getTemplateDetail(id));
+    }
+
 }

+ 0 - 41
sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/background/SmsBackgroundController.java

@@ -1,41 +0,0 @@
-package com.sckw.message.controller.background;
-
-import com.sckw.core.exception.BusinessException;
-import com.sckw.core.web.response.HttpResult;
-import com.sckw.message.model.vo.req.GetSmsVerifyCoderReqVO;
-import com.sckw.message.service.SmsService;
-import jakarta.validation.Valid;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Objects;
-
-/**
- * @desc: 短信后台接口
- * @author: yzc
- * @date: 2023-08-29 19:22
- */
-@RestController
-@RequestMapping(value = "/kwmBackgroundSms")
-@RequiredArgsConstructor
-public class SmsBackgroundController {
-
-    private final SmsService smsService;
-
-    @Value("${background.sms.getVerifyCode.token}")
-    private String verifyCodeToken;
-
-    @PostMapping(value = "/getVerifyCode", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult sendVerifyCode(@Valid @RequestBody GetSmsVerifyCoderReqVO param) {
-        if (!Objects.equals(param.getToken(), verifyCodeToken)) {
-            throw new BusinessException("非法token!");
-        }
-        return HttpResult.ok("获取验证码成功", smsService.getVerifyCode(param));
-    }
-
-}

+ 0 - 39
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageMapper.java

@@ -1,39 +0,0 @@
-package com.sckw.message.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.sckw.core.model.vo.TableTop;
-import com.sckw.message.model.KwmMessage;
-import com.sckw.message.model.dto.MessageListDTO;
-import com.sckw.message.model.dto.SelectMessagesDTO;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * @desc: 消息mapper
- * @author: yzc
- * @date: 2023-06-09 11:08
- */
-@Mapper
-public interface KwmMessageMapper extends BaseMapper<KwmMessage> {
-    /**
-     * @desc: 分页查询
-     * @author: yzc
-     * @date: 2023-06-13 9:11
-     * @param item
-     * @return java.util.List<com.sckw.message.model.dto.MessageListDTO>
-     */
-    List<MessageListDTO> findPage(@Param("item") SelectMessagesDTO item);
-
-    /**
-     * @desc: 统计查询
-     * @author: yzc
-     * @date: 2023-09-06 9:21
-     * @Param item:
-     * @return: java.util.List<com.sckw.core.model.vo.TableTop>
-     */
-    List<TableTop> statistics(@Param("item") SelectMessagesDTO item);
-
-    Long joinCount(@Param("para") SelectMessagesDTO selectMessagesDTO);
-}

+ 0 - 47
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageUserMapper.java

@@ -1,47 +0,0 @@
-package com.sckw.message.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.sckw.message.model.KwmMessageUser;
-import com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO;
-import com.sckw.message.model.dto.UserMsgCenterReqDTO;
-import com.sckw.message.model.vo.res.UserCenterMsgVO;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * @desc: 用户消息mapper
- * @author: yzc
- * @date: 2023-06-09 11:08
- */
-@Mapper
-public interface KwmMessageUserMapper extends BaseMapper<KwmMessageUser> {
-
-    /**
-     * @desc: 批量插入
-     * @author: yzc
-     * @date: 2023-06-26 12:02
-     * @Param messageUsers:
-     * @return: void
-     */
-    void insertBatch(@Param(value = "list") List<KwmMessageUser> list);
-
-    /**
-     * @desc: 根据用户或企业,状态升序,type分组统计消息数量,查找前五条
-     * @author: yzc
-     * @date: 2023-09-07 15:38
-     * @Param item:
-     * @return: java.util.List<com.sckw.message.model.vo.res.UserCenterMsgVO>
-     */
-    List<UserCenterMsgVO> userMsgCenter(@Param(value = "item") UserMsgCenterReqDTO item);
-
-    /**
-     * @desc: 获取用户最新消息
-     * @author: yzc
-     * @date: 2023-09-07 17:43
-     * @Param item:
-     * @return: com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO
-     */
-    UserMsgCenterLatestMsgDTO getLatestMsg(@Param(value = "item") UserMsgCenterReqDTO item);
-}

+ 0 - 16
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsMapper.java

@@ -1,16 +0,0 @@
-package com.sckw.message.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.sckw.message.model.KwmSms;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:49
- * @description: 短信发送记录mapper
- */
-
-@Mapper
-public interface KwmSmsMapper extends BaseMapper<KwmSms> {
-
-}

+ 13 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsRecordMapper.java

@@ -0,0 +1,13 @@
+package com.sckw.message.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.message.model.KwmSmsRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @date 2026-05-07 08:54:58
+* @author xucaiqin
+*/
+@Mapper
+public interface KwmSmsRecordMapper extends BaseMapper<KwmSmsRecord> {
+}

+ 13 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsTemplateMapper.java

@@ -0,0 +1,13 @@
+package com.sckw.message.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.message.model.KwmSmsTemplate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author xucaiqin
+ * @date 2026-05-07 08:53:50
+ */
+@Mapper
+public interface KwmSmsTemplateMapper extends BaseMapper<KwmSmsTemplate> {
+}

+ 13 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmSmsVerifyCodeMapper.java

@@ -0,0 +1,13 @@
+package com.sckw.message.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.message.model.KwmSmsVerifyCode;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @date 2026-05-07 08:55:10
+* @author xucaiqin
+*/
+@Mapper
+public interface KwmSmsVerifyCodeMapper extends BaseMapper<KwmSmsVerifyCode> {
+}

+ 0 - 20
sckw-modules/sckw-message/src/main/java/com/sckw/message/dubbo/SmsInfoServiceImpl.java

@@ -1,20 +0,0 @@
-package com.sckw.message.dubbo;
-
-import com.sckw.message.api.dubbo.SmsInfoService;
-import com.sckw.redis.constant.RedisConstant;
-import com.sckw.redis.utils.RedissonUtils;
-import org.apache.dubbo.config.annotation.DubboService;
-
-/**
- * @desc: 短信信息相关
- * @author: yzc
- * @date: 2023-06-13 14:10
- */
-@DubboService(group = "design", version = "1.0.0")
-public class SmsInfoServiceImpl implements SmsInfoService {
-    @Override
-    public String getVerifyCode(String type, String phone) {
-        String key = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
-        return RedissonUtils.getString(key);
-    }
-}

+ 46 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/feign/SmsApiServiceImpl.java

@@ -0,0 +1,46 @@
+package com.sckw.message.feign;
+
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.message.api.feign.SmsApiService;
+import com.sckw.message.api.model.GetSmsDto;
+import com.sckw.message.api.model.SendSmsDto;
+import com.sckw.message.model.bo.GetVerifyCodeBo;
+import com.sckw.message.model.bo.SmsBo;
+import com.sckw.message.service.SmsService;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author xucaiqin
+ * @date 2026-05-07 11:00:11
+ */
+@RestController
+@Validated
+public class SmsApiServiceImpl implements SmsApiService {
+    @Resource
+    private SmsService smsService;
+
+    @Override
+    public BaseResult<Object> getVerifyCode(GetSmsDto getSmsDto) {
+        GetVerifyCodeBo getVerifyCodeBo = new GetVerifyCodeBo();
+        getVerifyCodeBo.setMobile(getSmsDto.getMobile());
+        getVerifyCodeBo.setBizType(getSmsDto.getBizType());
+        getVerifyCodeBo.setDelete(getSmsDto.getDelete());
+        return BaseResult.success(smsService.getCode(getVerifyCodeBo), "获取成功");
+    }
+
+    @Override
+    public BaseResult<Object> sendVerifyCode(SendSmsDto sendSmsDto) {
+        try {
+            SmsBo smsBo = new SmsBo();
+            smsBo.setMobile(sendSmsDto.getMobile());
+            smsBo.setBizType(sendSmsDto.getBizType());
+            smsService.sendVerifyCode(smsBo);
+        } catch (Exception exception) {
+            return BaseResult.failed(HttpStatus.GLOBAL_EXCEPTION_CODE, exception.getMessage());
+        }
+        return BaseResult.success("", "发送成功");
+    }
+}

+ 0 - 61
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmMessage.java

@@ -1,61 +0,0 @@
-package com.sckw.message.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.sckw.core.model.base.BaseModel;
-import lombok.*;
-
-import java.io.Serial;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:44
- * @description: 消息发送记录
- */
-@Getter
-@Setter
-@ToString
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@TableName("kwm_message")
-public class KwmMessage extends BaseModel {
-    @Serial
-    private static final long serialVersionUID = -675413476264729352L;
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息类型
-     */
-    private String type;
-
-    /**
-     * 消息标题
-     */
-    private String title;
-
-    /**
-     * 消息内容
-     */
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    private String url;
-
-    /**
-     * 消息跳转参数
-     */
-    private String params;
-
-    /**
-     * 推送设备类型
-     */
-    private String clientType;
-
-
-}

+ 0 - 41
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmMessageUser.java

@@ -1,41 +0,0 @@
-package com.sckw.message.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.sckw.core.model.base.BaseModel;
-import lombok.*;
-
-import java.io.Serial;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:44
- * @description: 用户消息推送记录
- */
-@Getter
-@Setter
-@ToString
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-@TableName("kwm_message_user")
-public class KwmMessageUser extends BaseModel {
-    @Serial
-    private static final long serialVersionUID = -4745868973185016717L;
-
-    /**
-     * 消息id
-     */
-    private Long msgId;
-
-    /**
-     * 一级企业id
-     */
-    private Long entId;
-
-    /**
-     * 用户id
-     */
-    private Long userId;
-
-
-}

+ 0 - 52
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSms.java

@@ -1,52 +0,0 @@
-package com.sckw.message.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.sckw.core.model.base.BaseModel;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:44
- * @description: 短信发送记录
- */
-@Getter
-@Setter
-@ToString
-@Builder
-@TableName("kwm_sms")
-public class KwmSms extends BaseModel {
-    @Serial
-    private static final long serialVersionUID = 7454247600187996886L;
-
-    /**
-     * 短信类型
-     */
-    private String type;
-
-    /**
-     * 短信模板code
-     */
-    private String code;
-
-    /**
-     * 手机号
-     */
-    private String phone;
-
-    /**
-     * 发送内容
-     */
-    private String content;
-
-    /**
-     * 参数
-     */
-    private String params;
-
-
-}

+ 188 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsRecord.java

@@ -0,0 +1,188 @@
+package com.sckw.message.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 短信发送记录
+* @date 2026-05-07 08:54:58
+* @author xucaiqin
+*/
+
+@Schema(description="短信发送记录")
+@Data
+@TableName(value = "kwm_sms_record")
+public class KwmSmsRecord  {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @Schema(description="主键")
+    private Long id;
+
+    /**
+     * 业务编号
+     */
+    @TableField(value = "biz_no")
+    @Schema(description="业务编号")
+    private String bizNo;
+
+    /**
+     * 手机号
+     */
+    @TableField(value = "mobile")
+    @Schema(description="手机号")
+    private String mobile;
+
+    /**
+     * 模板编码
+     */
+    @TableField(value = "template_code")
+    @Schema(description="模板编码")
+    private String templateCode;
+
+    /**
+     * 实际短信内容
+     */
+    @TableField(value = "template_content")
+    @Schema(description="实际短信内容")
+    private String templateContent;
+
+    /**
+     * 模板参数
+     */
+    @TableField(value = "template_param")
+    @Schema(description="模板参数")
+    private String templateParam;
+
+    /**
+     * 短信类型
+     */
+    @TableField(value = "sms_type")
+    @Schema(description="短信类型")
+    private Integer smsType;
+
+    /**
+     * 发送渠道
+     */
+    @TableField(value = "channel_code")
+    @Schema(description="发送渠道")
+    private String channelCode;
+
+    /**
+     * 供应商消息ID
+     */
+    @TableField(value = "provider_msg_id")
+    @Schema(description="供应商消息ID")
+    private String providerMsgId;
+
+    /**
+     * 发送状态 0待发送 1成功 2失败 3发送中
+     */
+    @TableField(value = "send_status")
+    @Schema(description="发送状态 0待发送 1成功 2失败 3发送中")
+    private Integer sendStatus;
+
+    /**
+     * 失败原因
+     */
+    @TableField(value = "fail_reason")
+    @Schema(description="失败原因")
+    private String failReason;
+
+    /**
+     * 重试次数
+     */
+    @TableField(value = "retry_count")
+    @Schema(description="重试次数")
+    private Integer retryCount;
+
+    /**
+     * 最大重试次数
+     */
+    @TableField(value = "max_retry_count")
+    @Schema(description="最大重试次数")
+    private Integer maxRetryCount;
+
+    /**
+     * 下次重试时间
+     */
+    @TableField(value = "next_retry_time")
+    @Schema(description="下次重试时间")
+    private LocalDateTime nextRetryTime;
+
+    /**
+     * 幂等请求号
+     */
+    @TableField(value = "request_id")
+    @Schema(description="幂等请求号")
+    private String requestId;
+
+    /**
+     * 发送时间
+     */
+    @TableField(value = "send_time")
+    @Schema(description="发送时间")
+    private LocalDateTime sendTime;
+
+    /**
+     * 回执时间
+     */
+    @TableField(value = "callback_time")
+    @Schema(description="回执时间")
+    private LocalDateTime callbackTime;
+
+    /**
+     * 业务类型
+     */
+    @TableField(value = "biz_type")
+    @Schema(description="业务类型")
+    private String bizType;
+
+    /**
+     * 用户ID
+     */
+    @TableField(value = "user_id")
+    @Schema(description="用户ID")
+    private Long userId;
+
+    /**
+     * 请求IP
+     */
+    @TableField(value = "ip")
+    @Schema(description="请求IP")
+    private String ip;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    @TableLogic
+    private Integer delFlag;
+}

+ 125 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsTemplate.java

@@ -0,0 +1,125 @@
+package com.sckw.message.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 短信模板表
+* @date 2026-05-07 08:53:50
+* @author xucaiqin
+*/
+
+@Schema(description = "短信模板表")
+@Data
+@TableName(value = "kwm_sms_template")
+public class KwmSmsTemplate {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @Schema(description = "主键")
+    private Long id;
+
+    /**
+     * 模板编码
+     */
+    @TableField(value = "template_code")
+    @Schema(description = "模板编码")
+    private String templateCode;
+
+    /**
+     * 模板名称
+     */
+    @TableField(value = "template_name")
+    @Schema(description = "模板名称")
+    private String templateName;
+
+    /**
+     * 业务类型
+     */
+    @TableField(value = "biz_type")
+    @Schema(description = "业务类型")
+    private String bizType;
+
+    /**
+     * 供应商模板code
+     */
+    @TableField(value = "provider_template_code")
+    @Schema(description = "供应商模板code")
+    private String providerTemplateCode;
+
+    /**
+     * 短信签名
+     */
+    @TableField(value = "sign_name")
+    @Schema(description = "短信签名")
+    private String signName;
+
+    /**
+     * 模板内容
+     */
+    @TableField(value = "content")
+    @Schema(description = "模板内容")
+    private String content;
+
+    /**
+     * 变量定义
+     */
+    @TableField(value = "variable_json")
+    @Schema(description = "变量定义")
+    private String variableJson;
+
+    /**
+     * 短信类型 1验证码 2通知 3营销
+     */
+    @TableField(value = "sms_type")
+    @Schema(description = "短信类型 1验证码 2通知 3营销")
+    private Integer smsType;
+
+    /**
+     * 状态 0禁用 1启用
+     */
+    @TableField(value = "`status`")
+    @Schema(description = "状态 0禁用 1启用")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    @TableField(value = "remark")
+    @Schema(description = "备注")
+    private String remark;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    @TableLogic
+    private Integer delFlag;
+}

+ 82 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/KwmSmsVerifyCode.java

@@ -0,0 +1,82 @@
+package com.sckw.message.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 验证码
+ *
+ * @author xucaiqin
+ * @date 2026-05-07 08:55:10
+ */
+@Schema(description = "验证码")
+@Data
+@TableName(value = "kwm_sms_verify_code")
+public class KwmSmsVerifyCode {
+    @TableId(value = "id", type = IdType.AUTO)
+    @Schema(description = "")
+    private Long id;
+
+    @TableField(value = "mobile")
+    @Schema(description = "")
+    private String mobile;
+
+    /**
+     * login/register/reset_pwd
+     */
+    @TableField(value = "biz_type")
+    @Schema(description = "login/register/reset_pwd")
+    private String bizType;
+
+    @TableField(value = "verify_code")
+    @Schema(description = "")
+    private String verifyCode;
+
+    @TableField(value = "expire_time")
+    @Schema(description = "")
+    private LocalDateTime expireTime;
+
+    /**
+     * 0未使用 1已使用
+     */
+    @TableField(value = "verify_status")
+    @Schema(description = "0未使用 1已使用")
+    private Integer verifyStatus;
+
+    @TableField(value = "send_record_id")
+    @Schema(description = "")
+    private Long sendRecordId;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    @TableLogic
+    private Integer delFlag;
+}

+ 0 - 20
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/TestMessaging.java

@@ -1,20 +0,0 @@
-package com.sckw.message.model;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-/**
- * @author Lion Li
- */
-@Data
-@Accessors(chain = true)
-public class TestMessaging {
-    /**
-     * 消息id
-     */
-    private String msgId;
-    /**
-     * 消息内容
-     */
-    private String msgText;
-}

+ 24 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/BatchSendSmsBo.java

@@ -0,0 +1,24 @@
+package com.sckw.message.model.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class BatchSendSmsBo {
+
+    @NotEmpty(message = "手机号列表不能为空")
+    private List<String> mobileList;
+
+    @NotBlank(message = "业务类型不能为空")
+    private String bizType;
+
+    @NotBlank(message = "模板编码不能为空")
+    private String templateCode;
+
+    private Map<String, Object> templateParam;
+
+}

+ 21 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/GetVerifyCodeBo.java

@@ -0,0 +1,21 @@
+package com.sckw.message.model.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+
+@Data
+public class GetVerifyCodeBo {
+
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String mobile;
+
+    @NotBlank(message = "业务类型不能为空")
+    private String bizType;
+    /**
+     * 获取后是否删除value,默认删除
+     */
+    private Boolean delete = true;
+
+}

+ 23 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsBo.java

@@ -0,0 +1,23 @@
+package com.sckw.message.model.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class SmsBo {
+
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String mobile;
+
+    @NotBlank(message = "模板编码不能为空")
+    private String bizType;
+
+    private String templateCode;
+
+    private Map<String, Object> templateParam;
+
+}

+ 26 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsRecordQueryBo.java

@@ -0,0 +1,26 @@
+package com.sckw.message.model.bo;
+
+import lombok.Data;
+
+@Data
+public class SmsRecordQueryBo {
+
+    private Integer page = 1;
+
+    private Integer pageSize = 10;
+
+    private String mobile;
+
+    private String templateCode;
+
+    private Integer sendStatus;
+
+    private Integer smsType;
+
+    private String bizType;
+
+    private String startTime;
+
+    private String endTime;
+
+}

+ 20 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/SmsTemplateQueryBo.java

@@ -0,0 +1,20 @@
+package com.sckw.message.model.bo;
+
+import lombok.Data;
+
+@Data
+public class SmsTemplateQueryBo {
+
+    private Integer page = 1;
+
+    private Integer pageSize = 10;
+
+    private String templateCode;
+
+    private String templateName;
+
+    private Integer smsType;
+
+    private Integer status;
+
+}

+ 20 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/bo/VerifyCodeBo.java

@@ -0,0 +1,20 @@
+package com.sckw.message.model.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
+import lombok.Data;
+
+@Data
+public class VerifyCodeBo {
+
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String mobile;
+
+    @NotBlank(message = "验证码不能为空")
+    private String verifyCode;
+
+    @NotBlank(message = "业务类型不能为空")
+    private String bizType;
+
+}

+ 0 - 91
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/MessageListDTO.java

@@ -1,91 +0,0 @@
-package com.sckw.message.model.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:44
- * @description: 消息列表dto
- */
-@Getter
-@Setter
-@ToString
-public class MessageListDTO implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 4676530802038232669L;
-
-    /**
-     * kwm_message_user id
-     */
-    private Long id;
-
-    private Long entId;
-
-    private Long userId;
-
-    private Integer status;
-
-    private String remark;
-
-    private Long createBy;
-
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
-
-    private Long updateBy;
-
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updateTime;
-
-    /**
-     * kwm_message id
-     */
-    private Long msgId;
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息类型
-     */
-    private String type;
-
-    /**
-     * 消息标题
-     */
-    private String title;
-
-    /**
-     * 消息内容
-     */
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    private String url;
-
-    /**
-     * 消息跳转参数
-     */
-    private String params;
-
-    /**
-     * 推送设备类型
-     */
-    private String clientType;
-
-    private String msgRemark;
-
-
-}

+ 0 - 72
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/SelectMessagesDTO.java

@@ -1,72 +0,0 @@
-package com.sckw.message.model.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @desc: 获取消息分页参数
- * @author: yzc
- * @date: 2023-06-13 16:30
- */
-@Getter
-@Setter
-@ToString
-@Builder
-public class SelectMessagesDTO implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = -6087719092255350917L;
-    private String query;
-    /**
-     * 一级企业id
-     */
-    private Long entId;
-
-    /**
-     * 用户id
-     */
-    private Long userId;
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息状态(0未读,1已读)
-     */
-    private Integer status;
-
-    /**
-     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date startCreateTime;
-
-    /**
-     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date endCreateTime;
-
-    /**
-     * 消息列表排序类型 1状态升序,创建时间降序   2创建时间降序
-     */
-    private Integer sortType;
-
-    /**
-     * 当前页码
-     */
-    private int page;
-    /**
-     * 每页数量
-     */
-    private int pageSize;
-}

+ 0 - 60
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/UserMsgCenterLatestMsgDTO.java

@@ -1,60 +0,0 @@
-package com.sckw.message.model.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @desc: 用户消息中心最新消息dto
- * @author: yzc
- * @date: 2023-09-07 16:22
- */
-@Getter
-@Setter
-@ToString
-public class UserMsgCenterLatestMsgDTO implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = -1102829961881130675L;
-
-    private Long id;
-
-    /**
-     * 状态:0未读/1已读
-     */
-    private Integer status;
-
-    private String category;
-
-    /**
-     * 消息分类
-     */
-    private String type;
-
-    /**
-     * 消息标题
-     */
-    private String title;
-
-    /**
-     * 消息内容
-     */
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    private String url;
-
-    /**
-     * 创建时间
-     */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
-
-}

+ 0 - 32
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/dto/UserMsgCenterReqDTO.java

@@ -1,32 +0,0 @@
-package com.sckw.message.model.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-
-/**
- * @desc: 消息中心请求dto
- * @author: yzc
- * @date: 2023-09-07 15:01
- */
-@Getter
-@Setter
-@ToString
-@Accessors(chain = true)
-public class UserMsgCenterReqDTO {
-
-    /**
-     * 一级企业id
-     */
-    private Long entId;
-
-    /**
-     * 用户id
-     */
-    private Long userId;
-
-    private Integer status;
-
-    private String type;
-}

+ 0 - 33
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/DeleteMessagesReqVO.java

@@ -1,33 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.util.List;
-
-/**
- * @desc: 删除消息请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-public class DeleteMessagesReqVO {
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息类型
-     */
-    private String type;
-
-    /**
-     * 消息ids,不传则删除全部
-     */
-    private List<Long> msgIds;
-}

+ 0 - 28
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/FindMessagesReqVO.java

@@ -1,28 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @desc: 查找消息列表请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-public class FindMessagesReqVO {
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息类型
-     */
-    private String type;
-
-
-}

+ 0 - 29
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/GetSmsVerifyCoderReqVO.java

@@ -1,29 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Pattern;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 11:30
- * @description: 发送短信验证码请求参数
- */
-
-@Getter
-@Setter
-@ToString
-public class GetSmsVerifyCoderReqVO {
-
-    @NotBlank(message = "手机号不能为空!")
-    @Pattern(regexp = "^1[3456789]\\d{9}$", message = "非法的手机号")
-    private String phone;
-
-    @NotBlank(message = "短信类型不能为空")
-    private String type;
-
-    @NotBlank(message = "token不能为空")
-    private String token;
-}

+ 0 - 21
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/MessagesStatisticsReqVO.java

@@ -1,21 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @desc: 消息统计請求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-public class MessagesStatisticsReqVO {
-    /**
-     * 消息分类
-     */
-    private String category;
-
-}

+ 0 - 28
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/MockMessageReq.java

@@ -1,28 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @desc: 读取消息请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-@Schema(description = "模拟数据请求参数")
-public class MockMessageReq {
-
-
-    /**
-     * 消息ids
-     */
-    @NotBlank(message = "消息ids不能为空")
-    private String ids;
-
-
-}

+ 0 - 26
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/ReadMessagesReqVO.java

@@ -1,26 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import jakarta.validation.constraints.NotBlank;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @desc: 读取消息请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-public class ReadMessagesReqVO {
-
-
-    /**
-     * 消息ids
-     */
-    @NotBlank(message = "消息ids不能为空")
-    private String ids;
-
-
-}

+ 0 - 51
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/SelectMessagesReqVO.java

@@ -1,51 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.sckw.core.model.page.PageRequest;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.util.Date;
-
-/**
- * @desc: 查找消息列表请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-@Schema(description = "获取消息分页参数")
-public class SelectMessagesReqVO extends PageRequest {
-    @Schema(description = "搜索参数", example = "皮带")
-    private String query;
-    /**
-     * 消息类型
-     */
-    @Schema(description = "消息分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "SYSTEM")
-    @NotBlank(message = "消息分类不能为空")
-    private String category;
-
-    /**
-     * 消息状态(0未读,1已读)
-     */
-//    @NotNull(message = "消息状态不能为空")
-    @Schema(description = "消息状态 (0未读,1已读)", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    private Integer status;
-
-    /**
-     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date startCreateTime;
-
-    /**
-     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date endCreateTime;
-
-}

+ 0 - 26
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/SendSmsVerifyCoderReqVO.java

@@ -1,26 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.Pattern;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 11:30
- * @description: 发送短信验证码请求参数
- */
-
-@Getter
-@Setter
-@ToString
-public class SendSmsVerifyCoderReqVO {
-
-    @NotBlank(message = "手机号不能为空!")
-    @Pattern(regexp = "^1[3456789]\\d{9}$", message = "非法的手机号")
-    private String phone;
-
-    @NotBlank(message = "短信类型不能为空")
-    private String type;
-}

+ 0 - 38
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/StatisticsMessagesReqVO.java

@@ -1,38 +0,0 @@
-package com.sckw.message.model.vo.req;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.util.Date;
-
-/**
- * @desc: 统计消息列表请求参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-public class StatisticsMessagesReqVO {
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date startCreateTime;
-
-    /**
-     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date endCreateTime;
-
-
-}

+ 0 - 83
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/KwmMessageListResVO.java

@@ -1,83 +0,0 @@
-package com.sckw.message.model.vo.res;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @desc: 消息列表响应
- * @author: yzc
- * @date: 2023-08-22 11:05
- */
-@Getter
-@Setter
-@ToString
-public class KwmMessageListResVO implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = -5549538304400226372L;
-
-    private Long id;
-
-    @Schema(description = "状态")
-    private Integer status;
-
-    private String statusLabel;
-
-    /**
-     * 消息分类
-     */
-    @Schema(description = "消息分类")
-    private String category;
-
-    private String categoryLabel;
-
-    /**
-     * 消息标题
-     */
-    @Schema(description = "消息标题")
-    private String title;
-
-    /**
-     * 消息内容
-     */
-    @Schema(description = "消息内容")
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    @Schema(description = "消息跳转url")
-    private String url;
-
-    /**
-     * 创建时间
-     */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @Schema(description = "创建时间")
-    private Date createTime;
-
-    /**
-     * 提交人
-     */
-    @Schema(description = "提交人")
-    private Long createBy;
-
-    /**
-     * 提交人姓名
-     */
-    @Schema(description = "提交人姓名")
-    private String createByName;
-
-    /**
-     * 提交人部门
-     */
-    private String createByDept;
-
-}

+ 0 - 67
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/MessagesStatisticsResVO.java

@@ -1,67 +0,0 @@
-package com.sckw.message.model.vo.res;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @desc: 消息统计响应参数
- * @author: yzc
- * @date: 2023-06-09 11:34
- */
-@Getter
-@Setter
-@ToString
-@Builder
-public class MessagesStatisticsResVO  implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 4758956841872315397L;
-
-    /**
-     * 消息分类
-     */
-    private String category;
-
-    /**
-     * 消息类型
-     */
-    private String type;
-
-    /**
-     * 未读数量
-     */
-    private Integer unReadNum;
-
-    /**
-     * 标题
-     */
-    private String title;
-
-    /**
-     * 内容
-     */
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    private String url;
-
-    /**
-     * 状态0未读1已读
-     */
-    private Integer status;
-
-    /**
-     * 创建时间
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
-}

+ 0 - 65
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/UserCenterMsgVO.java

@@ -1,65 +0,0 @@
-package com.sckw.message.model.vo.res;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @desc: 用户中心消息vo
- * @author: yzc
- * @date: 2023-09-07 14:53
- */
-@Getter
-@Setter
-@ToString
-@Accessors(chain = true)
-public class UserCenterMsgVO implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = 1158795911479984678L;
-
-    private Long id;
-
-    /**
-     * 状态:0未读/1已读
-     */
-    private Integer status;
-
-    /**
-     * 消息分类
-     */
-    private String type;
-
-    /**
-     * 消息标题
-     */
-    private String title;
-
-    /**
-     * 未读数量
-     */
-    private Integer num;
-
-    /**
-     * 消息内容
-     */
-    private String content;
-
-    /**
-     * 消息跳转url
-     */
-    private String url;
-
-    /**
-     * 创建时间
-     */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
-
-}

+ 0 - 37
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/res/UserMsgCenterResVO.java

@@ -1,37 +0,0 @@
-package com.sckw.message.model.vo.res;
-
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @desc: 用户消息中心响应vo
- * @author: yzc
- * @date: 2023-09-07 14:53
- */
-@Getter
-@Setter
-@ToString
-@Accessors(chain = true)
-public class UserMsgCenterResVO implements Serializable {
-
-
-    @Serial
-    private static final long serialVersionUID = -3285612805457269859L;
-
-    /**
-     * 总未读数据
-     */
-    private Long totalUnReadNum;
-
-    /**
-     * 消息列表
-     */
-    private List<UserCenterMsgVO> msgList;
-
-}

+ 0 - 27
sckw-modules/sckw-message/src/main/java/com/sckw/message/producer/DelayProducer.java

@@ -1,27 +0,0 @@
-package com.sckw.message.producer;
-
-import com.sckw.message.model.TestMessaging;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.stream.function.StreamBridge;
-import org.springframework.messaging.Message;
-import org.springframework.messaging.support.MessageBuilder;
-import org.springframework.stereotype.Component;
-
-import java.util.UUID;
-
-@Component
-public class DelayProducer {
-
-    @Autowired
-    private StreamBridge streamBridge;
-
-    public void sendMsg(String msg, Long delay) {
-        // 构建消息对象
-        TestMessaging testMessaging = new TestMessaging()
-            .setMsgId(UUID.randomUUID().toString())
-            .setMsgText(msg);
-        Message<TestMessaging> message = MessageBuilder.withPayload(testMessaging)
-            .setHeader("x-delay", delay).build();
-        streamBridge.send("delay-out-0", message);
-    }
-}

+ 0 - 185
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageService.java

@@ -1,185 +0,0 @@
-package com.sckw.message.service;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.RandomUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.sckw.core.model.constant.NumberConstant;
-import com.sckw.core.model.vo.TableTop;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.IdWorker;
-import com.sckw.core.utils.StringUtils;
-import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.message.dao.KwmMessageMapper;
-import com.sckw.message.dao.KwmMessageUserMapper;
-import com.sckw.message.model.KwmMessage;
-import com.sckw.message.model.KwmMessageUser;
-import com.sckw.message.model.dto.MessageListDTO;
-import com.sckw.message.model.dto.SelectMessagesDTO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * @desc: 消息相关service
- * @author: yzc
- * @date: 2023-06-09 10:58
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class KwmMessageService {
-
-    private final KwmMessageMapper kwmMessageMapper;
-    private final KwmMessageUserMapper kwmMessageUserMapper;
-
-
-    /**
-     * @param msgIds, category, type, status
-     * @return java.util.List<com.sckw.message.model.KwmMessage>
-     * @desc: 根据条件获取消息列表
-     * @author: yzc
-     * @date: 2023-06-09 14:27
-     */
-    public List<KwmMessage> getList(List<Long> msgIds, String category, String type, Integer status) {
-        LambdaQueryWrapper<KwmMessage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.in(CollectionUtils.isNotEmpty(msgIds), KwmMessage::getId, msgIds)
-                .eq(StringUtils.isNotBlank(category), KwmMessage::getCategory, category)
-                .eq(StringUtils.isNotBlank(type), KwmMessage::getType, type)
-                .eq(Objects.nonNull(status), KwmMessage::getStatus, status)
-                .eq(KwmMessage::getDelFlag, 0).orderByAsc(KwmMessage::getStatus).orderByDesc(KwmMessage::getCreateTime);
-
-        return CollectionUtil.emptyIfNull(kwmMessageMapper.selectList(wrapper));
-    }
-
-
-    /**
-     * @param msgIds
-     * @return void
-     * @desc: 更新已读根据消息ids
-     * @author: yzc
-     * @date: 2023-06-09 14:36
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void readByMsgIds(List<Long> msgIds) {
-        LambdaUpdateWrapper<KwmMessage> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.set(KwmMessage::getStatus, 1).in(KwmMessage::getId, msgIds);
-        kwmMessageMapper.update(null, wrapper);
-    }
-
-    /**
-     * @param ids
-     * @return void
-     * @desc: 根据ids删除
-     * @author: yzc
-     * @date: 2023-06-09 15:08
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void delByMsgIds(List<Long> ids) {
-        LambdaUpdateWrapper<KwmMessage> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.set(KwmMessage::getDelFlag, 1).in(KwmMessage::getId, ids);
-        kwmMessageMapper.update(null, wrapper);
-    }
-
-    /**
-     * @param kwmMessage
-     * @return java.lang.Long
-     * @desc: 插入消息
-     * @author: yzc
-     * @date: 2023-06-09 15:49
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public Long insert(KwmMessage kwmMessage) {
-        kwmMessageMapper.insert(kwmMessage);
-        return kwmMessage.getId();
-    }
-
-    /**
-     * @param dto
-     * @return java.util.List<com.sckw.message.model.dto.MessageListDTO>
-     * @desc: 分页查询
-     * @author: yzc
-     * @date: 2023-06-13 9:08
-     */
-    public List<MessageListDTO> findPage(SelectMessagesDTO dto) {
-        return kwmMessageMapper.findPage(dto);
-    }
-
-    /**
-     * @desc: 统计查询
-     * @author: yzc
-     * @date: 2023-09-06 9:21
-     * @Param dto:
-     * @return: java.util.List<com.sckw.core.model.vo.TableTop>
-     */
-    public List<TableTop> statistics(SelectMessagesDTO dto) {
-        return kwmMessageMapper.statistics(dto);
-    }
-
-    /**
-     * @param id
-     * @return com.sckw.message.model.KwmMessage
-     * @desc: 根据id获取详情
-     * @author: yzc
-     * @date: 2023-06-13 15:15
-     */
-    public KwmMessage getById(Long id) {
-        return kwmMessageMapper.selectById(id);
-    }
-
-    /**
-     * @param msgIds, category
-     * @return java.util.List<com.sckw.message.model.KwmMessage>
-     * @desc: 消息统计
-     * @author: yzc
-     * @date: 2023-06-14 9:21
-     */
-    public List<KwmMessage> statistics(List<Long> msgIds, String category) {
-        LambdaQueryWrapper<KwmMessage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.in(KwmMessage::getId, msgIds).eq(KwmMessage::getDelFlag, 0)
-                .eq(StringUtils.isNotBlank(category), KwmMessage::getCategory, category)
-                .orderByAsc(KwmMessage::getStatus).orderByDesc(KwmMessage::getCreateTime);
-        return CollectionUtil.emptyIfNull(kwmMessageMapper.selectList(wrapper));
-    }
-
-    public Long findCount(SelectMessagesDTO selectMessagesDTO) {
-        if (LoginUserHolder.isManager()) {
-            return 0L;
-        }
-        return kwmMessageMapper.joinCount(selectMessagesDTO);
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public void mock() {
-        if (LoginUserHolder.isManager()) {
-            return;
-        }
-        Long entId = LoginUserHolder.getEntId();
-        Long userId = LoginUserHolder.getUserId();
-        KwmMessage kwmMessage = new KwmMessage();
-        kwmMessage.setCategory("SYSTEM");
-        kwmMessage.setType("PD");
-        kwmMessage.setTitle("无人巡检异常");
-        kwmMessage.setContent(String.format("一氧化碳 %s,甲烷 %s,湿度 %s,红外热成像皮带点位1 温度%s摄氏度超出阈值",
-                RandomUtil.randomInt(10, 50), RandomUtil.randomInt(30, 50), RandomUtil.randomInt(20, 90), RandomUtil.randomInt(10, 39)));
-        kwmMessage.setUrl("{\"app\":\"/pages/cooperative/manage\",\"pc\":\"/cooperator/cooperativeManagement\"}");
-        kwmMessage.setParams("");
-        kwmMessage.setClientType("");
-        kwmMessage.setId(new IdWorker(NumberConstant.ONE).nextId());
-        kwmMessage.setRemark("");
-        kwmMessage.setStatus(0);
-        kwmMessageMapper.insert(kwmMessage);
-        KwmMessageUser kwmMessageUser = new KwmMessageUser();
-        kwmMessageUser.setMsgId(kwmMessage.getId());
-        kwmMessageUser.setEntId(entId);
-        kwmMessageUser.setUserId(userId);
-        kwmMessageUser.setId(new IdWorker(NumberConstant.ONE).nextId());
-        kwmMessageUser.setRemark("");
-        kwmMessageUser.setStatus(0);
-        kwmMessageUserMapper.insert(kwmMessageUser);
-    }
-}

+ 0 - 194
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageUserService.java

@@ -1,194 +0,0 @@
-package com.sckw.message.service;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.sckw.core.model.constant.Global;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.message.dao.KwmMessageUserMapper;
-import com.sckw.message.model.KwmMessageUser;
-import com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO;
-import com.sckw.message.model.dto.UserMsgCenterReqDTO;
-import com.sckw.message.model.vo.res.UserCenterMsgVO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @desc: 用户消息相关service
- * @author: yzc
- * @date: 2023-06-09 10:58
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class KwmMessageUserService {
-
-    private final KwmMessageUserMapper kwmMessageUserMapper;
-
-    /**
-     * @param userId
-     * @return java.lang.Long
-     * @desc: 获取用户未删除消息ids
-     * @author: yzc
-     * @date: 2023-06-09 14:24
-     */
-    public List<Long> getMsgIdsByUserId(Long userId) {
-        List<KwmMessageUser> list = getByUserId(userId);
-        return list.stream().map(KwmMessageUser::getMsgId).collect(Collectors.toList());
-    }
-
-    /**
-     * @desc: 根据用户id获取
-     * @author: yzc
-     * @date: 2023-06-16 11:18
-     * @Param userId:
-     * @return: java.util.List<com.sckw.message.model.KwmMessageUser>
-     */
-    public List<KwmMessageUser> getByUserId(Long userId) {
-        LambdaQueryWrapper<KwmMessageUser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwmMessageUser::getUserId, userId).eq(KwmMessageUser::getDelFlag, 0);
-        return CollectionUtils.emptyIfNull(kwmMessageUserMapper.selectList(wrapper));
-    }
-
-    /**
-     * @param userId, msgIds
-     * @return void
-     * @desc: 更新为已读根据用户id及消息ids
-     * @author: yzc
-     * @date: 2023-06-09 14:30
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void readByUserAndMsgIds(Long userId, List<Long> msgIds) {
-        LambdaUpdateWrapper<KwmMessageUser> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.set(KwmMessageUser::getStatus, 1)
-                .eq(KwmMessageUser::getUserId, userId).in(KwmMessageUser::getMsgId, msgIds);
-        kwmMessageUserMapper.update(null, wrapper);
-    }
-
-    /**
-     * @param userId, msgIds
-     * @return void
-     * @desc: 根据用户删除消息
-     * @author: yzc
-     * @date: 2023-06-09 15:07
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void delByUserAndMsgIds(Long userId, List<Long> msgIds) {
-        LambdaUpdateWrapper<KwmMessageUser> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.set(KwmMessageUser::getDelFlag, 1)
-                .eq(KwmMessageUser::getUserId, userId).in(KwmMessageUser::getMsgId, msgIds);
-        kwmMessageUserMapper.update(null, wrapper);
-    }
-
-
-    /**
-     * @param messageUsers
-     * @return void
-     * @desc: 批量插入
-     * @author: yzc
-     * @date: 2023-06-09 15:58
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void batchSave(List<KwmMessageUser> messageUsers) {
-        kwmMessageUserMapper.insertBatch(messageUsers);
-    }
-
-    /**
-     * @desc: 通过消息id和userId获取
-     * @author: yzc
-     * @date: 2023-06-16 11:09
-     * @Param msgId:
-     * @Param userId:
-     * @return: com.sckw.message.model.KwmMessageUser
-     */
-    public KwmMessageUser getByMsgIdAndUserId(Long msgId, Long userId) {
-        LambdaQueryWrapper<KwmMessageUser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwmMessageUser::getUserId, userId).eq(KwmMessageUser::getMsgId, msgId)
-                .eq(KwmMessageUser::getDelFlag, 0).last("LIMIT 1");
-        return kwmMessageUserMapper.selectOne(wrapper);
-    }
-
-    /**
-     * @desc: 根据msgIds获取
-     * @author: yzc
-     * @date: 2023-09-04 11:50
-     * @Param ids:
-     * @return: java.util.List<com.sckw.message.model.KwmMessageUser>
-     */
-    public List<KwmMessageUser> getByMsgIds(List<Long> ids) {
-        LambdaQueryWrapper<KwmMessageUser> wrapper = new LambdaQueryWrapper<>();
-        wrapper.in(KwmMessageUser::getMsgId, ids)
-                .eq(KwmMessageUser::getDelFlag, Global.NO);
-        Integer isMain = LoginUserHolder.getIsMain();
-        if (Objects.equals(isMain, 1)) {
-            wrapper.eq(KwmMessageUser::getEntId, LoginUserHolder.getEntId());
-        } else {
-            wrapper.eq(KwmMessageUser::getUserId, LoginUserHolder.getUserId());
-        }
-        List<KwmMessageUser> list = kwmMessageUserMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
-    }
-
-    /**
-     * @desc: 根据msgIds更新状态
-     * @author: yzc
-     * @date: 2023-09-04 11:56
-     * @Param ids:
-     * @return: void
-     */
-    public void readByMsgIds(List<Long> ids) {
-        LambdaUpdateWrapper<KwmMessageUser> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.set(KwmMessageUser::getStatus, Global.YES)
-                .in(KwmMessageUser::getMsgId, ids);
-        wrapper.eq(KwmMessageUser::getEntId, LoginUserHolder.getEntId());
-        wrapper.eq(KwmMessageUser::getUserId, LoginUserHolder.getUserId());
-        kwmMessageUserMapper.update(null, wrapper);
-    }
-
-    /**
-     * @desc: 根据用户或企业,状态升序,type分组统计消息数量,查找前五条
-     * @author: yzc
-     * @date: 2023-09-07 15:40
-     * @Param dto:
-     * @return: java.util.List<com.sckw.message.model.vo.res.UserCenterMsgVO>
-     */
-    public List<UserCenterMsgVO> userMsgCenter(UserMsgCenterReqDTO dto) {
-        List<UserCenterMsgVO> list = kwmMessageUserMapper.userMsgCenter(dto);
-        return CollectionUtils.emptyIfNull(list);
-    }
-
-    /**
-     * @desc: 获取最新消息
-     * @author: yzc
-     * @date: 2023-09-07 17:42
-     * @Param dto:
-     * @return: com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO
-     */
-    public UserMsgCenterLatestMsgDTO getLatestMsg(UserMsgCenterReqDTO dto) {
-        return kwmMessageUserMapper.getLatestMsg(dto);
-    }
-
-    /**
-     * @desc: 统计消息数量
-     * @author: yzc
-     * @date: 2023-09-21 15:18
-     * @Param entId:
-     * @Param userId:
-     * @Param status:
-     * @return: java.lang.Long
-     */
-    public Long count(Long entId, Long userId, Integer status) {
-        LambdaUpdateWrapper<KwmMessageUser> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.eq(Objects.nonNull(entId), KwmMessageUser::getEntId, entId)
-                .eq(Objects.nonNull(userId), KwmMessageUser::getUserId, userId)
-                .eq(Objects.nonNull(status), KwmMessageUser::getStatus, status)
-                .eq(KwmMessageUser::getDelFlag, Global.NO);
-        return kwmMessageUserMapper.selectCount(wrapper);
-    }
-}

+ 12 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsRecordService.java

@@ -0,0 +1,12 @@
+package com.sckw.message.service;
+
+import com.sckw.message.model.KwmSmsRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+    /**
+* @date 2026-05-07 08:54:58
+* @author xucaiqin
+*/
+public interface KwmSmsRecordService extends IService<KwmSmsRecord>{
+
+
+}

+ 0 - 32
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsService.java

@@ -1,32 +0,0 @@
-package com.sckw.message.service;
-
-import com.sckw.message.dao.KwmSmsMapper;
-import com.sckw.message.model.KwmSms;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:48
- * @description:
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class KwmSmsService {
-
-    private final KwmSmsMapper kwmSmsMapper;
-
-    /**
-     * @desc: 添加
-     * @author: yzc
-     * @date: 2023-06-15 15:08
-     * @Param kwmSms:
-     * @return: void
-     */
-    public void add(KwmSms kwmSms) {
-        kwmSmsMapper.insert(kwmSms);
-    }
-
-}

+ 12 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsTemplateService.java

@@ -0,0 +1,12 @@
+package com.sckw.message.service;
+
+import com.sckw.message.model.KwmSmsTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+    /**
+* @date 2026-05-07 08:53:30
+* @author xucaiqin
+*/
+public interface KwmSmsTemplateService extends IService<KwmSmsTemplate>{
+
+
+}

+ 12 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmSmsVerifyCodeService.java

@@ -0,0 +1,12 @@
+package com.sckw.message.service;
+
+import com.sckw.message.model.KwmSmsVerifyCode;
+import com.baomidou.mybatisplus.extension.service.IService;
+    /**
+* @date 2026-05-07 08:55:10
+* @author xucaiqin
+*/
+public interface KwmSmsVerifyCodeService extends IService<KwmSmsVerifyCode>{
+
+
+}

+ 0 - 335
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/MessageService.java

@@ -1,335 +0,0 @@
-package com.sckw.message.service;
-
-import com.alibaba.fastjson2.JSONObject;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
-import com.sckw.core.common.enums.enums.DictTypeEnum;
-import com.sckw.core.model.constant.Global;
-import com.sckw.core.model.page.PageRes;
-import com.sckw.core.model.vo.TableBottom;
-import com.sckw.core.model.vo.TableStatisticRes;
-import com.sckw.core.model.vo.TableTop;
-import com.sckw.core.utils.BeanUtils;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.StringUtils;
-import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.message.enums.MsgStatusEnum;
-import com.sckw.message.model.KwmMessage;
-import com.sckw.message.model.KwmMessageUser;
-import com.sckw.message.model.dto.MessageListDTO;
-import com.sckw.message.model.dto.SelectMessagesDTO;
-import com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO;
-import com.sckw.message.model.dto.UserMsgCenterReqDTO;
-import com.sckw.message.model.vo.req.DeleteMessagesReqVO;
-import com.sckw.message.model.vo.req.ReadMessagesReqVO;
-import com.sckw.message.model.vo.req.StatisticsMessagesReqVO;
-import com.sckw.message.model.vo.res.KwmMessageListResVO;
-import com.sckw.message.model.vo.res.MessagesStatisticsResVO;
-import com.sckw.message.model.vo.res.UserCenterMsgVO;
-import com.sckw.message.model.vo.res.UserMsgCenterResVO;
-import com.sckw.stream.enums.MessageEnum;
-import com.sckw.system.api.RemoteSystemService;
-import com.sckw.system.api.model.dto.res.EntCacheResDto;
-import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import com.sckw.system.api.model.pojo.DeptInfoPojo;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboReference;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @desc: 消息相关service
- * @author: yzc
- * @date: 2023-06-09 10:58
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class MessageService {
-
-    private final KwmMessageService kwmMessageService;
-    private final KwmMessageUserService kwmMessageUserService;
-
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private RemoteSystemService remoteSystemService;
-
-
-    /**
-     * @param reqVO
-     * @return void
-     * @desc: 更新消息已读
-     * @author: yzc
-     * @date: 2023-06-09 14:20
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void read(ReadMessagesReqVO reqVO) {
-        List<Long> ids = StringUtils.splitStrToList(reqVO.getIds(), Long.class);
-        kwmMessageUserService.readByMsgIds(ids);
-    }
-
-    /**
-     * @param reqVO
-     * @return void
-     * @desc: 删除消息
-     * @author: yzc
-     * @date: 2023-06-09 14:20
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void delete(DeleteMessagesReqVO reqVO) {
-        Long userId = LoginUserHolder.getUserId();
-        List<Long> msgIds = kwmMessageUserService.getMsgIdsByUserId(userId);
-        if (CollectionUtils.isEmpty(msgIds)) {
-            return;
-        }
-        List<Long> ids = reqVO.getMsgIds();
-        //msgIds不为空直接删除用户消息
-        if (CollectionUtils.isNotEmpty(ids)) {
-            List<Long> list = ids.stream().filter(msgIds::contains).toList();
-            kwmMessageUserService.delByUserAndMsgIds(userId, list);
-        } else {
-            //msgIds为空,根据category及type查找删除用户消息
-            List<KwmMessage> messageList = kwmMessageService.getList(msgIds, reqVO.getCategory(), reqVO.getType(), null);
-            if (CollectionUtils.isEmpty(messageList)) {
-                return;
-            }
-            List<Long> delMsgIds = messageList.stream().map(KwmMessage::getId).toList();
-            kwmMessageUserService.delByUserAndMsgIds(userId, delMsgIds);
-        }
-    }
-
-    /**
-     * @param dto
-     * @return java.util.List<com.sckw.message.model.KwmMessage>
-     * @desc: 分页查询消息列表
-     * @author: yzc
-     * @date: 2023-06-13 9:05
-     */
-    public PageRes<KwmMessageListResVO> select(SelectMessagesDTO dto) {
-        PageHelper.startPage(dto.getPage(), dto.getPageSize());
-        //当前登录人是企业管理员则查看全部消息,否则只查看对应用户消息
-        if (LoginUserHolder.isManager()) {
-            return new PageRes<>();
-        }
-        dto.setUserId(LoginUserHolder.getUserId());
-        dto.setEntId(LoginUserHolder.getEntId());
-        List<MessageListDTO> list = kwmMessageService.findPage(dto);
-        PageInfo<MessageListDTO> pageInfo = new PageInfo<>(list);
-        if (CollectionUtils.isEmpty(list)) {
-            return PageRes.build(new PageInfo<KwmMessageListResVO>(), new ArrayList<>());
-        }
-        Map<String, String> categoryMap, statusMap;
-        Map<String, Map<String, String>> dictMap = remoteSystemService.queryDictByType(
-                Arrays.asList(DictTypeEnum.MSG_CATEGORY.getType(), DictTypeEnum.MSG_STATUS.getType()));
-        if (CollectionUtils.isNotEmpty(dictMap)) {
-            categoryMap = dictMap.get(DictTypeEnum.MSG_CATEGORY.getType());
-            statusMap = dictMap.get(DictTypeEnum.MSG_STATUS.getType());
-        } else {
-            categoryMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-            statusMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-        }
-        String clientType = LoginUserHolder.getClientType();
-        List<Long> userIds = list.stream().map(MessageListDTO::getCreateBy).toList();
-        Map<Long, UserCacheResDto> map = remoteSystemService.queryUserCacheMapByIds(userIds);
-        List<KwmMessageListResVO> result = new ArrayList<>(list.size());
-        list.forEach(e -> {
-            UserCacheResDto user = map.get(e.getCreateBy());
-            KwmMessageListResVO res = BeanUtils.copyProperties(e, KwmMessageListResVO.class);
-            if (Objects.nonNull(e.getUrl())) {
-                Map<String, Object> urlMap = JSONObject.parse(e.getUrl());
-                res.setUrl(Objects.isNull(urlMap.get(clientType)) ? null : urlMap.get(clientType).toString());
-            }
-            res.setStatusLabel(statusMap.get(String.valueOf(e.getStatus())));
-            res.setCategoryLabel(categoryMap.get(e.getCategory()));
-            if (Objects.nonNull(user)) {
-                res.setCreateByName(user.getName());
-                EntCacheResDto entInfo = user.getEntInfo();
-                if (Objects.nonNull(entInfo)) {
-                    //司机有企业信息,没有部门信息
-                    List<DeptInfoPojo> deptInfo = entInfo.getDeptInfo();
-                    res.setCreateByDept(CollectionUtils.isEmpty(deptInfo) ? "司机" : deptInfo.get(0).getName());
-                }
-            }
-            result.add(res);
-        });
-        return PageRes.build(pageInfo, result);
-    }
-
-    /**
-     * @param category
-     * @return com.sckw.message.model.vo.res.MessagesStatisticsResVO
-     * @desc: 消息统计
-     * @author: yzc
-     * @date: 2023-06-13 10:19
-     */
-    public List<MessagesStatisticsResVO> statistics(String category) {
-        //获取用户未删除消息
-        List<KwmMessageUser> messageUsers = kwmMessageUserService.getByUserId(LoginUserHolder.getUserId());
-        Map<Long, KwmMessageUser> map = messageUsers.stream().collect(Collectors.toMap(KwmMessageUser::getMsgId, e -> e, (k1, k2) -> k1));
-        if (CollectionUtils.isEmpty(map)) {
-            return Collections.emptyList();
-        }
-        List<Long> msgIds = map.keySet().stream().toList();
-        //根据消息ids获取message详情
-        List<KwmMessage> messages = kwmMessageService.statistics(msgIds, category);
-        if (CollectionUtils.isEmpty(messages)) {
-            return Collections.emptyList();
-        }
-        //设置用户消息状态及创建时间
-        messages.forEach(e -> {
-            KwmMessageUser kwmMessageUser = map.get(e.getId());
-            e.setStatus(kwmMessageUser.getStatus());
-            e.setCreateTime(kwmMessageUser.getCreateTime());
-        });
-        //消息按状态升序、创建时间降序排序,无category按category分组,有category按type分组
-        Map<String, List<KwmMessage>> collect;
-        if (StringUtils.isNotBlank(category)) {
-            collect = messages.stream().sorted(Comparator.comparingInt(KwmMessage::getStatus)
-                    .thenComparing(KwmMessage::getCreateTime, Comparator.reverseOrder())).collect(Collectors.groupingBy(KwmMessage::getType));
-        } else {
-            collect = messages.stream().sorted(Comparator.comparingInt(KwmMessage::getStatus)
-                    .thenComparing(KwmMessage::getCreateTime, Comparator.reverseOrder())).collect(Collectors.groupingBy(KwmMessage::getCategory));
-        }
-        //组装响应参数:消息分组第一条、统计未读数量
-        List<MessagesStatisticsResVO> list = new ArrayList<>(collect.size());
-        collect.values().forEach(e -> {
-            KwmMessage message = e.get(0);
-            long count = e.stream().filter(m -> Global.UN_READ.equals(m.getStatus())).count();
-            MessagesStatisticsResVO messagesStatistics = BeanUtils.copyProperties(message, MessagesStatisticsResVO.class);
-            messagesStatistics.setUnReadNum((int) count);
-            list.add(messagesStatistics);
-        });
-        return list;
-    }
-
-    /**
-     * @param id
-     * @return com.sckw.message.model.KwmMessage
-     * @desc: 获取消息详情
-     * @author: yzc
-     * @date: 2023-06-13 15:19
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public KwmMessage detail(Long id) {
-        List<Long> ids = Collections.singletonList(id);
-        List<KwmMessageUser> msgList = kwmMessageUserService.getByMsgIds(ids);
-        if (CollectionUtils.isEmpty(msgList)) {
-            return KwmMessage.builder().build();
-        }
-        KwmMessageUser kwmMessageUser = msgList.get(0);
-        KwmMessage message = kwmMessageService.getById(kwmMessageUser.getMsgId());
-        if (Objects.nonNull(message.getUrl())) {
-            String clientType = LoginUserHolder.getClientType();
-            Map<String, Object> urlMap = JSONObject.parse(message.getUrl());
-            message.setUrl(Objects.isNull(urlMap.get(clientType)) ? null : urlMap.get(clientType).toString());
-        }
-        //更新用户消息为已读状态
-        kwmMessageUserService.readByMsgIds(ids);
-        return message;
-    }
-
-    /**
-     * @desc: 消息列表统计
-     * @author: yzc
-     * @date: 2023-08-22 11:48
-     * @Param params:
-     * @return: com.sckw.core.model.vo.TableStatisticRes
-     */
-    public TableStatisticRes statistics(StatisticsMessagesReqVO params) {
-        TableStatisticRes res = new TableStatisticRes();
-        SelectMessagesDTO dto = BeanUtils.copyProperties(params, SelectMessagesDTO.class);
-        //当前登录人是企业管理员则查看全部消息,否则只查看对应用户消息
-        if (Objects.equals(LoginUserHolder.getIsMain(), 1)) {
-            dto.setEntId(LoginUserHolder.getEntId());
-        } else {
-            dto.setUserId(LoginUserHolder.getUserId());
-        }
-        List<TableTop> statistics = kwmMessageService.statistics(dto);
-        Map<Integer, Integer> map = statistics.stream().
-                collect(Collectors.toMap(TableTop::getValue, TableTop::getTotal, (k1, k2) -> k1));
-        List<TableTop> tableTops = new ArrayList<>();
-        int totalCount = 0;
-        List<MsgStatusEnum> enums = MsgStatusEnum.getSortList();
-        for (MsgStatusEnum e : enums) {
-            Integer count = map.get(e.getCode());
-            int total = Objects.isNull(count) ? 0 : count;
-            TableTop tableTop = new TableTop();
-            tableTop.setName(e.getMsg()).setValue(e.getCode()).setTotal(total);
-            tableTops.add(tableTop);
-            totalCount = totalCount + total;
-        }
-        TableTop all = new TableTop();
-        all.setName("全部").setTotal(totalCount);
-        tableTops.add(0, all);
-        TableBottom tableBottom = new TableBottom();
-        tableBottom.setTotal(totalCount);
-        res.setTableTops(tableTops).setTableBottom(tableBottom);
-        return res;
-    }
-
-    /**
-     * @desc: 用户消息中心获取
-     * @author: yzc
-     * @date: 2023-09-07 17:41
-     * @return: com.sckw.message.model.vo.res.UserMsgCenterResVO
-     */
-    public UserMsgCenterResVO userMsgCenter() {
-        UserMsgCenterReqDTO dto = new UserMsgCenterReqDTO();
-        boolean isMain = Objects.equals(LoginUserHolder.getIsMain(), 1);
-        dto.setEntId(isMain ? LoginUserHolder.getEntId() : null);
-        dto.setUserId(isMain ? null : LoginUserHolder.getUserId());
-        //获取消息列表
-        List<UserCenterMsgVO> msgList = kwmMessageUserService.userMsgCenter(dto);
-        int size = msgList.size();
-        boolean flag = size < 5;
-        Set<MessageEnum> excludeEnums = new HashSet<>();
-        String clientType = LoginUserHolder.getClientType();
-        msgList.forEach(e -> {
-            dto.setStatus(e.getStatus()).setType(e.getType());
-            UserMsgCenterLatestMsgDTO msg = kwmMessageUserService.getLatestMsg(dto);
-            if (Objects.nonNull(msg.getUrl())) {
-                Map<String, Object> urlMap = JSONObject.parse(msg.getUrl());
-                e.setUrl(Objects.isNull(urlMap.get(clientType)) ? null : urlMap.get(clientType).toString());
-            }
-            e.setId(msg.getId()).setTitle(msg.getTitle())
-                    .setContent(msg.getContent())
-                    .setCreateTime(msg.getCreateTime());
-            if (flag) {
-                MessageEnum messageEnum = MessageEnum.getEnumByCategoryAndType(msg.getCategory(), msg.getType());
-                if (Objects.nonNull(messageEnum)) {
-                    excludeEnums.add(messageEnum);
-                }
-            }
-        });
-        //补齐默认消息
-        if (flag) {
-            List<MessageEnum> enums = MessageEnum.getEnums(isMain, 5 - size, excludeEnums);
-            enums.forEach(e -> {
-                UserCenterMsgVO vo = new UserCenterMsgVO();
-                vo.setTitle(e.getTitle()).setContent("暂无" + e.getTitle());
-                msgList.add(vo);
-            });
-        }
-        //统计总未读消息条数
-        Long unReadNum = kwmMessageUserService.count(dto.getEntId(), dto.getUserId(), 0);
-        UserMsgCenterResVO result = new UserMsgCenterResVO();
-        result.setMsgList(msgList).setTotalUnReadNum(unReadNum);
-        return result;
-    }
-
-    public Long count(SelectMessagesDTO selectMessagesDTO) {
-        if (LoginUserHolder.isManager()) {//
-            return 0L;
-        }
-        selectMessagesDTO.setEntId(LoginUserHolder.getEntId());
-        selectMessagesDTO.setUserId(LoginUserHolder.getUserId());
-        return kwmMessageService.findCount(selectMessagesDTO);
-    }
-
-    public void mock() {
-        kwmMessageService.mock();
-    }
-}

+ 0 - 89
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwMessageHandlerService.java

@@ -1,89 +0,0 @@
-package com.sckw.message.service;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.StringUtils;
-import com.sckw.message.model.KwmMessage;
-import com.sckw.message.model.KwmMessageUser;
-import com.sckw.redis.constant.RedisConstant;
-import com.sckw.redis.utils.RedissonUtils;
-import com.sckw.stream.enums.MessageEnum;
-import com.sckw.stream.model.SckwMessage;
-import com.sckw.stream.model.UserInfo;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * @desc: message消息处理service
- * @author: yzc
- * @date: 2023-06-09 11:01
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class SckwMessageHandlerService {
-
-    private final KwmMessageService kwmMessageService;
-    private final KwmMessageUserService kwmMessageUserService;
-
-
-    /**
-     * @desc: message消息处理
-     * @author: yzc
-     * @date: 2023-06-09 15:33
-     * @Param sckwMessage:
-     * @return: void
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void handler(SckwMessage sckwMessage) {
-        log.info("SckwMessageHandler:{}", JSON.toJSONString(sckwMessage));
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(getKey(sckwMessage.getRequestId()), 10L, RedisConstant.CONSUMER_REQUEST_VALID_TIME))) {
-            log.info("重复message消息:{},不处理", sckwMessage.getRequestId());
-            return;
-        }
-        List<UserInfo> userInfos = sckwMessage.getUserInfos();
-        if (CollectionUtils.isEmpty(userInfos)) {
-            log.error("message消息处理用户信息为空,不处理");
-            return;
-        }
-        //构建message对象
-        MessageEnum messageEnum = sckwMessage.getMessageEnum();
-        Long createBy = sckwMessage.getCreateBy();
-        String content = StringUtils.replaceTextVar(messageEnum.getContent(), sckwMessage.getParams());
-        KwmMessage kwmMessage = KwmMessage.builder()
-                .category(messageEnum.getCategory())
-                .type(messageEnum.getType())
-                .title(messageEnum.getTitle())
-                .content(content)
-                .clientType(messageEnum.getPushType())
-                .url(Objects.isNull(sckwMessage.getMsgUrls()) ? null : JSON.toJSONString(sckwMessage.getMsgUrls()))
-                .params(Objects.isNull(sckwMessage.getParams()) ? null : JSON.toJSONString(sckwMessage.getParams()))
-                .build();
-        kwmMessage.setCreateBy(createBy);
-        kwmMessage.setUpdateBy(createBy);
-        Long msgId = kwmMessageService.insert(kwmMessage);
-        //多个用户id,构建多个KwmMessageUser对象保存
-        List<KwmMessageUser> messageUsers = Lists.newArrayList();
-        userInfos.forEach(e -> {
-            KwmMessageUser messageUser = KwmMessageUser.builder()
-                    .userId(e.getUserId())
-                    .entId(e.getEntId())
-                    .msgId(msgId)
-                    .build();
-            messageUser.setCreateBy(createBy);
-            messageUser.setUpdateBy(createBy);
-            messageUsers.add(messageUser);
-        });
-        kwmMessageUserService.batchSave(messageUsers);
-    }
-
-    public static String getKey(String requestId) {
-        return String.format(RedisConstant.MESSAGE_CONSUMER_REQUEST_KEY, requestId);
-    }
-}

+ 0 - 78
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java

@@ -1,78 +0,0 @@
-package com.sckw.message.service;
-
-import com.alibaba.fastjson2.JSON;
-import com.sckw.core.common.enums.EnvConstant;
-import com.sckw.core.exception.BusinessException;
-import com.sckw.message.model.KwmSms;
-import com.sckw.redis.constant.RedisConstant;
-import com.sckw.redis.utils.RedissonUtils;
-import com.sckw.stream.enums.SmsCodeEnum;
-import com.sckw.stream.model.SckwSms;
-import com.sckw.stream.utils.SmsUtil;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-/**
- * @author: yzc
- * @date: 2023-06-08 15:54
- * @description: 短信处理service
- */
-@Service
-@Slf4j
-@RequiredArgsConstructor
-public class SckwSmsHandlerService {
-
-    private final KwmSmsService kwmSmsService;
-
-    @Value("${spring.profiles.active}")
-    private String env;
-
-
-    /**
-     * @param sckwSms
-     * @return void
-     * @desc: 短信处理
-     * @author: yzc
-     * @date: 2023-06-13 13:44
-     */
-    public void handler(SckwSms sckwSms) {
-        log.info("接收到发送短信消息:{},开始处理", JSON.toJSONString(sckwSms));
-        String type = sckwSms.getType();
-        String phone = sckwSms.getPhone();
-        String lockKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_LOCK_KEY, type, phone);
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
-            log.info("获取发送短信锁失败,不处理");
-            return;
-        }
-        try {
-            String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
-            if (Boolean.TRUE.equals(RedissonUtils.exists(requestKey))) {
-                throw new BusinessException("请勿频繁获取短信验证码!");
-            }
-            RedissonUtils.putString(requestKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_REQUEST_TIME);
-            //发送短信 生产环境才发短信
-            if (EnvConstant.PROD.equals(env)) {
-                SmsUtil.sendSms(sckwSms.getPhone(), sckwSms.getSignName(), sckwSms.getTemplateCode().getName(), JSON.toJSONString(sckwSms.getParams()));
-            }
-            //放入缓存
-            String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
-            RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
-            //数据入库
-            SmsCodeEnum smsCodeEnum = sckwSms.getTemplateCode();
-            KwmSms kwmSms = KwmSms.builder().type(smsCodeEnum.getType()).code(smsCodeEnum.getName())
-                    .phone(sckwSms.getPhone()).content(smsCodeEnum.getValue())
-                    .params(JSON.toJSONString(sckwSms.getParams())).build();
-            kwmSms.setCreateBy(sckwSms.getCreateBy());
-            kwmSms.setUpdateBy(sckwSms.getCreateBy());
-            kwmSmsService.add(kwmSms);
-        } finally {
-            RedissonUtils.unlock(lockKey);
-        }
-    }
-
-    private String getKey(String prefix, String args1, String args2) {
-        return String.format(prefix, args1, args2);
-    }
-}

+ 19 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsHelper.java

@@ -0,0 +1,19 @@
+package com.sckw.message.service;
+
+import com.sckw.redis.constant.RedisConstant;
+
+/**
+ * @author xucaiqin
+ * @date 2026-05-07 10:39:17
+ */
+public class SmsHelper {
+    public static String getLockKey(String templateCode, String mobile) {
+        return String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_LOCK_KEY, templateCode, mobile);
+    }
+    public static String getVerifyKey(String templateCode, String mobile) {
+        return String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, templateCode, mobile);
+    }
+    public static String getVerifyValueKey(String bizType, String mobile) {
+        return String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, bizType, mobile);
+    }
+}

+ 308 - 56
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java

@@ -1,88 +1,340 @@
 package com.sckw.message.service;
 
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sckw.core.common.enums.EnvConstant;
-import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
-import com.sckw.core.model.constant.Global;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.NumberUtils;
-import com.sckw.core.utils.StringUtils;
-import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.message.model.vo.req.GetSmsVerifyCoderReqVO;
-import com.sckw.message.model.vo.req.SendSmsVerifyCoderReqVO;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.message.model.KwmSmsRecord;
+import com.sckw.message.model.KwmSmsTemplate;
+import com.sckw.message.model.KwmSmsVerifyCode;
+import com.sckw.message.model.bo.*;
+import com.sckw.message.utils.SmsUtil;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
-import com.sckw.stream.enums.SmsCodeEnum;
-import com.sckw.stream.model.SckwSms;
-import com.sckw.system.api.RemoteSystemService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Objects;
+import java.util.Random;
+import java.util.UUID;
 
-/**
- * @author: yzc
- * @date: 2023-06-08 11:08
- * @description:
- */
 @Service
 @Slf4j
 @RequiredArgsConstructor
 public class SmsService {
 
-    private final StreamBridge streamBridge;
-
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private RemoteSystemService remoteSystemService;
+    private final KwmSmsRecordService kwmSmsRecordService;
+    private final KwmSmsTemplateService kwmSmsTemplateService;
+    private final KwmSmsVerifyCodeService kwmSmsVerifyCodeService;
 
     @Value("${spring.profiles.active}")
     private String env;
 
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    public void sendVerifyCode(SmsBo param) {
+        String mobile = param.getMobile();
+        String bizType = param.getBizType();
+        String lockKey = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_LOCK_KEY, bizType, mobile);
+        if (!RedissonUtils.tryLock(lockKey, 5L, 10L)) {
+            throw new BusinessException("操作太频繁,请稍后再试");
+        }
+        try {
+            String requestKey = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, bizType, mobile);
+            if (RedissonUtils.exists(requestKey)) {
+                throw new BusinessException("请勿频繁获取验证码,请60秒后再试");
+            }
+
+            String code = generateVerifyCode();
+            Map<String, Object> templateParam = new HashMap<>();
+            templateParam.put("code", code);
+
+            RedissonUtils.putString(requestKey, code, RedisConstant.SMS_VERIFY_CODE_REQUEST_TIME);
+
+            KwmSmsRecord record = buildSmsRecord(mobile, null, bizType, 1, templateParam);
+            record.setSendStatus(3);
+
+            try {
+                if (EnvConstant.PROD.equals(env)) {
+                    KwmSmsTemplate template = getTemplateByBizType(bizType);
+                    if (template != null) {
+                        SmsUtil.sendSms(mobile, template.getSignName(), template.getProviderTemplateCode(), templateParam);
+                        record.setTemplateCode(template.getTemplateCode());
+                        record.setTemplateContent(template.getContent());
+                    }
+                }
+                record.setSendStatus(1);
+                record.setSendTime(LocalDateTime.now());
+            } catch (Exception e) {
+                log.error("发送验证码短信失败,手机号:{},原因:{}", mobile, e.getMessage(), e);
+                record.setSendStatus(2);
+                record.setFailReason(e.getMessage());
+            }
+            kwmSmsRecordService.save(record);
+
+            String valueKey = SmsHelper.getVerifyValueKey(bizType, mobile);
+            RedissonUtils.putString(valueKey, code, RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
+
+            KwmSmsVerifyCode verifyCode = new KwmSmsVerifyCode();
+            verifyCode.setMobile(mobile);
+            verifyCode.setBizType(bizType);
+            verifyCode.setVerifyCode(code);
+            verifyCode.setExpireTime(LocalDateTime.now().plusSeconds(RedisConstant.SMS_VERIFY_CODE_VALID_TIME));
+            verifyCode.setVerifyStatus(0);
+            verifyCode.setSendRecordId(record.getId());
+            verifyCode.setCreateTime(LocalDateTime.now());
+            kwmSmsVerifyCodeService.save(verifyCode);
+
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+    }
 
     /**
+     * 获取验证码
+     *
      * @param param
-     * @return com.sckw.core.web.response.HttpResult
-     * @desc: 发送验证码
-     * @author: yzc
-     * @date: 2023-06-13 13:43
+     * @return
      */
-    public void sendVerifyCode(SendSmsVerifyCoderReqVO param) {
-        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(Collections.singletonList(DictTypeEnum.SEND_SMS_TYPE.getType()));
-        Map<String, String> map;
-        if (CollectionUtils.isNotEmpty(dict)) {
-            map = dict.get(DictTypeEnum.SEND_SMS_TYPE.getType());
-        } else {
-            map = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-        }
-        String type = param.getType();
-        if (Objects.isNull(map.get(type))) {
-            throw new BusinessException("非法短信类型!");
-        }
-        String phone = param.getPhone();
-        String key = StringUtils.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
-        if (Boolean.TRUE.equals(RedissonUtils.exists(key))) {
-            throw new BusinessException("请勿频繁获取短信验证码!");
-        }
-        Map<String, Object> params = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-        //生产环境才发短信
-        String code = EnvConstant.PROD.equals(env) ? NumberUtils.createRandomVcode() : "123456";
-        params.put("code", code);
-        SckwSms sckwSms = new SckwSms();
-        sckwSms.setPhone(param.getPhone()).setType(type).setTemplateCode(SmsCodeEnum.VERIFICATION_CODE)
-                .setParams(params).setCreateBy(LoginUserHolder.getUserId());
-        streamBridge.send("sckw-sms", JSON.toJSONString(sckwSms));
+    public String getCode(GetVerifyCodeBo param) {
+        String mobile = param.getMobile();
+        String bizType = param.getBizType();
+
+        String valueKey = SmsHelper.getVerifyValueKey(bizType, mobile);
+        String cachedCode = RedissonUtils.getString(valueKey);
+
+
+        if (param.getDelete()) {
+            RedissonUtils.delete(valueKey);
+        }
+
+        updateVerify(mobile, bizType);
+        return cachedCode;
     }
 
-    public String getVerifyCode(GetSmsVerifyCoderReqVO param) {
-        String key = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, param.getType(), param.getPhone());
-        return RedissonUtils.getString(key);
+    private void updateVerify(String mobile, String bizType) {
+        LambdaQueryWrapper<KwmSmsVerifyCode> queryWrapper = Wrappers.<KwmSmsVerifyCode>lambdaQuery()
+                .eq(KwmSmsVerifyCode::getMobile, mobile)
+                .eq(KwmSmsVerifyCode::getBizType, bizType)
+                .eq(KwmSmsVerifyCode::getVerifyStatus, 0)
+                .orderByDesc(KwmSmsVerifyCode::getCreateTime)
+                .last("LIMIT 1");
+        KwmSmsVerifyCode latestCode = kwmSmsVerifyCodeService.getOne(queryWrapper);
+        if (latestCode != null) {
+            latestCode.setVerifyStatus(1);
+            kwmSmsVerifyCodeService.updateById(latestCode);
+        }
     }
+
+    /**
+     * 校验验证码
+     *
+     * @param param
+     * @return
+     */
+    public boolean verifyCode(VerifyCodeBo param) {
+        String mobile = param.getMobile();
+        String bizType = param.getBizType();
+        String inputCode = param.getVerifyCode();
+
+        String valueKey = SmsHelper.getVerifyValueKey(bizType, mobile);
+        String cachedCode = RedissonUtils.getString(valueKey);
+
+        if (StringUtils.isBlank(cachedCode)) {
+            throw new BusinessException("验证码已过期,请重新获取");
+        }
+        if (!cachedCode.equals(inputCode)) {
+            throw new BusinessException("验证码错误");
+        }
+
+        RedissonUtils.delete(valueKey);
+
+        updateVerify(mobile, bizType);
+        return true;
+    }
+
+    public void sendSms(SmsBo param) {
+        String mobile = param.getMobile();
+        String templateCode = param.getTemplateCode();
+        Map<String, Object> templateParam = param.getTemplateParam();
+
+        if (StringUtils.isBlank(templateCode)) {
+            throw new BusinessException("模板编码不能为空");
+        }
+
+        KwmSmsTemplate template = getTemplateByCode(templateCode);
+        if (template == null) {
+            throw new BusinessException("短信模板不存在");
+        }
+        if (template.getStatus() != null && template.getStatus() == 0) {
+            throw new BusinessException("短信模板已禁用");
+        }
+
+        String lockKey = SmsHelper.getLockKey(templateCode, mobile);
+        if (!RedissonUtils.tryLock(lockKey, 5L, 10L)) {
+            throw new BusinessException("操作太频繁,请稍后再试");
+        }
+
+        String requestKey = SmsHelper.getVerifyKey(templateCode, mobile);
+        if (RedissonUtils.exists(requestKey)) {
+            throw new BusinessException("请勿频繁获取验证码,请60秒后再试");
+        }
+
+        KwmSmsRecord record = buildSmsRecord(mobile, templateCode, param.getBizType(), template.getSmsType(), templateParam);
+        record.setTemplateContent(template.getContent());
+        record.setSendStatus(3);
+
+        try {
+            if (EnvConstant.PROD.equals(env)) {
+                SmsUtil.sendSms(mobile, template.getSignName(), template.getProviderTemplateCode(),
+                        templateParam);
+            }
+            record.setSendStatus(1);
+            record.setSendTime(LocalDateTime.now());
+        } catch (Exception e) {
+            log.error("发送短信失败,手机号:{},模板:{},原因:{}", mobile, templateCode, e.getMessage(), e);
+            record.setSendStatus(2);
+            record.setFailReason(e.getMessage());
+        }
+        kwmSmsRecordService.save(record);
+    }
+
+    public void batchSendSms(BatchSendSmsBo param) {
+        String templateCode = param.getTemplateCode();
+        Map<String, Object> templateParam = param.getTemplateParam();
+
+        KwmSmsTemplate template = getTemplateByCode(templateCode);
+        if (template == null) {
+            throw new BusinessException("短信模板不存在");
+        }
+        if (template.getStatus() != null && template.getStatus() == 0) {
+            throw new BusinessException("短信模板已禁用");
+        }
+
+        for (String mobile : param.getMobileList()) {
+            if (!mobile.matches("^1[3-9]\\d{9}$")) {
+                log.warn("批量发送短信跳过无效手机号:{}", mobile);
+                continue;
+            }
+
+            KwmSmsRecord record = buildSmsRecord(mobile, templateCode, param.getBizType(), template.getSmsType(), templateParam);
+            record.setTemplateContent(template.getContent());
+            record.setSendStatus(3);
+
+            try {
+                if (EnvConstant.PROD.equals(env)) {
+                    SmsUtil.sendSms(mobile, template.getSignName(), template.getProviderTemplateCode(),
+                            templateParam);
+                }
+                record.setSendStatus(1);
+                record.setSendTime(LocalDateTime.now());
+            } catch (Exception e) {
+                log.error("批量发送短信失败,手机号:{},模板:{},原因:{}", mobile, templateCode, e.getMessage(), e);
+                record.setSendStatus(2);
+                record.setFailReason(e.getMessage());
+            }
+            kwmSmsRecordService.save(record);
+        }
+    }
+
+    public PageResult pageRecord(SmsRecordQueryBo param) {
+        Page<KwmSmsRecord> page = new Page<>(param.getPage(), param.getPageSize());
+        LambdaQueryWrapper<KwmSmsRecord> wrapper = Wrappers.<KwmSmsRecord>lambdaQuery()
+                .eq(KwmSmsRecord::getDelFlag, 0)
+                .like(StringUtils.isNotBlank(param.getMobile()), KwmSmsRecord::getMobile, param.getMobile())
+                .eq(StringUtils.isNotBlank(param.getTemplateCode()), KwmSmsRecord::getTemplateCode, param.getTemplateCode())
+                .eq(param.getSendStatus() != null, KwmSmsRecord::getSendStatus, param.getSendStatus())
+                .eq(param.getSmsType() != null, KwmSmsRecord::getSmsType, param.getSmsType())
+                .eq(StringUtils.isNotBlank(param.getBizType()), KwmSmsRecord::getBizType, param.getBizType())
+                .ge(StringUtils.isNotBlank(param.getStartTime()), KwmSmsRecord::getCreateTime,
+                        StringUtils.isNotBlank(param.getStartTime()) ? LocalDateTime.parse(param.getStartTime(), DATE_TIME_FORMATTER) : null)
+                .le(StringUtils.isNotBlank(param.getEndTime()), KwmSmsRecord::getCreateTime,
+                        StringUtils.isNotBlank(param.getEndTime()) ? LocalDateTime.parse(param.getEndTime(), DATE_TIME_FORMATTER) : null)
+                .orderByDesc(KwmSmsRecord::getCreateTime);
+        IPage<KwmSmsRecord> result = kwmSmsRecordService.page(page, wrapper);
+        return PageResult.of(result, result.getRecords());
+    }
+
+    public KwmSmsRecord getRecordDetail(Long id) {
+        KwmSmsRecord record = kwmSmsRecordService.getById(id);
+        if (record == null || (record.getDelFlag() != null && record.getDelFlag() == 1)) {
+            throw new BusinessException("记录不存在");
+        }
+        return record;
+    }
+
+    public PageResult pageTemplate(SmsTemplateQueryBo param) {
+        Page<KwmSmsTemplate> page = new Page<>(param.getPage(), param.getPageSize());
+        LambdaQueryWrapper<KwmSmsTemplate> wrapper = Wrappers.<KwmSmsTemplate>lambdaQuery()
+                .like(StringUtils.isNotBlank(param.getTemplateCode()), KwmSmsTemplate::getTemplateCode, param.getTemplateCode())
+                .like(StringUtils.isNotBlank(param.getTemplateName()), KwmSmsTemplate::getTemplateName, param.getTemplateName())
+                .eq(param.getSmsType() != null, KwmSmsTemplate::getSmsType, param.getSmsType())
+                .eq(param.getStatus() != null, KwmSmsTemplate::getStatus, param.getStatus())
+                .orderByDesc(KwmSmsTemplate::getCreateTime);
+        IPage<KwmSmsTemplate> result = kwmSmsTemplateService.page(page, wrapper);
+        return PageResult.of(result, result.getRecords());
+    }
+
+    public KwmSmsTemplate getTemplateDetail(Long id) {
+        KwmSmsTemplate template = kwmSmsTemplateService.getById(id);
+        if (template == null) {
+            throw new BusinessException("模板不存在");
+        }
+        return template;
+    }
+
+    private KwmSmsRecord buildSmsRecord(String mobile, String templateCode, String bizType, Integer smsType, Map<String, Object> templateParam) {
+        KwmSmsRecord record = new KwmSmsRecord();
+        record.setBizNo(UUID.randomUUID().toString().replace("-", ""));
+        record.setMobile(mobile);
+        record.setTemplateCode(templateCode);
+        record.setTemplateParam(templateParam != null ? JSON.toJSONString(templateParam) : null);
+        record.setSmsType(smsType);
+        record.setChannelCode("ALIYUN");
+        record.setBizType(bizType);
+        record.setRequestId(UUID.randomUUID().toString().replace("-", ""));
+        record.setRetryCount(0);
+        record.setMaxRetryCount(3);
+        record.setDelFlag(0);
+        record.setCreateTime(LocalDateTime.now());
+        record.setUpdateTime(LocalDateTime.now());
+        return record;
+    }
+
+    private String generateVerifyCode() {
+        if (EnvConstant.PROD.equals(env)) {
+            Random random = new Random();
+            return String.format("%06d", random.nextInt(1000000));
+        }
+        return "123456";
+
+    }
+
+    private KwmSmsTemplate getTemplateByCode(String templateCode) {
+        return kwmSmsTemplateService.getOne(
+                Wrappers.<KwmSmsTemplate>lambdaQuery()
+                        .eq(KwmSmsTemplate::getTemplateCode, templateCode)
+                        .last("LIMIT 1")
+        );
+    }
+
+    private KwmSmsTemplate getTemplateByBizType(String bizType) {
+        return kwmSmsTemplateService.getOne(
+                Wrappers.<KwmSmsTemplate>lambdaQuery()
+                        .eq(KwmSmsTemplate::getBizType, bizType)
+                        .eq(KwmSmsTemplate::getStatus, 1)
+                        .last("LIMIT 1")
+        );
+    }
+
 }

+ 15 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsRecordServiceImpl.java

@@ -0,0 +1,15 @@
+package com.sckw.message.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.message.dao.KwmSmsRecordMapper;
+import com.sckw.message.model.KwmSmsRecord;
+import com.sckw.message.service.KwmSmsRecordService;
+import org.springframework.stereotype.Service;
+/**
+* @date 2026-05-07 08:54:58
+* @author xucaiqin
+*/
+@Service
+public class KwmSmsRecordServiceImpl extends ServiceImpl<KwmSmsRecordMapper, KwmSmsRecord> implements KwmSmsRecordService{
+
+}

+ 15 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsTemplateServiceImpl.java

@@ -0,0 +1,15 @@
+package com.sckw.message.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.message.dao.KwmSmsTemplateMapper;
+import com.sckw.message.model.KwmSmsTemplate;
+import com.sckw.message.service.KwmSmsTemplateService;
+import org.springframework.stereotype.Service;
+/**
+* @date 2026-05-07 08:53:50
+* @author xucaiqin
+*/
+@Service
+public class KwmSmsTemplateServiceImpl extends ServiceImpl<KwmSmsTemplateMapper, KwmSmsTemplate> implements KwmSmsTemplateService{
+
+}

+ 15 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/impl/KwmSmsVerifyCodeServiceImpl.java

@@ -0,0 +1,15 @@
+package com.sckw.message.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.message.dao.KwmSmsVerifyCodeMapper;
+import com.sckw.message.model.KwmSmsVerifyCode;
+import com.sckw.message.service.KwmSmsVerifyCodeService;
+import org.springframework.stereotype.Service;
+/**
+* @date 2026-05-07 08:55:10
+* @author xucaiqin
+*/
+@Service
+public class KwmSmsVerifyCodeServiceImpl extends ServiceImpl<KwmSmsVerifyCodeMapper, KwmSmsVerifyCode> implements KwmSmsVerifyCodeService{
+
+}

+ 111 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/utils/SmsUtil.java

@@ -0,0 +1,111 @@
+package com.sckw.message.utils;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+@Slf4j
+public class SmsUtil {
+    /**
+     * 阿里云 accessKeyId
+     */
+    private static final String ACCESS_KEY_ID = "LTAI5t6UtHjxywFfq6j1CtVM";
+
+    /**
+     * 阿里云 accessKeySecret
+     */
+    private static final String ACCESS_KEY_SECRET = "IsJOqxsQpBngMwMvJQSXM9ujPmQ5B3";
+
+    /**
+     * endpoint
+     */
+    private static final String ENDPOINT = "dysmsapi.aliyuncs.com";
+
+    /**
+     * 单例 Client
+     */
+    private static final Client CLIENT;
+
+    static {
+
+        try {
+
+            Config config = new Config().setAccessKeyId(ACCESS_KEY_ID).setAccessKeySecret(ACCESS_KEY_SECRET);
+            config.setEndpoint(ENDPOINT);
+            config.setRegionId("cn-hangzhou");
+            config.setMethod("POST");
+
+
+            CLIENT = new Client(config);
+
+            log.info("阿里云短信Client初始化成功");
+
+        } catch (Exception e) {
+
+            log.error("阿里云短信Client初始化失败", e);
+
+            throw new RuntimeException("初始化短信Client失败");
+        }
+    }
+
+
+    public static boolean sendSms(String phoneNumbers, String signName, String templateCode, Map<String, Object> params) {
+
+        try {
+
+            // 模板参数转json
+            String templateParam = JSON.toJSONString(params);
+
+            SendSmsRequest request = new SendSmsRequest().setPhoneNumbers(phoneNumbers).setSignName(signName).setTemplateCode(templateCode).setTemplateParam(templateParam);
+
+            log.info("开始发送短信,手机号:{},模板:{},参数:{}", phoneNumbers, templateCode, templateParam);
+
+            SendSmsResponse response = CLIENT.sendSms(request);
+            log.info("短信发送响应:{}", JSONObject.toJSONString(response));
+
+            String code = response.getBody().getCode();
+            String message = response.getBody().getMessage();
+            String bizId = response.getBody().getBizId();
+
+            // 阿里云成功code为OK
+            if ("OK".equals(code)) {
+
+                log.info("短信发送成功,手机号:{},bizId:{}", phoneNumbers, bizId);
+
+                return true;
+            }
+
+            log.error("短信发送失败,手机号:{},code:{},message:{}", phoneNumbers, code, message);
+
+            return false;
+
+        } catch (Exception e) {
+
+            log.error("短信发送异常", e);
+
+            return false;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        boolean result = SmsUtil.sendSms(
+                "15884485773",
+                "乐山沙湾盛昶矿石加工",
+                "SMS_506110118",
+                Map.of(
+                        "code", "123456"
+                )
+        );
+
+        System.out.println("发送结果:" + result);
+    }
+
+}
+

+ 0 - 105
sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageMapper.xml

@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.sckw.message.dao.KwmMessageMapper">
-
-  <select id="findPage" resultType="com.sckw.message.model.dto.MessageListDTO" >
-      select m.id,
-             mu.ent_id      entId,
-             mu.user_id     userId,
-             mu.status,
-             mu.remark,
-             mu.create_by   createBy,
-             mu.create_time createTime,
-             mu.update_by   updateBy,
-             mu.update_time updateTime,
-             mu.msg_id     as    msgId,
-             m.category,
-             m.type,
-             m.title,
-             m.content,
-             m.url,
-             m.params,
-             m.client_type  clientType,
-             m.remark as    msgRemark
-      from kwm_message_user mu
-               left join kwm_message m
-                         on mu.msg_id = m.id
-      <where>
-          m.del_flag = 0
-            and mu.del_flag = 0
-          <if test="item.entId != null">
-              and mu.ent_id = #{item.entId}
-          </if>
-          <if test="item.query != null and item.query != ''">
-              and (m.title like concat('%', #{item.query}, '%') or m.content like concat(#{item.query}, '%'))
-          </if>
-          <if test="item.userId != null">
-              and mu.user_id = #{item.userId}
-          </if>
-          <if test="item.status != null">
-              and mu.status = #{item.status}
-          </if>
-          <if test="item.category != null and item.category != ''">
-              and m.category = #{item.category}
-          </if>
-          <if test="item.startCreateTime != null">
-              and mu.create_time &gt;= #{item.startCreateTime,jdbcType=TIMESTAMP}
-          </if>
-          <if test="item.endCreateTime != null">
-              and mu.create_time &lt;= #{item.endCreateTime,jdbcType=TIMESTAMP}
-          </if>
-      </where>
-      ORDER BY mu.status, mu.create_time DESC
-  </select>
-    <select id="statistics" resultType="com.sckw.core.model.vo.TableTop">
-        select
-        mu.status as value,count(*) as total
-        from kwm_message_user mu
-        left join kwm_message m
-        on mu.msg_id = m.id
-        <where>
-            m.del_flag = 0 and mu.del_flag = 0
-            <if test="item.entId != null">
-                and mu.ent_id = #{item.entId}
-            </if>
-            <if test="item.userId != null">
-                and mu.user_id = #{item.userId}
-            </if>
-            <if test="item.category != null and item.category != ''">
-                and m.category = #{item.category}
-            </if>
-            <if test="item.startCreateTime != null">
-                and mu.create_time &gt;= #{item.startCreateTime,jdbcType=TIMESTAMP}
-            </if>
-            <if test="item.endCreateTime != null">
-                and mu.create_time &lt;= #{item.endCreateTime,jdbcType=TIMESTAMP}
-            </if>
-        </where>
-        group by mu.status
-
-    </select>
-
-  <select id="joinCount" resultType="java.lang.Long">
-      select count(1)
-      from kwm_message km
-               inner join kwm_message_user kmu on km.id = kmu.msg_id and kmu.del_flag = 0
-      <where>
-          km.del_flag = 0
-          <if test="para.entId != null">
-              and kmu.ent_id = #{para.entId}
-          </if>
-          <if test="para.query != null and para.query != ''">
-              and (km.title like concat('%', #{para.query}, '%') or km.content like concat(#{para.query}, '%'))
-          </if>
-          <if test="para.userId != null">
-              and kmu.user_id = #{para.userId}
-          </if>
-          <if test="para.category != null and para.category != ''">
-              and km.category = #{param1.category}
-          </if>
-          <if test="para.status != null">
-              and kmu.status = #{para.status}
-          </if>
-      </where>
-  </select>
-</mapper>

+ 0 - 83
sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageUserMapper.xml

@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.sckw.message.dao.KwmMessageUserMapper">
-
-    <insert id="insertBatch">
-        insert into kwm_message_user
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-            id,
-            msg_id,
-            ent_id,
-            user_id,
-            remark,
-            status,
-            create_by,
-            create_time,
-            update_by,
-            update_time,
-            del_flag
-        </trim>
-        values
-        <foreach collection="list" item="item" separator=",">
-            <trim prefix="(" suffix=")" suffixOverrides=",">
-                #{item.id,jdbcType=BIGINT},
-                #{item.msgId,jdbcType=BIGINT},
-                #{item.entId,jdbcType=BIGINT},
-                #{item.userId,jdbcType=VARCHAR},
-                #{item.remark,jdbcType=VARCHAR},
-                #{item.status,jdbcType=INTEGER},
-                #{item.createBy,jdbcType=BIGINT},
-                #{item.createTime,jdbcType=TIMESTAMP},
-                #{item.updateBy,jdbcType=BIGINT},
-                #{item.updateTime,jdbcType=TIMESTAMP},
-                #{item.delFlag,jdbcType=INTEGER}
-            </trim>
-        </foreach>
-    </insert>
-    <select id="userMsgCenter" resultType="com.sckw.message.model.vo.res.UserCenterMsgVO">
-        SELECT
-        mu.status as status,
-        m.type as type,
-        count(*) as num
-        FROM
-        kwm_message_user mu
-        LEFT JOIN kwm_message m ON mu.msg_id = m.id
-        <where>
-            m.del_flag = 0 and mu.del_flag = 0
-            <if test="item.entId != null">
-                and mu.ent_id = #{item.entId}
-            </if>
-            <if test="item.userId != null">
-                and mu.user_id = #{item.userId}
-            </if>
-        </where>
-        GROUP BY m.type, mu.status
-        ORDER BY mu.status ASC
-        LIMIT 5;
-    </select>
-    <select id="getLatestMsg" resultType="com.sckw.message.model.dto.UserMsgCenterLatestMsgDTO">
-        SELECT
-        mu.id, mu.status, mu.create_time as createTime,
-        m.category, m.type, m.title, m.content, m.url
-        FROM
-        kwm_message_user mu
-        LEFT JOIN kwm_message m ON mu.msg_id = m.id
-        <where>
-            m.del_flag = 0 and mu.del_flag = 0
-            <if test="item.status != null">
-                and mu.status = #{item.status}
-            </if>
-            <if test="item.type != null and item.type != ''">
-                and m.type = #{item.type}
-            </if>
-            <if test="item.entId != null">
-                and mu.ent_id = #{item.entId}
-            </if>
-            <if test="item.userId != null">
-                and mu.user_id = #{item.userId}
-            </if>
-        </where>
-        order by mu.create_time desc limit 1;
-
-    </select>
-</mapper>