bug
liujie
2026-05-26 4a6505e6ce00d9277bfd6c416186256c085c3404
bug
3个文件已修改
171 ■■■■■ 已修改文件
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserWhitelistServiceImpl.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
    }
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 = {"管理后台-站点管理"})
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 = {"管理后台-充电桩信息", "管理后台-系统用户管理", "管理后台-角色管理", "管理后台-系统通知", "管理后台-充电评价"})