Bläddra i källkod

接口测试和调整

1811872455@163.com 4 veckor sedan
förälder
incheckning
28b5929670
16 ändrade filer med 287 tillägg och 849 borttagningar
  1. 5 0
      java/storlead-api/pom.xml
  2. 2 1
      java/storlead-api/src/main/java/com/storlead/StorleadTradeApplication.java
  3. 13 0
      java/storlead-es/storlead-es-biz/pom.xml
  4. 0 41
      java/storlead-es/storlead-es-biz/src/main/java/com/storlead/es/config/ElasticSearchConfig.java
  5. 36 2
      java/storlead-es/storlead-es-biz/src/main/java/com/storlead/es/config/EsAutoConfiguration.java
  6. 26 1
      java/storlead-message/pom.xml
  7. 86 31
      java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageApiController.java
  8. 0 181
      java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageTemplateApiController.java
  9. 0 110
      java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/UserMessageConfigApiController.java
  10. 13 0
      java/storlead-message/storlead-message-core/pom.xml
  11. 45 0
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/dto/MessageSendDTO.java
  12. 54 11
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/vo/MessageDetailVO.java
  13. 0 170
      java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/MessageApiController.java
  14. 0 185
      java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/MessageTemplateApiController.java
  15. 0 110
      java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/UserMessageConfigApiController.java
  16. 7 6
      pom.xml

+ 5 - 0
java/storlead-api/pom.xml

@@ -76,6 +76,11 @@
             <artifactId>storlead-knowledge-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-message-api</artifactId>
+        </dependency>
+
         <!-- UserServiceImpl 等依赖 ThirdPartyUserSyncService,默认实现见 storlead-thirdparty-biz -->
         <dependency>
             <groupId>com.storlead.boot</groupId>

+ 2 - 1
java/storlead-api/src/main/java/com/storlead/StorleadTradeApplication.java

@@ -18,7 +18,8 @@ import java.net.InetAddress;
         "com.storlead.sms.mapper",
         "com.storlead.system.mapper",
         "com.storlead.sales.mapper",
-        "com.storlead.mail.mapper"
+        "com.storlead.mail.mapper",
+        "com.storlead.message.mapper"
 })
 @Slf4j
 public class StorleadTradeApplication {

+ 13 - 0
java/storlead-es/storlead-es-biz/pom.xml

@@ -20,26 +20,39 @@
         <dependency>
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-es-spi</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-es-core</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-common</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-mybatis</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-autoconfigure</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>

+ 0 - 41
java/storlead-es/storlead-es-biz/src/main/java/com/storlead/es/config/ElasticSearchConfig.java

@@ -1,41 +0,0 @@
-package com.storlead.es.config;
-
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.elasticsearch.client.RestClient;
-import org.elasticsearch.client.RestHighLevelClient;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
-
-/**
- * Elasticsearch 客户端,仅在 {@code storlead.es.enabled=true} 时创建。
- */
-@Configuration
-@ConditionalOnProperty(prefix = "storlead.es", name = "enabled", havingValue = "true")
-@EnableConfigurationProperties(EsProperties.class)
-public class ElasticSearchConfig {
-
-    @Bean(destroyMethod = "close")
-    public RestHighLevelClient restHighLevelClient(EsProperties properties) {
-        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-        if (properties.getUsername() != null && !properties.getUsername().isEmpty()) {
-            credentialsProvider.setCredentials(
-                    AuthScope.ANY,
-                    new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword()));
-        }
-        return new RestHighLevelClient(
-                RestClient.builder(new HttpHost(properties.getHost(), properties.getPort(), properties.getScheme()))
-                        .setHttpClientConfigCallback(httpClientBuilder ->
-                                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)));
-    }
-
-    @Bean
-    public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient restHighLevelClient) {
-        return new ElasticsearchRestTemplate(restHighLevelClient);
-    }
-}

+ 36 - 2
java/storlead-es/storlead-es-biz/src/main/java/com/storlead/es/config/EsAutoConfiguration.java

@@ -1,19 +1,53 @@
 package com.storlead.es.config;
 
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
 
 /**
  * ES 域自动配置:始终注册 {@link com.storlead.es.service.EsSearchCustomerService}(Noop 或真实实现)。
  */
 @Configuration
 @EnableConfigurationProperties(EsProperties.class)
-@Import(ElasticSearchConfig.class)
 @ComponentScan(basePackages = {
         "com.storlead.es.service.impl",
         "com.storlead.es.server.impl"
 })
 public class EsAutoConfiguration {
+
+    /**
+     * Elasticsearch 客户端,仅在 {@code storlead.es.enabled=true} 时创建。
+     */
+    @Configuration
+    @ConditionalOnProperty(prefix = "storlead.es", name = "enabled", havingValue = "true")
+    static class ElasticsearchClientConfiguration {
+
+        @Bean(destroyMethod = "close")
+        RestHighLevelClient restHighLevelClient(EsProperties properties) {
+            BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+            if (properties.getUsername() != null && !properties.getUsername().isEmpty()) {
+                credentialsProvider.setCredentials(
+                        AuthScope.ANY,
+                        new UsernamePasswordCredentials(properties.getUsername(), properties.getPassword()));
+            }
+            return new RestHighLevelClient(
+                    RestClient.builder(new HttpHost(properties.getHost(), properties.getPort(), properties.getScheme()))
+                            .setHttpClientConfigCallback(httpClientBuilder ->
+                                    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)));
+        }
+
+        @Bean
+        ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient restHighLevelClient) {
+            return new ElasticsearchRestTemplate(restHighLevelClient);
+        }
+    }
 }

+ 26 - 1
java/storlead-message/pom.xml

@@ -14,7 +14,7 @@
     <artifactId>storlead-message</artifactId>
     <packaging>pom</packaging>
     <name>storlead-message</name>
-    <version>1.0</version>
+    <description>消息域聚合模块</description>
 
     <modules>
         <module>storlead-message-core</module>
@@ -22,4 +22,29 @@
         <module>storlead-message-biz</module>
         <module>storlead-message-api</module>
     </modules>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.storlead.boot</groupId>
+                <artifactId>storlead-message-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.storlead.boot</groupId>
+                <artifactId>storlead-message-spi</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.storlead.boot</groupId>
+                <artifactId>storlead-message-biz</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.storlead.boot</groupId>
+                <artifactId>storlead-message-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
 </project>

+ 86 - 31
java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageApiController.java

@@ -3,20 +3,21 @@ package com.storlead.message.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.storlead.framework.common.result.Result;
 import com.storlead.framework.util.LoginUserUtil;
 import com.storlead.message.enums.MessageTypeEnum;
 import com.storlead.message.pojo.dto.MessageDTO;
-import com.storlead.message.pojo.dto.MessageTestDTO;
+import com.storlead.message.pojo.dto.MessageSendDTO;
 import com.storlead.message.pojo.entity.InsideMessageSendLogEntity;
 import com.storlead.message.pojo.vo.MessageAppNoReadVO;
 import com.storlead.message.pojo.vo.MessageDetailVO;
 import com.storlead.message.pojo.vo.MessageNoReadTotalVO;
 import com.storlead.message.pojo.vo.MessageTypeReadStateVO;
+import com.storlead.message.service.InsideMessageRecordService;
 import com.storlead.message.service.InsideMessageSendLogService;
 import io.swagger.annotations.*;
 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;
 
@@ -41,14 +42,25 @@ public class MessageApiController {
     @Resource
     private InsideMessageSendLogService messageSendLogService;
 
+    @Resource
+    private InsideMessageRecordService messageRecordService;
+
+    @PostMapping(value = "/testSend")
+    @ApiOperation(value = "发送站内消息(ApiPost:POST + application/json,Header 带 token)")
+    public Result<?> sendMessage(@RequestBody MessageSendDTO dto) {
+        return messageRecordService.sendDirectMessage(dto);
+    }
 
     @PostMapping(value = "/pageList")
-    @ApiOperation(value = "获取当前用户的站内消息" )
+    @ApiOperation(value = "获取当前用户的站内消息(可选 messageType / appId / isRead)")
     @ApiResponses({
             @ApiResponse(code = 200, message = "", response = MessageDetailVO.class)
     })
     public Result<?> getMessage(MessageDTO dto) {
-        IPage<MessageDetailVO> pageList =  messageSendLogService.queryListMessageLog(dto);
+        if (dto == null) {
+            dto = new MessageDTO();
+        }
+        IPage<MessageDetailVO> pageList = messageSendLogService.queryListMessageLog(dto);
         return Result.result(pageList);
     }
 
@@ -66,38 +78,45 @@ public class MessageApiController {
     }
 
     @PostMapping(value = "/readAll")
-    @ApiOperation(value = "更新为已读" )
-    public Result<?> readAll(@ApiParam(value = "") Integer messageType) {
-        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper();
-        updateWrapper.in(InsideMessageSendLogEntity::getReceiverUserId,LoginUserUtil.getCurrentUserId());
-        updateWrapper.in(InsideMessageSendLogEntity::getIsDelete,Integer.valueOf(0));
-        updateWrapper.in(InsideMessageSendLogEntity::getIsRead,Integer.valueOf(0));
-        if (Objects.nonNull(messageType)) {
-            updateWrapper.in(InsideMessageSendLogEntity::getMessageType,messageType);
+    @ApiOperation(value = "全部标记已读(可选 messageType / appId)")
+    public Result<?> readAll(MessageDTO dto) {
+        if (dto == null) {
+            dto = new MessageDTO();
         }
-        updateWrapper.set(InsideMessageSendLogEntity::getIsRead,1);
+        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(InsideMessageSendLogEntity::getReceiverUserId, LoginUserUtil.getCurrentUserId());
+        updateWrapper.eq(InsideMessageSendLogEntity::getIsDelete, 0);
+        updateWrapper.eq(InsideMessageSendLogEntity::getIsRead, 0);
+        applySendLogMessageTypeFilter(updateWrapper, dto.getMessageType());
+        applyAppIdUpdateFilter(updateWrapper, dto.getAppId());
+        updateWrapper.set(InsideMessageSendLogEntity::getIsRead, 1);
         return Result.result(messageSendLogService.update(updateWrapper));
     }
 
     @PostMapping(value = "/cleanAll")
-    @ApiOperation(value = "清除消息" )
+    @ApiOperation(value = "清除消息(可选 messageType / appId / isRead)")
     public Result<?> cleanAll(MessageDTO dto) {
-        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper();
-        updateWrapper.in(InsideMessageSendLogEntity::getReceiverUserId,LoginUserUtil.getCurrentUserId());
-        if (Objects.nonNull(dto.getMessageType())) {
-            updateWrapper.in(InsideMessageSendLogEntity::getMessageType,dto.getMessageType());
+        if (dto == null) {
+            dto = new MessageDTO();
         }
+        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(InsideMessageSendLogEntity::getReceiverUserId, LoginUserUtil.getCurrentUserId());
+        applySendLogMessageTypeFilter(updateWrapper, dto.getMessageType());
         if (Objects.nonNull(dto.getIsRead())) {
-            updateWrapper.in(InsideMessageSendLogEntity::getIsRead,dto.getIsRead());
+            updateWrapper.eq(InsideMessageSendLogEntity::getIsRead, dto.getIsRead());
         }
-        updateWrapper.eq(InsideMessageSendLogEntity::getIsDelete,Integer.valueOf(0));
-        updateWrapper.set(InsideMessageSendLogEntity::getIsDelete,1);
+        applyAppIdUpdateFilter(updateWrapper, dto.getAppId());
+        updateWrapper.eq(InsideMessageSendLogEntity::getIsDelete, 0);
+        updateWrapper.set(InsideMessageSendLogEntity::getIsDelete, 1);
         return Result.result(messageSendLogService.update(updateWrapper));
     }
 
     @PostMapping(value = "/getMessageCount")
-    @ApiOperation(value = "获取未读消息数" )
+    @ApiOperation(value = "获取未读消息数(可选 messageType / appId)")
     public Result<?> getMessageCount(MessageDTO dto) {
+        if (dto == null) {
+            dto = new MessageDTO();
+        }
         MessageNoReadTotalVO countMap = messageSendLogService.countNoReadtotal(buildUnreadQueryWrapper(dto));
         return Result.result(countMap);
     }
@@ -140,18 +159,54 @@ public class MessageApiController {
      * 未读统计通用条件:当前用户、未读、未删除;可选 messageType / appId(关联 inside_message_record)。
      */
     private QueryWrapper<InsideMessageSendLogEntity> buildUnreadQueryWrapper(MessageDTO dto) {
+        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = buildBaseUserQueryWrapper();
+        queryWrapper.eq("mlog.is_read", 0);
+        applyRecordScopeFilter(queryWrapper, dto);
+        return queryWrapper;
+    }
+
+    /**
+     * 当前用户未删除消息的基础条件(关联 inside_message_record)。
+     */
+    private QueryWrapper<InsideMessageSendLogEntity> buildBaseUserQueryWrapper() {
         QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
-        queryWrapper.eq("mlog.is_read", 0);
         queryWrapper.eq("mlog.is_delete", 0);
-        if (dto != null) {
-            if (Objects.nonNull(dto.getMessageType())) {
-                queryWrapper.eq("mr.message_type", dto.getMessageType());
-            }
-            if (Objects.nonNull(dto.getAppId())) {
-                queryWrapper.eq("mr.app_id", dto.getAppId());
-            }
-        }
         return queryWrapper;
     }
+
+    /**
+     * 按 inside_message_record 上的 messageType / appId 过滤。
+     */
+    private void applyRecordScopeFilter(QueryWrapper<InsideMessageSendLogEntity> queryWrapper, MessageDTO dto) {
+        if (dto == null) {
+            return;
+        }
+        if (Objects.nonNull(dto.getMessageType())) {
+            queryWrapper.eq("mr.message_type", dto.getMessageType());
+        }
+        if (Objects.nonNull(dto.getAppId())) {
+            queryWrapper.eq("mr.app_id", dto.getAppId());
+        }
+    }
+
+    /**
+     * 更新类接口按 send_log.message_type 过滤(与历史 readAll 行为一致)。
+     */
+    private void applySendLogMessageTypeFilter(LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper, String messageType) {
+        if (Objects.nonNull(messageType)) {
+            updateWrapper.eq(InsideMessageSendLogEntity::getMessageType, messageType);
+        }
+    }
+
+    /**
+     * appId 在 inside_message_record 上,更新 send_log 时通过 message_id 子查询关联。
+     */
+    private void applyAppIdUpdateFilter(LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper, Long appId) {
+        if (Objects.nonNull(appId)) {
+            updateWrapper.inSql(InsideMessageSendLogEntity::getMessageId,
+                    "SELECT id FROM inside_message_record WHERE app_id = " + appId);
+        }
+    }
+
 }

+ 0 - 181
java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/MessageTemplateApiController.java

@@ -1,181 +0,0 @@
-package com.storlead.message.controller;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.common.result.Result;
-import com.storlead.framework.mybatis.entity.SysBaseField;
-import com.storlead.message.enums.MessageTypeEnum;
-import com.storlead.message.pojo.dto.MessageTemplateEventDTO;
-import com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity;
-import com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity;
-import com.storlead.message.pojo.vo.MessageArgTemplateVO;
-import com.storlead.message.pojo.vo.MessageTemplateVO;
-import com.storlead.message.service.MessageTemplateEventDetailService;
-import com.storlead.message.service.MessageTemplateEventGroupService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.BeanUtils;
-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 javax.annotation.Resource;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2024-04-26 15:15
- */
-@RestController
-@RequestMapping("/sys/message/template")
-@Api(tags = "消息: 消息模板机制配置")
-public class MessageTemplateApiController {
-
-    @Resource
-    private MessageTemplateEventGroupService templateEventGroupService;
-
-    @Resource
-    private MessageTemplateEventDetailService templateEventDetailService;
-
-    @ApiOperation("保存模板")
-    @PostMapping("save")
-    public Result save(@RequestBody MessageTemplateEventGroupEntity groupEntity) {
-        templateEventGroupService.saveOrUpdate(groupEntity);
-        return Result.ok();
-    }
-
-    @ApiOperation("分页查询")
-    @PostMapping("listPage")
-    public Result listPage(@RequestBody MessageTemplateEventDTO dto) {
-
-        Page<MessageTemplateEventGroupEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        LambdaQueryWrapper<MessageTemplateEventGroupEntity> queryWrapper = new LambdaQueryWrapper();
-        if (Objects.nonNull(dto.getTemplateServiceType())) {
-            queryWrapper.eq(MessageTemplateEventGroupEntity::getTemplateServiceType,dto.getTemplateServiceType());
-        }
-        if (StrUtil.isNotBlank(dto.getBlurry())) {
-            queryWrapper.like(MessageTemplateEventGroupEntity::getEventName,dto.getBlurry());
-        }
-        IPage<MessageTemplateVO>  pageList = templateEventGroupService.listPage(page, queryWrapper);
-        if (CollectionUtil.isNotEmpty(pageList.getRecords())) {
-            List<Long> dt = pageList.getRecords().stream().map(MessageTemplateVO::getId).collect(Collectors.toList());
-            LambdaQueryWrapper<MessageTemplateEventDetailEntity> wrapper = new LambdaQueryWrapper<>();
-            wrapper.in(MessageTemplateEventDetailEntity::getTemplateEventId,dt);
-            List<MessageTemplateEventDetailEntity>  detailEntities = templateEventDetailService.list(wrapper);
-            Map<Long, List<MessageTemplateEventDetailEntity>> groupMap = detailEntities.stream().collect(Collectors.groupingBy(MessageTemplateEventDetailEntity::getTemplateEventId));
-            pageList.getRecords().forEach(arg -> {
-                arg.setDetailEntities(groupMap.get(arg.getId()));
-            });
-            SysBaseField.dictFileds(pageList.getRecords());
-        }
-        return Result.result(pageList);
-    }
-
-    @ApiOperation("保存模板详情")
-    @PostMapping("saveTempleteContent")
-    public Result saveTempleteContent(@RequestBody MessageTemplateEventDetailEntity entity) {
-        templateEventDetailService.saveOrUpdate(entity);
-        return Result.ok();
-    }
-
-    @ApiOperation("获取消息模板详情")
-    @PostMapping("getGroupDetail")
-    public Result getGroupDetail(Long id,String templateDetailType) {
-        MessageTemplateEventGroupEntity templateEventGroup =  templateEventGroupService.getById(id);
-        if (Objects.isNull(templateEventGroup)) {
-            return Result.ok();
-        }
-        MessageTemplateVO templateVO = new MessageTemplateVO();
-        BeanUtils.copyProperties(templateEventGroup,templateVO);
-        LambdaQueryWrapper<MessageTemplateEventDetailEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(MessageTemplateEventDetailEntity::getTemplateEventId,templateEventGroup.getId());
-        if (Objects.nonNull(templateDetailType)) {
-            wrapper.eq(MessageTemplateEventDetailEntity::getTemplateDetailType,templateDetailType);
-        }
-        List<MessageTemplateEventDetailEntity>  detailEntities = templateEventDetailService.list(wrapper);
-        templateVO.setDetailEntities(detailEntities);
-        templateVO.dictFiled();
-
-        List<MessageArgTemplateVO> argTemplatels = new ArrayList<>();
-        Class clazz = null;
-//        if (MessageTypeEnum.CUSTOMER.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = CustomerMessageVO.class;
-//        } else if (MessageTypeEnum.CLUS.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = CustomerMessageVO.class;
-//        } else if (MessageTypeEnum.ORDER_FORM.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = OrderMessageVO.class;
-//        } else if (MessageTypeEnum.BUSINESS.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = BusinessMessageVO.class;
-//        } else if (MessageTypeEnum.TASK_CANCELED.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = TaskMessageVO.class;
-//        } else if (MessageTypeEnum.FOLLOW_UP.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = FollowMessageVO.class;
-//        } else if (MessageTypeEnum.LIAISON.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = LiaisonMessageVO.class;
-//        } else if (MessageTypeEnum.PERFORMANCE_GOAL.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = PerformanceGoalMessgeVO.class;
-//        } else if (MessageTypeEnum.BULLETIN.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = BulletinMessageVO.class;
-//        } else if (MessageTypeEnum.OTHER_EXTEND.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-//            clazz = OtherExtendMessageVO.class;
-//        } else if (MessageTypeEnum.BROADCAST.getCode().equals(templateEventGroup.getTemplateServiceType().toString())){
-//            clazz = BroadcastTotalMessageVO.class;
-//        }
-
-        if (clazz != null) {
-            for (Field field : clazz.getDeclaredFields()) {
-                MessageArgTemplateVO vo = new MessageArgTemplateVO();
-                vo.setPropertyKey("${" + field.getName() + "}$");
-                // 检查字段是否有 @Column 注解
-                if (field.isAnnotationPresent(ApiModelProperty.class)) {
-                    // 获取注解实例
-                    ApiModelProperty property = field.getAnnotation(ApiModelProperty.class);
-                    vo.setPropertyName(property.value());
-                    // 输出字段名和注解的值
-                }
-                argTemplatels.add(vo);
-            }
-        }
-        templateVO.setArgls(argTemplatels);
-        return Result.result(templateVO);
-    }
-    @ApiOperation("获取消息模板详情")
-    @PostMapping("getDetail")
-    public Result getDetail(Long id) {
-        MessageTemplateEventDetailEntity detailEntity =  templateEventDetailService.getById(id);
-        return Result.result(detailEntity);
-    }
-
-    @ApiOperation("禁用或启用模型")
-    @PostMapping("enabledDetail")
-    public Result enabledTemplateDetail(Long id,Boolean enable) {
-        LambdaUpdateWrapper<MessageTemplateEventDetailEntity> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.set(MessageTemplateEventDetailEntity::getEnabled,enable);
-        updateWrapper.eq(MessageTemplateEventDetailEntity::getId,id);
-        templateEventDetailService.update(updateWrapper);
-        return Result.ok();
-    }
-
-    @ApiOperation("删除模板")
-    @PostMapping("delete")
-    public Result delete(Long id) {
-        if(Objects.isNull(id)) {
-            return Result.error("参数错误");
-        }
-        templateEventGroupService.lgDelete(id);
-        return Result.ok();
-    }
-}

+ 0 - 110
java/storlead-message/storlead-message-api/src/main/java/com/storlead/message/controller/UserMessageConfigApiController.java

@@ -1,110 +0,0 @@
-package com.storlead.message.controller;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.common.result.Result;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.message.pojo.dto.MessageTemplateEventDTO;
-import com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity;
-import com.storlead.message.pojo.entity.UserMessageNoticeConfigEntity;
-import com.storlead.message.pojo.vo.MessageTemplateVO;
-import com.storlead.message.service.MessageTemplateEventGroupService;
-import com.storlead.message.service.UserMessageNoticeConfigService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.util.CollectionUtils;
-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 javax.annotation.Resource;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2025-04-25 11:26
- */
-@RestController
-@RequestMapping("/sys/message/config")
-@Api(tags = "消息: 用户消息设置")
-public class UserMessageConfigApiController {
-
-
-    @Resource
-    private UserMessageNoticeConfigService userMessageNoticeConfigService;
-
-    @Resource
-    private MessageTemplateEventGroupService templateEventGroupService;
-
-    @ApiOperation("保存用户配置详情")
-    @PostMapping("setMessageConfig")
-    public Result setMessageConfig(@RequestBody UserMessageNoticeConfigEntity entity) {
-
-        LambdaQueryWrapper<UserMessageNoticeConfigEntity> queryWrapper = new LambdaQueryWrapper();
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy, LoginUserUtil.getCurrentUserId());
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateEventId,entity.getTemplateEventId());
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateDetailType,entity.getTemplateDetailType());
-        queryWrapper.last(" limit 1");
-        UserMessageNoticeConfigEntity o1 = userMessageNoticeConfigService.getOne(queryWrapper);
-        if (Objects.nonNull(o1)) {
-            entity.setId(o1.getId());
-        }
-        userMessageNoticeConfigService.saveOrUpdate(entity);
-        return Result.ok();
-    }
-
-    @ApiOperation("分页查询")
-    @PostMapping("listPage")
-    public Result listPage(@RequestBody MessageTemplateEventDTO dto) {
-        Page<MessageTemplateEventGroupEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        LambdaQueryWrapper<MessageTemplateEventGroupEntity> queryWrapper = new LambdaQueryWrapper();
-        if (Objects.nonNull(dto.getTemplateServiceType())) {
-            queryWrapper.eq(MessageTemplateEventGroupEntity::getTemplateServiceType,dto.getTemplateServiceType());
-        }
-        if (StrUtil.isNotBlank(dto.getBlurry())) {
-            queryWrapper.like(MessageTemplateEventGroupEntity::getEventName,dto.getBlurry());
-        }
-        IPage<MessageTemplateVO> pageList = templateEventGroupService.listPage(page, queryWrapper);
-        if (CollectionUtil.isNotEmpty(pageList.getRecords())) {
-            List<Long> dt = pageList.getRecords().stream().map(MessageTemplateVO::getId).collect(Collectors.toList());
-            LambdaQueryWrapper<UserMessageNoticeConfigEntity> wrapper = new LambdaQueryWrapper<>();
-            wrapper.in(UserMessageNoticeConfigEntity::getTemplateEventId,dt);
-            wrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy, LoginUserUtil.getCurrentUserId());
-            List<UserMessageNoticeConfigEntity>  detailEntities = userMessageNoticeConfigService.list(wrapper);
-            Map<Long, List<UserMessageNoticeConfigEntity>> groupMap = detailEntities.stream().collect(Collectors.groupingBy(UserMessageNoticeConfigEntity::getTemplateEventId));
-            pageList.getRecords().forEach(arg -> {
-                List<UserMessageNoticeConfigEntity> rs =  groupMap.get(arg.getId());
-                arg.setUserDetails(Objects.isNull(rs) ? Collections.emptyList() : rs);
-            });
-        }
-        return Result.result(pageList);
-    }
-
-    @ApiOperation("消息开启关闭")
-    @PostMapping("on_off_message_config")
-    public Result onOffMessageConfig(@RequestBody UserMessageNoticeConfigEntity entity) {
-
-        //    @ApiModelProperty(value = "site:站内,sms:短信,wecom:企业微信,mail:邮件")
-        List<String> templateDetailTypels = CollectionUtils.isEmpty(entity.getTemplateDetailTypels()) ? Arrays.asList("site","wecom","mail") : entity.getTemplateDetailTypels();
-        for (String templateDetailType : templateDetailTypels) {
-            LambdaQueryWrapper<UserMessageNoticeConfigEntity> queryWrapper = new LambdaQueryWrapper();
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy,LoginUserUtil.getCurrentUserId());
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateEventId,entity.getTemplateEventId());
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateDetailType,templateDetailType);
-            queryWrapper.last(" limit 1");
-            UserMessageNoticeConfigEntity o1 = userMessageNoticeConfigService.getOne(queryWrapper);
-            if (Objects.nonNull(o1)) {
-                entity.setId(o1.getId());
-            }
-            userMessageNoticeConfigService.saveOrUpdate(entity);
-        }
-        return Result.ok();
-    }
-}

+ 13 - 0
java/storlead-message/storlead-message-core/pom.xml

@@ -25,5 +25,18 @@
             <groupId>com.storlead.boot</groupId>
             <artifactId>storlead-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 45 - 0
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/dto/MessageSendDTO.java

@@ -0,0 +1,45 @@
+package com.storlead.message.pojo.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 站内消息发送参数(ApiPost 可用 x-www-form-urlencoded 或 query 传参)
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "站内消息发送", description = "发送站内消息测试/业务参数")
+public class MessageSendDTO {
+
+    @ApiModelProperty(value = "消息标题", required = true, example = "测试消息标题")
+    private String title;
+
+    @ApiModelProperty(value = "消息内容", example = "这是一条 ApiPost 测试消息")
+    private String content;
+
+    @ApiModelProperty(value = "接收人用户 ID(单用户时可只传此字段)", example = "1")
+    private Long receiverUserId;
+
+    @ApiModelProperty(value = "接收人用户 ID 列表(多用户:toUserIds=1&toUserIds=2)")
+    private Long[] toUserIds;
+
+    @ApiModelProperty(value = "应用 ID,对应 inside_message_record.app_id", example = "10")
+    private Long appId;
+
+    @ApiModelProperty(value = "消息类型,对应 inside_message_record.message_type", example = "30")
+    private Integer messageType;
+
+    @ApiModelProperty(value = "发送人用户 ID,不传则取当前登录用户")
+    private Long sendUserId;
+
+    @ApiModelProperty(value = "回调地址")
+    private String callbackUrl;
+
+    @ApiModelProperty(value = "消息图标")
+    private String messageIcon;
+
+    @ApiModelProperty(value = "消息标签")
+    private String messageTag;
+}

+ 54 - 11
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/pojo/vo/MessageDetailVO.java

@@ -1,23 +1,67 @@
 package com.storlead.message.pojo.vo;
 
-import com.storlead.message.pojo.entity.InsideMessageSendLogEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.util.Date;
+
 /**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2024-04-19 16:40
+ * 站内消息列表/详情 VO(关联 inside_message_send_log + inside_message_record)
  */
 @Data
-@EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-@ApiModel(value="站内消息", description="站内消息")
-public class MessageDetailVO extends InsideMessageSendLogEntity {
+@ApiModel(value = "站内消息", description = "站内消息")
+public class MessageDetailVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "发送记录主键")
+    private Long id;
+
+    @ApiModelProperty(value = "消息 id")
+    private Long messageId;
+
+    @ApiModelProperty(value = "接收人")
+    private Long receiverUserId;
+
+    @ApiModelProperty(value = "消息类型")
+    private Integer messageType;
+
+    @ApiModelProperty(value = "细分消息类型")
+    private Integer messageSubType;
+
+    @ApiModelProperty(value = "0:未读,1:已读")
+    private Integer isRead;
+
+    @ApiModelProperty(value = "接收状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "归属人员")
+    private Long ownerBy;
+
+    @ApiModelProperty(value = "创建人")
+    private Long createBy;
+
+    @ApiModelProperty(value = "更新人")
+    private Long updateBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除")
+    private Integer isDelete;
+
+    @ApiModelProperty(value = "是否启用")
+    private Boolean enabled;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
 
     @ApiModelProperty(value = "消息标题")
     private String title;
@@ -34,7 +78,7 @@ public class MessageDetailVO extends InsideMessageSendLogEntity {
     @ApiModelProperty(value = "回调地址")
     private String callbackUrl;
 
-    @ApiModelProperty(value = "发送人id")
+    @ApiModelProperty(value = "发送人 id")
     private Long sendUserId;
 
     @ApiModelProperty(value = "发送人")
@@ -46,4 +90,3 @@ public class MessageDetailVO extends InsideMessageSendLogEntity {
     @ApiModelProperty(value = "应用 ID,对应 inside_message_record.app_id")
     private Long appId;
 }
-

+ 0 - 170
java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/MessageApiController.java

@@ -1,170 +0,0 @@
-package com.storlead.sales.controller.message;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.framework.common.result.Result;
-import com.storlead.message.enums.MessageTypeEnum;
-import com.storlead.message.pojo.dto.MessageDTO;
-import com.storlead.message.pojo.dto.MessageTestDTO;
-import com.storlead.message.pojo.entity.InsideMessageSendLogEntity;
-import com.storlead.message.pojo.vo.MessageDetailVO;
-import com.storlead.message.pojo.vo.MessageNoReadTotalVO;
-import com.storlead.message.pojo.vo.MessageTypeReadStateVO;
-import com.storlead.message.service.InsideMessageSendLogService;
-import com.storlead.sales.service.customer.MessageAssembleService;
-import io.swagger.annotations.*;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2024-04-19 16:36
- */
-@RestController
-@RequestMapping("/sys/inside/message")
-@Api(tags = "消息: 站内消息相关接口")
-public class MessageApiController {
-
-    @Resource
-    private InsideMessageSendLogService messageSendLogService;
-
-    @Resource
-    private MessageAssembleService assembleService;
-
-    @PostMapping(value = "/testMessage")
-    @ApiOperation(value = "测试客户消息" )
-    @ApiResponses({
-            @ApiResponse(code = 200, message = "", response = MessageDetailVO.class)
-    })
-    public Result<?> testMessage(MessageTestDTO dto) {
-        assembleService.sendCustomerEventMessages(dto.getDataId(),dto.getEventCode(),dto.getToUserIds());
-        return Result.ok();
-    }
-
-    @PostMapping(value = "/getMessageTypes")
-    @ApiOperation(value = "获取分类" )
-    @ApiResponses({
-            @ApiResponse(code = 200, message = "", response = MessageDetailVO.class)
-    })
-    public Result<?> getMessageTypes(MessageTestDTO dto) {
-        assembleService.sendCustomerEventMessages(dto.getDataId(),dto.getEventCode(),dto.getToUserIds());
-        return Result.ok();
-    }
-
-
-    @PostMapping(value = "/pageList")
-    @ApiOperation(value = "获取当前用户的站内消息" )
-    @ApiResponses({
-            @ApiResponse(code = 200, message = "", response = MessageDetailVO.class)
-    })
-    public Result<?> getMessage(MessageDTO dto) {
-        Page<InsideMessageSendLogEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper();
-        queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
-        if (Objects.nonNull(dto.getMessageType())) {
-            queryWrapper.eq("mr.message_type",dto.getMessageType());
-        }
-        if (Objects.nonNull(dto.getIsRead())) {
-            queryWrapper.eq("mlog.is_read",dto.getIsRead());
-            queryWrapper.eq("mlog.is_read",dto.getIsRead());
-        }
-        queryWrapper.eq("mlog.is_delete",Integer.valueOf(0));
-        queryWrapper.orderByAsc("mlog.is_read");
-        queryWrapper.orderByDesc("mlog.id");
-        IPage<MessageDetailVO> pageList =  messageSendLogService.queryListMessageLog(page,queryWrapper);
-        return Result.result(pageList);
-    }
-
-    @PostMapping(value = "/read")
-    @ApiOperation(value = "更新为已读" )
-    public Result<?> updateStatus(Long [] messageLogIds) {
-        if (Objects.isNull(messageLogIds) || messageLogIds.length == 0) {
-            return Result.error("参数错误");
-        }
-        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper();
-        updateWrapper.in(InsideMessageSendLogEntity::getId,messageLogIds);
-        updateWrapper.eq(InsideMessageSendLogEntity::getIsDelete,Integer.valueOf(0));
-        updateWrapper.set(InsideMessageSendLogEntity::getIsRead,1);
-        return Result.result(messageSendLogService.update(updateWrapper));
-    }
-
-    @PostMapping(value = "/readAll")
-    @ApiOperation(value = "更新为已读" )
-    public Result<?> readAll(@ApiParam(value = "") Integer messageType) {
-        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper();
-        updateWrapper.in(InsideMessageSendLogEntity::getReceiverUserId,LoginUserUtil.getCurrentUserId());
-        updateWrapper.in(InsideMessageSendLogEntity::getIsDelete,Integer.valueOf(0));
-        updateWrapper.in(InsideMessageSendLogEntity::getIsRead,Integer.valueOf(0));
-        if (Objects.nonNull(messageType)) {
-            updateWrapper.in(InsideMessageSendLogEntity::getMessageType,messageType);
-        }
-        updateWrapper.set(InsideMessageSendLogEntity::getIsRead,1);
-        return Result.result(messageSendLogService.update(updateWrapper));
-    }
-
-    @PostMapping(value = "/cleanAll")
-    @ApiOperation(value = "清除消息" )
-    public Result<?> cleanAll(MessageDTO dto) {
-        LambdaUpdateWrapper<InsideMessageSendLogEntity> updateWrapper = new LambdaUpdateWrapper();
-        updateWrapper.in(InsideMessageSendLogEntity::getReceiverUserId,LoginUserUtil.getCurrentUserId());
-        if (Objects.nonNull(dto.getMessageType())) {
-            updateWrapper.in(InsideMessageSendLogEntity::getMessageType,dto.getMessageType());
-        }
-        if (Objects.nonNull(dto.getIsRead())) {
-            updateWrapper.in(InsideMessageSendLogEntity::getIsRead,dto.getIsRead());
-        }
-        updateWrapper.eq(InsideMessageSendLogEntity::getIsDelete,Integer.valueOf(0));
-        updateWrapper.set(InsideMessageSendLogEntity::getIsDelete,1);
-        return Result.result(messageSendLogService.update(updateWrapper));
-    }
-
-    @PostMapping(value = "/getMessageCount")
-    @ApiOperation(value = "获取未读消息数" )
-    public Result<?> getMessageCount(MessageDTO dto) {
-        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper();
-        queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
-        queryWrapper.eq("mlog.is_read",0);
-        if (Objects.nonNull(dto.getMessageType())) {
-            queryWrapper.eq("mr.message_type",dto.getMessageType());
-        }
-        queryWrapper.eq("mlog.is_delete",Integer.valueOf(0));
-        MessageNoReadTotalVO countMap = messageSendLogService.countNoReadtotal(queryWrapper);
-        return Result.result(countMap);
-    }
-
-    @PostMapping(value = "/getNoReadCount")
-    @ApiOperation(value = "获取未读消息数" )
-    public Result<?> getNoReadCount(MessageDTO dto) {
-        QueryWrapper<InsideMessageSendLogEntity> queryWrapper = new QueryWrapper();
-        queryWrapper.eq("mlog.receiver_user_id", LoginUserUtil.getCurrentUserId());
-        queryWrapper.eq("mlog.is_read",0);
-        List<String> types = new ArrayList<>();
-        if (Objects.nonNull(dto.getMessageType())) {
-            queryWrapper.eq("mlog.message_type",dto.getMessageType());
-            types.add(dto.getMessageType());
-        }
-        queryWrapper.eq("mlog.is_delete",Integer.valueOf(0));
-        List<MessageTypeReadStateVO> statuVOS = messageSendLogService.getCountNoReadCount(queryWrapper);
-
-        List<MessageTypeReadStateVO> readStatels = MessageTypeEnum.getMessageTypeReadStatels(types);
-        Map<Integer, Integer> statuMap = statuVOS.stream()
-                .collect(Collectors.toMap(MessageTypeReadStateVO::getMessageType, MessageTypeReadStateVO::getStateNumber));
-        for (MessageTypeReadStateVO readState : readStatels) {
-            readState.setStateNumber(statuMap.getOrDefault(readState.getMessageType(),0));
-        }
-        return Result.result(readStatels);
-    }
-}

+ 0 - 185
java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/MessageTemplateApiController.java

@@ -1,185 +0,0 @@
-package com.storlead.sales.controller.message;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.common.result.Result;
-import com.storlead.framework.mybatis.entity.SysBaseField;
-import com.storlead.message.enums.MessageTypeEnum;
-import com.storlead.message.pojo.dto.MessageTemplateEventDTO;
-import com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity;
-import com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity;
-import com.storlead.message.pojo.vo.MessageArgTemplateVO;
-import com.storlead.message.pojo.vo.MessageTemplateVO;
-import com.storlead.message.service.MessageTemplateEventDetailService;
-import com.storlead.message.service.MessageTemplateEventGroupService;
-import com.storlead.sales.pojo.vo.customer.*;
-import com.storlead.sales.pojo.vo.report.BroadcastTotalMessageVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.BeanUtils;
-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 javax.annotation.Resource;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2024-04-26 15:15
- */
-@RestController
-@RequestMapping("/sys/message/template")
-@Api(tags = "消息: 消息模板机制配置")
-public class MessageTemplateApiController {
-
-    @Resource
-    private MessageTemplateEventGroupService templateEventGroupService;
-
-    @Resource
-    private MessageTemplateEventDetailService templateEventDetailService;
-
-    @ApiOperation("保存模板")
-    @PostMapping("save")
-    public Result save(@RequestBody MessageTemplateEventGroupEntity groupEntity) {
-
-//        groupEntity.dictFiled();
-        templateEventGroupService.saveOrUpdate(groupEntity);
-        return Result.ok();
-    }
-
-    @ApiOperation("分页查询")
-    @PostMapping("listPage")
-    public Result listPage(@RequestBody MessageTemplateEventDTO dto) {
-
-        Page<MessageTemplateEventGroupEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        LambdaQueryWrapper<MessageTemplateEventGroupEntity> queryWrapper = new LambdaQueryWrapper();
-        if (Objects.nonNull(dto.getTemplateServiceType())) {
-            queryWrapper.eq(MessageTemplateEventGroupEntity::getTemplateServiceType,dto.getTemplateServiceType());
-        }
-        if (StrUtil.isNotBlank(dto.getBlurry())) {
-            queryWrapper.like(MessageTemplateEventGroupEntity::getEventName,dto.getBlurry());
-        }
-        IPage<MessageTemplateVO>  pageList = templateEventGroupService.listPage(page, queryWrapper);
-        if (CollectionUtil.isNotEmpty(pageList.getRecords())) {
-            List<Long> dt = pageList.getRecords().stream().map(MessageTemplateVO::getId).collect(Collectors.toList());
-            LambdaQueryWrapper<MessageTemplateEventDetailEntity> wrapper = new LambdaQueryWrapper<>();
-            wrapper.in(MessageTemplateEventDetailEntity::getTemplateEventId,dt);
-            List<MessageTemplateEventDetailEntity>  detailEntities = templateEventDetailService.list(wrapper);
-            Map<Long, List<MessageTemplateEventDetailEntity>> groupMap = detailEntities.stream().collect(Collectors.groupingBy(MessageTemplateEventDetailEntity::getTemplateEventId));
-            pageList.getRecords().forEach(arg -> {
-                arg.setDetailEntities(groupMap.get(arg.getId()));
-            });
-            SysBaseField.dictFileds(pageList.getRecords());
-        }
-        return Result.result(pageList);
-    }
-
-    @ApiOperation("保存模板详情")
-    @PostMapping("saveTempleteContent")
-    public Result saveTempleteContent(@RequestBody MessageTemplateEventDetailEntity entity) {
-        templateEventDetailService.saveOrUpdate(entity);
-        return Result.ok();
-    }
-
-    @ApiOperation("获取消息模板详情")
-    @PostMapping("getGroupDetail")
-    public Result getGroupDetail(Long id,String templateDetailType) {
-        MessageTemplateEventGroupEntity templateEventGroup =  templateEventGroupService.getById(id);
-        if (Objects.isNull(templateEventGroup)) {
-            return Result.ok();
-        }
-        MessageTemplateVO templateVO = new MessageTemplateVO();
-        BeanUtils.copyProperties(templateEventGroup,templateVO);
-        LambdaQueryWrapper<MessageTemplateEventDetailEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(MessageTemplateEventDetailEntity::getTemplateEventId,templateEventGroup.getId());
-        if (Objects.nonNull(templateDetailType)) {
-            wrapper.eq(MessageTemplateEventDetailEntity::getTemplateDetailType,templateDetailType);
-        }
-        List<MessageTemplateEventDetailEntity>  detailEntities = templateEventDetailService.list(wrapper);
-        templateVO.setDetailEntities(detailEntities);
-        templateVO.dictFiled();
-
-        List<MessageArgTemplateVO> argTemplatels = new ArrayList<>();
-        Class clazz = null;
-        if (MessageTypeEnum.CUSTOMER.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = CustomerMessageVO.class;
-        } else if (MessageTypeEnum.CLUS.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = CustomerMessageVO.class;
-        } else if (MessageTypeEnum.ORDER_FORM.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = OrderMessageVO.class;
-        } else if (MessageTypeEnum.BUSINESS.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = BusinessMessageVO.class;
-        } else if (MessageTypeEnum.TASK_CANCELED.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = TaskMessageVO.class;
-        } else if (MessageTypeEnum.FOLLOW_UP.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = FollowMessageVO.class;
-        } else if (MessageTypeEnum.LIAISON.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = LiaisonMessageVO.class;
-        } else if (MessageTypeEnum.PERFORMANCE_GOAL.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = PerformanceGoalMessgeVO.class;
-        } else if (MessageTypeEnum.BULLETIN.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = BulletinMessageVO.class;
-        } else if (MessageTypeEnum.OTHER_EXTEND.getCode().equals(templateEventGroup.getTemplateServiceType().toString())) {
-            clazz = OtherExtendMessageVO.class;
-        } else if (MessageTypeEnum.BROADCAST.getCode().equals(templateEventGroup.getTemplateServiceType().toString())){
-            clazz = BroadcastTotalMessageVO.class;
-        }
-
-        if (clazz != null) {
-            for (Field field : clazz.getDeclaredFields()) {
-                MessageArgTemplateVO vo = new MessageArgTemplateVO();
-                vo.setPropertyKey("${" + field.getName() + "}$");
-                // 检查字段是否有 @Column 注解
-                if (field.isAnnotationPresent(ApiModelProperty.class)) {
-                    // 获取注解实例
-                    ApiModelProperty property = field.getAnnotation(ApiModelProperty.class);
-                    vo.setPropertyName(property.value());
-                    // 输出字段名和注解的值
-                }
-                argTemplatels.add(vo);
-            }
-        }
-        templateVO.setArgls(argTemplatels);
-        return Result.result(templateVO);
-    }
-    @ApiOperation("获取消息模板详情")
-    @PostMapping("getDetail")
-    public Result getDetail(Long id) {
-        MessageTemplateEventDetailEntity detailEntity =  templateEventDetailService.getById(id);
-        return Result.result(detailEntity);
-    }
-
-    @ApiOperation("禁用或启用模型")
-    @PostMapping("enabledDetail")
-    public Result enabledTemplateDetail(Long id,Boolean enable) {
-        LambdaUpdateWrapper<MessageTemplateEventDetailEntity> updateWrapper = new LambdaUpdateWrapper<>();
-        updateWrapper.set(MessageTemplateEventDetailEntity::getEnabled,enable);
-        updateWrapper.eq(MessageTemplateEventDetailEntity::getId,id);
-        templateEventDetailService.update(updateWrapper);
-        return Result.ok();
-    }
-
-    @ApiOperation("删除模板")
-    @PostMapping("delete")
-    public Result delete(Long id) {
-        if(Objects.isNull(id)) {
-            return Result.error("参数错误");
-        }
-        templateEventGroupService.lgDelete(id);
-        return Result.ok();
-    }
-}

+ 0 - 110
java/storlead-sasa/storlead-sales/src/main/java/com/storlead/sales/controller/message/UserMessageConfigApiController.java

@@ -1,110 +0,0 @@
-package com.storlead.sales.controller.message;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.framework.common.result.Result;
-import com.storlead.message.pojo.entity.UserMessageNoticeConfigEntity;
-import com.storlead.message.pojo.dto.MessageTemplateEventDTO;
-import com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity;
-import com.storlead.message.pojo.vo.MessageTemplateVO;
-import com.storlead.message.service.MessageTemplateEventGroupService;
-import com.storlead.message.service.UserMessageNoticeConfigService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.util.CollectionUtils;
-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 javax.annotation.Resource;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @program: sp-sales-platform
- * @description:
- * @author: chenkq
- * @create: 2025-04-25 11:26
- */
-@RestController
-@RequestMapping("/sys/message/config")
-@Api(tags = "消息: 用户消息设置")
-public class UserMessageConfigApiController {
-
-
-    @Resource
-    private UserMessageNoticeConfigService userMessageNoticeConfigService;
-
-    @Resource
-    private MessageTemplateEventGroupService templateEventGroupService;
-
-    @ApiOperation("保存用户配置详情")
-    @PostMapping("setMessageConfig")
-    public Result setMessageConfig(@RequestBody UserMessageNoticeConfigEntity entity) {
-
-        LambdaQueryWrapper<UserMessageNoticeConfigEntity> queryWrapper = new LambdaQueryWrapper();
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy,LoginUserUtil.getCurrentUserId());
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateEventId,entity.getTemplateEventId());
-        queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateDetailType,entity.getTemplateDetailType());
-        queryWrapper.last(" limit 1");
-        UserMessageNoticeConfigEntity o1 = userMessageNoticeConfigService.getOne(queryWrapper);
-        if (Objects.nonNull(o1)) {
-            entity.setId(o1.getId());
-        }
-        userMessageNoticeConfigService.saveOrUpdate(entity);
-        return Result.ok();
-    }
-
-    @ApiOperation("分页查询")
-    @PostMapping("listPage")
-    public Result listPage(@RequestBody MessageTemplateEventDTO dto) {
-        Page<MessageTemplateEventGroupEntity> page = new Page<>(dto.getPageIndex(),dto.getPageSize());
-        LambdaQueryWrapper<MessageTemplateEventGroupEntity> queryWrapper = new LambdaQueryWrapper();
-        if (Objects.nonNull(dto.getTemplateServiceType())) {
-            queryWrapper.eq(MessageTemplateEventGroupEntity::getTemplateServiceType,dto.getTemplateServiceType());
-        }
-        if (StrUtil.isNotBlank(dto.getBlurry())) {
-            queryWrapper.like(MessageTemplateEventGroupEntity::getEventName,dto.getBlurry());
-        }
-        IPage<MessageTemplateVO> pageList = templateEventGroupService.listPage(page, queryWrapper);
-        if (CollectionUtil.isNotEmpty(pageList.getRecords())) {
-            List<Long> dt = pageList.getRecords().stream().map(MessageTemplateVO::getId).collect(Collectors.toList());
-            LambdaQueryWrapper<UserMessageNoticeConfigEntity> wrapper = new LambdaQueryWrapper<>();
-            wrapper.in(UserMessageNoticeConfigEntity::getTemplateEventId,dt);
-            wrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy, LoginUserUtil.getCurrentUserId());
-            List<UserMessageNoticeConfigEntity>  detailEntities = userMessageNoticeConfigService.list(wrapper);
-            Map<Long, List<UserMessageNoticeConfigEntity>> groupMap = detailEntities.stream().collect(Collectors.groupingBy(UserMessageNoticeConfigEntity::getTemplateEventId));
-            pageList.getRecords().forEach(arg -> {
-                List<UserMessageNoticeConfigEntity> rs =  groupMap.get(arg.getId());
-                arg.setUserDetails(Objects.isNull(rs) ? Collections.emptyList() : rs);
-            });
-        }
-        return Result.result(pageList);
-    }
-
-    @ApiOperation("消息开启关闭")
-    @PostMapping("on_off_message_config")
-    public Result onOffMessageConfig(@RequestBody UserMessageNoticeConfigEntity entity) {
-
-        //    @ApiModelProperty(value = "site:站内,sms:短信,wecom:企业微信,mail:邮件")
-        List<String> templateDetailTypels = CollectionUtils.isEmpty(entity.getTemplateDetailTypels()) ? Arrays.asList("site","wecom","mail") : entity.getTemplateDetailTypels();
-        for (String templateDetailType : templateDetailTypels) {
-            LambdaQueryWrapper<UserMessageNoticeConfigEntity> queryWrapper = new LambdaQueryWrapper();
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getOwnerBy,LoginUserUtil.getCurrentUserId());
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateEventId,entity.getTemplateEventId());
-            queryWrapper.eq(UserMessageNoticeConfigEntity::getTemplateDetailType,templateDetailType);
-            queryWrapper.last(" limit 1");
-            UserMessageNoticeConfigEntity o1 = userMessageNoticeConfigService.getOne(queryWrapper);
-            if (Objects.nonNull(o1)) {
-                entity.setId(o1.getId());
-            }
-            userMessageNoticeConfigService.saveOrUpdate(entity);
-        }
-        return Result.ok();
-    }
-}

+ 7 - 6
pom.xml

@@ -19,16 +19,17 @@
     <modules>
         <module>java/storlead-dependencies</module>
         <module>java/storlead-framework</module>
-        <module>java/storlead-api</module>
-        <module>java/storlead-message</module>
-        <module>java/storlead-sms</module>
+        <module>java/storlead-user</module>
         <module>java/storlead-system</module>
+        <module>java/storlead-message</module>
         <module>java/storlead-es</module>
-        <module>java/storlead-sasa</module>
-        <module>java/storlead-user</module>
+        <module>java/storlead-sms</module>
+        <module>java/storlead-mail</module>
         <module>java/storlead-knowledge</module>
         <module>java/storlead-thirdparty</module>
-        <module>java/storlead-mail</module>
+        <module>java/storlead-sasa</module>
+        <!-- 启动模块放最后:依赖上面所有 domain 模块 -->
+        <module>java/storlead-api</module>
     </modules>
 
     <properties>