From 4a6505e6ce00d9277bfd6c416186256c085c3404 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 26 五月 2026 15:38:38 +0800
Subject: [PATCH] bug

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java |  155 +++++++++++++++++++++++++++++++++++++++++++++++++--
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java       |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java    |   13 ++++
 3 files changed, 161 insertions(+), 10 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java
index c522a5c..8fab620 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.account.api.dto.AppUserWhitelistImportDTO;
 import com.ruoyi.account.api.dto.AppUserWhitelistQueryDTO;
@@ -16,6 +17,7 @@
 import com.ruoyi.account.service.TAppUserService;
 import com.ruoyi.account.service.TAppUserWhitelistService;
 import com.ruoyi.account.service.TAppUserWhitelistSiteService;
+import com.ruoyi.chargingPile.api.domain.SiteMenu;
 import com.ruoyi.chargingPile.api.feignClient.PartnerClient;
 import com.ruoyi.chargingPile.api.feignClient.SiteClient;
 import com.ruoyi.chargingPile.api.model.Partner;
@@ -27,6 +29,8 @@
 import com.ruoyi.common.core.web.domain.BasePojo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysUserClient;
 import com.ruoyi.system.api.model.LoginUser;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -78,16 +82,29 @@
     private PartnerClient partnerClient;
     @Resource
     private TokenService tokenService;
+    @Resource
+    private SysUserClient sysUserClient;
 
     @Override
     public Page<TAppUserWhitelist> pageList(AppUserWhitelistQueryDTO queryDTO) {
         if (queryDTO == null) {
             queryDTO = new AppUserWhitelistQueryDTO();
         }
-        Page<TAppUserWhitelist> page = this.lambdaQuery()
+        Integer currentPartnerId = getCurrentPartnerId();
+        String username = getUsername();
+        LambdaQueryChainWrapper<TAppUserWhitelist> query = this.lambdaQuery()
                 .like(StringUtils.isNotBlank(queryDTO.getPhone()), TAppUserWhitelist::getPhone, queryDTO.getPhone())
-                .eq(TAppUserWhitelist::getDelFlag, false)
-                .orderByDesc(BasePojo::getCreateTime)
+                .eq(TAppUserWhitelist::getDelFlag, false);
+        if (currentPartnerId != null) {
+            if (StringUtils.isNotBlank(username)) {
+                query.and(wrapper -> wrapper.eq(TAppUserWhitelist::getPartnerId, currentPartnerId)
+                        .or()
+                        .eq(TAppUserWhitelist::getCreateBy, username));
+            } else {
+                query.eq(TAppUserWhitelist::getPartnerId, currentPartnerId);
+            }
+        }
+        Page<TAppUserWhitelist> page = query.orderByDesc(BasePojo::getCreateTime)
                 .page(Page.of(queryDTO.getPageCurr(), queryDTO.getPageSize()));
         fillDisplay(page.getRecords());
         return page;
@@ -99,6 +116,7 @@
         if (whitelist == null) {
             throw new ServiceException("白名单用户不存在");
         }
+        assertPartnerVisible(whitelist);
         fillDisplay(Collections.singletonList(whitelist));
         return whitelist;
     }
@@ -125,6 +143,11 @@
                 continue;
             }
             Long whitelistId = Long.valueOf(id);
+            TAppUserWhitelist whitelist = this.getById(whitelistId);
+            if (whitelist == null) {
+                continue;
+            }
+            assertPartnerVisible(whitelist);
             this.removeById(whitelistId);
             whitelistSiteService.remove(Wrappers.lambdaQuery(TAppUserWhitelistSite.class)
                     .eq(TAppUserWhitelistSite::getWhitelistId, whitelistId));
@@ -227,7 +250,7 @@
      */
     private boolean isWhitelistScopeMatched(TAppUserWhitelist whitelist, Integer siteId) {
         if (Objects.equals(whitelist.getScopeType(), SCOPE_ALL_SITE)) {
-            return true;
+            return whitelist.getPartnerId() == null || isSiteBelongsToPartner(siteId, whitelist.getPartnerId());
         }
         if (Objects.equals(whitelist.getScopeType(), SCOPE_SELECTED_SITE)) {
             return whitelistSiteService.lambdaQuery()
@@ -291,6 +314,7 @@
         if (Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) && saveDTO.getPartnerId() == null) {
             throw new ServiceException("请选择加盟商");
         }
+        validatePartnerDataScope(saveDTO);
         TAppUserWhitelist exists = getByPhone(saveDTO.getPhone());
         if (saveDTO.getId() == null && exists != null) {
             throw new ServiceException("该手机号已存在白名单配置");
@@ -314,7 +338,7 @@
         whitelist.setPhone(saveDTO.getPhone());
         whitelist.setBenefitType(saveDTO.getBenefitType());
         whitelist.setScopeType(saveDTO.getScopeType());
-        whitelist.setPartnerId(Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null);
+        whitelist.setPartnerId(resolveWhitelistPartnerId(saveDTO));
         whitelist.setStatus(STATUS_ENABLED);
         whitelist.setUpdateBy(getUsername());
         whitelist.setRemark(saveDTO.getRemark());
@@ -347,6 +371,7 @@
         if (whitelist == null) {
             throw new ServiceException("白名单用户不存在");
         }
+        assertPartnerVisible(whitelist);
         TAppUser appUser = appUserService.lambdaQuery()
                 .eq(TAppUser::getPhone, saveDTO.getPhone())
                 .last("LIMIT 1")
@@ -355,7 +380,7 @@
         whitelist.setPhone(saveDTO.getPhone());
         whitelist.setBenefitType(saveDTO.getBenefitType());
         whitelist.setScopeType(saveDTO.getScopeType());
-        whitelist.setPartnerId(Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null);
+        whitelist.setPartnerId(resolveWhitelistPartnerId(saveDTO));
         whitelist.setStatus(STATUS_ENABLED);
         whitelist.setUpdateBy(getUsername());
         whitelist.setRemark(saveDTO.getRemark());
@@ -444,8 +469,7 @@
     }
 
     private Map<String, Site> getSiteCodeMap() {
-        R<List<Site>> siteResult = siteClient.getSiteAll();
-        List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData();
+        List<Site> sites = getCurrentSelectableSites();
         Map<String, Site> siteCodeMap = new HashMap<>();
         for (Site site : sites) {
             if (site != null && StringUtils.isNotBlank(site.getCode())) {
@@ -527,6 +551,121 @@
         return partnerMap;
     }
 
+    private void validatePartnerDataScope(AppUserWhitelistSaveDTO saveDTO) {
+        Integer currentPartnerId = getCurrentPartnerId();
+        if (currentPartnerId == null) {
+            return;
+        }
+        if (Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER)
+                && !Objects.equals(saveDTO.getPartnerId(), currentPartnerId)) {
+            throw new ServiceException("合作商账号只能选择本合作商");
+        }
+        if (Objects.equals(saveDTO.getScopeType(), SCOPE_SELECTED_SITE)) {
+            Set<Integer> authSiteIds = getCurrentPartnerSiteIds(currentPartnerId);
+            if (authSiteIds.isEmpty()) {
+                throw new ServiceException("当前合作商没有可用电站权限");
+            }
+            List<Integer> unauthorizedSiteIds = saveDTO.getSiteIds().stream()
+                    .filter(Objects::nonNull)
+                    .filter(siteId -> !authSiteIds.contains(siteId))
+                    .collect(Collectors.toList());
+            if (!unauthorizedSiteIds.isEmpty()) {
+                throw new ServiceException("只能选择当前合作商负责的电站");
+            }
+        }
+    }
+
+    private void assertPartnerVisible(TAppUserWhitelist whitelist) {
+        Integer currentPartnerId = getCurrentPartnerId();
+        if (currentPartnerId == null || whitelist == null) {
+            return;
+        }
+        if (Objects.equals(whitelist.getPartnerId(), currentPartnerId)) {
+            return;
+        }
+        if (StringUtils.isNotBlank(whitelist.getCreateBy()) && Objects.equals(whitelist.getCreateBy(), getUsername())) {
+            return;
+        }
+        throw new ServiceException("无权操作该白名单数据");
+    }
+
+    private Integer resolveWhitelistPartnerId(AppUserWhitelistSaveDTO saveDTO) {
+        Integer currentPartnerId = getCurrentPartnerId();
+        if (currentPartnerId != null) {
+            return currentPartnerId;
+        }
+        return Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null;
+    }
+
+    private List<Site> getCurrentSelectableSites() {
+        Integer currentPartnerId = getCurrentPartnerId();
+        if (currentPartnerId == null) {
+            R<List<Site>> siteResult = siteClient.getSiteAll();
+            return siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData();
+        }
+        Set<Integer> siteIds = getCurrentPartnerSiteIds(currentPartnerId);
+        if (siteIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+        R<List<Site>> siteResult = siteClient.getSiteByIds(new ArrayList<>(siteIds));
+        List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData();
+        return sites.stream()
+                .filter(site -> site != null && Objects.equals(site.getPartnerId(), currentPartnerId))
+                .collect(Collectors.toList());
+    }
+
+    private Set<Integer> getCurrentPartnerSiteIds(Integer partnerId) {
+        R<Set<Integer>> siteResult = partnerClient.authSite(partnerId, SiteMenu.SITE_LIST.getValue());
+        return siteResult == null || siteResult.getData() == null ? Collections.emptySet() : siteResult.getData();
+    }
+
+    private boolean isSiteBelongsToPartner(Integer siteId, Integer partnerId) {
+        if (siteId == null || partnerId == null) {
+            return false;
+        }
+        R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId));
+        List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData();
+        return !sites.isEmpty() && Objects.equals(sites.get(0).getPartnerId(), partnerId);
+    }
+
+    private Integer getCurrentPartnerId() {
+        SysUser sysUser = getCurrentSysUser();
+        if (sysUser == null || !Objects.equals(sysUser.getRoleType(), 2)) {
+            return null;
+        }
+        return sysUser.getObjectId();
+    }
+
+    private SysUser getCurrentSysUser() {
+        LoginUser loginUser = null;
+        try {
+            loginUser = tokenService.getLoginUser();
+        } catch (Exception e) {
+            // ignore and try security context fallback
+        }
+        if (loginUser == null) {
+            try {
+                loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                // ignore and fall through to null
+            }
+        }
+        if (loginUser == null) {
+            return null;
+        }
+        if (loginUser.getSysUser() != null && loginUser.getSysUser().getRoleType() != null) {
+            return loginUser.getSysUser();
+        }
+        if (loginUser.getUserid() == null) {
+            return loginUser.getSysUser();
+        }
+        R<SysUser> userResult = sysUserClient.getSysUser(loginUser.getUserid());
+        if (userResult != null && userResult.getData() != null) {
+            return userResult.getData();
+        }
+        return loginUser.getSysUser();
+    }
+
     private boolean isValidPhone(String phone) {
         return StringUtils.isNotBlank(phone) && PHONE_PATTERN.matcher(phone).matches();
     }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
index e34da66..a3396bf 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
@@ -33,6 +33,7 @@
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -101,6 +102,16 @@
 	@ResponseBody
 	@GetMapping("/getAllPartner")
 	public R<List<Partner>> getAllPartner(){
+		try {
+			SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+			if(sysUser != null && Objects.equals(sysUser.getRoleType(), 2)){
+				return R.ok(partnerService.list(new LambdaQueryWrapper<Partner>()
+						.eq(Partner::getDelFlag, 0)
+						.eq(Partner::getId, sysUser.getObjectId())));
+			}
+		} catch (Exception e) {
+			// 内部服务调用没有登录上下文时保持原全量行为
+		}
 		return R.ok(partnerService.list());
 	}
 	
@@ -143,7 +154,7 @@
 private TokenService tokenService;
 
 
-	@RequiresPermissions(value = {"/site/add", "/site/update"}, logical = Logical.OR)
+	@RequiresPermissions(value = {"/site/add", "/site/update", "/appUserWhitelist/add", "/appUserWhitelist/update"}, logical = Logical.OR)
 	@ResponseBody
 	@GetMapping("/getPartner")
 	@ApiOperation(value = "获取所有合作商", tags = {"管理后台-站点管理"})
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
index 4d93f85..4e7cbe6 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -591,7 +591,8 @@
 	
 	
 	@RequiresPermissions(value = {"/roleManagement/add", "/roleManagement/info", "/roleManagement/update", "/systemNotification", "/chargingPeriodStatistics",
-			"/parkingPaymentOrder", "/generateStatement", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update"}, logical = Logical.OR)
+			"/parkingPaymentOrder", "/generateStatement", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update",
+			"/appUserWhitelist/add", "/appUserWhitelist/update", "/appUserWhitelist/import"}, logical = Logical.OR)
 	@ResponseBody
 	@GetMapping("/getAllSiteList")
 	@ApiOperation(value = "获取所有站点数据", tags = {"管理后台-充电桩信息", "管理后台-系统用户管理", "管理后台-角色管理", "管理后台-系统通知", "管理后台-充电评价"})

--
Gitblit v1.7.1