From 0ab014198a8b4e40fa26da394373a4bcdb571148 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: 星期六, 06 七月 2024 17:23:15 +0800
Subject: [PATCH] 增加:群聊业务

---
 ard-work/src/main/java/com/ruoyi/call/compare/ArdCallSessionUserComparator.java          |   18 
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroup.java                           |   83 +
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallHistoryService.java                |   61 +
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java       |  101 +
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroupUser.java                       |   80 +
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java        |  152 ++
 ard-work/src/main/resources/mapper/call/ArdCallGroupUserMapper.xml                       |  108 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionMapper.java                   |   62 +
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSessionUser.java                     |  107 +
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionController.java           |   93 +
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallUnreadMessagesService.java         |   70 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupMapper.java                     |   61 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java               |   68 +
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupUserController.java         |  124 ++
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallHistoryController.java           |   88 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupUserMapper.java                 |   84 +
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionService.java                |   72 +
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java      |  167 ++
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionServiceImpl.java        |  174 +++
 ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java         |   19 
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallHistory.java                         |  104 +
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupUserService.java              |   97 +
 ard-work/src/main/resources/mapper/call/ArdCallSessionMapper.xml                         |   81 +
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallUnreadMessagesServiceImpl.java |  108 +
 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java                   |   32 
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupService.java                  |   61 +
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupController.java             |   93 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallHistoryMapper.java                   |   72 +
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSession.java                         |   86 +
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupServiceImpl.java          |  122 ++
 ard-work/src/main/resources/mapper/call/ArdCallHistoryMapper.xml                         |  114 ++
 ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml                     |   94 +
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallUnreadMessagesMapper.java            |   68 +
 ard-work/src/main/resources/mapper/call/ArdCallUnreadMessagesMapper.xml                  |   74 +
 ard-work/src/main/resources/mapper/call/ArdCallGroupMapper.xml                           |   82 +
 ard-work/src/main/java/com/ruoyi/call/domain/ArdCallUnreadMessages.java                  |   66 +
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java            |   80 +
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java    |  147 ++
 38 files changed, 3,353 insertions(+), 20 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/call/compare/ArdCallSessionUserComparator.java b/ard-work/src/main/java/com/ruoyi/call/compare/ArdCallSessionUserComparator.java
new file mode 100644
index 0000000..85c075f
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/compare/ArdCallSessionUserComparator.java
@@ -0,0 +1,18 @@
+package com.ruoyi.call.compare;
+
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import org.springframework.stereotype.Component;
+
+import java.util.Comparator;
+import java.util.Date;
+@Component
+public class ArdCallSessionUserComparator implements Comparator<ArdCallSessionUser> {
+
+    @Override
+    public int compare(ArdCallSessionUser o1, ArdCallSessionUser o2) {
+        Date createTime1 = o1.getArdCallHistory().getCreateTime();
+        Date createTime2 = o2.getArdCallHistory().getCreateTime();
+        // 鏍规嵁 createTime 杩涜姣旇緝
+        return createTime2.compareTo(createTime1);
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupController.java
new file mode 100644
index 0000000..7a9e641
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupController.java
@@ -0,0 +1,93 @@
+package com.ruoyi.call.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.ruoyi.common.annotation.Anonymous;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.service.IArdCallGroupService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 浼氳瘽缇ょ粍Controller
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Api(tags = "缇よ亰-缇ょ粍鎺ュ彛")
+@RestController
+@RequestMapping("/call/group")
+@Anonymous
+public class ArdCallGroupController extends BaseController {
+    @Autowired
+    private IArdCallGroupService ardCallGroupService;
+
+    /**
+     * 鏌ヨ缇ょ粍鍒楄〃
+     */
+    @ApiOperation("鏌ヨ缇ょ粍鍒楄〃")
+    @ApiOperationSupport(ignoreParameters = {"ardCallGroupUsers","userIds","params"})
+    @GetMapping("/list")
+    public TableDataInfo list(ArdCallGroup ardCallGroup) {
+        startPage();
+        List<ArdCallGroup> list = ardCallGroupService.selectArdCallGroupList(ardCallGroup);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 鑾峰彇缇ょ粍璇︾粏淇℃伅
+     */
+    @ApiOperation("鑾峰彇缇ょ粍璇︾粏淇℃伅")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(ardCallGroupService.selectArdCallGroupById(id));
+    }
+
+    /**
+     * 鏂板缇ょ粍
+     */
+    @ApiOperation("鏂板缇ょ粍")
+    @ApiOperationSupport(includeParameters = {"param.userIds","param.name"})
+    @PostMapping
+    public AjaxResult add(@RequestBody ArdCallGroup ardCallGroup) {
+        return success(ardCallGroupService.insertArdCallGroup(ardCallGroup));
+    }
+
+    /**
+     * 淇敼缇ょ粍
+     */
+    @ApiOperation("淇敼缇ょ粍")
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArdCallGroup ardCallGroup) {
+        return toAjax(ardCallGroupService.updateArdCallGroup(ardCallGroup));
+    }
+
+    /**
+     * 鍒犻櫎缇ょ粍
+     */
+    @ApiOperation("鍒犻櫎缇ょ粍")
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(ardCallGroupService.deleteArdCallGroupByIds(ids));
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupUserController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupUserController.java
new file mode 100644
index 0000000..607c2d7
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallGroupUserController.java
@@ -0,0 +1,124 @@
+package com.ruoyi.call.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.annotation.Anonymous;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import com.ruoyi.call.service.IArdCallGroupUserService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 缇ょ粍鐢ㄦ埛涓棿Controller
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Api(tags = "缇よ亰-缇ょ粍鐢ㄦ埛鎺ュ彛")
+@RestController
+@RequestMapping("/call/groupuser")
+@Anonymous
+public class ArdCallGroupUserController extends BaseController {
+    @Autowired
+    private IArdCallGroupUserService ardCallGroupUserService;
+
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(ArdCallGroupUser ardCallGroupUser) {
+        startPage();
+        List<ArdCallGroupUser> list = ardCallGroupUserService.selectArdCallGroupUserList(ardCallGroupUser);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 鑾峰彇缇ょ粍鐢ㄦ埛涓棿璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(ardCallGroupUserService.selectArdCallGroupUserById(id));
+    }
+
+    /**
+     * 鏂板缇ょ粍鐢ㄦ埛涓棿
+     */
+    @PreAuthorize("@ss.hasPermi('call:groupuser:add')")
+    @PostMapping
+    public AjaxResult add(@RequestBody ArdCallGroupUser ardCallGroupUser) {
+        return toAjax(ardCallGroupUserService.insertArdCallGroupUser(ardCallGroupUser));
+    }
+
+    /**
+     * 淇敼缇ょ粍鐢ㄦ埛涓棿
+     */
+    @PreAuthorize("@ss.hasPermi('call:groupuser:edit')")
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArdCallGroupUser ardCallGroupUser) {
+        return toAjax(ardCallGroupUserService.updateArdCallGroupUser(ardCallGroupUser));
+    }
+
+    /**
+     * 鍒犻櫎缇ょ粍鐢ㄦ埛涓棿
+     */
+    @PreAuthorize("@ss.hasPermi('call:groupuser:remove')")
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(ardCallGroupUserService.deleteArdCallGroupUserByIds(ids));
+    }
+
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�鍦ㄧ兢缁�
+     */
+    @ApiOperation("鏌ヨ鐢ㄦ埛鎵�鍦ㄧ兢缁�")
+    @GetMapping(value = "/getGroupListByUserId/{userId}")
+    public AjaxResult getGroupListByUserId(@PathVariable("userId") String userId) {
+        return success(ardCallGroupUserService.getGroupListByUserId(userId));
+    }
+    /**
+     * 涓嶅湪缇ょ粍鐨勪汉鍛樺垪琛�
+     */
+    @ApiOperation("涓嶅湪缇ょ粍鐨勪汉鍛樺垪琛�")
+    @GetMapping(value = "/notInGroupUsers/{groupId}")
+    public AjaxResult notInGroupUsers (@PathVariable("groupId") String groupId) {
+        return success(ardCallGroupUserService.notInGroupUsers(groupId));
+    }
+
+    /**
+     * 閭�璇风兢缁勬垚鍛�
+     */
+    @ApiOperation("閭�璇风兢缁勬垚鍛�")
+    @PostMapping("/addGroupUser")
+    public AjaxResult addGroupUser(String groupId, String[] userIds) {
+        return toAjax(ardCallGroupUserService.addGroupUser(groupId, userIds));
+    }
+    /**
+     * 绉婚櫎缇ょ粍鎴愬憳
+     */
+    @ApiOperation("绉婚櫎缇ょ粍鎴愬憳")
+    @PostMapping("/removeGroupUser")
+    public AjaxResult removeGroupUser(String groupId, String[] userIds) {
+        return toAjax(ardCallGroupUserService.removeGroupUser(groupId, userIds));
+    }
+
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallHistoryController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallHistoryController.java
new file mode 100644
index 0000000..9f38bea
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallHistoryController.java
@@ -0,0 +1,88 @@
+package com.ruoyi.call.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.ruoyi.common.annotation.Anonymous;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.call.domain.ArdCallHistory;
+import com.ruoyi.call.service.IArdCallHistoryService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 浼氳瘽鍘嗗彶Controller
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Api(tags = "缇よ亰-鍘嗗彶娑堟伅鎺ュ彛")
+@RestController
+@RequestMapping("/call/history")
+@Anonymous
+public class ArdCallHistoryController extends BaseController {
+    @Autowired
+    private IArdCallHistoryService ardCallHistoryService;
+
+    /**
+     * 鏌ヨ浼氳瘽娑堟伅鍒楄〃
+     */
+    @ApiOperation("鏌ヨ浼氳瘽娑堟伅鍒楄〃")
+    @GetMapping("/list")
+    public TableDataInfo list(ArdCallHistory ardCallHistory) {
+        startPage();
+        List<ArdCallHistory> list = ardCallHistoryService.selectArdCallHistoryList(ardCallHistory);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 鑾峰彇浼氳瘽鍘嗗彶璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(ardCallHistoryService.selectArdCallHistoryById(id));
+    }
+
+    /**
+     * 鏂板浼氳瘽娑堟伅
+     */
+    @ApiOperation("鏂板浼氳瘽娑堟伅")
+    @ApiOperationSupport(includeParameters = {"param.userId","param.targetId", "param.sessionId", "param.content", "param.type"})
+    @PostMapping
+    public AjaxResult add(@RequestBody ArdCallHistory ardCallHistory) {
+        return toAjax(ardCallHistoryService.insertArdCallHistory(ardCallHistory));
+    }
+
+    /**
+     * 淇敼浼氳瘽娑堟伅
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArdCallHistory ardCallHistory) {
+        return toAjax(ardCallHistoryService.updateArdCallHistory(ardCallHistory));
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽娑堟伅
+     */
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(ardCallHistoryService.deleteArdCallHistoryByIds(ids));
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionController.java
new file mode 100644
index 0000000..1d00e92
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionController.java
@@ -0,0 +1,93 @@
+package com.ruoyi.call.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.annotation.Anonymous;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.call.domain.ArdCallSession;
+import com.ruoyi.call.service.IArdCallSessionService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 瑙嗛浼氳瘽Controller
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Api(tags = "缇よ亰-浼氳瘽鎺ュ彛")
+@RestController
+@RequestMapping("/call/session")
+@Anonymous
+public class ArdCallSessionController extends BaseController {
+    @Autowired
+    private IArdCallSessionService ardCallSessionService;
+
+    /**
+     * 鏌ヨ浼氳瘽鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(ArdCallSession ardCallSession) {
+        startPage();
+        List<ArdCallSession> list = ardCallSessionService.selectArdCallSessionList(ardCallSession);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 鑾峰彇浼氳瘽璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(ardCallSessionService.selectArdCallSessionById(id));
+    }
+    /**
+     * 鑾峰彇浼氳瘽
+     */
+    @ApiOperation("鑾峰彇浼氳瘽")
+    @GetMapping(value = "/getSession")
+    public AjaxResult getSession(String type,String userId, String targetId) {
+        return success(ardCallSessionService.getSession(type,userId,targetId));
+    }
+    /**
+     * 鏂板浼氳瘽
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody ArdCallSession ardCallSession) {
+        return success(ardCallSessionService.insertArdCallSession(ardCallSession));
+    }
+
+    /**
+     * 淇敼浼氳瘽
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArdCallSession ardCallSession) {
+        return toAjax(ardCallSessionService.updateArdCallSession(ardCallSession));
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽
+     */
+    @ApiOperation("鍒犻櫎浼氳瘽")
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(ardCallSessionService.deleteArdCallSessionByIds(ids));
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java
new file mode 100644
index 0000000..5d83e2e
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java
@@ -0,0 +1,101 @@
+package com.ruoyi.call.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.ruoyi.call.service.IArdCallUnreadMessagesService;
+import com.ruoyi.common.annotation.Anonymous;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import com.ruoyi.call.service.IArdCallSessionUserService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 浼氳瘽鐢ㄦ埛涓棿琛–ontroller
+ *
+ * @author ard
+ * @date 2024-07-04
+ */
+@Api(tags = "缇よ亰-浼氳瘽鎺ュ彛")
+@RestController
+@RequestMapping("/call/sessionuser")
+@Anonymous
+public class ArdCallSessionUserController extends BaseController {
+    @Autowired
+    private IArdCallSessionUserService ardCallSessionUserService;
+    @Autowired
+    private IArdCallUnreadMessagesService ardCallUnreadMessagesService;
+    /**
+     * 鑾峰彇浼氳瘽鍒楄〃
+     */
+    @ApiOperation("鑾峰彇浼氳瘽鍒楄〃")
+    @ApiOperationSupport(ignoreParameters  = {"id","unReadCount","sessionId","targetId","type","params","ardCallHistory"})
+    @GetMapping("/list")
+    public TableDataInfo list(ArdCallSessionUser ardCallSessionUser) {
+        startPage();
+        List<ArdCallSessionUser> list = ardCallSessionUserService.selectArdCallSessionUserList(ardCallSessionUser);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鑾峰彇浼氳瘽鐢ㄦ埛涓棿琛ㄨ缁嗕俊鎭�
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return success(ardCallSessionUserService.selectArdCallSessionUserById(id));
+    }
+
+    /**
+     * 鏂板浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody ArdCallSessionUser ardCallSessionUser) {
+        return toAjax(ardCallSessionUserService.insertArdCallSessionUser(ardCallSessionUser));
+    }
+
+    /**
+     * 淇敼浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArdCallSessionUser ardCallSessionUser) {
+        return toAjax(ardCallSessionUserService.updateArdCallSessionUser(ardCallSessionUser));
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(ardCallSessionUserService.deleteArdCallSessionUserByIds(ids));
+    }
+
+    /**
+     * 娓呴櫎浼氳瘽鏈鏁伴噺
+     */
+    @ApiOperation("娓呴櫎浼氳瘽鏈鏁伴噺")
+    @PostMapping("/clearUnReadCount")
+    @ApiImplicitParams({@ApiImplicitParam(name = "sessionId", value = "浼氳瘽id", required = true, dataType = "String"),
+                        @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛id", required = true, dataType = "String")})
+    public AjaxResult clearUnReadCount(String sessionId, String userId) {
+        return toAjax(ardCallUnreadMessagesService.clearUnReadCount(sessionId, userId));
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroup.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroup.java
new file mode 100644
index 0000000..772a450
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroup.java
@@ -0,0 +1,83 @@
+package com.ruoyi.call.domain;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.List;
+
+/**
+ * 浼氳瘽缇ょ粍瀵硅薄 ard_call_group
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public class ArdCallGroup extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    private String id;
+
+    /**
+     * 缇ゅ悕绉�
+     */
+    @Excel(name = "缇ゅ悕绉�")
+    private String name;
+    /**
+     * 缇ゆ垚鍛樺垪琛�
+     */
+    private List<ArdCallGroupUser> ArdCallGroupUsers;
+
+    /**
+     * 缇ゆ垚鍛榠d鍒楄〃
+     */
+    private List<String> userIds;
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public List<ArdCallGroupUser> getArdCallGroupUsers() {
+        return ArdCallGroupUsers;
+    }
+
+    public void setArdCallGroupUsers(List<ArdCallGroupUser> ardCallGroupUsers) {
+        ArdCallGroupUsers = ardCallGroupUsers;
+    }
+
+    public List<String> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<String> userIds) {
+        this.userIds = userIds;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("name", getName())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .toString();
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroupUser.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroupUser.java
new file mode 100644
index 0000000..1c4797d
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallGroupUser.java
@@ -0,0 +1,80 @@
+package com.ruoyi.call.domain;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 缇ょ粍鐢ㄦ埛涓棿瀵硅薄 ard_call_group_user
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public class ArdCallGroupUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 缇ょ粍ID */
+    @Excel(name = "缇ょ粍ID")
+    private String groupId;
+
+    /** 鐢ㄦ埛ID */
+    @Excel(name = "鐢ㄦ埛ID")
+    private String userId;
+
+    private SysUser sysUser; // 宓屽鐨� SysUser 瀵硅薄
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setGroupId(String groupId) 
+    {
+        this.groupId = groupId;
+    }
+
+    public String getGroupId() 
+    {
+        return groupId;
+    }
+    public void setUserId(String userId) 
+    {
+        this.userId = userId;
+    }
+
+    public String getUserId() 
+    {
+        return userId;
+    }
+
+    public SysUser getSysUser() {
+        return sysUser;
+    }
+
+    public void setSysUser(SysUser sysUser) {
+        this.sysUser = sysUser;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("groupId", getGroupId())
+            .append("userId", getUserId())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallHistory.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallHistory.java
new file mode 100644
index 0000000..6bc1c2f
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallHistory.java
@@ -0,0 +1,104 @@
+package com.ruoyi.call.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 浼氳瘽鍘嗗彶瀵硅薄 ard_call_history
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public class ArdCallHistory extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 浼氳瘽ID */
+    @Excel(name = "浼氳瘽ID")
+    private String sessionId;
+    /** 鐢ㄦ埛ID */
+    @Excel(name = "鐢ㄦ埛ID")
+    private String userId;
+    /** 娑堟伅绫诲瀷 */
+    @Excel(name = "娑堟伅绫诲瀷")
+    private String type;
+
+    /** 娑堟伅鍐呭 */
+    @Excel(name = "娑堟伅鍐呭")
+    private String content;
+
+    /** 鐩爣ID */
+    @Excel(name = "鐩爣ID")
+    private String targetId;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+
+    public String getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+
+    public String getTargetId() {
+        return targetId;
+    }
+
+    public void setTargetId(String targetId) {
+        this.targetId = targetId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("type", getType())
+            .append("content", getContent())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSession.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSession.java
new file mode 100644
index 0000000..d4116b3
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSession.java
@@ -0,0 +1,86 @@
+package com.ruoyi.call.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.List;
+
+/**
+ * 瑙嗛浼氳瘽瀵硅薄 ard_call_session
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public class ArdCallSession extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    private String id;
+
+    /**
+     * 浼氳瘽绫诲瀷
+     */
+    @Excel(name = "浼氳瘽绫诲瀷")
+    private String type;
+
+    /**
+     * userId
+     */
+    @Excel(name = "鐢ㄦ埛Id")
+    private String userId;
+
+    /**
+     * 浼氳瘽鐢ㄦ埛鍒楄〃
+     */
+    private List<String> targetIds;
+
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+
+    public List<String> getTargetIds() {
+        return targetIds;
+    }
+
+    public void setTargetIds(List<String> targetIds) {
+        this.targetIds = targetIds;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("type", getType())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .toString();
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSessionUser.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSessionUser.java
new file mode 100644
index 0000000..610c7ee
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallSessionUser.java
@@ -0,0 +1,107 @@
+package com.ruoyi.call.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 浼氳瘽鐢ㄦ埛涓棿琛ㄥ璞� ard_call_session_user
+ * 
+ * @author ard
+ * @date 2024-07-04
+ */
+public class ArdCallSessionUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 浼氳瘽id */
+    @Excel(name = "浼氳瘽id")
+    private String sessionId;
+
+    /** 浼氳瘽绫诲瀷 */
+    @Excel(name = "浼氳瘽绫诲瀷")
+    private String type;
+
+
+    /** 褰撳墠鎴愬憳id */
+    @Excel(name = "褰撳墠鎴愬憳id")
+    private String userId;
+
+    /** 鐩爣鎴愬憳id */
+    @Excel(name = "鐩爣鎴愬憳id")
+    private String targetId;
+
+    /**
+     * 鏈�鍚庝竴鏉℃秷鎭�
+     */
+    private ArdCallHistory ardCallHistory;
+    /**
+     * 鏈娑堟伅鏁版嵁閲�
+     */
+    private Integer unReadCount;
+
+
+    public ArdCallHistory getArdCallHistory() {
+        return ardCallHistory;
+    }
+
+    public void setArdCallHistory(ArdCallHistory ardCallHistory) {
+        this.ardCallHistory = ardCallHistory;
+    }
+
+    public Integer getUnReadCount() {
+        return unReadCount;
+    }
+
+    public void setUnReadCount(Integer unReadCount) {
+        this.unReadCount = unReadCount;
+    }
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setSessionId(String sessionId) 
+    {
+        this.sessionId = sessionId;
+    }
+
+    public String getSessionId() 
+    {
+        return sessionId;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    public String getTargetId() {
+        return targetId;
+    }
+
+    public void setTargetId(String targetId) {
+        this.targetId = targetId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallUnreadMessages.java b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallUnreadMessages.java
new file mode 100644
index 0000000..21de2da
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/domain/ArdCallUnreadMessages.java
@@ -0,0 +1,66 @@
+package com.ruoyi.call.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 鏈娑堟伅瀵硅薄 ard_call_unread_messages
+ * 
+ * @author ard
+ * @date 2024-07-06
+ */
+public class ArdCallUnreadMessages extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鐢ㄦ埛id */
+    @Excel(name = "鐢ㄦ埛id")
+    private String userId ;
+
+    /** 浼氳瘽id */
+    @Excel(name = "浼氳瘽id")
+    private String sessionId;
+
+    /** 鏈鏁伴噺 */
+    @Excel(name = "鏈鏁伴噺")
+    private Integer unreadCount;
+
+    public void setUserId (String userId ) 
+    {
+        this.userId  = userId ;
+    }
+
+    public String getUserId () 
+    {
+        return userId ;
+    }
+    public void setSessionId(String sessionId) 
+    {
+        this.sessionId = sessionId;
+    }
+
+    public String getSessionId() 
+    {
+        return sessionId;
+    }
+    public void setUnreadCount(Integer unreadCount)
+    {
+        this.unreadCount = unreadCount;
+    }
+
+    public Integer getUnreadCount()
+    {
+        return unreadCount;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId ", getUserId ())
+            .append("sessionId", getSessionId())
+            .append("unreadCount", getUnreadCount())
+            .toString();
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupMapper.java
new file mode 100644
index 0000000..a5033f6
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+import com.ruoyi.call.domain.ArdCallGroup;
+
+/**
+ * 浼氳瘽缇ょ粍Mapper鎺ュ彛
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface ArdCallGroupMapper 
+{
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍
+     * 
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 浼氳瘽缇ょ粍
+     */
+    public ArdCallGroup selectArdCallGroupById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍鍒楄〃
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 浼氳瘽缇ょ粍闆嗗悎
+     */
+    public List<ArdCallGroup> selectArdCallGroupList(ArdCallGroup ardCallGroup);
+
+    /**
+     * 鏂板浼氳瘽缇ょ粍
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    public int insertArdCallGroup(ArdCallGroup ardCallGroup);
+
+    /**
+     * 淇敼浼氳瘽缇ょ粍
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    public int updateArdCallGroup(ArdCallGroup ardCallGroup);
+
+    /**
+     * 鍒犻櫎浼氳瘽缇ょ粍
+     * 
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽缇ょ粍
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupByIds(String[] ids);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupUserMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupUserMapper.java
new file mode 100644
index 0000000..bd1cce6
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallGroupUserMapper.java
@@ -0,0 +1,84 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 缇ょ粍鐢ㄦ埛涓棿Mapper鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface ArdCallGroupUserMapper {
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缇ょ粍鐢ㄦ埛涓棿
+     */
+    public ArdCallGroupUser selectArdCallGroupUserById(String id);
+
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿鍒楄〃
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缇ょ粍鐢ㄦ埛涓棿闆嗗悎
+     */
+    public List<ArdCallGroupUser> selectArdCallGroupUserList(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 鏂板缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    public int insertArdCallGroupUser(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 淇敼缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    public int updateArdCallGroupUser(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 鍒犻櫎缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupUserById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupUserByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎缇ょ粍鍏宠仈鐢ㄦ埛
+     *
+     * @param groupId 缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    public int clearArdCallGroupUsers(String groupId);
+
+    /**
+     * 绉婚櫎缇ょ粍鐢ㄦ埛
+     *
+     * @param groupId 缇ょ粍涓婚敭
+     * @param userIds 缇ょ粍鐢ㄦ埛鏁扮粍闆嗗悎
+     * @return 缁撴灉
+     */
+    public int removeGroupUser(@Param("groupId") String groupId, @Param("userIds") String[] userIds);
+
+    public List<ArdCallGroup> getGroupListByUserId(String userId);
+
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallHistoryMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallHistoryMapper.java
new file mode 100644
index 0000000..a5786f5
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallHistoryMapper.java
@@ -0,0 +1,72 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallHistory;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 浼氳瘽鍘嗗彶Mapper鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface ArdCallHistoryMapper {
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶
+     *
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 浼氳瘽鍘嗗彶
+     */
+    public ArdCallHistory selectArdCallHistoryById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶鍒楄〃
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 浼氳瘽鍘嗗彶闆嗗悎
+     */
+    public List<ArdCallHistory> selectArdCallHistoryList(ArdCallHistory ardCallHistory);
+
+    /**
+     * 鏂板浼氳瘽鍘嗗彶
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    public int insertArdCallHistory(ArdCallHistory ardCallHistory);
+
+    /**
+     * 淇敼浼氳瘽鍘嗗彶
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    public int updateArdCallHistory(ArdCallHistory ardCallHistory);
+
+    /**
+     * 鍒犻櫎浼氳瘽鍘嗗彶
+     *
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallHistoryById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鍘嗗彶
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallHistoryByIds(String[] ids);
+
+
+    /**
+     * 鑾峰彇鏈�鍚庝竴鏉′細璇濆巻鍙�
+     *
+     * @param sessionId 浼氳瘽id
+     * @return 缁撴灉
+     */
+    public ArdCallHistory selectLastArdCallHistory(@Param("sessionId") String sessionId);
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionMapper.java
new file mode 100644
index 0000000..18fd125
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionMapper.java
@@ -0,0 +1,62 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+import com.ruoyi.call.domain.ArdCallSession;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 瑙嗛浼氳瘽Mapper鎺ュ彛
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface ArdCallSessionMapper {
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 瑙嗛浼氳瘽
+     */
+    public ArdCallSession selectArdCallSessionById(String id);
+
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽鍒楄〃
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 瑙嗛浼氳瘽闆嗗悎
+     */
+    public List<ArdCallSession> selectArdCallSessionList(ArdCallSession ardCallSession);
+
+    /**
+     * 鏂板瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    public int insertArdCallSession(ArdCallSession ardCallSession);
+
+    /**
+     * 淇敼瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    public int updateArdCallSession(ArdCallSession ardCallSession);
+
+    /**
+     * 鍒犻櫎瑙嗛浼氳瘽
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎瑙嗛浼氳瘽
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionByIds(String[] ids);
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java
new file mode 100644
index 0000000..fd7d26e
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java
@@ -0,0 +1,68 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 浼氳瘽鐢ㄦ埛涓棿琛∕apper鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-04
+ */
+public interface ArdCallSessionUserMapper {
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    public ArdCallSessionUser selectArdCallSessionUserById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛ㄩ泦鍚�
+     */
+    public List<ArdCallSessionUser> selectArdCallSessionUserList(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 鏂板浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    public int insertArdCallSessionUser(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 淇敼浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    public int updateArdCallSessionUser(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionUserById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionUserByIds(String[] ids);
+
+    public String getSessionId(@Param("type") String type, @Param("userId") String userId, @Param("targetId") String targetId);
+    public String getGroupSessionId(@Param("type") String type,  @Param("targetId") String targetId);
+    public int deleteArdCallSessionUserBySessionId(@Param("sessionId") String sessionId);
+
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallUnreadMessagesMapper.java b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallUnreadMessagesMapper.java
new file mode 100644
index 0000000..81383ec
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallUnreadMessagesMapper.java
@@ -0,0 +1,68 @@
+package com.ruoyi.call.mapper;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallUnreadMessages;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 鏈娑堟伅Mapper鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-06
+ */
+public interface ArdCallUnreadMessagesMapper {
+    /**
+     * 鏌ヨ鏈娑堟伅
+     *
+     * @param userId 鏈娑堟伅涓婚敭
+     * @return 鏈娑堟伅
+     */
+    public ArdCallUnreadMessages selectArdCallUnreadMessagesByUserId(String userId);
+
+    /**
+     * 鏌ヨ鏈娑堟伅鍒楄〃
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 鏈娑堟伅闆嗗悎
+     */
+    public List<ArdCallUnreadMessages> selectArdCallUnreadMessagesList(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 鏂板鏈娑堟伅
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    public int insertArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 淇敼鏈娑堟伅
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    public int updateArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 鍒犻櫎鏈娑堟伅
+     *
+     * @param userId 鏈娑堟伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallUnreadMessagesByUserId(String userId);
+
+    /**
+     * 鎵归噺鍒犻櫎鏈娑堟伅
+     *
+     * @param userId s 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallUnreadMessagesByUserId(String[] userId);
+
+    @Select("select count(*) from ard_call_unread_messages where session_id=#{sessionId} and target_id=#{targetId}")
+    int countBySessionIdAnduserId(String sessionId, String userId);
+
+    public ArdCallUnreadMessages  getUnreadMessage(@Param("sessionId") String sessionId, @Param("targetId")String targetId);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupService.java
new file mode 100644
index 0000000..df1ff43
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+import com.ruoyi.call.domain.ArdCallGroup;
+
+/**
+ * 浼氳瘽缇ょ粍Service鎺ュ彛
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface IArdCallGroupService 
+{
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍
+     * 
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 浼氳瘽缇ょ粍
+     */
+    public ArdCallGroup selectArdCallGroupById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍鍒楄〃
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 浼氳瘽缇ょ粍闆嗗悎
+     */
+    public List<ArdCallGroup> selectArdCallGroupList(ArdCallGroup ardCallGroup);
+
+    /**
+     * 鏂板浼氳瘽缇ょ粍
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    public String insertArdCallGroup(ArdCallGroup ardCallGroup);
+
+    /**
+     * 淇敼浼氳瘽缇ょ粍
+     * 
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    public int updateArdCallGroup(ArdCallGroup ardCallGroup);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽缇ょ粍
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽缇ょ粍涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎浼氳瘽缇ょ粍淇℃伅
+     * 
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupById(String id);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupUserService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupUserService.java
new file mode 100644
index 0000000..78cfbfb
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallGroupUserService.java
@@ -0,0 +1,97 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import com.ruoyi.common.core.domain.entity.SysUser;
+
+/**
+ * 缇ょ粍鐢ㄦ埛涓棿Service鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface IArdCallGroupUserService {
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缇ょ粍鐢ㄦ埛涓棿
+     */
+    public ArdCallGroupUser selectArdCallGroupUserById(String id);
+
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿鍒楄〃
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缇ょ粍鐢ㄦ埛涓棿闆嗗悎
+     */
+    public List<ArdCallGroupUser> selectArdCallGroupUserList(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 鏂板缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    public int insertArdCallGroupUser(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 淇敼缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    public int updateArdCallGroupUser(ArdCallGroupUser ardCallGroupUser);
+
+    /**
+     * 鎵归噺鍒犻櫎缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑缇ょ粍鐢ㄦ埛涓棿涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupUserByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎缇ょ粍鐢ㄦ埛涓棿淇℃伅
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallGroupUserById(String id);
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�鍦ㄧ兢缁�
+     *
+     * @param userId 缇ょ粍鐢ㄦ埛
+     * @return 缁撴灉
+     */
+    List<ArdCallGroup> getGroupListByUserId(String userId);
+
+    /**
+     * 閭�璇风兢缁勭敤鎴�
+     *
+     * @param id      缇ょ粍涓婚敭
+     * @param userIds 缇ょ粍鐢ㄦ埛鏁扮粍闆嗗悎
+     * @return 缁撴灉
+     */
+    public int addGroupUser(String id, String[] userIds);
+
+    /**
+     * 绉婚櫎缇ょ粍鐢ㄦ埛
+     *
+     * @param id      缇ょ粍涓婚敭
+     * @param userIds 缇ょ粍鐢ㄦ埛鏁扮粍闆嗗悎
+     * @return 缁撴灉
+     */
+    public int removeGroupUser(String id, String[] userIds);
+
+    /**
+     * 涓嶅湪缇ょ粍鐨勪汉鍛樺垪琛�
+     *
+     * @param groupId 缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    List<SysUser> notInGroupUsers(String groupId);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallHistoryService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallHistoryService.java
new file mode 100644
index 0000000..af86fb9
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallHistoryService.java
@@ -0,0 +1,61 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+import com.ruoyi.call.domain.ArdCallHistory;
+
+/**
+ * 浼氳瘽鍘嗗彶Service鎺ュ彛
+ * 
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface IArdCallHistoryService 
+{
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶
+     * 
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 浼氳瘽鍘嗗彶
+     */
+    public ArdCallHistory selectArdCallHistoryById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶鍒楄〃
+     * 
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 浼氳瘽鍘嗗彶闆嗗悎
+     */
+    public List<ArdCallHistory> selectArdCallHistoryList(ArdCallHistory ardCallHistory);
+
+    /**
+     * 鏂板浼氳瘽鍘嗗彶
+     * 
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    public int insertArdCallHistory(ArdCallHistory ardCallHistory);
+
+    /**
+     * 淇敼浼氳瘽鍘嗗彶
+     * 
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    public int updateArdCallHistory(ArdCallHistory ardCallHistory);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鍘嗗彶
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽鍘嗗彶涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallHistoryByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎浼氳瘽鍘嗗彶淇℃伅
+     * 
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallHistoryById(String id);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionService.java
new file mode 100644
index 0000000..af36f59
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionService.java
@@ -0,0 +1,72 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallSession;
+
+/**
+ * 瑙嗛浼氳瘽Service鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+public interface IArdCallSessionService {
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 瑙嗛浼氳瘽
+     */
+    public ArdCallSession selectArdCallSessionById(String id);
+
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽鍒楄〃
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 瑙嗛浼氳瘽闆嗗悎
+     */
+    public List<ArdCallSession> selectArdCallSessionList(ArdCallSession ardCallSession);
+
+    /**
+     * 鏂板瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    public String insertArdCallSession(ArdCallSession ardCallSession);
+
+    /**
+     * 淇敼瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    public int updateArdCallSession(ArdCallSession ardCallSession);
+
+    /**
+     * 鎵归噺鍒犻櫎瑙嗛浼氳瘽
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑瑙嗛浼氳瘽涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎瑙嗛浼氳瘽淇℃伅
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionById(String id);
+
+
+    /**
+     * 鑾峰彇浼氳瘽
+     *
+     * @param type 浼氳瘽绫诲瀷 0鍗曡亰1缇よ亰
+     * @param userId 浼氳瘽鍙戦�佹柟
+     * @param targetId 浼氳瘽鎺ユ敹鏂�
+     * @return 缁撴灉
+     */
+    public String getSession(String type, String userId, String targetId);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java
new file mode 100644
index 0000000..f8aa9e5
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java
@@ -0,0 +1,80 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallSessionUser;
+
+/**
+ * 浼氳瘽鐢ㄦ埛涓棿琛⊿ervice鎺ュ彛
+ *
+ * @author ard
+ * @date 2024-07-04
+ */
+public interface IArdCallSessionUserService {
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    public ArdCallSessionUser selectArdCallSessionUserById(String id);
+
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛ㄩ泦鍚�
+     */
+    public List<ArdCallSessionUser> selectArdCallSessionUserList(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 鏂板浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    public int insertArdCallSessionUser(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 淇敼浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    public int updateArdCallSessionUser(ArdCallSessionUser ardCallSessionUser);
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿泦鍚�
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionUserByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛ㄤ俊鎭�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionUserById(String id);
+
+
+    /**
+     * 鑾峰彇浼氳瘽
+     *
+     * @param type     浼氳瘽绫诲瀷
+     * @param userId   鐢ㄦ埛id
+     * @param targetId 鐩爣id
+     * @return 缁撴灉
+     */
+    public String getSessionId(String type, String userId, String targetId);
+    public String getGroupSessionId(String type,String targetId);
+    /**
+     * 閫氳繃sessionId鍒犻櫎鍏宠仈鐢ㄦ埛
+     *
+     * @param sessionId 鐩爣id
+     * @return 缁撴灉
+     */
+    public int deleteArdCallSessionUserBySessionId(String sessionId);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallUnreadMessagesService.java b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallUnreadMessagesService.java
new file mode 100644
index 0000000..f891eaa
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallUnreadMessagesService.java
@@ -0,0 +1,70 @@
+package com.ruoyi.call.service;
+
+import java.util.List;
+import com.ruoyi.call.domain.ArdCallUnreadMessages;
+
+/**
+ * 鏈娑堟伅Service鎺ュ彛
+ * 
+ * @author ard
+ * @date 2024-07-06
+ */
+public interface IArdCallUnreadMessagesService 
+{
+    /**
+     * 鏌ヨ鏈娑堟伅
+     * 
+     * @param userId  鏈娑堟伅涓婚敭
+     * @return 鏈娑堟伅
+     */
+    public ArdCallUnreadMessages selectArdCallUnreadMessagesByUserId (String userId );
+
+    /**
+     * 鏌ヨ鏈娑堟伅鍒楄〃
+     * 
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 鏈娑堟伅闆嗗悎
+     */
+    public List<ArdCallUnreadMessages> selectArdCallUnreadMessagesList(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 鏂板鏈娑堟伅
+     * 
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    public int insertArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 淇敼鏈娑堟伅
+     * 
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    public int updateArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages);
+
+    /**
+     * 鎵归噺鍒犻櫎鏈娑堟伅
+     * 
+     * @param userId s 闇�瑕佸垹闄ょ殑鏈娑堟伅涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteArdCallUnreadMessagesByUserId(String[] userId);
+
+    /**
+     * 鍒犻櫎鏈娑堟伅淇℃伅
+     * 
+     * @param userId  鏈娑堟伅涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteArdCallUnreadMessagesByUserId (String userId );
+
+    /**
+     * 娓呴櫎浼氳瘽鏈鏁伴噺
+     *
+     * @param sessionId  浼氳瘽id
+     * @param userId     鐢ㄦ埛id
+     * @return 缁撴灉
+     */
+    public int clearUnReadCount(String sessionId,String userId);
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupServiceImpl.java
new file mode 100644
index 0000000..cde19dc
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupServiceImpl.java
@@ -0,0 +1,122 @@
+package com.ruoyi.call.service.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import com.ruoyi.call.mapper.ArdCallGroupUserMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+
+import com.ruoyi.common.utils.uuid.IdUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.call.mapper.ArdCallGroupMapper;
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.service.IArdCallGroupService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+/**
+ * 浼氳瘽缇ょ粍Service涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Service
+public class ArdCallGroupServiceImpl implements IArdCallGroupService {
+    @Resource
+    private ArdCallGroupMapper ardCallGroupMapper;
+    @Resource
+    private ArdCallGroupUserMapper ardCallGroupUserMapper;
+
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍
+     *
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 浼氳瘽缇ょ粍
+     */
+    @Override
+    public ArdCallGroup selectArdCallGroupById(String id) {
+        return ardCallGroupMapper.selectArdCallGroupById(id);
+    }
+
+    /**
+     * 鏌ヨ浼氳瘽缇ょ粍鍒楄〃
+     *
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 浼氳瘽缇ょ粍
+     */
+    @Override
+    public List<ArdCallGroup> selectArdCallGroupList(ArdCallGroup ardCallGroup) {
+        return ardCallGroupMapper.selectArdCallGroupList(ardCallGroup);
+    }
+
+    /**
+     * 鏂板浼氳瘽缇ょ粍
+     *
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    @Transactional
+    @Override
+    public String insertArdCallGroup(ArdCallGroup ardCallGroup) {
+        ardCallGroup.setId(IdUtils.simpleUUID());
+        ardCallGroup.setCreateTime(DateUtils.getNowDate());
+        ardCallGroup.getUserIds().stream().forEach(userId -> {
+            ArdCallGroupUser groupUser = new ArdCallGroupUser();
+            groupUser.setId(IdUtils.simpleUUID());
+            groupUser.setGroupId(ardCallGroup.getId());
+            groupUser.setUserId(userId);
+            groupUser.setCreateTime(DateUtils.getNowDate());
+            ardCallGroupUserMapper.insertArdCallGroupUser(groupUser);
+        });
+        ardCallGroupMapper.insertArdCallGroup(ardCallGroup);
+        return ardCallGroup.getId();
+    }
+
+    /**
+     * 淇敼浼氳瘽缇ょ粍
+     *
+     * @param ardCallGroup 浼氳瘽缇ょ粍
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallGroup(ArdCallGroup ardCallGroup) {
+        ardCallGroup.setUpdateBy(SecurityUtils.getUsername());
+        ardCallGroup.setUpdateTime(DateUtils.getNowDate());
+        return ardCallGroupMapper.updateArdCallGroup(ardCallGroup);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽缇ょ粍
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallGroupByIds(String[] ids) {
+        Arrays.stream(ids).forEach(id -> {
+            ardCallGroupUserMapper.clearArdCallGroupUsers(id);
+        });
+        return ardCallGroupMapper.deleteArdCallGroupByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽缇ょ粍淇℃伅
+     *
+     * @param id 浼氳瘽缇ょ粍涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallGroupById(String id) {
+        ardCallGroupUserMapper.clearArdCallGroupUsers(id);
+        return ardCallGroupMapper.deleteArdCallGroupById(id);
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java
new file mode 100644
index 0000000..a2962b4
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java
@@ -0,0 +1,167 @@
+package com.ruoyi.call.service.impl;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.DateUtils;
+
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.system.mapper.SysUserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.call.mapper.ArdCallGroupUserMapper;
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import com.ruoyi.call.service.IArdCallGroupUserService;
+
+import javax.annotation.Resource;
+
+/**
+ * 缇ょ粍鐢ㄦ埛涓棿Service涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Service
+public class ArdCallGroupUserServiceImpl implements IArdCallGroupUserService {
+    @Resource
+    private ArdCallGroupUserMapper ardCallGroupUserMapper;
+    @Resource
+    private SysUserMapper sysUserMapper;
+
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缇ょ粍鐢ㄦ埛涓棿
+     */
+    @Override
+    public ArdCallGroupUser selectArdCallGroupUserById(String id) {
+        return ardCallGroupUserMapper.selectArdCallGroupUserById(id);
+    }
+
+    /**
+     * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿鍒楄〃
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缇ょ粍鐢ㄦ埛涓棿
+     */
+    @Override
+    public List<ArdCallGroupUser> selectArdCallGroupUserList(ArdCallGroupUser ardCallGroupUser) {
+        return ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser);
+    }
+
+    /**
+     * 鏂板缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertArdCallGroupUser(ArdCallGroupUser ardCallGroupUser) {
+        ardCallGroupUser.setId(IdUtils.simpleUUID());
+        ardCallGroupUser.setUserId(SecurityUtils.getUserId());
+        ardCallGroupUser.setCreateBy(SecurityUtils.getUsername());
+        ardCallGroupUser.setCreateTime(DateUtils.getNowDate());
+        return ardCallGroupUserMapper.insertArdCallGroupUser(ardCallGroupUser);
+    }
+
+    /**
+     * 淇敼缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ardCallGroupUser 缇ょ粍鐢ㄦ埛涓棿
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallGroupUser(ArdCallGroupUser ardCallGroupUser) {
+        ardCallGroupUser.setUpdateBy(SecurityUtils.getUsername());
+        ardCallGroupUser.setUpdateTime(DateUtils.getNowDate());
+        return ardCallGroupUserMapper.updateArdCallGroupUser(ardCallGroupUser);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎缇ょ粍鐢ㄦ埛涓棿
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallGroupUserByIds(String[] ids) {
+        return ardCallGroupUserMapper.deleteArdCallGroupUserByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎缇ょ粍鐢ㄦ埛涓棿淇℃伅
+     *
+     * @param id 缇ょ粍鐢ㄦ埛涓棿涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallGroupUserById(String id) {
+        return ardCallGroupUserMapper.deleteArdCallGroupUserById(id);
+    }
+
+    @Override
+    public List<ArdCallGroup> getGroupListByUserId(String userId) {
+        return ardCallGroupUserMapper.getGroupListByUserId(userId);
+    }
+
+    /**
+     * 閭�璇风兢缁勭敤鎴�
+     *
+     * @param id      缇ょ粍涓婚敭
+     * @param userIds 缇ょ粍鐢ㄦ埛鏁扮粍闆嗗悎
+     * @return 缁撴灉
+     */
+    @Override
+    public int addGroupUser(String id, String[] userIds) {
+        ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser();
+        ardCallGroupUser.setGroupId(id);
+        Arrays.stream(userIds).forEach(userId -> {
+            ardCallGroupUser.setId(IdUtils.simpleUUID());
+            ardCallGroupUser.setCreateTime(DateUtils.getNowDate());
+            ardCallGroupUser.setUserId(userId);
+            ardCallGroupUserMapper.insertArdCallGroupUser(ardCallGroupUser);
+        });
+        return userIds.length;
+    }
+
+    /**
+     * 绉婚櫎缇ょ粍鐢ㄦ埛
+     *
+     * @param id      缇ょ粍涓婚敭
+     * @param userIds 缇ょ粍鐢ㄦ埛鏁扮粍闆嗗悎
+     * @return 缁撴灉
+     */
+    @Override
+    public int removeGroupUser(String id, String[] userIds) {
+        return ardCallGroupUserMapper.removeGroupUser(id, userIds);
+    }
+
+    @Override
+    public List<SysUser> notInGroupUsers(String groupId) {
+        //鑾峰彇骞冲彴鎵�鏈夌敤鎴�
+        List<SysUser> userList = sysUserMapper.selectUserList(new SysUser());
+        //鑾峰彇缇ょ粍鍐呯敤鎴�
+        ArdCallGroupUser ardCallGroupUser=new ArdCallGroupUser();
+        ardCallGroupUser.setGroupId(groupId);
+        List<ArdCallGroupUser> ardCallGroupUsers = ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser);
+        // 鎻愬彇groupList涓殑userId鍒颁竴涓猄et涓�
+        Set<String> groupUserIds = ardCallGroupUsers.stream()
+                .map(ArdCallGroupUser::getUserId)
+                .collect(Collectors.toSet());
+        // 杩囨护userList锛屽彧淇濈暀閭d簺userId涓嶅湪groupUserIds涓殑User瀵硅薄
+        List<SysUser> filteredUserList = userList.stream()
+                .filter(user -> !groupUserIds.contains(user.getUserId()))
+                .collect(Collectors.toList());
+        return filteredUserList;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java
new file mode 100644
index 0000000..8667806
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java
@@ -0,0 +1,152 @@
+package com.ruoyi.call.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.call.domain.*;
+import com.ruoyi.call.mapper.*;
+import com.ruoyi.common.utils.DateUtils;
+
+import com.ruoyi.common.utils.MessageUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.utils.websocket.util.WebSocketUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.call.service.IArdCallHistoryService;
+
+import javax.annotation.Resource;
+
+import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
+
+/**
+ * 浼氳瘽鍘嗗彶Service涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Service
+public class ArdCallHistoryServiceImpl implements IArdCallHistoryService {
+    @Resource
+    private ArdCallHistoryMapper ardCallHistoryMapper;
+    @Resource
+    private ArdCallSessionMapper ardCallSessionMapper;
+    @Resource
+    private ArdCallUnreadMessagesMapper ardCallUnreadMessagesMapper;
+    @Resource
+    private ArdCallGroupUserMapper ardCallGroupUserMapper;
+
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶
+     *
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 浼氳瘽鍘嗗彶
+     */
+    @Override
+    public ArdCallHistory selectArdCallHistoryById(String id) {
+        return ardCallHistoryMapper.selectArdCallHistoryById(id);
+    }
+
+    /**
+     * 鏌ヨ浼氳瘽鍘嗗彶鍒楄〃
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 浼氳瘽鍘嗗彶
+     */
+    @Override
+    public List<ArdCallHistory> selectArdCallHistoryList(ArdCallHistory ardCallHistory) {
+        return ardCallHistoryMapper.selectArdCallHistoryList(ardCallHistory);
+    }
+
+    /**
+     * 鏂板浼氳瘽鍘嗗彶
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertArdCallHistory(ArdCallHistory ardCallHistory) {
+        ardCallHistory.setId(IdUtils.simpleUUID());
+        ardCallHistory.setCreateTime(DateUtils.getNowDate());
+        ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(ardCallHistory.getSessionId());
+        if (ardCallSession.getType().equals("0")) {
+            //鏇存柊鍗曡亰鐢ㄦ埛鏈娑堟伅璁℃暟
+            ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallHistory.getSessionId(), ardCallHistory.getTargetId());
+            if (ardCallUnreadMessages == null) {
+                ardCallUnreadMessages = new ArdCallUnreadMessages();
+                ardCallUnreadMessages.setUserId(ardCallHistory.getTargetId());
+                ardCallUnreadMessages.setSessionId(ardCallHistory.getSessionId());
+                ardCallUnreadMessages.setUnreadCount(1);
+                ardCallUnreadMessagesMapper.insertArdCallUnreadMessages(ardCallUnreadMessages);
+            } else {
+                ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1);
+                ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
+            }
+            //websocket鍙戦�佺粰targetId
+            WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(ardCallHistory.getTargetId()),ardCallHistory.getContent());
+        } else {
+            //鏇存柊缇よ亰鐢ㄦ埛鏈娑堟伅璁℃暟
+            ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser();
+            ardCallGroupUser.setGroupId(ardCallHistory.getTargetId());
+            List<ArdCallGroupUser> ardCallGroupUsers = ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser);
+            ardCallGroupUsers.stream().forEach(groupUser -> {
+                if (!ardCallHistory.getUserId().equals(groupUser.getUserId())) {
+                    //瀵圭兢閲岄櫎浜嗚嚜宸卞鍏朵粬鐢ㄦ埛鏇存柊鏈娑堟伅
+                    ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallHistory.getSessionId(), groupUser.getUserId());
+                    if (ardCallUnreadMessages == null) {
+                        ardCallUnreadMessages = new ArdCallUnreadMessages();
+                        ardCallUnreadMessages.setUserId(groupUser.getUserId());
+                        ardCallUnreadMessages.setSessionId(ardCallHistory.getSessionId());
+                        ardCallUnreadMessages.setUnreadCount(1);
+                        ardCallUnreadMessagesMapper.insertArdCallUnreadMessages(ardCallUnreadMessages);
+                    } else {
+                        ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1);
+                        ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
+                    }
+                }
+                //websocket鍙戦�佺粰targetId
+                WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(groupUser.getUserId()),ardCallHistory.getContent());
+            });
+
+        }
+        return ardCallHistoryMapper.insertArdCallHistory(ardCallHistory);
+    }
+
+    /**
+     * 淇敼浼氳瘽鍘嗗彶
+     *
+     * @param ardCallHistory 浼氳瘽鍘嗗彶
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallHistory(ArdCallHistory ardCallHistory) {
+        ardCallHistory.setUpdateBy(SecurityUtils.getUsername());
+        ardCallHistory.setUpdateTime(DateUtils.getNowDate());
+        return ardCallHistoryMapper.updateArdCallHistory(ardCallHistory);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鍘嗗彶
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽鍘嗗彶涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallHistoryByIds(String[] ids) {
+        return ardCallHistoryMapper.deleteArdCallHistoryByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽鍘嗗彶淇℃伅
+     *
+     * @param id 浼氳瘽鍘嗗彶涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallHistoryById(String id) {
+        return ardCallHistoryMapper.deleteArdCallHistoryById(id);
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionServiceImpl.java
new file mode 100644
index 0000000..7043f4f
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionServiceImpl.java
@@ -0,0 +1,174 @@
+package com.ruoyi.call.service.impl;
+
+import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.domain.ArdCallSession;
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import com.ruoyi.call.mapper.ArdCallSessionMapper;
+import com.ruoyi.call.service.IArdCallGroupService;
+import com.ruoyi.call.service.IArdCallGroupUserService;
+import com.ruoyi.call.service.IArdCallSessionService;
+import com.ruoyi.call.service.IArdCallSessionUserService;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 瑙嗛浼氳瘽Service涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-03
+ */
+@Service
+public class ArdCallSessionServiceImpl implements IArdCallSessionService {
+    @Resource
+    private ArdCallSessionMapper ardCallSessionMapper;
+    @Resource
+    private IArdCallSessionUserService ardCallSessionUserService;
+    @Resource
+    private IArdCallGroupService ardCallGroupService;
+
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 瑙嗛浼氳瘽
+     */
+    @Override
+    public ArdCallSession selectArdCallSessionById(String id) {
+        return ardCallSessionMapper.selectArdCallSessionById(id);
+    }
+
+    /**
+     * 鏌ヨ瑙嗛浼氳瘽鍒楄〃
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 瑙嗛浼氳瘽
+     */
+    @Override
+    public List<ArdCallSession> selectArdCallSessionList(ArdCallSession ardCallSession) {
+        List<ArdCallSession> ardCallSessions = ardCallSessionMapper.selectArdCallSessionList(ardCallSession);
+        return ardCallSessions;
+    }
+
+    /**
+     * 鏂板瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    @Override
+    public String insertArdCallSession(ArdCallSession ardCallSession) {
+        ardCallSession.setId(IdUtils.simpleUUID());
+        ardCallSession.setCreateTime(DateUtils.getNowDate());
+        ardCallSessionMapper.insertArdCallSession(ardCallSession);
+        return ardCallSession.getId();
+    }
+
+    /**
+     * 淇敼瑙嗛浼氳瘽
+     *
+     * @param ardCallSession 瑙嗛浼氳瘽
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallSession(ArdCallSession ardCallSession) {
+        ardCallSession.setUpdateBy(SecurityUtils.getUsername());
+        ardCallSession.setUpdateTime(DateUtils.getNowDate());
+        return ardCallSessionMapper.updateArdCallSession(ardCallSession);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瑙嗛浼氳瘽
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑瑙嗛浼氳瘽涓婚敭
+     * @return 缁撴灉
+     */
+    @Transactional
+    @Override
+    public int
+    deleteArdCallSessionByIds(String[] ids) {
+        Arrays.stream(ids).forEach(id -> {
+            ardCallSessionUserService.deleteArdCallSessionUserBySessionId(id);
+        });
+        return ardCallSessionMapper.deleteArdCallSessionByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎瑙嗛浼氳瘽淇℃伅
+     *
+     * @param id 瑙嗛浼氳瘽涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallSessionById(String id) {
+        return ardCallSessionMapper.deleteArdCallSessionById(id);
+    }
+
+
+    /**
+     * 鑾峰彇浼氳瘽
+     *
+     * @param type     浼氳瘽绫诲瀷
+     * @param userId   浼氳瘽鍙戣捣鏂�
+     * @param targetId 浼氳瘽鎺ユ敹鏂�
+     * @return 缁撴灉
+     */
+    @Override
+    public String getSession(String type, String userId, String targetId) {
+        String sessionId = "";
+        if (type.equals("0")) {
+            //鍗曡亰
+            sessionId = ardCallSessionUserService.getSessionId(type, userId, targetId);
+            if (StringUtils.isEmpty(sessionId)) {
+                //鍒涘缓鍗曡亰鍙屾柟鐨勪細璇�
+                ArdCallSession ardCallSession = new ArdCallSession();
+                ardCallSession.setType(type);
+                sessionId = insertArdCallSession(ardCallSession);
+                ArdCallSessionUser ardCallSessionUser = new ArdCallSessionUser();
+                ardCallSessionUser.setSessionId(sessionId);
+                ardCallSessionUser.setUserId(userId);
+                ardCallSessionUser.setTargetId(targetId);
+                ardCallSessionUser.setType(type);
+                ardCallSessionUserService.insertArdCallSessionUser(ardCallSessionUser);//鍒涘缓涓诲彨鍏宠仈
+                ardCallSessionUser.setUserId(targetId);
+                ardCallSessionUser.setTargetId(userId);
+                ardCallSessionUserService.insertArdCallSessionUser(ardCallSessionUser);//鍒涘缓琚彨鍏宠仈
+            }
+        } else {
+            //缇よ亰
+            sessionId = ardCallSessionUserService.getGroupSessionId(type, targetId);
+            if (StringUtils.isEmpty(sessionId)) {
+                //鑻ヤ笉瀛樺湪缇よ亰session鐩存帴鍒欏垎鍒垱寤烘墍鏈夌兢鐢ㄦ埛鐨剆ession
+                ArdCallSession ardCallSession = new ArdCallSession();
+                ardCallSession.setType(type);
+                sessionId = insertArdCallSession(ardCallSession);
+
+                //鑾峰彇缇ょ敤鎴峰垪琛�
+                ArdCallGroup ardCallGroup = ardCallGroupService.selectArdCallGroupById(targetId);
+                if(ardCallGroup!=null)
+                {
+                    String finalSessionId = sessionId;
+                    ardCallGroup.getArdCallGroupUsers().stream().forEach(groupUser -> {
+                        ArdCallSessionUser ardCallSessionUser = new ArdCallSessionUser();
+                        ardCallSessionUser.setSessionId(finalSessionId);
+                        ardCallSessionUser.setType(type);
+                        ardCallSessionUser.setUserId(groupUser.getUserId());
+                        ardCallSessionUser.setTargetId(targetId);
+                        ardCallSessionUserService.insertArdCallSessionUser(ardCallSessionUser);
+                    });
+                }
+            } else {
+                //鑾峰彇鑷繁鐨剆ession
+                 sessionId = ardCallSessionUserService.getSessionId(type, userId, targetId);
+            }
+        }
+        return sessionId;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java
new file mode 100644
index 0000000..13c2fdf
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java
@@ -0,0 +1,147 @@
+package com.ruoyi.call.service.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.ruoyi.call.compare.ArdCallSessionUserComparator;
+import com.ruoyi.call.domain.ArdCallGroupUser;
+import com.ruoyi.call.domain.ArdCallHistory;
+import com.ruoyi.call.domain.ArdCallUnreadMessages;
+import com.ruoyi.call.mapper.ArdCallGroupUserMapper;
+import com.ruoyi.call.mapper.ArdCallHistoryMapper;
+import com.ruoyi.call.mapper.ArdCallUnreadMessagesMapper;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.call.mapper.ArdCallSessionUserMapper;
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import com.ruoyi.call.service.IArdCallSessionUserService;
+
+import javax.annotation.Resource;
+
+/**
+ * 浼氳瘽鐢ㄦ埛涓棿琛⊿ervice涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-04
+ */
+@Service
+public class ArdCallSessionUserServiceImpl implements IArdCallSessionUserService {
+    @Resource
+    private ArdCallSessionUserMapper ardCallSessionUserMapper;
+    @Resource
+    private ArdCallHistoryMapper ardCallHistoryMapper;
+    @Resource
+    private ArdCallSessionUserComparator ardCallSessionUserComparator;
+    @Resource
+    private ArdCallUnreadMessagesMapper ardCallUnreadMessagesMapper;
+
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    @Override
+    public ArdCallSessionUser selectArdCallSessionUserById(String id) {
+        return ardCallSessionUserMapper.selectArdCallSessionUserById(id);
+    }
+
+    /**
+     * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 浼氳瘽鐢ㄦ埛涓棿琛�
+     */
+    @Override
+    public List<ArdCallSessionUser> selectArdCallSessionUserList(ArdCallSessionUser ardCallSessionUser) {
+        //鑾峰彇鐢ㄦ埛鐨勪細璇�/鏈娑堟伅鏁伴噺/鏈�鍚庝竴鏉℃秷鎭�
+        List<ArdCallSessionUser> ardCallSessionUsers = ardCallSessionUserMapper.selectArdCallSessionUserList(ardCallSessionUser);
+        ardCallSessionUsers.stream().forEach(callSessionUser -> {
+            ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(callSessionUser.getSessionId(), ardCallSessionUser.getUserId());
+            if (ardCallUnreadMessages != null) {
+                callSessionUser.setUnReadCount(ardCallUnreadMessages.getUnreadCount());
+            } else {
+                callSessionUser.setUnReadCount(0);
+            }
+            //鑾峰彇鏈�鍚庝竴鏉℃秷鎭疄浣�
+            ArdCallHistory ardCallHistory = ardCallHistoryMapper.selectLastArdCallHistory(callSessionUser.getSessionId());
+            callSessionUser.setArdCallHistory(ardCallHistory);
+        });
+        //杩囨护鎺夋病鏈夊巻鍙茶褰曠殑浼氳瘽
+        ardCallSessionUsers = ardCallSessionUsers.stream().filter(obj -> obj.getArdCallHistory() != null).collect(Collectors.toList());
+        // 浣跨敤瀹氫箟鐨� ardCallSessionUserComparator 杩涜鎺掑簭
+        Collections.sort(ardCallSessionUsers, ardCallSessionUserComparator);
+        return ardCallSessionUsers;
+    }
+
+    /**
+     * 鏂板浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertArdCallSessionUser(ArdCallSessionUser ardCallSessionUser) {
+        ardCallSessionUser.setId(IdUtils.simpleUUID());
+        ardCallSessionUser.setCreateTime(DateUtils.getNowDate());
+        return ardCallSessionUserMapper.insertArdCallSessionUser(ardCallSessionUser);
+    }
+
+    /**
+     * 淇敼浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ardCallSessionUser 浼氳瘽鐢ㄦ埛涓棿琛�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallSessionUser(ArdCallSessionUser ardCallSessionUser) {
+        return ardCallSessionUserMapper.updateArdCallSessionUser(ardCallSessionUser);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallSessionUserByIds(String[] ids) {
+        return ardCallSessionUserMapper.deleteArdCallSessionUserByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎浼氳瘽鐢ㄦ埛涓棿琛ㄤ俊鎭�
+     *
+     * @param id 浼氳瘽鐢ㄦ埛涓棿琛ㄤ富閿�
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallSessionUserById(String id) {
+        return ardCallSessionUserMapper.deleteArdCallSessionUserById(id);
+    }
+
+
+    @Override
+    public String getSessionId(String type, String userId, String targetId) {
+        return ardCallSessionUserMapper.getSessionId(type, userId, targetId);
+    }
+
+    @Override
+    public int deleteArdCallSessionUserBySessionId(String sessionId) {
+        return ardCallSessionUserMapper.deleteArdCallSessionUserBySessionId(sessionId);
+    }
+
+    @Override
+    public String getGroupSessionId(String type, String targetId) {
+        return ardCallSessionUserMapper.getGroupSessionId(type, targetId);
+    }
+
+}
diff --git a/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallUnreadMessagesServiceImpl.java b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallUnreadMessagesServiceImpl.java
new file mode 100644
index 0000000..2a6644c
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallUnreadMessagesServiceImpl.java
@@ -0,0 +1,108 @@
+package com.ruoyi.call.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.common.utils.uuid.IdUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.call.mapper.ArdCallUnreadMessagesMapper;
+import com.ruoyi.call.domain.ArdCallUnreadMessages;
+import com.ruoyi.call.service.IArdCallUnreadMessagesService;
+
+import javax.annotation.Resource;
+
+/**
+ * 鏈娑堟伅Service涓氬姟灞傚鐞�
+ *
+ * @author ard
+ * @date 2024-07-06
+ */
+@Service
+public class ArdCallUnreadMessagesServiceImpl implements IArdCallUnreadMessagesService {
+    @Resource
+    private ArdCallUnreadMessagesMapper ardCallUnreadMessagesMapper;
+
+    /**
+     * 鏌ヨ鏈娑堟伅
+     *
+     * @param userId  鏈娑堟伅涓婚敭
+     * @return 鏈娑堟伅
+     */
+    @Override
+    public ArdCallUnreadMessages selectArdCallUnreadMessagesByUserId (String userId ) {
+        return ardCallUnreadMessagesMapper.selectArdCallUnreadMessagesByUserId (userId );
+    }
+
+    /**
+     * 鏌ヨ鏈娑堟伅鍒楄〃
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 鏈娑堟伅
+     */
+    @Override
+    public List<ArdCallUnreadMessages> selectArdCallUnreadMessagesList(ArdCallUnreadMessages ardCallUnreadMessages) {
+        return ardCallUnreadMessagesMapper.selectArdCallUnreadMessagesList(ardCallUnreadMessages);
+    }
+
+    /**
+     * 鏂板鏈娑堟伅
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages) {
+            return ardCallUnreadMessagesMapper.insertArdCallUnreadMessages(ardCallUnreadMessages);
+    }
+
+    /**
+     * 淇敼鏈娑堟伅
+     *
+     * @param ardCallUnreadMessages 鏈娑堟伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateArdCallUnreadMessages(ArdCallUnreadMessages ardCallUnreadMessages) {
+        return ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏈娑堟伅
+     *
+     * @param userId s 闇�瑕佸垹闄ょ殑鏈娑堟伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallUnreadMessagesByUserId(String[] userId) {
+        return ardCallUnreadMessagesMapper.deleteArdCallUnreadMessagesByUserId(userId);
+    }
+
+    /**
+     * 鍒犻櫎鏈娑堟伅淇℃伅
+     *
+     * @param userId  鏈娑堟伅涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteArdCallUnreadMessagesByUserId (String userId ) {
+        return ardCallUnreadMessagesMapper.deleteArdCallUnreadMessagesByUserId (userId );
+    }
+    /**
+     * 娓呴櫎鏈娑堟伅
+     *
+     * @param userId  娓呴櫎鏈娑堟伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int clearUnReadCount(String sessionId, String userId) {
+        ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(sessionId,userId);
+        if (ardCallUnreadMessages != null) {
+            ardCallUnreadMessages.setUnreadCount(0);
+            ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
+        }
+        return 1;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
index 82af738..5b1dcb4 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -1,26 +1,14 @@
 package com.ruoyi.utils.websocket.service;
 
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.app.position.domain.ArdAppPosition;
-import com.ruoyi.app.position.service.IArdAppPositionService;
-import com.ruoyi.app.position.service.impl.AppPositionPush;
 import com.ruoyi.app.position.service.impl.AppPositionPushService;
-import com.ruoyi.app.position.service.impl.ArdAppPositionServiceImpl;
-import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.utils.websocket.util.WebSocketUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Resource;
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @ClassName ChatServerEndpoint
@@ -40,11 +28,6 @@
         String message = "鐢ㄦ埛[" + userId + "] 鎴愬姛杩炴帴锛�";
         log.info("鐢ㄦ埛鐧诲綍锛�" + message);
         WebSocketUtils.sendMessage(session, message);
-        //region 鏃ф柟娉�
-//        //姣忎釜鐢ㄦ埛杩炴帴鏃讹紝鍚姩鍒濆鎵�鏈塧pp鐢ㄦ埛浣嶇疆鍙戦��
-//        AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList());
-//        AppPositionPush.initPushTask(userId,session,3000);
-        //endregion
     }
 
     @OnMessage
@@ -52,7 +35,7 @@
         log.info("鏀跺埌娑堟伅锛�" + message);
         Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId);
         WebSocketUtils.sendMessage(session, message);
-//        sendMessageAll("鐢ㄦ埛[" + userid + "] : " + message);
+        //sendMessageAll("鐢ㄦ埛[" + userid + "] : " + message);
         // 鏍规嵁鐢ㄦ埛鏂扮殑棰戠巼閲嶆柊璋冩暣瀹氭椂浠诲姟
         AppPositionPushService.messageHandler(userId,message);
     }
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallGroupMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallGroupMapper.xml
new file mode 100644
index 0000000..2d33545
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallGroupMapper.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallGroupMapper">
+
+    <resultMap type="ArdCallGroup" id="ArdCallGroupResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <collection property="ardCallGroupUsers" ofType="ArdCallGroupUser">
+            <result property="id"    column="id"    />
+            <result property="groupId"    column="group_id"    />
+            <result property="userId"    column="user_id"    />
+            <association property="sysUser" column="user_id" select="com.ruoyi.system.mapper.SysUserMapper.selectUserById"/>
+        </collection>
+    </resultMap>
+
+
+    <sql id="selectArdCallGroupVo">
+        select acg.*,acgu.* from ard_call_group acg
+        left join ard_call_group_user acgu on acg.id = acgu.group_id
+    </sql>
+
+    <select id="selectArdCallGroupList" parameterType="ArdCallGroup" resultMap="ArdCallGroupResult">
+        <include refid="selectArdCallGroupVo"/>
+        <where>
+            <if test="name != null  and name != ''"> and name like '%'||#{name}||'%'</if>
+        </where>
+    </select>
+
+    <select id="selectArdCallGroupById" parameterType="String" resultMap="ArdCallGroupResult">
+        <include refid="selectArdCallGroupVo"/>
+        where acg.id = #{id}
+    </select>
+
+    <insert id="insertArdCallGroup" parameterType="ArdCallGroup">
+        insert into ard_call_group
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="name != null">name,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="name != null">#{name},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateArdCallGroup" parameterType="ArdCallGroup">
+        update ard_call_group
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArdCallGroupById" parameterType="String">
+        delete from ard_call_group where id = #{id}
+    </delete>
+
+    <delete id="deleteArdCallGroupByIds" parameterType="String">
+        delete from ard_call_group where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallGroupUserMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallGroupUserMapper.xml
new file mode 100644
index 0000000..9df089b
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallGroupUserMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallGroupUserMapper">
+
+    <resultMap type="ArdCallGroupUser" id="ArdCallGroupUserResult">
+        <result property="id" column="id"/>
+        <result property="groupId" column="group_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+    <resultMap type="ArdCallGroup" id="ArdCallGroupResult">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+    <sql id="selectArdCallGroupUserVo">
+        select id, group_id, user_id, create_by, create_time, update_by, update_time
+        from ard_call_group_user
+    </sql>
+
+    <select id="selectArdCallGroupUserList" parameterType="ArdCallGroupUser" resultMap="ArdCallGroupUserResult">
+        <include refid="selectArdCallGroupUserVo"/>
+        <where>
+            <if test="groupId != null  and groupId != ''">and group_id = #{groupId}</if>
+            <if test="userId != null  and userId != ''">and user_id = #{userId}</if>
+        </where>
+    </select>
+
+    <select id="selectArdCallGroupUserById" parameterType="String" resultMap="ArdCallGroupUserResult">
+        <include refid="selectArdCallGroupUserVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertArdCallGroupUser" parameterType="ArdCallGroupUser">
+        insert into ard_call_group_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="groupId != null">group_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="groupId != null">#{groupId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateArdCallGroupUser" parameterType="ArdCallGroupUser">
+        update ard_call_group_user
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="groupId != null">group_id = #{groupId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArdCallGroupUserById" parameterType="String">
+        delete
+        from ard_call_group_user
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteArdCallGroupUserByIds" parameterType="String">
+        delete from ard_call_group_user where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <delete id="clearArdCallGroupUsers" parameterType="String">
+        delete
+        from ard_call_group_user
+        where group_id = #{groupId}
+    </delete>
+
+    <delete id="removeGroupUser">
+        delete from ard_call_group_user where group_id = #{groupId} and user_id in
+        <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+    <select id="getGroupListByUserId" resultMap="ArdCallGroupResult">
+        select acg.*
+        from ard_call_group_user acgu
+                 left join ard_call_group acg on acg.id = acgu.group_id
+        where acgu.user_id = #{userId}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallHistoryMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallHistoryMapper.xml
new file mode 100644
index 0000000..75c08a0
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallHistoryMapper.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallHistoryMapper">
+
+    <resultMap type="ArdCallHistory" id="ArdCallHistoryResult">
+        <result property="id" column="id"/>
+        <result property="type" column="type"/>
+        <result property="content" column="content"/>
+        <result property="sessionId" column="session_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="targetId" column="target_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectArdCallHistoryVo">
+        select id,
+               type,
+               content,
+               session_id,
+               user_id,
+               target_id,
+               create_by,
+               create_time,
+               update_by,
+               update_time
+        from ard_call_history
+    </sql>
+
+    <select id="selectArdCallHistoryList" parameterType="ArdCallHistory" resultMap="ArdCallHistoryResult">
+        <include refid="selectArdCallHistoryVo"/>
+        <where>
+            <if test="sessionId != null  and sessionId != ''">and session_id= #{sessionId}</if>
+            <if test="userId != null  and userId != ''">and user_id = #{userId}</if>
+            <if test="targetId != null  and targetId != ''">and target_id = #{targetId}</if>
+            <if test="type != null  and type != ''">and type = #{type}</if>
+            <if test="content != null  and content != ''">and content = #{content}</if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectArdCallHistoryById" parameterType="String" resultMap="ArdCallHistoryResult">
+        <include refid="selectArdCallHistoryVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertArdCallHistory" parameterType="ArdCallHistory">
+        insert into ard_call_history
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="type != null">type,</if>
+            <if test="content != null">content,</if>
+            <if test="sessionId != null">session_id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="targetId != null">target_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="type != null">#{type},</if>
+            <if test="content != null">#{content},</if>
+            <if test="sessionId != null">#{sessionId},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="targetId != null">#{targetId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateArdCallHistory" parameterType="ArdCallHistory">
+        update ard_call_history
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="sessionId != null">session_id = #{sessionId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArdCallHistoryById" parameterType="String">
+        delete
+        from ard_call_history
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteArdCallHistoryByIds" parameterType="String">
+        delete from ard_call_history where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectLastArdCallHistory" parameterType="String" resultType="ArdCallHistory">
+        select *
+        from ard_call_history
+        where session_id = #{sessionId}
+        order by create_time desc limit 1
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallSessionMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallSessionMapper.xml
new file mode 100644
index 0000000..899d30e
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallSessionMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallSessionMapper">
+
+    <resultMap type="ArdCallSession" id="ArdCallSessionResult">
+        <result property="id" column="id"/>
+        <result property="type" column="type"/>
+        <result property="userId" column="user_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectArdCallSessionVo">
+        select id, type, user_id, create_by, create_time, update_by, update_time
+        from ard_call_session
+    </sql>
+
+    <select id="selectArdCallSessionList" parameterType="ArdCallSession" resultMap="ArdCallSessionResult">
+        <include refid="selectArdCallSessionVo"/>
+        <where>
+            <if test="type != null  and type != ''">and type = #{type}</if>
+        </where>
+    </select>
+
+    <select id="selectArdCallSessionById" parameterType="String" resultMap="ArdCallSessionResult">
+        <include refid="selectArdCallSessionVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertArdCallSession" parameterType="ArdCallSession">
+        insert into ard_call_session
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="type != null">type,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="type != null">#{type},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateArdCallSession" parameterType="ArdCallSession">
+        update ard_call_session
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="type != null">type = #{type},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArdCallSessionById" parameterType="String">
+        delete
+        from ard_call_session
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteArdCallSessionByIds" parameterType="String">
+        delete from ard_call_session where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml
new file mode 100644
index 0000000..01cde9a
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallSessionUserMapper">
+
+    <resultMap type="ArdCallSessionUser" id="ArdCallSessionUserResult">
+        <result property="id" column="id"/>
+        <result property="sessionId" column="session_id"/>
+        <result property="type" column="type"/>
+        <result property="userId" column="user_id"/>
+        <result property="targetId" column="target_id"/>
+    </resultMap>
+
+    <sql id="selectArdCallSessionUserVo">
+        select id, session_id, type, user_id,target_id
+        from ard_call_session_user
+    </sql>
+
+    <select id="selectArdCallSessionUserList" parameterType="ArdCallSessionUser" resultMap="ArdCallSessionUserResult">
+        <include refid="selectArdCallSessionUserVo"/>
+        <where>
+            <if test="sessionId != null  and sessionId != ''">and session_id = #{sessionId}</if>
+            <if test="type != null  and type != ''">and type = #{type}</if>
+            <if test="userId != null  and userId != ''">and user_id = #{userId}</if>
+            <if test="targetId != null  and targetId != ''">and target_id = #{targetId}</if>
+        </where>
+    </select>
+
+    <select id="selectArdCallSessionUserById" parameterType="String" resultMap="ArdCallSessionUserResult">
+        <include refid="selectArdCallSessionUserVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertArdCallSessionUser" parameterType="ArdCallSessionUser">
+        insert into ard_call_session_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="sessionId != null">session_id,</if>
+            <if test="type != null">type,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="targetId != null">target_id,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="sessionId != null">#{sessionId},</if>
+            <if test="type != null">#{type},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="targetId != null">#{targetId},</if>
+        </trim>
+    </insert>
+
+    <update id="updateArdCallSessionUser" parameterType="ArdCallSessionUser">
+        update ard_call_session_user
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="sessionId != null">session_id = #{sessionId},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="targetId != null">target_id = #{targetId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteArdCallSessionUserById" parameterType="String">
+        delete
+        from ard_call_session_user
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteArdCallSessionUserByIds" parameterType="String">
+        delete from ard_call_session_user where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <select id="getSessionId" parameterType="String" resultType="String">
+        select session_id
+        from ard_call_session_user
+        where user_id = #{userId}
+          and target_id = #{targetId}
+          and type = #{type}
+    </select>
+    <select id="getGroupSessionId" parameterType="String" resultType="String">
+        select session_id
+        from ard_call_session_user
+        where target_id = #{targetId}
+        limit 1
+    </select>
+    <delete id="deleteArdCallSessionUserBySessionId" parameterType="String">
+        delete
+        from ard_call_session_user
+        where session_id = #{sessionId}
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallUnreadMessagesMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallUnreadMessagesMapper.xml
new file mode 100644
index 0000000..8708431
--- /dev/null
+++ b/ard-work/src/main/resources/mapper/call/ArdCallUnreadMessagesMapper.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.call.mapper.ArdCallUnreadMessagesMapper">
+
+    <resultMap type="ArdCallUnreadMessages" id="ArdCallUnreadMessagesResult">
+        <result property="userId" column="user_id "/>
+        <result property="sessionId" column="session_id"/>
+        <result property="unreadCount" column="unread_count"/>
+    </resultMap>
+
+    <sql id="selectArdCallUnreadMessagesVo">
+        select user_id, session_id, unread_count
+        from ard_call_unread_messages
+    </sql>
+
+    <select id="selectArdCallUnreadMessagesList" parameterType="ArdCallUnreadMessages"
+            resultMap="ArdCallUnreadMessagesResult">
+        <include refid="selectArdCallUnreadMessagesVo"/>
+        <where>
+            <if test="userId  != null  and userId != ''">and user_id = #{userId }</if>
+            <if test="sessionId != null  and sessionId != ''">and session_id = #{sessionId}</if>
+            <if test="unreadCount != null  and unreadCount != ''">and unread_count = #{unreadCount}</if>
+        </where>
+    </select>
+
+    <select id="selectArdCallUnreadMessagesByUserId" parameterType="String" resultMap="ArdCallUnreadMessagesResult">
+        <include refid="selectArdCallUnreadMessagesVo"/>
+        where user_id = #{userId }
+    </select>
+
+    <insert id="insertArdCallUnreadMessages" parameterType="ArdCallUnreadMessages">
+        insert into ard_call_unread_messages
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId  != null">user_id ,</if>
+            <if test="sessionId != null">session_id,</if>
+            <if test="unreadCount != null">unread_count,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId  != null">#{userId },</if>
+            <if test="sessionId != null">#{sessionId},</if>
+            <if test="unreadCount != null">#{unreadCount},</if>
+        </trim>
+        ON CONFLICT (session_id, user_id) DO NOTHING
+    </insert>
+
+    <update id="updateArdCallUnreadMessages" parameterType="ArdCallUnreadMessages">
+        update ard_call_unread_messages
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="unreadCount != null">unread_count = #{unreadCount},</if>
+        </trim>
+        where user_id = #{userId } and session_id = #{sessionId}
+    </update>
+
+    <delete id="deleteArdCallUnreadMessagesByUserId " parameterType="String">
+        delete
+        from ard_call_unread_messages
+        where user_id = #{userId }
+    </delete>
+
+    <delete id="deleteArdCallUnreadMessagesByUserId" parameterType="String">
+        delete from ard_call_unread_messages where user_id in
+        <foreach item="userId" collection="array" open="(" separator="," close=")">
+            #{userId }
+        </foreach>
+    </delete>
+    <select id="getUnreadMessage" resultType="ArdCallUnreadMessages">
+        select *
+        from ard_call_unread_messages
+        where user_id = #{targetId}
+          and session_id = #{sessionId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
index 85f1e4c..e1a9568 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
@@ -35,12 +35,14 @@
     /**
      * 鍒涘缓API
      */
-    @Bean
+    @Bean("baseApi")
     public Docket createRestApi()
     {
         return new Docket(DocumentationType.SWAGGER_2)
                 // 鏄惁鍚敤Swagger
                 .enable(true)
+                //鍒嗙粍鍚嶇О
+                .groupName("baseApi")
                 // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛�
                 .apiInfo(apiInfo())
                 // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず
@@ -57,7 +59,33 @@
                 .securityContexts(securityContexts())
                 .pathMapping("/");
     }
-
+    /**
+     * 鍒涘缓API-VideoCall
+     */
+    @Bean("VideoCallApi")
+    public Docket createRestApiVideoCall()
+    {
+        return new Docket(DocumentationType.SWAGGER_2)
+                // 鏄惁鍚敤Swagger
+                .enable(true)
+                //鍒嗙粍鍚嶇О
+                .groupName("VideoCallApi")
+                // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛�
+                .apiInfo(apiInfo())
+                // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず
+                .select()
+                // 鎵弿鎵�鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲�
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ
+                 .apis(RequestHandlerSelectors.basePackage("com.ruoyi.call.controller"))
+                // 鎵弿鎵�鏈� .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build()
+                /* 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token */
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts())
+                .pathMapping("/");
+    }
     /**
      * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻��
      */

--
Gitblit v1.9.3