20251204,职级权限,开发实践分享

1、所遇问题&需求

一个职位的树结构,根节点为公司,下边分为部门,取某个子节点下,勾选的职位集合(勾选上级,意味着下级也有权限,需要返回)

比如:

知年公司

销售

运营

华北

华南

华东

江苏

南京

上海

检测

技术

车商基本信息

城市:职位树(包括下级)对应的城市列表

市场:职位树(包括下级)对应的城市,过滤出市场(有城市属性,t_car_market)列表

车商归属信息(培训师/运维职位城市)

大区:职位树(包括下级)的大区

小区:职位树(包括下级)的小区

城市:职位树(包括下级)对应的城市列表

培训师、运维:职位树(包括下级)关联的人员列表,按照角色过滤

2、如何实现

  • 获取该产品运营负责人下的全部节点ID,为集合A
  • 根据用户,获取用户关联的职位(可以一个或多个,也可以是其他其他部门的节点)。集合B
  • 找到B集合里边,全部子节点。记录为集合C
  • 集合A和集合C,相交。即在部门小有权限的职位树。集合D
  • 集合D中,指定层级为大区、小区
  • 集合D中,会关联城市,获取城市列表
  • 集合D中,会关联人员,按照角色进行过滤。获取到人员列表
  • 在城市列表的基础上,根据城市查询市场
java 复制代码
/**
 * @author QUAN XIN
 * 新的职级相关接口
 * @date 2025/12/3 13:36
 */
public interface OwnPositionV2Service {

    /**
     * 获取全部职级ID。(仅培训系统)
     * 即产品运营负责人节点下
     * @return
     */
    List<Long> getTrainer();

    /**
     * 获取全部职级列表。(仅培训系统)
     * 即产品运营负责人节点下,全部职位信息
     * @return
     */
    List<OwnPositionVO> getTrainerAllPositionIds();

    /**
     * 获取用户有权限的职级。(含全部子节点、仅培训系统)
     * @param ownUserId
     * @return
     */
    List<Long> getSubTreeByUser(Long ownUserId);

    /**
     * 获取城市id列表(仅培训系统)
     * @param ownUserId
     * @return
     */
    List<Long> getCityIds(Long ownUserId);

    /**
     * 获取城市列表。(仅培训系统)
     * @param ownUserId
     * @return
     */
    List<CommonSelectVO> getCityList(Long ownUserId);

    /**
     * 获取大区列表。(仅培训系统)
     * @param ownUserId
     * @return
     */
    List<OwnPositionVO> getAreaList(Long ownUserId);

    /**
     * 获取小区列表(仅培训系统)
     * @param ownUserId
     * @return
     */
    List<OwnPositionVO> getSmallAreaList(Long ownUserId);

    /**
     * 获取市场列表(仅培训系统)
     * @param ownUserId
     * @return
     */
    List<CommonSelectVO> getMarketList(Long ownUserId);

    /**
     * 获取用户列表(仅培训系统)
     * 职位树(包括下级)关联的人员列表,按照角色过滤
     * @param ownUserId
     * @param roleId
     * @return
     */
    List<CommonSelectVO> getOwnUserList(Long ownUserId, Integer roleId);

}

递归查询getRecursionIds,一次自循环,一个根据父节点获取全部子节点getSubTreeByParent。

而根据父节点获取子节点,一次是获取集合A;一次是获取集合C;这两处,都走了缓存来减少跟数据库的交互。如下

java 复制代码
@Override
    public List<Long> getTrainer() {
        String key = TRAINER_SYS_REDIS_KEY + TRAINER_CLASS_REDIS_KEY + "getTrainer";
        List<Long> subTree = RedisClient.get(key, () -> getTrainerAct(),
                RedisClient.hour(2));
        return subTree;
    }
java 复制代码
  @Override
    public List<Long> getSubTreeByUser(Long ownUserId) {
        String key = TRAINER_SYS_REDIS_KEY + TRAINER_CLASS_REDIS_KEY + "getSubTreeByUser." + ownUserId;
        List<Long> filterTrainer = RedisClient.get(key, () -> getSubTreeByUserAct(ownUserId),
                RedisClient.hour(2));
        return filterTrainer;
    }

3、效果如何

4、优化、建议、思考

形成文档,利人利己

递归取子节点,总不太好

是否可以通过设计上来优化,比如冗余一个字段,是path的路径。直接关联取

相关推荐
凯酱5 小时前
MyBatis 中 OGNL 的使用:从入门到实战
java·tomcat·mybatis
吴声子夜歌10 小时前
Java面试——算法
java·算法·面试
evans在进步11 小时前
LeetCode 64:最小路径和——Java 原地动态规划详解
java·leetcode·动态规划
凤山老林12 小时前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅12 小时前
Spring 核心原理
java·后端·spring
yurenpai(27届找实习中)12 小时前
从零读懂 AI 智能客服(一):模块职责与 SSE 聊天链路(后端架构)
java·人工智能·架构·langchain4j
陈皮波比茶13 小时前
Swagger
java
小闫BI设源码13 小时前
Elasticsearch面试必看:如何让客户端精准选择节点高效执行请求?
java·elasticsearch·面试宝典·深入解析
摇滚侠14 小时前
《SpringBoot 3:入门与应用实战》第 5 章 使用 Spring Boot 阅读笔记 9
java·spring boot·笔记
进阶的小名14 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt