diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/util/SmHotelMerchantScopeHelper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/util/SmHotelMerchantScopeHelper.java index bb3696c4..fe426a7f 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/util/SmHotelMerchantScopeHelper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/util/SmHotelMerchantScopeHelper.java @@ -1,8 +1,11 @@ package com.bsd.pjcloud.supermarket.util; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; @@ -18,40 +21,48 @@ import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** - * 酒店管理数据隔离(防水平/垂直越权): + * 酒店管理数据隔离(移动端/PC 管理端共用): * + *

「向上找酒店商户」{@link #resolveHotelMerchantDeptId()} 仍保留,供归属解析等场景使用,不作为列表隔离条件。 */ @Slf4j @Component @RequiredArgsConstructor public class SmHotelMerchantScopeHelper { - private final RemoteMchService remoteMchService; + private final RemoteDeptService remoteDeptService; private final RemoteUserService remoteUserService; + private final RemoteMchService remoteMchService; + /** - * @return null=平台超管不限制;empty=无酒店商户;单元素=商户绑定部门 + * @return null=平台超管不限制;empty=无部门/无范围;非空=本部门及下级 deptId */ public List resolveHotelDeptScope() { if (isPlatformAdmin()) { return null; } - Long merchantDeptId = resolveHotelMerchantDeptId(); - if (merchantDeptId == null) { + PjcloudUser user = SecurityUtils.getUser(); + if (user == null || user.getDeptId() == null) { return List.of(); } - return List.of(merchantDeptId); + return listSelfAndDescendantDeptIds(user.getDeptId()); } - /** 用户部门 → 视图向上解析最近的酒店商户 → 商户绑定 dept_id */ + /** + * 用户部门 → 视图向上解析最近的酒店商户 → 商户绑定 dept_id。 + *

支付/归属解析沿用;管理端列表隔离请用 {@link #resolveHotelDeptScope()}。 + */ public Long resolveHotelMerchantDeptId() { PjcloudUser user = SecurityUtils.getUser(); if (user == null || user.getDeptId() == null) { @@ -70,6 +81,27 @@ public class SmHotelMerchantScopeHelper { return null; } + /** 本部门 + 下级部门(含自身)。失败时退化为仅本部门。 */ + private List listSelfAndDescendantDeptIds(Long rootDeptId) { + try { + R> deptR = remoteDeptService.getDescendantList(rootDeptId); + if (deptR != null && deptR.isOk() && CollUtil.isNotEmpty(deptR.getData())) { + List ids = deptR.getData().stream() + .map(SysDept::getDeptId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(ids)) { + return ids; + } + } + } + catch (Exception e) { + log.warn("解析本部门及下级失败, deptId={}", rootDeptId, e); + } + return List.of(rootDeptId); + } + public void applyDeptScope(LambdaQueryWrapper wrapper) { if (wrapper == null) { return; @@ -99,18 +131,14 @@ public class SmHotelMerchantScopeHelper { return deptIds.contains(hotel.getDeptId()); } + /** 新建酒店默认归属:当前用户本部门 */ public Long resolveDefaultHotelDeptId() { - List deptIds = resolveHotelDeptScope(); - if (deptIds == null) { - PjcloudUser user = SecurityUtils.getUser(); - return user == null ? null : user.getDeptId(); - } - return deptIds.isEmpty() ? null : deptIds.get(0); + PjcloudUser user = SecurityUtils.getUser(); + return user == null ? null : user.getDeptId(); } /** * 是否平台超管:查 UPMS 最新 roleCodes,不信任 JWT 里残留的 ROLE_{id}。 - * 去掉超管后未重新登录时,仍按普通账号做商户隔离。 */ private boolean isPlatformAdmin() { PjcloudUser user = SecurityUtils.getUser();