longz
2026-07-29 b08e6c28cdd8bda2fd36597c11bc7213a72678d8
各类修复
1个文件已添加
3个文件已修改
139 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/controller/TChargingOrderControllerTest.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/controller/TOrderAppealControllerTest.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1608,11 +1608,11 @@
    @ResponseBody
    @GetMapping(value = "/six/charge")
    @ApiOperation(value = "电站收入分析", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixChargingDto>> charge(Integer siteId) {
    public R<List<SixChargingDto>> charge(Integer siteId, Integer partnerId) {
        Long userId = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userId).getData();
        boolean partnerView = isPartnerView(sysUser);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId, partnerId);
        LocalDate sixBefore = PreviousSixMonths.get();
        //通过siteIds进行sql查询统计
        List<SixChargingDto> chargingDtos = chargingOrderService.charge(sixBefore, siteIds, partnerView);
@@ -1673,11 +1673,11 @@
    @ResponseBody
    @GetMapping(value = "/six/circle")
    @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixCircleDto>> circle(Integer siteId) {
    public R<List<SixCircleDto>> circle(Integer siteId, Integer partnerId) {
        Long userId = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userId).getData();
        boolean partnerView = isPartnerView(sysUser);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId, partnerId);
        LocalDate sixBefore = PreviousSixMonths.get();
        List<SixCircleDto> sixCircleDtos = chargingOrderService.circle(siteIds,sixBefore, partnerView);
        for (SixCircleDto sixCircleDto : sixCircleDtos) {
@@ -1760,12 +1760,12 @@
    @ResponseBody
    @GetMapping(value = "/six/total")
    @ApiOperation(value = "底部数据分类", tags = {"后台-数据分析-平台收入分析"})
    public R<Map<String,Object>> total(Integer siteId) {
    public R<Map<String,Object>> total(Integer siteId, Integer partnerId) {
        //count近6个月的数据
        Long userId = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userId).getData();
        boolean partnerView = isPartnerView(sysUser);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId, partnerId);
        Map<String,Object>  map = chargingOrderService.countAll(siteIds, partnerView);
        if (map == null) {
            map = new HashMap<String,Object>();
@@ -1793,11 +1793,11 @@
    @ResponseBody
    @GetMapping(value = "/six/pay-type-circle")
    @ApiOperation(value = "收入类型占比", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixIncomeCircleDto>> payTypeCircle(Integer siteId) {
    public R<List<SixIncomeCircleDto>> payTypeCircle(Integer siteId, Integer partnerId) {
        Long userId = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userId).getData();
        boolean partnerView = isPartnerView(sysUser);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId);
        List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId, partnerId);
        LocalDate sixBefore = PreviousSixMonths.get();
        return R.ok(chargingOrderService.payTypeCircle(sixBefore, siteIds, partnerView));
    }
@@ -1810,7 +1810,8 @@
     * 解析平台收入分析页面允许查看的站点范围。
     * 合作商使用授权站点,其他后台账号沿用用户站点列表;传入站点时需做授权校验。
     */
    private List<Integer> resolvePlatformRevenueSiteIds(Long userId, SysUser sysUser, Integer siteId) {
    private List<Integer> resolvePlatformRevenueSiteIds(Long userId, SysUser sysUser,
                                                        Integer siteId, Integer partnerId) {
        List<Integer> siteIds = new ArrayList<>();
        if (sysUser != null && Integer.valueOf(2).equals(sysUser.getRoleType())) {
            Set<Integer> authSiteIds = partnerClient.authSite(sysUser.getObjectId(), SiteMenu.SITE_LIST.getValue()).getData();
@@ -1828,12 +1829,40 @@
        if (siteId != null) {
            return siteIds.contains(siteId) ? Collections.singletonList(siteId) : Collections.singletonList(-1);
        }
        if (partnerId != null && !siteIds.isEmpty()) {
            R<List<Site>> siteResult = siteClient.getSiteByIds(siteIds);
            return filterPlatformRevenueSiteIdsByPartner(siteIds,
                    siteResult == null ? null : siteResult.getData(), partnerId);
        }
        if (siteIds.isEmpty()) {
            siteIds.add(-1);
        }
        return siteIds;
    }
    static List<Integer> filterPlatformRevenueSiteIdsByPartner(List<Integer> allowedSiteIds,
                                                               List<Site> sites,
                                                               Integer partnerId) {
        if (partnerId == null) {
            return allowedSiteIds == null || allowedSiteIds.isEmpty()
                    ? Collections.singletonList(-1) : new ArrayList<>(allowedSiteIds);
        }
        if (allowedSiteIds == null || allowedSiteIds.isEmpty() || sites == null || sites.isEmpty()) {
            return Collections.singletonList(-1);
        }
        Set<Integer> allowed = new HashSet<>(allowedSiteIds);
        List<Integer> result = sites.stream()
                .filter(Objects::nonNull)
                .filter(site -> allowed.contains(site.getId()))
                // 合作商类型不参与筛选:主合作商或场地方匹配均属于该合作商名下电站。
                .filter(site -> Objects.equals(site.getPartnerId(), partnerId)
                        || Objects.equals(site.getVenuePartnerId(), partnerId))
                .map(Site::getId)
                .distinct()
                .collect(Collectors.toList());
        return result.isEmpty() ? Collections.singletonList(-1) : result;
    }
    
    @RequiresPermissions(value = {"/chargeOrderMonitoring"}, logical = Logical.OR)
    @ResponseBody
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -6,6 +6,7 @@
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.domain.SiteMenu;
import com.ruoyi.chargingPile.api.feignClient.PartnerClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.common.core.domain.R;
@@ -92,8 +93,8 @@
        SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
        Integer roleType = sysUser.getRoleType();
        boolean partnerUser = Objects.equals(roleType, 2);
        Map<Integer, GetSiteListDTO> visibleSiteMap = partnerUser || hasSiteFilter ? getVisibleSiteMap(sysUser) : Collections.emptyMap();
        Set<Integer> partnerSiteIds = partnerUser ? visibleSiteMap.keySet() : Collections.emptySet();
        Map<Integer, GetSiteListDTO> visibleSiteMap = hasSiteFilter ? getVisibleSiteMap(sysUser) : Collections.emptyMap();
        Set<Integer> partnerSiteIds = partnerUser ? getPartnerAppealSiteIds(sysUser) : Collections.emptySet();
        List<TOrderAppeal> res = new ArrayList<>();
        for (TOrderAppeal record : page.getRecords()) {
            record.setUid(record.getId() + "");
@@ -133,6 +134,20 @@
        return R.ok(page);
    }
    Set<Integer> getPartnerAppealSiteIds(SysUser sysUser) {
        if (sysUser == null || sysUser.getObjectId() == null) {
            return Collections.emptySet();
        }
        R<Set<Integer>> result = partnerClient.authSite(sysUser.getObjectId(), SiteMenu.ORDER_APPEAL.getValue());
        if (result == null || result.getData() == null) {
            return Collections.emptySet();
        }
        return result.getData().stream()
                .filter(Objects::nonNull)
                .filter(siteId -> siteId > 0)
                .collect(java.util.stream.Collectors.toSet());
    }
    private Map<Integer, GetSiteListDTO> getVisibleSiteMap(SysUser sysUser) {
        if (sysUser == null || sysUser.getUserId() == null) {
            return Collections.emptyMap();
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/controller/TChargingOrderControllerTest.java
@@ -1,6 +1,7 @@
package com.ruoyi.order.controller;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.SixChargingDto;
@@ -80,4 +81,35 @@
        verify(chargingOrderService).chargingOrder(same(query));
        verifyNoInteractions(appUserClient);
    }
    @Test
    void partnerFilterIncludesPrimaryAndVenueSitesRegardlessOfPartnerType() {
        Site primarySite = new Site();
        primarySite.setId(11);
        primarySite.setPartnerId(9);
        Site venueSite = new Site();
        venueSite.setId(12);
        venueSite.setPartnerId(3);
        venueSite.setVenuePartnerId(9);
        Site unrelatedSite = new Site();
        unrelatedSite.setId(13);
        unrelatedSite.setPartnerId(4);
        List<Integer> result = TChargingOrderController.filterPlatformRevenueSiteIdsByPartner(
                Arrays.asList(11, 12, 13), Arrays.asList(primarySite, venueSite, unrelatedSite), 9);
        assertEquals(Arrays.asList(11, 12), result);
    }
    @Test
    void partnerFilterReturnsImpossibleSiteWhenPartnerHasNoAuthorizedSites() {
        Site unrelatedSite = new Site();
        unrelatedSite.setId(13);
        unrelatedSite.setPartnerId(4);
        List<Integer> result = TChargingOrderController.filterPlatformRevenueSiteIdsByPartner(
                Arrays.asList(13), Arrays.asList(unrelatedSite), 9);
        assertEquals(Arrays.asList(-1), result);
    }
}
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/controller/TOrderAppealControllerTest.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.order.controller;
import com.ruoyi.chargingPile.api.domain.SiteMenu;
import com.ruoyi.chargingPile.api.feignClient.PartnerClient;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.service.TOrderAppealService;
import com.ruoyi.system.api.domain.SysUser;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class TOrderAppealControllerTest {
    @Test
    void partnerAppealSitesUseOrderAppealPermissionInsteadOfSiteListPermission() {
        TOrderAppealService appealService = mock(TOrderAppealService.class);
        TokenService tokenService = mock(TokenService.class);
        PartnerClient partnerClient = mock(PartnerClient.class);
        TOrderAppealController controller = new TOrderAppealController(appealService, tokenService);
        ReflectionTestUtils.setField(controller, "partnerClient", partnerClient);
        SysUser partnerUser = new SysUser();
        partnerUser.setObjectId(9);
        when(partnerClient.authSite(9, SiteMenu.ORDER_APPEAL.getValue()))
                .thenReturn(R.ok(new HashSet<>(Arrays.asList(-1, 11, 12))));
        Set<Integer> result = controller.getPartnerAppealSiteIds(partnerUser);
        assertEquals(new HashSet<>(Arrays.asList(11, 12)), result);
        verify(partnerClient).authSite(9, SiteMenu.ORDER_APPEAL.getValue());
    }
}