liujie
2026-06-09 c96fbe6b0aeb413a17c429133ee6d81d138144b9
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpChargingRecordServiceImpl.java
@@ -1,27 +1,38 @@
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.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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.maintenance.model.query.XpChargingRecordPageQuery;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.SensitiveDataCryptoUtil;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.evi.oss.service.AliOssService;
import com.xiaopeng.maintenance.dto.XpChargingRecordStartDTO;
import com.xiaopeng.maintenance.dto.XpChargingRecordStopDTO;
import com.xiaopeng.maintenance.mapper.XpChargingRecordMapper;
import com.xiaopeng.maintenance.model.query.XpChargingRecordPageQuery;
import com.xiaopeng.maintenance.model.vo.XpChargingRecordVO;
import com.xiaopeng.maintenance.service.IXpChargingRecordService;
import com.xiaopeng.maintenance.utils.AliOssDownloadUtil;
import com.xiaopeng.maintenance.vo.ChargingStatusVO;
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.io.UnsupportedEncodingException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -41,6 +52,14 @@
    private XpVehicleClient xpVehicleClient;
    @Autowired
    private XpOperationUserClient xpOperationUserClient;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private AliOssService aliOssService;
    @Autowired
    private AliOssDownloadUtil aliOssDownloadUtil;
    @Override
    public void startCharging(XpChargingRecordStartDTO dto, Long id) {
        // 创建车辆充电记录
@@ -50,22 +69,49 @@
        xpChargingRecord.setVehicleId(dto.getVehicleId());
        xpChargingRecord.setStartTime(LocalDateTime.now());
        xpChargingRecord.setStartOperationsUserId(id);
        xpChargingRecord.setTaskId(dto.getTaskId());
        // 查询车辆信息
        XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData();
        if(Objects.nonNull(xpVehicle)){
            // 查询车辆的续航里程
            String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
            if(Objects.nonNull(vehiclePosition)){
                xpChargingRecord.setStartMileageRange(vehiclePosition.getMileageRange());
            }else {
                xpChargingRecord.setStartMileageRange(0F);
            }
        }
        this.save(xpChargingRecord);
    }
    @Override
    public void stopCharging(XpChargingRecordStopDTO dto, Long id) {
    public XpChargingRecord stopCharging(XpChargingRecordStopDTO dto, Long id) {
        // 查询车辆充电记录  进行修改
        XpChargingRecord xpChargingRecord = this.getById(dto.getId());
        // 查询车辆信息
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpChargingRecord.getVehicleId()).getData();
        xpChargingRecord.setVehicleId(null);
        xpChargingRecord.setEndChargingPicture(dto.getEndChargingPicture());
        xpChargingRecord.setEndRemainingBattery(dto.getEndRemainingBattery());
        xpChargingRecord.setEndTime(LocalDateTime.now());
        xpChargingRecord.setEndOperationsUserId(id);
        if(Objects.nonNull(xpVehicle)){
            // 查询车辆的续航里程
            String vin = SensitiveDataCryptoUtil.decryptIfPossible(xpVehicle.getVehicleVin());
            VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
            if(Objects.nonNull(vehiclePosition)){
                xpChargingRecord.setStartMileageRange(vehiclePosition.getMileageRange());
            }else {
                xpChargingRecord.setStartMileageRange(0F);
            }
        }
        this.updateById(xpChargingRecord);
        return xpChargingRecord;
    }
    @Override
    public XpChargingRecordVO chargingDetail(Long id) {
    public XpChargingRecordVO chargingDetail(Long id) throws UnsupportedEncodingException {
        // 查询车辆充电记录
        XpChargingRecord xpChargingRecord = this.getById(id);
        XpChargingRecordVO xpChargingRecordVO = new XpChargingRecordVO();
@@ -75,7 +121,19 @@
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpChargingRecord.getVehicleId()).getData();
        if (Objects.nonNull(xpVehicle)) {
            xpChargingRecordVO.setPlateNumber(xpVehicle.getPlateNumber());
            xpChargingRecordVO.setVehiclePictures(xpVehicle.getVehiclePictures());
            String vehiclePictures =xpVehicle.getVehiclePictures();
            if (StringUtils.isNotBlank(vehiclePictures)) {
                JSONObject jsonObject = JSONObject.parseObject(vehiclePictures);
                // 1
                    String downloadUrl = jsonObject.getString("url");;
                try {
                    downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
                } catch (UnsupportedEncodingException e) {
                    log.error("获取图片下载地址失败", e);
                }
                jsonObject.put("url", downloadUrl);
                xpChargingRecordVO.setVehiclePictures(jsonObject.toJSONString());
            }
            xpChargingRecordVO.setAcceptOrTest(xpVehicle.getAcceptOrTest());
            xpChargingRecordVO.setVehicleColor(xpVehicle.getVehicleColor());
        }
@@ -86,13 +144,50 @@
        }
        XpOperationsUser operationsUserEnd = xpOperationUserClient.queryById(xpChargingRecordVO.getEndOperationsUserId()).getData();
        if (Objects.nonNull(operationsUserEnd)) {
            xpChargingRecordVO.setOperatorStartName(operationsUserEnd.getNickName());
            xpChargingRecordVO.setOperatorEndName(operationsUserEnd.getNickName());
        }
        xpChargingRecordVO.setStartMileageRange(Objects.nonNull(xpChargingRecord.getStartMileageRange()) ? xpChargingRecord.getStartMileageRange() : 0F);
        xpChargingRecordVO.setEndMileageRange(Objects.nonNull(xpChargingRecord.getEndMileageRange()) ? xpChargingRecord.getEndMileageRange() : 0F);
        // 图片封装
        try {
            // 开始
            String startChargingPicture = xpChargingRecordVO.getStartChargingPicture();
            if (StringUtils.isNotBlank(startChargingPicture)) {
                JSONArray jsonArray = JSONArray.parseArray(startChargingPicture);
                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);
                }
                xpChargingRecordVO.setStartChargingPicture(JSONArray.toJSONString(jsonArray));
            }
            // 结束
            String endChargingPicture = xpChargingRecordVO.getEndChargingPicture();
            if (StringUtils.isNotBlank(endChargingPicture)) {
                JSONArray jsonArray = JSONArray.parseArray(endChargingPicture);
                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);
                }
                xpChargingRecordVO.setEndChargingPicture(JSONArray.toJSONString(jsonArray));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xpChargingRecordVO;
    }
    @Override
    public PageInfo<XpChargingRecordVO> queryChargingByVehicleId(XpChargingRecordPageQuery query) {
    public PageInfo<XpChargingRecordVO> queryChargingByVehicleId(XpChargingRecordPageQuery query){
        // 1. 如果有操作人姓名过滤条件,先查询符合条件的用户ID列表
        List<Long> userIds = null;
        if (StringUtils.isNotBlank(query.getOperationsUserName())) {
@@ -176,6 +271,12 @@
                    String userName = userNameMap.get(chargingRecord.getEndOperationsUserId());
                    vo.setOperatorEndName(userName);
                }
                vo.setVehiclePictures(aliOssDownloadUtil.getPictureJSONObject(vo.getVehiclePictures()));
                vo.setStartChargingPicture(aliOssDownloadUtil.getPictureJsonArray(vo.getStartChargingPicture()));
                vo.setEndChargingPicture(aliOssDownloadUtil.getPictureJsonArray(vo.getEndChargingPicture()));
                records.add(vo);
            }
        }
@@ -186,4 +287,37 @@
        pageInfo.setTotal(resultPage.getTotal());
        return pageInfo;
    }
    @Override
    public void deleteRecordById(Long id) {
        removeById(id);
    }
    @Override
    public ChargingStatusVO queryChargingStatus(Long vehicleId) {
        ChargingStatusVO chargingStatusVO = new ChargingStatusVO();
        // 查询车辆当前充电信息
        XpChargingRecord xpChargingRecord = this.getOne(new LambdaQueryWrapper<XpChargingRecord>()
                .eq(XpChargingRecord::getVehicleId, vehicleId)
                .orderByDesc(XpChargingRecord::getCreateTime)
                .last("LIMIT 1"));
        if(Objects.nonNull(xpChargingRecord) && Objects.isNull(xpChargingRecord.getEndRemainingBattery())){
            chargingStatusVO.setStatus(2);
            // 查询开始充电操作人名称
            XpOperationsUser operationsUser = xpOperationUserClient.queryById(xpChargingRecord.getStartOperationsUserId()).getData();
            if(Objects.nonNull(operationsUser)){
                chargingStatusVO.setOperatorStartName(operationsUser.getNickName());
            }
        }else{
            chargingStatusVO.setStatus(1);
        }
        // 设置充电信息
        chargingStatusVO.setXpChargingRecord(xpChargingRecord);
        return chargingStatusVO;
    }
}