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()); } }