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.constant.Constants;
|
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.LinkedBlockingQueue;
|
import java.util.concurrent.ThreadPoolExecutor;
|
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<String> 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<LonLatDto> 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<Map<String, Object>> polyline = new ArrayList<>();
|
for (LonLatDto lonLatDto : lonLatDtos) {
|
Map<String, Object> polylineMap = new HashMap<>();
|
polylineMap.put("longitude",lonLatDto.getLongitude());
|
polylineMap.put("latitude",lonLatDto.getLatitude());
|
polyline.add(polylineMap);
|
}
|
// 封装路由详情
|
Map<String, Object> route = new HashMap<>();
|
route.put("distance",dto.getDistance());
|
route.put("duration",dto.getDuration());
|
route.put("polyline",JSONObject.toJSONString(polyline));
|
|
Map<String, Object> 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<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));
|
R<String> stringR = xpPushMessageClient.sendRoute(sendMessageDTO);
|
//推送失败,重试3次
|
if(stringR.getCode() != Constants.SUCCESS){
|
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
|
executor.execute(() -> {
|
for (int i = 0; i < 3; i++) {
|
R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
|
if(stringR1.getCode() == Constants.SUCCESS){
|
break;
|
}
|
try {
|
Thread.sleep(1000);
|
} catch (InterruptedException e) {
|
throw new RuntimeException(e);
|
}
|
log.info("推送乘客端剩余导航数据消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(sendMessageDTO), xpOrder.getOrderNumber());
|
}
|
});
|
}
|
|
log.info("推送剩余导航数据成功 {} {}", xpOrder.getOrderNumber(), JSON.toJSONString(routeVo));
|
}
|
return R.ok();
|
}
|
|
}
|