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<String> 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<LonLatDto> 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<String, Object> polyline = new HashMap<>();
|
for (LonLatDto lonLatDto : lonLatDtos) {
|
polyline.put("longitude",lonLatDto.getLongitude());
|
polyline.put("latitude",lonLatDto.getLatitude());
|
}
|
// 封装路由详情
|
Map<String, Object> 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<String, Object> content = new HashMap<>();
|
content.put("orderId",dto.getOrderId());
|
content.put("routeType",routeType);
|
content.put("route",JSONObject.toJSONString(route));
|
|
// 封装轨迹信息
|
Map<String, Object> 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();
|
}
|
|
}
|