package com.ruoyi.other.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.model.TVinManagement;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
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.service.TFleetService;
import com.ruoyi.other.service.TGroupCompanyService;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 车队管理 前端控制器
*
*
* @author mxcd
* @since 2026-09-22
*/
@RestController
@RequestMapping("/fleet")
public class TFleetController {
@Resource
private TFleetService fleetService;
@Resource
private TGroupCompanyService groupCompanyService;
/**
* 分页查询车队
*/
@RequiresPermissions(value = {"/fleet/list", "/vinManagement/list", "/chargingCard/list"}, logical = Logical.OR)
@GetMapping("/page")
@ApiOperation(value = "分页查询车队", tags = {"管理后台-车队管理"})
public AjaxResult> page(@RequestParam(value = "current", defaultValue = "1") Integer current,
@RequestParam(value = "size", defaultValue = "10") Integer size,
@RequestParam(value = "fleetName", required = false) String fleetName,
@RequestParam(value = "companyId", required = false) Integer companyId,
@RequestParam(value = "status", required = false) Integer status) {
PageInfo page = new PageInfo<>(current, size);
fleetService.lambdaQuery()
.like(StringUtils.hasText(fleetName), TFleet::getFleetName, fleetName)
.eq(companyId != null, TFleet::getCompanyId, companyId)
.eq(status != null, TFleet::getStatus, status)
.orderByDesc(TFleet::getId)
.page(page);
fillCompanyName(page.getRecords());
// 填充VIN车辆数/可充电站数/累计三列聚合
fleetService.fillAggregates(page.getRecords());
return AjaxResult.success(page);
}
/**
* 添加车队
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@PostMapping("/add")
@ApiOperation(value = "添加车队", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】添加车队", businessType = BusinessType.INSERT)
public AjaxResult add(@RequestBody TFleet fleet) {
if (fleet.getCompanyId() == null) {
return AjaxResult.error("所属公司不能为空");
}
if (!StringUtils.hasText(fleet.getFleetName())) {
return AjaxResult.error("车队名称不能为空");
}
fleet.setId(null);
fleet.setDelFlag(false);
if (fleet.getStatus() == null) {
fleet.setStatus(1);
}
fleetService.save(fleet);
return AjaxResult.success();
}
/**
* 编辑车队
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@PostMapping("/edit")
@ApiOperation(value = "编辑车队", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】编辑车队", businessType = BusinessType.UPDATE)
public AjaxResult edit(@RequestBody TFleet fleet) {
if (fleet.getId() == null) {
return AjaxResult.error("车队ID不能为空");
}
fleetService.updateById(fleet);
return AjaxResult.success();
}
/**
* 删除车队(支持逗号分隔批量删除)
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@DeleteMapping("/del")
@ApiOperation(value = "删除车队", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】删除车队", businessType = BusinessType.DELETE)
public AjaxResult del(@RequestParam("ids") String ids) {
if (!StringUtils.hasText(ids)) {
return AjaxResult.error("车队ID不能为空");
}
List idList = java.util.Arrays.stream(ids.split(","))
.map(String::trim)
.filter(StringUtils::hasText)
.map(Integer::valueOf)
.collect(Collectors.toList());
if (idList.isEmpty()) {
return AjaxResult.error("车队ID不能为空");
}
fleetService.deleteFleets(idList);
return AjaxResult.success();
}
/**
* 切换车队启用状态
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@PostMapping("/status")
@ApiOperation(value = "切换车队启用状态", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】切换车队状态", businessType = BusinessType.UPDATE)
public AjaxResult status(@RequestParam("id") Integer id, @RequestParam("status") Integer status) {
if (id == null) {
return AjaxResult.error("车队ID不能为空");
}
TFleet update = new TFleet();
update.setId(id);
update.setStatus(status);
fleetService.updateById(update);
return AjaxResult.success();
}
/**
* 导入车队(Excel)
*/
@RequiresPermissions(value = {"/fleet/import"}, logical = Logical.OR)
@PostMapping("/import")
@ApiOperation(value = "导入车队", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】导入车队", businessType = BusinessType.IMPORT)
public AjaxResult importData(@RequestPart("file") MultipartFile file) throws Exception {
List items = new ExcelUtil<>(FleetImportDTO.class).importExcel(file.getInputStream());
return AjaxResult.success(fleetService.importFleets(items));
}
/**
* 下载车队导入模板
*/
@RequiresPermissions(value = {"/fleet/import"}, logical = Logical.OR)
@GetMapping("/import-template")
@ApiOperation(value = "下载车队导入模板", tags = {"管理后台-车队管理"})
public void template(HttpServletResponse response) {
new ExcelUtil<>(FleetImportDTO.class).importTemplateExcel(response, "车队导入模板");
}
/**
* 导出车队(Excel,按筛选条件)
*/
@RequiresPermissions(value = {"/fleet/export"}, logical = Logical.OR)
@PutMapping("/export")
@ApiOperation(value = "导出车队", tags = {"管理后台-车队管理"})
@Log(title = "【车队管理】导出车队", businessType = BusinessType.EXPORT)
public void export(HttpServletResponse response, @RequestBody(required = false) FleetQueryDTO query) {
new ExcelUtil<>(FleetExportDTO.class).exportExcel(response, fleetService.selectExportList(query), "车队数据");
}
/**
* 查询车队详情(查看按钮使用)
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@GetMapping("/detail")
@ApiOperation(value = "查询车队详情", tags = {"管理后台-车队管理"})
public AjaxResult detail(@RequestParam("id") Integer id) {
if (id == null) {
return AjaxResult.error("车队ID不能为空");
}
TFleet fleet = fleetService.getById(id);
if (fleet == null) {
return AjaxResult.error("车队不存在或已删除");
}
if (fleet.getCompanyId() != null) {
TGroupCompany company = groupCompanyService.getById(fleet.getCompanyId());
if (company != null) {
fleet.setCompanyName(company.getName());
}
}
// 详情亦填充5列聚合(保持与列表一致)
fleetService.fillAggregates(java.util.Collections.singletonList(fleet));
return AjaxResult.success(fleet);
}
/**
* 分页查询车队下的VIN码车辆(查看车队抽屉使用)
*/
@RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
@GetMapping("/vin-page")
@ApiOperation(value = "分页查询车队下VIN码车辆", tags = {"管理后台-车队管理"})
public AjaxResult> vinPage(@RequestParam("id") Integer id,
@RequestParam(value = "current", defaultValue = "1") Integer current,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
return AjaxResult.success(fleetService.selectVinPage(id, current, size));
}
/**
* 按公司ID批量回填公司名称
*/
private void fillCompanyName(List records) {
if (records == null || records.isEmpty()) {
return;
}
List companyIds = records.stream()
.map(TFleet::getCompanyId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (companyIds.isEmpty()) {
return;
}
Map nameMap = groupCompanyService.listByIds(companyIds).stream()
.collect(Collectors.toMap(TGroupCompany::getId, TGroupCompany::getName, (a, b) -> a));
records.forEach(item -> item.setCompanyName(nameMap.get(item.getCompanyId())));
}
/**
* 远程接口:车队详情(VIN码车辆所属车队校验使用,内部调用)
*/
@PostMapping("/remote/get/{id}")
@ApiOperation(value = "远程-车队详情", tags = {"内部调用"})
public R remoteGet(@PathVariable("id") Integer id) {
if (id == null) {
return R.fail("车队ID不能为空");
}
return R.ok(fleetService.getById(id));
}
/**
* 远程接口:按ID批量查询车队(VIN列表回填车队名称使用,内部调用)
*/
@PostMapping("/remote/list-by-ids")
@ApiOperation(value = "远程-按ID批量查询车队", tags = {"内部调用"})
public R> remoteListByIds(@RequestBody List ids) {
if (ids == null || ids.isEmpty()) {
return R.ok(new ArrayList<>());
}
List distinct = ids.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (distinct.isEmpty()) {
return R.ok(new ArrayList<>());
}
return R.ok(fleetService.listByIds(distinct));
}
}