package com.ruoyi.system.service.impl; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.service.IGpsCollectService; import com.ruoyi.system.config.GpsServiceConfig; import com.ruoyi.common.utils.MD5Util; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.ruoyi.common.utils.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.exception.ServiceException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.ruoyi.system.service.IGpsConfigService; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.common.utils.DateUtils; import java.util.Date; import com.ruoyi.system.service.IVehicleInfoService; /** * GPS采集服务实现 */ @Service public class GpsCollectServiceImpl implements IGpsCollectService { private final RestTemplate restTemplate; private final GpsServiceConfig gpsServiceConfig; @Autowired private IGpsConfigService gpsConfigService; @Autowired private IVehicleInfoService vehicleInfoService; public GpsCollectServiceImpl(GpsServiceConfig gpsServiceConfig) { this.restTemplate = new RestTemplate(); this.gpsServiceConfig = gpsServiceConfig; } @Override public GpsLoginResponse login(GpsLoginRequest request) { // 构建请求URL String url = request.getDomain() + "/webapi?action=login"; try { // 设置请求参数 Map params = new HashMap<>(); params.put("username", request.getUsername()); params.put("password", MD5Util.md5(request.getPassword())); params.put("type", request.getType()); params.put("from", request.getFrom()); params.put("browser", request.getBrowser()); // 发送请求 String result = HttpUtil.post(url, params); JSONObject jsonResult = JSON.parseObject(result); // 解析响应 GpsLoginResponse response = new GpsLoginResponse(); int status = jsonResult.getInteger("status"); response.setStatus(status); // 根据状态码设置响应信息 switch (status) { case 0: response.setSuccess(true); response.setMessage("登录成功"); response.setToken(jsonResult.getString("token")); response.setServerid(jsonResult.getInteger("serverid")); break; case -1: response.setSuccess(false); response.setMessage("登录失败"); break; case 1: response.setSuccess(false); response.setMessage("密码错误"); break; case 2: response.setSuccess(false); response.setMessage("禁止登录"); break; case 3: response.setSuccess(false); response.setMessage("账号已禁用"); break; case 4: response.setSuccess(false); response.setMessage("设备到期"); break; case 5: response.setSuccess(false); response.setMessage("设备过期"); break; case 9903: response.setSuccess(false); response.setMessage("Token过期"); break; case 9906: response.setSuccess(false); response.setMessage("账号在其他地方登录"); break; default: response.setSuccess(false); response.setMessage("未知错误"); break; } return response; } catch (Exception e) { GpsLoginResponse response = new GpsLoginResponse(); response.setSuccess(false); response.setStatus(-1); response.setMessage("登录失败:" + e.getMessage()); return response; } } /** * 获取有效的token,如果token无效则自动登录 */ private String getValidTokenWithAutoLogin() { try { // 获取当前token String token = gpsConfigService.getValidToken("gps51"); if (token == null || token.isEmpty()) { System.out.println("当前token无效,尝试重新登录"); //读取gspconfig中的域名,用户名,密码 SysGpsConfig config = gpsConfigService.selectGpsConfigByKey("gps51"); if (config == null) { System.err.println("GPS配置信息未找到,无法进行登录"); return null; } String username = config.getUsername(); String password = config.getPassword(); String domain = config.getDomain(); if (username == null || password == null || domain == null) { System.err.println("GPS配置信息不完整,用户名、密码或域名为空"); return null; } // token无效,尝试登录 GpsLoginRequest loginRequest = new GpsLoginRequest(); loginRequest.setType("USER"); loginRequest.setFrom("WEB"); loginRequest.setUsername(username); loginRequest.setPassword(password); loginRequest.setDomain(domain); System.out.println("开始登录GPS系统,用户名: " + username + ", 域名: " + domain); GpsLoginResponse loginResponse = login(loginRequest); if (loginResponse.isSuccess()) { //将token写入gspconfig token = loginResponse.getToken(); Integer serviceid = loginResponse.getServerid(); //getTokenExpireTime 这个是没有的 需要自己计算,当前时间+23小时 Date expireTime = DateUtils.addHours(new Date(), 23); gpsConfigService.updateToken("gps51", token,serviceid, expireTime); System.out.println("GPS系统登录成功,token已更新"); return token; } else { System.err.println("GPS系统登录失败: " + loginResponse.getMessage()); return null; } } else { System.out.println("使用现有有效token"); } return token; } catch (Exception e) { System.err.println("获取token时发生异常: " + e.getMessage()); e.printStackTrace(); return null; } } /** * 校验登录来源 */ private boolean isValidFrom(String from) { if (from == null) { return false; } return "ANDROID".equals(from) || "IPHONE".equals(from) || "WEB".equals(from) || "WEIXIN".equals(from); } /** * 校验登录类型 */ private boolean isValidType(String type) { if (type == null) { return false; } return "USER".equals(type) || "DEVICE".equals(type); } /** * 更新车辆设备ID * 根据设备列表中的车牌号更新或新增车辆信息 */ private void updateVehicleDeviceIds(GpsDeviceListResponse response) { if (response.getStatus() != 0 || response.getGroups() == null) { return; } // 遍历所有分组和设备 for (GpsGroup group : response.getGroups()) { for (GpsDevice device : group.getDevices()) { // 检查设备名称和备注中是否包含车牌号 String deviceName = device.getDevicename(); String remark = device.getRemark(); String deviceId = device.getDeviceid(); if (StringUtils.isNotEmpty(deviceName) || StringUtils.isNotEmpty(remark)) { // 尝试从设备名称和备注中提取车牌号 String plateNumber = extractPlateNumber(deviceName, remark); if (StringUtils.isNotEmpty(plateNumber)) { // 查询车辆信息 VehicleInfo vehicleInfo = vehicleInfoService.selectVehicleInfoByPlateNumber(plateNumber); if (vehicleInfo != null) { // 更新现有车辆的设备ID vehicleInfo.setDeviceId(deviceId); vehicleInfoService.updateVehicleInfo(vehicleInfo); } else { // 创建新的车辆信息 VehicleInfo newVehicle = new VehicleInfo(); newVehicle.setVehicleNo(plateNumber); newVehicle.setDeviceId(deviceId); newVehicle.setStatus("0"); // 正常状态 vehicleInfoService.insertVehicleInfo(newVehicle); } } } } } } /** * 从设备名称和备注中提取车牌号 */ private String extractPlateNumber(String deviceName, String remark) { // 这里可以根据实际情况实现车牌号提取逻辑 // 例如:从字符串中匹配车牌号格式 if (StringUtils.isNotEmpty(deviceName)) { return deviceName; } if (StringUtils.isNotEmpty(remark)) { return remark; } return null; } @Override public GpsDeviceListResponse getDeviceList() { // 获取GPS配置信息 SysGpsConfig config = gpsConfigService.selectGpsConfigByKey("gps51"); if (config == null) { GpsDeviceListResponse response = new GpsDeviceListResponse(); response.setStatus(-1); response.setCause("未找到GPS配置信息"); return response; } // 获取有效的token,如果无效则自动登录 String token = getValidTokenWithAutoLogin(); if (token == null) { GpsDeviceListResponse response = new GpsDeviceListResponse(); response.setStatus(-1); response.setCause("获取token失败"); return response; } String username = config.getUsername(); // 构建请求URL String url = config.getDomain() + "/webapi?action=querymonitorlist&token=" + token+"&serverid="+config.getServerid(); Map params = new HashMap<>(); params.put("username", username); try { // 发送HTTP请求 String result = HttpUtil.post(url, params); JSONObject jsonResult = JSON.parseObject(result); // 解析响应 GpsDeviceListResponse response = new GpsDeviceListResponse(); response.setStatus(jsonResult.getInteger("status")); response.setCause(jsonResult.getString("cause")); if (response.getStatus() == 0) { // 解析分组列表 JSONArray groupsArray = jsonResult.getJSONArray("groups"); List groups = new ArrayList<>(); for (int i = 0; i < groupsArray.size(); i++) { JSONObject groupJson = groupsArray.getJSONObject(i); GpsGroup group = new GpsGroup(); group.setGroupid(groupJson.getInteger("groupid")); group.setGroupname(groupJson.getString("groupname")); group.setRemark(groupJson.getString("remark")); // 解析设备列表 JSONArray devicesArray = groupJson.getJSONArray("devices"); List devices = new ArrayList<>(); for (int j = 0; j < devicesArray.size(); j++) { JSONObject deviceJson = devicesArray.getJSONObject(j); GpsDevice device = new GpsDevice(); device.setDeviceid(deviceJson.getString("deviceid")); device.setDevicename(deviceJson.getString("devicename")); device.setDevicetype(deviceJson.getInteger("devicetype")); device.setSimnum(deviceJson.getString("simnum")); device.setOverduetime(deviceJson.getLong("overduetime")); device.setExpirenotifytime(deviceJson.getLong("expirenotifytime")); device.setRemark(deviceJson.getString("remark")); device.setCreater(deviceJson.getString("creater")); device.setVideochannelcount(deviceJson.getInteger("videochannelcount")); device.setLastactivetime(deviceJson.getLong("lastactivetime")); device.setIsfree(deviceJson.getInteger("isfree")); device.setAllowedit(deviceJson.getInteger("allowedit")); device.setIcon(deviceJson.getInteger("icon")); device.setStared(deviceJson.getInteger("stared")); device.setLoginname(deviceJson.getString("loginname")); devices.add(device); } group.setDevices(devices); groups.add(group); } response.setGroups(groups); } return response; } catch (Exception e) { GpsDeviceListResponse response = new GpsDeviceListResponse(); response.setStatus(-1); response.setCause("请求设备列表失败:" + e.getMessage()); return response; } } @Override public GpsLastPositionResponse getLastPosition(GpsLastPositionRequest request) { // 获取GPS配置信息 SysGpsConfig config = gpsConfigService.selectGpsConfigByKey("gps51"); if (config == null) { GpsLastPositionResponse response = new GpsLastPositionResponse(); response.setStatus(-1); response.setCause("未找到GPS配置信息"); return response; } System.out.println("GPS配置信息获取成功!"); // 获取有效的token,如果无效则自动登录 String token = getValidTokenWithAutoLogin(); if (token == null) { GpsLastPositionResponse response = new GpsLastPositionResponse(); response.setStatus(-1); response.setCause("获取token失败"); return response; } System.out.println("token获取成功!"+token); // 构建请求URL String url = config.getDomain() + "/webapi?action=lastposition&token="+token+"&serverid="+config.getServerid(); System.out.println("请求URL:"+url); // 构建请求参数 Map params = new HashMap<>(); // 使用配置中的lastquerypositiontime作为查询时间 Long lastQueryTime = config.getLastquerypositiontime(); if (lastQueryTime == null) { lastQueryTime = 0L; // 如果从未查询过,则从0开始 } params.put("lastquerypositiontime", String.valueOf(lastQueryTime)); // 添加设备ID列表 if (request.getDeviceids() != null && !request.getDeviceids().isEmpty()) { params.put("deviceids", JSON.toJSONString(request.getDeviceids())); } System.out.println("请求参数:"+params); try { // 发送HTTP请求 String result = HttpUtil.post(url, params); JSONObject jsonResult = JSON.parseObject(result); // 解析响应 GpsLastPositionResponse response = new GpsLastPositionResponse(); response.setStatus(jsonResult.getInteger("status")); response.setCause(jsonResult.getString("cause")); // 获取新的lastquerypositiontime Long newLastQueryTime = jsonResult.getLong("lastquerypositiontime"); response.setLastquerypositiontime(newLastQueryTime); // 如果请求成功,更新配置中的lastquerypositiontime if (response.getStatus() == 0 && newLastQueryTime != null) { config.setLastquerypositiontime(newLastQueryTime); gpsConfigService.updateGpsConfig(config); } if (response.getStatus() == 0) { // 解析位置记录列表 JSONArray recordsArray = jsonResult.getJSONArray("records"); List records = new ArrayList<>(); for (int i = 0; i < recordsArray.size(); i++) { JSONObject recordJson = recordsArray.getJSONObject(i); GpsLastPosition record = new GpsLastPosition(); record.setDeviceid(recordJson.getString("deviceid")); record.setDevicetime(recordJson.getLong("devicetime")); record.setArrivedtime(recordJson.getLong("arrivedtime")); record.setUpdatetime(recordJson.getLong("updatetime")); record.setValidpoistiontime(recordJson.getLong("validpoistiontime")); record.setCallat(recordJson.getDouble("callat")); record.setCallon(recordJson.getDouble("callon")); record.setAltitude(recordJson.getDouble("altitude")); record.setRadius(recordJson.getInteger("radius")); record.setSpeed(recordJson.getDouble("speed")); record.setCourse(recordJson.getInteger("course")); record.setTotaldistance(recordJson.getInteger("totaldistance")); record.setTotaloil(recordJson.getInteger("totaloil")); record.setTotalnotrunningad(recordJson.getInteger("totalnotrunningad")); record.setMasteroil(recordJson.getInteger("masteroil")); record.setAuxoil(recordJson.getInteger("auxoil")); record.setThirdoil(recordJson.getInteger("thirdoil")); record.setFourthoil(recordJson.getInteger("fourthoil")); record.setSrcad0(recordJson.getInteger("srcad0")); record.setSrcad1(recordJson.getInteger("srcad1")); record.setSrcad2(recordJson.getInteger("srcad2")); record.setSrcad3(recordJson.getInteger("srcad3")); record.setStatus(recordJson.getLong("status")); record.setStrstatus(recordJson.getString("strstatus")); record.setStrstatusen(recordJson.getString("strstatusen")); record.setAlarm(recordJson.getLong("alarm")); record.setStralarm(recordJson.getString("stralarm")); record.setStralarmsen(recordJson.getString("stralarmsen")); record.setVideoalarm(recordJson.getLong("videoalarm")); record.setStrvideoalarm(recordJson.getString("strvideoalarm")); record.setStrvideoalarmen(recordJson.getString("strvideoalarmen")); record.setVideosignalloststatus(recordJson.getLong("videosignalloststatus")); record.setVideosignalcoverstatus(recordJson.getLong("videosignalcoverstatus")); record.setVideobehavior(recordJson.getLong("videobehavior")); record.setVideofatiguedegree(recordJson.getLong("videofatiguedegree")); record.setGotsrc(recordJson.getString("gotsrc")); record.setRxlevel(recordJson.getInteger("rxlevel")); record.setGpsvalidnum(recordJson.getInteger("gpsvalidnum")); record.setExvoltage(recordJson.getDouble("exvoltage")); record.setVoltagev(recordJson.getDouble("voltagev")); record.setVoltagepercent(recordJson.getDouble("voltagepercent")); record.setMoving(recordJson.getInteger("moving")); record.setParklat(recordJson.getDouble("parklat")); record.setParklon(recordJson.getDouble("parklon")); record.setParktime(recordJson.getLong("parktime")); record.setParkduration(recordJson.getLong("parkduration")); record.setTemp1(recordJson.getInteger("temp1")); record.setTemp2(recordJson.getInteger("temp2")); record.setTemp3(recordJson.getInteger("temp3")); record.setTemp4(recordJson.getInteger("temp4")); record.setHumi1(recordJson.getInteger("humi1")); record.setHumi2(recordJson.getInteger("humi2")); record.setIostatus(recordJson.getInteger("iostatus")); record.setCurrentoverspeedstate(recordJson.getInteger("currentoverspeedstate")); record.setRotatestatus(recordJson.getShort("rotatestatus")); record.setLoadstatus(recordJson.getShort("loadstatus")); record.setWeight(recordJson.getLong("weight")); record.setSrcweightad0(recordJson.getInteger("srcweightad0")); record.setReportmode(recordJson.getShort("reportmode")); records.add(record); } response.setRecords(records); } return response; } catch (Exception e) { GpsLastPositionResponse response = new GpsLastPositionResponse(); response.setStatus(-1); response.setCause("请求设备最后位置失败:" + e.getMessage()); return response; } } @Override public String getDeviceIdByPlateNumber(String plateNumber) { if (StringUtils.isEmpty(plateNumber)) { return null; } try { // 获取设备列表 GpsDeviceListResponse response = getDeviceList(); if (response.getStatus() != 0) { return null; } // 遍历所有分组和设备 for (GpsGroup group : response.getGroups()) { for (GpsDevice device : group.getDevices()) { // 检查设备备注中是否包含车牌号 if (device.getDevicename() != null && device.getDevicename().contains(plateNumber)) { return device.getDeviceid(); } if(device.getRemark()!=null && device.getRemark().contains(plateNumber)){ return device.getDeviceid(); } } } } catch (Exception e) { // 记录错误日志 System.err.println("通过车牌号查询设备号失败:" + e.getMessage()); } return null; } @Override public GpsTrackQueryResponse queryTracks(GpsTrackQueryRequest request) { try { // 获取GPS配置信息 SysGpsConfig config = gpsConfigService.selectGpsConfigByKey("gps51"); if (config == null) { System.err.println("GPS配置信息未找到,configKey: gps51"); GpsTrackQueryResponse response = new GpsTrackQueryResponse(); response.setStatus(-1); response.setCause("未找到GPS配置信息"); return response; } System.out.println("GPS配置信息获取成功,域名: " + config.getDomain() + ", 用户名: " + config.getUsername()); // 获取有效的token,如果无效则自动登录 String token = getValidTokenWithAutoLogin(); if (token == null) { System.err.println("获取token失败"); GpsTrackQueryResponse response = new GpsTrackQueryResponse(); response.setStatus(-1); response.setCause("获取token失败"); return response; } System.out.println("Token获取成功: " + token); // 构建请求URL String url = config.getDomain() + "/webapi?action=querytracks&token=" + token+"&serverid="+config.getServerid(); System.out.println("请求URL: " + url); // 构建请求参数 Map params = new HashMap<>(); params.put("deviceid", request.getDeviceid()); params.put("begintime", request.getBegintime()); params.put("endtime", request.getEndtime()); if (request.getTimezone() != null) { params.put("timezone", String.valueOf(request.getTimezone())); } System.out.println("请求参数: " + params); // 发送HTTP请求 String result = HttpUtil.post(url, params); System.out.println("HTTP响应结果: " + result); if (result == null || result.trim().isEmpty()) { System.err.println("HTTP请求返回空结果"); GpsTrackQueryResponse response = new GpsTrackQueryResponse(); response.setStatus(-1); response.setCause("HTTP请求返回空结果"); return response; } JSONObject jsonResult = JSON.parseObject(result); // 解析响应 GpsTrackQueryResponse response = new GpsTrackQueryResponse(); response.setStatus(jsonResult.getInteger("status")); response.setCause(jsonResult.getString("cause")); response.setDeviceid(jsonResult.getString("deviceid")); if (response.getStatus() == 0) { // 解析轨迹记录列表 JSONArray recordsArray = jsonResult.getJSONArray("records"); List records = new ArrayList<>(); for (int i = 0; i < recordsArray.size(); i++) { JSONObject recordJson = recordsArray.getJSONObject(i); GpsTrackPoint record = new GpsTrackPoint(); record.setTrackCount(recordJson.getInteger("trackCount")); record.setStarttime(recordJson.getLong("starttime")); record.setEndtime(recordJson.getLong("endtime")); record.setTrackid(recordJson.getInteger("trackid")); record.setArrivedtime(recordJson.getLong("arrivedtime")); record.setUpdatetime(recordJson.getLong("updatetime")); record.setLatitude(recordJson.getDouble("callat")); record.setLongitude(recordJson.getDouble("callon")); record.setAltitude(recordJson.getDouble("altitude")); record.setRadius(recordJson.getInteger("radius")); record.setSpeed(recordJson.getDouble("speed")); record.setRecorderspeed(recordJson.getDouble("recorderspeed")); record.setTotaldistance(recordJson.getInteger("totaldistance")); record.setCourse(recordJson.getInteger("course")); record.setStatus(recordJson.getLong("status")); record.setStrstatus(recordJson.getString("strstatus")); record.setStrstatusen(recordJson.getString("strstatusen")); record.setGotsrc(recordJson.getString("gotsrc")); record.setRxlevel(recordJson.getInteger("rxlevel")); record.setGpsvalidnum(recordJson.getInteger("gpsvalidnum")); record.setReportmode(recordJson.getShort("reportmode")); records.add(record); } response.setRecords(records); } return response; } catch (Exception e) { System.err.println("查询历史轨迹异常: " + e.getMessage()); e.printStackTrace(); GpsTrackQueryResponse response = new GpsTrackQueryResponse(); response.setStatus(-1); response.setCause("查询历史轨迹失败:" + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName())); return response; } } }