lifang 4 mēneši atpakaļ
vecāks
revīzija
1fd73b9891
38 mainītis faili ar 1638 papildinājumiem un 18 dzēšanām
  1. 15 0
      tr-modules/tr-module-mobile/pom.xml
  2. 20 2
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/ServerEventListenerImpl.java
  3. 0 2
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ImServerAutoConfiguration.java
  4. 1 3
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ImServerService.java
  5. 64 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ServerEventCallbackHandler.java
  6. 80 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImGroupUserController.java
  7. 80 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgGroupController.java
  8. 80 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgReceivedController.java
  9. 80 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgSendController.java
  10. 32 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImGroupUserDTO.java
  11. 19 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImGroupUserQueryDTO.java
  12. 47 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgGroupDTO.java
  13. 19 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgGroupQueryDTO.java
  14. 56 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgReceivedDTO.java
  15. 19 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgReceivedQueryDTO.java
  16. 53 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgSendDTO.java
  17. 19 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgSendQueryDTO.java
  18. 28 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImGroupUserMapper.java
  19. 28 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgGroupMapper.java
  20. 28 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgReceivedMapper.java
  21. 28 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgSendMapper.java
  22. 32 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImGroupUserPO.java
  23. 37 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgGroupPO.java
  24. 64 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgReceivedPO.java
  25. 60 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgSendPO.java
  26. 16 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImGroupUserRepository.java
  27. 17 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgGroupRepository.java
  28. 16 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgReceivedRepository.java
  29. 16 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgSendRepository.java
  30. 54 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImGroupUserService.java
  31. 54 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgGroupService.java
  32. 54 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgReceivedService.java
  33. 54 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgSendService.java
  34. 92 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImGroupUserServiceImpl.java
  35. 92 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgGroupServiceImpl.java
  36. 92 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgReceivedServiceImpl.java
  37. 92 0
      tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgSendServiceImpl.java
  38. 0 11
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java

+ 15 - 0
tr-modules/tr-module-mobile/pom.xml

@@ -32,6 +32,21 @@
             <artifactId>netty-all</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-module-system-api</artifactId>
+        </dependency>
+
         <!-- MobileIMSDK的核心库(此jar没有上传到mave中央库,请注意本地引用路径哦) -->
         <dependency>
             <groupId>com.x52im</groupId>

+ 20 - 2
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/ServerEventListenerImpl.java

@@ -1,6 +1,7 @@
 package cn.tr.module.mobile;
 
 import cn.hutool.json.JSONUtil;
+import cn.tr.module.mobile.config.ServerEventCallbackHandler;
 import cn.tr.module.mobile.dto.MsgDTO;
 import io.netty.channel.Channel;
 import lombok.extern.slf4j.Slf4j;
@@ -9,8 +10,6 @@ import net.x52im.mobileimsdk.server.processor.OnlineProcessor;
 import net.x52im.mobileimsdk.server.protocal.Protocal;
 import net.x52im.mobileimsdk.server.protocal.s.PKickoutInfo;
 
-import javax.xml.transform.sax.SAXTransformerFactory;
-
 /**
  * @author wangzl
  * @description: TODO
@@ -123,6 +122,13 @@ public class ServerEventListenerImpl implements ServerEventListener {
         String fingerPrint = p.getFp();
         // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
         int typeu = p.getTypeu();
+        try {
+            MsgDTO msg = JSONUtil.toBean(dataContent, MsgDTO.class);
+            ServerEventCallbackHandler.onTransferMessage4C2S.accept(msg);
+        }catch (Exception e){
+            log.error("【IM_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给服务端的消息:str=" + dataContent);
+        }
+
         log.debug("【DEBUG_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给服务端的消息:str=" + dataContent);
         return true;
     }
@@ -145,6 +151,12 @@ public class ServerEventListenerImpl implements ServerEventListener {
         String fingerPrint = p.getFp();
         // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
         int typeu = p.getTypeu();
+        try {
+            MsgDTO msg = JSONUtil.toBean(dataContent, MsgDTO.class);
+            ServerEventCallbackHandler.onTransferMessage4C2C.accept(msg);
+        }catch (Exception e){
+            log.error("【IM_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent);
+        }
         log.debug("【DEBUG_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent);
     }
     /**
@@ -169,6 +181,12 @@ public class ServerEventListenerImpl implements ServerEventListener {
         String fingerPrint = p.getFp();
         // 【重要】用户定义的消息或指令协议类型(开发者可据此类型来区分具体的消息或指令)
         int typeu = p.getTypeu();
+        try {
+            MsgDTO msg = JSONUtil.toBean(dataContent, MsgDTO.class);
+            ServerEventCallbackHandler.onTransferMessage_RealTimeSendFaild.accept(msg);
+        }catch (Exception e){
+            log.error("【IM_回调通知】[typeu=" + typeu + "]收到了客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent);
+        }
         log.debug("【DEBUG_回调通知】[typeu=" + typeu + "]客户端" + from_user_id + "发给客户端" + userId + "的消息:str=" + dataContent + ",因实时发送没有成功,需要上层应用作离线处理哦,否则此消息将被丢弃.");
         return false;
     }

+ 0 - 2
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ImServerAutoConfiguration.java

@@ -1,7 +1,5 @@
 package cn.tr.module.mobile.config;
 
-import cn.tr.module.mobile.ServerLauncherImpl;
-import cn.tr.module.mobile.server.ImServerService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.stereotype.Component;

+ 1 - 3
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/server/ImServerService.java → tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ImServerService.java

@@ -1,8 +1,6 @@
-package cn.tr.module.mobile.server;
+package cn.tr.module.mobile.config;
 
 import cn.tr.module.mobile.ServerLauncherImpl;
-import cn.tr.module.mobile.config.ImServerProperties;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import net.x52im.mobileimsdk.server.ServerLauncher;
 import net.x52im.mobileimsdk.server.network.GatewayTCP;

+ 64 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/config/ServerEventCallbackHandler.java

@@ -0,0 +1,64 @@
+package cn.tr.module.mobile.config;
+
+import cn.tr.module.mobile.dto.MsgDTO;
+import net.x52im.mobileimsdk.server.protocal.Protocal;
+
+import java.nio.channels.Channel;
+import java.util.function.Consumer;
+
+/**
+ * ServerEventCallbackHandler 回调处理器配置类
+ *
+ * 该类用于定义MobileIMSDK服务端事件回调的处理函数,通过函数式接口的方式
+ * 允许外部自定义各种事件的处理逻辑。
+ *
+ * 使用示例:
+ * ServerEventCallbackHandler.onTransferMessage_RealTimeSendFaild = p -> {
+ *     // 处理消息发送失败逻辑
+ *     return null;
+ * };
+ */
+public class ServerEventCallbackHandler {
+
+    /**
+     * 处理实时发送失败的消息回调函数
+     *
+     * 当服务端在进行消息发送时,对方在线但实时发送失败、以及其它各种问题导致消息并没能正常发出时,
+     * 将无条件调用此回调函数。
+     *
+     * 函数参数:
+     * - p: 消息/指令的完整协议包对象 {@link Protocal}
+     *
+     * 函数返回值:
+     * - true表示应用层已经处理了离线消息,否则表示应用层没有处理
+     */
+    public static Consumer<MsgDTO> onTransferMessage_RealTimeSendFaild = p -> {};
+
+    /**
+     * 处理客户端发送给服务端的消息回调函数
+     *
+     * 当收到客户端发送给"服务端"的数据时(即:消息路径为"C2S"的消息),会调用此回调函数。
+     *
+     * 函数参数:
+     * - p: 消息/指令的完整协议包对象 {@link Protocal}
+     * - session: 消息发送者的"会话"引用(也就是客户端的网络连接对象) {@link Channel}
+     *
+     * 函数返回值:
+     * - true表示本方法已成功处理完成,否则表示未处理成功
+     */
+    public static Consumer<MsgDTO> onTransferMessage4C2S = p->{};
+
+    /**
+     * 处理客户端发送给其他客户端的消息回调函数
+     *
+     * 当收到客户端发送给"其它客户端"的数据时(即:消息路径为"C2C"的消息),会调用此回调函数。
+     *
+     * 函数参数:
+     * - p: 消息/指令的完整协议包对象 {@link Protocal}
+     * - session: 消息发送者的"会话"引用(也就是客户端的网络连接对象) {@link Channel}
+     *
+     * 函数返回值:
+     * - Void类型,无实际返回值意义
+     */
+    public static Consumer<MsgDTO> onTransferMessage4C2C = p->{};
+}

+ 80 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImGroupUserController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.mobile.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.mobile.dto.ImGroupUserDTO;
+import cn.tr.module.mobile.service.IImGroupUserService;
+import cn.tr.module.mobile.dto.ImGroupUserQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 群成员表控制器
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ */
+@Api(tags = "群成员表")
+@RestController
+@RequestMapping("/mobile/groupUser")
+@AllArgsConstructor
+public class ImGroupUserController extends BaseController{
+
+    private final IImGroupUserService imGroupUserService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询群成员表",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<ImGroupUserDTO> selectList(@RequestBody ImGroupUserQueryDTO query) {
+        startPage();
+        return getDataTable(imGroupUserService.selectImGroupUserList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询群成员表",notes = "权限: mobile:groupUser:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("mobile:groupUser:query")
+    public CommonResult<ImGroupUserDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(imGroupUserService.selectImGroupUserById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加群成员表",notes = "权限: mobile:groupUser:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("mobile:groupUser:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) ImGroupUserDTO source) {
+        return CommonResult.success(imGroupUserService.insertImGroupUser(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑群成员表",notes = "权限: mobile:groupUser:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("mobile:groupUser:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) ImGroupUserDTO source) {
+        return CommonResult.success(imGroupUserService.updateImGroupUserById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除群成员表",notes = "权限: mobile:groupUser:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("mobile:groupUser:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(imGroupUserService.removeImGroupUserByIds(ids));
+    }
+}

+ 80 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgGroupController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.mobile.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.mobile.dto.ImMsgGroupDTO;
+import cn.tr.module.mobile.service.IImMsgGroupService;
+import cn.tr.module.mobile.dto.ImMsgGroupQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 群基本信息表控制器
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ */
+@Api(tags = "群基本信息表")
+@RestController
+@RequestMapping("/mobile/msgGroup")
+@AllArgsConstructor
+public class ImMsgGroupController extends BaseController{
+
+    private final IImMsgGroupService imMsgGroupService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询群基本信息表",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<ImMsgGroupDTO> selectList(@RequestBody ImMsgGroupQueryDTO query) {
+        startPage();
+        return getDataTable(imMsgGroupService.selectImMsgGroupList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询群基本信息表",notes = "权限: mobile:msgGroup:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("mobile:msgGroup:query")
+    public CommonResult<ImMsgGroupDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(imMsgGroupService.selectImMsgGroupById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加群基本信息表",notes = "权限: mobile:msgGroup:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("mobile:msgGroup:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) ImMsgGroupDTO source) {
+        return CommonResult.success(imMsgGroupService.insertImMsgGroup(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑群基本信息表",notes = "权限: mobile:msgGroup:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("mobile:msgGroup:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) ImMsgGroupDTO source) {
+        return CommonResult.success(imMsgGroupService.updateImMsgGroupById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除群基本信息表",notes = "权限: mobile:msgGroup:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("mobile:msgGroup:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(imMsgGroupService.removeImMsgGroupByIds(ids));
+    }
+}

+ 80 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgReceivedController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.mobile.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.mobile.dto.ImMsgReceivedDTO;
+import cn.tr.module.mobile.service.IImMsgReceivedService;
+import cn.tr.module.mobile.dto.ImMsgReceivedQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。控制器
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ */
+@Api(tags = "发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。")
+@RestController
+@RequestMapping("/mobile/msgReceived")
+@AllArgsConstructor
+public class ImMsgReceivedController extends BaseController{
+
+    private final IImMsgReceivedService imMsgReceivedService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<ImMsgReceivedDTO> selectList(@RequestBody ImMsgReceivedQueryDTO query) {
+        startPage();
+        return getDataTable(imMsgReceivedService.selectImMsgReceivedList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。",notes = "权限: mobile:msgReceived:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("mobile:msgReceived:query")
+    public CommonResult<ImMsgReceivedDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(imMsgReceivedService.selectImMsgReceivedById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。",notes = "权限: mobile:msgReceived:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("mobile:msgReceived:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) ImMsgReceivedDTO source) {
+        return CommonResult.success(imMsgReceivedService.insertImMsgReceived(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。",notes = "权限: mobile:msgReceived:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("mobile:msgReceived:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) ImMsgReceivedDTO source) {
+        return CommonResult.success(imMsgReceivedService.updateImMsgReceivedById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。",notes = "权限: mobile:msgReceived:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("mobile:msgReceived:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(imMsgReceivedService.removeImMsgReceivedByIds(ids));
+    }
+}

+ 80 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/controller/ImMsgSendController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.mobile.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.mobile.dto.ImMsgSendDTO;
+import cn.tr.module.mobile.service.IImMsgSendService;
+import cn.tr.module.mobile.dto.ImMsgSendQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.module.api.sys.log.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。控制器
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ */
+@Api(tags = "推送消息表,保存某个用户收到了哪些消息。")
+@RestController
+@RequestMapping("/mobile/msgSend")
+@AllArgsConstructor
+public class ImMsgSendController extends BaseController{
+
+    private final IImMsgSendService imMsgSendService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询推送消息表,保存某个用户收到了哪些消息。",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<ImMsgSendDTO> selectList(@RequestBody ImMsgSendQueryDTO query) {
+        startPage();
+        return getDataTable(imMsgSendService.selectImMsgSendList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询推送消息表,保存某个用户收到了哪些消息。",notes = "权限: mobile:msgSend:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("mobile:msgSend:query")
+    public CommonResult<ImMsgSendDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(imMsgSendService.selectImMsgSendById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加推送消息表,保存某个用户收到了哪些消息。",notes = "权限: mobile:msgSend:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("mobile:msgSend:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) ImMsgSendDTO source) {
+        return CommonResult.success(imMsgSendService.insertImMsgSend(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑推送消息表,保存某个用户收到了哪些消息。",notes = "权限: mobile:msgSend:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("mobile:msgSend:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) ImMsgSendDTO source) {
+        return CommonResult.success(imMsgSendService.updateImMsgSendById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除推送消息表,保存某个用户收到了哪些消息。",notes = "权限: mobile:msgSend:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("mobile:msgSend:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(imMsgSendService.removeImMsgSendByIds(ids));
+    }
+}

+ 32 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImGroupUserDTO.java

@@ -0,0 +1,32 @@
+package cn.tr.module.mobile.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 群成员表传输对象
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+@Data
+@ApiModel("群成员表传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImGroupUserDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "群id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String groupId;
+
+    @ApiModelProperty(value = "发送者", position = 2)
+    private String userId;
+
+}

+ 19 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImGroupUserQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.mobile.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 群成员表查询参数
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+@Data
+@ApiModel("群成员表查询参数")
+@ToString
+public class ImGroupUserQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 47 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgGroupDTO.java

@@ -0,0 +1,47 @@
+package cn.tr.module.mobile.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 群基本信息表传输对象
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+@Data
+@ApiModel("群基本信息表传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgGroupDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "群id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String groupId;
+
+    @ApiModelProperty(value = "群名称", position = 2)
+    private String groupName;
+
+    @ApiModelProperty(value = "创建人", position = 3)
+    private String createUser;
+
+    @ApiModelProperty(value = "群主", position = 5)
+    private String owner;
+
+    @ApiModelProperty(value = "群公告", position = 6)
+    private String announcement;
+
+    @ApiModelProperty(value = "最后发信息的用户类型", position = 7)
+    private String lastMsgSenderType;
+
+    @ApiModelProperty(value = "最后发信息的时间", position = 8)
+    private Date lastMsgSendTime;
+
+}

+ 19 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgGroupQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.mobile.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 群基本信息表查询参数
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+@Data
+@ApiModel("群基本信息表查询参数")
+@ToString
+public class ImMsgGroupQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 56 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgReceivedDTO.java

@@ -0,0 +1,56 @@
+package cn.tr.module.mobile.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。传输对象
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+@Data
+@ApiModel("发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgReceivedDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "消息id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String msgId;
+
+    @ApiModelProperty(value = "消息发送者", position = 2)
+    private String msgFrom;
+
+    @ApiModelProperty(value = "消息接受者", position = 3)
+    private String msgTo;
+
+    @ApiModelProperty(value = "临床id", position = 4)
+    private String groupId;
+
+    @ApiModelProperty(value = "TCP包头命令号", position = 5)
+    private String cmdId;
+
+    @ApiModelProperty(value = "TCP包头seq", position = 6)
+    private String msgSeq;
+
+    @ApiModelProperty(value = "消息内容", position = 7)
+    private String msgContent;
+
+    @ApiModelProperty(value = "服务端收到消息的时间", position = 8)
+    private Date sendTime;
+
+    @ApiModelProperty(value = "消息类型", position = 9)
+    private String msgType;
+
+    @ApiModelProperty(value = "0、未送达 1、送达", position = 10)
+    private Integer delivered;
+
+}

+ 19 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgReceivedQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.mobile.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。查询参数
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+@Data
+@ApiModel("发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。查询参数")
+@ToString
+public class ImMsgReceivedQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 53 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgSendDTO.java

@@ -0,0 +1,53 @@
+package cn.tr.module.mobile.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.*;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。传输对象
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+@Data
+@ApiModel("推送消息表,保存某个用户收到了哪些消息。传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgSendDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "消息id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String msgId;
+
+    @ApiModelProperty(value = "消息发送者", position = 2)
+    private String msgFrom;
+
+    @ApiModelProperty(value = "消息接受者", position = 3)
+    private String msgTo;
+
+    @ApiModelProperty(value = "临床id", position = 4)
+    private String groupId;
+
+    @ApiModelProperty(value = "TCP包头命令号", position = 5)
+    private String cmdId;
+
+    @ApiModelProperty(value = "TCP包头seq", position = 6)
+    private String msgSeq;
+
+    @ApiModelProperty(value = "消息内容", position = 7)
+    private String msgContent;
+
+    @ApiModelProperty(value = "服务端收到消息的时间", position = 8)
+    private Date sendTime;
+
+    @ApiModelProperty(value = "消息类型", position = 9)
+    private String msgType;
+
+}

+ 19 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/dto/ImMsgSendQueryDTO.java

@@ -0,0 +1,19 @@
+package cn.tr.module.mobile.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.*;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。查询参数
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+@Data
+@ApiModel("推送消息表,保存某个用户收到了哪些消息。查询参数")
+@ToString
+public class ImMsgSendQueryDTO  {
+    private static final long serialVersionUID = 1L;
+}

+ 28 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImGroupUserMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.mobile.mapper;
+
+import cn.tr.module.mobile.po.ImGroupUserPO;
+import cn.tr.module.mobile.dto.ImGroupUserDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 群成员表映射工具
+*
+* @author lf
+* @date  2025/08/20 10:17
+**/
+@Mapper
+public interface ImGroupUserMapper {
+    ImGroupUserMapper INSTANCE = Mappers.getMapper(ImGroupUserMapper.class);
+
+    ImGroupUserPO convertPO(ImGroupUserDTO source);
+
+    ImGroupUserDTO convertDto(ImGroupUserPO source);
+
+    List<ImGroupUserDTO> convertDtoList(List<ImGroupUserPO> source);
+
+    List<ImGroupUserPO> convertPOList(List<ImGroupUserDTO> source);
+
+}

+ 28 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgGroupMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.mobile.mapper;
+
+import cn.tr.module.mobile.po.ImMsgGroupPO;
+import cn.tr.module.mobile.dto.ImMsgGroupDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 群基本信息表映射工具
+*
+* @author lf
+* @date  2025/08/20 10:12
+**/
+@Mapper
+public interface ImMsgGroupMapper {
+    ImMsgGroupMapper INSTANCE = Mappers.getMapper(ImMsgGroupMapper.class);
+
+    ImMsgGroupPO convertPO(ImMsgGroupDTO source);
+
+    ImMsgGroupDTO convertDto(ImMsgGroupPO source);
+
+    List<ImMsgGroupDTO> convertDtoList(List<ImMsgGroupPO> source);
+
+    List<ImMsgGroupPO> convertPOList(List<ImMsgGroupDTO> source);
+
+}

+ 28 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgReceivedMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.mobile.mapper;
+
+import cn.tr.module.mobile.po.ImMsgReceivedPO;
+import cn.tr.module.mobile.dto.ImMsgReceivedDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。映射工具
+*
+* @author lf
+* @date  2025/08/20 10:14
+**/
+@Mapper
+public interface ImMsgReceivedMapper {
+    ImMsgReceivedMapper INSTANCE = Mappers.getMapper(ImMsgReceivedMapper.class);
+
+    ImMsgReceivedPO convertPO(ImMsgReceivedDTO source);
+
+    ImMsgReceivedDTO convertDto(ImMsgReceivedPO source);
+
+    List<ImMsgReceivedDTO> convertDtoList(List<ImMsgReceivedPO> source);
+
+    List<ImMsgReceivedPO> convertPOList(List<ImMsgReceivedDTO> source);
+
+}

+ 28 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/mapper/ImMsgSendMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.mobile.mapper;
+
+import cn.tr.module.mobile.po.ImMsgSendPO;
+import cn.tr.module.mobile.dto.ImMsgSendDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 推送消息表,保存某个用户收到了哪些消息。映射工具
+*
+* @author lf
+* @date  2025/08/20 10:15
+**/
+@Mapper
+public interface ImMsgSendMapper {
+    ImMsgSendMapper INSTANCE = Mappers.getMapper(ImMsgSendMapper.class);
+
+    ImMsgSendPO convertPO(ImMsgSendDTO source);
+
+    ImMsgSendDTO convertDto(ImMsgSendPO source);
+
+    List<ImMsgSendDTO> convertDtoList(List<ImMsgSendPO> source);
+
+    List<ImMsgSendPO> convertPOList(List<ImMsgSendDTO> source);
+
+}

+ 32 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImGroupUserPO.java

@@ -0,0 +1,32 @@
+package cn.tr.module.mobile.po;
+
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 群成员表实体
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+@Data
+@TableName(value="im_group_user",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImGroupUserPO extends BasePO {
+
+    /** 群id */
+    @TableId
+    @ApiModelProperty(value = "群id", position = 1)
+    private String groupId;
+
+    /** 发送者 */
+    @ApiModelProperty(value = "发送者", position = 2)
+    private String userId;
+}

+ 37 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgGroupPO.java

@@ -0,0 +1,37 @@
+package cn.tr.module.mobile.po;
+
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 群基本信息表实体
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+@Data
+@TableName(value="im_msg_group",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgGroupPO extends BasePO {
+
+    /** 群id */
+    @TableId
+    @ApiModelProperty(value = "群id", position = 1)
+    private String groupId;
+
+    /** 群名称 */
+    @ApiModelProperty(value = "群名称", position = 2)
+    private String groupName;
+
+    /** 创建人 */
+    @ApiModelProperty(value = "创建人", position = 3)
+    private String createUser;
+
+}

+ 64 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgReceivedPO.java

@@ -0,0 +1,64 @@
+package cn.tr.module.mobile.po;
+
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。实体
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+@Data
+@TableName(value="im_msg_received",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgReceivedPO extends BasePO {
+
+    /** 消息id */
+    @TableId
+    @ApiModelProperty(value = "消息id", position = 1)
+    private String msgId;
+
+    /** 消息发送者 */
+    @ApiModelProperty(value = "消息发送者", position = 2)
+    private String msgFrom;
+
+    /** 消息接受者 */
+    @ApiModelProperty(value = "消息接受者", position = 3)
+    private String msgTo;
+
+    /** 临床id */
+    @ApiModelProperty(value = "临床id", position = 4)
+    private String groupId;
+
+    /** TCP包头命令号 */
+    @ApiModelProperty(value = "TCP包头命令号", position = 5)
+    private String cmdId;
+
+    /** TCP包头seq */
+    @ApiModelProperty(value = "TCP包头seq", position = 6)
+    private String msgSeq;
+
+    /** 消息内容 */
+    @ApiModelProperty(value = "消息内容", position = 7)
+    private String msgContent;
+
+    /** 服务端收到消息的时间 */
+    @ApiModelProperty(value = "服务端收到消息的时间", position = 8)
+    private Date sendTime;
+
+    /** 消息类型 */
+    @ApiModelProperty(value = "消息类型", position = 9)
+    private String msgType;
+
+    /** 0、未送达 1、送达 */
+    @ApiModelProperty(value = "0、未送达 1、送达", position = 10)
+    private Integer delivered;
+}

+ 60 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/po/ImMsgSendPO.java

@@ -0,0 +1,60 @@
+package cn.tr.module.mobile.po;
+
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。实体
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+@Data
+@TableName(value="im_msg_send",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ImMsgSendPO extends BasePO {
+
+    /** 消息id */
+    @TableId
+    @ApiModelProperty(value = "消息id", position = 1)
+    private String msgId;
+
+    /** 消息发送者 */
+    @ApiModelProperty(value = "消息发送者", position = 2)
+    private String msgFrom;
+
+    /** 消息接受者 */
+    @ApiModelProperty(value = "消息接受者", position = 3)
+    private String msgTo;
+
+    /** 临床id */
+    @ApiModelProperty(value = "临床id", position = 4)
+    private String groupId;
+
+    /** TCP包头命令号 */
+    @ApiModelProperty(value = "TCP包头命令号", position = 5)
+    private String cmdId;
+
+    /** TCP包头seq */
+    @ApiModelProperty(value = "TCP包头seq", position = 6)
+    private String msgSeq;
+
+    /** 消息内容 */
+    @ApiModelProperty(value = "消息内容", position = 7)
+    private String msgContent;
+
+    /** 服务端收到消息的时间 */
+    @ApiModelProperty(value = "服务端收到消息的时间", position = 8)
+    private Date sendTime;
+
+    /** 消息类型 */
+    @ApiModelProperty(value = "消息类型", position = 9)
+    private String msgType;
+}

+ 16 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImGroupUserRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.mobile.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.mobile.po.ImGroupUserPO;
+/**
+ * 群成员表Mapper接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+@Repository
+@Mapper
+public interface ImGroupUserRepository extends BaseMapper<ImGroupUserPO> {
+}

+ 17 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgGroupRepository.java

@@ -0,0 +1,17 @@
+package cn.tr.module.mobile.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.mobile.po.ImMsgGroupPO;
+/**
+ * 群基本信息表Mapper接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+@Repository
+@Mapper
+public interface ImMsgGroupRepository extends BaseMapper<ImMsgGroupPO> {
+}

+ 16 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgReceivedRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.mobile.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.mobile.po.ImMsgReceivedPO;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。Mapper接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+@Repository
+@Mapper
+public interface ImMsgReceivedRepository extends BaseMapper<ImMsgReceivedPO> {
+}

+ 16 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/repository/ImMsgSendRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.mobile.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.mobile.po.ImMsgSendPO;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。Mapper接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+@Repository
+@Mapper
+public interface ImMsgSendRepository extends BaseMapper<ImMsgSendPO> {
+}

+ 54 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImGroupUserService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.mobile.service;
+
+import cn.tr.module.mobile.dto.ImGroupUserDTO;
+import cn.tr.module.mobile.dto.ImGroupUserQueryDTO;
+import java.util.*;
+
+/**
+ * 群成员表Service接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+public interface IImGroupUserService{
+
+    /**
+     * 根据条件查询群成员表
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/08/20 10:17
+     */
+    List<ImGroupUserDTO> selectImGroupUserList(ImGroupUserQueryDTO query);
+
+    /**
+     * 根据id查询群成员表
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/08/20 10:17
+     */
+    ImGroupUserDTO selectImGroupUserById(String id);
+
+    /**
+     * 编辑群成员表
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/08/20 10:17
+     */
+    boolean updateImGroupUserById(ImGroupUserDTO source);
+
+    /**
+     * 新增群成员表
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/08/20 10:17
+     */
+    boolean insertImGroupUser(ImGroupUserDTO source);
+
+    /**
+     * 删除群成员表详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/08/20 10:17
+     */
+    int removeImGroupUserByIds(Collection<String> ids);
+}

+ 54 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgGroupService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.mobile.service;
+
+import cn.tr.module.mobile.dto.ImMsgGroupDTO;
+import cn.tr.module.mobile.dto.ImMsgGroupQueryDTO;
+import java.util.*;
+
+/**
+ * 群基本信息表Service接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+public interface IImMsgGroupService{
+
+    /**
+     * 根据条件查询群基本信息表
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/08/20 10:12
+     */
+    List<ImMsgGroupDTO> selectImMsgGroupList(ImMsgGroupQueryDTO query);
+
+    /**
+     * 根据id查询群基本信息表
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/08/20 10:12
+     */
+    ImMsgGroupDTO selectImMsgGroupById(String id);
+
+    /**
+     * 编辑群基本信息表
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/08/20 10:12
+     */
+    boolean updateImMsgGroupById(ImMsgGroupDTO source);
+
+    /**
+     * 新增群基本信息表
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/08/20 10:12
+     */
+    boolean insertImMsgGroup(ImMsgGroupDTO source);
+
+    /**
+     * 删除群基本信息表详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/08/20 10:12
+     */
+    int removeImMsgGroupByIds(Collection<String> ids);
+}

+ 54 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgReceivedService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.mobile.service;
+
+import cn.tr.module.mobile.dto.ImMsgReceivedDTO;
+import cn.tr.module.mobile.dto.ImMsgReceivedQueryDTO;
+import java.util.*;
+
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。Service接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+public interface IImMsgReceivedService{
+
+    /**
+     * 根据条件查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/08/20 10:14
+     */
+    List<ImMsgReceivedDTO> selectImMsgReceivedList(ImMsgReceivedQueryDTO query);
+
+    /**
+     * 根据id查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/08/20 10:14
+     */
+    ImMsgReceivedDTO selectImMsgReceivedById(String id);
+
+    /**
+     * 编辑发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/08/20 10:14
+     */
+    boolean updateImMsgReceivedById(ImMsgReceivedDTO source);
+
+    /**
+     * 新增发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/08/20 10:14
+     */
+    boolean insertImMsgReceived(ImMsgReceivedDTO source);
+
+    /**
+     * 删除发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/08/20 10:14
+     */
+    int removeImMsgReceivedByIds(Collection<String> ids);
+}

+ 54 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/IImMsgSendService.java

@@ -0,0 +1,54 @@
+package cn.tr.module.mobile.service;
+
+import cn.tr.module.mobile.dto.ImMsgSendDTO;
+import cn.tr.module.mobile.dto.ImMsgSendQueryDTO;
+import java.util.*;
+
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。Service接口
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+public interface IImMsgSendService{
+
+    /**
+     * 根据条件查询推送消息表,保存某个用户收到了哪些消息。
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2025/08/20 10:15
+     */
+    List<ImMsgSendDTO> selectImMsgSendList(ImMsgSendQueryDTO query);
+
+    /**
+     * 根据id查询推送消息表,保存某个用户收到了哪些消息。
+     * @param    id 主键id
+     * @author   lf
+     * @date      2025/08/20 10:15
+     */
+    ImMsgSendDTO selectImMsgSendById(String id);
+
+    /**
+     * 编辑推送消息表,保存某个用户收到了哪些消息。
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2025/08/20 10:15
+     */
+    boolean updateImMsgSendById(ImMsgSendDTO source);
+
+    /**
+     * 新增推送消息表,保存某个用户收到了哪些消息。
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2025/08/20 10:15
+     */
+    boolean insertImMsgSend(ImMsgSendDTO source);
+
+    /**
+     * 删除推送消息表,保存某个用户收到了哪些消息。详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2025/08/20 10:15
+     */
+    int removeImMsgSendByIds(Collection<String> ids);
+}

+ 92 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImGroupUserServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.mobile.service.impl;
+
+import cn.tr.core.exception.TRExcCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.mobile.repository.ImGroupUserRepository;
+import cn.tr.module.mobile.po.ImGroupUserPO;
+import cn.tr.module.mobile.dto.ImGroupUserDTO;
+import cn.tr.module.mobile.dto.ImGroupUserQueryDTO;
+import java.util.*;
+import cn.tr.module.mobile.service.IImGroupUserService;
+import cn.tr.module.mobile.mapper.ImGroupUserMapper;
+/**
+ * 群成员表Service接口实现类
+ *
+ * @author lf
+ * @date  2025/08/20 10:17
+ **/
+@Service
+public class ImGroupUserServiceImpl implements IImGroupUserService {
+    @Autowired
+    private ImGroupUserRepository baseRepository;
+
+
+    /**
+    * 根据条件查询群成员表
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/08/20 10:17
+    */
+    @Override
+    public List<ImGroupUserDTO> selectImGroupUserList(ImGroupUserQueryDTO query){
+        return ImGroupUserMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<ImGroupUserPO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询群成员表
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/08/20 10:17
+    */
+    @Override
+    public ImGroupUserDTO selectImGroupUserById(String id){
+        return ImGroupUserMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑群成员表
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/08/20 10:17
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateImGroupUserById(ImGroupUserDTO source){
+            return baseRepository.updateById(ImGroupUserMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增群成员表
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/08/20 10:17
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertImGroupUser(ImGroupUserDTO source){
+        return baseRepository.insert(ImGroupUserMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除群成员表详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/08/20 10:17
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeImGroupUserByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 92 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgGroupServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.mobile.service.impl;
+
+import cn.tr.core.exception.TRExcCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.mobile.repository.ImMsgGroupRepository;
+import cn.tr.module.mobile.po.ImMsgGroupPO;
+import cn.tr.module.mobile.dto.ImMsgGroupDTO;
+import cn.tr.module.mobile.dto.ImMsgGroupQueryDTO;
+import java.util.*;
+import cn.tr.module.mobile.service.IImMsgGroupService;
+import cn.tr.module.mobile.mapper.ImMsgGroupMapper;
+/**
+ * 群基本信息表Service接口实现类
+ *
+ * @author lf
+ * @date  2025/08/20 10:12
+ **/
+@Service
+public class ImMsgGroupServiceImpl implements IImMsgGroupService {
+    @Autowired
+    private ImMsgGroupRepository baseRepository;
+
+
+    /**
+    * 根据条件查询群基本信息表
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/08/20 10:12
+    */
+    @Override
+    public List<ImMsgGroupDTO> selectImMsgGroupList(ImMsgGroupQueryDTO query){
+        return ImMsgGroupMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<ImMsgGroupPO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询群基本信息表
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/08/20 10:12
+    */
+    @Override
+    public ImMsgGroupDTO selectImMsgGroupById(String id){
+        return ImMsgGroupMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑群基本信息表
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/08/20 10:12
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateImMsgGroupById(ImMsgGroupDTO source){
+            return baseRepository.updateById(ImMsgGroupMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增群基本信息表
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/08/20 10:12
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertImMsgGroup(ImMsgGroupDTO source){
+        return baseRepository.insert(ImMsgGroupMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除群基本信息表详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/08/20 10:12
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeImMsgGroupByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 92 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgReceivedServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.mobile.service.impl;
+
+import cn.tr.core.exception.TRExcCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.mobile.repository.ImMsgReceivedRepository;
+import cn.tr.module.mobile.po.ImMsgReceivedPO;
+import cn.tr.module.mobile.dto.ImMsgReceivedDTO;
+import cn.tr.module.mobile.dto.ImMsgReceivedQueryDTO;
+import java.util.*;
+import cn.tr.module.mobile.service.IImMsgReceivedService;
+import cn.tr.module.mobile.mapper.ImMsgReceivedMapper;
+/**
+ * 发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。Service接口实现类
+ *
+ * @author lf
+ * @date  2025/08/20 10:14
+ **/
+@Service
+public class ImMsgReceivedServiceImpl implements IImMsgReceivedService {
+    @Autowired
+    private ImMsgReceivedRepository baseRepository;
+
+
+    /**
+    * 根据条件查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/08/20 10:14
+    */
+    @Override
+    public List<ImMsgReceivedDTO> selectImMsgReceivedList(ImMsgReceivedQueryDTO query){
+        return ImMsgReceivedMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<ImMsgReceivedPO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/08/20 10:14
+    */
+    @Override
+    public ImMsgReceivedDTO selectImMsgReceivedById(String id){
+        return ImMsgReceivedMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/08/20 10:14
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateImMsgReceivedById(ImMsgReceivedDTO source){
+            return baseRepository.updateById(ImMsgReceivedMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/08/20 10:14
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertImMsgReceived(ImMsgReceivedDTO source){
+        return baseRepository.insert(ImMsgReceivedMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除发送消息表,保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/08/20 10:14
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeImMsgReceivedByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 92 - 0
tr-modules/tr-module-mobile/src/main/java/cn/tr/module/mobile/service/impl/ImMsgSendServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.tr.module.mobile.service.impl;
+
+import cn.tr.core.exception.TRExcCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.hutool.core.collection.CollectionUtil;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.core.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.mobile.repository.ImMsgSendRepository;
+import cn.tr.module.mobile.po.ImMsgSendPO;
+import cn.tr.module.mobile.dto.ImMsgSendDTO;
+import cn.tr.module.mobile.dto.ImMsgSendQueryDTO;
+import java.util.*;
+import cn.tr.module.mobile.service.IImMsgSendService;
+import cn.tr.module.mobile.mapper.ImMsgSendMapper;
+/**
+ * 推送消息表,保存某个用户收到了哪些消息。Service接口实现类
+ *
+ * @author lf
+ * @date  2025/08/20 10:15
+ **/
+@Service
+public class ImMsgSendServiceImpl implements IImMsgSendService {
+    @Autowired
+    private ImMsgSendRepository baseRepository;
+
+
+    /**
+    * 根据条件查询推送消息表,保存某个用户收到了哪些消息。
+    * @param    query 查询参数
+    * @author   lf
+    * @date      2025/08/20 10:15
+    */
+    @Override
+    public List<ImMsgSendDTO> selectImMsgSendList(ImMsgSendQueryDTO query){
+        return ImMsgSendMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<ImMsgSendPO>()
+                )
+        );
+    };
+
+    /**
+    * 根据id查询推送消息表,保存某个用户收到了哪些消息。
+    * @param    id 主键id
+    * @author   lf
+    * @date      2025/08/20 10:15
+    */
+    @Override
+    public ImMsgSendDTO selectImMsgSendById(String id){
+        return ImMsgSendMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    };
+
+    /**
+    * 编辑推送消息表,保存某个用户收到了哪些消息。
+    * @param   source 编辑实体类
+    * @author  lf
+    * @date     2025/08/20 10:15
+    */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateImMsgSendById(ImMsgSendDTO source){
+            return baseRepository.updateById(ImMsgSendMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 新增推送消息表,保存某个用户收到了哪些消息。
+    * @param   source 新增实体类
+    * @author lf
+    * @date  2025/08/20 10:15
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertImMsgSend(ImMsgSendDTO source){
+        return baseRepository.insert(ImMsgSendMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+    * 删除推送消息表,保存某个用户收到了哪些消息。详情
+    * @param  ids 删除主键集合
+    * @author lf
+    * @date    2025/08/20 10:15
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeImMsgSendByIds(Collection<String> ids){
+        if(CollectionUtil.isEmpty(ids)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 0 - 11
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java

@@ -146,23 +146,12 @@ public class SysTenantServiceImpl implements ISysTenantService {
     }
 
     private void validateSource(SysTenantAddDTO source) {
-        SysTenantPO sysTenantPO = tenantRepository.selectOne(new LambdaQueryWrapper<SysTenantPO>()
-                .eq(SysTenantPO::getName, source.getName())
-                .or()
-                .eq(SysTenantPO::getCode, source.getCode()));
-        if (ObjectUtil.isNotNull(sysTenantPO)) {
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "租户名称不能重复");
-        }
-    }
-
-    private void validateSource(SysTenantCommonDTO source) {
         SysTenantPO sysTenantPO = tenantRepository.selectOne(new LambdaQueryWrapper<SysTenantPO>()
                 .ne(StrUtil.isNotEmpty(source.getId()), SysTenantPO::getId, source.getId())
                 .nested(i->
                         i.eq(SysTenantPO::getName, source.getName())
                                 .or()
                                 .eq(SysTenantPO::getCode, source.getCode())
-
                 )
         );
         if (ObjectUtil.isNotNull(sysTenantPO)) {