‘liusuyi’
2023-07-29 783f11f29131a6141cd7f68ded39c9acd93868a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package com.ruoyi.app.position.service.impl;
 
import com.alibaba.fastjson2.JSONObject;
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.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
 
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * @ClassName AppPositionPushService
 * @Description: app位置推送
 * @Author 刘苏义
 * @Date 2023/7/28 19:18
 * @Version 1.0
 * {"enabled":false,"frequency":1000,"userId":"69cf75f289424a48ba10cf33fa324206"}
 */
public class AppPositionPushService {
    public static Map<String, List<ArdAppPosition>> dataMap = new HashMap<>();//常规数据 每个用户关联
    public static Map<String, List<ArdAppPosition>> tempDataMap = new HashMap<>();//临时数据 每个用户关联
    public static Map<String, Timer> userTimerMap = new HashMap();//定时器 每个用户关联
    public static Map<String, Timer> tempUserTimerMap = new HashMap();//临时定时器 每个用户关联
//    public static List<ArdAppPosition> initDataList;
 
    //启动全局定时器
    public static Timer startTimerTask(String userId, Integer period) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                List<ArdAppPosition> data = dataMap.get(userId);
                List<ArdAppPosition> onlineData = isOnlie(data);
                if (onlineData.size() > 0) {
                    Map newMap = new HashMap<>();
                    newMap.put("50000", onlineData);
                    WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap);
                }
            }
        }, 0, period);
 
        return timer;
    }
 
    //启动引导定时器
    public static Timer startTempTimerTask(String userId, Integer period) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //循环
                List<ArdAppPosition> data = tempDataMap.get(userId);
                List<ArdAppPosition> onlineData = isOnlie(data);
                if (onlineData.size() > 0) {
                    Map newMap = new HashMap<>();
                    newMap.put("50000", onlineData);
                    WebSocketUtils.sendMessage(WebSocketUtils.ONLINE_USER_SESSIONS.get(userId), newMap);
                }
            }
        }, 0, period);
 
        return timer;
    }
 
    //停止定时器
    public static void stopTimerTask(Timer timer) {
        if (timer != null) {
            timer.cancel();
        }
    }
 
    //查询所有app用户的位置信息
    public static List<ArdAppPosition> getAppPositionList() {
        List<ArdAppPosition> ArdAppPositions = new ArrayList<>();
        ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class);
        //获取所有app用户
        List<SysUser> list = sysUserService.selectAllAppUserList(new SysUser());
//        List<SysUser> onlineList = list.stream()
//                .filter(obj -> obj.getAppOnlineState().equals("1"))
//                .collect(Collectors.toList());
        for (SysUser sysUser : list) {
            IArdAppPositionService ardAppPositionService = SpringUtils.getBean(IArdAppPositionService.class);
            ArdAppPosition ardAppPosition = ardAppPositionService.selectLastArdAppPositionByUserId(sysUser.getUserId());
            if (StringUtils.isNotNull(ardAppPosition)) {
                ArdAppPositions.add(ardAppPosition);
            }
        }
        return ArdAppPositions;
    }
 
    //过滤在线app用户
    public static List<ArdAppPosition> isOnlie(List<ArdAppPosition> data) {
        List<ArdAppPosition> onlineList = new ArrayList<>();
        if (data.size() > 0) {
            for (ArdAppPosition ardAppPosition : data) {
                ISysUserService sysUserService = SpringUtils.getBean(ISysUserService.class);
                SysUser sysUser = sysUserService.selectUserById(ardAppPosition.getUserId());
                if(StringUtils.isNotNull(sysUser)) {
                    if(StringUtils.isNotNull(sysUser.getAppOnlineState())) {
                        if (sysUser.getAppOnlineState().equals("1")) {
                            onlineList.add(ardAppPosition);
                        }
                    }
                }
            }
        }
        return onlineList;
    }
 
    //接收处理器
    public static void messageHandler(String userId, String message) {
        Map<String, Object> map = JSONObject.parseObject(message, Map.class);
        if (map.size() > 0) {
            Boolean enabled = (Boolean) map.get("enabled");
            if (enabled) {
                //启动全局推送
                List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.getAppPositionList());
                AppPositionPushService.dataMap.put(userId, newList);
                if (!AppPositionPushService.userTimerMap.containsKey(userId)) {
                    Timer timer = AppPositionPushService.startTimerTask(userId, 3000);
                    AppPositionPushService.userTimerMap.put(userId, timer);//将定时器关联用户
                }
            } else {
                //停止全局推送
                if (AppPositionPushService.userTimerMap.containsKey(userId)) {
                    Timer timer = AppPositionPushService.userTimerMap.get(userId);
                    AppPositionPushService.stopTimerTask(timer);
                    AppPositionPushService.userTimerMap.remove(userId);
                }
                if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) {
                    Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId);
                    AppPositionPushService.stopTimerTask(temptimer);
                    AppPositionPushService.tempUserTimerMap.remove(userId);
                }
                AppPositionPushService.dataMap.remove(userId);
                AppPositionPushService.tempDataMap.remove(userId);
            }
 
            Integer frequency = (Integer) map.get("frequency");
            String uId = (String) map.get("userId");
            if (frequency > 0) {
                List<ArdAppPosition> List = AppPositionPushService.getAppPositionList().stream()
                        .filter(obj -> !obj.getUserId().equals(uId))
                        .collect(Collectors.toList());//去除引导后的list
                AppPositionPushService.dataMap.put(userId, List);
 
                List<ArdAppPosition> tempList = AppPositionPushService.getAppPositionList().stream()
                        .filter(obj -> obj.getUserId().equals(uId))
                        .collect(Collectors.toList());//获取引导的list
                AppPositionPushService.tempDataMap.put(userId, tempList);
                Timer timer = AppPositionPushService.startTempTimerTask(userId, frequency);
                AppPositionPushService.tempUserTimerMap.put(userId, timer);
            } else {
                List<ArdAppPosition> newList = new ArrayList<>(AppPositionPushService.getAppPositionList());
                AppPositionPushService.dataMap.put(userId, newList);
                Timer timer = AppPositionPushService.tempUserTimerMap.get(userId);
                AppPositionPushService.stopTimerTask(timer);
                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,属于申请引导,获取除引导外的其他app用户的位置List
//                List<ArdAppPosition> appPositionList = positionList.stream()
//                        .filter(obj -> !obj.getUserId().equals(uId))
//                        .collect(Collectors.toList());
//                dataMap.put(userId,appPositionList);
//            }
//           else {
//                //接收到频率等于0,属于释放引导,获取到全部app用户的位置List
//                dataMap.put(userId,AppPositionPush.getAppPositionList());
//            }
//            AppPositionPush.initDataMap.putAll(dataMap);//更新初始会话默认数据map
//            AppPositionPush.startLocationPushTask(userId,session,uId, frequency);//开启新任务
            //endregion
        }
    }
 
    //停止处理器
    public static void stopHandler(String userId) {
        //停止全局推送
        if (AppPositionPushService.userTimerMap.containsKey(userId)) {
            Timer timer = AppPositionPushService.userTimerMap.get(userId);
            AppPositionPushService.stopTimerTask(timer);
            AppPositionPushService.userTimerMap.remove(userId);
        }
        if (AppPositionPushService.tempUserTimerMap.containsKey(userId)) {
            Timer temptimer = AppPositionPushService.tempUserTimerMap.get(userId);
            AppPositionPushService.stopTimerTask(temptimer);
            AppPositionPushService.tempUserTimerMap.remove(userId);
        }
        AppPositionPushService.dataMap.remove(userId);
        AppPositionPushService.tempDataMap.remove(userId);
        // AppPositionPush.stopLocationPushTask(session);//旧方法
    }
}