package com.xiaopeng.pushMessage.controller; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.common.core.constant.CacheConstants; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.PushMessageTypeEnum; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.pushMessage.utils.MapMatchingUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.powermock.core.ListMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; 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 java.util.*; import java.util.concurrent.TimeUnit; @Slf4j @Api(tags = "订单推送轨迹接口") @RestController @RequestMapping("") public class PushOrderRouteController { @Autowired private RedisService redisService; @Autowired private XpPushMessageClient xpPushMessageClient; @Autowired private XpOrderClient xpOrderClient; /** * 通过定位推送订单轨迹 * @return */ @PostMapping("/inner/v1/order/pushOrderRoute") public R pushOrderRoute(@Validated @RequestBody PushOrderRouteDTO dto) { // 查询订单信息 XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrderId()).getData(); // 封装消息内容 Integer routeType = dto.getRouteType(); if(routeType == 2){ routeType = 3; }else { routeType = xpOrder.getStatus() == 2 || xpOrder.getStatus() == 3 ? 1 : 2; } // 获取路线规划 String key = ""; //接驾情况,获取车辆位置到起点的导航 if(1 == routeType){ key = "ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(); }else{ key = "ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId(); } Object cacheObject = redisService.getCacheObject(key); RouteVo routeVo = JSON.parseObject(cacheObject.toString(), RouteVo.class); if(Objects.nonNull(routeVo)){ // 计算实时点位到线段的最优截取 List lonLatDtos = MapMatchingUtil.getRemainingNavigation(routeVo.getPolyline(), dto.getLongitude(), dto.getLatitude()); routeVo.setDistance(dto.getDistance()); routeVo.setDuration(dto.getDuration()); routeVo.setPolyline(lonLatDtos); // 存储最新路线偏离缓存,后续进行轨迹截取 redisService.setCacheObject(key, JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); // 封装轨迹点位集合 List> polyline = new ArrayList<>(); for (LonLatDto lonLatDto : lonLatDtos) { Map polylineMap = new HashMap<>(); polylineMap.put("longitude",lonLatDto.getLongitude()); polylineMap.put("latitude",lonLatDto.getLatitude()); polyline.add(polylineMap); } // 封装路由详情 Map route = new HashMap<>(); route.put("distance",dto.getDistance()); route.put("duration",dto.getDuration()); route.put("polyline",JSONObject.toJSONString(polyline)); Map content = new HashMap<>(); content.put("orderId",dto.getOrderId().toString()); content.put("routeType",routeType); content.put("direction",dto.getDirection()); content.put("route",JSONObject.toJSONString(route)); // 封装轨迹信息 Map params = new HashMap<>(); params.put("type", PushMessageTypeEnum.ORDER_ROUTE.getDesc()); params.put("content", JSONObject.toJSONString(content)); params.put("timestamp", new Date().getTime()+""); // 进行消息推送 SendMessageDTO sendMessageDTO = new SendMessageDTO(); sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId())); sendMessageDTO.setMessage(JSONObject.toJSONString(params)); xpPushMessageClient.sendRoute(sendMessageDTO); log.info("推送剩余导航数据成功 {} {}", xpOrder.getOrderNumber(), JSON.toJSONString(routeVo)); } return R.ok(); } }