diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/gps/service/impl/GpsEquipmentServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/gps/service/impl/GpsEquipmentServiceImpl.java index cdafc790..39652c4d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/gps/service/impl/GpsEquipmentServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/gps/service/impl/GpsEquipmentServiceImpl.java @@ -615,15 +615,15 @@ public class GpsEquipmentServiceImpl extends ServiceImpl userIds = new ArrayList<>(); -// //类型转换 -// for (String s : onlineUserList) { -// userIds.add(Long.parseLong(s)); -// } -// List userDTOS = sysUserService.selectListByIds(userIds); //构建各个聊天房间未读 数量 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -139,12 +132,6 @@ public class ChatServerHandler extends SimpleChannelInboundHandler chatGroups = chatGroupService.list(queryWrapper); boolean isHaveSystemRoom = false; -// //考勤 -// boolean isHaveAttendanceRoom = false; -// //安全 -// boolean isHaveSafeRoom = false; -// //质量 -// boolean isHaveQualityRoom = false; if (chatGroups != null && !chatGroups.isEmpty()) { HashMap roomCounts = new HashMap<>(); for (ChatGroup chatGroup : chatGroups) { @@ -162,15 +149,6 @@ public class ChatServerHandler extends SimpleChannelInboundHandler ONLINE_SESSIONS = new ConcurrentHashMap<>(); @@ -71,14 +66,39 @@ public class RydwWebSocketServer { log.info("📌 客户端连接成功!会话ID:{},当前在线数:{}", session.getId(), ONLINE_SESSIONS.size()); // 2. 异步获取并推送初始化数据(避免阻塞连接) CompletableFuture.runAsync(() -> { + /* 解析消息 暂定json字符串 + { + "type": "1", 1表示心跳包 + "projectId":"", 项目id + "fbdwId":"", 分包单位id + "bzId":"", 班组id + "msg": "" + } + */ try { //初始化 Map map; //连接成功过后 获取当前项目下所有成员最新坐标 Map> params = session.getRequestParameterMap(); + //项目id + String projectId = null; List subscriptionIds = params.get("projectId"); - String projectId = subscriptionIds.getFirst(); - map = getData(projectId); + if (subscriptionIds != null && !subscriptionIds.isEmpty()) { + projectId = subscriptionIds.getFirst(); + } + //分包单位id + List fbdwIds = params.get("fbdwId"); + String fbdwId =null; + if (fbdwIds != null && !fbdwIds.isEmpty()) { + fbdwId = fbdwIds.getFirst(); + } + //班组id + String bzId = null; + List bzIds = params.get("bzId"); + if (bzIds != null && !bzIds.isEmpty()) { + bzId = bzIds.getFirst(); + } + map = getData(projectId, fbdwId, bzId); session.getBasicRemote().sendText(JSON.toJSONString(map)); } catch (Exception e) { @@ -107,7 +127,17 @@ public class RydwWebSocketServer { JSONObject jsonObject = JSON.parseObject(message); if (jsonObject.get("type").equals("1")){ if (jsonObject.get("projectId") != null){ - Map objectMap = getData(jsonObject.get("projectId").toString()); + String fbdwId = null; + //分包单位id + if (jsonObject.get("fbdwId") != null) { + fbdwId = jsonObject.get("fbdwId").toString(); + } + //班组id + String bzId = null; + if (jsonObject.get("bzId") != null) { + bzId = jsonObject.get("bzId").toString(); + } + Map objectMap = getData(jsonObject.get("projectId").toString(), fbdwId, bzId); session.getBasicRemote().sendText(JSON.toJSONString(objectMap)); } } @@ -165,7 +195,7 @@ public class RydwWebSocketServer { /** * 获取数据 用于首次和心跳 */ - public Map getData(String projectId){ + public Map getData(String projectId,String fbdwId,String bzId){ Map map = new HashMap<>(); if (projectId != null && !projectId.isEmpty()){ // 获取当天结束时间 @@ -178,11 +208,12 @@ public class RydwWebSocketServer { //拿到项目下所有人员 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SubConstructionUser::getProjectId, projectId); + queryWrapper.eq(StringUtils.isNotBlank(fbdwId), SubConstructionUser::getContractorId, fbdwId); + queryWrapper.eq(StringUtils.isNotBlank(bzId), SubConstructionUser::getTeamId, bzId); List list = subConstructionUserService.list(queryWrapper); //获取此项目打卡范围 LambdaQueryWrapper busProjectPunchrangeLambdaQueryWrapper = new LambdaQueryWrapper<>(); busProjectPunchrangeLambdaQueryWrapper.eq(BusProjectPunchrange::getProjectId, projectId); - //打卡范围 List busProjectPunchranges = busProjectPunchrangeService.list(busProjectPunchrangeLambdaQueryWrapper); //通过打卡范围构建下方统计数据 List> allValue = new ArrayList<>(); @@ -251,15 +282,12 @@ public class RydwWebSocketServer { int zrys = 0; int ycry = 0; - int dwcs = 0; + Integer dwcs = 0; int zgry = 0; if (list != null && !list.isEmpty()){ //初始化 List gpsList = new ArrayList<>(); - List onlineUserList = ChatServerHandler.getOnlineUserList(); - - //循环班组人员列表 for (SubConstructionUser constructionUser : list) { //从redis拿到缓存最新坐标 @@ -269,7 +297,8 @@ public class RydwWebSocketServer { }else { // zgry++; } - GpsEquipmentSon one = RedisUtils.getCacheObject("rydw_userId_:" + constructionUser.getSysUserId()); + GpsEquipmentSonBo bo = RedisUtils.getCacheObject("rydw_userId_:" + constructionUser.getSysUserId()); + GpsEquipmentSon one = gpsEquipmentSonService.getById(bo.getId()); if (one != null){ //获取人员 @@ -277,13 +306,12 @@ public class RydwWebSocketServer { sysUserVo.setJd(one.getLocLongitude()); sysUserVo.setWd(one.getLocLatitude()); sysUserVo.setZhdwsj(one.getCreateTime()); +// sysUserVo.setAvatar(1000000L); boolean isFind = false; //循环打卡范围 判断是否是异常状态 for (BusProjectPunchrange busProjectPunchrange : busProjectPunchranges) { //转换范围 - Gson gson = new Gson(); - Type listType = new TypeToken>() {}.getType(); - List coordinates = gson.fromJson(busProjectPunchrange.getPunchRange(), listType); + List coordinates = List.of(busProjectPunchrange.getPunchRange()); List matchingRange = JSTUtil.findMatchingRange(one.getLocLatitude().toString(), one.getLocLongitude().toString(), coordinates); //如果范围外为 空 if (matchingRange != null && !matchingRange.isEmpty() && !isFind) { @@ -291,13 +319,13 @@ public class RydwWebSocketServer { isFind = true; //判断在线状态 如果在线 范围外 则为异常 目前从聊天服务获取 - if (onlineUserList.contains(constructionUser.getSysUserId().toString())) { + if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())) { sysUserVo.setZxzt("在线"); //坐标在范围内在岗 zgry++; String key = busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName(); - //给打卡柱状图赋值 + //给坐标柱状图赋值 for (Map mapMap : allValue) { //这个map为 id+名字 : 时间段 MAP if (mapMap.containsKey(key)){ @@ -305,34 +333,90 @@ public class RydwWebSocketServer { LocalDateTime dateTime = one.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); // 获取小时数 int hour = dateTime.getHour(); - // 根据小时数判断所属区间并增加计数 + // 根据小时数判断所属区间并增加计数 一个人在一个时间段只能增加一次 设计一个新的redis存储 Key = 范围ID + 时间段 + 用户ID value = 0(未统计)1(已统计) 过期时间 = 今天为止 if (hour >= 6 && hour < 8) { - mapMap.get(mapMap.get(key)).put("06:00", (int)mapMap.get(key).get("06:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":06:00", (int)mapMap.get(key).get("06:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "06:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("06:00", (int) mapMap.get(key).get("06:00") + 1); + //将redis中该时间段人数+1 map中已经加过 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":06:00", (int) mapMap.get(key).get("06:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "06:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } else if (hour >= 8 && hour < 10) { - mapMap.get(mapMap.get(key)).put("08:00", (int)mapMap.get(key).get("08:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":08:00", (int)mapMap.get(key).get("08:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "08:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("08:00", (int) mapMap.get(key).get("08:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":08:00", (int) mapMap.get(key).get("08:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "08:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } + } else if (hour >= 10 && hour < 12) { - mapMap.get(mapMap.get(key)).put("10:00", (int)mapMap.get(key).get("10:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":10:00", (int)mapMap.get(key).get("10:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "10:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("10:00", (int) mapMap.get(key).get("10:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":10:00", (int) mapMap.get(key).get("10:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "10:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } else if (hour >= 12 && hour < 14) { - mapMap.get(mapMap.get(key)).put("12:00", (int)mapMap.get(key).get("12:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":12:00", (int)mapMap.get(key).get("12:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "12:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("12:00", (int) mapMap.get(key).get("12:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":12:00", (int) mapMap.get(key).get("12:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "12:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } else if (hour >= 14 && hour < 16) { - mapMap.get(mapMap.get(key)).put("14:00", (int)mapMap.get(key).get("14:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":14:00", (int)mapMap.get(key).get("14:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "14:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("14:00", (int) mapMap.get(key).get("14:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":14:00", (int) mapMap.get(key).get("14:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "14:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } else if (hour >= 16 && hour < 18) { - mapMap.get(mapMap.get(key)).put("16:00", (int)mapMap.get(key).get("16:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":16:00", (int)mapMap.get(key).get("16:00") + 1, Duration.ofSeconds(expireSeconds)); + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "16:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("16:00", (int) mapMap.get(key).get("16:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":16:00", (int) mapMap.get(key).get("16:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "16:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } else if (hour >= 18 && hour < 20) { - mapMap.get(mapMap.get(key)).put("18:00", (int)mapMap.get(key).get("18:00") + 1); - RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":18:00", (int)mapMap.get(key).get("18:00") + 1, Duration.ofSeconds(expireSeconds)); - + //先从redis判断此人在该时间段是否已经活动过 + boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "18:00" + "_" + constructionUser.getSysUserId()); + //如果不存在 + if (!b) { + mapMap.get(key).put("18:00", (int) mapMap.get(key).get("18:00") + 1); + //将redis中该时间段人数+1 + RedisUtils.setCacheObject(busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName() + ":18:00", (int) mapMap.get(key).get("18:00"), Duration.ofSeconds(expireSeconds)); + //判断数据添加到redis + RedisUtils.setCacheObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "18:00" + "_" + constructionUser.getSysUserId(), 1, Duration.ofSeconds(expireSeconds)); + } } } } @@ -341,9 +425,9 @@ public class RydwWebSocketServer { } //进一步判断状态 if (sysUserVo.getZxzt() == null || sysUserVo.getZxzt().isEmpty()){ - if (onlineUserList.contains(constructionUser.getSysUserId().toString()) && !isFind){ + if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString()) && !isFind){ sysUserVo.setZxzt("异常"); - }else if (!onlineUserList.contains(constructionUser.getSysUserId().toString())){ + }else if (!ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())){ sysUserVo.setZxzt("离线"); } } @@ -353,6 +437,7 @@ public class RydwWebSocketServer { ycry++; } + //人员级GPS坐标列表 gpsList.add(sysUserVo); } } @@ -367,20 +452,85 @@ public class RydwWebSocketServer { map.put("ycry",ycry); //总人员数 -// map.put("zrys",list.size()); map.put("zrys",zgry + ycry); + //定位次数 - Long cacheObject = RedisUtils.getCacheObject("rydw_"); - if (cacheObject != null){ - dwcs = cacheObject.intValue(); + if (RedisUtils.isExistsObject("rydw_cs")){ + dwcs = RedisUtils.getCacheObject("rydw_cs"); } map.put("dwcs",dwcs); //柱状图数据 map.put("zztsj",allValue); + + //饼状图数据 区域时间段人数Map list人员列表 busProjectPunchranges打卡范围列表 + map.put("bztsj",getPieData(allValue, list, busProjectPunchranges)); } } return map; } + /** + * 统计饼状图 数据 + */ + public List> getPieData(List> value,List persons,List dkfw) { + //redis中有判断标识数据: "rydw_tj_"+busProjectPunchrange.getId() + "_" + "06:00" + "_" + constructionUser.getSysUserId() + + //饼状图数据Map + Map map = new HashMap<>(); + + for (Map mapMap : value) { + //打卡范围ID : 打卡范围名称 + Set keys = mapMap.keySet(); + for (String fwIdMc : keys) { + //时间段 + Set keySet = mapMap.get(fwIdMc).keySet(); + for (Object time : keySet) { + //组合key值进行查询redis: 打卡范围ID + "_" + 时间段 + "_" + 用户ID + String[] split = fwIdMc.split(":"); + //分离出范围ID + String fwId = split[0]; + //范围名称 + String fwMc = split[1]; + //组合用户id进行循环查询 + for (SubConstructionUser person : persons) { + //在此范围 此时间 循环用户 -> 在此范围 下一个时间 循环用户 -> 在下一个范围 此时间 循环用户 + String key = "rydw_tj_"+fwId + "_" + time + "_" + person.getSysUserId(); + //针对时间去重 一个范围内只需要有一个时间段在范围内 其余不统计 + if (RedisUtils.isExistsObject( key)){ + //在map中判断 如果有 则不进行添加 + if (!map.containsKey(fwId + "_" + person.getSysUserId())) { + //如果没有 则说明该用户在 这个范围 这个时间段 有数据 可以添加 + map.put(fwId + "_" + person.getSysUserId(), 1); + } + } + } + } + } + } + + //循环完成后 可以统计出 在此范围 此用户 是否活跃过 + Map countMap = new HashMap<>(); + //再次进行循环 统计出 一个范围内 多少活跃 用一个新map进行计数 + map.forEach((key, num) -> { + for (BusProjectPunchrange fw : dkfw) { + //提取出范围ID + String fwId = key.split("_")[0]; + if (fw.getId().toString().equals(fwId)) { + if (!countMap.containsKey(fw.getId() + ":" + fw.getPunchName())){ + //如果没有则初始化为1人 + countMap.put(fw.getId() + ":" + fw.getPunchName(), 1); + }else { + //如果有则进行累加 + countMap.put(fw.getId() + ":" + fw.getPunchName(), countMap.get(fw.getId() + ":" + fw.getPunchName()) + 1); + } + //放一条测试数据 + countMap.put("1000000:测试数据", 8); + } + } + }); + + return new ArrayList<>(countMap.entrySet()); + } + }