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