package com.zhgd.xmgl.task; import java.util.Date; import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSONArray; import com.google.common.collect.Lists; import cn.hutool.core.date.DateUtil; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.modules.vehicleposition.entity.VehiclePositionConfig; import com.zhgd.xmgl.modules.vehicleposition.entity.VehiclePositionData; import com.zhgd.xmgl.modules.vehicleposition.entity.VehiclePositionDev; import com.zhgd.xmgl.modules.vehicleposition.service.IVehiclePositionConfigService; import com.zhgd.xmgl.modules.vehicleposition.service.IVehiclePositionDataService; import com.zhgd.xmgl.modules.vehicleposition.service.IVehiclePositionDevService; import com.zhgd.xmgl.util.HbyjUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.*; import java.util.stream.Collectors; @Slf4j @RequestMapping("/xmgl/task") @RestController public class VehiclePositionTask { @Lazy @Autowired private IVehiclePositionConfigService vehiclePositionConfigService; @Lazy @Autowired private IVehiclePositionDevService vehiclePositionDevService; @Lazy @Autowired private IVehiclePositionDataService vehiclePositionDataService; /** * 定时保存车辆(人员)定位数据(河北跃进) */ @Scheduled(cron = "* */10 * * * ?") @SchedulerLock(name = "saveVehiclePositionDatas", lockAtMostFor = 1000 * 60, lockAtLeastFor = 1000 * 60) @RequestMapping("saveVehiclePositionDatas") public void saveVehiclePositionDatas() { List configs = vehiclePositionConfigService.list(new LambdaQueryWrapper() .eq(VehiclePositionConfig::getIsEnable, 1) .eq(VehiclePositionConfig::getFactoryType, 2) ); Date now = new Date(); String begin = DateUtil.formatDateTime(now); String end = DateUtil.formatDateTime(DateUtil.offsetMinute(now, -10)); Map> projectMap = vehiclePositionDevService.list(null).stream().collect(Collectors.groupingBy(VehiclePositionDev::getProjectSn)); for (VehiclePositionConfig config : configs) { List devList = projectMap.get(config.getProjectSn()); if (CollUtil.isEmpty(devList)) { continue; } try { HbyjUtil.HbyjAuth auth = HbyjUtil.getAuth(config.getIp(), config.getPort(), config.getAccount(), config.getPwd()); JSONObject jsonObject = HbyjUtil.getCarInfosByProjectId(config.getIp(), config.getPort(), auth.getProject_id()); if (!Objects.equals(jsonObject.getInteger("code"), 200)) { throw new OpenAlertException("保存车辆(人员)定位数据车辆信息错误:" + jsonObject.getString("msg")); } List caridToNumberPlates = getCaridsToNumberPlate(jsonObject, devList); if (CollUtil.isEmpty(caridToNumberPlates)) { continue; } vehiclePositionDevService.updateHeartbeatTimeByHbyj(caridToNumberPlates); String carid = caridToNumberPlates.stream().map(CaridsToNumberPlate::getCarid).collect(Collectors.joining(",")); jsonObject = HbyjUtil.getPositionDatas(begin, end, carid, auth.getProject_id(), config.getIp(), config.getPort(),auth.getToken()); if (!Objects.equals(jsonObject.getInteger("code"), 200)) { if (!Objects.equals(jsonObject.getInteger("code"), 500) || !Objects.equals(jsonObject.getString("msg"), "无数据")) { throw new OpenAlertException("保存车辆(人员)定位数据车辆历史轨迹数据错误:" + jsonObject.getString("msg")); } } List positionDatas = getVehiclePositionDatas(caridToNumberPlates, jsonObject); if (CollUtil.isNotEmpty(positionDatas)) { vehiclePositionDataService.saveBatch(positionDatas); } } catch (Exception e) { log.info("", e); log.error("定时保存车辆(人员)定位数据(河北跃进)错误:{}", e.getMessage()); } } } private List getVehiclePositionDatas(List caridToNumberPlates, JSONObject jsonObject) { List vehiclePositionDatalist = Lists.newArrayList(); JSONArray body = jsonObject.getJSONArray("body"); for (int i = 0; i < body.size(); i++) { JSONArray jsonArray = body.getJSONArray(i); CaridsToNumberPlate plate = caridToNumberPlates.get(i); for (int j = 0; j < jsonArray.size(); j++) { JSONObject jo1 = jsonArray.getJSONObject(j); VehiclePositionData data = new VehiclePositionData(); data.setDevSn(plate.getDevSn()); data.setLongitude(jo1.getDouble("longitude")); data.setLatitude(jo1.getDouble("latitude")); data.setProjectSn(data.getProjectSn()); data.setSpeed(jo1.getDouble("speed")); data.setMileage(Convert.toLong(jo1.getString("totalmileage"))); data.setCreateTime(DateUtil.parseDateTime(jo1.getString("gps_time"))); data.setProjectSn(plate.getProjectSn()); if (!Objects.equals(data.getLongitude(), 0D) || !Objects.equals(data.getLatitude(), 0D)) { vehiclePositionDatalist.add(data); } } } return vehiclePositionDatalist; } private List getCaridsToNumberPlate(JSONObject jsonObject, List devList) { List caridsToNumberPlatelist = Lists.newArrayList(); JSONArray datas = jsonObject.getJSONArray("data"); if (CollUtil.isEmpty(datas)) { return caridsToNumberPlatelist; } Map numberPlateMap = datas.stream().collect(Collectors.toMap(o -> ((JSONObject) o).getString("car_number_plate"), o -> ((JSONObject) o), (o1, o2) -> o1)); for (VehiclePositionDev dev : devList) { JSONObject jsonObject1 = numberPlateMap.get(dev.getNumberPlate()); if (jsonObject1 != null) { CaridsToNumberPlate plate = new CaridsToNumberPlate(); plate.setId(dev.getId()); plate.setCarid(jsonObject1.getString("car_id")); plate.setIsOnline(jsonObject1.getInteger("is_online")); plate.setNumberPlate(jsonObject1.getString("car_number_plate")); plate.setDevSn(dev.getDevSn()); plate.setProjectSn(dev.getProjectSn()); caridsToNumberPlatelist.add(plate); } } return caridsToNumberPlatelist; } @Data public static class CaridsToNumberPlate { private Long id; private String carid; private String numberPlate; private String devSn; private Integer isOnline; private java.lang.String projectSn; } }