python:Divide and Conquer Algorithm 项目结构# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:45 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : constants.py # 业务常量统一管理便于运维修改 RISK_AMOUNT_THRESHOLD 100000.0 # 高客单风险阈值 10万 SHOP_LIST [福田店, 南山店] QUARTER_MONTH_MAP {1: [1, 2, 3], 2: [4, 5, 6], 3: [7, 8, 9], 4: [10, 11, 12]} CATEGORY_LIST [黄金, 钻石, 彩宝, 银饰] # 权限标识常量 PERM_DIAMOND_ADJUST 钻石调价 PERM_EXPORT_ALL_SHOP 全门店数据导出 PERM_SHOP_ADJUST 本店调价 PERM_MODIFY_ROLE 修改角色权限 PERM_VIEW_SELF_SALE 查看个人业绩 PERM_VIEW_STOCK 库存盘点 # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:46 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : utils.py from concurrent.futures import ThreadPoolExecutor, as_completed from typing import List, Callable, Any def parallel_batch_execute(task_list: List[Callable[[], Any]], max_workers: int 4) - List[Any]: 通用多线程并行执行工具用于门店/月度分治并发计算 :param task_list: :param max_workers: :return: results [] with ThreadPoolExecutor(max_workersmax_workers) as executor: future_map {executor.submit(task): task for task in task_list} for future in as_completed(future_map): res future.result() results.append(res) return results def format_float(val: float) - str: 金额格式化输出 :param val: :return: return f{val:.2f} # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:46 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : order.py from dataclasses import dataclass from typing import Dict from DivideConquer.constants import CATEGORY_LIST dataclass(frozenFalse) class JewelryOrder: 珠宝订单实体纯数据载体无业务逻辑 order_id: str shop_name: str sale_month: int quarter: int category: str sale_amount: float profit: float seller_id: str dataclass(frozenFalse) class SaleSummary: 销售统计汇总实体重载加法实现分治合并 total_sales: float 0.0 total_profit: float 0.0 gold: float 0.0 diamond: float 0.0 gem: float 0.0 silver: float 0.0 def __add__(self, other: SaleSummary) - SaleSummary: return SaleSummary( total_salesself.total_sales other.total_sales, total_profitself.total_profit other.total_profit, goldself.gold other.gold, diamondself.diamond other.diamond, gemself.gem other.gem, silverself.silver other.silver ) def to_dict(self) - Dict[str, float]: 转字典用于报表输出扩展 :return: return { 总销售额: self.total_sales, 总毛利: self.total_profit, 黄金: self.gold, 钻石: self.diamond, 彩宝: self.gem, 银饰: self.silver } def build_single_summary(order: JewelryOrder) - SaleSummary: 单订单转换为汇总实体最小子问题构造器 :param order: :return: s SaleSummary() s.total_sales order.sale_amount s.total_profit order.profit if order.category 黄金: s.gold order.sale_amount elif order.category 钻石: s.diamond order.sale_amount elif order.category 彩宝: s.gem order.sale_amount elif order.category 银饰: s.silver order.sale_amount return s # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:48 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : role.py from typing import List, Optional class JewelryRoleNode: 权限二叉树节点实体承载角色与权限集合 def __init__(self, role_name: str, permissions: List[str]): self.role_name role_name self.permissions: List[str] permissions self.left: Optional[JewelryRoleNode] None self.right: Optional[JewelryRoleNode] None # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:49 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : order_repo.py from typing import List, Dict from DivideConquer.entity.order import JewelryOrder from DivideConquer.constants import SHOP_LIST, QUARTER_MONTH_MAP class OrderRepository: 订单仓储统一管理订单数据增查隔离上层与原始列表 def __init__(self): self._order_data: List[JewelryOrder] [] def add(self, order: JewelryOrder) - None: :param order: :return: self._order_data.append(order) def batch_add(self, orders: List[JewelryOrder]) - None: :param orders: :return: self._order_data.extend(orders) def get_all(self) - List[JewelryOrder]: :return: return self._order_data.copy() def split_by_shop(self) - Dict[str, List[JewelryOrder]]: Divide按门店拆分订单数据集 :return: split_map {shop: [] for shop in SHOP_LIST} for o in self._order_data: if o.shop_name in split_map: split_map[o.shop_name].append(o) return split_map def split_by_month(self) - Dict[int, List[JewelryOrder]]: Divide按月份拆分订单数据集 :return: split_map {m: [] for m in range(1, 13)} for o in self._order_data: split_map[o.sale_month].append(o) return split_map # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:50 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : role_repo.py from typing import Optional from DivideConquer.entity.role import JewelryRoleNode class RoleRepository: 权限树仓储构造、存储全局权限树根节点 def __init__(self): self._root: Optional[JewelryRoleNode] None def set_root(self, root_node: JewelryRoleNode) - None: :param root_node: :return: self._root root_node def get_root(self) - Optional[JewelryRoleNode]: :return: return self._root # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:51 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : base_dac.py from abc import ABC, abstractmethod from typing import TypeVar, Generic, List # 泛型适配不同分治输入输出 T_INPUT TypeVar(T_INPUT) T_OUTPUT TypeVar(T_OUTPUT) class BaseDAC(ABC, Generic[T_INPUT, T_OUTPUT]): 分治算法标准抽象基类统一 divide-conquer-combine 流程 abstractmethod def conquer(self, data: T_INPUT) - T_OUTPUT: 最小子问题求解 :param data: :return: pass abstractmethod def divide(self, data: List[T_INPUT]) - tuple[List[T_INPUT], List[T_INPUT]]: 二分拆分数据集 :param data: :return: pass abstractmethod def combine(self, left_res: T_OUTPUT, right_res: T_OUTPUT) - T_OUTPUT: 合并左右子问题结果 :param left_res: :param right_res: :return: pass def dac_recursive(self, data: List[T_INPUT], l: int, r: int) - T_OUTPUT: 标准递归分治入口 :param data: :param l: :param r: :return: if l r: return self.conquer(data[l]) mid (l r) // 2 left_result self.dac_recursive(data, l, mid) right_result self.dac_recursive(data, mid 1, r) return self.combine(left_result, right_result) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:52 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : stat_dac.py from typing import List from DivideConquer.dac.base_dac import BaseDAC from DivideConquer.entity.order import JewelryOrder, SaleSummary, build_single_summary class SaleStatDAC(BaseDAC[JewelryOrder, SaleSummary]): 销售业绩统计专用分治实现 def conquer(self, data: JewelryOrder) - SaleSummary: :param data: :return: return build_single_summary(data) def divide(self, data: List[JewelryOrder]) - tuple[List[JewelryOrder], List[JewelryOrder]]: :param data: :return: mid len(data) // 2 return data[:mid], data[mid:] def combine(self, left_res: SaleSummary, right_res: SaleSummary) - SaleSummary: :param left_res: :param right_res: :return: return left_res right_res def calc_total(self, data_list: List[JewelryOrder]) - SaleSummary: :param data_list: :return: if not data_list: return SaleSummary() return self.dac_recursive(data_list, 0, len(data_list)-1) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:54 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : risk_dac.py from typing import List from DivideConquer.dac.base_dac import BaseDAC from DivideConquer.entity.order import JewelryOrder class RiskOrderDAC(BaseDAC[JewelryOrder, List[JewelryOrder]]): 风控高客单检索分治 异常高客单订单检索分治 def __init__(self, risk_threshold: float): self.threshold risk_threshold def conquer(self, data: JewelryOrder) - List[JewelryOrder]: if data.sale_amount self.threshold: return [data] return [] def divide(self, data: List[JewelryOrder]) - tuple[List[JewelryOrder], List[JewelryOrder]]: mid len(data) // 2 return data[:mid], data[mid:] def combine(self, left_res: List[JewelryOrder], right_res: List[JewelryOrder]) - List[JewelryOrder]: return left_res right_res def scan_risk_orders(self, data_list: List[JewelryOrder]) - List[JewelryOrder]: if not data_list: return [] return self.dac_recursive(data_list, 0, len(data_list)-1) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:55 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : perm_dac.py from typing import Optional from typing import List from DivideConquer.entity.role import JewelryRoleNode from DivideConquer.entity.order import JewelryOrder class PermissionDAC: 树形权限二分递归分治校验无通用列表独立实现 权限树分治校验 def check_perm(self, root: Optional[JewelryRoleNode], target_perm: str) - bool: :param root: :param target_perm: :return: if root is None: return False if target_perm in root.permissions: return True # Divide 拆分左右子树 left_ok self.check_perm(root.left, target_perm) right_ok self.check_perm(root.right, target_perm) # Combine任一子树匹配即有权限 return left_ok or right_ok def filter_order_by_perm(self, orders: List[JewelryOrder], role_perms: List[str], seller_id: str) - List[JewelryOrder]: 分治过滤当前角色可见订单数据权限隔离 :param orders: :param role_perms: :param seller_id: :return: def dac_filter(l: int, r: int) - List[JewelryOrder]: if l r: order orders[l] # 导购仅查看本人订单店长/区域/集团查看全部 if 查看个人业绩 in role_perms and order.seller_id ! seller_id: return [] return [order] mid (l r) // 2 left dac_filter(l, mid) right dac_filter(mid1, r) return left right if not orders: return [] return dac_filter(0, len(orders)-1) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:57 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : perm_service.py from DivideConquer.repository.role_repo import RoleRepository from DivideConquer.dac.perm_dac import PermissionDAC from DivideConquer.entity.order import JewelryOrder from typing import List class PermissionService: 纯行业业务逻辑依赖 dac / 仓储 def __init__(self, role_repo: RoleRepository): self._repo role_repo self._dac PermissionDAC() def has_permission(self, perm_key: str) - bool: :param perm_key: :return: root self._repo.get_root() return self._dac.check_perm(root, perm_key) def get_visible_orders(self, all_orders: List[JewelryOrder], login_seller_id: str) - List[JewelryOrder]: 根据登录角色权限分治过滤可查看订单 :param all_orders: :param login_seller_id: :return: root self._repo.get_root() if not root: return [] return self._dac.filter_order_by_perm(all_orders, root.permissions, login_seller_id) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:58 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : sale_stat_service.py from DivideConquer.repository.order_repo import OrderRepository from DivideConquer.dac.stat_dac import SaleStatDAC from DivideConquer.utils import parallel_batch_execute from DivideConquer.constants import QUARTER_MONTH_MAP from typing import Dict, Tuple from DivideConquer.entity.order import SaleSummary class SaleStatService: def __init__(self, order_repo: OrderRepository): self._repo order_repo self._dac SaleStatDAC() def stat_by_shop_parallel(self) - Dict[str, SaleSummary]: 门店分治统计多线程并行计算各门店业绩 :return: shop_split self._repo.split_by_shop() task_list [] shop_name_list [] for shop, ords in shop_split.items(): shop_name_list.append(shop) task_list.append(lambda oords: self._dac.calc_total(o)) # 并行执行分治计算 stat_results parallel_batch_execute(task_list) shop_result dict(zip(shop_name_list, stat_results)) # 合并集团总业绩 total SaleSummary() for s in stat_results: total s shop_result[集团全部门店合计] total return shop_result def stat_by_time(self) - Dict[str, object]: 按月分治合并季度、年度报表 :return: month_split self._repo.split_by_month() month_summary: Dict[int, SaleSummary] {} # 月度分治统计 for m, ords in month_split.items(): month_summary[m] self._dac.calc_total(ords) # 合并季度 quarter_summary: Dict[int, SaleSummary] {1:SaleSummary(),2:SaleSummary(),3:SaleSummary(),4:SaleSummary()} year_total SaleSummary() for q, month_list in QUARTER_MONTH_MAP.items(): for m in month_list: quarter_summary[q] month_summary[m] for m_sum in month_summary.values(): year_total m_sum # 封装返回 month_dict {f{m}月: month_summary[m] for m in range(1,13)} return { 月度明细: month_dict, 季度汇总: quarter_summary, 年度总报表: year_total } # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 22:59 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : risk_service.py from DivideConquer.repository.order_repo import OrderRepository from DivideConquer.dac.risk_dac import RiskOrderDAC from DivideConquer.entity.order import JewelryOrder from typing import List class RiskScreenService: def __init__(self, order_repo: OrderRepository, risk_threshold: float): self._repo order_repo self._dac RiskOrderDAC(risk_threshold) def scan_high_amount_orders(self) - List[JewelryOrder]: :return: all_ords self._repo.get_all() return self._dac.scan_risk_orders(all_ords) def modify_threshold(self, new_val: float) - None: :param new_val: :return: self._dac.threshold new_val调用# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Divide and Conquer 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/18 23:00 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : DivideConquerBll.py from DivideConquer.repository.order_repo import OrderRepository from DivideConquer.repository.role_repo import RoleRepository from DivideConquer.service.perm_service import PermissionService from DivideConquer.service.sale_stat_service import SaleStatService from DivideConquer.service.risk_service import RiskScreenService from DivideConquer.constants import RISK_AMOUNT_THRESHOLD from DivideConquer.entity.order import JewelryOrder from DivideConquer.entity.role import JewelryRoleNode from typing import List, Dict from DivideConquer.constants import * from DivideConquer.utils import format_float class DivideConquerBll(object): def __init__(self): # 初始化仓储 self._order_repo OrderRepository() self._role_repo RoleRepository() # 初始化业务服务依赖注入 self.perm_service PermissionService(self._role_repo) self.sale_stat_service SaleStatService(self._order_repo) self.risk_service RiskScreenService(self._order_repo, RISK_AMOUNT_THRESHOLD) # 订单仓储代理方法 def add_order(self, order: JewelryOrder) - None: :param order: :return: self._order_repo.add(order) def batch_add_orders(self, orders: List[JewelryOrder]) - None: :param orders: :return: self._order_repo.batch_add(orders) # 权限树初始化 def build_permission_tree(self, root_node: JewelryRoleNode) - None: :param root_node: :return: self._role_repo.set_root(root_node) # 对外业务接口 def check_permission(self, perm_key: str) - bool: :param perm_key: :return: return self.perm_service.has_permission(perm_key) def get_user_visible_orders(self, seller_id: str) - List[JewelryOrder]: :param seller_id: :return: all_ords self._order_repo.get_all() return self.perm_service.get_visible_orders(all_ords, seller_id) def query_shop_sales_stat(self) - Dict[str, object]: :return: return self.sale_stat_service.stat_by_shop_parallel() def query_time_sales_stat(self) - Dict[str, object]: :return: return self.sale_stat_service.stat_by_time() def query_risk_orders(self) - List[JewelryOrder]: :return: return self.risk_service.scan_high_amount_orders() def Demo(self): :return: # 2. 模拟构造测试订单 mock_orders [ JewelryOrder(O001, 福田店, 2, 1, 黄金, 6280, 1300, S001), JewelryOrder(O002, 福田店, 3, 1, 钻石, 128600, 48000, S001), JewelryOrder(O003, 南山店, 5, 2, 彩宝, 8900, 3600, S002), JewelryOrder(O004, 南山店, 6, 2, 钻石, 96000, 39000, S002), JewelryOrder(O005, 福田店, 9, 3, 银饰, 499, 220, S003), JewelryOrder(O006, 南山店, 11, 4, 钻石, 156000, 62000, S004), JewelryOrder(O007, 福田店, 12, 4, 黄金, 8600, 1800, S003), ] self.batch_add_orders(mock_orders) # 3. 构建多层权限树 guide JewelryRoleNode(门店导购, [PERM_VIEW_SELF_SALE]) keeper JewelryRoleNode(仓管, [PERM_VIEW_STOCK]) shop_mgr JewelryRoleNode(门店店长, [PERM_SHOP_ADJUST]) shop_mgr.left guide shop_mgr.right keeper area_mgr JewelryRoleNode(华南区域经理, [PERM_DIAMOND_ADJUST]) area_mgr.left shop_mgr group_admin JewelryRoleNode(集团管理员, [PERM_EXPORT_ALL_SHOP, PERM_MODIFY_ROLE]) group_admin.left area_mgr self.build_permission_tree(group_admin) # 业务1并行分治门店业绩统计 print( 【并行分治-门店业绩汇总】 ) shop_stat self.query_shop_sales_stat() for shop, summary in shop_stat.items(): print(f\n【{shop}】) data summary.to_dict() for k, v in data.items(): print(f{k}: {format_float(v)}) # 业务2时间维度分治月/季/年 print(\n 【时间分治-年度经营报表】 ) time_stat self.query_time_sales_stat() year_sum time_stat[年度总报表] print(f全年总销售额{format_float(year_sum.total_sales)}全年毛利{format_float(year_sum.total_profit)}) print(\n季度汇总) for q, s in time_stat[季度汇总].items(): print(fQ{q} 销售总额{format_float(s.total_sales)}) # 业务3风控分治高客单订单检索 print(\n 【风控分治-超10万异常订单】 ) risk_list self.query_risk_orders() if risk_list: for item in risk_list: print(f订单{item.order_id} | {item.shop_name} | {item.category} | {format_float(item.sale_amount)}元) else: print(无风险订单) # 业务4树形分治权限校验 print(\n 【树形分治权限校验】 ) print(f区域经理是否可钻石调价{self.check_permission(PERM_DIAMOND_ADJUST)}) print(f店长是否可导出全门店数据{self.check_permission(PERM_EXPORT_ALL_SHOP)}) print(f集团是否可修改角色权限{self.check_permission(PERM_MODIFY_ROLE)}) # 业务5分治数据权限过滤导购仅看自己订单 print(\n 【分治数据权限过滤-导购S001可见订单】 ) user_ords self.get_user_visible_orders(S001) for o in user_ords: print(f{o.order_id} | 开单人:{o.seller_id} | {o.sale_amount})输出