package com.ruoyi.other.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.dto.VinManagementQueryDTO; import com.ruoyi.account.api.feignClient.VinManagementClient; import com.ruoyi.account.api.model.TVinManagement; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.other.api.domain.TFleet; import com.ruoyi.other.api.domain.TGroupCompany; import com.ruoyi.other.api.dto.FleetExportDTO; import com.ruoyi.other.api.dto.FleetImportDTO; import com.ruoyi.other.api.dto.FleetQueryDTO; import com.ruoyi.other.mapper.TFleetMapper; import com.ruoyi.other.service.TFleetService; import com.ruoyi.other.service.TGroupCompanyService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** *

* 车队管理 服务实现类 *

* * @author mxcd * @since 2026-09-22 */ @Service public class TFleetServiceImpl extends ServiceImpl implements TFleetService { private static final int ENABLED = 1; private static final int DISABLED = 0; @Resource private TGroupCompanyService groupCompanyService; @Resource private VinManagementClient vinManagementClient; @Override public Page selectVinPage(Integer fleetId, Integer current, Integer size) { if (fleetId == null) { throw new ServiceException("车队ID不能为空"); } if (getById(fleetId) == null) { throw new ServiceException("车队不存在或已删除"); } VinManagementQueryDTO query = new VinManagementQueryDTO(); query.setFleetId(fleetId); query.setPageCurr(current == null || current < 1 ? 1 : current); query.setPageSize(size == null || size < 1 ? 10 : size); R> response = vinManagementClient.getVinPageByFleet(query); if (response == null || !R.isSuccess(response) || response.getData() == null) { throw new ServiceException("VIN码车辆查询失败:" + (response == null ? "服务无响应" : response.getMsg())); } return response.getData(); } @Override @Transactional(rollbackFor = Exception.class) public String importFleets(List items) { if (items == null || items.isEmpty()) { throw new ServiceException("导入数据不能为空"); } Set fleetNames = new HashSet<>(); Set companyNames = new HashSet<>(); int row = 1; for (FleetImportDTO item : items) { row++; if (item == null || !StringUtils.hasText(item.getFleetName())) { throw new ServiceException("第" + row + "行车队名称不能为空"); } String fleetName = item.getFleetName().trim(); if (fleetName.length() > 128) { throw new ServiceException("第" + row + "行车队名称不能超过128个字符"); } if (!StringUtils.hasText(item.getCompanyName())) { throw new ServiceException("第" + row + "行所属公司不能为空"); } parseStatus(item.getStatus(), row); if (!fleetNames.add(fleetName) || lambdaQuery().eq(TFleet::getFleetName, fleetName).count() > 0) { throw new ServiceException("第" + row + "行车队名称已存在或重复"); } companyNames.add(item.getCompanyName().trim()); } // 批量查询公司名称 -> ID Map companyMap = groupCompanyService.lambdaQuery() .in(TGroupCompany::getName, companyNames) .list() .stream() .collect(Collectors.toMap(TGroupCompany::getName, TGroupCompany::getId, (a, b) -> a)); row = 1; for (FleetImportDTO item : items) { row++; String companyName = item.getCompanyName().trim(); if (!companyMap.containsKey(companyName)) { throw new ServiceException("第" + row + "行所属公司不存在:" + companyName); } } LocalDateTime now = LocalDateTime.now(); for (FleetImportDTO item : items) { TFleet fleet = new TFleet(); fleet.setCompanyId(companyMap.get(item.getCompanyName().trim())); fleet.setFleetName(item.getFleetName().trim()); fleet.setContactName(trim(item.getContactName())); fleet.setContactPhone(trim(item.getContactPhone())); fleet.setStatus(parseStatus(item.getStatus(), 0)); fleet.setDelFlag(false); fleet.setCreateTime(now); save(fleet); } return "成功导入" + items.size() + "条车队数据"; } @Override public List selectExportList(FleetQueryDTO query) { FleetQueryDTO safe = query == null ? new FleetQueryDTO() : query; List fleets = lambdaQuery() .like(StringUtils.hasText(safe.getFleetName()), TFleet::getFleetName, safe.getFleetName()) .eq(safe.getCompanyId() != null, TFleet::getCompanyId, safe.getCompanyId()) .eq(safe.getStatus() != null, TFleet::getStatus, safe.getStatus()) .orderByDesc(TFleet::getId) .list(); if (fleets == null || fleets.isEmpty()) { return new ArrayList<>(); } Set companyIds = fleets.stream() .map(TFleet::getCompanyId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map nameMap = companyIds.isEmpty() ? Collections.emptyMap() : groupCompanyService.listByIds(companyIds).stream() .collect(Collectors.toMap(TGroupCompany::getId, TGroupCompany::getName, (a, b) -> a)); return fleets.stream().map(item -> { FleetExportDTO dto = new FleetExportDTO(); dto.setFleetName(item.getFleetName()); dto.setCompanyName(nameMap.get(item.getCompanyId())); // VIN码车数/可充电站数/月充电/当前可用余额后端暂无数据源,导出留空,与列表"-"占位一致 dto.setStatus(item.getStatus() == null ? null : String.valueOf(item.getStatus())); return dto; }).collect(Collectors.toList()); } private String trim(String value) { return value == null ? null : value.trim(); } private Integer parseStatus(String value, int row) { if (!StringUtils.hasText(value) || "1".equals(value.trim()) || "启用".equals(value.trim())) { return ENABLED; } if ("0".equals(value.trim()) || "停用".equals(value.trim())) { return DISABLED; } throw new ServiceException((row > 0 ? "第" + row + "行" : "") + "启用状态错误"); } }