机构同步--级联关系处理

Kotlin(语法跟java类似)中处理组织层级关系的递归方法

在组织结构中,我们经常需要处理层级关系,例如公司内部的部门结构、学校中的班级结构等。这些结构通常具有树形特点,其中每个节点可能包含多个子节点。在Kotlin中,我们可以通过编写递归函数来处理这种层级关系,并根据需要更新节点的属性。

下面是一个示例代码,展示了如何使用Kotlin编写一个递归函数来处理组织结构的层级关系。

首先,我们有一个从数据库查询得到的原始记录列表。每条记录都是一个包含组织信息的MutableMap<String, Any>对象。这些记录可能包含组织的代码、父组织代码、层级等字段。

表结构

kotlin代码

syncSql =  select org_code as org_code ,org_name as org_name ,parent_code as parent_code from p_org

var records = commonDAO.selectEntityBySql(syncSql, null)

 

接下来,我们根据业务需求对记录进行处理。在这个例子中,我们需要构建每个组织的级联代码、更新层级,并确定是否有子组织。为此,我们编写了一个名为preDealRecords的递归函数。

private fun preDealRecords(obj: MutableMap<String, Any>, list: MutableList<MutableMap<String,Any>>, result: MutableList<MutableMap<String,Any>>) {  
    // 提取关键信息  
    val superOrgCode = obj["PARENT_CODE"] ?: obj["parent_code"]  
    val tempCode: String = obj["TEMP_CODE"].toString()  
    val cascade = obj["ORG_CASCADE"].toString()  
    val level = obj["ORG_LEVEL"].toString().toInt()  
  
    // 处理根组织  
    if (null == superOrgCode) {  
        result.add(obj)  
        return  
    }  
  
    // 遍历所有记录查找父组织  
    for (org in list) {  
        val dataOrgCode = org["ORG_CODE"] ?: org["org_code"]  
        val dataParentCode = org["PARENT_CODE"] ?: org["parent_code"]  
  
        if (tempCode.equals(dataOrgCode)) {  
            // 更新当前组织的级联代码和层级  
            obj.put("ORG_CASCADE", "$dataOrgCode,$cascade")  
            obj.put("ORG_LEVEL", level + 1)  
  
            // 递归处理父组织  
            if (null == dataParentCode) {  
                result.add(obj)  
                return  
            } else {  
                obj.put("TEMP_CODE", dataParentCode.toString())  
                preDealRecords(obj, list, result)  
            }  
        }  
    }  
}


preDealRecords函数中,我们首先提取当前记录的关键信息,然后判断它是否是根组织。如果是根组织,我们将其添加到结果列表中,并结束递归。否则,我们遍历整个记录列表,查找当前记录的父组织。当我们找到父组织时,我们更新当前记录的级联代码和层级,并递归地处理父组织。这个过程会一直进行,直到我们找到根组织或者遍历完所有记录。

最后,我们将处理后的记录列表赋值给原始的records变量,以便后续使用。

private fun hasChildRen(orgCode: String, list: MutableList<MutableMap<String,Any>>): Boolean {
        for (obj in list) {
            val parentCode = obj["PARENT_CODE"] ?:obj["parent_code"]
            if (null != parentCode) {
                if (orgCode == parentCode.toString()) {
                    return true
                }
            }

        }
        return false
    }
if (CarrierEnums.SyncSingleType.ORG == type) {  
    var result: MutableList<MutableMap<String, Any>> = mutableListOf()  
    val initLevel = 1  
    for (record in records) {  
        // 初始化或更新记录的字段  
        record.put("ORG_CASCADE", record["ORG_CODE"] ?: record["org_code"])  
        record.put("ORG_LEVEL", initLevel)  
        record.put("HAS_CHILDREN", hasChildRen(record["ORG_CODE"] as String, records))  
        record.put("TEMP_CODE", if (null == record["PARENT_CODE"]) "ROOT" else record["PARENT_CODE"].toString())  
  
        // 处理记录并更新结果列表  
        preDealRecords(record, records, result)  
    }  
    records = result  
}


通过这种方式,我们可以构建出完整的组织层级关系,并轻松地获取每个组织的级联代码、层级以及是否有子组织等信息。这对于构建复杂的组织结构图、实现权限控制等功能非常有用。

在实际应用中,我们还可以根据具体需求对代码进行扩展和优化,例如添加错误处理机制、使用更高效的数据结构等。通过灵活运用Kotlin的语言特性,我们可以编写出高效且易于维护的代码来处理复杂的层级关系。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值