puzhibing
2026-09-29 ecdfee84b355d09b81275f2a7b8dad14e4cf3de8
修改车队模块
3个文件已修改
117 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TVinManagement.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TVinManagement.java
@@ -25,6 +25,8 @@
    @TableField("balance") private BigDecimal balance;
    @TableField("locked_amount") private BigDecimal lockedAmount;
    @TableField(exist = false) private String fleetName;
    /** 可用余额(展示值,非表字段:公司共享模式=公司当前可用余额,分配模式=VIN码自身余额) */
    @TableField(exist = false) private BigDecimal availableBalance;
    @Excel(name = "备注", width = 30) private String remark;
    @Excel(name = "启用状态", readConverterExp = "1=启用,2=禁用") private Integer status;
    @TableLogic(value = "0", delval = "2") private Integer delFlag;
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TFleetServiceImpl.java
@@ -68,7 +68,8 @@
        if (fleetId == null) {
            throw new ServiceException("车队ID不能为空");
        }
        if (getById(fleetId) == null) {
        TFleet fleet = getById(fleetId);
        if (fleet == null) {
            throw new ServiceException("车队不存在或已删除");
        }
        VinManagementQueryDTO query = new VinManagementQueryDTO();
@@ -79,9 +80,27 @@
        if (response == null || !R.isSuccess(response) || response.getData() == null) {
            throw new ServiceException("VIN码车辆查询失败:" + (response == null ? "服务无响应" : response.getMsg()));
        }
        fillAvailableBalance(fleet.getCompanyId(), response.getData());
        return response.getData();
    }
    /**
     * 填充VIN码车辆可用余额(车队详情弹窗展示):
     * 公司账户模式 2=分配模式 → VIN码自身余额;其余(1=共享/历史null)→ 公司当前可用余额;
     * 公司不存在或余额为空时保持 null,前端显示 '-'。
     */
    private void fillAvailableBalance(Integer companyId, Page<TVinManagement> page) {
        if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
            return;
        }
        TGroupCompany company = companyId == null ? null : groupCompanyService.getById(companyId);
        boolean allocation = company != null && Integer.valueOf(2).equals(company.getAccountMode());
        BigDecimal companyBalance = company == null ? null : company.getAvailableBalance();
        for (TVinManagement item : page.getRecords()) {
            item.setAvailableBalance(allocation ? item.getBalance() : companyBalance);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String importFleets(List<FleetImportDTO> items) {
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TFleetServiceImplTest.java
@@ -8,9 +8,11 @@
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.other.api.domain.TChargeAuthorization;
import com.ruoyi.other.api.domain.TFleet;
import com.ruoyi.other.api.domain.TGroupCompany;
import com.ruoyi.other.api.feignClient.FleetOrderAggregateClient;
import com.ruoyi.other.api.vo.FleetOrderAggregateVO;
import com.ruoyi.other.mapper.TChargeAuthorizationMapper;
import com.ruoyi.other.service.TGroupCompanyService;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
@@ -22,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -108,6 +111,89 @@
    }
    @Test
    void fillsCompanyBalanceForSharedAccountMode() {
        VinManagementClient client = Mockito.mock(VinManagementClient.class);
        Page<TVinManagement> page = new Page<>(1, 10);
        page.setRecords(Collections.singletonList(vehicle()));
        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(page));
        TGroupCompanyService groupCompanyService = Mockito.mock(TGroupCompanyService.class);
        TGroupCompany company = new TGroupCompany();
        company.setId(7);
        company.setAccountMode(1);
        company.setAvailableBalance(new BigDecimal("500.00"));
        Mockito.when(groupCompanyService.getById(7)).thenReturn(company);
        TFleet fleet = fleet(4);
        fleet.setCompanyId(7);
        buildService(fleet, client, null, null, groupCompanyService).selectVinPage(4, 1, 10);
        // 共享模式展示公司当前可用余额,而非 VIN 自身余额(vehicle() balance=30.00)
        assertEquals(0, new BigDecimal("500.00").compareTo(page.getRecords().get(0).getAvailableBalance()));
    }
    @Test
    void fillsVinBalanceForAllocationAccountMode() {
        VinManagementClient client = Mockito.mock(VinManagementClient.class);
        Page<TVinManagement> page = new Page<>(1, 10);
        page.setRecords(Collections.singletonList(vehicle()));
        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(page));
        TGroupCompanyService groupCompanyService = Mockito.mock(TGroupCompanyService.class);
        TGroupCompany company = new TGroupCompany();
        company.setId(7);
        company.setAccountMode(2);
        company.setAvailableBalance(new BigDecimal("500.00"));
        Mockito.when(groupCompanyService.getById(7)).thenReturn(company);
        TFleet fleet = fleet(4);
        fleet.setCompanyId(7);
        buildService(fleet, client, null, null, groupCompanyService).selectVinPage(4, 1, 10);
        // 分配模式展示 VIN 自身余额
        assertEquals(0, new BigDecimal("30.00").compareTo(page.getRecords().get(0).getAvailableBalance()));
    }
    @Test
    void treatsNullAccountModeAsSharedAndKeepsNullWhenCompanyMissing() {
        VinManagementClient client = Mockito.mock(VinManagementClient.class);
        Page<TVinManagement> page = new Page<>(1, 10);
        TVinManagement first = vehicle();
        page.setRecords(Collections.singletonList(first));
        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(page));
        TGroupCompanyService groupCompanyService = Mockito.mock(TGroupCompanyService.class);
        TGroupCompany company = new TGroupCompany();
        company.setId(7);
        company.setAccountMode(null);
        company.setAvailableBalance(new BigDecimal("88.00"));
        Mockito.when(groupCompanyService.getById(7)).thenReturn(company);
        TFleet fleet = fleet(4);
        fleet.setCompanyId(7);
        buildService(fleet, client, null, null, groupCompanyService).selectVinPage(4, 1, 10);
        // 历史数据账户模式为 null 时按共享模式展示公司余额(与系统"仅 ==2 为分配"口径一致)
        assertEquals(0, new BigDecimal("88.00").compareTo(first.getAvailableBalance()));
        // 公司不存在(如已被删除)→ 保持 null,前端显示 '-'
        Mockito.when(groupCompanyService.getById(8)).thenReturn(null);
        TFleet other = fleet(6);
        other.setCompanyId(8);
        Page<TVinManagement> otherPage = new Page<>(1, 10);
        TVinManagement third = vehicle();
        third.setId(3L);
        otherPage.setRecords(Collections.singletonList(third));
        Mockito.when(client.getVinPageByFleet(Mockito.any())).thenReturn(R.ok(otherPage));
        buildService(other, client, null, null, groupCompanyService).selectVinPage(6, 1, 10);
        assertNull(third.getAvailableBalance());
    }
    @Test
    void fillAggregatesPopulatesAllFiveFields() {
        VinManagementClient vinClient = Mockito.mock(VinManagementClient.class);
        FleetOrderAggregateClient aggClient = Mockito.mock(FleetOrderAggregateClient.class);
@@ -178,11 +264,19 @@
    private TFleetServiceImpl buildService(TFleet fleet, VinManagementClient client,
                                           FleetOrderAggregateClient aggClient,
                                           TChargeAuthorizationMapper authMapper) {
        return buildService(fleet, client, aggClient, authMapper, Mockito.mock(TGroupCompanyService.class));
    }
    private TFleetServiceImpl buildService(TFleet fleet, VinManagementClient client,
                                           FleetOrderAggregateClient aggClient,
                                           TChargeAuthorizationMapper authMapper,
                                           TGroupCompanyService groupCompanyService) {
        TFleetServiceImpl service = Mockito.spy(new TFleetServiceImpl());
        Mockito.doReturn(fleet).when(service).getById(Mockito.any());
        ReflectionTestUtils.setField(service, "vinManagementClient", client);
        ReflectionTestUtils.setField(service, "fleetOrderAggregateClient", aggClient);
        ReflectionTestUtils.setField(service, "chargeAuthorizationMapper", authMapper);
        ReflectionTestUtils.setField(service, "groupCompanyService", groupCompanyService);
        return service;
    }