| | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import com.xiaopeng.api.dto.map.RouteAndFareDto; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.VehicleControlClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.operation.XpElectronicFence; |
| | | import com.xiaopeng.api.model.operation.XpTradingStrategy; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import com.xiaopeng.operation.mapper.XpElectronicFenceMapper; |
| | | import com.xiaopeng.operation.service.IXpElectronicFenceAreaService; |
| | | import com.xiaopeng.operation.service.IXpTradingStrategyService; |
| | | import com.xiaopeng.operation.service.XpPointService; |
| | | import com.xiaopeng.operation.utils.mango.VehiclePositionService; |
| | | import com.xiaopeng.operation.utils.map.FastDistanceCalculator; |
| | | import com.xiaopeng.operation.vo.RouterVo; |
| | | import com.xiaopeng.operation.vo.VehiclePositionVo; |
| | | import org.redisson.Redisson; |
| | | import com.xiaopeng.api.vo.operation.VehiclePositionVo; |
| | | import lombok.SneakyThrows; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | private UserVehicleClient userVehicleClient; |
| | | |
| | | @Autowired |
| | | private XpVehicleClient xpVehicleClient; |
| | | |
| | | @Autowired |
| | | private RedissonClient redissonClient; |
| | | |
| | | @Autowired |
| | |
| | | threadPoolTaskExecutor.initialize(); |
| | | } |
| | | |
| | | @Autowired |
| | | private XpElectronicFenceMapper xpElectronicFenceMapper; |
| | | |
| | | /** |
| | | * 5秒执行一次 |
| | | */ |
| | | // @Scheduled(cron = "0/5 * * * * ?") |
| | | @Scheduled(cron = "0/5 * * * * ?") |
| | | public void taskOrder() { |
| | | System.out.println("5秒执行一次"); |
| | | Set<String> quoteMatchName = redisService.getQuoteMatchName(CacheConstants.QUEUE_POINT_ID); |
| | | for (String name : quoteMatchName) { |
| | | Object firstElement = redisService.getFirstElement(name); |
| | | String firstElement = redisService.getFirstElement(name); |
| | | if (firstElement != null) { |
| | | String[] split = firstElement.toString().split("_"); |
| | | // 如果市未处理 创建新任务 |
| | | if (split[2].equals("0")) { |
| | | // 状态改为处理中 |
| | | redisService.updateFirst(name, split[0] + "_" + split[1] + "_1"); |
| | | // redisService.updateFirst(name, split[0] + "_" + split[1] + "_1"+split[3]+split[4]+split[5]+split[6]); |
| | | threadPoolTaskExecutor.submit(() -> { |
| | | orderProcess(name, firstElement.toString()); |
| | | }); |
| | |
| | | * @param firstElement 队列第一个元素 |
| | | */ |
| | | private void orderProcess(String quoteName, String firstElement) { |
| | | System.out.println("进入处理环节"); |
| | | XpTradingStrategy xpTradingStrategy = xpTradingStrategyService.getOne(null); |
| | | String orderId = firstElement.split("_")[0]; |
| | | String lonLat = firstElement.split("_")[1]; |
| | |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | |
| | | // 最终没找到车 |
| | | redisService.popFirstElement(quoteName); |
| | | // redisService.popFirstElement(quoteName); |
| | | // 取消订单 |
| | | xpOrderClient.cancelOrder(orderId); |
| | | |
| | |
| | | * @param orderNo 订单号 |
| | | * @param xpTradingStrategy 规则 |
| | | */ |
| | | @SneakyThrows |
| | | private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) { |
| | | System.out.println("进入推单环环节"); |
| | | if(count==0){ |
| | | count=1; |
| | | } |
| | | // 订单状态 |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo); |
| | | if (xpOrderR.getCode() != 200) { |
| | |
| | | if (xpOrderR.getData().getStatus() != 1) { |
| | | return; |
| | | } |
| | | XpOrder xpOrder = xpOrderR.getData(); |
| | | |
| | | // 找出围栏id |
| | | Long xpElectronicFenceAreaId = xpOrder.getXpElectronicFenceAreaId(); |
| | | Long electronicId = xpElectronicFenceAreaService.getById(xpElectronicFenceAreaId).getElectronicId(); |
| | | XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId); |
| | | |
| | | for (int i = 0; i < count; i++) { |
| | | |
| | | System.out.println("进入找车环节"); |
| | | // 根据距离找车 |
| | | // 车多则根据配置找具体车数量 根据距离最近 |
| | | // 更改 暂不限制数量 |
| | | |
| | | List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount()); |
| | | |
| | | // 获取车辆的区域信息 |
| | | if (positionList.isEmpty()) { |
| | | continue; |
| | | } |
| | | List<String> vinList = positionList.stream().map(VehiclePosition::getVin).collect(Collectors.toList()); |
| | | |
| | | // 获取车辆的信息 筛选出可用车辆 |
| | | R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount())); |
| | | if (vehiclePositionVos.getCode() != 200) { |
| | | continue; |
| | | } |
| | | |
| | | List<VehiclePositionVo> availableVehiclesNearby = BeanUtil.copyToList(positionList, VehiclePositionVo.class); |
| | | List<String> data = vehiclePositionVos.getData(); |
| | | |
| | | // 找出符合条件的 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().filter(e -> data.contains(e.getVin())).collect(Collectors.toList()); |
| | | |
| | | // List<VehiclePositionVo> availableVehiclesNearby =vehiclePositionVos.getData(); |
| | | |
| | | if (!availableVehiclesNearby.isEmpty()) { |
| | | if (availableVehiclesNearby.size() > 1) { |
| | |
| | | |
| | | if (max1.equals(weightElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby= availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | |
| | | |
| | | // 算出总分 再来排序计算 |
| | | for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) { |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference()+ vehiclePositionVo.getTimeDifference()); |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()); |
| | | } |
| | | availableVehiclesNearby= availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList()); |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList()); |
| | | |
| | | |
| | | int size = tendencyOrderValue; |
| | |
| | | Integer secondMax = values.get(1); |
| | | |
| | | // 判断第二大的是哪个 |
| | | if(Objects.equals(secondMax, tendencyDistance)){ |
| | | if (Objects.equals(secondMax, tendencyDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | } |
| | | |
| | | |
| | | if(Objects.equals(secondMax, tendencyTime)){ |
| | | if (Objects.equals(secondMax, tendencyTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | |
| | | |
| | | // 订单价值 |
| | | if(Objects.equals(secondMax, tendencyOrderValue)){ |
| | | if (Objects.equals(secondMax, tendencyOrderValue)) { |
| | | |
| | | |
| | | } |
| | |
| | | } |
| | | VehiclePositionVo vehiclePositionVo = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getTotal).reversed()).collect(Collectors.toList()).get(0); |
| | | |
| | | |
| | | VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo; |
| | | RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo1.getVin()); |
| | | // |
| | | // VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo; |
| | | RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin()); |
| | | lock.lock(10, TimeUnit.SECONDS); |
| | | try { |
| | | VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id()); |
| | | // VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id()); |
| | | R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin()); |
| | | if (vehiclePositionR.getCode() != 200) { |
| | | continue; |
| | | } |
| | | XpVehicle vehiclePosition = vehiclePositionR.getData(); |
| | | if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0) { |
| | | lock.unlock(); |
| | | continue; |
| | | } |
| | | if (vehiclePosition.getHasOrder() == 1) { |
| | | // 关闭巡游单子 TODO |
| | | } |
| | | // 关闭巡游单子 TODO |
| | | |
| | | AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo(); |
| | | addTaxiPassengerVo.setVin(vehiclePosition.getVin()); |
| | | addTaxiPassengerVo.setVin(vehiclePosition.getVehicleVin()); |
| | | addTaxiPassengerVo.setUid(uid); |
| | | addTaxiPassengerVo.setOrderNo(orderNo); |
| | | // TODO appid |
| | | addTaxiPassengerVo.setAppId(""); |
| | | |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); |
| | | if (baseVehicleUserDto.getCode() == 200) { |
| | | |
| | | // TODO 下单 |
| | | // 绑定成功 弹出这个队列第一个订单 |
| | | redisService.popFirstElement(quoteName); |
| | |
| | | } else { |
| | | // 直接派单 定义一个锁来锁定车辆 |
| | | VehiclePosition vehiclePosition = positionList.get(0); |
| | | Long vehicleId = vehiclePosition.getVehicle_id(); |
| | | String vehicleVin = vehiclePosition.getVin(); |
| | | |
| | | RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin()); |
| | | lock.lock(10, TimeUnit.SECONDS); |
| | | try { |
| | | // 查询车辆状态 |
| | | VehiclePosition vehicleId1 = vehiclePositionService.findByVehicleId(vehicleId); |
| | | R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin); |
| | | if(vehicleR.getCode()!=200){ |
| | | continue; |
| | | } |
| | | XpVehicle vehicleId1 = vehicleR.getData(); |
| | | if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) { |
| | | lock.unlock(); |
| | | continue; |