package com.ruoyi.other.controller; 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()); 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.removeByIds(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()); } } return AjaxResult.success(fleet); } /** * 按公司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)); } }