package com.ruoyi.sy.service.impl; import java.io.InputStream; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.utils.websocket.util.WebSocketUtils; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import com.ruoyi.storage.minio.utils.MinioUtils; import com.ruoyi.sy.domain.ArdSyUser; import com.ruoyi.sy.gps31.PositionContainer; import com.ruoyi.sy.mapper.ArdSyUserMapper; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.utils.forest.SYClient; import com.ruoyi.utils.result.Results; import io.minio.GetPresignedObjectUrlArgs; import io.minio.ListObjectsArgs; import io.minio.PutObjectArgs; import io.minio.Result; import io.minio.http.Method; import io.minio.messages.Item; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.stereotype.Service; import com.ruoyi.sy.mapper.ArdSyCarMapper; import com.ruoyi.sy.domain.ArdSyCar; import com.ruoyi.sy.service.IArdSyCarService; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; /** * 三一车辆Service业务层处理 * * @author ard * @date 2023-06-26 */ @Service public class ArdSyCarServiceImpl implements IArdSyCarService { @Resource private ArdSyCarMapper ardSyCarMapper; @Resource private SysConfigMapper sysConfigMapper; @Resource private ArdSyUserMapper ardSyUserMapper; @Resource private SysUserMapper userMapper; @Resource private SYClient sYClient; private Map> logInMap = new HashMap(); private Map userCarTimerMap = new HashMap(); /** * 查询三一车辆 * * @param id 三一车辆主键 * @return 三一车辆 */ @Override public ArdSyCar selectArdSyCarById(String id) { return ardSyCarMapper.selectArdSyCarById(id); } /** * 查询三一车辆列表 * * @param ardSyCar 三一车辆 * @return 三一车辆 */ @Override public List selectArdSyCarList(ArdSyCar ardSyCar) { return ardSyCarMapper.selectArdSyCarList(ardSyCar); } /** * 新增三一车辆 * * @param ardSyCar 三一车辆 * @return 结果 */ @Override public int insertArdSyCar(ArdSyCar ardSyCar) { return ardSyCarMapper.insertArdSyCar(ardSyCar); } /** * 修改三一车辆 * * @param ardSyCar 三一车辆 * @return 结果 */ @Override public int updateArdSyCar(ArdSyCar ardSyCar) { return ardSyCarMapper.updateArdSyCar(ardSyCar); } /** * 批量删除三一车辆 * * @param ids 需要删除的三一车辆主键 * @return 结果 */ @Override public int deleteArdSyCarByIds(String[] ids) { List result = ardSyCarMapper.selectArdSyCarByIds(ids); List objectNames = new ArrayList(); for(ArdSyCar ardSyCar : result){ if(ardSyCar.getCarPicture() != null && !ardSyCar.getCarPicture().equals("")){ objectNames.add(ardSyCar.getCarPicture().split("/sycar/")[1]); } } MinioUtils.removeObjects("sycar", objectNames); return ardSyCarMapper.deleteArdSyCarByIds(ids); } /** * 删除三一车辆信息 * * @param id 三一车辆主键 * @return 结果 */ @Override public int deleteArdSyCarById(String id) { return ardSyCarMapper.deleteArdSyCarById(id); } /** * 获取未挂接权限的三一车辆 */ @Override public Map getArdSyCarNoRight(String userId) { SysConfig config = new SysConfig(); config.setConfigKey("syCarPT"); List sysConfigResult = sysConfigMapper.selectConfigList(config); String syURL = ""; Map result = new HashMap(); if(sysConfigResult.size() == 0){ result.put("data","三一车辆url没有录入"); result.put("code","500"); return result; }else{ syURL = sysConfigResult.get(0).getConfigValue(); ArdSyUser ardSyUserPara = new ArdSyUser(); ardSyUserPara.setSysUserId(userId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara); if(ardSyUserList.size() == 0){ result.put("data","用户未挂接三一车辆"); result.put("code","500"); return result; }else{ ArdSyUser ardSyUser = ardSyUserList.get(0); //Map LogInResult = SYCarClient.logIn(syURL,ardSyUser.getUserId(), ardSyUser.getPassword()); String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syURL,passwordMd5,ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); //Map carListMap = SYCarClient.getCarList(syURL,sessionId); Map carListMap = sYClient.getCarList(syURL,sessionId); if(((String)carListMap.get("rspCode")).equals("1")){ List> list = (List>) carListMap.get("list"); ArdSyCar ardSyCar = new ArdSyCar(); List ardSyCarList = ardSyCarMapper.selectArdSyCarList(ardSyCar); List carIdList = new ArrayList(); for(ArdSyCar innerArdSyCar : ardSyCarList){ carIdList.add(innerArdSyCar.getCarId()); } List> carList = list.stream().filter(new Predicate>(){ @Override public boolean test(Map map) { return !carIdList.contains((String)map.get("carId")); } }).collect(Collectors.toList()); result.put("data",carList); result.put("code","200"); return result; }else{ result.put("data","三一车辆平台出错"); result.put("code","500"); return result; } } } } @Override public Map getArdSyCarAll(String userId) { SysConfig config = new SysConfig(); config.setConfigKey("syCarPT"); List sysConfigResult = sysConfigMapper.selectConfigList(config); String syURL = ""; Map result = new HashMap(); if(sysConfigResult.size() == 0){ result.put("data","三一车辆url没有录入"); result.put("code","500"); return result; }else{ syURL = sysConfigResult.get(0).getConfigValue(); ArdSyUser ardSyUserPara = new ArdSyUser(); ardSyUserPara.setSysUserId(userId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara); if(ardSyUserList.size() == 0){ result.put("data","用户未挂接三一车辆"); result.put("code","500"); return result; }else{ ArdSyUser ardSyUser = ardSyUserList.get(0); //Map LogInResult = SYCarClient.logIn(syURL,ardSyUser.getUserId(), ardSyUser.getPassword()); String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syURL,passwordMd5,ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); //Map carListMap = SYCarClient.getCarList(syURL,sessionId); Map carListMap = sYClient.getCarList(syURL,sessionId); if(((String)carListMap.get("rspCode")).equals("1")){ List> list = (List>) carListMap.get("list"); result.put("data",list); result.put("code","200"); return result; }else{ result.put("data","三一车辆平台出错"); result.put("code","500"); return result; } } } } @Override public List> getAllCarModel() { boolean exsit = MinioUtils.exitsBucket("sycar"); if (exsit) { List> listObjetcName = new ArrayList<>(); try { ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().prefix("carmodel/").bucket("sycar").build(); Iterable> myObjects = MinioClientSingleton.getMinioClient().listObjects(listObjectsArgs); for (Result result : myObjects) { Item item = result.get(); Map map = new HashMap(); map.put("carModel","sycar/" + item.objectName()); switch(item.objectName()){ case "carmodel/aodi.glb":map.put("carType","奥迪");break; case "carmodel/baolai.glb":map.put("carType","宝来");break; case "carmodel/bieke.glb":map.put("carType","别克");break; case "carmodel/bus1.glb":map.put("carType","大客车");break; case "carmodel/car.glb":map.put("carType","小型车");break; case "carmodel/fire(1).glb":map.put("carType","消防车");break; case "carmodel/fute.glb":map.put("carType","福特");break; case "carmodel/jingche_a.glb":map.put("carType","警车");break; case "carmodel/jiuhu.glb":map.put("carType","救护车");break; case "carmodel/oil.glb":map.put("carType","油罐车");break; case "carmodel/truck.glb":map.put("carType","工程用车");break; case "carmodel/van1.glb":map.put("carType","大货车");break; default: break; } listObjetcName.add(map); } return listObjetcName; } catch (Exception ex) { //log.error("minio获取桶下对象异常:" + ex.getMessage()); } } return null; } @Override public String uploadCarPicture(String id, MultipartFile carPicture) { if(id != null && !id.equals("")){//id为非必要 ArdSyCar ardSyCarr = ardSyCarMapper.selectArdSyCarById(id); List objectNames = new ArrayList(); if(ardSyCarr.getCarPicture() != null || !ardSyCarr.getCarPicture().equals("")){ String objectName = ardSyCarr.getCarPicture().split("/sycar/")[1]; objectNames.add(objectName); MinioUtils.removeObjects("sycar", objectNames); } } //判断文件是否为空 if (null == carPicture || 0 == carPicture.getSize()) { return ""; } boolean exsit = MinioUtils.exitsBucket("sycar"); if (!exsit) { boolean bucket = MinioUtils.createBucket("sycar"); } //文件名 String originalFilename = carPicture.getOriginalFilename(); //新的文件名 String fileName = "carpicture/" + IdUtils.fastSimpleUUID()+"_"+ originalFilename; try { InputStream inputStream = carPicture.getInputStream(); /*上传对象*/ PutObjectArgs putObjectArgs = PutObjectArgs .builder() .bucket("sycar") .object(fileName) .stream(inputStream, carPicture.getSize(), -1) .contentType(carPicture.getContentType()) .build(); MinioClientSingleton.getMinioClient().putObject(putObjectArgs); inputStream.close(); /*获取url*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs .builder() .bucket("sycar") .object(fileName) .method(Method.GET) .build(); String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); if(id != null && !id.equals("")){//id为非必要 ArdSyCar ardSyCar = new ArdSyCar(); ardSyCar.setId(id); ardSyCar.setCarPicture(ObjectUrl); ardSyCarMapper.updateArdSyCar(ardSyCar); } return ObjectUrl; } catch (Exception ex) { return ""; } } // @Override // public List getArdSyCarWithRightByCarIdList(List carIdList) { // List result = ardSyCarMapper.getArdSyCarWithRightByCarIdList(carIdList); // return result; // } @Override public Results carListById(String id) { try { List list = ardSyCarMapper.carListById(id); if(list.size()>0){ ArdSyCar ardSyCar = list.get(0); return Results.succeed(ardSyCar); }else { return Results.succeed(); } } catch (Exception e) { return Results.error(e.toString()); } } @Override public Map getArdSyCarAndDeptByCarId(String carId) { Map result = ardSyCarMapper.getArdSyCarAndDeptByCarId(carId); if(result != null){ if(result.get("carPicture") != null){ if(!((String)result.get("carPicture")).equals("")){ String url = ((String)result.get("carPicture")).split("sycar")[0]; String carModel = url + (String)result.get("carModel"); result.put("carModel",carModel); } } } return result; } @Override public void sendArdSyCarPosition() { for(String key : ONLINE_USER_SESSIONS.keySet()){ if(PositionContainer.getUserPositionMap().keySet().contains(key)){//当追踪的车辆容器包含此用户Id,则实时位置推送需要剔除该车辆 SysUser sysUser = userMapper.selectUserById(key); if(sysUser == null){ //return; continue; } String deptId = String.valueOf(sysUser.getDeptId()); Map> map = PositionContainer.getDeptPositionMap().get(deptId); List carIdList = new ArrayList(); carIdList.addAll(PositionContainer.getUserPositionMap().get(key).keySet()); String carId = carIdList.get(0); map.remove(carId); if(map != null){ Map data = new HashMap(); data.put("30000", map.values()); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data)); } }else{ SysUser sysUser = userMapper.selectUserById(key); if(sysUser == null){ //return; continue; } String deptId = String.valueOf(sysUser.getDeptId()); Map> map = PositionContainer.getDeptPositionMap().get(deptId); if(map != null){ Map data = new HashMap(); data.put("30000", map.values()); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(key), JSON.toJSONString(data)); } } } for(String userId : userCarTimerMap.keySet()){//用户离线后将车辆追踪资源释放 if(!ONLINE_USER_SESSIONS.keySet().contains(userId)){ userCarTimerMap.get(userId).cancel(); userCarTimerMap.remove(userId); PositionContainer.getUserPositionMap().remove(userId); } } } @Override public void sendArdSyCarAlarmByCarId(String carId, Map data) { List result = userMapper.getSysUserByCarId(carId); for(SysUser sysUser : result){ WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(sysUser.getUserId()), JSON.toJSONString(data)); } } /** * 根据用户获取三一列表 * @return */ @Override public Map allListByUser(ArdSyUser ardSyUser,String syURL,String usersId){ Map result0 = new HashMap(); //判断关联表是否有数据 if(ardSyUser!=null){ Map result = logInMap.get(Integer.parseInt(usersId)); //31用户名密码 String username31 = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String passwordMd5 = DigestUtils.md5Hex(password31); Map result1 = sYClient.logIn(syURL,passwordMd5, username31); result = new HashMap(); result.put("userId", username31); result.put("sessionId", (String) result1.get("sessionId")); try { result0 = sYClient.getTeamList(syURL,result.get("userId"),result.get("sessionId")); } catch (Exception e) { Map map = new HashMap(); map.put("rspCode", 0); map.put("list", new ArrayList()); return map; } int online = 0; for(Map map : (List>) result0.get("list")){ Map resultMap = sYClient.getTeamCarList(syURL,(String)map.get("teamId"),result.get("sessionId")); List> carList = (List>) resultMap.get("carList"); for(Map m : carList){ if(((String) m.get("stateCn")).contains("在线")){ online = online + 1; }else{ continue; } } for(Map m : (List>) result0.get("list")){ if(((String) m.get("teamId")).equals(((String) map.get("teamId")))){ map.put("count", Integer.parseInt((String) m.get("carNum"))); } } map.put("online", online); online = 0; } }else { result0.put("列表为空!","无关联账号!"); } return result0; } @Override public List> getCarList(ArdSyUser ardSyUser, String syURL, String usersId,String teamId){ List> list = new ArrayList<>(); Map result = logInMap.get(Integer.parseInt(usersId)); //31用户名密码 String username31 = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String passwordMd5 = DigestUtils.md5Hex(password31); Map result1 = sYClient.logIn(syURL,passwordMd5, username31); result = new HashMap(); result.put("userId", username31); result.put("sessionId", (String) result1.get("sessionId")); //查询该teamId下的车辆数据 Map carList31 = new HashMap(); carList31 = sYClient.getCarList1(syURL,teamId, result.get("userId"),result.get("sessionId")); //拿到车辆数据 list= (List) carList31.get("list"); if(list.isEmpty()){ return list; }else { List carIdList = new ArrayList(); //所有carId for(Map m : list){ carIdList.add(m.get("carId")); } if(carIdList.size() == 0){ Map map0 = new HashMap(); map0.put("list", "{}"); map0.put("rspCode", "1"); list.add(map0); return list; } //添加车辆属性 for(Map m : list){ switch (m.get("state")) { case "1": m.put("carState", "离线-从未报定位");break; case "2": m.put("carState", "离线-欠费");break; case "3": m.put("carState", "离线");break; case "4": m.put("carState", "离线-报警");break; case "5": m.put("carState", "在线-从未报定位");break; case "6": m.put("carState", "在线-欠费");break; case "7": m.put("carState", "在线-行驶");break; case "8": m.put("carState", "在线-行驶-报警");break; case "9": m.put("carState", "在线-停车-ACC关");break; case "10": m.put("carState", "在线-停车-ACC开");break; case "11": m.put("carState", "在线-停车-ACC关-报警");break; case "12": m.put("carState", "在线-停车-ACC开-报警");break; case "13": m.put("carState", "在线-无效定位");break; default: break; } } } return list; } /** * 根据dept集合查询出所有对应的carId * @param deptList * @return */ @Override public List> carIdByDeptList(List deptList,List> list){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("dept_id",deptList); List carList = ardSyCarMapper.selectList(queryWrapper); //对比把匹配到的数据添加到list中 for(Map m : list){ String carId = m.get("carId"); for (int i = 0; i < carList.size(); i++) { ArdSyCar ardSyCar = carList.get(i); if(carId.equals(ardSyCar.getCarId())){ String url = ""; if(ardSyCar.getCarPicture() != null){ if(!ardSyCar.getCarPicture().equals("")){ url = ardSyCar.getCarPicture().split("sycar")[0]; } } m.put("carModel",url + ardSyCar.getCarModel());//zns //m.put("carModel",ardSyCar.getCarModel()); m.put("carTypeArd",ardSyCar.getCarType()); m.put("carBrand",ardSyCar.getCarBrand()); m.put("carPicture",ardSyCar.getCarPicture()); } } } return list; } @Override public Results getCarGPSTrack(Map map,String syURL, ArdSyUser ardSyUser){ String carId = map.get("carId"); String startTime = map.get("startTime").replace(" ", "").replace("-", "").replace(":", ""); String endTime = map.get("endTime").replace(" ", "").replace("-", "").replace(":", ""); String maxSpeed = map.get("maxSpeed"); //31用户名密码 String username31 = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String passwordMd5 = DigestUtils.md5Hex(password31); Map result1 = sYClient.logIn(syURL,passwordMd5, username31); Map result0 = new HashMap(); result0 = sYClient.getCarGPSTrack(syURL,carId,startTime,endTime,maxSpeed,(String) result1.get("sessionId")); List> list = (List>) result0.get("list"); if(list.isEmpty()){ return Results.succeed(); }else { for(Map m : list) { String alarmStts = (String) m.get("alarmStts"); Map> alarmMap = getInfo("alarm", alarmStts); m.putAll(alarmMap); String carStts = (String) m.get("carStts"); Map> carMap = getInfo("car", carStts); m.putAll(carMap); String sgnStts = (String) m.get("sgnStts"); Map> sgnMap = getInfo("sgn", sgnStts); m.putAll(sgnMap); } return Results.succeed(list); } } public Map> getInfo(String type,String stts){ if(stts.isEmpty()){ return new HashMap<>(); } String[] alarmTypes = {"紧急报警","超速报警","疲劳驾驶","危险预警","GNSS 模块发生故障","GNSS 天线未接或被剪断","GNSS 天线短路", "终端主电源欠压","终端主电源掉电","终端LCD 或显示器故障","TTS 模块故障","摄像头故障","道路运输证IC 卡模块故障","超速预警", "疲劳驾驶预警","违规行驶报警","胎压预警","右转盲区异常报警","当天累计驾驶超时","超时停车","进出区域","进出路线","路段行驶时间不足/过长", "路线偏离报警","车辆VSS 故障","车辆油量异常","车辆被盗","车辆非法点火","车辆非法位移","碰撞预警","侧翻预警","非法开门报警"}; String[] carTypes89 = {"空车","半载","保留","满载"}; Object[] carTypes = {"ACC开","定位","南纬","西经","停运状态","经纬度已经保密插件加密","保留","保留",carTypes89,"车辆油路断开","车门加锁", "车辆电路断开","门1开(前门)","门2开(中门)","门3开(后门","门4开(驾驶席门","门5开","使用GPS 卫星进行定位","使用北斗卫星进行定位", "使用GLONASS卫星进行定位","使用Galileo卫星进行定位","保留","保留","保留","保留","保留","保留","保留","保留","保留","保留"}; String[] sgnTypes = {"近光灯信号","远光灯信号","右转向灯信号","左转向灯信号","制动信号","倒档信号","雾灯信号","示廓灯","喇叭信号","空调状态", "空挡信号","缓速器工作","ABS 工作","加热器工作","离合器状态","保留","保留","保留","保留","保留","保留","保留","保留","保留","保留","保留", "保留","保留","保留","保留","保留","保留"}; Integer sttsHex = Integer.parseInt(stts, 16); String sttsBin = Integer.toBinaryString(sttsHex); if(sttsBin.length() < 32){ while(sttsBin.length() < 32){ sttsBin = "0" + sttsBin; } } String[] sttsBinArray = sttsBin.split(""); switch (type) { case "alarm": List alarmTypeArray = new ArrayList(); for (int i = 0; i < sttsBinArray.length; i++) { if(sttsBinArray[i].equals("1")){ alarmTypeArray.add(alarmTypes[i]); } } Map> alarmMap = new HashMap(); alarmMap.put(type, alarmTypeArray); return alarmMap; case "car": List carTypeArray = new ArrayList(); for (int i = 0; i < sttsBinArray.length; i++) { if(i <= 7 || i >= 10){ if(sttsBinArray[i].equals("1")){ carTypeArray.add(alarmTypes[i]); } }else if(i == 8){ switch (sttsBinArray[8]+sttsBinArray[9]) { case "00": carTypeArray.add(carTypes89[0]); break; case "01": carTypeArray.add(carTypes89[1]); break; case "10": carTypeArray.add(carTypes89[2]); break; case "11": carTypeArray.add(carTypes89[3]); break; default: break; } }else if(i == 9){ continue; }else{ break; } } Map> carMap = new HashMap(); List carTypeArray0 = new ArrayList(); for(String str : carTypeArray){ if(!str.equals("保留")){ carTypeArray0.add(str); } } carMap.put(type, carTypeArray0); return carMap; case "sgn": List sgnTypeArray = new ArrayList(); for (int i = 0; i < sttsBinArray.length; i++) { if(sttsBinArray[i].equals("1")){ sgnTypeArray.add(alarmTypes[i]); } } Map> sgnMap = new HashMap(); List sgnTypeArray0 = new ArrayList(); for(String str : sgnTypeArray){ if(!str.equals("保留")){ sgnTypeArray0.add(str); } } sgnMap.put(type, sgnTypeArray0); return sgnMap; default: return new HashMap>(); } } @Override public Results getCarGPSBycarId(String usersId,String carId,String syURL,ArdSyUser ardSyUser){ Map result = logInMap.get(Integer.parseInt(usersId)); //31用户名密码 String username31 = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String passwordMd5 = DigestUtils.md5Hex(password31); Map result1 = sYClient.logIn(syURL,passwordMd5, username31); result = new HashMap(); result.put("userId", username31); result.put("sessionId", (String) result1.get("sessionId")); Map result0 = new HashMap(); result0 = sYClient.getCarNearPositionByCarId(syURL,carId,result.get("userId"),result.get("sessionId")); return Results.succeed(result0); } @Override public Results chaseCarByCarId(String usersId, String carId, String cycle) { try{ /*Map> map = new HashMap(); map.put(carId,new HashMap()); PositionContainer.getUserPositionMap().put(usersId,map);*/ if(cycle.equals("0")){ if(userCarTimerMap.get(usersId) != null){ userCarTimerMap.get(usersId).cancel(); userCarTimerMap.remove(usersId); PositionContainer.getUserPositionMap().remove(usersId); } return Results.succeed("停止追踪"); }else{ if(userCarTimerMap.get(usersId) != null){ userCarTimerMap.get(usersId).cancel(); userCarTimerMap.remove(usersId); PositionContainer.getUserPositionMap().remove(usersId); Map> map = new HashMap(); map.put(carId,new HashMap()); PositionContainer.getUserPositionMap().put(usersId,map); Date date = new Date(); Timer carPositionTimer = new Timer();//定时推送实时位置 TimerTask carPositionTask =new TimerTask(){ @Override public void run(){ Map position = PositionContainer.getUserPositionMap().get(usersId).get(carId); if(position != null){ if(position.size() != 0){ Map> data = new HashMap(); data.put("31000",position); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(usersId), JSON.toJSONString(data)); } } } }; carPositionTimer.scheduleAtFixedRate(carPositionTask,date,Integer.parseInt(cycle));//启用 this.userCarTimerMap.put(usersId,carPositionTimer); return Results.succeed("开始追踪"); }else{ Map> map = new HashMap(); map.put(carId,new HashMap()); PositionContainer.getUserPositionMap().put(usersId,map); Date date = new Date(); Timer carPositionTimer = new Timer();//定时推送实时位置 TimerTask carPositionTask =new TimerTask(){ @Override public void run(){ Map position = PositionContainer.getUserPositionMap().get(usersId).get(carId); if(position != null){ if(position.size() != 0){ Map> data = new HashMap(); data.put("31000",position); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(usersId), JSON.toJSONString(data)); } } } }; carPositionTimer.scheduleAtFixedRate(carPositionTask,date,Integer.parseInt(cycle));//启用 this.userCarTimerMap.put(usersId,carPositionTimer); return Results.succeed("开始追踪"); } } }catch(Exception e){ e.printStackTrace(); return Results.error("追踪失败"); } } }