package com.xiaopeng.order.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
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.google.common.collect.Lists;
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.XpCruiseOrderExcelQuery;
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 XpCruiseOrder cancelCruiseOrderByVin(String vin) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(XpCruiseOrder::getVehicleVin, vin).in(XpCruiseOrder::getStatus, Arrays.asList(0, 1));
List xpCruiseOrder = this.list(wrapper.orderByDesc(XpCruiseOrder::getCreateTime));
if (xpCruiseOrder != null && !xpCruiseOrder.isEmpty()) {
xpCruiseOrder.forEach(s->{
s.setStatus(2);
s.setVehicleId(null);
});
this.updateBatchById(xpCruiseOrder);
return xpCruiseOrder.get(0);
}
return null;
}
@Override
public R cancelCruiseOrderById(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 void completeCruiseOrder(Long id) {
XpCruiseOrder xpCruiseOrder = this.getById(id);
if (xpCruiseOrder != null) {
xpCruiseOrder.setStatus(3);
xpCruiseOrder.setVehicleId(null);
this.updateById(xpCruiseOrder);
}
}
@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;
}
@Override
public List getExportList(XpCruiseOrderExcelQuery query) {
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())) {
return Collections.emptyList();
}
List vehicleIds = vehicleResult.getData().stream().map(XpVehicle::getId).collect(Collectors.toList());
wrapper.in(XpCruiseOrder::getVehicleId, vehicleIds);
}
if (!CollectionUtils.isEmpty(query.getIds())) {
wrapper.in(XpCruiseOrder::getId, query.getIds());
}
wrapper.orderByDesc(XpCruiseOrder::getCreateTime);
List resultList = this.list(wrapper);
if (CollectionUtils.isEmpty(resultList)) {
return Collections.emptyList();
}
Set vehicleIds = resultList.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 = resultList.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 = resultList.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());
return voList;
}
@Override
public XpCruiseOrderPageVO getDetailById(Long id) {
XpCruiseOrder cruiseOrder = getById(id);
XpCruiseOrderPageVO xpCruiseOrderPageVO = BeanUtil.copyProperties(cruiseOrder, XpCruiseOrderPageVO.class);
if (Objects.isNull(xpCruiseOrderPageVO)) {
return new XpCruiseOrderPageVO();
}
XpVehicle vehicle = xpVehicleClient.queryById(cruiseOrder.getVehicleId()).getData();
if (Objects.nonNull(vehicle)) {
xpCruiseOrderPageVO.setPlateNumber(vehicle.getPlateNumber());
}
List data = xpFleetClient.listByIds(Lists.newArrayList(cruiseOrder.getFleetId())).getData();
if (CollUtil.isNotEmpty(data)) {
XpFleet xpFleet = data.get(0);
xpCruiseOrderPageVO.setFleetName(xpFleet.getFleetName());
}
return xpCruiseOrderPageVO;
}
}