From 016aa105789fca71e86cdbb0d26a181812f200f9 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: 星期三, 10 七月 2024 15:33:36 +0800
Subject: [PATCH] 优化:流媒体同步任务

---
 ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java                  |    9 
 ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java      |    9 
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java                      |    2 
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallHistoryServiceImpl.java       |   43 ++
 ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java                       |    6 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java                          |   49 ++
 ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java                          |    1 
 ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java                                 |    1 
 ard-work/src/main/java/com/ruoyi/media/domain/Items.java                                |    2 
 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java             |   26 -
 ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java  |  118 +++---
 ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java |   47 ++
 ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java                |   67 ++++
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java        |   31 -
 ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java  |   22 -
 ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java              |    2 
 ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java                          |    1 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java                          |  105 +++---
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java               |   16 
 ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java                        |   55 ++
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallGroupUserServiceImpl.java     |   19 +
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java             |   73 ++--
 ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java        |   31 +
 ard-work/src/main/java/com/ruoyi/media/domain/Paths.java                                |    3 
 ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java                              |   20 +
 ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java                        |    1 
 ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java                           |   20 
 ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java                          |    5 
 ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml                                  |    3 
 ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java         |   25 +
 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java               |   64 +--
 ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml                    |    5 
 ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java                   |   27 -
 ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java  |    5 
 ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java           |    2 
 ard-work/src/main/java/com/ruoyi/call/service/impl/ArdCallSessionUserServiceImpl.java   |   19 +
 36 files changed, 591 insertions(+), 343 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
index 2099754..3b5c939 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
@@ -31,19 +31,22 @@
 import com.ruoyi.common.core.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.UnknownHostException;
 import java.util.*;
 
 /**
  * app浣嶇疆Controller
- * 
+ *
  * @author ard
  * @date 2023-07-18
  */
 @Api(tags = "app浣嶇疆")
 @RestController
 @RequestMapping("/app/position")
-public class ArdAppPositionController extends BaseController
-{
+public class ArdAppPositionController extends BaseController {
     @Autowired
     private IArdAppPositionService ardAppPositionService;
     @Autowired
@@ -57,8 +60,7 @@
     @ApiOperation("鏌ヨapp浣嶇疆鍒楄〃")
 //    @PreAuthorize("@ss.hasPermi('app:position:list')")
     @GetMapping("/list")
-    public TableDataInfo list(ArdAppPosition ardAppPosition)
-    {
+    public TableDataInfo list(ArdAppPosition ardAppPosition) {
         startPage();
         List<ArdAppPosition> list = ardAppPositionService.selectArdAppPositionList(ardAppPosition);
         return getDataTable(list);
@@ -70,8 +72,7 @@
     @PreAuthorize("@ss.hasPermi('app:position:export')")
     @Log(title = "app浣嶇疆", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, ArdAppPosition ardAppPosition)
-    {
+    public void export(HttpServletResponse response, ArdAppPosition ardAppPosition) {
         List<ArdAppPosition> list = ardAppPositionService.selectArdAppPositionList(ardAppPosition);
         ExcelUtil<ArdAppPosition> util = new ExcelUtil<ArdAppPosition>(ArdAppPosition.class);
         util.exportExcel(response, list, "app浣嶇疆鏁版嵁");
@@ -82,8 +83,7 @@
      */
     @PreAuthorize("@ss.hasPermi('app:position:query')")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") String id)
-    {
+    public AjaxResult getInfo(@PathVariable("id") String id) {
         return success(ardAppPositionService.selectArdAppPositionById(id));
     }
 
@@ -94,8 +94,7 @@
 //    @PreAuthorize("@ss.hasPermi('app:position:add')")
     @Log(title = "app浣嶇疆", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody ArdAppPosition ardAppPosition)
-    {
+    public AjaxResult add(@RequestBody ArdAppPosition ardAppPosition) {
         return AjaxResult.success(ardAppPositionService.insertArdAppPosition(ardAppPosition));
     }
 
@@ -105,8 +104,7 @@
     @PreAuthorize("@ss.hasPermi('app:position:edit')")
     @Log(title = "app浣嶇疆", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody ArdAppPosition ardAppPosition)
-    {
+    public AjaxResult edit(@RequestBody ArdAppPosition ardAppPosition) {
         return toAjax(ardAppPositionService.updateArdAppPosition(ardAppPosition));
     }
 
@@ -115,19 +113,18 @@
      */
     @PreAuthorize("@ss.hasPermi('app:position:remove')")
     @Log(title = "app浣嶇疆", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable String[] ids)
-    {
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
         return toAjax(ardAppPositionService.deleteArdAppPositionByIds(ids));
     }
+
     /**
      * 鑾峰彇鎵�鏈夌敤鎴�
      */
     @ApiOperation("鑾峰彇鎵�鏈夌敤鎴�")
     @GetMapping("/getUserlist")
-    public AjaxResult getUserlist(Long deptId)
-    {
-        SysUser user=new SysUser();
+    public AjaxResult getUserlist(Long deptId) {
+        SysUser user = new SysUser();
         user.setDeptId(deptId);
         List<SysUser> list = sysUserService.selectUserList(user);
         return AjaxResult.success(list);
@@ -144,57 +141,50 @@
         List<SysUser> list = sysUserService.selectAllAppUserList(user);
         return AjaxResult.success(list);
     }
+
     /**
      * 鑾峰彇鎵�鏈塧pp鐢ㄦ埛
      */
     @ApiOperation("鑾峰彇鎵�鏈塧pp鐢ㄦ埛pc")
     @GetMapping("/getAppUserForPclist")
-    public AjaxResult getAppUserForPclist(Long deptId)
-    {
-        SysUser user=new SysUser();
+    public AjaxResult getAppUserForPclist(Long deptId) {
+        SysUser user = new SysUser();
         user.setDeptId(deptId);
         List<SysUser> list = sysUserService.selectAllAppUserList(user);
-        List<SysUser> onLineList=new ArrayList<>();
-        List<SysUser> offLineList=new ArrayList<>();
-        for(SysUser sysUser:list)
-        {
+        List<SysUser> onLineList = new ArrayList<>();
+        List<SysUser> offLineList = new ArrayList<>();
+        for (SysUser sysUser : list) {
             ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId());
-            if(ardAppPosition!=null) {
-                Map<String, Object> params =new HashMap<>();
+            if (ardAppPosition != null) {
+                Map<String, Object> params = new HashMap<>();
                 params.put("longitude", ardAppPosition.getLongitude());
                 params.put("latitude", ardAppPosition.getLatitude());
                 params.put("altitude", ardAppPosition.getAltitude());
                 params.put("bearing", ardAppPosition.getBearing());
                 sysUser.setParams(params);
             }
-            if(StringUtils.isNotNull(sysUser.getAppOnlineState()))
-            {
-                if(sysUser.getAppOnlineState().equals("1"))
-                {
+            if (StringUtils.isNotNull(sysUser.getAppOnlineState())) {
+                if (sysUser.getAppOnlineState().equals("1")) {
                     onLineList.add(sysUser);
-                }
-                else
-                {
+                } else {
                     offLineList.add(sysUser);
                 }
-            }
-            else
-            {
+            } else {
                 offLineList.add(sysUser);
             }
 
         }
-        Map<String,Object> onlineMap=new HashMap<>();
-        onlineMap.put("children",onLineList);
-        onlineMap.put("name","鍦ㄧ嚎鐢ㄦ埛("+onLineList.size()+")");
-        onlineMap.put("disabled",true);
-        onlineMap.put("id","onLine");
-        Map<String,Object> offlineMap=new HashMap<>();
-        offlineMap.put("children",offLineList);
-        offlineMap.put("name","绂荤嚎鐢ㄦ埛("+offLineList.size()+")");
-        offlineMap.put("disabled",true);
-        offlineMap.put("id","offLine");
-        List< Map<String,Object> > lists = new ArrayList<>();
+        Map<String, Object> onlineMap = new HashMap<>();
+        onlineMap.put("children", onLineList);
+        onlineMap.put("name", "鍦ㄧ嚎鐢ㄦ埛(" + onLineList.size() + ")");
+        onlineMap.put("disabled", true);
+        onlineMap.put("id", "onLine");
+        Map<String, Object> offlineMap = new HashMap<>();
+        offlineMap.put("children", offLineList);
+        offlineMap.put("name", "绂荤嚎鐢ㄦ埛(" + offLineList.size() + ")");
+        offlineMap.put("disabled", true);
+        offlineMap.put("id", "offLine");
+        List<Map<String, Object>> lists = new ArrayList<>();
         lists.add(onlineMap);
         lists.add(offlineMap);
         return AjaxResult.success(lists);
@@ -205,24 +195,28 @@
      */
     @ApiOperation("鑾峰彇鐢ㄦ埛璇︽儏")
     @GetMapping("/getUserInfo")
-    public AjaxResult getUserInfo(String userId)
-    {
+    public AjaxResult getUserInfo(String userId) {
         SysUser sysUser = sysUserService.selectUserById(userId);
         return AjaxResult.success(sysUser);
     }
+
     @PostMapping("/uploadFile")
     @ApiOperation("涓婁紶鏂囦欢")
-    public AjaxResult uploadFile(MultipartFile file,String type)
-    {
-        String url = MinioUtil.putObjectAndGetUrl("app",type, file);
-        return AjaxResult.success(url);
+    public AjaxResult uploadFile(MultipartFile file, String type) throws MalformedURLException, UnknownHostException {
+        String urlStr = MinioUtil.putObjectAndGetUrl("app", type, file);
+        URL url = new URL(urlStr);
+        // 鏇挎崲 https 涓� http锛屽苟灏嗕富鏈哄悕鍜岀鍙e彿鏇挎崲涓烘湰鍦板湴鍧�
+        String serverIpAddress = InetAddress.getLocalHost().getHostAddress();
+        // 鏋勫缓鏂扮殑 URL 瀵硅薄锛屼娇鐢� HTTPS 鍗忚
+        URL httpsUrl = new URL("https", serverIpAddress, url.getPort(), url.getFile());
+        return AjaxResult.success(httpsUrl);
     }
 
     @GetMapping("/getOnlinePCOrCommander")
     @ApiOperation("鏌ヨ鏈儴闂ㄥ湪绾縋C绔強鎸囨尌绔�")
     public AjaxResult getOnlinePCOrCommander() {
         String usersId = SecurityUtils.getUserId();
-        Map<String,List<SysUser>> result = ardAppPositionService.getOnlinePCOrCommander(usersId);
+        Map<String, List<SysUser>> result = ardAppPositionService.getOnlinePCOrCommander(usersId);
         return AjaxResult.success(result);
     }
 
@@ -230,10 +224,10 @@
     @ApiOperation("鍗曞叺绔煡鐪嬪凡閫氳繃瀹℃壒鐨勫湪绾挎寚鎸ョ浣嶇疆")
     public AjaxResult getOnlineCommanderPosition() {
         String soilderId = SecurityUtils.getUserId();
-        try{
-            List<Map<String,Object>> result = ardAppPositionService.getOnlineCommanderPosition(soilderId);
+        try {
+            List<Map<String, Object>> result = ardAppPositionService.getOnlineCommanderPosition(soilderId);
             return AjaxResult.success(result);
-        }catch(Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.error();
         }
@@ -241,11 +235,11 @@
 
     @PostMapping("/getAPPPositionByUserIdAndTime")
     @ApiOperation("鏌ョ湅APP鍘嗗彶浣嶇疆")
-    public AjaxResult getAPPPositionByUserIdAndTime(@RequestBody Map<String,String> para) {
-        try{
+    public AjaxResult getAPPPositionByUserIdAndTime(@RequestBody Map<String, String> para) {
+        try {
             List<ArdAppPosition> result = ardAppPositionService.getAPPPositionByUserIdAndTime(para);
             return AjaxResult.success(result);
-        }catch(Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return AjaxResult.error();
         }
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
index 00d1980..d60f957 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPushService.java
@@ -126,6 +126,10 @@
             Map<String, Object> map = JSONObject.parseObject(message, Map.class);
             if (map.size() > 0) {
                 Boolean enabled = (Boolean) map.get("enabled");
+                if(enabled==null)
+                {
+                    return;
+                }
                 if (enabled) {
                     //鍚姩鍏ㄥ眬鎺ㄩ��
                     List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.getAppPositionList());
@@ -172,24 +176,6 @@
                     AppPositionPushService.tempUserTimerMap.remove(userId);
                     AppPositionPushService.tempDataMap.remove(userId);
                 }
-                //region 鏃ф柟娉�
-//            Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();
-//            List<ArdAppPosition> positionList = AppPositionPush.initDataMap.get(userId);//鑾峰彇褰撳墠鐢ㄦ埛鐨勯粯璁ゅ彂閫佺殑鏁版嵁map
-//            if(frequency>0)
-//            {
-//                //鎺ユ敹鍒伴鐜囧ぇ浜�0锛屽睘浜庣敵璇峰紩瀵硷紝鑾峰彇闄ゅ紩瀵煎鐨勫叾浠朼pp鐢ㄦ埛鐨勪綅缃甃ist
-//                List<ArdAppPosition> appPositionList = positionList.stream()
-//                        .filter(obj -> !obj.getUserId().equals(uId))
-//                        .collect(Collectors.toList());
-//                dataMap.put(userId,appPositionList);
-//            }
-//           else {
-//                //鎺ユ敹鍒伴鐜囩瓑浜�0锛屽睘浜庨噴鏀惧紩瀵硷紝鑾峰彇鍒板叏閮╝pp鐢ㄦ埛鐨勪綅缃甃ist
-//                dataMap.put(userId,AppPositionPush.getAppPositionList());
-//            }
-//            AppPositionPush.initDataMap.putAll(dataMap);//鏇存柊鍒濆浼氳瘽榛樿鏁版嵁map
-//            AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//寮�鍚柊浠诲姟
-                //endregion
             }
         }
         catch (Exception ex)
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
index 5d83e2e..75dd55d 100644
--- a/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java
+++ b/ard-work/src/main/java/com/ruoyi/call/controller/ArdCallSessionUserController.java
@@ -57,11 +57,12 @@
     }
 
     /**
-     * 鑾峰彇浼氳瘽鐢ㄦ埛涓棿琛ㄨ缁嗕俊鎭�
+     * 鑾峰彇浼氳瘽璇︽儏
      */
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") String id) {
-        return success(ardCallSessionUserService.selectArdCallSessionUserById(id));
+    @ApiOperation("鑾峰彇浼氳瘽璇︽儏")
+    @GetMapping(value = "/{userId}/{sessionId}")
+    public AjaxResult getInfo(@PathVariable("userId") String userId,@PathVariable("sessionId") String sessionId) {
+        return success(ardCallSessionUserService.selectArdCallSessionUserBySesionId(userId,sessionId));
     }
 
     /**
diff --git a/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java b/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java
new file mode 100644
index 0000000..56cca2a
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java
@@ -0,0 +1,20 @@
+package com.ruoyi.call.dto;
+
+import lombok.Data;
+
+/**
+ * @ClassName:CallMessage
+ * @Description:
+ * @Author:ard
+ * @Date:2024骞�07鏈�08鏃�13:48
+ * @Version:1.0
+ **/
+@Data
+public class CallMessage {
+    String step;
+    String roomId;
+    String userId;
+    String targetId;
+    Integer mediaType;
+    Integer type;
+}
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
index fd7d26e..8e54a4e 100644
--- a/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java
+++ b/ard-work/src/main/java/com/ruoyi/call/mapper/ArdCallSessionUserMapper.java
@@ -19,7 +19,7 @@
      * @return 浼氳瘽鐢ㄦ埛涓棿琛�
      */
     public ArdCallSessionUser selectArdCallSessionUserById(String id);
-
+    public ArdCallSessionUser  selectArdCallSessionUserBySesionId(@Param("userId") String userId,@Param("sessionId") String sessionId);
     /**
      * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
      *
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
index f8aa9e5..9441907 100644
--- a/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java
+++ b/ard-work/src/main/java/com/ruoyi/call/service/IArdCallSessionUserService.java
@@ -18,7 +18,7 @@
      * @return 浼氳瘽鐢ㄦ埛涓棿琛�
      */
     public ArdCallSessionUser selectArdCallSessionUserById(String id);
-
+    public ArdCallSessionUser selectArdCallSessionUserBySesionId(String userId,String sessionId);
     /**
      * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
      *
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
index a2962b4..668544f 100644
--- 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
@@ -4,6 +4,8 @@
 import java.util.List;
 
 import com.ruoyi.call.domain.ArdCallGroup;
+import com.ruoyi.call.domain.ArdCallSessionUser;
+import com.ruoyi.call.mapper.ArdCallSessionUserMapper;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.DateUtils;
 
@@ -36,6 +38,8 @@
     private ArdCallGroupUserMapper ardCallGroupUserMapper;
     @Resource
     private SysUserMapper sysUserMapper;
+    @Resource
+    private ArdCallSessionUserMapper ardCallSessionUserMapper;
 
     /**
      * 鏌ヨ缇ょ粍鐢ㄦ埛涓棿
@@ -130,6 +134,19 @@
             ardCallGroupUser.setCreateTime(DateUtils.getNowDate());
             ardCallGroupUser.setUserId(userId);
             ardCallGroupUserMapper.insertArdCallGroupUser(ardCallGroupUser);
+            //閭�璇锋垚鍛樻垚鍔熷悗鍒涘缓session
+            //閫氳繃缇d鑾峰彇缇ession
+            String sessionId = ardCallSessionUserMapper.getGroupSessionId("1", id);
+            if (StringUtils.isNotEmpty(sessionId)) {
+                ArdCallSessionUser ardCallSessionUser = new ArdCallSessionUser();
+                ardCallSessionUser.setId(IdUtils.simpleUUID());
+                ardCallSessionUser.setType("1");
+                ardCallSessionUser.setSessionId(sessionId);
+                ardCallSessionUser.setUserId(userId);
+                ardCallSessionUser.setTargetId(id);
+                ardCallSessionUser.setCreateTime(DateUtils.getNowDate());
+                ardCallSessionUserMapper.insertArdCallSessionUser(ardCallSessionUser);
+            }
         });
         return userIds.length;
     }
@@ -151,7 +168,7 @@
         //鑾峰彇骞冲彴鎵�鏈夌敤鎴�
         List<SysUser> userList = sysUserMapper.selectUserList(new SysUser());
         //鑾峰彇缇ょ粍鍐呯敤鎴�
-        ArdCallGroupUser ardCallGroupUser=new ArdCallGroupUser();
+        ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser();
         ardCallGroupUser.setGroupId(groupId);
         List<ArdCallGroupUser> ardCallGroupUsers = ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser);
         // 鎻愬彇groupList涓殑userId鍒颁竴涓猄et涓�
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
index 8667806..82014e5 100644
--- 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
@@ -1,7 +1,10 @@
 package com.ruoyi.call.service.impl;
 
+import java.util.HashMap;
 import java.util.List;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.call.domain.*;
 import com.ruoyi.call.mapper.*;
 import com.ruoyi.common.utils.DateUtils;
@@ -13,12 +16,17 @@
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.call.service.IArdCallHistoryService;
 
 import javax.annotation.Resource;
+import javax.websocket.Session;
 
 import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
 
@@ -69,6 +77,8 @@
      */
     @Override
     public int insertArdCallHistory(ArdCallHistory ardCallHistory) {
+
+
         ardCallHistory.setId(IdUtils.simpleUUID());
         ardCallHistory.setCreateTime(DateUtils.getNowDate());
         ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(ardCallHistory.getSessionId());
@@ -86,7 +96,20 @@
                 ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
             }
             //websocket鍙戦�佺粰targetId
-            WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(ardCallHistory.getTargetId()),ardCallHistory.getContent());
+            // 鏋勫缓姝e垯琛ㄨ揪寮忔ā寮�
+            String regex = "^" + Pattern.quote(ardCallHistory.getTargetId()) + "_\\d+$";
+            Pattern pattern = Pattern.compile(regex);
+            Map<String, Object> messageMap = new HashMap<>();
+            messageMap.put("type", "message");
+            messageMap.put("message", JSON.toJSONString(ardCallHistory));
+            ONLINE_USER_SESSIONS.entrySet().stream()
+                    .filter(entry -> {
+                        Matcher matcher = pattern.matcher(entry.getKey());
+                        return matcher.matches();
+                    })
+                    .map(Map.Entry::getValue)
+                    .forEach(session -> WebSocketUtils.sendMessage(session, messageMap));
+
         } else {
             //鏇存柊缇よ亰鐢ㄦ埛鏈娑堟伅璁℃暟
             ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser();
@@ -106,9 +129,23 @@
                         ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1);
                         ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages);
                     }
+                    //websocket鍙戦�佺粰targetId
+                    // 鏋勫缓姝e垯琛ㄨ揪寮忔ā寮�
+                    String regex = "^" + Pattern.quote(groupUser.getUserId()) + "_\\d+$";
+                    Pattern pattern = Pattern.compile(regex);
+                    Map<String, Object> messageMap = new HashMap<>();
+                    messageMap.put("type", "message");
+                    messageMap.put("message", JSON.toJSONString(ardCallHistory));
+                    ONLINE_USER_SESSIONS.entrySet().stream()
+                            .filter(entry ->
+                            {
+                                Matcher matcher = pattern.matcher(entry.getKey());
+                                return matcher.matches();
+                            })
+                            .map(Map.Entry::getValue)
+                            .forEach(session -> WebSocketUtils.sendMessage(session, messageMap));
                 }
-                //websocket鍙戦�佺粰targetId
-                WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(groupUser.getUserId()),ardCallHistory.getContent());
+
             });
 
         }
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
index 13c2fdf..f6cdeea 100644
--- 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
@@ -54,6 +54,25 @@
         return ardCallSessionUserMapper.selectArdCallSessionUserById(id);
     }
 
+    @Override
+    public ArdCallSessionUser selectArdCallSessionUserBySesionId(String userId,String sessionId) {
+        ArdCallSessionUser ardCallSessionUser = ardCallSessionUserMapper.selectArdCallSessionUserBySesionId(userId,sessionId);
+        if(ardCallSessionUser!=null)
+        {
+            //鑾峰彇鏈鏁伴噺
+            ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallSessionUser.getSessionId(), ardCallSessionUser.getUserId());
+            if (ardCallUnreadMessages != null) {
+                ardCallSessionUser.setUnReadCount(ardCallUnreadMessages.getUnreadCount());
+            } else {
+                ardCallSessionUser.setUnReadCount(0);
+            }
+            //鑾峰彇鏈�鍚庝竴鏉℃秷鎭疄浣�
+            ArdCallHistory ardCallHistory = ardCallHistoryMapper.selectLastArdCallHistory(ardCallSessionUser.getSessionId());
+            ardCallSessionUser.setArdCallHistory(ardCallHistory);
+        }
+        return ardCallSessionUser;
+    }
+
     /**
      * 鏌ヨ浼氳瘽鐢ㄦ埛涓棿琛ㄥ垪琛�
      *
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
index 63e8ade..aea448b 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -85,7 +85,8 @@
         for (ArdCameras ardCamera : ardCameras) {
             redisCache.setCacheObject(getCacheKey(ardCamera.getId()), ardCamera);
         }
-
+        //娓呯┖娴佸獟浣�
+        vtduService.clearVtdu();
     }
 
     /**
@@ -95,7 +96,7 @@
      * @Param
      * @return
      */
-    @Scheduled(cron = "0 0/10 * * * ?")
+    //@Scheduled(cron = "0 0/10 * * * ?")
     public void clearRecordTemp()
     {
         log.debug("瀹氭椂娓呯悊鏈湴褰曞儚缂撳瓨鏂囦欢锛堣秴杩�1澶╋級");
diff --git a/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java b/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java
index e926827..eea7265 100644
--- a/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java
+++ b/ard-work/src/main/java/com/ruoyi/device/channel/service/IArdChannelService.java
@@ -65,4 +65,29 @@
      * @return 缁撴灉
      */
      public int deleteArdChannelByDeviceId(String deviceId);
+     /**
+      * @Author 鍒樿嫃涔�
+      * @Description 鑾峰彇2涓�氶亾鍒楄〃鐨勪氦闆�
+      * @Date   2024/7/10 9:38
+      * @Param
+      * @return
+      */
+    public List<ArdChannel> sameList(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList);
+    /**
+     * @Author 鍒樿嫃涔�
+     * @Description 鍙�2涓�氶亾鍒楄〃鐨勫樊闆�
+     * @Date   2024/7/10 9:39
+     * @Param
+     * @return
+     */
+    public List<ArdChannel> diffList(List<ArdChannel> firstArrayList, List<ArdChannel> secondArrayList);
+
+    /**
+     * @Author 鍒樿嫃涔�
+     * @Description 鍚屾閫氶亾淇℃伅
+     * @Date 2024/7/10 13:20
+     * @Param
+     * @return
+     */
+    public void asyncChannel(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java
index 44ec3b3..ce6565d 100644
--- a/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/channel/service/impl/ArdChannelServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.device.channel.service.impl;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.uuid.IdUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -8,6 +9,8 @@
 import com.ruoyi.device.channel.mapper.ArdChannelMapper;
 import com.ruoyi.device.channel.domain.ArdChannel;
 import com.ruoyi.device.channel.service.IArdChannelService;
+
+import javax.annotation.Resource;
 
 /**
  * 閫氶亾绠$悊Service涓氬姟灞傚鐞�
@@ -17,7 +20,7 @@
  */
 @Service
 public class ArdChannelServiceImpl implements IArdChannelService {
-    @Autowired
+    @Resource
     private ArdChannelMapper ardChannelMapper;
 
     /**
@@ -50,8 +53,8 @@
      */
     @Override
     public int insertArdChannel(ArdChannel ardChannel) {
-                ardChannel.setId(IdUtils.simpleUUID());
-            return ardChannelMapper.insertArdChannel(ardChannel);
+        ardChannel.setId(IdUtils.simpleUUID());
+        return ardChannelMapper.insertArdChannel(ardChannel);
     }
 
     /**
@@ -86,6 +89,7 @@
     public int deleteArdChannelById(String id) {
         return ardChannelMapper.deleteArdChannelById(id);
     }
+
     /**
      * 鍒犻櫎閫氶亾绠$悊淇℃伅
      *
@@ -96,4 +100,39 @@
     public int deleteArdChannelByDeviceId(String deviceId) {
         return ardChannelMapper.deleteArdChannelByDeviceId(deviceId);
     }
-}
+
+    //姹備袱涓璞ist鐨勪氦闆�
+    @Override
+    public List<ArdChannel> sameList(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList) {
+        List<ArdChannel> resultList = newArrayList.stream()
+                .filter(item -> oldArrayList.stream().map(e -> e.getChanNo())
+                        .collect(Collectors.toList()).contains(item.getChanNo()))
+                .collect(Collectors.toList());
+        return resultList;
+    }
+
+    //姹備袱涓璞ist鐨勫樊闆�
+    @Override
+    public List<ArdChannel> diffList(List<ArdChannel> firstArrayList, List<ArdChannel> secondArrayList) {
+        List<ArdChannel> resultList = firstArrayList.stream()
+                .filter(item -> !secondArrayList.stream().map(e -> e.getChanNo()).collect(Collectors.toList()).contains(item.getChanNo()))
+                .collect(Collectors.toList());
+        return resultList;
+    }
+
+    @Override
+    public void asyncChannel(List<ArdChannel> oldArrayList, List<ArdChannel> newArrayList) {
+        //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰
+        sameList(oldArrayList, newArrayList).stream().forEach(ardChannel -> {
+            updateArdChannel(ardChannel);
+        });
+        //闇�瑕佸垹闄ょ殑鏁版嵁
+        diffList(oldArrayList, newArrayList).stream().forEach(ardChannel -> {
+            deleteArdChannelById(ardChannel.getId());
+        });
+        //闇�瑕佹柊澧炵殑鏁版嵁
+        diffList(newArrayList, oldArrayList).stream().forEach(ardChannel -> {
+            insertArdChannel(ardChannel);
+        });
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java b/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
index 6b39d98..7232194 100644
--- a/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
+++ b/ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
@@ -193,13 +193,4 @@
         return getDataTable(mediaService.getPullStreamList());
     }
 
-    /**
-     * 閰嶇疆娴佸獟浣撳弬鏁�
-     */
-    @PostMapping("/setConfig")
-    @ApiOperation("閰嶇疆娴佸獟浣撳弬鏁�")
-    @ApiOperationSupport(order = 8)
-    public AjaxResult setConfig(@RequestBody Config config) {
-        return AjaxResult.success(mediaService.setConfig(config));
-    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java b/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java
index d61b746..4df6fb0 100644
--- a/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java
+++ b/ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java
@@ -114,32 +114,7 @@
      */
     @GetMapping(value = "/{name}/noPerm")
     public AjaxResult getInfoNoPerm(@PathVariable("name") String name) {
-        Vtdu vtdu = vtduService.selectVtduByName(name);
-        if (vtdu != null) {
-            String cameraId = name.split("_")[0];
-            Integer chanNo = Integer.valueOf(name.split("_")[1]);
-            CameraCmd cmd = new CameraCmd(cameraId, chanNo);
-            Map<String, Object> videoCompressionCfg = cameraSdkService.getVideoCompressionCfg(cmd);
-            String videoEncType = (String) videoCompressionCfg.get("videoEncType");
-            if (videoEncType != null) {
-                if (!videoEncType.equals("鏍囧噯h264")) {
-                    vtdu.setIsCode("1");
-                } else {
-                    vtdu.setIsCode("0");
-                }
-            }
-            else
-            {
-                vtdu.setIsCode("0");
-            }
-            //娴佸獟浣撲笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-            if (!mediaService.checkNameExist(name)) {
-                mediaService.addPath(name, vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
-            } else {
-                vtduService.updateVtdu(vtdu);
-            }
-        }
-        return success(vtdu);
+        return success(vtduService.selectVtduByName(name));
     }
     /**
      * 鏂板娴佸獟浣撶鐞�
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/Items.java b/ard-work/src/main/java/com/ruoyi/media/domain/Items.java
index bd4b340..19c5351 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/Items.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/Items.java
@@ -23,5 +23,5 @@
     private List<Readers> readers;
     private List<String> tracks;
     private Long bytesReceived;
-
+    private Date readyTime;
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java b/ard-work/src/main/java/com/ruoyi/media/domain/Paths.java
similarity index 78%
rename from ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java
rename to ard-work/src/main/java/com/ruoyi/media/domain/Paths.java
index 08fb974..d6108be 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/JsonsRoot.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/Paths.java
@@ -1,6 +1,5 @@
 package com.ruoyi.media.domain;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.util.List;
@@ -13,7 +12,7 @@
  * @Version: 1.0
  **/
 @Data
-public class JsonsRoot {
+public class Paths {
 
     private int itemCount;
 
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java
index 8969464..c9906d3 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/RtmpSession.java
@@ -15,7 +15,6 @@
 public class RtmpSession {
     private String name;
     private String id;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date created;
     private String remoteAddr;
     private String state;
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
index 8fb136a..629baac 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/RtspSession.java
@@ -16,7 +16,6 @@
 public class RtspSession {
     private String name;
     private String id;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date created;
     private String remoteAddr;
     private String state;
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java b/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java
index 7ddf8bb..76d7158 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/Vtdu.java
@@ -57,4 +57,5 @@
      * 鐩告満ID
      */
     String cameraId;
+
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java b/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java
index 5e27c27..b66dbbe 100644
--- a/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java
+++ b/ard-work/src/main/java/com/ruoyi/media/domain/WebrtcSession.java
@@ -15,7 +15,6 @@
 public class WebrtcSession {
     private String name;
     private String id;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date created;
     private String remoteAddr;
     private String state;
diff --git a/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java b/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java
index f491d55..e3377e2 100644
--- a/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java
+++ b/ard-work/src/main/java/com/ruoyi/media/mapper/VtduMapper.java
@@ -1,19 +1,19 @@
 package com.ruoyi.media.mapper;
 
 import java.util.List;
+
 import com.ruoyi.media.domain.Vtdu;
 
 /**
  * 娴佸獟浣撶鐞哅apper鎺ュ彛
- * 
+ *
  * @author ard
  * @date 2023-08-29
  */
-public interface VtduMapper 
-{
+public interface VtduMapper {
     /**
      * 鏌ヨ娴佸獟浣撶鐞�
-     * 
+     *
      * @param name 娴佸獟浣撶鐞嗕富閿�
      * @return 娴佸獟浣撶鐞�
      */
@@ -21,7 +21,7 @@
 
     /**
      * 鏌ヨ娴佸獟浣撶鐞嗗垪琛�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 娴佸獟浣撶鐞嗛泦鍚�
      */
@@ -29,7 +29,7 @@
 
     /**
      * 鏂板娴佸獟浣撶鐞�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 缁撴灉
      */
@@ -37,7 +37,7 @@
 
     /**
      * 淇敼娴佸獟浣撶鐞�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 缁撴灉
      */
@@ -50,13 +50,15 @@
      * @return 缁撴灉
      */
     public int deleteVtduByName(String name);
+
     /**
      * 鎵归噺鍒犻櫎娴佸獟浣撶鐞�
-     * 
+     *
      * @param names 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
      * @return 缁撴灉
      */
     public int deleteVtduByNames(String[] names);
+
     /**
      * 鍒犻櫎娴佸獟浣撶鐞嗕俊鎭�
      *
@@ -64,4 +66,6 @@
      * @return 缁撴灉
      */
     public int deleteVtduByCameraId(String cameraId);
+
+    public void clearVtdu();
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java b/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
index c5a3b28..360b7fe 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
@@ -55,10 +55,4 @@
 
     Boolean kickWebrtcSession(String sessionId);
 
-    /**
-     * 閰嶇疆娴佸獟浣撳弬鏁�
-     * 鍒樿嫃涔�
-     * 2023/10/13 15:17:57
-     */
-    public String setConfig(Config config);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java b/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java
index e5d0246..7775461 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/IVtduService.java
@@ -1,19 +1,20 @@
 package com.ruoyi.media.service;
 
 import java.util.List;
+
+import com.ruoyi.device.channel.domain.ArdChannel;
 import com.ruoyi.media.domain.Vtdu;
 
 /**
  * 娴佸獟浣撶鐞哠ervice鎺ュ彛
- * 
+ *
  * @author ard
  * @date 2023-08-29
  */
-public interface IVtduService 
-{
+public interface IVtduService {
     /**
      * 鏌ヨ娴佸獟浣撶鐞�
-     * 
+     *
      * @param name 娴佸獟浣撶鐞嗕富閿�
      * @return 娴佸獟浣撶鐞�
      */
@@ -21,7 +22,7 @@
 
     /**
      * 鏌ヨ娴佸獟浣撶鐞嗗垪琛�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 娴佸獟浣撶鐞嗛泦鍚�
      */
@@ -29,7 +30,7 @@
 
     /**
      * 鏂板娴佸獟浣撶鐞�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 缁撴灉
      */
@@ -37,7 +38,7 @@
 
     /**
      * 淇敼娴佸獟浣撶鐞�
-     * 
+     *
      * @param vtdu 娴佸獟浣撶鐞�
      * @return 缁撴灉
      */
@@ -45,7 +46,7 @@
 
     /**
      * 鎵归噺鍒犻櫎娴佸獟浣撶鐞�
-     * 
+     *
      * @param names 闇�瑕佸垹闄ょ殑娴佸獟浣撶鐞嗕富閿泦鍚�
      * @return 缁撴灉
      */
@@ -53,7 +54,7 @@
 
     /**
      * 鍒犻櫎娴佸獟浣撶鐞嗕俊鎭�
-     * 
+     *
      * @param name 娴佸獟浣撶鐞嗕富閿�
      * @return 缁撴灉
      */
@@ -66,4 +67,40 @@
      * @return 缁撴灉
      */
     public int deleteVtduByCameraId(String cameraId);
+
+    /**
+     * @Author 鍒樿嫃涔�
+     * @Description 娓呯┖娴佸獟浣撴墍鏈夋暟鎹�
+     * @Date   2024/7/10 13:21
+     * @Param
+     * @return
+     */
+    public void clearVtdu();
+
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 鑾峰彇2涓�氶亾鍒楄〃鐨勪氦闆�
+     * @Date 2024/7/10 9:38
+     * @Param
+     */
+    public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names);
+
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 鍙�2涓�氶亾鍒楄〃鐨勫樊闆�
+     * @Date 2024/7/10 9:39
+     * @Param
+     */
+    public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names);
+    public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names);
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 鍚屾娴佸獟浣�
+     * @Date 2024/7/10 13:18
+     * @Param
+     */
+    public void asyncVtdu(List<Vtdu> vtdus, List<String> names);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
index eee6a8b..de4f9fc 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
@@ -1,10 +1,8 @@
 package com.ruoyi.media.service.impl;
 
 import com.alibaba.fastjson2.JSONObject;
-import com.dtflys.forest.Forest;
 import com.dtflys.forest.exceptions.ForestNetworkException;
 import com.dtflys.forest.exceptions.ForestRuntimeException;
-import com.dtflys.forest.http.ForestRequest;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.media.domain.*;
 import com.ruoyi.media.service.IMediaService;
@@ -17,9 +15,7 @@
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import javax.xml.soap.SOAPEnvelope;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -34,22 +30,14 @@
 @Service
 @Slf4j(topic = "vtdu")
 @Order(2)
-public class MediaServiceImpl implements IMediaService, ApplicationRunner {
-    public static List<String> mediaNameList = new ArrayList<>();
+public class MediaServiceImpl implements IMediaService {
+
     @Resource
     MediaClient mediaClient;
 
     @Value("${mediamtx.host}")
     String mediamtxHost;
 
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        mediaNameList = getNameList();
-        if (mediaNameList.size() > 0) {
-            removePath(mediaNameList.toArray(new String[0]));
-            mediaNameList.clear();
-        }
-    }
 
     /**
      * 娣诲姞娴佸獟浣�
@@ -90,7 +78,8 @@
 
             if (!checkNameExist(name)) {
                 mediaClient.addPath(name, conf);
-                mediaNameList.add(name);
+            } else {
+                mediaClient.editPath(name, conf);
             }
 
             map.put("rtspUrl", rtspUrl);
@@ -188,7 +177,6 @@
         try {
             if (checkNameExist(name)) {
                 mediaClient.removePath(name);
-                mediaNameList.remove(name);
             }
         } catch (ForestRuntimeException ex) {
             log.error("绉婚櫎娴佸獟浣撳紓甯革細" + ex.getMessage());
@@ -197,9 +185,8 @@
 
     @Override
     public List<StreamInfo> paths() {
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         List<StreamInfo> pathInfoList = new ArrayList<>();
         for (Items item : items) {
             StreamInfo info = new StreamInfo();
@@ -261,9 +248,8 @@
     @Override
     public List<StreamInfo> getPushStreamList() {
         List<StreamInfo> PushStreamInfoList = new ArrayList<>();
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         for (Items item : items) {
             StreamInfo info = new StreamInfo();
             //ID
@@ -289,6 +275,7 @@
                 long bytesReceived = item.getBytesReceived();
                 String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
                 info.setUpTraffic(formatReceivedSize);
+                info.setBeginTime(item.getReadyTime());
             } else {
                 RtspSession rtspSession = getRtspSessionById(source.getId());
                 //浼氳瘽ID
@@ -336,9 +323,8 @@
     @Override
     public List<StreamInfo> getPullStreamList() {
         List<StreamInfo> PullStreamInfoList = new ArrayList<>();
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         for (Items item : items) {
             List<Readers> readers = item.getReaders();
             for (Readers reader : readers) {
@@ -375,6 +361,7 @@
                         PullStreamInfoList.add(info);
                         break;
                     case "webRTCSession":
+                    case "webrtcSession":
                         info.setSessionType("webrtc");
                         //webrtc鎾斁鍦板潃
                         url = "http://" + mediamtxHost + ":8889/" + name;
@@ -478,41 +465,32 @@
      */
     @Override
     public List<String> getNameList() {
+        List<String> nameList = new ArrayList<>();
         try {
-            String paths = mediaClient.paths();
-            JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
-            List<Items> items = jsonsRoot.getItems();
+            Paths paths = mediaClient.paths();
+            List<Items> items = paths.getItems();
             for (Items item : items) {
-                mediaNameList.add(item.getName());
+                nameList.add(item.getName());
             }
-        } catch (ForestNetworkException ex) {
-            log.error("鑾峰彇娴佸獟浣搉ame鍒楄〃寮傚父锛�" + ex.getMessage());
-        } catch (ForestRuntimeException ex) {
+        } catch (Exception ex) {
             log.error("鑾峰彇娴佸獟浣搉ame鍒楄〃寮傚父锛�" + ex.getMessage());
         }
-        return mediaNameList;
+        return nameList;
     }
 
     /**
-     * 妫�鏌ュ悕绉版槸鍚﹀瓨鍦�
+     * 妫�鏌ame鏄惁瀛樺湪
      * 鍒樿嫃涔�
      * 2023/10/19 15:18:45
      */
     @Override
     public boolean checkNameExist(String name) {
         boolean result = false;
-        if (mediaNameList.contains(name)) {
+        List<String> nameList = getNameList();
+        if (nameList.contains(name)) {
             result = true;
         }
         return result;
-    }
-
-    /**
-     * 閰嶇疆娴佸獟浣撳弬鏁�
-     */
-    @Override
-    public String setConfig(Config config) {
-        return mediaClient.setConfig(config);
     }
 
 
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java
index fcd2cab..ec24786 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/MediaV2ServiceImpl.java
@@ -4,7 +4,6 @@
 import com.dtflys.forest.exceptions.ForestNetworkException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.media.domain.*;
-import com.ruoyi.media.service.IMediaService;
 import com.ruoyi.media.service.IMediaV2Service;
 import com.ruoyi.utils.forest.MediaClient;
 import com.ruoyi.utils.tools.ArdTool;
@@ -73,9 +72,8 @@
         conf.setSourceProtocol("tcp");
 
         List<String> nameList = new ArrayList<>();
-        String paths = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         for (Items item : items) {
             nameList.add(item.getName());
         }
@@ -167,9 +165,8 @@
 
     @Override
     public List<StreamInfo> paths() {
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         List<StreamInfo> pathInfoList = new ArrayList<>();
         for (Items item : items) {
             StreamInfo info = new StreamInfo();
@@ -232,9 +229,8 @@
     @Override
     public List<StreamInfo> getPushStreamList() {
         List<StreamInfo> PushStreamInfoList = new ArrayList<>();
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         for (Items item : items) {
             StreamInfo info = new StreamInfo();
             //ID
@@ -306,9 +302,8 @@
     @Override
     public List<StreamInfo> getPullStreamList() {
         List<StreamInfo> PullStreamInfoList = new ArrayList<>();
-        String list = mediaClient.paths();
-        JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class);
-        List<Items> items = jsonsRoot.getItems();
+        Paths paths = mediaClient.paths();
+        List<Items> items = paths.getItems();
         for (Items item : items) {
             List<Readers> readers = item.getReaders();
             for (Readers reader : readers) {
@@ -451,9 +446,8 @@
     public List<String> getNameList() {
         List<String> nameList = new ArrayList<>();
         try {
-            String paths = mediaClient.paths();
-            JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
-            List<Items> items = jsonsRoot.getItems();
+            Paths paths = mediaClient.paths();
+            List<Items> items = paths.getItems();
             for (Items item : items) {
                 nameList.add(item.getName());
             }
diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
index 91e8103..36a8628 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
@@ -3,8 +3,10 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.device.channel.domain.ArdChannel;
 import com.ruoyi.media.service.IMediaService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -141,4 +143,69 @@
         }
         return vtduMapper.deleteVtduByCameraId(cameraId);
     }
+
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 娓呴櫎鎵�鏈夋祦濯掍綋鏁版嵁
+     * @Date 2024/7/10 13:31
+     * @Param
+     */
+    public void clearVtdu() {
+        vtduMapper.clearVtdu();
+    }
+
+
+    //闇�瑕佹洿鏂扮殑锛堟祦濯掍綋鍜寁tdu鐩稿悓锛�
+    @Override
+    public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names) {
+        return vtdus.stream().filter(vtdu -> names.contains(vtdu.getName())).collect(Collectors.toList());
+    }
+
+    //闇�瑕佸垹闄ょ殑锛堟祦濯掍綋涓鐨勶級
+    @Override
+    public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names) {
+        if (vtdus.size() >= names.size()) {
+            List<String> nameList = vtdus.stream().map(Vtdu::getName)
+                    .filter(item -> !names.contains(item))
+                    .collect(Collectors.toList());
+            return nameList;
+        } else {
+
+            List<String> nameList = names.stream().filter(item -> !vtdus.stream().map(Vtdu::getName).collect(Collectors.toList()).contains(item))
+                    .collect(Collectors.toList());
+            return nameList;
+        }
+
+    }
+
+    //闇�瑕佹柊澧炵殑锛堟祦濯掍綋涓皯鐨勶級
+    @Override
+    public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names) {
+        return vtdus.stream().filter(vtdu -> !names.contains(vtdu.getName())).collect(Collectors.toList());
+    }
+
+    /**
+     * @Author 鍒樿嫃涔�
+     * @Description  鍚屾鏈湴vtdu搴撳拰娴佸獟浣撲腑鐨勬暟鎹�
+     * @Date   2024/7/10 15:26
+     * @Param  vtdus vtdu搴撶殑闆嗗悎
+     * @Param  names 娴佸獟浣撶殑name闆嗗悎
+     * @return
+     */
+    @Override
+    public void asyncVtdu(List<Vtdu> vtdus, List<String> names) {
+        //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰
+        sameList(vtdus, names).stream().forEach(vtdu -> {
+            mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
+        });
+        //闇�瑕佸垹闄ょ殑鏁版嵁
+        diffListToDel(vtdus, names).stream().forEach(name -> {
+            mediaService.removePath(name);
+        });
+        //闇�瑕佹柊澧炵殑鏁版嵁
+        diffListToAdd(vtdus, names).stream().forEach(vtdu -> {
+            mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
+        });
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
index a187f3e..158a6ee 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/MediaClient.java
@@ -4,6 +4,9 @@
 import com.ruoyi.media.domain.Conf;
 import com.ruoyi.media.domain.Config;
 import com.ruoyi.media.domain.Items;
+import com.ruoyi.media.domain.Paths;
+
+import java.nio.file.Path;
 
 /**
  * @Description: mediamtx娴佸獟浣撳鎴风
@@ -42,7 +45,7 @@
      * 鏌ヨ鎵�鏈夎矾寰�
      */
     @Get("/paths/list")
-    public String paths();
+    public Paths paths();
 
     /**
      * 鏌ヨ鎵�鏈塺tsp浼氳瘽
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java
index e1326a9..269de7f 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/lib/ToolKits.java
@@ -488,7 +488,7 @@
 		int nBufferLen = 2*1024*1024;
 	    byte[] strBuffer = new byte[nBufferLen];
 
-	    if(netsdkapi.CLIENT_GetNewDevConfig( hLoginHandle, strCmd , nChn, strBuffer, nBufferLen,error,3000)) {
+	    if(netsdkapi.CLIENT_GetNewDevConfig( hLoginHandle, strCmd , nChn, strBuffer, nBufferLen,error,6000)) {
 	    	cmdObject.write();
 			if (configapi.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(),
 					cmdObject.size(), null)) {
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
index 645afae..631218d 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
@@ -81,7 +81,20 @@
 
         return result;
     }
-
+    public static String getChannelName(NetSDKLib.LLong hLoginHandle,Integer channel) {
+        String channelName = "";
+        NetSDKLib.AV_CFG_ChannelName channelTitleName = new NetSDKLib.AV_CFG_ChannelName();
+        if (ToolKits.GetDevConfig(hLoginHandle, channel, NetSDKLib.CFG_CMD_CHANNELTITLE, channelTitleName)) {
+            try {
+                channelName = new String(channelTitleName.szName, "GBK");
+            } catch (Exception e) {
+                System.err.println("getChannelName Failed!");
+            }
+        } else {
+            System.err.println("Get Channel Name Failed." + ToolKits.getErrorCodePrint());
+        }
+        return channelName;
+    }
     public static boolean GetDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
         boolean result = true;
         IntByReference error = new IntByReference(0);
@@ -128,6 +141,7 @@
                 stOut.read();
                 ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, arrCameraStatus);  // 灏哖ointer鎷疯礉鍒版暟缁勫唴瀛�
                 final String[] connectionState = {"鏈煡", "姝e湪杩炴帴", "宸茶繛鎺�", "鏈繛鎺�", "閫氶亾鏈厤缃�,鏃犱俊鎭�", "閫氶亾鏈夐厤缃�,浣嗚绂佺敤"};
+               log.debug(connectionState[arrCameraStatus[chanNo - 1].emConnectionState]);
                 if (connectionState[arrCameraStatus[chanNo - 1].emConnectionState].equals("宸茶繛鎺�")) {
                     log.debug("閫氶亾" + arrCameraStatus[chanNo - 1].nChannel + connectionState[arrCameraStatus[chanNo - 1].emConnectionState]);
                     bRet = true;
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
index ec6c8a3..3957ce6 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -112,9 +112,7 @@
                 log.error("璁惧[" + camera.getIp() + ":" + camera.getPort() + "]鐧诲綍澶辫触:" + getErrorCodePrint());
                 return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError()));
             }
-//            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
-//                GlobalVariable.loginMap.remove(camera.getId());
-//            }
+
             camera.setState("1");
             camera.setChanNum(m_stDeviceInfo.byChanNum);
             camera.setStartDChan(1);
@@ -123,7 +121,12 @@
             //鑾峰彇鏈�鏂伴�氶亾
             List<ArdChannel> ardChannelList = getChannels(camera);
             if (ardChannelList.size() > 0) {
+                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
+                ardChannelList.stream().forEach(channel -> {
+                    ardChannelService.insertArdChannel(channel);
+                });
                 camera.setChanNum(ardChannelList.size());
+                camera.setChannelList(ardChannelList);
                 ardCamerasService.updateArdCameras(camera);
                 //閰嶇疆鍒版祦濯掍綋
                 addVtdu(camera);
@@ -154,9 +157,6 @@
                 log.error("璁惧[" + camera.getIp() + ":" + camera.getPort() + "]鐧诲綍澶辫触:" + getErrorCodePrint());
                 return AjaxResult.warn(getErrorCodePrint());
             }
-//            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
-//                GlobalVariable.loginMap.remove(camera.getId());
-//            }
             camera.setState("1");
             camera.setChanNum(m_stDeviceInfo.byChanNum);
             camera.setStartDChan(1);
@@ -167,7 +167,12 @@
             //鑾峰彇鏈�鏂伴�氶亾
             List<ArdChannel> ardChannelList = getChannels(camera);
             if (ardChannelList.size() > 0) {
+                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
+                ardChannelList.stream().forEach(channel -> {
+                    ardChannelService.insertArdChannel(channel);
+                });
                 camera.setChanNum(ardChannelList.size());
+                camera.setChannelList(ardChannelList);
                 ardCamerasService.updateArdCameras(camera);
                 //閰嶇疆鍒版祦濯掍綋
                 addVtdu(camera);
@@ -183,17 +188,17 @@
 
     //娣诲姞鍒版祦濯掍綋
     private void addVtdu(ArdCameras camera) {
-        for (int i = 1; i < camera.getChanNum() + 1; i++) {
-            String name = camera.getId() + "_" + i;
-            String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + i + "&subtype=0";
-            Vtdu vtdu = vtduService.selectVtduByName(name);
-            if (vtdu != null) {
+        camera.getChannelList().stream().forEach(channel -> {
+            String name = camera.getId() + "_" + channel.getChanNo();
+            String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";
+             //鍒犻櫎娴佸獟浣�
+            if (vtduService.selectVtduByName(name) != null) {
                 vtduService.deleteVtduByName(name);
             }
             //娣诲姞鍒版祦濯掍綋
-            CameraCmd cmd = new CameraCmd(camera.getId(), i);
+            CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
             Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
-            vtdu = new Vtdu();
+            Vtdu vtdu = new Vtdu();
             if (videoCompressionCfg.get("videoEncType") != null) {
                 if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) {
                     vtdu.setIsCode("0");//榛樿涓嶈浆鐮�
@@ -204,11 +209,11 @@
                 vtdu.setIsCode("0");//榛樿涓嶈浆鐮�
             }
             vtdu.setRtspSource(rtspSource);
-            vtdu.setName(camera.getId() + "_" + i);
+            vtdu.setName(name);
             vtdu.setMode("1");//榛樿CPU杞В鐮�
             vtdu.setCameraId(camera.getId());
             vtduService.insertVtdu(vtdu);
-        }
+        });
     }
 
     //鍒涘缓寮曞闃熷垪
@@ -226,23 +231,12 @@
 
     //鑾峰彇閫氶亾
     public List<ArdChannel> getChannels(ArdCameras camera) {
-        ardChannelService.deleteArdChannelByDeviceId(camera.getId());
         LLong loginId = new LLong(camera.getLoginId());
         List<ArdChannel> ardChannelList = new ArrayList<>();
         for (int i = 1; i < camera.getChanNum() + 1; i++) {
             ArdChannel channel = new ArdChannel();
-            NetSDKLib.AV_CFG_ChannelName av_cfg_channelName = new NetSDKLib.AV_CFG_ChannelName();
-            boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName);
-            if (!b) {
-                log.error("鑾峰彇閰嶇疆澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint());
-                // return AjaxResult.warn(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError()));
-            }
-            String chanName = "";
-            try {
-                chanName = new String(av_cfg_channelName.szName, "GBK").trim();
-            } catch (UnsupportedEncodingException e) {
-                e.printStackTrace();
-            }
+            String chanName = ConfigModule.getChannelName(loginId, i - 1).trim();
+            log.debug("鑾峰彇閫氶亾鍚嶇О锛�" + chanName);
             channel.setName(chanName.equals("") ? "閫氶亾" + i : chanName);
             channel.setDeviceId(camera.getId());
             channel.setChanNo(i);
@@ -253,7 +247,6 @@
                 }
             }
             ardChannelList.add(channel);
-            ardChannelService.insertArdChannel(channel);
         }
         return ardChannelList;
     }
@@ -411,9 +404,9 @@
         float t = (float) dh_ptz_location_info.nPTZTilt / 10 * -1;
         String nPTZTilt = df.format(t < 0 ? t + 360 : t);
         String nPTZZoom = df.format((float) dh_ptz_location_info.nPTZZoom);
-        ptzMap.put("p" , nPTZPan);
-        ptzMap.put("t" , nPTZTilt);
-        ptzMap.put("z" , nPTZZoom);
+        ptzMap.put("p", nPTZPan);
+        ptzMap.put("t", nPTZTilt);
+        ptzMap.put("z", nPTZZoom);
         return AjaxResult.success(ptzMap);
     }
 
@@ -591,7 +584,7 @@
             //    return false;
             //}
             log.debug("鏈湴褰曞儚寮�濮�");
-            return AjaxResult.success("鏈湴褰曞儚寮�濮�" , lRealHandle);
+            return AjaxResult.success("鏈湴褰曞儚寮�濮�", lRealHandle);
         } catch (Exception ex) {
             log.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage());
             return AjaxResult.error("鏈湴褰曞儚寮�濮嬪紓甯�" + ex.getMessage());
@@ -796,7 +789,7 @@
                 log.error("璁剧疆ptz澶辫触:" + getErrorCodePrint());
                 return AjaxResult.warn("璁剧疆ptz澶辫触:" + getErrorCodePrint());
             }
-            return AjaxResult.success("寮曞鐩爣浣嶇疆鎴愬姛",correctPitch);
+            return AjaxResult.success("寮曞鐩爣浣嶇疆鎴愬姛", correctPitch);
         } catch (Exception ex) {
             log.error("寮曞鐩爣浣嶇疆寮傚父:" + ex.getMessage());
             return AjaxResult.error("寮曞鐩爣浣嶇疆寮傚父:" + ex.getMessage());
@@ -1110,10 +1103,10 @@
                 int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight;
                 String resolution = nWidth + "*" + nHeight;
                 float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate;
-                map.put("resolution" , resolution);//鍒嗚鲸鐜�
-                map.put("videoBitrate" , String.valueOf(nBitRate));//姣旂壒鐜�
-                map.put("videoEncType" , videoEncType);//缂栫爜
-                map.put("nFrameRate" , String.valueOf(nFrameRate));//甯х巼
+                map.put("resolution", resolution);//鍒嗚鲸鐜�
+                map.put("videoBitrate", String.valueOf(nBitRate));//姣旂壒鐜�
+                map.put("videoEncType", videoEncType);//缂栫爜
+                map.put("nFrameRate", String.valueOf(nFrameRate));//甯х巼
             }
         } catch (Exception ex) {
             log.error("鍙栫爜娴佸帇缂╁弬鏁板紓甯�:" + ex.getMessage());
@@ -1140,8 +1133,8 @@
             float nAngelH = (float) dh_out_ptz_view_range_status.nAngelH / 10;
             float nAngelV = (float) dh_out_ptz_view_range_status.nAngelV / 10;
             Map<String, Object> map = getPtz(cmd);//鑾峰彇ptz
-            map.put("fHorFieldAngle" , nAngelH);// 姘村钩瑙嗗満瑙�
-            map.put("fVerFieldAngle" , nAngelV);// 鍨傜洿瑙嗗満瑙�
+            map.put("fHorFieldAngle", nAngelH);// 姘村钩瑙嗗満瑙�
+            map.put("fVerFieldAngle", nAngelV);// 鍨傜洿瑙嗗満瑙�
             return AjaxResult.success(map);
         } catch (Exception ex) {
             log.error("鑾峰彇浜戝彴鍙鍩熷紓甯�" + ex.getMessage());
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
index ed90621..0269e99 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -144,10 +144,6 @@
                     log.debug("Set fExceptionCallBack function successfully!");
                 }
             }
-
-//            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
-//                GlobalVariable.loginMap.remove(camera.getId());
-//            }
             GlobalVariable.loginMap.put(camera.getId(), lUserID);
             GlobalVariable.loginCameraMap.put(lUserID, camera);
             camera.setLoginId(lUserID);
@@ -163,6 +159,10 @@
             //鑾峰彇鏈�鏂伴�氶亾
             List<ArdChannel> cameraChannelList = getChannels(camera);
             if (cameraChannelList.size() > 0) {
+                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
+                cameraChannelList.stream().forEach(channel -> {
+                    ardChannelService.insertArdChannel(channel);
+                });
                 camera.setChannelList(cameraChannelList);
                 camera.setChanNum(cameraChannelList.size());
                 ardCamerasService.updateArdCameras(camera);
@@ -251,9 +251,7 @@
                     }
                 }
             }
-//            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
-//                GlobalVariable.loginMap.remove(camera.getId());
-//            }
+
             GlobalVariable.loginMap.put(camera.getId(), lUserID);
             GlobalVariable.loginCameraMap.put(lUserID, camera);
             camera.setLoginId(lUserID);
@@ -269,6 +267,10 @@
             //鑾峰彇鏈�鏂伴�氶亾
             List<ArdChannel> cameraChannelList = getChannels(camera);
             if (cameraChannelList.size() > 0) {
+                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
+                cameraChannelList.stream().forEach(channel -> {
+                    ardChannelService.insertArdChannel(channel);
+                });
                 camera.setChannelList(cameraChannelList);
                 camera.setChanNum(cameraChannelList.size());
                 ardCamerasService.updateArdCameras(camera);
@@ -300,17 +302,17 @@
     //娣诲姞鍒版祦濯掍綋
     private void addVtdu(ArdCameras camera) {
         try {
-            for (ArdChannel channel : camera.getChannelList()) {
+            camera.getChannelList().stream().forEach(channel->{
                 String name = camera.getId() + "_" + channel.getChanNo();
                 String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
-                Vtdu vtdu = vtduService.selectVtduByName(name);
-                if (vtdu != null) {
+                //鍒犻櫎娴佸獟浣�
+                if (vtduService.selectVtduByName(name) != null) {
                     vtduService.deleteVtduByName(name);
                 }
                 //娣诲姞鍒版祦濯掍綋
-                vtdu = new Vtdu();
+                Vtdu vtdu = new Vtdu();
                 vtdu.setRtspSource(rtspSource);
-                vtdu.setName(camera.getId() + "_" + channel.getChanNo());
+                vtdu.setName(name);
                 CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
                 Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
                 if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) {
@@ -321,7 +323,7 @@
                 vtdu.setMode("1");//榛樿CPU杞В鐮�
                 vtdu.setCameraId(camera.getId());
                 vtduService.insertVtdu(vtdu);
-            }
+            });
         } catch (Exception ex) {
             log.error("閫氶亾娣诲姞鍒版祦濯掍綋寮傚父锛�" + ex.getMessage());
         }
@@ -1849,8 +1851,6 @@
         //鑾峰彇閫氶亾
         List<ArdChannel> channelList = new ArrayList<>();
         try {
-            //鍒犻櫎绠$悊閫氶亾
-            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
             IntByReference ibrBytesReturned = new IntByReference(0);//鑾峰彇IP鎺ュ叆閰嶇疆鍙傛暟
             HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40();
             m_strIpparaCfg.write();
@@ -1891,7 +1891,6 @@
                     }
                     channelList.add(channel);
                 }
-                ardChannelService.insertArdChannel(channel);
             }
         } catch (Exception ex) {
             log.error("鑾峰彇IP閫氶亾寮傚父:" + ex.getMessage());
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 5b1dcb4..c988db1 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,6 +1,8 @@
 package com.ruoyi.utils.websocket.service;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.app.position.service.impl.AppPositionPushService;
+import com.ruoyi.call.dto.CallMessage;
 import com.ruoyi.utils.websocket.util.WebSocketUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -9,6 +11,11 @@
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
 
 /**
  * @ClassName ChatServerEndpoint
@@ -33,11 +40,27 @@
     @OnMessage
     public void onMessage(@PathParam("userId") String userId, String message) {
         log.info("鏀跺埌娑堟伅锛�" + message);
-        Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId);
-        WebSocketUtils.sendMessage(session, message);
-        //sendMessageAll("鐢ㄦ埛[" + userid + "] : " + message);
+//        Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId);
+//        WebSocketUtils.sendMessage(session, message);
+        Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class);
+        if (((String) messageMap.get("type")).equals("callMessage")) {
+            String msg = (String) messageMap.get("message");
+            CallMessage callMessage = JSONObject.parseObject(msg, CallMessage.class);
+            if (callMessage != null && callMessage.getType().equals(0)) {
+                String regex = "^" + Pattern.quote(callMessage.getTargetId()) + "_\\d+$";
+                Pattern pattern = Pattern.compile(regex);
+                ONLINE_USER_SESSIONS.entrySet().stream()
+                        .filter(entry -> {
+                            Matcher matcher = pattern.matcher(entry.getKey());
+                            return matcher.matches();
+                        })
+                        .map(Map.Entry::getValue)
+                        .forEach(session -> WebSocketUtils.sendMessage(session, message));
+            }
+
+        }
         // 鏍规嵁鐢ㄦ埛鏂扮殑棰戠巼閲嶆柊璋冩暣瀹氭椂浠诲姟
-        AppPositionPushService.messageHandler(userId,message);
+        AppPositionPushService.messageHandler(userId, message);
     }
 
     @OnClose
diff --git a/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml
index 01cde9a..5eee9a0 100644
--- a/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml
+++ b/ard-work/src/main/resources/mapper/call/ArdCallSessionUserMapper.xml
@@ -27,11 +27,14 @@
         </where>
     </select>
 
+    <select id="selectArdCallSessionUserBySesionId" parameterType="String" resultMap="ArdCallSessionUserResult">
+        <include refid="selectArdCallSessionUserVo"/>
+        where session_id = #{sessionId} and user_id = #{userId}
+    </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=",">
diff --git a/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml b/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml
index 41de89d..95d7b5d 100644
--- a/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml
+++ b/ard-work/src/main/resources/mapper/vtdu/VtduMapper.xml
@@ -118,4 +118,7 @@
         from vtdu
         where camera_id = #{cameraId}
     </delete>
+    <delete id="clearVtdu">
+        delete from vtdu
+    </delete>
 </mapper>
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java
index 6363c40..3bc7376 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/PushTask.java
@@ -17,6 +17,7 @@
 
 import javax.annotation.Resource;
 import java.util.*;
+
 import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
 
 /**
@@ -36,6 +37,7 @@
     ICameraSdkService cameraSdkService;
     @Resource
     IGlobalAlarmService globalAlarmService;
+
     /**
      * @鎻忚堪 瀹氭椂鎺ㄩ�佹墍鏈夋姤璀︾殑鐐逛綅鏁伴噺
      * @鍙傛暟 []
@@ -66,62 +68,61 @@
      */
     public void ptzPush() {
         try {
-            List<Map<String, Object>> list = new ArrayList<>();
-            List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
-            if (Objects.size() > 0) {
-                for (Object obj : Objects) {
-                    ArdCameras camera = (ArdCameras) obj;
-                    if (!GlobalVariable.loginMap.containsKey(camera.getId()))//鍙帹閫侀娆$櫥褰曟垚鍔熺殑鐩告満
-                    {
-                        continue;
-                    }
-                    if(!"1".equals(camera.getGdtype()))
-                    {
-                        continue;
-                    }
-                    CameraCmd cmd = new CameraCmd();
-                    cmd.setCameraId(camera.getId());
-                    cmd.setChanNo(1);
-                    cmd.setOperator(camera.getOperatorId());
-                    //鎺ㄩ�佸湪绾跨殑鐩告満
-                    boolean onLine = cameraSdkService.isOnLine(cmd);
-                    if(!onLine)
-                    {
-                        continue;
-                    }
-                    AjaxResult ajaxResult = cameraSdkService.getGisInfo(cmd);
-                    Map<String, Object> ptz = (Map<String, Object>)ajaxResult.get("data");
-                    if (StringUtils.isNull(ptz)) {
-                        continue;
-                    }
-                    SysUser sysUser = redisCache.getCacheObject(CacheConstants.USER_LIST_KEY + camera.getOperatorId());
-                    if (StringUtils.isNotNull(sysUser)) {
-                        cmd.setOperatorZh(sysUser.getNickName());
-                    } else {
-                        cmd.setOperatorZh(cmd.getOperator());
-                    }
+            if (ONLINE_USER_SESSIONS.size() > 0) {
+                List<Map<String, Object>> list = new ArrayList<>();
+                List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
+                if (Objects.size() > 0) {
+                    for (Object obj : Objects) {
+                        ArdCameras camera = (ArdCameras) obj;
+                        if (!GlobalVariable.loginMap.containsKey(camera.getId()))//鍙帹閫侀娆$櫥褰曟垚鍔熺殑鐩告満
+                        {
+                            continue;
+                        }
+                        if (!"1".equals(camera.getGdtype())) {
+                            continue;
+                        }
+                        CameraCmd cmd = new CameraCmd();
+                        cmd.setCameraId(camera.getId());
+                        cmd.setChanNo(1);
+                        cmd.setOperator(camera.getOperatorId());
+                        //鎺ㄩ�佸湪绾跨殑鐩告満
+                        boolean onLine = cameraSdkService.isOnLine(cmd);
+                        if (!onLine) {
+                            continue;
+                        }
+                        AjaxResult ajaxResult = cameraSdkService.getGisInfo(cmd);
+                        Map<String, Object> ptz = (Map<String, Object>) ajaxResult.get("data");
+                        if (StringUtils.isNull(ptz)) {
+                            continue;
+                        }
+                        SysUser sysUser = redisCache.getCacheObject(CacheConstants.USER_LIST_KEY + camera.getOperatorId());
+                        if (StringUtils.isNotNull(sysUser)) {
+                            cmd.setOperatorZh(sysUser.getNickName());
+                        } else {
+                            cmd.setOperatorZh(cmd.getOperator());
+                        }
 
-                    //鑾峰彇鏃堕棿宸�
-                    long secDatePoor = 0;
-                    if (StringUtils.isNotNull(camera.getOperatorExpired())) {
-                        secDatePoor = DateUtils.getSecDatePoor(camera.getOperatorExpired(), new Date());
-                        if (secDatePoor < 0) {
-                            secDatePoor = 0;
+                        //鑾峰彇鏃堕棿宸�
+                        long secDatePoor = 0;
+                        if (StringUtils.isNotNull(camera.getOperatorExpired())) {
+                            secDatePoor = DateUtils.getSecDatePoor(camera.getOperatorExpired(), new Date());
+                            if (secDatePoor < 0) {
+                                secDatePoor = 0;
+                            }
+                        }
+
+                        if (ptz.size() > 0) {
+                            ptz.put("cameraId", cmd.getCameraId());
+                            ptz.put("usernameZh", cmd.getOperatorZh());
+                            ptz.put("operatorId", cmd.getOperator());//涓婇攣鐢ㄦ埛id
+                            ptz.put("expirationRemainingSecond", secDatePoor);
+                            ptz.put("longitude", camera.getLongitude());
+                            ptz.put("latitude", camera.getLatitude());
+                            ptz.put("altitude", camera.getAltitude());
+                            list.add(ptz);
                         }
                     }
 
-                    if (ptz.size() > 0) {
-                        ptz.put("cameraId", cmd.getCameraId());
-                        ptz.put("usernameZh", cmd.getOperatorZh());
-                        ptz.put("operatorId", cmd.getOperator());//涓婇攣鐢ㄦ埛id
-                        ptz.put("expirationRemainingSecond", secDatePoor);
-                        ptz.put("longitude",camera.getLongitude());
-                        ptz.put("latitude",camera.getLatitude());
-                        ptz.put("altitude",camera.getAltitude());
-                        list.add(ptz);
-                    }
-                }
-                if (ONLINE_USER_SESSIONS.size() > 0) {
                     Map<String, Object> sendMap = new HashMap<>();
                     sendMap.put("10000", list);
                     WebSocketUtils.sendMessageAll(sendMap);
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
index d6ed2c3..4e7d4ff 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -3,12 +3,16 @@
 
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.device.camera.domain.ArdCameras;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.camera.factory.CameraSDK;
 import com.ruoyi.device.camera.factory.CameraSDKFactory;
 import com.ruoyi.device.camera.service.IArdCamerasService;
 import com.ruoyi.device.camera.service.ICameraSdkService;
+import com.ruoyi.device.channel.domain.ArdChannel;
+import com.ruoyi.device.channel.service.IArdChannelService;
+import com.ruoyi.device.channel.service.impl.ArdChannelServiceImpl;
 import com.ruoyi.media.domain.Vtdu;
 import com.ruoyi.media.service.IMediaService;
 import com.ruoyi.media.service.IVtduService;
@@ -21,6 +25,8 @@
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 鍚屾浠诲姟
@@ -43,6 +49,10 @@
     IMediaService mediaService;
     @Resource
     private ICameraSdkService cameraSdkService;
+    @Resource
+    private CameraSDKFactory cameraSDKFactory;
+    @Resource
+    private IArdChannelService ardChannelService;
     /**
      * 鍚屾鐩告満鍦ㄧ嚎鐘舵��
      * 鍒樿嫃涔�
@@ -69,6 +79,34 @@
             }
         } catch (Exception ex) {
             log.error("鍚屾鐩告満鍦ㄧ嚎鐘舵�佸紓甯�:" + ex.getMessage());
+        }
+    }
+
+    /**
+     * @Author 鍒樿嫃涔�
+     * @Description 鍚屾nvr閫氶亾鐘舵�佸疄鏃跺悓姝ユ祦濯掍綋
+     * @Date 2024/7/9 16:01
+     */
+    public void nvrChannelState() {
+        //鑾峰彇鎵�鏈塶vr璁惧
+        List<ArdCameras> ardCamerasList = iArdCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
+        if (ardCamerasList.size() > 0) {
+            ardCamerasList.stream()
+                    .filter(ardCameras -> ardCameras.getGdtype().equals("2"))
+                    .forEach(ardCameras -> {
+                        //閫氳繃SDK鑾峰彇NVR褰撳墠閫氶亾
+                        CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(ardCameras.getFactory());
+                        List<ArdChannel> ardChannelList = cameraSDK.getChannels(ardCameras);
+                        //鍚屾閫氶亾琛�
+                        ArdChannel ardChannel=new ArdChannel();
+                        ardChannel.setDeviceId(ardCameras.getId());
+                        List<ArdChannel> ardChannelListDb = ardChannelService.selectArdChannelList(ardChannel);
+                        ardChannelService.asyncChannel(ardChannelListDb,ardChannelList);
+                        //鍚屾娴佸獟浣撹〃
+
+                        //鍚屾娴佸獟浣揳pi
+
+                    });
         }
     }
 
@@ -105,13 +143,8 @@
      * 2023/10/13 14:13:53
      */
     public void vtdu() {
-
-        List<Vtdu> vtdus = vtduService.selectVtduList(new Vtdu());
-        for (Vtdu vtdu : vtdus) {
-            boolean nameExist = mediaService.checkNameExist(vtdu.getName());
-            if (!nameExist) {
-                mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
-            }
-        }
+        List<String> nameList = mediaService.getNameList();
+        List<Vtdu> vtduList = vtduService.selectVtduList(new Vtdu());
+        vtduService.asyncVtdu(vtduList,nameList);
     }
 }

--
Gitblit v1.9.3