修改websocket包位置
增加单兵端-下发给我的任务详情
增加app位置websocket推送按用户频率
已添加4个文件
已重命名2个文件
已修改13个文件
已删除1个文件
524 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/task/controller/ArdAppTaskController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/task/mapper/ArdAppTaskMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/task/service/IArdAppTaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/task/service/impl/ArdAppTaskServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/webrtcService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/websocket/config/websocketConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/app/ArdAppTaskMapper.xml 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/websocket/service/ChatServerEndpoint.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AlarmTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AppTask.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
@@ -166,7 +166,6 @@
        List<SysUser> offLineList=new ArrayList<>();
        for(SysUser sysUser:list)
        {
            ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId());
            if(ardAppPosition!=null) {
                Map<String, Object> params =new HashMap<>();
ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java
@@ -65,4 +65,5 @@
     * @return ç»“æžœ
     */
    public int deleteArdAppPositionById(String id);
}
ard-work/src/main/java/com/ruoyi/app/position/service/impl/AppPositionPush.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.app.position.service.impl;
import com.ruoyi.app.position.domain.ArdAppPosition;
import com.ruoyi.app.position.service.IArdAppPositionService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import com.ruoyi.system.service.ISysUserService;
import javax.websocket.Session;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
 * @Description: app位置推送
 * @ClassName: AppPositionPush
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月25日16:07:04
 * @Version: 1.0
 **/
public class AppPositionPush {
    //app位置上传
    public static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(20);
    public static final Map<Session, ScheduledFuture<?>> taskMap = new HashMap<>();
    public static final Map<Session, Map> defaultDataMap = new HashMap<>();//默认会话发送数据map
    // åˆå§‹å®šæ—¶ä»»åŠ¡ï¼Œæ ¹æ®ç”¨æˆ·è®¾ç½®çš„é¢‘çŽ‡å®šæœŸæŽ¨é€å®žæ—¶ä½ç½®ä¿¡æ¯
    public static void initPushTask(Session session, int pushFrequency) {
        // å¯åŠ¨æ–°çš„å®šæ—¶ä»»åŠ¡
        if (pushFrequency > 0) {
            scheduler.scheduleAtFixedRate(() -> {
                Map map = defaultDataMap.get(session);
                WebSocketUtils.sendMessage(session, map);
            }, 0, pushFrequency, TimeUnit.MILLISECONDS);
        }
    }
    // æ–°çš„定时任务,根据用户设置的频率定期推送实时位置信息
    public static void startLocationPushTask(String userId, Session session, int pushFrequency) {
        // å–消之前设置的定时任务
        stopLocationPushTask(session);
        // å¯åŠ¨æ–°çš„å®šæ—¶ä»»åŠ¡
        if (pushFrequency > 0) {
            ScheduledFuture<?> task = ScheduledFutureTask(session, userId, pushFrequency);
            taskMap.put(session, task); // å­˜å‚¨æ–°çš„定时任务
        }
    }
    public static ScheduledFuture<?> ScheduledFutureTask(Session session, String userId, Integer pushFrequency) {
        return scheduler.scheduleAtFixedRate(() -> {
            ArdAppPosition ardAppPosition = getAppPositionList().get(userId);
            Map<String, ArdAppPosition> DataMap = new HashMap<>();
            DataMap.put(userId,ardAppPosition);
            WebSocketUtils.sendMessage(session, DataMap);
        }, 0, pushFrequency, TimeUnit.MILLISECONDS);
    }
    //取消定时任务
    public static void stopLocationPushTask(Session session) {
        ScheduledFuture<?> scheduledTask = taskMap.get(session);
        if (scheduledTask != null) {
            scheduledTask.cancel(false);
        }
    }
    //查询所有app用户的位置信息
    public static Map<String,ArdAppPosition> getAppPositionList()
    {
        Map<String,ArdAppPosition> userMap=new HashMap<>();
        ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class);
        //获取所有app用户
        List<SysUser> list = sysUserService.selectAppUserListNoDataScope(new SysUser());
        for(SysUser sysUser:list)
        {
            IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class);
            ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId());
            userMap.put(sysUser.getUserId(),ardAppPosition);
        }
        return userMap;
    }
}
ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java
@@ -98,4 +98,6 @@
    public int deleteArdAppPositionById(String id) {
        return ardAppPositionMapper.deleteArdAppPositionById(id);
    }
}
ard-work/src/main/java/com/ruoyi/app/task/controller/ArdAppTaskController.java
@@ -39,7 +39,7 @@
    /**
     * æŸ¥è¯¢app任务管理列表
     */
    @ApiOperation("查询app任务管理列表")
    @ApiOperation("指挥端-历史任务查询")
    @PreAuthorize("@ss.hasPermi('app:task:list')")
    @GetMapping("/list")
    public TableDataInfo list(ArdAppTask ardAppTask) {
@@ -47,12 +47,19 @@
        List<ArdAppTask> list = ardAppTaskService.selectArdAppTaskList(ardAppTask);
        return getDataTable(list);
    }
    @ApiOperation("查询app任务管理列表(详情)")
    @ApiOperation("单兵端 - ä¸‹å‘给我的任务列表")
    @PreAuthorize("@ss.hasPermi('app:task:list')")
    @GetMapping("/listWithDetail")
    public TableDataInfo userlist(ArdAppTask ardAppTask) {
        List<ArdAppTask> ardAppTasks = ardAppTaskService.selectArdAppTaskListWithDetail(ardAppTask);
        return getDataTable(ardAppTasks);
    }
    @ApiOperation("单兵端 - ä¸‹å‘给我的任务详情")
    @PreAuthorize("@ss.hasPermi('app:task:list')")
    @GetMapping("/userDetailById")
    public AjaxResult userDetail(ArdAppTask ardAppTask) {
        List<ArdAppTask> ardAppTasks = ardAppTaskService.selectArdAppTaskListWithDetailById(ardAppTask);
        return AjaxResult.success(ardAppTasks);
    }
    /**
     * å¯¼å‡ºapp任务管理列表
@@ -69,7 +76,6 @@
    /**
     * èŽ·å–app任务管理详细信息
     */
    @ApiOperation("获取app任务管理详细信息")
    @PreAuthorize("@ss.hasPermi('app:task:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfoWithPic(@PathVariable("id") String id) {
@@ -79,7 +85,7 @@
    /**
     * æ–°å¢žapp任务管理
     */
    @ApiOperation("新增app任务管理")
    @ApiOperation("指挥端-下发任务")
    @PreAuthorize("@ss.hasPermi('app:task:add')")
    @Log(title = "app任务管理", businessType = BusinessType.INSERT)
    @PostMapping
@@ -110,7 +116,7 @@
    /**
     * æ›´æ–°app任务详情
     */
    @ApiOperation("更新app任务详情(打卡)")
    @ApiOperation("单兵端-任务打卡")
    @PreAuthorize("@ss.hasPermi('app:taskdetail:edit')")
    @Log(title = "更新app任务详情", businessType = BusinessType.UPDATE)
    @PutMapping("/detail")
@@ -120,7 +126,7 @@
    /**
     * èŽ·å–app任务详情的详细信息
     */
    @ApiOperation("获取app任务详情的详细信息")
    @ApiOperation("单兵端-任务点详情")
    @PreAuthorize("@ss.hasPermi('app:task:query')")
    @GetMapping(value = "/detail/{id}")
    public AjaxResult getTaskDetailInfo(@PathVariable("id") String id) {
ard-work/src/main/java/com/ruoyi/app/task/mapper/ArdAppTaskMapper.java
@@ -38,6 +38,7 @@
     * @return app任务管理集合
     */
    public List<ArdAppTask> selectArdAppTaskListWithDetail(ArdAppTask ardAppTask);
    public List<ArdAppTask> selectArdAppTaskListWithDetailById(ArdAppTask ardAppTask);
    /**
     * æ–°å¢žapp任务管理
     *
ard-work/src/main/java/com/ruoyi/app/task/service/IArdAppTaskService.java
@@ -41,7 +41,7 @@
     * @return app任务详情集合
     */
    public List<ArdAppTask> selectArdAppTaskListWithDetail(ArdAppTask ardAppTask);
    public List<ArdAppTask> selectArdAppTaskListWithDetailById(ArdAppTask ardAppTask);
    /**
     * æ–°å¢žapp任务管理
     *
ard-work/src/main/java/com/ruoyi/app/task/service/impl/ArdAppTaskServiceImpl.java
@@ -89,27 +89,16 @@
        List<ArdAppTask> list = new ArrayList<>();
        list.addAll(list1);
        return list;
//        boolean flag=false;
//        List<ArdAppTask> ardAppTasks = ardAppTaskMapper.selectArdAppTaskList(ardAppTask);
//        ardAppTask.setUserId(SecurityUtils.getUserId());
//        List<ArdAppTask> ardAppTasksNew=new ArrayList<>();
//        for (ArdAppTask appTask : ardAppTasks) {
//            ArdAppTask task = ardAppTaskMapper.selectArdAppTaskById(appTask.getId());
//            List<ArdAppTaskDetail> ardAppTaskDetailListNew = new ArrayList<>();
//            List<ArdAppTaskDetail> ardAppTaskDetailList = task.getArdAppTaskDetailList();
//            for (ArdAppTaskDetail appTaskDetail : ardAppTaskDetailList) {
//                if (appTaskDetail.getUserId().equals(ardAppTask.getUserId())) {
//                    ardAppTaskDetailListNew.add(appTaskDetail);
//                    flag=true;
//                }
//            }
//            if(flag) {
//                appTask.setArdAppTaskDetailList(ardAppTaskDetailListNew);
//                ardAppTasksNew.add(appTask);
//            }
//            flag=false;
//        }
//        return ardAppTasksNew;
    }
    @Override
    public List<ArdAppTask> selectArdAppTaskListWithDetailById(ArdAppTask ardAppTask) {
        ardAppTask.setUserId(SecurityUtils.getUserId());
        List<ArdAppTask> list1 = ardAppTaskMapper.selectArdAppTaskListWithDetailById(ardAppTask);
        List<ArdAppTask> list = new ArrayList<>();
        list.addAll(list1);
        return list;
    }
    /**
ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
@@ -11,9 +11,8 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.common.websocket.util.WebSocketUtils;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import com.ruoyi.device.hiksdk.config.MinioClientSingleton;
import com.ruoyi.device.hiksdk.util.minio.MinioUtils;
import com.ruoyi.sy.domain.ArdSyUser;
@@ -39,7 +38,7 @@
import javax.annotation.Resource;
import static com.ruoyi.common.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
/**
 * ä¸‰ä¸€è½¦è¾†Service业务层处理
ard-work/src/main/java/com/ruoyi/utils/webrtcService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.utils;
import com.sun.jna.Platform;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
/**
 * @Description:
 * @ClassName: webrtcService
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月26日13:43:07
 * @Version: 1.0
 **/
@Component
public class webrtcService {
    @PostConstruct
    public void init() {
        if (Platform.isWindows()) {
            String exePath = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "webrtc" + File.separator + "webrtc-streamer.exe";
            try {
                // æž„建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
                String[] cmd = {"cmd", "/c", "start", exePath,"-o"};
                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
                processBuilder.redirectErrorStream(true); // å°†é”™è¯¯è¾“出重定向到标准输出
                Process process = processBuilder.start();
                // å¦‚果你想等待程序完成
                int exitCode = process.waitFor();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/websocket/config/websocketConfig.java
ÎļþÃû´Ó ruoyi-common/src/main/java/com/ruoyi/common/websocket/config/websocketConfig.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.common.websocket.config;
package com.ruoyi.utils.websocket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.utils.websocket.service;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.app.position.domain.ArdAppPosition;
import com.ruoyi.app.position.service.impl.AppPositionPush;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
 * @ClassName ChatServerEndpoint
 * @Description:
 * @Author åˆ˜è‹ä¹‰
 * @Date 2023/1/27 7:42
 * @Version 1.0
 */
@Component
@Slf4j(topic = "websocket")
@ServerEndpoint("/websocket/{userId}")
public class ChatServerEndpoint {
    @OnOpen
    public void openSession(@PathParam("userId") String userId, Session session) {
        WebSocketUtils.ONLINE_USER_SESSIONS.put(userId, session);
        String message = "用户[" + userId + "] æˆåŠŸè¿žæŽ¥ï¼";
        log.info("用户登录:" + message);
        WebSocketUtils.sendMessage(session, message);
        //每个用户连接时,启动初始所有app用户位置发送
        Map<String, ArdAppPosition> appPositionMap = AppPositionPush.getAppPositionList();
        AppPositionPush.defaultDataMap.put(session,appPositionMap);
        AppPositionPush.initPushTask(session,3000);
    }
    @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);
        // æ ¹æ®ç”¨æˆ·æ–°çš„频率重新调整定时任务
        Map<String,Object> map = JSONObject.parseObject(message, Map.class);
        if(map.size()>0) {
            Integer frequency = (Integer)map.get("frequency");
            String uId = (String) map.get("userId");
            Map allMap = AppPositionPush.defaultDataMap.get(session);//获取当前session的默认发送的数据map
            if(frequency>0)
            {
                //接收到频率大于0,属于申请引导,将app从默认map中移除
                allMap.remove(uId);
                AppPositionPush.defaultDataMap.putAll(allMap);
            }
           else {
                //接收到频率等于0,属于释放引导,将app恢复到初始map
                Map<String, ArdAppPosition> appPositionList = AppPositionPush.getAppPositionList();
                allMap.put(uId,appPositionList.get(uId));
                AppPositionPush.defaultDataMap.putAll(allMap);
            }
            AppPositionPush.startLocationPushTask(uId, session, frequency);
        }
    }
    @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);
        try {
            session.close();
            AppPositionPush.stopLocationPushTask(session);
        } catch (IOException e) {
            log.error("onClose error", e);
        }
    }
    @OnError
    public void onError(Session session, Throwable throwable) {
        try {
            session.close();
        } catch (IOException e) {
            log.error("onError excepiton", e);
        }
        log.info("Throwable msg " + throwable.getMessage());
    }
}
ard-work/src/main/java/com/ruoyi/utils/websocket/util/WebSocketUtils.java
ÎļþÃû´Ó ruoyi-common/src/main/java/com/ruoyi/common/websocket/util/WebSocketUtils.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.common.websocket.util;
package com.ruoyi.utils.websocket.util;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
@@ -6,8 +6,10 @@
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.concurrent.ConcurrentHashMap;
import java.util.concurrent.*;
/**
 * @ClassName WebSocketUtils
@@ -63,6 +65,22 @@
            }
        }
    }
    public static void sendMessage(Session session, List message) {
        if (session == null) {
            return;
        }
        final RemoteEndpoint.Basic basic = session.getBasicRemote();
        if (basic == null) {
            return;
        }
        synchronized(session) {
            try {
                session.getBasicRemote().sendText( String.join(", ", message));
            } catch (IOException e) {
                log.error("sendMessage IOException ",e);
            }
        }
    }
    /**
     * æŽ¨é€æ¶ˆæ¯åˆ°å…¶ä»–客户端
     * @param message
ard-work/src/main/resources/mapper/app/ArdAppTaskMapper.xml
@@ -93,13 +93,13 @@
        a.create_time,
        a.update_by,
        a.update_time,
        b.id      as sub2_id,
        b.id as sub2_id,
        b.task_id as sub2_task_id,
        b.pic_url as sub2_pic_url,
        c.id   as sub1_id,
        c.id as sub1_id,
        c.name as sub1_name,
        c.longitude as sub1_longitude,
        c.latitude as sub1_latitde,
        c.latitude as sub1_latitude,
        c.altitude as sub1_altitude,
        c.user_id as sub1_user_id,
        c.text as sub1_text,
@@ -109,13 +109,59 @@
        from ard_app_task a
        left join ard_app_task_pic b on b.task_id = a.id
        left join ard_app_task_detail c on c.task_id = a.id
        where c.user_id = #{userId}
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            and a.create_time &gt;= to_timestamp(#{params.beginTime},'yyyy-MM-DD HH24:MI:ss')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            and a.create_time &lt;= to_timestamp(#{params.endTime},'yyyy-MM-DD HH24:MI:ss')
        </if>
        <where>
            <if test="userId != null and userId != ''">
                and c.user_id = #{userId}
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
                and a.create_time &gt;= to_timestamp(#{params.beginTime},'yyyy-MM-DD HH24:MI:ss')
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
                and a.create_time &lt;= to_timestamp(#{params.endTime},'yyyy-MM-DD HH24:MI:ss')
            </if>
        </where>
    </select>
    <select id="selectArdAppTaskListWithDetailById" parameterType="ArdAppTask" resultMap="ArdAppTaskSubResult">
        select a.id,
        a.name,
        a.text,
        a.voice,
        a.dept_id,
        a.user_id,
        a.create_by,
        a.create_time,
        a.update_by,
        a.update_time,
        b.id as sub2_id,
        b.task_id as sub2_task_id,
        b.pic_url as sub2_pic_url,
        c.id as sub1_id,
        c.name as sub1_name,
        c.longitude as sub1_longitude,
        c.latitude as sub1_latitude,
        c.altitude as sub1_altitude,
        c.user_id as sub1_user_id,
        c.text as sub1_text,
        c.voice as sub1_voice,
        c.status as sub1_status,
        c.clock_in_pic_url as sub1_clock_in_pic_url
        from ard_app_task a
        left join ard_app_task_pic b on b.task_id = a.id
        left join ard_app_task_detail c on c.task_id = a.id
        <where>
            <if test="userId != null and userId != ''">
                and c.user_id = #{userId}
            </if>
            <if test="id != null and id != ''">
                and c.id = #{id}
            </if>
            <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
                and a.create_time &gt;= to_timestamp(#{params.beginTime},'yyyy-MM-DD HH24:MI:ss')
            </if>
            <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
                and a.create_time &lt;= to_timestamp(#{params.endTime},'yyyy-MM-DD HH24:MI:ss')
            </if>
        </where>
    </select>
    <select id="selectArdAppTaskById" parameterType="String" resultMap="ArdAppTaskSubResult">
        select a.id,
@@ -128,17 +174,17 @@
               a.create_time,
               a.update_by,
               a.update_time,
               b.id      as sub2_id,
               b.task_id as sub2_task_id,
               b.pic_url as sub2_pic_url,
               c.id   as sub1_id,
               c.name as sub1_name,
               b.id        as sub2_id,
               b.task_id   as sub2_task_id,
               b.pic_url   as sub2_pic_url,
               c.id        as sub1_id,
               c.name      as sub1_name,
               c.longitude as sub1_longitude,
               c.latitude as sub1_latitde,
               c.altitude as sub1_altitude,
               c.user_id as sub1_user_id,
               c.text as sub1_text,
               c.voice as sub1_voice
               c.latitude  as sub1_latitude,
               c.altitude  as sub1_altitude,
               c.user_id   as sub1_user_id,
               c.text      as sub1_text,
               c.voice     as sub1_voice
        from ard_app_task a
                 left join ard_app_task_pic b on b.task_id = a.id
                 left join ard_app_task_detail c on c.task_id = a.id
@@ -155,9 +201,9 @@
               a.create_time,
               a.update_by,
               a.update_time,
               b.id      as sub_id,
               b.task_id as sub_task_id,
               b.pic_url as sub_pic_url
               b.id      as sub2_id,
               b.task_id as sub2_task_id,
               b.pic_url as sub2_pic_url
        from ard_app_task a
                 left join ard_app_task_pic b on b.task_id = a.id
        where a.id = #{id}
@@ -173,16 +219,16 @@
               a.create_time,
               a.update_by,
               a.update_time,
               c.id   as sub_id,
               c.name as sub_name,
               c.longitude as sub_longitude,
               c.latitude as sub_latitde,
               c.altitude as sub_altitude,
               c.user_id as sub_user_id,
               c.text as sub_text,
               c.voice as sub_voice,
               c.status as sub_status,
               c.clock_in_pic_url as sub_clock_in_pic_url
               c.id               as sub1_id,
               c.name             as sub1_name,
               c.longitude        as sub1_longitude,
               c.latitude         as sub1_latitude,
               c.altitude         as sub1_altitude,
               c.user_id          as sub1_user_id,
               c.text             as sub1_text,
               c.voice            as sub1_voice,
               c.status           as sub1_status,
               c.clock_in_pic_url as sub1_clock_in_pic_url
        from ard_app_task a
                 left join ard_app_task_detail c on c.task_id = a.id
        where a.id = #{id}
@@ -279,7 +325,8 @@
    </delete>
    <insert id="batchArdAppTaskDetail">
        insert into ard_app_task_detail( id, name, longitude, latitude, altitude, user_id, text, voice, task_id,status,clock_in_pic_url) values
        insert into ard_app_task_detail( id, name, longitude, latitude, altitude, user_id, text, voice,
        task_id,status,clock_in_pic_url) values
        <foreach item="item" index="index" collection="list" separator=",">
            ( #{item.id}, #{item.name}, #{item.longitude}, #{item.latitude}, #{item.altitude}, #{item.userId},
            #{item.text}, #{item.voice}, #{item.taskId}, #{item.status}, #{item.clockInPicUrl})
@@ -308,8 +355,7 @@
        where task_detail_id = #{taskDetailId}
    </delete>
    <select id="selectArdAppTaskDetailById" parameterType="String" resultType="ArdAppTaskDetail">
        select
               c.id,
        select c.id,
               c.name,
               c.longitude,
               c.latitude,
ruoyi-common/src/main/java/com/ruoyi/common/websocket/service/ChatServerEndpoint.java
ÎļþÒÑɾ³ý
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AlarmTask.java
@@ -4,14 +4,14 @@
import com.ruoyi.alarm.global.domain.GuideTask;
import com.ruoyi.alarm.global.service.IGlobalAlarmService;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.websocket.util.WebSocketUtils;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
import static com.ruoyi.common.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
/**
 * @ClassName: AlarmTask
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/AppTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.quartz.task;
/**
 * @Description:
 * @ClassName: AppTask
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´07月26日11:57:33
 * @Version: 1.0
 **/
public class AppTask {
}
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
@@ -6,20 +6,16 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.websocket.util.WebSocketUtils;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import static com.ruoyi.common.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
/**
 * @Description:
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -26,7 +26,7 @@
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    public List<SysUser> selectAppUserList(SysUser user);
    public List<SysUser> selectAppUserListNoDataScope(SysUser user);
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     *
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -141,7 +141,10 @@
    public List<SysUser> selectAppUserList(SysUser user) {
        return userMapper.selectAppUserList(user);
    }
    @Override
    public List<SysUser> selectAppUserListNoDataScope(SysUser user) {
        return userMapper.selectAppUserList(user);
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     *