Sfoglia il codice sorgente

客房权限功能

xiari 1 anno fa
parent
commit
1ff66b96ec

+ 22 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteAreaPermissionsService.java

@@ -0,0 +1,22 @@
+package org.dromara.hotel.api.service;
+
+import java.util.List;
+
+/**
+ * @ClassName RemoteAreaPermissionsService
+ * @Description 酒店系统客房权限远程服务接口
+ * @Author xiari
+ * @Date 2025-4-21
+ * @Version 1.0
+ * @since jdk17
+ */
+public interface RemoteAreaPermissionsService {
+
+
+    /**
+     * 根据用户id获取区域楼栋权限
+     * @param userId
+     * @return
+     */
+    List<Long> getAreaPermissions(Long userId);
+}

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomTypeController.java

@@ -37,6 +37,8 @@ public class PtRoomTypeController extends BaseController {
 
     private final IPtRoomTypeService ptRoomTypeService;
 
+
+
     /**
      * 查询房型管理列表
      */
@@ -46,6 +48,10 @@ public class PtRoomTypeController extends BaseController {
         return ptRoomTypeService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 按房型统计房间数量
+     * @return
+     */
 //    @SaCheckPermission("roomType:ptRoomType:list")
     @GetMapping("/all")
     public R<List<PtRoomTypeVo>> all() {

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtAreaService.java

@@ -38,6 +38,13 @@ public interface IPtAreaService {
     List<PtAreaVo> queryListHasKF();
     List<PtAreaVo> queryByLDList(List<PtAreaBo> dataList);
 
+    /**
+     * 根据楼栋ids 查询 楼层ids
+     * @param ids
+     * @return
+     */
+    List<Long> queryFloorByLDList(List<Long> ids);
+
     List<PtAreaVo> queryListLD(Long areaId);
 
     Map<Long, PtAreaVo> queryMapByIds(List<Long> ids);

+ 4 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomService.java

@@ -56,6 +56,8 @@ public interface IPtRoomService {
      */
     List<PtRoomVo> selectList(PtRoomBo bo);
 
+    List<PtRoomVo> selectListByAreas(PtRoomBo bo,List<Long> areaIds);
+
     /**
      * 查询房间信息并转换成区域信息
      * @param bo 房间定义
@@ -99,6 +101,8 @@ public interface IPtRoomService {
      * @return
      */
     Map<String, Long> getCountByStatus();
+
+    public List<Long> getHasPermissionFloor(Long userId);
     /**
      * 更新客房的状态
      *

+ 79 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAreaServiceImpl.java

@@ -23,7 +23,9 @@ import org.dromara.common.core.utils.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.api.service.RemoteAreaPermissionsService;
 import org.dromara.hotel.api.service.RemoteOrderService;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.PtArea;
@@ -54,6 +56,9 @@ public class PtAreaServiceImpl implements IPtAreaService {
     @DubboReference
     private RemoteOrderService remoteOrderService;
 
+    @DubboReference
+    private RemoteAreaPermissionsService areaPermissionsService;
+
     /**
      * 查询建筑物区域
      *
@@ -82,7 +87,32 @@ public class PtAreaServiceImpl implements IPtAreaService {
     public List<PtAreaVo> queryListHasKF() {
 //        lqw.notIn(PtArea::getAreaType, BuildAreaTypeEnum.LC.code());
 
-        List<PtAreaVo> ptAreaVos = baseMapper.selectVoList();
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        Long userId = LoginHelper.getUserId();
+        List<PtAreaVo> ptAreaVos;
+        if(!isAdmin){
+            List<Long> lds = areaPermissionsService.getAreaPermissions(userId);
+            if(CollectionUtil.isEmpty(lds)){
+                return new ArrayList<>();
+            }
+            LambdaQueryWrapper<PtArea> lqw = new LambdaQueryWrapper<>();
+            List<PtAreaVo> ldAreas = baseMapper.selectVoList(lqw.in(PtArea::getAreaId, lds));
+            Set<Long> alls = new HashSet<>(lds);
+            ldAreas.forEach(ptAreaVo -> {
+                String ancestors = ptAreaVo.getAncestors();
+                if (StringUtils.isNotBlank(ancestors)) {
+                    String[] split = ancestors.split(",");
+                    alls.addAll(Arrays.stream(split).map(Long::parseLong).toList());
+                }
+            });
+            lqw.clear();
+            lqw.in(PtArea::getAreaId, alls).or().in(PtArea::getParentId,lds);
+            ptAreaVos = baseMapper.selectVoList(lqw);
+        }else {
+            ptAreaVos = baseMapper.selectVoList();
+        }
+
+//        List<PtAreaVo> ptAreaVos = baseMapper.selectVoList();
 
         List<PtAreaVo> rs = ptAreaVos.stream().filter(ptAreaVo -> !ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.LC.code())).toList();
 
@@ -191,6 +221,25 @@ public class PtAreaServiceImpl implements IPtAreaService {
         return rs;
     }
 
+    /**
+     * 根据楼栋ids 查询 楼层ids
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<Long> queryFloorByLDList(List<Long> ids) {
+        if(ids==null||ids.isEmpty()) return ListUtil.empty();
+        LambdaQueryWrapper<PtArea> lqw = Wrappers.lambdaQuery();
+        lqw.eq(PtArea::getAreaType, BuildAreaTypeEnum.LC.code());
+        lqw.in(PtArea::getParentId, ids).select(PtArea::getAreaId);
+        List<Long> rs = new ArrayList<>();
+        baseMapper.selectList(lqw).forEach(e->{
+            rs.add(e.getAreaId());
+        });
+        return rs;
+    }
+
+
     @Override
     public Map<Long, PtAreaVo> queryMapByIds(List<Long> ids) {
         List<PtArea> ptAreas = baseMapper.selectBatchIds(ids);
@@ -418,6 +467,19 @@ public class PtAreaServiceImpl implements IPtAreaService {
             if(CollectionUtil.isEmpty(floors)){
                 return rs;
             }
+
+            //校验权限
+            boolean isAdmin = LoginHelper.isSuperAdmin();
+            if(!isAdmin){
+                // 如果不是超级管理员,则查询用户权限
+                Long userId = LoginHelper.getUserId();
+                List<Long> lds = areaPermissionsService.getAreaPermissions(userId);
+                if(CollectionUtil.isEmpty(lds)){
+                    return rs;
+                }
+                floors = floors.stream().filter(ptAreaVo -> lds.contains(ptAreaVo.getParentId())).toList();
+            }
+
             List<Long> floorIds = floors.stream().map(PtAreaVo::getAreaId).toList();
             // 根据楼层查询所有房间
             List<PtRoomVo> guestRooms = ptRoomMapper.selectVoList(Wrappers.lambdaQuery(PtRoom.class)
@@ -492,6 +554,22 @@ public class PtAreaServiceImpl implements IPtAreaService {
         List<FloorRoomsVo> rs = new ArrayList<>();
         List<String> checkStatus =
                     List.of(HotelRoomStatusEnum.YZ.code(), HotelRoomStatusEnum.CS.code(), HotelRoomStatusEnum.SF.code(), HotelRoomStatusEnum.YD.code());
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        if(!isAdmin){
+            //校验权限
+            Long userId = LoginHelper.getUserId();
+            List<Long> areaPermissions = areaPermissionsService.getAreaPermissions(userId);
+            if(CollectionUtil.isEmpty(areaPermissions)){
+                throw new ServiceException("您没有权限查看该数据!");
+            }
+            List<Long> floorIds = queryFloorByLDList(areaPermissions);
+            if(CollectionUtil.isEmpty(floorIds)){
+                throw new ServiceException("您没有权限查看该数据!");
+            }
+           if(!floorIds.contains(param.getFloorId())){
+               throw new ServiceException("您没有权限查看该数据!");
+           }
+        }
         if(StringUtils.isEmpty(param.getMultiParams())){
 //        1.基础平台的房间数据:根据楼层、房型、房间状态、房间号 查询房间数据
             // 1.1.先查询所有房间数据

+ 71 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.basics.domain.PtRoom;
 import org.dromara.backstage.basics.domain.PtRoomType;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
@@ -24,7 +25,9 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.hotel.api.service.RemoteAreaPermissionsService;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -49,6 +52,9 @@ public class PtRoomServiceImpl implements IPtRoomService {
 
     private final PtRoomTypeMapper roomTypeMapper;
 
+    @DubboReference
+    private RemoteAreaPermissionsService areaPermissionsService;
+
     /**
      * 查询房间定义
      *
@@ -97,6 +103,15 @@ public class PtRoomServiceImpl implements IPtRoomService {
     @Override
     public TableDataInfo<PtRoomVo> queryPageListByAreaIds(QueryRoomBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<PtRoom> lqw = new LambdaQueryWrapper<>();
+        //校验权限
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        if (!isAdmin) {
+            List<Long> floors = getHasPermissionFloor(LoginHelper.getUserId());
+            if(CollectionUtil.isEmpty(floors)){
+                return TableDataInfo.build(new Page<>());
+            }
+            lqw.in(PtRoom::getAreaId, floors);
+        }
         lqw.eq(StringUtils.isNotBlank(bo.getRoomType()), PtRoom::getRoomType, bo.getRoomType());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), PtRoom::getStatus, bo.getStatus());
         lqw.in(CollectionUtil.isNotEmpty(bo.getFloorIds()), PtRoom::getAreaId, bo.getFloorIds())
@@ -152,6 +167,16 @@ public class PtRoomServiceImpl implements IPtRoomService {
             }
 
         }
+        //校验权限
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        if (!isAdmin) {
+            List<Long> floors = getHasPermissionFloor(LoginHelper.getUserId());
+            if(CollectionUtil.isEmpty(floors)){
+                // 没有任何权限
+                return new ArrayList<>();
+            }
+            lqw.in(PtRoom::getAreaId, floors);
+        }
         lqw.orderByDesc(PtRoom::getCreateTime);
         List<PtRoomVo> ptRoomVos = baseMapper.selectVoList(lqw);
         setAreaName(ptRoomVos);
@@ -170,6 +195,20 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return baseMapper.selectVoList(lqw);
     }
 
+    /**
+     * 根据区域id查询房间
+     * @param bo
+     * @param areaIds
+     * @return
+     */
+    public List<PtRoomVo> selectListByAreas(PtRoomBo bo,List<Long> areaIds) {
+        LambdaQueryWrapper<PtRoom> lqw = buildQueryWrapper(bo);
+        if (CollectionUtil.isNotEmpty(areaIds)){
+            lqw.in(PtRoom::getAreaId,areaIds);
+        }
+        return baseMapper.selectVoList(lqw);
+    }
+
     /**
      * 仅用于选择房间
      *
@@ -309,22 +348,37 @@ public class PtRoomServiceImpl implements IPtRoomService {
     /**
      * 查询所有房间状态的房间数量
      *
+     * 根据客房权限,进行过滤
+     *
      * @return
      */
     @Override
     public Map<String, Long> getCountByStatus() {
 
+        HotelRoomStatusEnum[] values = HotelRoomStatusEnum.values();
         Map<String, Long> map = new HashMap<>();
+        List<Long> floors = new ArrayList<>();
+
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        Long userId = LoginHelper.getUserId();
+        if(!isAdmin){
+            floors = getHasPermissionFloor(userId);
+            if(CollectionUtil.isEmpty(floors)){
+                for (HotelRoomStatusEnum value : values) {
+                    map.put(value.code(), 0L);
+                }
+                return map;
+            }
+        }
 
         LambdaQueryWrapper<PtRoom> lambdaQuery = Wrappers.<PtRoom>lambdaQuery();
-        lambdaQuery.eq(PtRoom::getRoomType, FJLXEnum.KF.code());
+        lambdaQuery.eq(PtRoom::getRoomType, FJLXEnum.KF.code()).in(!isAdmin, PtRoom::getAreaId, floors);
 
         List<PtRoomVo> list = baseMapper.selectVoList(lambdaQuery);
 
         // 按 status 分组 统计
         Map<String, Long> mapList = list.stream().collect(Collectors.groupingBy(PtRoomVo::getStatus, Collectors.counting()));
 
-        HotelRoomStatusEnum[] values = HotelRoomStatusEnum.values();
         if (mapList.isEmpty()) {
             for (HotelRoomStatusEnum value : values) {
                 map.put(value.code(), 0L);
@@ -338,6 +392,21 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return map;
     }
 
+    /**
+     * 查询当前账号有权限的楼层
+     * @return
+     */
+    public List<Long> getHasPermissionFloor(Long userId){
+        List<Long> rs = new ArrayList<>();
+        List<Long> areaPermissions = areaPermissionsService.getAreaPermissions(userId);
+        if(CollectionUtil.isNotEmpty(areaPermissions)){
+            // 根据楼栋 查询 楼层
+            return areaService.queryFloorByLDList(areaPermissions);
+        }
+
+        return rs;
+    }
+
 
     /**
      * 保存前的数据校验

+ 20 - 8
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomTypeServiceImpl.java

@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
 import org.dromara.hotel.api.service.RemoteOrderService;
 import org.springframework.stereotype.Service;
@@ -27,10 +28,7 @@ import org.dromara.backstage.basics.domain.PtRoomType;
 import org.dromara.backstage.basics.mapper.PtRoomTypeMapper;
 import org.dromara.backstage.basics.service.IPtRoomTypeService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -96,14 +94,28 @@ public class PtRoomTypeServiceImpl implements IPtRoomTypeService {
      */
     @Override
     public List<PtRoomTypeVo> queryAllCount() {
+
+        List<Long> floors = new ArrayList<>();
+        boolean isAdmin = LoginHelper.isSuperAdmin();
+        Long userId = LoginHelper.getUserId();
+        if(!isAdmin){
+            floors = roomService.getHasPermissionFloor(userId);
+        }
+
         LambdaQueryWrapper<PtRoomType> lqw = new LambdaQueryWrapper<>();
         lqw.orderByDesc(PtRoomType::getCreateTime);
         List<PtRoomTypeVo> vos = baseMapper.selectVoList(lqw);
 
-        // 房间总数量
-        PtRoomBo bo = new PtRoomBo();
-        bo.setRoomType(FJLXEnum.KF.code());
-        List<PtRoomVo> ptRoomVos = roomService.selectList(bo);
+        List<PtRoomVo> ptRoomVos;
+
+        if(!isAdmin && CollectionUtil.isEmpty(floors)){
+            ptRoomVos = new ArrayList<>();
+        }else{
+            // 房间总数量
+            PtRoomBo bo = new PtRoomBo();
+            bo.setRoomType(FJLXEnum.KF.code());
+            ptRoomVos = roomService.selectListByAreas(bo,floors);
+        }
 
         // 按照房间类型分组统计
 //        Map<Long, Long> allCountMap = ptRoomVos.stream().collect(Collectors.groupingBy(PtRoomVo::getGuestRoomType, Collectors.counting()));

+ 39 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteAreaPermissionsServiceImpl.java

@@ -0,0 +1,39 @@
+package org.dromara.hotel.dubbo;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.hotel.api.service.RemoteAreaPermissionsService;
+import org.dromara.hotel.domain.KfAreaPermissions;
+import org.dromara.hotel.mapper.KfAreaPermissionsMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+@DubboService
+@RequiredArgsConstructor
+public class RemoteAreaPermissionsServiceImpl implements RemoteAreaPermissionsService {
+
+    private final KfAreaPermissionsMapper baseMapper;
+
+
+
+    /**
+     * 根据用户id获取区域楼栋权限
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public List<Long> getAreaPermissions(Long userId) {
+        if (userId != null) {
+            LambdaQueryWrapper<KfAreaPermissions> queryWrapper = new LambdaQueryWrapper<>();
+            return baseMapper.selectList(
+                queryWrapper.eq(KfAreaPermissions::getUserId, userId).select(KfAreaPermissions::getAreaId)
+            ).stream().map(KfAreaPermissions::getAreaId).toList();
+        }
+        return null;
+    }
+}