package com.xiaopeng.pushMessage.controller; 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 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.*; @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) { // 获取路线规划 RouteVo routeVo = redisService.getCacheObject(CacheConstants.ORDER_ROUTE_CAPTURE + "_" + dto.getOrderId() + "_" +dto.getRouteType()); if(Objects.nonNull(routeVo)){ // 查询订单信息 XpOrder xpOrder = xpOrderClient.queryOrderById(dto.getOrderId()).getData(); // 计算实时点位到线段的最优截取 List lonLatDtos = MapMatchingUtil.clipBySegmentDistance(routeVo.getPolyline(), new LonLatDto(dto.getLongitude(), dto.getLatitude())); routeVo.setDistance(dto.getDistance()); routeVo.setDuration(dto.getDuration()); routeVo.setPolyline(lonLatDtos); // 存储最新路线偏离缓存,后续进行轨迹截取 redisService.setCacheObject(CacheConstants.ORDER_ROUTE_CAPTURE + "_" + dto.getOrderId() + "_" +dto.getRouteType(), routeVo); // 封装轨迹点位集合 Map polyline = new HashMap<>(); for (LonLatDto lonLatDto : lonLatDtos) { polyline.put("longitude",lonLatDto.getLongitude()); polyline.put("latitude",lonLatDto.getLatitude()); } // 封装路由详情 Map route = new HashMap<>(); route.put("distance",dto.getDistance()); route.put("duration",dto.getDuration()); route.put("polyline",JSONObject.toJSONString(polyline)); // 封装消息内容 Integer routeType = dto.getRouteType(); if(routeType == 2){ routeType = 3; }else { routeType = xpOrder.getStatus() == 4 ? 1 : 2; } Map content = new HashMap<>(); content.put("orderId",dto.getOrderId()); content.put("routeType",routeType); 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); } return R.ok(); } }