package com.ruoyi.sy.service.impl; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; 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.dtflys.forest.annotation.Var; import com.github.pagehelper.PageInfo; import com.ruoyi.app.application.domain.ArdAppApplication; import com.ruoyi.app.application.mapper.ArdAppApplicationMapper; import com.ruoyi.app.position.mapper.ArdAppPositionMapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.sy.domain.ArdAccessFence; import com.ruoyi.sy.mapper.ArdTankLockMapper; import com.ruoyi.sy.param.ArdSyCarParam; import com.ruoyi.sy.vo.ArdSyCarVo; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.utils.gis.Point; import com.ruoyi.scheduling.domian.SchedulingParam; import com.ruoyi.sy.domain.ArdSyCarDay; import com.ruoyi.sy.mapper.ArdSyCarDayMapper; import com.ruoyi.utils.minio.MinioUtil; import com.ruoyi.utils.websocket.util.WebSocketUtils; import com.ruoyi.sy.domain.ArdSyUser; import com.ruoyi.sy.gps31.PositionContainer; import com.ruoyi.sy.mapper.ArdSyUserMapper; import com.ruoyi.common.core.domain.entity.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.Result; import io.minio.http.Method; import io.minio.messages.Item; import lombok.extern.slf4j.Slf4j; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Value; 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 @Slf4j(topic = "sy") 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; @Resource RedisCache redisCache; @Resource private ArdSyCarDayMapper ardSyCarDayMapper; @Resource private ArdAppApplicationMapper ardAppApplicationMapper; @Resource private SysDeptMapper sysDeptMapper; @Resource private ArdTankLockMapper ardTankLockMapper; @Value("${minio.endpoint}") private String minioEndpoint; 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); } @Override public AjaxResult ardSyCarList(ArdSyCarParam ardSyCarParam,Map result) { /*QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(ardSyCarParam.getCarBrand()!=null,"car_brand",ardSyCarParam.getCarBrand()) .like(ardSyCarParam.getCarType()!=null,"car_type",ardSyCarParam.getCarType()); List ardSyCars = ardSyCarMapper.selectList(queryWrapper);*/ List ardSyCars = ardSyCarMapper.selectByBrandAndType(ardSyCarParam.getCarBrand(),ardSyCarParam.getCarType()); List ardSyCarVoList = new ArrayList<>(); if(((String)result.get("code")).equals("200")){ List> list = (List>) result.get("data"); for (int i = 0; i < ardSyCars.size(); i++) { ArdSyCar ardSyCar = ardSyCars.get(i); String carId = ardSyCar.getCarId(); for (int j = 0; j < list.size(); j++) { String carId31 = (String) list.get(j).get("carId"); if(carId.equals(carId31)){ ArdSyCarVo ardSyCarVo = new ArdSyCarVo(); ardSyCarVo.setId(ardSyCar.getId()); ardSyCarVo.setCarId(carId); ardSyCarVo.setCarBrand(ardSyCar.getCarBrand()); ardSyCarVo.setCarModel(ardSyCar.getCarModel()); ardSyCarVo.setCarPicture(ardSyCar.getCarPicture()); ardSyCarVo.setCarType(ardSyCar.getCarType()); ardSyCarVo.setDeptId(ardSyCar.getDeptId()); ardSyCarVo.setRemark(ardSyCar.getRemark()); ardSyCarVo.setCarPlate((String) list.get(j).get("carPlate")); ardSyCarVoList.add(ardSyCarVo); break; } } } if(ardSyCarParam.getCarPlate()!=null){ List newList = new ArrayList<>(); for (int i = 0; i < ardSyCarVoList.size(); i++) { String carPlate = ardSyCarVoList.get(i).getCarPlate(); if(!carPlate.contains(ardSyCarParam.getCarPlate())){ newList.add(ardSyCarVoList.get(i)); } } ardSyCarVoList.removeAll(newList); } return AjaxResult.success(new PageInfo<>(ardSyCarVoList)); }else { return AjaxResult.error("31平台连接失败,车牌号获取失败!",new PageInfo<>(ardSyCars)); } } /** * 新增三一车辆 * * @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]); } } MinioUtil.removeObjects("sycar", objectNames); try{ return ardSyCarMapper.deleteArdSyCarByIds(ids); }finally { List carIds = new ArrayList(); for(ArdSyCar ardSyCar : result){ carIds.add(ardSyCar.getCarId()); } ardTankLockMapper.deleteArdTankLockAndWallByCarIds(carIds); } } /** * 删除三一车辆信息 * * @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 = MinioUtil.exitsBucket("system"); if (exsit) { List> listObjetcName = new ArrayList<>(); try { //Iterable> myObjects = MinioUtil.getObjectsByBucket("sycar","carmodel"); Iterable> myObjects = MinioUtil.getObjectsByBucket("system","model/car"); for (Result result : myObjects) { Item item = result.get(); Map map = new HashMap(); String[] strArr = item.objectName().split("/"); try{ String carType = strArr[2]; if(!carType.contains(".")){ map.put("carType", carType); map.put("carModel", "system/" + item.objectName()); listObjetcName.add(map); } }catch(Exception e){ e.printStackTrace(); } } return listObjetcName; } catch (Exception ex) { ex.printStackTrace(); //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); MinioUtil.removeObjects("sycar", objectNames); } } //判断文件是否为空 if (null == carPicture || 0 == carPicture.getSize()) { return ""; } boolean exsit = MinioUtil.exitsBucket("sycar"); if (!exsit) { boolean bucket = MinioUtil.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(); // MinioConfig.getMinioClient().putObject(putObjectArgs); MinioUtil.uploadObject("sycar",fileName,inputStream,carPicture.getSize(),carPicture.getContentType()); inputStream.close(); /*获取url*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs .builder() .bucket("sycar") .object(fileName) .method(Method.GET) .build(); //String presignedObjectUrl = MinioConfig.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = MinioUtil.getBucketObjectUrl("sycar", fileName); 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 carModel = this.minioEndpoint + "/" + (String) result.get("carModel"); result.put("carModel", carModel); } }*/ if(result.get("carModel") != null || "".equals(result.get("carModel"))){ String carModel = this.minioEndpoint + "/" + (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, List deptList) { 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; } /*QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("dept_id", deptList); List carListTable = ardSyCarMapper.selectList(queryWrapper);*/ List carListTable = new ArrayList(); if(!deptList.isEmpty()){ carListTable = ardSyCarMapper.getCarListByDeptIdList(deptList); } 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"); if(carList.size()>0){ for (int i = 0; i < carList.size(); i++) { String carId = (String) carList.get(i).get("carId"); Boolean isCar = false; for (int j = 0; j < carListTable.size(); j++) { ArdSyCar ardSyCar = carListTable.get(j); if (carId.equals(ardSyCar.getCarId())) { isCar = true; break; } } if(!isCar){ carList.remove(carList.get(i)); } } } for (Map m : carList) { if (((String) m.get("stateCn")).contains("在线")) { String carId = (String) m.get("carId"); ArdSyCar ardSyCarQuery = new ArdSyCar(); ardSyCarQuery.setCarId(carId); List ardSyCarList = ardSyCarMapper.selectArdSyCarList(ardSyCarQuery); if(ardSyCarList.size() != 0){ online = online + 1; }else{ continue; } } else { continue; } } List carIdList = new ArrayList();//存放车队下全部车辆主键 for(Map carMap : carList){ carIdList.add((String) carMap.get("carId")); } //map.put("count", carList.size()); if(carIdList.size() == 0){ map.put("count", 0); }else{ Long count = ardSyCarMapper.getCountByCarIdList(carIdList); map.put("count", count); } 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 carList = new ArrayList(); if(!deptList.isEmpty()){ carList = ardSyCarMapper.getCarListByDeptIdList(deptList); } //对比把匹配到的数据添加到list中 for (int i = 0; i < list.size(); i++) { String carId = list.get(i).get("carId"); for (int j = 0; j < carList.size(); j++) { ArdSyCar ardSyCar = carList.get(j); if (carId.equals(ardSyCar.getCarId())) { list.get(i).put("carModel", this.minioEndpoint + "/" + ardSyCar.getCarModel());//zns list.get(i).put("carTypeArd", ardSyCar.getCarType()); list.get(i).put("carBrand", ardSyCar.getCarBrand()); list.get(i).put("carPicture", ardSyCar.getCarPicture()); list.get(i).put("deptId", ardSyCar.getDeptId()); break; } } } list = list.stream().filter(map -> map.get("deptId") != null).collect(Collectors.toList()); 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 time = map.get("time"); time = time.replace("-", ""); String startTime = time + "000000"; String endTime = time + "235959"; 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")); try { result0 = getCarGPSTrack(syURL, carId, startTime, endTime, maxSpeed, (String) result1.get("sessionId")); } catch (Exception e) { return Results.error("查询历史数据数量过多导致超时,请缩小范围查询!"); } 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 static Map getCarGPSTrack(String syURL,String carId,String startTime,String endTime,String maxSpeed,String sessionId){ OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .url(syURL + "/gps-web/api/get_gps_h.jsp?carId=" + carId + "&startTime=" + startTime + "&endTime=" + endTime + "&sessionId=" + sessionId) .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } response.headers(); //响应头 ResponseBody responseBody = response.body(); try { String message = responseBody.string();// 响应体 Map map = (Map) JSON.parse(message); //System.out.println(message); return map; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return new HashMap(); } } 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); Long sttsHex = Long.parseLong(stts, 16); //String sttsBin = Integer.toBinaryString(sttsHex); String sttsBin = Long.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 Map 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); Map result = new HashMap(); result.put("userId", username31); result.put("sessionId", (String) result1.get("sessionId")); return sYClient.getCarNearPositionByCarId(syURL, carId, result.get("userId"), result.get("sessionId")); } @Override public Map getCarPicture(String carId, String syURL, String sessionId) { return sYClient.getCarPicture(syURL, carId, sessionId); } @Override public String getSessionId(String syURL,ArdSyUser ardSyUser) { String username31 = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String passwordMd5 = DigestUtils.md5Hex(password31); System.out.println(passwordMd5); Map result1 = sYClient.logIn(syURL, passwordMd5, username31); return (String) result1.get("sessionId"); } @Override public Map sendCmd(String userId,String syURL, String sessionId, String carId, List channelList) throws UnsupportedEncodingException { // for (int i = 0; i < channelList.size(); i++) { Map params = new HashMap(); params.put("channel", channelList.get(1));//选择通道1 params.put("interval", "0");//每隔0s照一次 params.put("photoNum", "1");//照1张 params.put("action", "0");//上传模式 String paramsStr = com.alibaba.fastjson2.JSON.toJSONString(params); paramsStr = URLEncoder.encode(paramsStr,"UTF-8"); System.out.println("拍照参数:"+paramsStr); return sYClient.sendCmd(syURL,userId,carId,301,"MediaTake",paramsStr,sessionId); // } // return sendCmdMap; } @Override public Map getPhoto(String syURL, String carId, String sessionId,String startTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String endTime = sdf.format(new Date()); System.out.println("开始时间:"+startTime+" 结束时间:"+endTime); return sYClient.getPhoto(syURL,carId,startTime,endTime,sessionId); } @Override public Map getVideo(String syURL,String carId,ArdSyUser ardSyUser) { //31用户名密码 String username = ardSyUser.getUserId(); String password31 = ardSyUser.getPassword(); String password = DigestUtils.md5Hex(password31); // Map result1 = sYClient.logIn(syURL, passwordMd5, username31); return sYClient.getVideo(syURL,username,password,"黑E12401",1); } @Override public Results chaseCarByCarId(String usersId, String carId, String cycle) { ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId); String userId =""; String password = ""; if(ardSyUser != null){ userId = ardSyUser.getUserId(); password = DigestUtils.md5Hex(ardSyUser.getPassword()); }else{ return Results.error("没有挂接三一车辆用户"); } List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); }else{ return Results.error("三一车辆地址未录入"); } String sessionId = ""; for(String key : ONLINE_USER_SESSIONS.keySet()){ if(key.startsWith(usersId + "_")){ sessionId = key; } } if(sessionId.equals("")){//没有session就返回失败 return Results.error("追踪失败"); } try { if (cycle.equals("0")) { if (userCarTimerMap.get(usersId) != null) { userCarTimerMap.get(usersId).cancel(); userCarTimerMap.remove(usersId); PositionContainer.getUserPositionMap().remove(usersId); Map loginResult = sYClient.logIn(syURL, password, userId); String sySessionId = (String) loginResult.get("sessionId"); String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d"; sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s推送 System.out.println("停止追踪"); } 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); Map loginResult = sYClient.logIn(syURL, password, userId); String sySessionId = (String) loginResult.get("sessionId"); List distanceSYResult = sysConfigMapper.selectByType("31time"); String time = ""; if(distanceSYResult.size() != 0){ time = distanceSYResult.get(0).getConfigValue(); }else{ return Results.error("三一车辆定时未录入"); } String params = "%7B%220020%22:%220%22,%220029%22:%22"+time+"%22%7d"; sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//开始追踪,改为定时推送 Map position = PositionContainer.getCarPositionMap().get(carId);//查询当前车辆位置 if (position != null) { if (position.size() != 0) { position.put("elng",position.get("lng")); position.put("elat",position.get("lat")); Map> data = new HashMap(); data.put("31000", position); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(sessionId), JSON.toJSONString(data)); } } Date date = new Date(); Timer carPositionTimer = new Timer(sessionId);//定时推送实时位置 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); String sessionId = Thread.currentThread().getName(); if(ONLINE_USER_SESSIONS.get(sessionId) == null){//用户离线释放资源 if (userCarTimerMap.get(usersId) != null) { userCarTimerMap.get(usersId).cancel(); userCarTimerMap.remove(usersId); PositionContainer.getUserPositionMap().remove(usersId); ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId); String userId =""; String password = ""; if(ardSyUser != null){ userId = ardSyUser.getUserId(); password = ardSyUser.getPassword(); } List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); } if(!userId.equals("") && !password.equals("") && !syURL.equals("")){ Map loginResult = sYClient.logIn(syURL, password, userId); String sySessionId = (String) loginResult.get("sessionId"); String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d"; sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s } System.out.println("用户离线,停止追踪"); } } WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(sessionId), 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); Map loginResult = sYClient.logIn(syURL, password, userId); String sySessionId = (String) loginResult.get("sessionId"); List distanceSYResult = sysConfigMapper.selectByType("31time"); String time = ""; if(distanceSYResult.size() != 0){ time = distanceSYResult.get(0).getConfigValue(); }else{ return Results.error("三一车辆定时未录入"); } String params = "%7B%220020%22:%220%22,%220029%22:%22"+time+"%22%7d"; sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//开始追踪,改为定时推送 Map position = PositionContainer.getCarPositionMap().get(carId);//查询当前车辆位置 if (position != null) { if (position.size() != 0) { position.put("elng",position.get("lng")); position.put("elat",position.get("lat")); Map> data = new HashMap(); data.put("31000", position); WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(sessionId), JSON.toJSONString(data)); } } Date date = new Date(); Timer carPositionTimer = new Timer(sessionId);//定时推送实时位置 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); String sessionId = Thread.currentThread().getName(); if(ONLINE_USER_SESSIONS.get(sessionId) == null){//用户离线释放资源 if (userCarTimerMap.get(usersId) != null) { userCarTimerMap.get(usersId).cancel(); userCarTimerMap.remove(usersId); PositionContainer.getUserPositionMap().remove(usersId); ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId); String userId =""; String password = ""; if(ardSyUser != null){ userId = ardSyUser.getUserId(); password = ardSyUser.getPassword(); } List syURLResult = sysConfigMapper.selectByType("syCarPT"); String syURL = ""; if(syURLResult.size() != 0){ syURL = syURLResult.get(0).getConfigValue(); } if(!userId.equals("") && !password.equals("") && !syURL.equals("")){ Map loginResult = sYClient.logIn(syURL, password, userId); String sySessionId = (String) loginResult.get("sessionId"); String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d"; sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s } System.out.println("用户离线,停止追踪"); } } WebSocketUtils.sendMessage(ONLINE_USER_SESSIONS.get(sessionId), 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("追踪失败"); } } /*@Override public Results getExistTraceByCarIdAndMonth(String userId, String carId, String time) { SysConfig config = new SysConfig(); config.setConfigKey("syCarPT"); List sysConfigResult = sysConfigMapper.selectConfigList(config); String syURL = ""; if(sysConfigResult.size() == 0){ return Results.succeed("三一车辆url没有录入"); }else{ syURL = sysConfigResult.get(0).getConfigValue(); ArdSyUser ardSyUserPara = new ArdSyUser(); ardSyUserPara.setSysUserId(userId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara); if(ardSyUserList.size() == 0){ return Results.succeed("用户未挂接三一车辆"); }else{ ArdSyUser ardSyUser = ardSyUserList.get(0); String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map existTraceMap = getExistTraceByCarIdAndMonth(syURL,ardSyUser.getUserId(),passwordMd5,carId,time); return Results.succeed(existTraceMap); } } }*/ @Override public Results getExistTraceByCarIdAndMonth(String userId, String carId, String time) { List result = ardSyCarDayMapper.selectArdSyCarDayByCarIdAndDay(carId, time + "%"); List list = new ArrayList(); for (ArdSyCarDay ardSyCarDay : result) { // list.add(ardSyCarDay.getDay().split("-")[2]); list.add(ardSyCarDay.getDay()); } return Results.succeed(list); } public Map getExistTraceByCarIdAndMonth(String url, String usersId, String password, String carId, String time) { Map LogInResult = sYClient.logIn(url, password, usersId); String sessionId = (String) LogInResult.get("sessionId"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); Date date = null; try { date = sdf.parse(time); } catch (ParseException e) { e.printStackTrace(); } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//获取该月天数 Map existTraceMap = new HashMap(); ExecutorService newCachedThreadPoll = Executors.newCachedThreadPool(); for (int i = 1; i <= maxDay; i = i + 7) { int temp = i; String finalTime = time.replace("-", ""); String finalsyURL = url; newCachedThreadPoll.execute(new Runnable() { @Override public void run() { int temp0 = temp + 6; if (temp0 > maxDay) { temp0 = maxDay; } for (int j = temp; j <= temp0; j++) { if (j <= 9) { existTraceMap.put("0" + String.valueOf(j), -1); } else { existTraceMap.put(String.valueOf(j), -1); } } if (temp <= 9) { if (temp0 <= 9) { String startTime = finalTime + "0" + temp + "000000"; String endTime = finalTime + "0" + temp0 + "235959"; Map result = getCarGPSTrack(finalsyURL, carId, startTime, endTime, sessionId); String rspCode = (String) result.get("rspCode"); if (rspCode.equals("1")) { List> list = (List>) result.get("list"); for (Map m : list) { String time = (String) m.get("time"); time = time.split(" ")[0]; time = time.split("-")[2]; existTraceMap.put(time, 1); } } } else { String startTime = finalTime + "0" + temp + "000000"; String endTime = finalTime + temp0 + "235959"; Map result = getCarGPSTrack(finalsyURL, carId, startTime, endTime, sessionId); String rspCode = (String) result.get("rspCode"); if (rspCode.equals("1")) { List> list = (List>) result.get("list"); for (Map m : list) { String time = (String) m.get("time"); time = time.split(" ")[0]; time = time.split("-")[2]; existTraceMap.put(time, 1); } } } } else { String startTime = finalTime + temp + "000000"; String endTime = finalTime + temp0 + "235959"; Map result = getCarGPSTrack(finalsyURL, carId, startTime, endTime, sessionId); String rspCode = (String) result.get("rspCode"); if (rspCode.equals("1")) { List> list = (List>) result.get("list"); for (Map m : list) { String time = (String) m.get("time"); time = time.split(" ")[0]; time = time.split("-")[2]; existTraceMap.put(time, 1); } } } for (int j = temp; j <= temp0; j++) { String key = ""; if (j <= 9) { key = "0" + j; } else { key = String.valueOf(j); } if (existTraceMap.get(key) == -1) { existTraceMap.put(key, 0); } } } }); } while (true) { if (!existTraceMap.values().contains(-1)) { if (existTraceMap.size() == maxDay) { break; } } } try { return existTraceMap; } finally { newCachedThreadPoll.shutdown(); } } public static Map getCarGPSTrack(String syURL, String carId, String startTime, String endTime, String sessionId) { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder() .url(syURL + "/gps-web/api/get_gps_h.jsp?carId=" + carId + "&startTime=" + startTime + "&endTime=" + endTime + "&filter0=true&maxSpeed=&stopLong=5&queryAlarm=false&userId=yanshi&loginType=user&loginWay=android&loginLang=zh_CN&appDevId=&sessionId=" + sessionId) .build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } response.headers(); //响应头 ResponseBody responseBody = response.body(); try { String message = responseBody.string();// 响应体 Map map = (Map) JSON.parse(message); //System.out.println(message); return map; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return new HashMap(); } } /** * 获取附近范围内的车辆信息 */ @Override public List> getNearCar(SchedulingParam param) { try { Double longitude = param.getLongitude(); Double latitude = param.getLatitude(); Integer radius = param.getSealingRadius(); if (longitude == null && latitude == null) { log.debug("原点坐标为空"); return null; } if (radius == null) { log.debug("半径距离为空"); return null; } String userId = SecurityUtils.getUserId(); ArdSyUser syUser = new ArdSyUser(); syUser.setSysUserId(userId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(syUser); if (ardSyUserList.size() == 0) { log.debug("用户未挂接三一车辆"); return null; } ArdSyUser ardSyUser = ardSyUserList.get(0); String syUrl = redisCache.getCacheObject("sys_config:syCarPT"); String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syUrl, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); Map teamList = sYClient.getTeamList(syUrl, ardSyUser.getUserId(), sessionId); List> listMap = (List>) teamList.get("list"); List> allList = new ArrayList<>(); for (Map team : listMap) { String teamId = (String) team.get("teamId"); Map carListMap = sYClient.getCarList1(syUrl, teamId, ardSyUser.getUserId(), sessionId); if (((String) carListMap.get("rspCode")).equals("1")) { List> list = (List>) carListMap.get("list"); allList.addAll(list); } } //过滤在线车辆 List> onlineList = allList.stream() .filter(map -> !"离线".equals(map.get("stateCn"))) .collect(Collectors.toList()); List> filteredList = new ArrayList<>(); //过滤半径 for (Map carMap : onlineList) { String carId = (String) carMap.get("carId"); Map carGPSTrack = sYClient.getCarNearPositionByCarId(syUrl, carId, ardSyUser.getUserId(), sessionId); List> carGPSMap = (List>) carGPSTrack.get("list"); if(carGPSMap.size()>0) { Double lng = Double.valueOf((String) carGPSMap.get(0).get("lng")); Double lat = Double.valueOf((String) carGPSMap.get(0).get("lat")); double distance = GisUtil.getDistance(new double[]{longitude, latitude}, new double[]{lng, lat}); if (distance <= radius) { carMap.put("longitude", lng); carMap.put("latitude", lat); filteredList.add(carMap); // 将满足条件的车辆添加到筛选列表中 } } } return filteredList; }catch (Exception e) { log.error("获取附近范围内的车辆信息异常:"+e.getMessage()); return null; } } /** * 获取范围内的车辆信息(多边形) */ @Override public List> getNearCarWithPolygon(SchedulingParam param) { List> filteredList = new ArrayList<>(); try { List partitionLocation = param.getPartitionLocation(); if (partitionLocation == null) { log.debug("多边形坐标集合为空"); return null; } String userId = SecurityUtils.getUserId(); ArdSyUser syUser = new ArdSyUser(); syUser.setSysUserId(userId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(syUser); if (ardSyUserList.size() == 0) { log.debug("用户未挂接三一车辆"); return null; } ArdSyUser ardSyUser = ardSyUserList.get(0); String syUrl = redisCache.getCacheObject("sys_config:syCarPT"); String passwordMd5 = DigestUtils.md5Hex(ardSyUser.getPassword()); Map LogInResult = sYClient.logIn(syUrl, passwordMd5, ardSyUser.getUserId()); String sessionId = (String) LogInResult.get("sessionId"); Map teamList = sYClient.getTeamList(syUrl, ardSyUser.getUserId(), sessionId); List> listMap = (List>) teamList.get("list"); List> allList = new ArrayList<>(); for (Map team : listMap) { String teamId = (String) team.get("teamId"); Map carListMap = sYClient.getCarList1(syUrl, teamId, ardSyUser.getUserId(), sessionId); if (((String) carListMap.get("rspCode")).equals("1")) { List> list = (List>) carListMap.get("list"); allList.addAll(list); } } //过滤在线车辆 List> onlineList = allList.stream() .filter(map -> !"离线".equals(map.get("stateCn"))) .collect(Collectors.toList()); //过滤半径 for (Map carMap : onlineList) { String carId = (String) carMap.get("carId"); Map carGPSTrack = sYClient.getCarNearPositionByCarId(syUrl, carId, ardSyUser.getUserId(), sessionId); List> carGPSMap = (List>) carGPSTrack.get("list"); Double lng = Double.valueOf((String) carGPSMap.get(0).get("lng")); Double lat = Double.valueOf((String) carGPSMap.get(0).get("lat")); Point point = new Point(lng,lat); boolean inPolygon = GisUtil.isInPolygon(point, partitionLocation); if (inPolygon) { carMap.put("longitude", lng); carMap.put("latitude", lat); filteredList.add(carMap); // 将满足条件的车辆添加到筛选列表中 } } } catch (Exception ex) { log.error("获取范围内的车辆信息(多边形)异常:" + ex.getMessage()); } return filteredList; } @Override public List all() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.ne("reserved_1",""); return ardSyCarMapper.selectList(queryWrapper); } @Override public Map getAlarmHPfmCountDetail(String sessionId, String usersId, String carId, String startTime, String endTime, String syURL) { // System.out.println("sessionId------"+sessionId+",usersId-----"+usersId+",carId-----"+carId+",startTime----"+startTime+",endTime----"+endTime+",syURL----"+syURL); return sYClient.getAlarmHPfmCountDetail(syURL,carId,sessionId,startTime,endTime); } @Override public Map getOnlineSYCarPosition(String soilderId) { Map result = new HashMap(); ArdSyUser ardSyUserPara = new ArdSyUser(); ardSyUserPara.setSysUserId(soilderId); List ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara); if(ardSyUserList.size() == 0){ result.put("code","0"); result.put("msg","登录用户未挂接三一车辆账号"); result.put("SYCarPositionList",new ArrayList()); return result; } ArdAppApplication ardAppApplicationPara = new ArdAppApplication(); ardAppApplicationPara.setSoilderId(soilderId); ardAppApplicationPara.setApplicationType("SYCar"); ardAppApplicationPara.setState("1"); List ardAppApplicationList = ardAppApplicationMapper.selectArdAppApplicationList(ardAppApplicationPara); if(ardAppApplicationList.size() == 0){ result.put("code","0"); result.put("msg","登录用户未经指挥端同意"); result.put("SYCarPositionList",new ArrayList()); return result; } SysUser sysUser = userMapper.selectUserById(soilderId);//获取系统用户 List deptIdList = new ArrayList(); deptIdList.add(sysUser.getDeptId()); deptIdList = getOwnAndChildrenDeptIdList(deptIdList,new ArrayList());//递归查询下属部门主键 List carIdList = ardSyCarMapper.selectArdSyCarByDeptIds(deptIdList); String carIds = ""; for(String carId : carIdList){ carIds = carIds + carId + ","; } carIds = carIds.substring(0,carIds.length() - 1); String syURL = ""; List sysConfigResult = sysConfigMapper.selectByType("syCarPT"); if(sysConfigResult.size() > 0){ syURL = sysConfigResult.get(0).getConfigValue(); }else{ result.put("code","0"); result.put("msg","三一车辆url没有录入"); result.put("SYCarPositionList",new ArrayList()); return result; } String passwordMd5 = DigestUtils.md5Hex(ardSyUserList.get(0).getPassword()); Map syLoginResult = sYClient.logIn(syURL, passwordMd5, ardSyUserList.get(0).getUserId()); String sessionId = (String) syLoginResult.get("sessionId"); Map carNearPositionResult = sYClient.getCarNearPositionByCarId(syURL, carIds, ardSyUserList.get(0).getUserId(),sessionId); if(((String)carNearPositionResult.get("rspCode")).equals("1")){ result.put("code","1"); result.put("msg","三一车辆查询成功"); List> SYCarPositionList = (List>) carNearPositionResult.get("list"); //筛选在线 SYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("在线")).collect(Collectors.toList()); for(Map sycar : SYCarPositionList){ Map map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId")); sycar.putAll(map); } result.put("SYCarPositionList",SYCarPositionList); return result; }else{ result.put("code","0"); result.put("msg","三一车辆查询失败"); result.put("SYCarPositionList",new ArrayList()); return result; } } public List getOwnAndChildrenDeptIdList(List deptIdList,List deptIdListr){ deptIdListr.addAll(deptIdList); List result = sysDeptMapper.getChildrenDeptIdList(deptIdList); if(result.size() != 0){ deptIdListr.addAll(result); result = getOwnAndChildrenDeptIdList(result,deptIdListr); } deptIdListr = deptIdListr.stream().distinct().collect(Collectors.toList()); return deptIdListr; } }