|  |  | 
 |  |  | 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.PostMapping; | 
 |  |  | import org.springframework.web.bind.annotation.RequestBody; | 
 |  |  | import org.springframework.web.bind.annotation.RequestMapping; | 
 |  |  | import org.springframework.web.bind.annotation.RestController; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.Optional; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author ZhuBaoMin | 
 |  |  | 
 |  |  |     private InspectSv inspectSv; | 
 |  |  |  | 
 |  |  |     private final IDLongGenerator idLongGenerator; | 
 |  |  |  | 
 |  |  |     // 地球半径,单位:千米 | 
 |  |  |     private static final double EARTH_RADIUS = 6371.0; | 
 |  |  |  | 
 |  |  |     public InspectCtrl(IDLongGenerator idLongGenerator) { | 
 |  |  |         this.idLongGenerator = idLongGenerator; | 
 |  |  | 
 |  |  |             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); | 
 |  |  | 
 |  |  |  | 
 |  |  |                     // 添加巡检记录 | 
 |  |  |                     OpeInspect opeInspect = new OpeInspect(); | 
 |  |  |                     opeInspect.setInspectorId(inspects.getInspectorId()); | 
 |  |  |                     opeInspect.setInspectorId(inspectorId); | 
 |  |  |                     if(startTime != null) { | 
 |  |  |                         opeInspect.setStartTime(startTime); | 
 |  |  |                     } | 
 |  |  | 
 |  |  |                         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); | 
 |  |  | 
 |  |  |                     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<QueryResultVo<List<VoInspect>>> getInspects(QoInspect qo){ | 
 |  |  |  | 
 |  |  |         try{ | 
 |  |  |             QueryResultVo<List<VoInspect>> 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<VoTrackPoint> points = inspectSv.getTrackPointsById(inspectId); | 
 |  |  |         if(points == null || points.size() == 0) { | 
 |  |  |             return 0.0; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         double totalDistance = calculateTotalDistance(points); | 
 |  |  |         return totalDistance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 计算轨迹的总距离 | 
 |  |  |     public static double calculateTotalDistance(List<VoTrackPoint> 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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据巡检员ID获取巡检列表 | 
 |  |  |      * @param vo | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @GetMapping(path = "/getInspectRecords") | 
 |  |  |     @SsoAop() | 
 |  |  |     public BaseResponse<QueryResultVo<List<VoInspect>>> getInspectRecords(QoInspect vo) { | 
 |  |  |         try { | 
 |  |  |             QueryResultVo<List<VoInspect>> res = inspectSv.getInstectsByInspectorId(vo); | 
 |  |  |             return BaseResponseUtils.buildSuccess(res); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("获取迅疾爱你记录异常", e); | 
 |  |  |             return BaseResponseUtils.buildException(e.getMessage()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |