应自定义迭代器类封装层级上下文,用显式栈维护节点、路径、深度、父ID等信息,支持可见性校验、环检测、字段归一化及快照/差量导出,确保组织树扁平化输出可追溯、可还原、可校验。

用迭代器实现组织架构树的扁平化无损输出,关键不是“遍历完就算”,而是让每层节点携带完整上下文(如路径、深度、父级ID、生效时间),确保导出结果可追溯、可还原、可校验。这在HR系统对接、权限同步、审计报表等企业级场景中是刚性需求。
迭代器需封装层级上下文,不止是取值
标准 Iterator<OrgNode> 只能逐个返回节点,但组织导出需要每条记录包含:全路径名(如["集团","华东区","上海研发部"])、当前深度、直属上级ID、生效时间戳。因此不能直接用 JDK 原生迭代器,而应自定义迭代器类,内部维护一个显式栈(Stack<Entry>),每个 Entry 封装:node + path(List<String>)+ depth + parentId。
- 入栈时:path = parentPath + [current.getName()],depth = parentDepth + 1,parentId = parent.getId()
- 出栈时:生成一条带全部上下文的导出记录,不丢失任何拓扑信息
- 避免递归调用,用栈控深度,防爆栈(尤其集团架构超12层时)
支持动态可见性与环检测,保障导出可信
真实组织树常含矩阵汇报、虚线管理、权限隔离。迭代器在访问每个节点前,必须执行两个校验:
-
可见性检查:调用
accessPolicy.canView(node, currentUser, exportScope),失败则跳过该分支,不入栈 -
环引用拦截:维护一个
Set<Long> currentPathIds,每次入栈前判断 node.id 是否已在其中;若存在,记录 warn 日志并终止该子树遍历(防止无限展开) - 所有节点统一 normalize 字段:将
managerId/reportingTo/supervisor归一为directManagerId,空值统一为null,避免下游解析异常
导出引擎需支持多格式锚点与增量快照
导出不是一次性动作,而是可重入、可比对的工程能力。迭代器产出的数据流应能无缝接入导出引擎:
- 每条记录附加
exportAnchor字段,如"org-export-20260527-1915",用于日志追踪与任务回溯 - 支持按
effectiveAt时间戳做快照过滤:只导出node.effectiveAt ≤ now且node.expiredAt > now的有效节点 - 提供两种模式:全量导出(清空历史 anchor 后重跑)与差量导出(对比上一次 anchor,仅输出变更节点 + 状态标记:ADDED/UPDATED/DELETED)
- 最终输出结构示例(JSON 行格式):
{"id":1024,"name":"测试组","path":["总部","研发中心","后端一部","测试组"],"depth":4,"parentId":1023,"effectiveAt":"2026-03-01T00:00:00Z","anchor":"org-export-20260527-1915"}

















