package com.xiaopeng.maintenance.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.feignClient.account.XpOperationUserClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.account.XpOperationsUser;
import com.xiaopeng.api.model.maintenance.XpChargingRecord;
import com.xiaopeng.api.model.maintenance.XpVehicleRepair;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.mapper.XpVehicleRepairMapper;
import com.xiaopeng.maintenance.model.query.XpVehicleRepairPageQuery;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairVO;
import com.xiaopeng.maintenance.service.IXpVehicleRepairService;
import com.xiaopeng.maintenance.vo.ChargingStatusVO;
import com.xiaopeng.maintenance.vo.RepairStatusVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* 车辆维修 服务实现类
*
*
* @author mitao
* @since 2026-02-03
*/
@Service
public class XpVehicleRepairServiceImpl extends ServiceImpl implements IXpVehicleRepairService {
@Autowired
private XpVehicleClient xpVehicleClient;
@Autowired
private XpOperationUserClient xpOperationUserClient;
@Override
public XpVehicleRepairVO repairDetail(Long id) {
// 查询车辆充电记录
XpVehicleRepair xpVehicleRepair = this.getById(id);
XpVehicleRepairVO xpVehicleRepairVO = new XpVehicleRepairVO();
BeanUtils.copyProperties(xpVehicleRepair, xpVehicleRepairVO);
// 查询车辆信息
XpVehicle xpVehicle = xpVehicleClient.queryById(xpVehicleRepair.getVehicleId()).getData();
if (Objects.nonNull(xpVehicle)) {
xpVehicleRepairVO.setPlateNumber(xpVehicle.getPlateNumber());
xpVehicleRepairVO.setVehiclePictures(xpVehicle.getVehiclePictures());
xpVehicleRepairVO.setAcceptOrTest(xpVehicle.getAcceptOrTest());
xpVehicleRepairVO.setVehicleColor(xpVehicle.getVehicleColor());
}
// 查询操作人
XpOperationsUser operationsUserStart = xpOperationUserClient.queryById(xpVehicleRepairVO.getSendUserId()).getData();
if (Objects.nonNull(operationsUserStart)) {
xpVehicleRepairVO.setOperatorStartName(operationsUserStart.getNickName());
}
XpOperationsUser operationsUserEnd = xpOperationUserClient.queryById(xpVehicleRepairVO.getReturnUserId()).getData();
if (Objects.nonNull(operationsUserEnd)) {
xpVehicleRepairVO.setOperatorStartName(operationsUserEnd.getNickName());
}
return xpVehicleRepairVO;
}
@Override
public PageInfo queryDetectionByVehicleId(XpVehicleRepairPageQuery query) {
// 1. 如果有操作人姓名过滤条件,先查询符合条件的用户ID列表
List userIds = null;
if (StringUtils.isNotBlank(query.getSendUserName())) {
R> userResult = xpOperationUserClient.listByName(query.getSendUserName());
List users = userResult.getData();
// 如果没有匹配的用户,直接返回空结果
if (CollectionUtils.isEmpty(users)) {
return new PageInfo<>(query.getPageNum(), query.getPageSize());
}
// 提取用户ID列表
userIds = users.stream()
.map(XpOperationsUser::getId)
.collect(Collectors.toList());
}
// 2. 使用 MyBatis-Plus Lambda 语法构建查询条件
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
// 必填条件: 车辆ID
wrapper.eq(XpVehicleRepair::getVehicleId, query.getVehicleId());
// 可选条件: 操作人ID列表
if (!CollectionUtils.isEmpty(userIds)) {
wrapper.in(XpVehicleRepair::getSendUserId, userIds);
}
// 可选条件: 开始时间
if (query.getStartTime() != null) {
wrapper.ge(XpVehicleRepair::getCreateTime, query.getStartTime().atStartOfDay());
}
// 可选条件: 结束时间
if (query.getEndTime() != null) {
wrapper.le(XpVehicleRepair::getCreateTime, query.getEndTime().atTime(23, 59, 59));
}
// 可选条件: 维修原因
if (query.getRepairReason() != null) {
wrapper.like(XpVehicleRepair::getRepairReason, query.getRepairReason());
}
// 排序: 按创建时间倒序
wrapper.orderByDesc(XpVehicleRepair::getCreateTime);
// 3. 执行分页查询
Page page = new Page<>(query.getPageNum(), query.getPageSize());
Page resultPage = this.page(page, wrapper);
// 4. 转换为 VO 并填充操作人姓名
List records = new ArrayList<>();
if (!CollectionUtils.isEmpty(resultPage.getRecords())) {
// 提取所有操作人ID
List allUserIds = resultPage.getRecords().stream()
.flatMap(record -> Stream.of(
record.getSendUserId(),
record.getReturnUserId()
))
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
// 批量查询操作人信息
Map userNameMap = new HashMap<>();
if (!CollectionUtils.isEmpty(allUserIds)) {
R> userResult = xpOperationUserClient.listByIds(allUserIds);
List users = userResult.getData();
if (!CollectionUtils.isEmpty(users)) {
userNameMap = users.stream()
.collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName));
}
}
// 转换并填充数据
for (XpVehicleRepair chargingRecord : resultPage.getRecords()) {
XpVehicleRepairVO vo = new XpVehicleRepairVO();
BeanUtils.copyProperties(chargingRecord, vo);
vo.setOperationTime(chargingRecord.getCreateTime());
// 填充操作人姓名
if (chargingRecord.getSendUserId() != null) {
String userName = userNameMap.get(chargingRecord.getSendUserId());
vo.setOperatorStartName(userName);
}
if (chargingRecord.getReturnUserId() != null) {
String userName = userNameMap.get(chargingRecord.getReturnUserId());
vo.setOperatorEndName(userName);
}
records.add(vo);
}
}
// 5. 构建分页结果
PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
pageInfo.setRecords(records);
pageInfo.setTotal(resultPage.getTotal());
return pageInfo;
}
@Override
public RepairStatusVO queryRepairStatus(Long vehicleId) {
RepairStatusVO repairStatusVO = new RepairStatusVO();
// 查询车辆当前维修信息
XpVehicleRepair xpVehicleRepair = this.getOne(new LambdaQueryWrapper()
.eq(XpVehicleRepair::getVehicleId, vehicleId)
.isNull(XpVehicleRepair::getReturnTime)
.isNull(XpVehicleRepair::getTaskId)
.orderByDesc(XpVehicleRepair::getCreateTime)
.last("LIMIT 1"));
if(Objects.nonNull(xpVehicleRepair)){
repairStatusVO.setStatus(2);
// 查询开始充电操作人名称
XpOperationsUser operationsUser = xpOperationUserClient.queryById(xpVehicleRepair.getSendUserId()).getData();
if(Objects.nonNull(operationsUser)){
repairStatusVO.setSendUserName(operationsUser.getNickName());
}
}else{
repairStatusVO.setStatus(1);
}
// 设置维修信息
repairStatusVO.setXpVehicleRepair(xpVehicleRepair);
return repairStatusVO;
}
}