package com.xiaopeng.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpFleetVehicleClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpCruiseOrder; import com.xiaopeng.api.model.vehicleConvoy.XpFleet; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.core.web.domain.BaseModel; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.order.mapper.XpCruiseOrderMapper; import com.xiaopeng.order.model.query.XpCruiseOrderPageQuery; import com.xiaopeng.order.model.vo.XpCruiseOrderPageVO; import com.xiaopeng.order.service.IXpCruiseOrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; /** *

* 订单 服务实现类 *

* * @author mitao * @since 2026-02-03 */ @Slf4j @Service @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpCruiseOrderServiceImpl extends ServiceImpl implements IXpCruiseOrderService { private final XpVehicleClient xpVehicleClient; private final XpFleetVehicleClient xpFleetVehicleClient; private final XpFleetClient xpFleetClient; private final OrderMissionClient orderMissionClient; /** * 关闭当前巡游单子 * @param vin */ @Override public Long updateCruiseOrder(String vin) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(XpCruiseOrder::getVehicleVin, vin).eq(XpCruiseOrder::getStatus, 1); XpCruiseOrder xpCruiseOrder = this.getOne(wrapper); if (xpCruiseOrder != null) { xpCruiseOrder.setStatus(2); this.update(xpCruiseOrder, wrapper); PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(vin); pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId()); pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER); R booleanR = orderMissionClient.cancelOrder(pushOrderDto); if(booleanR==null || !booleanR.getData()){ log.error("XPU取消巡游订单失败"); return null; } return xpCruiseOrder.getId(); } return null; } @Override public R updateCruiseOrderId(Long orderId) { XpCruiseOrder xpCruiseOrder = this.getById(orderId); if (xpCruiseOrder != null) { xpCruiseOrder.setStatus(2); xpCruiseOrder.setVehicleId(null); this.updateById(xpCruiseOrder); PushOrderDto pushOrderDto = new PushOrderDto(); pushOrderDto.setVin(xpCruiseOrder.getVehicleVin()); pushOrderDto.setOrderId("XU" + xpCruiseOrder.getId()); pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER); R booleanR = orderMissionClient.cancelOrder(pushOrderDto); if(booleanR==null || !booleanR.getData()){ log.error("XPU取消巡游订单失败"); return R.fail("XPU取消巡游订单失败"); } return R.ok(); } return R.fail("获取订单失败"); } @Override public Long closeCruiseOrder(String vin) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(XpCruiseOrder::getVehicleVin, vin).eq(XpCruiseOrder::getStatus, 1); XpCruiseOrder xpCruiseOrder = this.getOne(wrapper); if (xpCruiseOrder != null) { xpCruiseOrder.setStatus(3); this.update(xpCruiseOrder, wrapper); return xpCruiseOrder.getId(); } return null; } @Override public PageInfo pageList(XpCruiseOrderPageQuery query) { PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(XpCruiseOrder::getMissionId, String.valueOf(query.getMissionId())) .like(Objects.nonNull(query.getId()), XpCruiseOrder::getId, query.getId()) .eq(query.getStatus() != null, XpCruiseOrder::getStatus, query.getStatus()) .eq(Objects.nonNull(query.getFleetId()), XpCruiseOrder::getFleetId, query.getFleetId()); if (query.getStartTime() != null) { wrapper.ge(BaseModel::getCreateTime, query.getStartTime().atStartOfDay()); } if (query.getEndTime() != null) { wrapper.le(BaseModel::getCreateTime, query.getEndTime().plusDays(1).atStartOfDay()); } //使用订单中的车队ID进行查询 // if (query.getFleetId() != null) { // R> fleetVehicleResult = xpFleetVehicleClient.listVehicleIdsByFleetId(query.getFleetId()); // if (fleetVehicleResult == null || CollectionUtils.isEmpty(fleetVehicleResult.getData())) { // pageInfo.setRecords(Collections.emptyList()); // return pageInfo; // } // wrapper.in(XpCruiseOrder::getVehicleId, fleetVehicleResult.getData()); // } if (StringUtils.isNotBlank(query.getPlateNumber())) { R> vehicleResult = xpVehicleClient.listByPlateNumber(query.getPlateNumber()); if (vehicleResult == null || CollectionUtils.isEmpty(vehicleResult.getData())) { pageInfo.setRecords(Collections.emptyList()); return pageInfo; } List vehicleIds = vehicleResult.getData().stream().map(XpVehicle::getId).collect(Collectors.toList()); wrapper.in(XpCruiseOrder::getVehicleId, vehicleIds); } wrapper.orderByDesc(XpCruiseOrder::getCreateTime); Page page = new Page<>(query.getPageNum(), query.getPageSize()); Page pageResult = this.page(page, wrapper); if (CollectionUtils.isEmpty(pageResult.getRecords())) { pageInfo.setTotal(0L); pageInfo.setRecords(Collections.emptyList()); return pageInfo; } Set vehicleIds = pageResult.getRecords().stream() .map(XpCruiseOrder::getVehicleId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map vehicleMap; if (!vehicleIds.isEmpty()) { R> vehicleResult = xpVehicleClient.listByIds(new ArrayList<>(vehicleIds)); if (vehicleResult != null && !CollectionUtils.isEmpty(vehicleResult.getData())) { vehicleMap = vehicleResult.getData().stream().collect(Collectors.toMap(XpVehicle::getId, v -> v)); } else { vehicleMap = Collections.emptyMap(); } } else { vehicleMap = Collections.emptyMap(); } // Map vehicleFleetIdMap = new HashMap<>(); // if (!vehicleIds.isEmpty()) { // for (Long vehicleId : vehicleIds) { // R fleetIdResult = xpFleetVehicleClient.getFleetIdByVehicleId(vehicleId); // if (fleetIdResult != null && fleetIdResult.getData() != null) { // vehicleFleetIdMap.put(vehicleId, fleetIdResult.getData()); // } // } // } // Map fleetNameMap; // if (!vehicleFleetIdMap.isEmpty()) { // List fleetIds = vehicleFleetIdMap.values().stream().distinct().collect(Collectors.toList()); // R> fleetResult = xpFleetClient.listByIds(fleetIds); // if (fleetResult != null && !CollectionUtils.isEmpty(fleetResult.getData())) { // fleetNameMap = fleetResult.getData().stream() // .collect(Collectors.toMap(XpFleet::getId, XpFleet::getFleetName, (a, b) -> a)); // } else { // fleetNameMap = Collections.emptyMap(); // } // } else { // fleetNameMap = Collections.emptyMap(); // } Map fleetNameMap; Set fleetIds = pageResult.getRecords().stream() .map(XpCruiseOrder::getFleetId) .filter(Objects::nonNull) .collect(Collectors.toSet()); if (!fleetIds.isEmpty()) { R> fleetResult = xpFleetClient.listByIds(new ArrayList<>(fleetIds)); if (fleetResult != null && !CollectionUtils.isEmpty(fleetResult.getData())) { fleetNameMap = fleetResult.getData().stream() .collect(Collectors.toMap(XpFleet::getId, XpFleet::getFleetName, (a, b) -> a)); } else { fleetNameMap = Collections.emptyMap(); } } else { fleetNameMap = Collections.emptyMap(); } List voList = pageResult.getRecords().stream().map(order -> { XpCruiseOrderPageVO vo = new XpCruiseOrderPageVO(); BeanUtils.copyProperties(order, vo); XpVehicle vehicle = vehicleMap.get(order.getVehicleId()); if (vehicle != null) { vo.setPlateNumber(vehicle.getPlateNumber()); } // Long fleetId = vehicleFleetIdMap.get(order.getVehicleId()); Long fleetId = order.getFleetId(); if (fleetId != null) { vo.setFleetName(fleetNameMap.get(fleetId)); } return vo; }).collect(Collectors.toList()); pageInfo.setTotal(pageResult.getTotal()); pageInfo.setRecords(voList); return pageInfo; } }