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.xiaopeng.api.model.vehicleConvoy.XpVehicle;
|
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
|
import com.xiaopeng.common.core.domain.R;
|
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.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;
|
import java.util.stream.Stream;
|
|
/**
|
* <p>
|
* 车辆充电记录 服务实现类
|
* </p>
|
*
|
* @author mitao
|
* @since 2026-02-03
|
*/
|
@Service
|
public class XpChargingRecordServiceImpl extends ServiceImpl<XpChargingRecordMapper, XpChargingRecord> implements IXpChargingRecordService {
|
@Autowired
|
private XpVehicleClient xpVehicleClient;
|
@Autowired
|
private XpOperationUserClient xpOperationUserClient;
|
@Autowired
|
private MongoTemplate mongoTemplate;
|
|
@Autowired
|
private AliOssService aliOssService;
|
@Override
|
public void startCharging(XpChargingRecordStartDTO dto, Long id) {
|
// 创建车辆充电记录
|
XpChargingRecord xpChargingRecord = new XpChargingRecord();
|
xpChargingRecord.setStartChargingPicture(dto.getChargingPicture());
|
xpChargingRecord.setStartRemainingBattery(dto.getBattery());
|
xpChargingRecord.setVehicleId(dto.getVehicleId());
|
xpChargingRecord.setStartTime(LocalDateTime.now());
|
xpChargingRecord.setStartOperationsUserId(id);
|
// 查询车辆信息
|
XpVehicle xpVehicle = xpVehicleClient.queryById(dto.getVehicleId()).getData();
|
if(Objects.nonNull(xpVehicle)){
|
// 查询车辆的续航里程
|
VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), 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) {
|
// 查询车辆充电记录 进行修改
|
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)){
|
// 查询车辆的续航里程
|
VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
|
if(Objects.nonNull(vehiclePosition)){
|
xpChargingRecord.setStartMileageRange(vehiclePosition.getMileageRange());
|
}else {
|
xpChargingRecord.setStartMileageRange(0F);
|
}
|
}
|
this.updateById(xpChargingRecord);
|
}
|
|
@Override
|
public XpChargingRecordVO chargingDetail(Long id) throws UnsupportedEncodingException {
|
// 查询车辆充电记录
|
XpChargingRecord xpChargingRecord = this.getById(id);
|
XpChargingRecordVO xpChargingRecordVO = new XpChargingRecordVO();
|
BeanUtils.copyProperties(xpChargingRecord, xpChargingRecordVO);
|
|
// 查询车辆信息
|
XpVehicle xpVehicle = xpVehicleClient.queryById(xpChargingRecord.getVehicleId()).getData();
|
if (Objects.nonNull(xpVehicle)) {
|
xpChargingRecordVO.setPlateNumber(xpVehicle.getPlateNumber());
|
|
|
|
String vehiclePictures =xpVehicle.getVehiclePictures();
|
if (StringUtils.isNotBlank(vehiclePictures)) {
|
JSONObject jsonObject = JSONObject.parseObject(vehiclePictures);
|
// 1
|
String downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
|
jsonObject.put("url", downloadUrl);
|
xpChargingRecordVO.setVehiclePictures(jsonObject.toJSONString());
|
}
|
|
|
xpChargingRecordVO.setAcceptOrTest(xpVehicle.getAcceptOrTest());
|
xpChargingRecordVO.setVehicleColor(xpVehicle.getVehicleColor());
|
}
|
// 查询操作人
|
XpOperationsUser operationsUserStart = xpOperationUserClient.queryById(xpChargingRecordVO.getStartOperationsUserId()).getData();
|
if (Objects.nonNull(operationsUserStart)) {
|
xpChargingRecordVO.setOperatorStartName(operationsUserStart.getNickName());
|
}
|
XpOperationsUser operationsUserEnd = xpOperationUserClient.queryById(xpChargingRecordVO.getEndOperationsUserId()).getData();
|
if (Objects.nonNull(operationsUserEnd)) {
|
xpChargingRecordVO.setOperatorEndName(operationsUserEnd.getNickName());
|
}
|
xpChargingRecordVO.setStartMileageRange(Objects.nonNull(xpChargingRecord.getStartMileageRange()) ? xpChargingRecord.getStartMileageRange() : 0F);
|
xpChargingRecordVO.setEndMileageRange(Objects.nonNull(xpChargingRecord.getEndMileageRange()) ? xpChargingRecord.getEndMileageRange() : 0F);
|
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);
|
}
|
|
|
String vehiclePictures = vo.getVehiclePictures();
|
if (StringUtils.isNotBlank(vehiclePictures)) {
|
JSONArray jsonArray = JSONArray.parseArray(vehiclePictures);
|
for (Object o : jsonArray) {
|
JSONObject jsonObject = (JSONObject)o;
|
String downloadUrl = null;
|
try {
|
//1
|
downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
|
} catch (UnsupportedEncodingException e) {
|
throw new RuntimeException(e);
|
}
|
jsonObject.put("url", downloadUrl);
|
}
|
vo.setVehiclePictures(JSONArray.toJSONString(jsonArray));
|
}
|
|
|
|
String startChargingPicture = vo.getStartChargingPicture();
|
if (StringUtils.isNotBlank(startChargingPicture)) {
|
JSONArray jsonArray = JSONArray.parseArray(startChargingPicture);
|
for (Object o : jsonArray) {
|
JSONObject jsonObject = (JSONObject)o;
|
String downloadUrl = null;
|
try {
|
// 1
|
downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
|
} catch (UnsupportedEncodingException e) {
|
throw new RuntimeException(e);
|
}
|
jsonObject.put("url", downloadUrl);
|
}
|
vo.setStartChargingPicture(JSONArray.toJSONString(jsonArray));
|
}
|
|
|
|
String endChargingPicture = vo.getEndChargingPicture();
|
if (StringUtils.isNotBlank(endChargingPicture)) {
|
JSONArray jsonArray = JSONArray.parseArray(endChargingPicture);
|
for (Object o : jsonArray) {
|
JSONObject jsonObject = (JSONObject)o;
|
String downloadUrl = null;
|
try {
|
// 1
|
downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
|
} catch (UnsupportedEncodingException e) {
|
throw new RuntimeException(e);
|
}
|
jsonObject.put("url", downloadUrl);
|
}
|
vo.setEndChargingPicture(JSONArray.toJSONString(jsonArray));
|
}
|
|
|
|
records.add(vo);
|
}
|
}
|
|
// 5. 构建分页结果
|
PageInfo<XpChargingRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
|
pageInfo.setRecords(records);
|
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)
|
.isNull(XpChargingRecord::getTaskId)
|
.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;
|
}
|
}
|