12-03-人员定位-终版
This commit is contained in:
@ -57,7 +57,7 @@ public class RydwWebSocketServer {
|
|||||||
// 3. 静态代码块:项目启动时执行(初始化资源、打印启动日志)
|
// 3. 静态代码块:项目启动时执行(初始化资源、打印启动日志)
|
||||||
static {
|
static {
|
||||||
// 此处可添加启动时的初始化逻辑(如加载配置、连接外部资源等)
|
// 此处可添加启动时的初始化逻辑(如加载配置、连接外部资源等)
|
||||||
log.info("✅ WebSocket 服务端已随项目启动初始化!端点路径:/websocket/rydw");
|
log.info("✅ 人员定位WebSocket 服务端已随项目启动初始化!端点路径:/websocket/rydw");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -131,8 +131,8 @@ public class RydwWebSocketServer {
|
|||||||
JSONObject jsonObject = JSON.parseObject(message);
|
JSONObject jsonObject = JSON.parseObject(message);
|
||||||
if (jsonObject.get("type").equals("1")){
|
if (jsonObject.get("type").equals("1")){
|
||||||
if (jsonObject.get("projectId") != null){
|
if (jsonObject.get("projectId") != null){
|
||||||
String fbdwId = null;
|
|
||||||
//分包单位id
|
//分包单位id
|
||||||
|
String fbdwId = null;
|
||||||
if (jsonObject.get("fbdwId") != null) {
|
if (jsonObject.get("fbdwId") != null) {
|
||||||
fbdwId = jsonObject.get("fbdwId").toString();
|
fbdwId = jsonObject.get("fbdwId").toString();
|
||||||
}
|
}
|
||||||
@ -221,6 +221,115 @@ public class RydwWebSocketServer {
|
|||||||
List<BusProjectPunchrange> busProjectPunchranges = busProjectPunchrangeService.list(busProjectPunchrangeLambdaQueryWrapper);
|
List<BusProjectPunchrange> busProjectPunchranges = busProjectPunchrangeService.list(busProjectPunchrangeLambdaQueryWrapper);
|
||||||
//通过打卡范围构建下方统计数据
|
//通过打卡范围构建下方统计数据
|
||||||
List<Map<String, Map>> allValue = new ArrayList<>();
|
List<Map<String, Map>> allValue = new ArrayList<>();
|
||||||
|
//初始化柱状图数据
|
||||||
|
zztcsh(allValue, busProjectPunchranges, persons, expireSeconds);
|
||||||
|
|
||||||
|
//初始化
|
||||||
|
List<SysUserVo> gpsList = new ArrayList<>();
|
||||||
|
// int zrys = 0;
|
||||||
|
int ycry = 0;
|
||||||
|
Integer dwcs = 0;
|
||||||
|
int zgry = 0;
|
||||||
|
|
||||||
|
if (persons != null && !persons.isEmpty()){
|
||||||
|
|
||||||
|
//循环班组人员列表
|
||||||
|
for (SubConstructionUser constructionUser : persons) {
|
||||||
|
//从redis拿到缓存最新坐标
|
||||||
|
boolean existsObject = RedisUtils.isExistsObject("rydw_userId_:" + constructionUser.getSysUserId());
|
||||||
|
if (!existsObject){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
GpsEquipmentSonBo bo = RedisUtils.getCacheObject("rydw_userId_:" + constructionUser.getSysUserId());
|
||||||
|
GpsEquipmentSon one = gpsEquipmentSonService.getById(bo.getId());
|
||||||
|
|
||||||
|
if (one != null){
|
||||||
|
//获取人员
|
||||||
|
SysUserVo sysUserVo = sysUserService.selectUserById(constructionUser.getSysUserId());
|
||||||
|
sysUserVo.setJd(one.getLocLongitude());
|
||||||
|
sysUserVo.setWd(one.getLocLatitude());
|
||||||
|
sysUserVo.setZhdwsj(one.getCreateTime());
|
||||||
|
sysUserVo.setGz(constructionUser.getTypeOfWork());
|
||||||
|
if (constructionUser.getTeamId() != null) {
|
||||||
|
BusProjectTeamVo teamVo = busProjectTeamService.queryById(constructionUser.getTeamId());
|
||||||
|
if (teamVo != null) {
|
||||||
|
sysUserVo.setBz(teamVo.getTeamName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean isFind = false;
|
||||||
|
//循环打卡范围 判断是否是异常状态
|
||||||
|
for (BusProjectPunchrange busProjectPunchrange : busProjectPunchranges) {
|
||||||
|
//转换范围
|
||||||
|
List<String> coordinates = List.of(busProjectPunchrange.getPunchRange());
|
||||||
|
List<GeoPoint> matchingRange = JSTUtil.findMatchingRange(one.getLocLatitude().toString(), one.getLocLongitude().toString(), coordinates);
|
||||||
|
//如果范围外为 空
|
||||||
|
if (matchingRange != null && !matchingRange.isEmpty() && !isFind) {
|
||||||
|
sysUserVo.setQy(busProjectPunchrange.getPunchName());
|
||||||
|
isFind = true;
|
||||||
|
|
||||||
|
//判断在线状态 如果在线 范围外 则为异常 目前从聊天服务获取
|
||||||
|
if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())) {
|
||||||
|
sysUserVo.setZxzt("在线");
|
||||||
|
//坐标在范围内在岗
|
||||||
|
zgry++;
|
||||||
|
//定义Key
|
||||||
|
String key = busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName();
|
||||||
|
//给坐标柱状图赋值
|
||||||
|
setZztData(key,allValue,one,busProjectPunchrange,constructionUser,expireSeconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//进一步判断状态
|
||||||
|
if (sysUserVo.getZxzt() == null || sysUserVo.getZxzt().isEmpty()){
|
||||||
|
if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString()) && !isFind){
|
||||||
|
sysUserVo.setZxzt("异常");
|
||||||
|
}else if (!ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())){
|
||||||
|
sysUserVo.setZxzt("离线");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//统计异常数
|
||||||
|
if (!isFind){
|
||||||
|
ycry++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//人员级GPS坐标列表
|
||||||
|
gpsList.add(sysUserVo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//在岗人员
|
||||||
|
map.put("zgry",zgry);
|
||||||
|
|
||||||
|
//异常人员
|
||||||
|
map.put("ycry",ycry);
|
||||||
|
|
||||||
|
//总人员数
|
||||||
|
map.put("zrys",zgry + ycry);
|
||||||
|
|
||||||
|
//地图实时坐标
|
||||||
|
map.put("gpsList", gpsList);
|
||||||
|
|
||||||
|
//柱状图数据
|
||||||
|
map.put("zztsj",allValue);
|
||||||
|
|
||||||
|
//饼状图数据 区域时间段人数Map list人员列表 busProjectPunchranges打卡范围列表
|
||||||
|
map.put("bztsj",getPieData(allValue, persons, busProjectPunchranges));
|
||||||
|
|
||||||
|
//定位次数
|
||||||
|
if (RedisUtils.isExistsObject("rydw_cs")){
|
||||||
|
dwcs = RedisUtils.getCacheObject("rydw_cs");
|
||||||
|
}
|
||||||
|
map.put("dwcs",dwcs);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 柱状图数据初始化
|
||||||
|
*/
|
||||||
|
public void zztcsh (List<Map<String, Map>> allValue,List<BusProjectPunchrange> busProjectPunchranges,List<SubConstructionUser> persons,long expireSeconds){
|
||||||
for (BusProjectPunchrange busProjectPunchrange : busProjectPunchranges) {
|
for (BusProjectPunchrange busProjectPunchrange : busProjectPunchranges) {
|
||||||
Map<String,Object> map2 = new HashMap<>();
|
Map<String,Object> map2 = new HashMap<>();
|
||||||
|
|
||||||
@ -232,7 +341,8 @@ public class RydwWebSocketServer {
|
|||||||
//如果存在 循环找到打卡的人
|
//如果存在 循环找到打卡的人
|
||||||
Integer i = 0;
|
Integer i = 0;
|
||||||
for (SubConstructionUser person : persons) {
|
for (SubConstructionUser person : persons) {
|
||||||
boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "6:00" + "_" + person.getSysUserId());
|
//这个人 在6点 是否活跃过 "rydw_tj_"+busProjectPunchrange.getId() + "_" + "06:00" + "_" + constructionUser.getSysUserId()
|
||||||
|
boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "06:00" + "_" + person.getSysUserId());
|
||||||
if ( b){
|
if ( b){
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -248,7 +358,7 @@ public class RydwWebSocketServer {
|
|||||||
//如果存在 循环找到打卡的人
|
//如果存在 循环找到打卡的人
|
||||||
Integer i = 0;
|
Integer i = 0;
|
||||||
for (SubConstructionUser person : persons) {
|
for (SubConstructionUser person : persons) {
|
||||||
boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "8:00" + "_" + person.getSysUserId());
|
boolean b = RedisUtils.isExistsObject("rydw_tj_"+busProjectPunchrange.getId() + "_" + "08:00" + "_" + person.getSysUserId());
|
||||||
if ( b){
|
if ( b){
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -339,58 +449,12 @@ public class RydwWebSocketServer {
|
|||||||
map1.put(busProjectPunchrange.getId()+":"+busProjectPunchrange.getPunchName(),map2);
|
map1.put(busProjectPunchrange.getId()+":"+busProjectPunchrange.getPunchName(),map2);
|
||||||
allValue.add(map1);
|
allValue.add(map1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//初始化
|
|
||||||
List<SysUserVo> gpsList = new ArrayList<>();
|
|
||||||
// int zrys = 0;
|
|
||||||
int ycry = 0;
|
|
||||||
Integer dwcs = 0;
|
|
||||||
int zgry = 0;
|
|
||||||
|
|
||||||
if (persons != null && !persons.isEmpty()){
|
|
||||||
|
|
||||||
//循环班组人员列表
|
|
||||||
for (SubConstructionUser constructionUser : persons) {
|
|
||||||
//从redis拿到缓存最新坐标
|
|
||||||
boolean existsObject = RedisUtils.isExistsObject("rydw_userId_:" + constructionUser.getSysUserId());
|
|
||||||
if (!existsObject){
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
GpsEquipmentSonBo bo = RedisUtils.getCacheObject("rydw_userId_:" + constructionUser.getSysUserId());
|
|
||||||
GpsEquipmentSon one = gpsEquipmentSonService.getById(bo.getId());
|
|
||||||
|
|
||||||
if (one != null){
|
/**
|
||||||
//获取人员
|
* 柱状图 数据
|
||||||
SysUserVo sysUserVo = sysUserService.selectUserById(constructionUser.getSysUserId());
|
*/
|
||||||
sysUserVo.setJd(one.getLocLongitude());
|
public void setZztData(String key,List<Map<String, Map>> allValue,GpsEquipmentSon one,BusProjectPunchrange busProjectPunchrange,SubConstructionUser constructionUser,long expireSeconds){
|
||||||
sysUserVo.setWd(one.getLocLatitude());
|
|
||||||
sysUserVo.setZhdwsj(one.getCreateTime());
|
|
||||||
sysUserVo.setGz(constructionUser.getTypeOfWork());
|
|
||||||
if (constructionUser.getTeamId() != null) {
|
|
||||||
BusProjectTeamVo teamVo = busProjectTeamService.queryById(constructionUser.getTeamId());
|
|
||||||
if (teamVo != null) {
|
|
||||||
sysUserVo.setBz(teamVo.getTeamName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean isFind = false;
|
|
||||||
//循环打卡范围 判断是否是异常状态
|
|
||||||
for (BusProjectPunchrange busProjectPunchrange : busProjectPunchranges) {
|
|
||||||
//转换范围
|
|
||||||
List<String> coordinates = List.of(busProjectPunchrange.getPunchRange());
|
|
||||||
List<GeoPoint> matchingRange = JSTUtil.findMatchingRange(one.getLocLatitude().toString(), one.getLocLongitude().toString(), coordinates);
|
|
||||||
//如果范围外为 空
|
|
||||||
if (matchingRange != null && !matchingRange.isEmpty() && !isFind) {
|
|
||||||
sysUserVo.setQy(busProjectPunchrange.getPunchName());
|
|
||||||
isFind = true;
|
|
||||||
|
|
||||||
//判断在线状态 如果在线 范围外 则为异常 目前从聊天服务获取
|
|
||||||
if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())) {
|
|
||||||
sysUserVo.setZxzt("在线");
|
|
||||||
//坐标在范围内在岗
|
|
||||||
zgry++;
|
|
||||||
|
|
||||||
String key = busProjectPunchrange.getId() + ":" + busProjectPunchrange.getPunchName();
|
|
||||||
//给坐标柱状图赋值
|
|
||||||
for (Map<String, Map> mapMap : allValue) {
|
for (Map<String, Map> mapMap : allValue) {
|
||||||
//这个map为 id+名字 : 时间段 MAP
|
//这个map为 id+名字 : 时间段 MAP
|
||||||
if (mapMap.containsKey(key)){
|
if (mapMap.containsKey(key)){
|
||||||
@ -487,54 +551,6 @@ public class RydwWebSocketServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
//进一步判断状态
|
|
||||||
if (sysUserVo.getZxzt() == null || sysUserVo.getZxzt().isEmpty()){
|
|
||||||
if (ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString()) && !isFind){
|
|
||||||
sysUserVo.setZxzt("异常");
|
|
||||||
}else if (!ChatServerHandler.getOnlineUserList().contains(constructionUser.getSysUserId().toString())){
|
|
||||||
sysUserVo.setZxzt("离线");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//统计异常数
|
|
||||||
if (!isFind){
|
|
||||||
ycry++;
|
|
||||||
}
|
|
||||||
|
|
||||||
//人员级GPS坐标列表
|
|
||||||
gpsList.add(sysUserVo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//在岗人员
|
|
||||||
map.put("zgry",zgry);
|
|
||||||
|
|
||||||
//异常人员
|
|
||||||
map.put("ycry",ycry);
|
|
||||||
|
|
||||||
//总人员数
|
|
||||||
map.put("zrys",zgry + ycry);
|
|
||||||
|
|
||||||
//地图实时坐标
|
|
||||||
map.put("gpsList", gpsList);
|
|
||||||
|
|
||||||
//柱状图数据
|
|
||||||
map.put("zztsj",allValue);
|
|
||||||
|
|
||||||
//饼状图数据 区域时间段人数Map list人员列表 busProjectPunchranges打卡范围列表
|
|
||||||
map.put("bztsj",getPieData(allValue, persons, busProjectPunchranges));
|
|
||||||
|
|
||||||
//定位次数
|
|
||||||
if (RedisUtils.isExistsObject("rydw_cs")){
|
|
||||||
dwcs = RedisUtils.getCacheObject("rydw_cs");
|
|
||||||
}
|
|
||||||
map.put("dwcs",dwcs);
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 统计饼状图 数据
|
* 统计饼状图 数据
|
||||||
|
|||||||
Reference in New Issue
Block a user