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> taskMap = new HashMap<>(); public static final 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 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 getAppPositionList() { Map userMap=new HashMap<>(); ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class); //获取所有app用户 List 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; } }