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 org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.websocket.Session; import java.util.ArrayList; 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; import java.util.stream.Collectors; /** * @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> initDataMap = new HashMap<>();//每个会话初始发送数据map // 初始定时任务,根据用户设置的频率定期推送实时位置信息 public static void initPushTask(String userId, Session session, int pushFrequency) { initDataMap.put(userId, getAppPositionList()); // 启动新的定时任务 if (pushFrequency > 0) { scheduler.scheduleAtFixedRate(() -> { List appPositionList = initDataMap.get(userId); Map newMap = new HashMap<>(); newMap.put("50000", appPositionList); WebSocketUtils.sendMessage(session, newMap); }, 0, pushFrequency, TimeUnit.MILLISECONDS); } } // 新的定时任务,根据用户设置的频率定期推送实时位置信息 public static void startLocationPushTask(String userId, Session session, String guideUserId, int pushFrequency) { // 取消之前设置的定时任务 stopLocationPushTask(session); // 启动新的定时任务 if (pushFrequency > 0) { ScheduledFuture task = scheduler.scheduleAtFixedRate(() -> { List appPositionList = getAppPositionList().stream() .filter(obj -> obj.getUserId().equals(guideUserId)) .collect(Collectors.toList()); Map newMap = new HashMap<>(); newMap.put("50000", appPositionList); WebSocketUtils.sendMessage(session, newMap); }, 0, pushFrequency, TimeUnit.MILLISECONDS); taskMap.put(session, task); // 存储新的定时任务 } } //取消定时任务 public static void stopLocationPushTask(Session session) { ScheduledFuture scheduledTask = taskMap.get(session); if (scheduledTask != null) { scheduledTask.cancel(false); } } //查询所有app用户的位置信息 public static List getAppPositionList() { List ArdAppPositions = new ArrayList<>(); ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class); //获取所有app用户 List list = sysUserService.selectAllAppUserList(new SysUser()); for (SysUser sysUser : list) { IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class); ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId()); ArdAppPositions.add(ardAppPosition); } return ArdAppPositions; } }