package com.persagy.server.util import com.persagy.dmp.basic.utils.JsonNodeUtils import cn.hutool.core.collection.CollUtil import cn.hutool.core.util.ArrayUtil import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.node.ArrayNode import com.fasterxml.jackson.databind.node.ObjectNode /** * ADM通用查询条件 * @author Charlie Yu * @date 2021-08-16 */ object AdmEntityTransferUtil { /** * 转换为数据中台对象 * @param objList * @return */ fun toDmpMultiEntity(objList: List<*>?): ArrayNode { return JsonNodeUtils.toArrayNode(objList, "infos", null) } /** * 转换为数据中台对象 * @param obj * @return */ fun toDmpSingleEntity(obj: Any?): JsonNode { return JsonNodeUtils.toObjectNode(obj, "infos", null) } /** * 转换为数据中心对象 * @param array 数据中台对象 * @param clazz 数据中心对象class * @param * @return */ fun toAdmMultiEntity(array: List<*>?, projection: List?, clazz: Class?): List? { if(CollUtil.isEmpty(array)){ return null; } val dataNode = JsonNodeUtils.toArrayNode(array, null, null) return toAdmMultiEntity(dataNode, projection, clazz) } /** * 转换为数据中心对象 * @param clazz * @param * @return * @param array */ fun toAdmMultiEntity(array: ArrayNode, projection: List?, clazz: Class?): List? { if (ArrayUtil.isEmpty(array)) { return null } // 转换属性名 var i = 0 val j = array.size() while (i < j) { val node = array[i] if (node != null && node.isObject) { resetAdmProperty(node as ObjectNode, projection) } i++ } return JsonNodeUtils.toEntity(array, clazz, "infos") } /** * 转换为数据中心对象 * @param node * @param clazz * @param * @return */ fun toAdmSingleEntity(node: ObjectNode, projection: List?, clazz: Class?): T { resetAdmProperty(node, projection) return JsonNodeUtils.toEntity(node, clazz, "infos") } /** * 处理dmp转adm对象的属性名 * @param node */ private fun resetAdmProperty(node: ObjectNode, projection: List?) { // 转换属性名 TODO 目前只有创建时间和修改时间需要转换,后续有其他时通过建立映射在此转换即可 copyProperty(node, "creationTime", "createTime") copyProperty(node, "modifiedTime", "lastUpdate") copyProperty(node, "objType", "objectType") removeProperty(node, projection) } /** * 拷贝属性 * @param dmpData 数据中台对象 * @param srcProp 数据中台属性名 * @param desProp 对应的数据中心属性名 */ private fun copyProperty(dmpData: ObjectNode?, srcProp: String, desProp: String) { if (dmpData == null) { return } val value = dmpData[srcProp] if (value == null || value.isNull) { return } dmpData.set(desProp, value) dmpData.remove(srcProp) } /** * 删除掉数据中心不需要的属性 * @param dmpData */ private fun removeProperty(dmpData: ObjectNode, projection: List?) { if (CollUtil.isNotEmpty(projection)) { // 转换为Set,提供遍历效率 val fieldSet: Set = CollUtil.newHashSet(projection) val fields = dmpData.fieldNames() while (fields.hasNext()) { val field = fields.next() // 返回结果中包含的不处理 if (fieldSet.contains(field)) { continue } // 去掉不包含的属性 fields.remove() } } else { // 返回全部时,去掉不需要属性 val removeList: List = CollUtil.newArrayList("creator", "valid", "createApp", "virtualCodes", "updateApp", "grouping", "modifier") for (removeField in removeList) { dmpData.remove(removeField) } } } }