From fcfe33b85f85c1a35d9f8aed161ff34390b63e6d Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 28 九月 2026 13:50:59 +0800
Subject: [PATCH] 更新功能和修改bug

---
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/VinManagementQueryDTO.java            |    2 
 ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java           |  126 +++++++++++++++++++++++++++++++
 ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TVinManagementMapper.xml                    |    1 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/VinManagementClient.java      |    8 ++
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/VinManagementFallbackFactory.java |    7 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TFleetService.java                        |   12 +++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java               |   27 ++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TVinManagementController.java      |    8 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TFleetController.java                  |   14 +++
 9 files changed, 205 insertions(+), 0 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/VinManagementQueryDTO.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/VinManagementQueryDTO.java
index 8c32c0c..58c5dff 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/VinManagementQueryDTO.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/VinManagementQueryDTO.java
@@ -13,4 +13,6 @@
     private Integer status;
     /** 所属公司ID(额度分配弹窗按公司筛选使用) */
     private Integer companyId;
+    /** 所属车队ID(车队管理-查看车队抽屉按车队筛选VIN码车辆使用) */
+    private Integer fleetId;
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/VinManagementFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/VinManagementFallbackFactory.java
index ce1fbf2..2e15c04 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/VinManagementFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/VinManagementFallbackFactory.java
@@ -1,5 +1,7 @@
 package com.ruoyi.account.api.factory;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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;
@@ -35,6 +37,11 @@
             public R<List<TVinManagement>> getVinByIds(List<Long> ids) {
                 return R.fail("根据ID批量查询VIN记录失败:" + throwable.getMessage());
             }
+
+            @Override
+            public R<Page<TVinManagement>> getVinPageByFleet(VinManagementQueryDTO query) {
+                return R.fail("按车队分页查询VIN记录失败:" + throwable.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/VinManagementClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/VinManagementClient.java
index 6eed96a..9dd66ac 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/VinManagementClient.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/VinManagementClient.java
@@ -1,5 +1,7 @@
 package com.ruoyi.account.api.feignClient;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.api.dto.VinManagementQueryDTO;
 import com.ruoyi.account.api.factory.VinManagementFallbackFactory;
 import com.ruoyi.account.api.model.TVinManagement;
 import com.ruoyi.common.core.constant.ServiceNameConstants;
@@ -33,4 +35,10 @@
      */
     @PostMapping("/t-vin-management/inner/list-by-ids")
     R<List<TVinManagement>> getVinByIds(@RequestBody List<Long> ids);
+
+    /**
+     * 按车队分页查询VIN码车辆(车队管理-查看车队抽屉使用,query.fleetId 必须传入)
+     */
+    @PostMapping("/t-vin-management/inner/page-by-fleet")
+    R<Page<TVinManagement>> getVinPageByFleet(@RequestBody VinManagementQueryDTO query);
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TVinManagementController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TVinManagementController.java
index 8d1ad93..138cdf8 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TVinManagementController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TVinManagementController.java
@@ -104,4 +104,12 @@
         List<Long> distinctIds = ids.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());
         return R.ok(distinctIds.isEmpty() ? new ArrayList<>() : service.listByIds(distinctIds));
     }
+
+    /**
+     * 内部接口:按车队分页查询VIN码车辆(车队管理-查看车队抽屉使用,含车队名称回填)
+     */
+    @PostMapping("/inner/page-by-fleet")
+    public R<IPage<TVinManagement>> pageByFleet(@RequestBody VinManagementQueryDTO query) {
+        return R.ok(service.selectPageList(query));
+    }
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TVinManagementMapper.xml b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TVinManagementMapper.xml
index f362db7..2e9cf10 100644
--- a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TVinManagementMapper.xml
+++ b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TVinManagementMapper.xml
@@ -9,6 +9,7 @@
         <if test="query != null and query.phone != null and query.phone != ''">AND phone LIKE CONCAT('%', #{query.phone}, '%')</if>
         <if test="query != null and query.status != null">AND status = #{query.status}</if>
         <if test="query != null and query.companyId != null">AND company_id = #{query.companyId}</if>
+        <if test="query != null and query.fleetId != null">AND fleet_id = #{query.fleetId}</if>
         ORDER BY create_time DESC, id DESC
     </select>
     <select id="selectExportList" resultType="com.ruoyi.account.api.dto.VinManagementExcelDTO">
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TFleetController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TFleetController.java
index 2b98960..dea4a12 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TFleetController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TFleetController.java
@@ -1,5 +1,7 @@
 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;
@@ -213,6 +215,18 @@
     }
 
     /**
+     * 分页查询车队下的VIN码车辆(查看车队抽屉使用)
+     */
+    @RequiresPermissions(value = {"/fleet/list"}, logical = Logical.OR)
+    @GetMapping("/vin-page")
+    @ApiOperation(value = "分页查询车队下VIN码车辆", tags = {"管理后台-车队管理"})
+    public AjaxResult<Page<TVinManagement>> 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<TFleet> records) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TFleetService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TFleetService.java
index b89e0c0..fec7802 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TFleetService.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TFleetService.java
@@ -1,6 +1,8 @@
 package com.ruoyi.other.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.account.api.model.TVinManagement;
 import com.ruoyi.other.api.domain.TFleet;
 import com.ruoyi.other.api.dto.FleetExportDTO;
 import com.ruoyi.other.api.dto.FleetImportDTO;
@@ -34,4 +36,14 @@
      */
     List<FleetExportDTO> selectExportList(FleetQueryDTO query);
 
+    /**
+     * 分页查询车队下的VIN码车辆(远程调用VIN管理服务,含VIN码、车牌号、手机号、初始分配额度、启用状态)
+     *
+     * @param fleetId 车队ID
+     * @param current 当前页码
+     * @param size    每页数量
+     * @return VIN码车辆分页数据
+     */
+    Page<TVinManagement> selectVinPage(Integer fleetId, Integer current, Integer size);
+
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java
index 396718f..3e9f254 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java
@@ -1,6 +1,11 @@
 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;
@@ -42,6 +47,28 @@
     @Resource
     private TGroupCompanyService groupCompanyService;
 
+    @Resource
+    private VinManagementClient vinManagementClient;
+
+    @Override
+    public Page<TVinManagement> 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<Page<TVinManagement>> 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<FleetImportDTO> items) {
diff --git a/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java
new file mode 100644
index 0000000..b313577
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java
@@ -0,0 +1,126 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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 org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * 车队下VIN码车辆分页查询逻辑单测(VIN管理远程服务以 Mock 替代,不依赖 Spring 容器与数据库)。
+ */
+class TFleetServiceImplTest {
+
+    @Test
+    void passesFleetIdAndPagingToVinService() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        Page<TVinManagement> expected = new Page<>(1, 10);
+        expected.setTotal(1);
+        expected.setRecords(Collections.singletonList(vehicle()));
+        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(expected));
+
+        Page<TVinManagement> actual = buildService(fleet(4), client).selectVinPage(4, 1, 10);
+
+        assertSame(expected, actual);
+        ArgumentCaptor<VinManagementQueryDTO> captor = ArgumentCaptor.forClass(VinManagementQueryDTO.class);
+        Mockito.verify(client).getVinPageByFleet(captor.capture());
+        assertEquals(4, captor.getValue().getFleetId());
+        assertEquals(1, captor.getValue().getPageCurr());
+        assertEquals(10, captor.getValue().getPageSize());
+    }
+
+    @Test
+    void fallsBackToDefaultPagingWhenParamsInvalid() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(new Page<>(1, 10)));
+
+        buildService(fleet(5), client).selectVinPage(5, null, 0);
+
+        ArgumentCaptor<VinManagementQueryDTO> captor = ArgumentCaptor.forClass(VinManagementQueryDTO.class);
+        Mockito.verify(client).getVinPageByFleet(captor.capture());
+        assertEquals(1, captor.getValue().getPageCurr());
+        assertEquals(10, captor.getValue().getPageSize());
+    }
+
+    @Test
+    void rejectsMissingFleetId() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        TFleetServiceImpl service = buildService(null, client);
+
+        ServiceException ex = assertThrows(ServiceException.class, () -> service.selectVinPage(null, 1, 10));
+
+        assertTrue(ex.getMessage().contains("车队ID不能为空"), ex.getMessage());
+        Mockito.verifyNoInteractions(client);
+    }
+
+    @Test
+    void rejectsUnknownFleet() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        TFleetServiceImpl service = buildService(null, client);
+
+        ServiceException ex = assertThrows(ServiceException.class, () -> service.selectVinPage(9, 1, 10));
+
+        assertTrue(ex.getMessage().contains("车队不存在"), ex.getMessage());
+        Mockito.verifyNoInteractions(client);
+    }
+
+    @Test
+    void failsWhenRemoteReturnsError() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.fail("VIN 管理服务调用失败"));
+
+        ServiceException ex = assertThrows(ServiceException.class,
+                () -> buildService(fleet(4), client).selectVinPage(4, 1, 10));
+
+        assertTrue(ex.getMessage().contains("VIN码车辆查询失败"), ex.getMessage());
+    }
+
+    @Test
+    void failsWhenRemoteReturnsNullData() {
+        VinManagementClient client = Mockito.mock(VinManagementClient.class);
+        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(null);
+
+        ServiceException ex = assertThrows(ServiceException.class,
+                () -> buildService(fleet(4), client).selectVinPage(4, 1, 10));
+
+        assertTrue(ex.getMessage().contains("服务无响应"), ex.getMessage());
+    }
+
+    private TFleetServiceImpl buildService(TFleet fleet, VinManagementClient client) {
+        TFleetServiceImpl service = Mockito.spy(new TFleetServiceImpl());
+        Mockito.doReturn(fleet).when(service).getById(Mockito.any());
+        ReflectionTestUtils.setField(service, "vinManagementClient", client);
+        return service;
+    }
+
+    private TFleet fleet(Integer id) {
+        TFleet fleet = new TFleet();
+        fleet.setId(id);
+        return fleet;
+    }
+
+    private TVinManagement vehicle() {
+        TVinManagement item = new TVinManagement();
+        item.setId(1L);
+        item.setVin("12345678900000000");
+        item.setPlateNumber("川A123456");
+        item.setFleetId(4);
+        item.setInitQuota(new BigDecimal("30.00"));
+        item.setStatus(1);
+        return item;
+    }
+}

--
Gitblit v1.7.1