package com.xiaopeng.vehicleConvoy.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto;
import com.xiaopeng.api.feignClient.maintenance.XpChargingRecordClient;
import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
import com.xiaopeng.api.feignClient.maintenance.XpVehiclePreparationClient;
import com.xiaopeng.api.model.maintenance.XpTask;
import com.xiaopeng.api.model.maintenance.XpTaskRule;
import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.vehicleConvoy.VehiclesCommandCallbackVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.vehicleConvoy.constant.I18nKeyConstant;
import com.xiaopeng.vehicleConvoy.model.dto.*;
import com.xiaopeng.vehicleConvoy.model.exportExcel.XpVehicleExportExcel;
import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel;
import com.xiaopeng.vehicleConvoy.model.query.*;
import com.xiaopeng.vehicleConvoy.model.vo.XpVehicleVO;
import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService;
import com.xiaopeng.vehicleConvoy.service.IXpVehicleService;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.i18n.LocaleContextHolder;
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.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
*
* 车辆管理 前端控制器
*
*
* @author mitao
* @since 2026-02-03
*/
@Slf4j
@RestController
@Api(tags = "车辆管理")
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpVehicleController {
private final IXpVehicleService xpVehicleService;
private final IXpFleetVehicleService vehicleService;
private final IXpVehicleAnnualRecordService xpVehicleAnnualRecordService;
private final XpVehiclePreparationClient xpVehiclePreparationClient;
private final XpChargingRecordClient xpChargingRecordClient;
private final XpTaskClient xpTaskClient;
private final XpTaskRuleClient xpTaskRuleClient;
private final MongoTemplate mongoTemplate;
private final MessageSource messageSource;
/**
* 根据ID列表批量查询车辆信息(内部接口)
*
* @param ids 车辆ID列表
* @return 车辆列表
*/
@ApiOperation(value = "批量查询车辆信息", tags = {"内部接口"})
@PostMapping("/inner/vehicle/listByIds")
public R> listByIds(@RequestBody List ids) {
if (CollectionUtils.isEmpty(ids)) {
return R.ok(new ArrayList<>());
}
return R.ok(xpVehicleService.listByIds(ids));
}
/**
* 批量获取车辆列表
*
* @return 车辆列表
*/
@ApiOperation(value = "批量查询车辆信息", tags = {"内部接口"})
@PostMapping("/inner/vehicle/listVehicle")
public R> listVehicle() {
return R.ok(xpVehicleService.list());
}
/**
* 根据ID查询车辆信息(内部接口)
*
* @param id 车辆ID
* @return 车辆列表
*/
@GetMapping("/inner/vehicle/queryById")
public R queryById(@RequestParam Long id) {
XpVehicle xpVehicle = xpVehicleService.getById(id);
if (Objects.nonNull(xpVehicle)) {
// 获取车队
XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(XpFleetVehicle::getVehicleId, xpVehicle.getId()));
if (Objects.nonNull(xpFleetVehicle)) {
xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
}
}
return R.ok(xpVehicle);
}
/**
* 修改车辆信息(内部接口)
*
* @param xpVehicle 车辆信息
* @return 车辆
*/
@PostMapping("/inner/vehicle/updateVehicleById")
public R updateVehicleById(@RequestBody XpVehicle xpVehicle){
xpVehicleService.updateById(xpVehicle);
return R.ok();
}
/**
* 新增车辆
*
* @param dto 车辆信息
* @return 操作结果
*/
@ApiOperation(value = "新增车辆", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/add")
public R> addVehicle(@Valid @RequestBody VehicleAddDTO dto) {
xpVehicleService.addVehicle(dto);
return R.ok();
}
/**
* 编辑车辆
*
* @param dto 车辆信息
* @return 操作结果
*/
@ApiOperation(value = "编辑车辆", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/edit")
public R> editVehicle(@Valid @RequestBody VehicleEditDTO dto) {
xpVehicleService.editVehicle(dto);
return R.ok();
}
/**
* 完善/更新车辆信息(保险、年检、运营资质等)
*
* @param dto 车辆信息
* @return 操作结果
*/
@ApiOperation(value = "完善/更新车辆信息", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/improveInfo")
public R> improveInfo(@RequestBody VehicleImproveInfoDTO dto) {
xpVehicleService.improveInfo(dto);
return R.ok();
}
/**
* 批量运营(在库→运营)
*
* @param idStr 车辆ID字符串列表
* @return 操作结果
*/
@ApiOperation(value = "批量运营", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/batchOperation")
@ApiImplicitParam(name = "idStr", value = "车辆ID字符串列表,逗号分隔", required = true, dataTypeClass = String.class)
public R> batchOperation(@RequestParam String idStr) {
xpVehicleService.batchOperation(idStr);
return R.ok();
}
/**
* 批量设置运营区域
*
* @param dto 批量设置运营区域参数
* @return 操作结果
*/
@ApiOperation(value = "批量设置运营区域", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/batchSetElectronic")
public R> batchSetElectronic(@Valid @RequestBody VehicleBatchSetElectronicDTO dto) {
xpVehicleService.batchSetElectronic(dto.getIds(), dto.getElectronicId());
return R.ok();
}
/**
* 在库车辆管理分页列表
*
* @param query 查询参数
* @return 分页结果
*/
@ApiOperation(value = "在库车辆管理分页列表", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/pageList")
public R> vehiclePageList(@RequestBody VehiclePageQuery query) {
return R.ok(xpVehicleService.vehiclePageList(query));
}
/**
* 导出在库车辆列表
*
*/
@ApiOperation(value = "下载导入模板", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/importTemplate")
public void importTemplate() {
// 1. 查询导出数据
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpVehicleImportExcel.class, new ArrayList<>());
// 4. 输出到响应流
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = null;
try {
String fileName = URLEncoder.encode("在库车辆导入模板.xlsx", "utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
log.error("下载在库车辆导入模板失败", e);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("关闭输出流失败", e);
}
}
}
/**
* 导入车辆
*
* @param file Excel文件
* @return 操作结果
*/
@ApiOperation(value = "导入", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/importExcel")
public R> importExcel(@RequestPart("file") MultipartFile file) {
ImportParams params = new ImportParams();
params.setHeadRows(1);
InputStream inputStream = null;
List importList;
try {
inputStream = file.getInputStream();
importList = ExcelImportUtil.importExcel(inputStream, XpVehicleImportExcel.class, params);
} catch (Exception e) {
log.error("车辆导入失败:{}", e.getMessage(), e);
if (e instanceof NotOfficeXmlFileException || e.getCause() instanceof NotOfficeXmlFileException) {
throw new ServiceException("上传文件不是有效的Excel(.xlsx)文件!", I18nKeyConstant.VEHICLE_IMPORT_FAILED);
}
throw new ServiceException("车辆导入失败!", I18nKeyConstant.VEHICLE_IMPORT_FAILED);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.error("关闭输入流失败", e);
}
}
}
if (CollectionUtils.isEmpty(importList)) {
throw new ServiceException("导入数据为空!", I18nKeyConstant.VEHICLE_IMPORT_DATA_EMPTY);
}
validateImportRequiredFields(importList, params.getHeadRows());
uploadVehiclePicture(importList);
xpVehicleService.importVehicles(importList);
return R.ok();
}
private void validateImportRequiredFields(List importList, int headRows) {
for (int index = 0; index < importList.size(); index++) {
XpVehicleImportExcel row = importList.get(index);
List missingFields = new ArrayList<>();
addIfBlank(missingFields, row.getVehicleCode(), "vehicle.import.field.vehicleCode");
addIfBlank(missingFields, row.getVehicleVin(), "vehicle.import.field.vehicleVin");
addIfBlank(missingFields, row.getPlateNumber(), "vehicle.import.field.plateNumber");
addIfBlank(missingFields, row.getVehicleModel(), "vehicle.import.field.vehicleModel");
addIfBlank(missingFields, row.getVehicleColor(), "vehicle.import.field.vehicleColor");
addIfBlank(missingFields, row.getVehiclePictures(), "vehicle.import.field.vehiclePictures");
addIfBlank(missingFields, row.getProcurementSource(), "vehicle.import.field.procurementSource");
if (!missingFields.isEmpty()) {
int excelRowNumber = index + headRows + 1;
String missing = String.join(", ", missingFields);
throw new ServiceException("导入数据必填字段为空!", I18nKeyConstant.VEHICLE_IMPORT_FIELDS_REQUIRED,
new Object[]{excelRowNumber, missing});
}
}
}
private void addIfBlank(List missingFields, String value, String fieldNameKey) {
if (StringUtils.isBlank(value)) {
String fieldName = messageSource.getMessage(fieldNameKey, null, fieldNameKey, LocaleContextHolder.getLocale());
missingFields.add(fieldName);
}
}
private void uploadVehiclePicture(List importList) {
for (XpVehicleImportExcel xpVehicleImportExcel : importList) {
xpVehicleImportExcel.setVehiclePictures(getOssUrl(xpVehicleImportExcel.getVehiclePictures()));
}
}
private String getOssUrl(String filePath) {
try {
// 获取到暂存的文件
File tmpFile = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(tmpFile);
// TODO 上传oss
JSONObject res = new JSONObject();
res.put("url", "https://we-park-life.oss-cn-beijing.aliyuncs.com/img/K4vqtLmVc6.png");
res.put("id", "1");
res.put("name", "测试.png");
return res.toJSONString();
} catch (Exception e) {
log.error("广告物料整体项目结算表导入图片上传oss异常", e);
}
return null;
}
/**
* 导出在库车辆列表
*
* @param query 查询参数
*/
@ApiOperation(value = "导出", tags = {"管理后台-车辆管理-在库车辆管理"})
@PostMapping("/api/v1/vehicle/exportExcel")
public void exportExcel(@RequestBody VehicleExportQuery query) {
// 1. 查询导出数据
List dataList = xpVehicleService.vehicleExportList(query);
// 2. 转换为导出对象
List exportList = BeanUtil.copyToList(dataList, XpVehicleExportExcel.class);
for (XpVehicleExportExcel xpVehicleExportExcel : exportList) {
if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) {
JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures());
xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url"));
}
}
// 3. 生成Excel
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpVehicleExportExcel.class, exportList);
// 4. 输出到响应流
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = null;
try {
String fileName = URLEncoder.encode("在库车辆列表.xls", "utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
log.error("导出在库车辆列表失败", e);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("关闭输出流失败", e);
}
}
}
/**
* 批量在库(运营→在库)
*
* @param idStr 车辆ID列表
* @return 操作结果
*/
@ApiOperation(value = "批量在库", tags = {"管理后台-车辆管理-运营车辆管理"})
@ApiImplicitParam(name = "idStr", value = "车辆ID字符串列表,逗号分隔", required = true, dataTypeClass = String.class)
@PostMapping("/api/v1/vehicle/batchStock")
public R> batchStock(@RequestParam String idStr) {
xpVehicleService.batchStock(idStr);
return R.ok();
}
/**
* 车辆详情(含围栏名称)
*
* @param id 车辆ID
* @return 车辆详情
*/
@ApiOperation(value = "车辆详情", tags = {"管理后台-车辆管理-在库车辆管理"})
@GetMapping("/api/v1/vehicle/queryById")
public R getVehicleDetail(@ApiParam(value = "车辆id", required = true) @RequestParam Long id) {
return R.ok(xpVehicleService.getVehicleDetail(id));
}
/**
* 删除在库车辆
* @param id
* @return
*/
@ApiOperation(value = "删除在库车辆",tags = {"管理后台-车辆管理-在库车辆管理"})
@DeleteMapping("/api/v1/vehicle/delete/{id}")
public R> delete(@ApiParam(name = "id", value = "车辆ID") @PathVariable Long id) {
xpVehicleService.removeById(id);
return R.ok();
}
/**
* 运营车辆管理分页列表
*
* @param query 查询参数
* @return 分页结果
*/
@ApiOperation(value = "运营车辆管理分页列表", tags = {"管理后台-车辆管理-运营车辆管理"})
@PostMapping("/api/v1/vehicle/operationPageList")
public R> operationPageList(@RequestBody OperationVehiclePageQuery query) {
return R.ok(xpVehicleService.operationPageList(query));
}
/**
* 导出在库车辆列表
*
* @param query 查询参数
*/
@ApiOperation(value = "运营车辆管理列表导出", tags = {"管理后台-车辆管理-运营车辆管理"})
@PostMapping("/api/v1/vehicle/operationExportExcel")
public void exportExcel(@RequestBody OperationVehicleExportQuery query) {
// 1. 查询导出数据
List dataList = xpVehicleService.operationVehicleExportList(query);
// 2. 转换为导出对象
List exportList = BeanUtil.copyToList(dataList, XpVehicleExportExcel.class);
for (XpVehicleExportExcel xpVehicleExportExcel : exportList) {
if (StringUtils.isNotBlank(xpVehicleExportExcel.getVehiclePictures())) {
JSONObject jsonObject = JSONObject.parseObject(xpVehicleExportExcel.getVehiclePictures());
// xpVehicleExportExcel.setVehiclePictures(jsonObject.getString("url"));
xpVehicleExportExcel.setVehiclePictures(null);
}
}
// 3. 生成Excel
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpVehicleExportExcel.class, exportList);
// 4. 输出到响应流
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
ServletOutputStream outputStream = null;
try {
String fileName = URLEncoder.encode("运营车辆列表.xls", "utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
outputStream = response.getOutputStream();
workbook.write(outputStream);
} catch (IOException e) {
log.error("导出在库车辆列表失败", e);
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("关闭输出流失败", e);
}
}
}
@ApiOperation(value = "通过车辆id查询年检分页列表", tags = {"管理后台-车辆管理-运营车辆管理"})
@PostMapping("/api/v1/vehicle/queryTaskRoutineByVehicleId")
public R> queryTaskRoutineByVehicleId(
@Valid @RequestBody XpVehicleAnnualRecordPageQuery query){
return R.ok(xpVehicleAnnualRecordService.queryTaskRoutineByVehicleId(query));
}
/**
* 根据围栏id查询空闲车辆
*
*/
@GetMapping("/inner/vehicle/listByFenceId")
public R> listByFenceId(@RequestParam("fenceId") Long fenceId){
return R.ok(xpVehicleService.listByFenceId(fenceId));
}
/**
* 查询车辆位置信息 做筛选
* @param dto
* @return
*/
@PostMapping("/inner/vehicle/queryVehiclePositionByVin")
public R> queryVehiclePositionByVin(@RequestBody VehiclePositionByVinDto dto){
List list = xpVehicleService.list(new LambdaQueryWrapper().eq(XpVehicle::getState, 0).eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getElectronicId, dto.getFenceId()).in(XpVehicle::getVehicleVin,
dto.getVinList()));
if(list.isEmpty()){
return R.ok(new ArrayList<>());
}else {
List vehiclePositionVos = new ArrayList<>(list.size());
for (XpVehicle xpVehicle : list) {
vehiclePositionVos.add(xpVehicle.getVehicleVin());
}
return R.ok(vehiclePositionVos);
}
}
/**
* 查询车辆信息
* @param vehicleVin
* @return
*/
@GetMapping("/inner/vehicle/findByVehicleVin")
public R findByVehicleVin(@RequestParam("vehicleVin") String vehicleVin){
XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper().eq(XpVehicle::getVehicleVin, vehicleVin));
// 获取车队
XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(XpFleetVehicle::getVehicleId, xpVehicle.getId()));
xpVehicle.setFleetId(xpFleetVehicle.getFleetId());
return R.ok(xpVehicle);
}
/**
* 根据XPUID查询车辆信息
* @param xpuid
* @return
*/
@GetMapping("/inner/vehicle/findByVehicleXpuId")
public R findByVehicleXpuId(@RequestParam("xpuid") String xpuid){
XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper().eq(XpVehicle::getXpuId, xpuid));
return R.ok(xpVehicle);
}
/**
* 修改车辆状态
* @param updateVehicleStateDto
* @return
*/
@PostMapping("/inner/vehicle/updateVehicleStatus")
public R> updateVehicleStatus(@RequestBody UpdateVehicleStateDto updateVehicleStateDto){
xpVehicleService.update(new LambdaUpdateWrapper().eq(XpVehicle::getVehicleVin, updateVehicleStateDto.getVin()).set(XpVehicle::getState, updateVehicleStateDto.getState()));
return R.ok();
}
/**
*
* 查询车辆所属车队ID
* @param vehicleId
* @return
*/
@GetMapping("/inner/vehicle/findFleetIdByVehicleId")
public R findFleetIdByVehicleId(@RequestParam Long vehicleId){
XpFleetVehicle xpFleetVehicle = vehicleService.getOne(new LambdaQueryWrapper().eq(XpFleetVehicle::getVehicleId, vehicleId));
return R.ok(xpFleetVehicle.getFleetId());
}
/**
* 查询可改派的车辆列表
*
* @return 车辆列表
*/
@ApiOperation(value = "查询可改派的车辆列表", tags = {"管理后台-订单管理"})
@GetMapping("/api/v1/vehicle/availableList")
@ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataTypeClass = Long.class)
public R> listAvailableVehicles(@RequestParam Long orderId) {
List list = xpVehicleService.listAvailableVehicles(orderId);
return R.ok(list);
}
/**
* 车辆控制消息回调通知
* 开关门、设定温度
* @param callbackVo
*/
@PostMapping("/base/vehicles/command/callback")
public void vehiclesCommandCallback(@RequestBody VehiclesCommandCallbackVo callbackVo){
log.info("车辆控制消息回调:{}", JSON.toJSONString(callbackVo));
if(null != callbackVo.getMsg_ref()){
//继续执行业务逻辑上的代码
}
}
/**
* 车辆详情-车辆调度-接单、测试
*/
@ApiOperation(value = "车辆详情", tags = {"运维APP-车辆管理"})
@PostMapping("/api/v1/vehicle/vehicleDetail")
public R vehicleDetail(@RequestParam Long id) {
// 查询车辆
XpVehicle xpVehicle = xpVehicleService.getById(id);
XpVehicleVO xpVehicleVO = new XpVehicleVO();
BeanUtils.copyProperties(xpVehicle, xpVehicleVO);
// 查询运维规则 保养周期
XpTaskRule xpTaskRule = xpTaskRuleClient.queryDetail().getData();
if(Objects.isNull(xpTaskRule)){
return R.ok(xpVehicleVO);
}
Boolean maintenanceCycle = xpTaskRule.getMaintenanceCycle();
Integer maintenanceCycleTime = xpTaskRule.getMaintenanceCycleTime();
Integer maintenanceCycleTimeType = xpTaskRule.getMaintenanceCycleTimeType();
if(maintenanceCycle){
// 查询车辆上次保养记录
XpTask xpTask = xpTaskClient.queryInfoByVehicleId(id).getData();
if(Objects.nonNull(xpTask)){
// 存在保养记录
LocalDateTime handleTime = xpTask.getCreateTime();
switch (maintenanceCycleTimeType){
case 1:
handleTime.plusDays(maintenanceCycleTime);
break;
default:
handleTime.plusMonths(maintenanceCycleTime);
break;
}
xpVehicleVO.setNextMaintenanceTime(handleTime.toLocalDate());
}else {
// 没有保养记录
// 入库时间
LocalDateTime warehousingTime = xpVehicle.getWarehousingTime();
if(Objects.nonNull(warehousingTime)){
switch (maintenanceCycleTimeType){
case 1:
warehousingTime.plusDays(maintenanceCycleTime);
break;
default:
warehousingTime.plusMonths(maintenanceCycleTime);
break;
}
xpVehicleVO.setNextMaintenanceTime(warehousingTime.toLocalDate());
}
}
}
// 查询车辆的续航里程
VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicleVO.getVehicleVin())), VehiclePosition.class);
if(Objects.nonNull(vehiclePosition)){
xpVehicleVO.setMileageRange(vehiclePosition.getMileageRange());
xpVehicleVO.setCurrentElectricity(vehiclePosition.getCurrentElectricity());
}else {
xpVehicleVO.setMileageRange(0F);
xpVehicleVO.setCurrentElectricity(0);
}
return R.ok(xpVehicleVO);
}
/**
* 车辆管理-地图
* @return 车辆列表
*/
@ApiOperation(value = "车辆管理-地图", tags = {"运维APP-车辆管理"})
@PostMapping("/api/v1/vehicle/vehicleMap")
public R> vehicleMap(@RequestBody VehicleMapQuery query) {
return R.ok(xpVehicleService.pageList(query));
}
/**
* 根据车牌号查询车辆信息
* @param plateNumber
* @return
*/
@PostMapping("/inner/vehicle/listByPlateNumber")
R> listByPlateNumber(@RequestParam("plateNumber") String plateNumber){
return R.ok(xpVehicleService.listByPlateNumber(plateNumber));
}
/**
* 车辆详情-车门解锁/后备箱解锁
*/
@ApiOperation(value = "车辆运维-车门解锁/后备箱解锁", tags = {"运维APP-车辆管理"})
@PostMapping("/api/v1/vehicle/unlockByType")
public R unlockByType(@RequestBody UnlockByTypeDTO dto) {
// TODO 车门解锁、后备箱解锁
return R.ok();
}
/**
* 业务流程-车门解锁/后备箱解锁
*/
@ApiOperation(value = "打开车门操作", tags = {"小程序-业务流程"})
@PostMapping("/api/v1/mini-program/order/vehicle/unlock")
public R unlock(@RequestBody UnlockAppletDTO dto) {
return R.ok(xpVehicleService.unlock(dto));
}
/**
* 业务流程-打开设置温度
*/
@ApiOperation(value = "打开设置温度", tags = {"小程序-业务流程"})
@PostMapping("/api/v1/mini-program/order/ac/set-temperature")
public R setTemperature(@RequestBody SetTemperatureDTO dto) {
return R.ok(xpVehicleService.setTemperature(dto));
}
/**
* 业务流程-通过订单id查询当前车辆温度
*/
@ApiOperation(value = "通过订单id查询当前车辆温度", tags = {"小程序-业务流程"})
@GetMapping("/api/v1/mini-program/order/queryTemperatureByOrderId")
public R queryTemperatureByOrderId(@RequestParam Long orderId, HttpServletRequest request) {
String uid = request.getHeader("XP-Uid");
VehicleTemperatureDto vehicleTemperatureDto = xpVehicleService.queryTemperatureByOrderId(orderId,uid);
return R.ok(vehicleTemperatureDto);
}
/**
* 获取车辆不分页列表
*
* @param query
* @return
*/
@ApiOperation(value = "获取车辆分页列表", tags = {"管理后台-车队管理"})
@PostMapping("/api/v1/vehicle/page-list")
public R> getVehiclePageList(@RequestBody VehicleSelectPageQuery query) {
return R.ok(xpVehicleService.getVehiclePageList(query));
}
}