liusuyi
2024-07-17 2ab35000026ccd58238e6a504b1b5f79f8c262c3
优化
已重命名1个文件
已修改13个文件
已删除6个文件
14573 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/mapper/ArdCamerasMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/mediamtx/mediamtx.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/20230320091649.nb3 补丁 | 查看 | 原始文档 | blame | 历史
sql/20230905public.sql 3337 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/init20240715.sql 6611 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/public.sql 1812 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/quartz.sql 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry-vue-pg.sql 1731 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_20220822.sql 692 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/call/dto/CallMessage.java
@@ -2,6 +2,8 @@
import lombok.Data;
import java.util.List;
/**
 * @ClassName:CallMessage
 * @Description:
@@ -15,6 +17,7 @@
    String roomId;
    String userId;
    String targetId;
    List<String> targetIds;
    Integer mediaType;
    Integer type;
}
ard-work/src/main/java/com/ruoyi/device/camera/mapper/ArdCamerasMapper.java
@@ -6,6 +6,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.device.camera.domain.ArdCameras;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -90,7 +92,6 @@
     */
    public ArdCameras checkCameraIpAndPortUnique(@Param("ip") String ip, @Param("port")Integer port);
    //public List<Map<String, Object>> getCamerasByDeptId(@Param("deptId")Long deptId,@Param("userId")String userId);
    public List<Map<String, Object>> getCamerasByDeptId(@Param("deptIdList")List<Long> deptIdList,@Param("userId")String userId);
    public Boolean getCameraOperationByCameraId(@Param("id") String id, @Param("userId") String userId);
@@ -98,4 +99,13 @@
    public List<Map<String, Object>> getChannelByCameraId(String id);
    public List<ArdCameras> findTowerCamerasBySubAndOwnDeptIds(@Param("deptIdList")List<Long> deptIdList);
    /**
     * @Author åˆ˜è‹ä¹‰
     * @Description é‡ç½®æ‰€æœ‰ç›¸æœºç™»å½•id为-1
     * @Date   2024/7/17 10:17
     * @Param
     * @return
     */
    public int resetCameraLoginId();
}
ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java
@@ -138,4 +138,7 @@
    public Boolean getCameraOperationByCameraId(String id,String userId);
    public Map<String,Object> getChannelByCameraId(String id);
    //将所有相机登录id置为-1
    public int resetCameraLoginId();
}
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -760,4 +760,9 @@
            }
        }
    }
    @Override
    public int resetCameraLoginId() {
        return ardCamerasMapper.resetCameraLoginId();
    }
}
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -41,7 +41,7 @@
 * @Date: 2023å¹´10月16日15:21:01
 **/
@Service
@Slf4j(topic = "SDK")
@Slf4j(topic = "sdk")
public class CameraSdkServiceImpl implements ICameraSdkService, ApplicationRunner {
    @Resource
    private IArdCamerasService ardCamerasService;
@@ -64,10 +64,10 @@
    @Override
    public void run(ApplicationArguments args) {
        try {
            log.info("初始化登录相机开始");
            ardCamerasService.resetCameraLoginId();
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            for (ArdCameras camera : ardCameras) {
                asyncLogin(camera);
            }
            ardCameras.stream().forEach(ardCamera -> asyncLogin(ardCamera));
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
@@ -586,17 +586,17 @@
                    case 1:
                        if (ardWellGuideCamera.getP1() != null) {
                            ptzMap = new HashMap<>();
                            ptzMap.put("p" , ardWellGuideCamera.getP1());
                            ptzMap.put("t" , ardWellGuideCamera.getT1());
                            ptzMap.put("z" , ardWellGuideCamera.getZ1());
                            ptzMap.put("p", ardWellGuideCamera.getP1());
                            ptzMap.put("t", ardWellGuideCamera.getT1());
                            ptzMap.put("z", ardWellGuideCamera.getZ1());
                        }
                        break;
                    case 2:
                        if (ardWellGuideCamera.getP2() != null) {
                            ptzMap = new HashMap<>();
                            ptzMap.put("p" , ardWellGuideCamera.getP2());
                            ptzMap.put("t" , ardWellGuideCamera.getT2());
                            ptzMap.put("z" , ardWellGuideCamera.getZ2());
                            ptzMap.put("p", ardWellGuideCamera.getP2());
                            ptzMap.put("t", ardWellGuideCamera.getT2());
                            ptzMap.put("z", ardWellGuideCamera.getZ2());
                        }
                        break;
@@ -624,9 +624,9 @@
        }
        //按井坐标开始引导
        if (!guideTargetPosition(cmd).get("code").equals(200)) {
            return AjaxResult.warn("井坐标引导失败" , "cameraId:" + cameraId);
            return AjaxResult.warn("井坐标引导失败", "cameraId:" + cameraId);
        }
        return AjaxResult.success("井坐标引导成功" , "cameraId:" + cameraId);
        return AjaxResult.success("井坐标引导成功", "cameraId:" + cameraId);
    }
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/module/ConfigModule.java
@@ -90,10 +90,10 @@
            try {
                channelName = new String(channelTitleName.szName, "GBK");
            } catch (Exception e) {
                System.err.println("getChannelName Failed!");
                log.error("getChannelName Failed!");
            }
        } else {
            System.err.println("Get Channel Name Failed." + ToolKits.getErrorCodePrint());
            log.error("Get Channel Name Failed." + ToolKits.getErrorCodePrint());
        }
        return channelName;
    }
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -160,7 +160,7 @@
            camera.setState("1");
            camera.setChanNum(m_stDeviceInfo.byChanNum);
            camera.setStartChan(1);
            camera.setLoginId((Long) loginId.longValue());
            camera.setLoginId(loginId.longValue());
            ardCamerasService.updateArdCameras(camera);
            GlobalVariable.loginMap.put(camera.getId(), loginId);
@@ -208,7 +208,7 @@
    //获取通道
    public List<ArdChannel> getChannels(ArdCameras camera) {
        if (camera.getLoginId().equals(-1)) {
        if (camera.getLoginId() < 0) {
            return new ArrayList<>();
        }
        LLong loginId = new LLong(camera.getLoginId());
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -1831,9 +1831,6 @@
    //获取IP通道
    public List<ArdChannel> getChannels(ArdCameras camera) {
        if (camera.getLoginId().equals(-1)) {
            return new ArrayList<>();
        }
        //获取通道
        List<ArdChannel> channelList = new ArrayList<>();
        try {
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.app.position.service.impl.AppPositionPushService;
import com.ruoyi.call.dto.CallMessage;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -11,7 +12,10 @@
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -39,38 +43,60 @@
    @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);
        log.debug("收到消息:" + message);
        Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class);
        if (((String) messageMap.get("type")).equals("callMessage")) {
        if (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));
                WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
            }
            //群聊
            if (callMessage != null && callMessage.getType().equals(1)) {
                String step = callMessage.getStep();
                switch (step) {
                    case "joinRoom":
                        Set<String> userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        userSet.add(callMessage.getUserId());
                        WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                        WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        break;
                    case "inviteRoom":
                        List<String> targetIds = callMessage.getTargetIds();
                        targetIds.stream().forEach(targetId -> {
                            WebSocketUtils.sendMessagePrefix(targetId, message);
                        });
                        break;
                    case "leaveRoom":
                        userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        if (userSet.size() > 0) {
                            userSet.remove(callMessage.getUserId());
                            WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                            WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        }
                        break;
                    default:
                        WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
                        break;
                }
            }
        }
        // æ ¹æ®ç”¨æˆ·æ–°çš„频率重新调整定时任务
        AppPositionPushService.messageHandler(userId, message);
    }
    @OnClose
    public void onClose(@PathParam("userId") String userId, Session session) {
        //当前的Session ç§»é™¤
        WebSocketUtils.ONLINE_USER_SESSIONS.remove(userId);
        //并且通知其他人当前用户已经离开聊天室了
        String message = "用户[" + userId + "] æ–­å¼€è¿žæŽ¥ï¼";
        //sendMessage(session,message);
        log.info("消息:" + message);
        //从房间中移除用户
        WebSocketUtils.ROOM_USER_SET.values().stream().forEach(userSet -> userSet.remove(userId));
        try {
            session.close();
            AppPositionPushService.stopHandler(userId);
@@ -88,5 +114,4 @@
        }
        log.info("Throwable msg " + throwable.getMessage());
    }
}
ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java
@@ -2,14 +2,15 @@
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.WebSocketSession;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @ClassName WebSocketUtils
@@ -23,6 +24,8 @@
    // å­˜å‚¨ websocket session
    public static final Map<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>();
    //存储房间
    public static final ConcurrentHashMap<String, Set<String>> ROOM_USER_SET = new ConcurrentHashMap<>();
    /**
     * @param session ç”¨æˆ· session
@@ -36,15 +39,16 @@
        if (basic == null) {
            return;
        }
        synchronized(session) {
        synchronized (session) {
            try {
                log.debug("发送消息:"+message);
                log.debug("发送消息:" + message);
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                log.error("sendMessage IOException ",e);
                log.error("sendMessage IOException ", e);
            }
        }
    }
    /**
     * @param session ç”¨æˆ· session
     * @param message å‘送内容
@@ -57,14 +61,15 @@
        if (basic == null) {
            return;
        }
        synchronized(session) {
        synchronized (session) {
            try {
                session.getBasicRemote().sendText(new JSONObject(message).toString());
            } catch (IOException e) {
                log.error("sendMessage IOException ",e);
                log.error("sendMessage IOException ", e);
            }
        }
    }
    public static void sendMessage(Session session, List message) {
        if (session == null) {
            return;
@@ -73,27 +78,63 @@
        if (basic == null) {
            return;
        }
        synchronized(session) {
        synchronized (session) {
            try {
                session.getBasicRemote().sendText( String.join(", ", message));
                session.getBasicRemote().sendText(String.join(", ", message));
            } catch (IOException e) {
                log.error("sendMessage IOException ",e);
                log.error("sendMessage IOException ", e);
            }
        }
    }
    /**
     * æŽ¨é€æ¶ˆæ¯åˆ°å…¶ä»–客户端
     *
     * @param message
     */
    public static void sendMessageAll(String message) {
        ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message));
    }
    /**
     * æŽ¨é€æ¶ˆæ¯åˆ°å…¶ä»–客户端
     *
     * @param message
     */
    public static void sendMessageAll(Map message) {
        JSONObject jsonObject=new JSONObject(message);
        JSONObject jsonObject = new JSONObject(message);
        ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, jsonObject.toString()));
    }
    /**
     * æŽ¨é€æ¶ˆæ¯åˆ°å½“前房间的其他客户端
     *
     * @param message
     */
    public static void sendRoomMessage(String roomId, String message) {
        Set<String> userSet = ROOM_USER_SET.getOrDefault(roomId, new HashSet<>());
        userSet.stream().forEach(userId -> {
            String regex = "^" + Pattern.quote(userId) + "_\\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));
        });
    }
    /**
     * @Author åˆ˜è‹ä¹‰
     * @Description  å‘送消息给userId_前缀的人
     * @Date   2024/7/16 10:24
     * @Param
     * @return
     */
    public static void sendMessagePrefix(String targetId, String message) {
        String regex = "^" + Pattern.quote(targetId) + "_\\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));
    }
}
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml
@@ -413,4 +413,7 @@
        and tower_id is not null
        order by create_time desc
    </select>
    <update id="resetCameraLoginId">
        update ard_cameras set login_id = -1
    </update>
</mapper>
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -53,6 +53,7 @@
    private CameraSDKFactory cameraSDKFactory;
    @Resource
    private IArdChannelService ardChannelService;
    /**
     * åŒæ­¥ç›¸æœºåœ¨çº¿çŠ¶æ€
     * åˆ˜è‹ä¹‰
@@ -88,20 +89,22 @@
     * @Date 2024/7/9 16:01
     */
    public void syncChannelState() {
        log.warn("定时同步通道任务开始");
        log.debug("定时同步通道任务开始");
        //获取所有nvr设备
        List<ArdCameras> ardCamerasList = iArdCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
        if (ardCamerasList.size() > 0) {
            ardCamerasList.stream()
                    .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(ardCameras,ardChannelListDb,ardChannelList);
                        if (ardCameras.getLoginId() > 0) {
                            //通过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(ardCameras, ardChannelListDb, ardChannelList);
                        }
                    });
        }
    }
@@ -139,9 +142,9 @@
     * 2023/10/13 14:13:53
     */
    public void syncVtdu() {
        log.warn("定时同步流媒体任务开始");
        log.debug("定时同步流媒体任务开始");
        List<String> nameList = mediaService.getNameList();
        List<Vtdu> vtduList = vtduService.selectVtduList(new Vtdu());
        vtduService.asyncVtdu(vtduList,nameList);
        vtduService.asyncVtdu(vtduList, nameList);
    }
}
server/mediamtx/mediamtx.yml
@@ -44,17 +44,17 @@
# Enable the HTTP API.
api: yes
# Address of the API listener.
apiAddress: 192.168.1.227:9997
apiAddress: 192.168.1.27:9997
# Enable Prometheus-compatible metrics.
metrics: no
# Address of the metrics listener.
metricsAddress: 192.168.1.227:9998
metricsAddress: 192.168.1.27:9998
# Enable pprof-compatible endpoint to monitor performances.
pprof: no
# Address of the pprof listener.
pprofAddress: 192.168.1.227:9999
pprofAddress: 192.168.1.27:9999
# Command to run when a client connects to the server.
# This is terminated with SIGINT when a client disconnects from the server.
@@ -225,7 +225,7 @@
webrtcICEInterfaces: [192.168.1.1]
# List of public IP addresses that are to be used as a host.
# This is used typically for servers that are behind 1:1 D-NAT.
webrtcICEHostNAT1To1IPs: [192.168.1.227]
webrtcICEHostNAT1To1IPs: [192.168.1.27]
# Address of a ICE UDP listener in format host:port.
# If filled, ICE traffic will pass through a single UDP port,
# allowing the deployment of the server inside a container or behind a NAT.
sql/20230320091649.nb3
Binary files differ
sql/20230905public.sql
ÎļþÒÑɾ³ý
sql/init20240715.sql
ÎļþÃû´Ó sql/public20240412.sql ÐÞ¸Ä
ÎļþÌ«´ó
sql/public.sql
ÎļþÒÑɾ³ý
sql/quartz.sql
ÎļþÒÑɾ³ý
sql/ry-vue-pg.sql
ÎļþÒÑɾ³ý
sql/ry_20220822.sql
ÎļþÒÑɾ³ý