xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -1,12 +1,10 @@ package com.xiaopeng.automaticPilot.controller; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO; import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.PopOrderDto; @@ -20,7 +18,6 @@ import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.model.order.XpOrder;import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.SystemEventType; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.api.vo.automaticPilot.protobuf.*; @@ -35,7 +32,6 @@ import com.xiaopeng.common.redis.service.RedisService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; @@ -46,7 +42,10 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -324,12 +323,15 @@ long sequence = snowflake.nextId(); MqttPublishDto mqttPublishDto = xpuUtil.cloudCreateOrder(taskListBuilder.build(), dto.getVin(),sequence); //先将车辆修改状态,防止在异步通知之前被其他订单选中 if(!dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.CRUISE_ORDER) && !dto.getOrderType().equals(com.xiaopeng.api.vo.OrderType.TEST_CRUISE_ORDER) && mqttPublishDto.getCode()== 200){ // 修改车子为接单状态 xpVehicleClient.updateVehicleStatus(new UpdateVehicleStateDto(dto.getVin(), 1)); // TODO[流量接入] 通过设置的URL发送订单和导航路线给运力 } if(null != mqttPublishDto && mqttPublishDto.getCode() == 200){ xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/ActiveOrderController.java
@@ -2,11 +2,7 @@ import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.order.OrderChangeDto; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.operation.RouteAndFareVo; import com.xiaopeng.api.vo.operation.VehiclePositionVo; import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.itinerary.service.ActiveOrderService; import com.xiaopeng.itinerary.service.XpPricingService; @@ -14,22 +10,16 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; 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 javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** @@ -81,10 +71,5 @@ activeOrderService.orderChange(dto, uid); return R.ok(); } @Resource private MongoTemplate mongoTemplate; } xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/controller/XpPricingController.java
@@ -107,8 +107,6 @@ return R.ok(xpPricingService.getWaitTime(dto.getLongitude(), dto.getLatitude())); } /** * 播单 */ @@ -134,9 +132,6 @@ saveOrderVo.setOrderId(orderId); return R.ok(saveOrderVo); } /** xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpTradingStrategyController.java
@@ -1,5 +1,6 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.model.operation.XpTradingStrategy; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.controller.BaseController; import com.xiaopeng.operation.dto.XpTradingStrategyEditDTO; @@ -44,6 +45,8 @@ @ApiOperation(value = "获取交易策略配置", tags = {"inner-交易策略配置"}) @GetMapping("/logan/inner/xpOperationStrategy/getOne") public R<XpTradingStrategyDetailVO> getOne() { // TODO[流量接入] 这里需要判断是哪个三方车队的,获取到对应的交易策略 XpTradingStrategyDetailVO detail = tradingStrategyService.queryDetail(); return R.ok(detail); } @@ -60,4 +63,13 @@ tradingStrategyService.editStrategy(dto); return R.ok(); } @ApiOperation(value = "三方车队的交易策略", tags = {"流量接入-信息录入-设置交易策略"}) @PostMapping("/api/v1/xp-rt/strategy") public R<?> add(@Validated @RequestBody XpTradingStrategy dto) {//创建只接收部分可设置的参数的dto // 通过key认证是哪个三方车队 tradingStrategyService.save(dto); return R.ok(); } } xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgHandler.java
File was deleted xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/TestMsgSchedule.java
New file @@ -0,0 +1,54 @@ package com.xiaopeng.pushMessage.webSocket.handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.xiaopeng.api.feignClient.maintenance.XpTaskClient; import com.xiaopeng.api.model.maintenance.XpTask; import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.HashMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @Component @Slf4j //public class TestMsgHandler implements BusinessMsgHandler{ public class TestMsgSchedule { @Resource XpTaskClient xpTaskClient; @Autowired private WebSocketUserService webSocketUserService; @PostConstruct public void setup() { Executors.newSingleThreadScheduledExecutor() .scheduleWithFixedDelay(this::send, 10, 1, TimeUnit.MINUTES); } public void send() { String msg; XpTask xpTask = xpTaskClient.queryInfoByVehicleId(20L).getData(); HashMap<String, Object> ret = new HashMap<>(); ret.put("type", "task"); ret.put("data", xpTask); try { msg = om.writeValueAsString(ret); } catch (JsonProcessingException e) { throw new RuntimeException("Message serialization failed", e); } webSocketUserService.broadcastMessage(msg); } @Autowired ObjectMapper om; @Autowired MongoTemplate mongoTemplate; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/config/MiniprogramConfigurer.java
@@ -10,7 +10,7 @@ import javax.annotation.Resource; @Slf4j @Configuration //@Configuration public class MiniprogramConfigurer extends WebMvcConfigurerAdapter { @Resource xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetController.java
@@ -10,7 +10,10 @@ import com.xiaopeng.vehicleConvoy.model.query.FleetPageQuery; import com.xiaopeng.vehicleConvoy.model.query.FleetUserPageQuery; import com.xiaopeng.vehicleConvoy.model.query.FleetVehiclePageQuery; import com.xiaopeng.vehicleConvoy.model.vo.*; import com.xiaopeng.vehicleConvoy.model.vo.FleetDetailVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetPageVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetUserVO; import com.xiaopeng.vehicleConvoy.model.vo.FleetVehicleVO; import com.xiaopeng.vehicleConvoy.service.IXpFleetOperationsService; import com.xiaopeng.vehicleConvoy.service.IXpFleetService; import io.swagger.annotations.*; @@ -220,4 +223,17 @@ public R<List<XpFleet>> getList() { return R.ok(xpFleetService.list()); } @ApiOperation(value = "品牌信息", tags = {"流量接入-信息录入-品牌展示信息"}) @PostMapping("/api/v1/xp-rt/brand-info") public R<?> JoinUs( @ApiParam(value = "车辆信息", required = true) @RequestBody XpFleet fleet ) { //包含接收订单的URL xpFleetService.save(fleet); return R.ok(); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpFleetVehicleController.java
@@ -1,12 +1,13 @@ package com.xiaopeng.vehicleConvoy.controller; import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -59,4 +60,29 @@ List<Long> vehicleIds = xpFleetVehicleService.listVehicleIdsByFleetId(fleetId); return R.ok(vehicleIds); } @ApiOperation(value = "添加车辆", tags = {"流量接入-信息录入-车辆"}) @PostMapping("/api/v1/xp-rt/vehicle") public R<?> add( @ApiParam(value = "车辆信息", required = true) @RequestBody XpFleetVehicle fleetVehicle ) { xpFleetVehicleService.save(fleetVehicle); return R.ok(); } @Resource MongoTemplate mongoTemplate; @ApiOperation(value = "车辆", tags = {"流量接入-信息录入-车辆"}) @PostMapping("/api/v1/xp-rt/vehicle/position") public R<?> JoinUs( @ApiParam(value = "车辆位置信息", required = true) @RequestBody VehiclePosition vp ) { mongoTemplate.save(vp); return R.ok(); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -1163,14 +1163,12 @@ return R.ok(vehicleDoorStatus); } @Resource XpVehicleClient xpVehicleClient; /** * 周围车辆点位查询 */ @ApiOperation(value = "周围车辆点位查询", notes = "", tags = {"小程序-周围车辆点位查询"}) @GetMapping("/api/v1/mini-program/vehicle/nearby") @XpClientCheck(checkToken = false) @XpClientCheck(checkToken = false, checkOtpToken = false) public R<List<XpVehicleVO>> carAround(@RequestParam double lon,@RequestParam double lat) { Point point = new Point(lon, lat); @@ -1180,20 +1178,51 @@ .maxDistance(distance.getNormalizedValue()); Query query = new Query(criteria); List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class); if (CollectionUtils.isEmpty(vehiclePositions)) { return R.ok(new ArrayList<>()); } List<XpVehicleVO> xpVehicleList = vehiclePositions.stream() .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance)) .map(vp -> { XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vp.getVin()).getData(); XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getVehicleVin, vp.getVin())); if (xpVehicle == null) { return null; } XpVehicleVO vo = new XpVehicleVO(); BeanUtils.copyProperties(xpVehicle, vo); vo.setDirection(vp.getCourse()); return vo; }) .filter(v -> v.getState() == 0) .filter(Objects::nonNull) .filter(v -> v.getState() != null && v.getState() == 0) .limit(5) .collect(Collectors.toList()); return R.ok(xpVehicleList); } @ApiOperation(value = "上报车辆位置", notes = "", tags = {"流量接入-上报车辆位置"}) @PostMapping("/api/v1/xp-rt/vehicle/position") public R<List<XpVehicleVO>> pushVehiclePosition(@RequestBody VehiclePosition vp) { // 更新到mongodb,用于被分配订单 // 如果是接单中,更新导航路线 return R.ok(); } /** * {@Link OrderStatusEnum} * @param vp * @return */ @ApiOperation(value = "更新车辆状态", notes = "", tags = {"流量接入-更新车辆状态"}) @PostMapping("/api/v1/xp-rt/vehicle/status") public R<List<XpVehicleVO>> pushVehicleStatus(@RequestBody VehiclePosition vp) { // 前往接驾,等待上车,前往终点,到达终点等待下车,结束订单 // 更新order状态 return R.ok(); } }