“mitao”
2026-02-12 da398766e67f9a1673032e3215eeea1bea2a3c3c
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpChargingRecordServiceImpl.java
@@ -1,22 +1,31 @@
package com.xiaopeng.maintenance.service.impl;
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.XpChargingRecord;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.maintenance.model.query.XpChargingRecordPageQuery;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.maintenance.dto.XpChargingRecordStartDTO;
import com.xiaopeng.maintenance.dto.XpChargingRecordStopDTO;
import com.xiaopeng.maintenance.mapper.XpChargingRecordMapper;
import com.xiaopeng.maintenance.model.vo.XpChargingRecordVO;
import com.xiaopeng.maintenance.service.IXpChargingRecordService;
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.time.LocalDateTime;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * <p>
@@ -81,4 +90,100 @@
        }
        return xpChargingRecordVO;
    }
    @Override
    public PageInfo<XpChargingRecordVO> queryChargingByVehicleId(XpChargingRecordPageQuery query) {
        // 1. 如果有操作人姓名过滤条件,先查询符合条件的用户ID列表
        List<Long> userIds = null;
        if (StringUtils.isNotBlank(query.getOperationsUserName())) {
            R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByName(query.getOperationsUserName());
            List<XpOperationsUser> 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<XpChargingRecord> wrapper = new LambdaQueryWrapper<>();
        // 必填条件: 车辆ID
        wrapper.eq(XpChargingRecord::getVehicleId, query.getVehicleId());
        // 可选条件: 操作人ID列表
        if (!CollectionUtils.isEmpty(userIds)) {
            wrapper.in(XpChargingRecord::getStartOperationsUserId, userIds);
        }
        // 可选条件: 开始时间
        if (query.getStartTime() != null) {
            wrapper.ge(XpChargingRecord::getCreateTime, query.getStartTime().atStartOfDay());
        }
        // 可选条件: 结束时间
        if (query.getEndTime() != null) {
            wrapper.le(XpChargingRecord::getCreateTime, query.getEndTime().atTime(23, 59, 59));
        }
        // 排序: 按创建时间倒序
        wrapper.orderByDesc(XpChargingRecord::getCreateTime);
        // 3. 执行分页查询
        Page<XpChargingRecord> page = new Page<>(query.getPageNum(), query.getPageSize());
        Page<XpChargingRecord> resultPage = this.page(page, wrapper);
        // 4. 转换为 VO 并填充操作人姓名
        List<XpChargingRecordVO> records = new ArrayList<>();
        if (!CollectionUtils.isEmpty(resultPage.getRecords())) {
            // 提取所有操作人ID
            List<Long> allUserIds = resultPage.getRecords().stream()
                    .flatMap(record -> Stream.of(
                            record.getStartOperationsUserId(),
                            record.getEndOperationsUserId()
                    ))
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
            // 批量查询操作人信息
            Map<Long, String> userNameMap = new HashMap<>();
            if (!CollectionUtils.isEmpty(allUserIds)) {
                R<List<XpOperationsUser>> userResult = xpOperationUserClient.listByIds(allUserIds);
                List<XpOperationsUser> users = userResult.getData();
                if (!CollectionUtils.isEmpty(users)) {
                    userNameMap = users.stream()
                            .collect(Collectors.toMap(XpOperationsUser::getId, XpOperationsUser::getNickName));
                }
            }
            // 转换并填充数据
            for (XpChargingRecord chargingRecord : resultPage.getRecords()) {
                XpChargingRecordVO vo = new XpChargingRecordVO();
                BeanUtils.copyProperties(chargingRecord, vo);
                vo.setOperationTime(chargingRecord.getCreateTime());
                // 填充操作人姓名
                if (chargingRecord.getStartOperationsUserId() != null) {
                    String userName = userNameMap.get(chargingRecord.getStartOperationsUserId());
                    vo.setOperatorStartName(userName);
                }
                if (chargingRecord.getEndOperationsUserId() != null) {
                    String userName = userNameMap.get(chargingRecord.getEndOperationsUserId());
                    vo.setOperatorEndName(userName);
                }
                records.add(vo);
            }
        }
        // 5. 构建分页结果
        PageInfo<XpChargingRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        pageInfo.setRecords(records);
        pageInfo.setTotal(resultPage.getTotal());
        return pageInfo;
    }
}