package com.dy.pipIrrApp.inspect; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dy.common.aop.SsoAop; import com.dy.common.util.IDLongGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrApp.inspect.dto.Inspects; import com.dy.pipIrrApp.inspect.qo.QoInspect; import com.dy.pipIrrGlobal.pojoOp.OpeInspect; import com.dy.pipIrrGlobal.pojoOp.OpeTrack; import com.dy.pipIrrGlobal.voOp.VoInspect; import com.dy.pipIrrGlobal.voOp.VoTrackPoint; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; /** * @author ZhuBaoMin * @date 2024-09-24 10:21 * @LastEditTime 2024-09-24 10:21 * @Description */ @Slf4j @RestController @RequestMapping(path="inspect") public class InspectCtrl { @Autowired private InspectSv inspectSv; private final IDLongGenerator idLongGenerator; // 地球半径,单位:千米 private static final double EARTH_RADIUS = 6371.0; public InspectCtrl(IDLongGenerator idLongGenerator) { this.idLongGenerator = idLongGenerator; } /** * 添加巡检轨迹 * @param list_Inspects 巡检对象数组 * @param bindingResult * @return */ @PostMapping(path = "save", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse save(@RequestBody @Valid List list_Inspects, BindingResult bindingResult){ if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } JSONArray result_array = new JSONArray(); if(list_Inspects != null && list_Inspects.size() > 0) { for (int i = 0; i < list_Inspects.size(); i++) { Inspects inspects = list_Inspects.get(i); Long inspectorId = inspects.getInspectorId(); Long inspectId = inspects.getInspectId(); Date startTime = inspects.getStartTime(); Date stopTime = inspects.getStopTime(); List tracks = inspects.getTracks(); if(tracks == null || tracks.size() == 0) { return BaseResponseUtils.buildErrorMsg("无巡检轨迹"); } if(inspectId == null || inspectId.equals(0)) { // 该巡检未上传过记录 // 添加巡检记录 OpeInspect opeInspect = new OpeInspect(); opeInspect.setInspectorId(inspectorId); if(startTime != null) { opeInspect.setStartTime(startTime); } if(stopTime != null) { opeInspect.setStopTime(stopTime); } inspectId = inspectSv.addInspect(opeInspect); if(inspectId == null) { return BaseResponseUtils.buildErrorMsg("巡检记录添加失败"); } // 构造返回值 JSONObject inspect_job = new JSONObject(); inspect_job.put("inspectorId", inspectorId.toString()); inspect_job.put("inspectId", inspectId.toString()); result_array.add(inspect_job); for (int j = 0; j < tracks.size(); j++) { tracks.get(j).setId(idLongGenerator.generate()); tracks.get(j).setInspectId(inspectId); } Integer rec = inspectSv.insertTracks(tracks); if(rec == null || rec == 0) { return BaseResponseUtils.buildErrorMsg("巡检轨迹添加失败"); } Double distance = Optional.ofNullable(getInspectDistance(inspectId)).orElse(0.0); if(distance > 0) { inspectSv.updateInspectDistance(inspectId, distance); } }else { // 该巡检已上传过记录,续传 if(stopTime != null) { OpeInspect inspect = new OpeInspect(); inspect.setId(inspectId); inspect.setStopTime(stopTime); inspectSv.updateInspect(inspect); } if(tracks != null && tracks.size() > 0) { for (int j = 0; j < tracks.size(); j++) { tracks.get(j).setId(idLongGenerator.generate()); tracks.get(j).setInspectId(inspectId); } Integer rec = inspectSv.insertTracks(tracks); if(rec == null || rec == 0) { return BaseResponseUtils.buildErrorMsg("巡检轨迹添加失败"); } } Double distance = Optional.ofNullable(getInspectDistance(inspectId)).orElse(0.0); if(distance > 0) { inspectSv.updateInspectDistance(inspectId, distance); } } } if(result_array != null && result_array.size() > 0) { return BaseResponseUtils.buildSuccess(result_array) ; } return BaseResponseUtils.buildSuccess() ; } return BaseResponseUtils.buildErrorMsg("您提交的巡检轨迹为空"); } /** * 查询巡检轨迹 * @param qo * @return */ @GetMapping(path = "/getInspects") @SsoAop() public BaseResponse>> getInspects(QoInspect qo){ try{ QueryResultVo> res = inspectSv.getInspects(qo); return BaseResponseUtils.buildSuccess(res); }catch (Exception e){ log.error("获取巡检列表异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 根据巡检ID获取轨迹总距离 * @param inspectId * @return */ public double getInspectDistance(Long inspectId) { List points = inspectSv.getTrackPointsById(inspectId); if(points == null || points.size() == 0) { return 0.0; } double totalDistance = calculateTotalDistance(points); return totalDistance; } // 计算轨迹的总距离 public static double calculateTotalDistance(List points) { double totalDistance = 0.0; for (int i = 0; i < points.size() - 1; i++) { VoTrackPoint currentPoint = points.get(i); VoTrackPoint nextPoint = points.get(i + 1); double distance = haversine( currentPoint.getLat().doubleValue(), currentPoint.getLng().doubleValue(), nextPoint.getLat().doubleValue(), nextPoint.getLng().doubleValue()); totalDistance += distance; } return totalDistance; } // Haversine公式计算两个经纬度点之间的距离 public static double haversine(double lat1, double lon1, double lat2, double lon2) { double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return EARTH_RADIUS * c; } }