# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:04 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : Recursion.py from typing import List, Dict, Set, Optional # 常量定义珠宝行业细分权限 PERMISSION_LIST { # 通用门店权限 sale_view: 销售单据查看, sale_create: 开单销售, stock_view: 库存查询, stock_inout: 金银玉石出入库, member_manage: 会员档案管理, # 分公司/总部财务权限 finance_stat: 财务报表统计, cost_allocate: 分公司成本分摊, gold_price_adjust: 金价基准调整, # 海外子公司专属权限 customs_declare: 海外报关申报, foreign_exchange: 外币结算对账, overseas_tax: 境外税务核算, # 集团总部顶层权限 org_edit: 新增/删除分公司/海外子公司, role_global: 全局角色配置, all_data_export: 全集团数据导出 } # 组织树实体递归树形结构 class OrgNode: def __init__( self, org_id: str, org_name: str, org_type: str, # 总部/国内事业部/分公司/海外子公司/分店 parent_id: Optional[str] None ): self.org_id org_id self.org_name org_name self.org_type org_type self.parent_id parent_id self.children: List[OrgNode] [] # 子组织递归核心 self.org_permissions: Set[str] set() # 本组织独立权限 def add_child(self, child_node: OrgNode) - None: self.children.append(child_node) def add_permission(self, perm_key: str) - None: if perm_key in PERMISSION_LIST: self.org_permissions.add(perm_key) def get_all_self_perm_desc(self) - List[str]: return [PERMISSION_LIST[p] for p in self.org_permissions] # 用户角色实体 class StaffUser: def __init__(self, user_id: str, username: str, bind_org_id: str): self.user_id user_id self.username username self.bind_org_id bind_org_id # 用户归属组织ID self.role_perms: Set[str] set() # 用户角色分配权限 def assign_role_perm(self, perm_key: str): if perm_key in PERMISSION_LIST: self.role_perms.add(perm_key) # 递归核心算法工具类 class JewelryOrgRecursionUtil: staticmethod def find_org_by_id(root: OrgNode, target_org_id: str) - Optional[OrgNode]: 递归查找指定ID的组织节点 if root.org_id target_org_id: return root # 递归遍历所有子节点 for child in root.children: res JewelryOrgRecursionUtil.find_org_by_id(child, target_org_id) if res: return res return None staticmethod def get_all_sub_orgs(root: OrgNode, target_org_id: str) - List[OrgNode]: 递归获取目标组织下所有下属分公司、分店含自身 target_node JewelryOrgRecursionUtil.find_org_by_id(root, target_org_id) if not target_node: return [] result [] def dfs(node: OrgNode): result.append(node) for child in node.children: dfs(child) dfs(target_node) return result staticmethod def get_ancestor_orgs(root: OrgNode, target_org_id: str, parent_map: Dict[str, OrgNode]) - List[OrgNode]: 递归向上查找所有上级组织总部、事业部、分公司 target_node JewelryOrgRecursionUtil.find_org_by_id(root, target_org_id) if not target_node or target_node.parent_id is None: return [] ancestors [] def upward_recursion(node: OrgNode): pid node.parent_id if pid is None: return p_node parent_map.get(pid) if p_node: ancestors.append(p_node) upward_recursion(p_node) upward_recursion(target_node) return ancestors staticmethod def recursive_collect_all_permissions(root: OrgNode, target_org_id: str, user: StaffUser) - Set[str]: 递归合并权限 1. 用户自身角色权限 2. 归属组织自身权限 3. 所有下属组织权限上级可查看下级数据 all_perms set(user.role_perms) sub_orgs JewelryOrgRecursionUtil.get_all_sub_orgs(root, target_org_id) # 递归汇总下属所有组织权限 for org in sub_orgs: all_perms.update(org.org_permissions) return all_perms staticmethod def recursive_print_tree(node: OrgNode, level: int 0): 递归打印珠宝集团完整组织树可视化 indent * level print(f{indent}[{node.org_type}] {node.org_name} | ID:{node.org_id}) for child in node.children: JewelryOrgRecursionUtil.recursive_print_tree(child, level 1) staticmethod def recursive_revoke_perm(node: OrgNode, perm_key: str): 递归回收某条权限当前节点所有下级子组织全部移除 if perm_key in node.org_permissions: node.org_permissions.remove(perm_key) for child in node.children: JewelryOrgRecursionUtil.recursive_revoke_perm(child, perm_key) # 初始化珠宝集团树形数据 def init_jewelry_group_tree() - tuple[OrgNode, Dict[str, OrgNode]]: # 1. 创建根节点珠宝集团总部 root OrgNode( org_idG001, org_name星光珠宝集团总部, org_type集团总部 ) # 总部顶层权限 root.add_permission(org_edit) root.add_permission(role_global) root.add_permission(all_data_export) root.add_permission(gold_price_adjust) # 2. 国内事业部 domestic_biz OrgNode(D001, 国内事业部, 事业部, parent_idG001) domestic_biz.add_permission(finance_stat) domestic_biz.add_permission(cost_allocate) root.add_child(domestic_biz) # 华南分公司 huanan_branch OrgNode(D001-1, 华南分公司, 国内分公司, parent_idD001) huanan_branch.add_permission(stock_inout) huanan_branch.add_permission(member_manage) domestic_biz.add_child(huanan_branch) # 华南下属分店 sz_shop OrgNode(SH-SZ01, 深圳旗舰店, 线下分店, parent_idD001-1) sz_shop.add_permission(sale_view) sz_shop.add_permission(sale_create) huanan_branch.add_child(sz_shop) gz_shop OrgNode(SH-GZ01, 广州分店, 线下分店, parent_idD001-1) gz_shop.add_permission(sale_view) gz_shop.add_permission(stock_view) huanan_branch.add_child(gz_shop) # 华东分公司 huadong_branch OrgNode(D001-2, 华东分公司, 国内分公司, parent_idD001) sh_shop OrgNode(SH-SH01, 上海总店, 线下分店, parent_idD001-2) sh_shop.add_permission(sale_create) huadong_branch.add_child(sh_shop) domestic_biz.add_child(huadong_branch) # 3. 海外事业部 oversea_biz OrgNode(O001, 海外事业部, 事业部, parent_idG001) oversea_biz.add_permission(foreign_exchange) root.add_child(oversea_biz) # 新加坡海外子公司 sg_company OrgNode(O001-1, 新加坡星光珠宝子公司, 海外子公司, parent_idO001) sg_company.add_permission(customs_declare) sg_shop OrgNode(SH-SG01, 新加坡乌节路分店, 海外分店, parent_idO001-1) sg_shop.add_permission(sale_view) sg_company.add_child(sg_shop) oversea_biz.add_child(sg_company) # 美国海外子公司 us_company OrgNode(O001-2, 洛杉矶珠宝子公司, 海外子公司, parent_idO001) us_company.add_permission(overseas_tax) us_shop OrgNode(SH-US01, 洛杉矶门店, 海外分店, parent_idO001-2) us_shop.add_permission(sale_view) us_company.add_child(us_shop) oversea_biz.add_child(us_company) # 构建组织ID映射表快速查询父节点 node_map {} def collect_node(node: OrgNode): node_map[node.org_id] node for child in node.children: collect_node(child) collect_node(root) return root, node_map # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Recursion Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/7/16 22:05 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : RecursionBll.py import Recursion.Recursion from Recursion.Recursion import * class RecursionBll(object): def demo(self): :return: pass # 1. 初始化集团组织树 group_root, org_map init_jewelry_group_tree() util JewelryOrgRecursionUtil() print( 1. 递归打印完整珠宝集团组织架构 ) util.recursive_print_tree(group_root) # 2. 创建测试用户深圳旗舰店店长归属深圳分店SH-SZ01 shop_manager StaffUser( user_idU1001, username深圳门店店长-李金饰, bind_org_idSH-SZ01 ) # 分配门店角色权限 shop_manager.assign_role_perm(sale_view) shop_manager.assign_role_perm(stock_view) print(\n 2. 递归查询深圳店长完整可用权限含下属本店无下级 ) total_perms util.recursive_collect_all_permissions(group_root, SH-SZ01, shop_manager) for p in sorted(total_perms): print(f- {PERMISSION_LIST[p]}) # 3. 创建华南分公司管理员 south_admin StaffUser(U2001, 华南分公司运营总监, bind_org_idD001-1) south_admin.assign_role_perm(finance_stat) print(\n 3. 华南分公司管理员递归汇总所有下属组织权限 ) south_all_perm util.recursive_collect_all_permissions(group_root, D001-1, south_admin) for p in sorted(south_all_perm): print(f- {PERMISSION_LIST[p]}) # 4. 递归回收权限全华南区域下架开单权限sale_create util.recursive_revoke_perm(util.find_org_by_id(group_root, D001-1), sale_create) print(\n 4. 递归回收sale_create权限后华南区域权限重新查询 ) south_new_perm util.recursive_collect_all_permissions(group_root, D001-1, south_admin) for p in sorted(south_new_perm): print(f- {PERMISSION_LIST[p]}) # 5. 递归获取新加坡海外子公司所有下属门店 print(\n 5. 递归遍历新加坡海外子公司全部下属组织 ) sg_sub_orgs util.get_all_sub_orgs(group_root, O001-1) for org in sg_sub_orgs: print(f- {org.org_type}{org.org_name}) # 6. 递归向上查询新加坡分店所有上级组织 print(\n 6. 递归向上查询新加坡分店上级链路 ) sg_shop_ancestors util.get_ancestor_orgs(group_root, SH-SG01, org_map) for org in sg_shop_ancestors: print(f- 上级[{org.org_type}]{org.org_name})输出