package com.xiaopeng.maintenance.service.impl; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.XpVehiclePreparation; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.evi.oss.service.AliOssService; import com.xiaopeng.maintenance.model.query.XpVehiclePreparationPageQuery; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.maintenance.XpVehiclePreparationDetailVO; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.maintenance.mapper.*; import com.xiaopeng.maintenance.model.query.OperationRecordsQuery; import com.xiaopeng.maintenance.model.vo.OperationRecordsVO; import com.xiaopeng.maintenance.model.vo.XpVehiclePreparationVO; import com.xiaopeng.maintenance.service.IXpVehiclePreparationService; import com.xiaopeng.maintenance.utils.AliOssDownloadUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; 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.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** *

* 车辆整备 服务实现类 *

* * @author mitao * @since 2026-02-03 */ @Service public class XpVehiclePreparationServiceImpl extends ServiceImpl implements IXpVehiclePreparationService { @Autowired private XpVehiclePreparationMapper xpVehiclePreparationMapper; @Autowired private XpChargingRecordMapper xpChargingRecordMapper; @Autowired private XpVehicleDetectionMapper xpVehicleDetectionMapper; @Autowired private XpVehicleRepairMapper xpVehicleRepairMapper; @Autowired private XpVehicleCleanMapper xpVehicleCleanMapper; @Autowired private XpOperationUserClient xpOperationUserClient; @Autowired private XpVehicleClient xpVehicleClient; @Autowired private MongoTemplate mongoTemplate; @Autowired private AliOssService aliOssService; @Autowired private AliOssDownloadUtil aliOssDownloadUtil; @Override public PageInfo operationRecords(OperationRecordsQuery query) { PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List operationRecords; switch (query.getOperationType()) { case 1: // 整备记录 operationRecords = xpVehiclePreparationMapper.operationRecords(query,pageInfo); break; case 2: // 充电记录 operationRecords = xpChargingRecordMapper.operationRecords(query,pageInfo); if(!CollectionUtils.isEmpty(operationRecords)){ for (OperationRecordsVO operationRecord : operationRecords) { operationRecord.setStartMileageRange(Objects.isNull(operationRecord.getStartMileageRange())?0.0f:operationRecord.getStartMileageRange()); operationRecord.setEndMileageRange(Objects.isNull(operationRecord.getEndMileageRange())?0.0f:operationRecord.getEndMileageRange()); } } break; case 3: // 检测记录 operationRecords = xpVehicleDetectionMapper.operationRecords(query,pageInfo); break; case 4: // 维修记录 operationRecords = xpVehicleRepairMapper.operationRecords(query,pageInfo); break; default: // 清洁记录 operationRecords = xpVehicleCleanMapper.operationRecords(query,pageInfo); break; } if(CollectionUtils.isEmpty(operationRecords)){ return pageInfo; } List userIds = operationRecords.stream().map(OperationRecordsVO::getOperationsUserId).distinct().collect(Collectors.toList()); // 查询操作人信息 R> listR = xpOperationUserClient.listByIds(userIds); List xpOperationsUsers = listR.getData(); if(!CollectionUtils.isEmpty(xpOperationsUsers)){ for (OperationRecordsVO operationRecord : operationRecords) { List xpOperationsUserList = xpOperationsUsers.stream().filter(xpOperationsUser -> xpOperationsUser.getId().equals(operationRecord.getOperationsUserId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(xpOperationsUserList)){ XpOperationsUser xpOperationsUser = xpOperationsUserList.get(0); operationRecord.setOperatorName(xpOperationsUser.getNickName()); } } } List vehicleIds = operationRecords.stream().map(OperationRecordsVO::getVehicleId).collect(Collectors.toList()); // 查询车辆信息 List xpVehicles = xpVehicleClient.listByIds(vehicleIds).getData(); if(!CollectionUtils.isEmpty(xpVehicles)){ for (OperationRecordsVO operationRecord : operationRecords) { List xpVehicleList = xpVehicles.stream().filter(xpVehicle -> xpVehicle.getId().equals(operationRecord.getVehicleId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(xpVehicleList)){ XpVehicle xpVehicle = xpVehicleList.get(0); operationRecord.setPlateNumber(xpVehicle.getPlateNumber()); operationRecord.setVehiclePictures(xpVehicle.getVehiclePictures()); operationRecord.setAcceptOrTest(xpVehicle.getAcceptOrTest()); } } } pageInfo.setRecords(operationRecords); return pageInfo; } @Override public XpVehiclePreparationVO preparationDetail(Long id) { // 查询车辆充电记录 XpVehiclePreparation xpVehiclePreparation = this.getById(id); XpVehiclePreparationVO xpVehiclePreparationVO = new XpVehiclePreparationVO(); BeanUtils.copyProperties(xpVehiclePreparation, xpVehiclePreparationVO); xpVehiclePreparationVO.setOperationTime(xpVehiclePreparation.getCreateTime()); // 查询车辆信息 XpVehicle xpVehicle = xpVehicleClient.queryById(xpVehiclePreparation.getVehicleId()).getData(); if (Objects.nonNull(xpVehicle)) { xpVehiclePreparationVO.setPlateNumber(xpVehicle.getPlateNumber()); xpVehiclePreparationVO.setVehiclePictures(xpVehicle.getVehiclePictures()); xpVehiclePreparationVO.setAcceptOrTest(xpVehicle.getAcceptOrTest()); xpVehiclePreparationVO.setVehicleColor(xpVehicle.getVehicleColor()); } // 查询操作人 XpOperationsUser operationsUserStart = xpOperationUserClient.queryById(xpVehiclePreparationVO.getOperationsUserId()).getData(); if (Objects.nonNull(operationsUserStart)) { xpVehiclePreparationVO.setOperatorStartName(operationsUserStart.getNickName()); } // 图片封装 try { // 大灯 String headLight = xpVehiclePreparation.getHeadLight(); if (StringUtils.isNotBlank(headLight)) { JSONArray jsonArray = JSONArray.parseArray(headLight); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); jsonObject.put("url", downloadUrl); } xpVehiclePreparationVO.setHeadLight(JSONArray.toJSONString(jsonArray)); } // 转向灯 String turnSignal = xpVehiclePreparation.getTurnSignal(); if (StringUtils.isNotBlank(turnSignal)) { JSONArray jsonArray = JSONArray.parseArray(turnSignal); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); jsonObject.put("url", downloadUrl); } xpVehiclePreparationVO.setTurnSignal(JSONArray.toJSONString(jsonArray)); } // 刹车灯 String brakeLight = xpVehiclePreparation.getBrakeLight(); if (StringUtils.isNotBlank(brakeLight)) { JSONArray jsonArray = JSONArray.parseArray(brakeLight); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); jsonObject.put("url", downloadUrl); } xpVehiclePreparationVO.setBrakeLight(JSONArray.toJSONString(jsonArray)); } // 雾灯 String fogLight = xpVehiclePreparation.getFogLight(); if (StringUtils.isNotBlank(fogLight)) { JSONArray jsonArray = JSONArray.parseArray(fogLight); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); jsonObject.put("url", downloadUrl); } xpVehiclePreparationVO.setFogLight(JSONArray.toJSONString(jsonArray)); } // 舱内清洁 String cabinCleaning = xpVehiclePreparation.getCabinCleaning(); if (StringUtils.isNotBlank(cabinCleaning)) { JSONArray jsonArray = JSONArray.parseArray(cabinCleaning); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (Objects.isNull(jsonObject)) { continue; } String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true); jsonObject.put("url", downloadUrl); } xpVehiclePreparationVO.setCabinCleaning(JSONArray.toJSONString(jsonArray)); } } catch (Exception e) { e.printStackTrace(); } return xpVehiclePreparationVO; } @Override public PageInfo queryPreparationByVehicleId(XpVehiclePreparationPageQuery query) { // 1. 如果有操作人姓名过滤条件,先查询符合条件的用户ID列表 List userIds = null; if (StringUtils.isNotBlank(query.getOperationsUserName())) { R> userResult = xpOperationUserClient.listByName(query.getOperationsUserName()); 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(XpVehiclePreparation::getVehicleId, query.getVehicleId()); // 可选条件: 操作人ID列表 if (!CollectionUtils.isEmpty(userIds)) { wrapper.in(XpVehiclePreparation::getOperationsUserId, userIds); } // 可选条件: 开始时间 if (query.getStartTime() != null) { wrapper.ge(XpVehiclePreparation::getCreateTime, query.getStartTime().atStartOfDay()); } // 可选条件: 结束时间 if (query.getEndTime() != null) { wrapper.le(XpVehiclePreparation::getCreateTime, query.getEndTime().atTime(23, 59, 59)); } // 排序: 按创建时间倒序 wrapper.orderByDesc(XpVehiclePreparation::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() .map(XpVehiclePreparation::getOperationsUserId) .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 (XpVehiclePreparation preparation : resultPage.getRecords()) { XpVehiclePreparationDetailVO vo = new XpVehiclePreparationDetailVO(); BeanUtils.copyProperties(preparation, vo); vo.setOperationTime(preparation.getCreateTime()); // 填充操作人姓名 if (preparation.getOperationsUserId() != null) { String userName = userNameMap.get(preparation.getOperationsUserId()); vo.setOperationsUserName(userName); } preparation.setLeftFrontWheel(aliOssDownloadUtil.getPictureJsonArray(preparation.getLeftFrontWheel())); preparation.setRightFrontWheel(aliOssDownloadUtil.getPictureJsonArray(preparation.getRightFrontWheel())); preparation.setLeftRearWheel(aliOssDownloadUtil.getPictureJsonArray(preparation.getLeftRearWheel())); preparation.setRightRearWheel(aliOssDownloadUtil.getPictureJsonArray(preparation.getRightRearWheel())); preparation.setBrakeLight(aliOssDownloadUtil.getPictureJsonArray(preparation.getBrakeLight())); preparation.setFogLight(aliOssDownloadUtil.getPictureJsonArray(preparation.getFogLight())); preparation.setBodyEmblem(aliOssDownloadUtil.getPictureJsonArray(preparation.getBodyEmblem())); preparation.setCabinCleaning(aliOssDownloadUtil.getPictureJsonArray(preparation.getCabinCleaning())); preparation.setLostItems(aliOssDownloadUtil.getPictureJsonArray(preparation.getLostItems())); records.add(vo); } } // 5. 构建分页结果 PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); pageInfo.setRecords(records); pageInfo.setTotal(resultPage.getTotal()); return pageInfo; } }