AdmEntityTransferUtil.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.persagy.proxy.adm.utils;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ArrayUtil;
  4. import com.fasterxml.jackson.databind.JsonNode;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.fasterxml.jackson.databind.node.ArrayNode;
  7. import com.fasterxml.jackson.databind.node.ObjectNode;
  8. import com.persagy.dmp.basic.utils.JsonNodeUtils;
  9. import com.persagy.dmp.common.exception.BusinessException;
  10. import com.persagy.dmp.common.helper.SpringHelper;
  11. import java.io.IOException;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.Set;
  15. /**
  16. * ADM通用查询条件
  17. * @author Charlie Yu
  18. * @date 2021-08-16
  19. */
  20. public class AdmEntityTransferUtil {
  21. /**
  22. * 转换为数据中台对象
  23. * @param objList
  24. * @return
  25. */
  26. public static ArrayNode toDmpMultiEntity(List objList) {
  27. ArrayNode arrayNode = JsonNodeUtils.toArrayNode(objList, "infos", null);
  28. if(arrayNode == null) {
  29. return arrayNode;
  30. }
  31. // outline特殊处理
  32. for(int i = 0;i < arrayNode.size();i++) {
  33. ObjectNode jsonNode = (ObjectNode) arrayNode.get(i);
  34. JsonNode outLine = jsonNode.get("outline");
  35. if(outLine != null && !outLine.isTextual()) {
  36. jsonNode.remove("outline");
  37. jsonNode.put("outline", outLine.toString());
  38. }
  39. }
  40. return arrayNode;
  41. }
  42. /**
  43. * 转换为数据中台对象
  44. * @param obj
  45. * @return
  46. */
  47. public static JsonNode toDmpSingleEntity(Object obj) {
  48. return JsonNodeUtils.toObjectNode(obj, "infos", null);
  49. }
  50. /**
  51. * 转换为数据中心对象
  52. * @param array 数据中台对象
  53. * @param clazz 数据中心对象class
  54. * @param <T>
  55. * @return
  56. */
  57. public static <T> List<T> toAdmMultiEntity(List array, List<String> projection, Class<T> clazz) {
  58. ArrayNode dataNode = JsonNodeUtils.toArrayNode(array, "infos", null);
  59. return toAdmMultiEntity(dataNode, projection, clazz);
  60. }
  61. public static <T> List<T> toAdmMultiEntityExtra(List array, List<String> projection, Class<T> clazz) {
  62. ArrayNode dataNode = JsonNodeUtils.toArrayNode(array, null, null);
  63. return toAdmMultiEntityExtra(dataNode, projection, clazz);
  64. }
  65. /**
  66. * 转换为数据中心对象
  67. * @param array
  68. * @param clazz
  69. * @param <T>
  70. * @return
  71. */
  72. public static <T> List<T> toAdmMultiEntity(ArrayNode array, List<String> projection, Class<T> clazz) {
  73. if(ArrayUtil.isEmpty(array)) {
  74. return null;
  75. }
  76. // 转换属性名
  77. for(int i = 0, j = array.size();i < j;i++) {
  78. JsonNode node = array.get(i);
  79. if(node != null && node.isObject()) {
  80. resetAdmProperty((ObjectNode) node, projection);
  81. }
  82. }
  83. return JsonNodeUtils.toEntity(array, clazz, "infos");
  84. /*try {
  85. return JSONEntityUtil.toEntity(array, clazz, "infos");
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89. return null;*/
  90. }
  91. public static <T> List<T> toAdmMultiEntityExtra(ArrayNode array, List<String> projection, Class<T> clazz) {
  92. if(ArrayUtil.isEmpty(array)) {
  93. return null;
  94. }
  95. // 转换属性名
  96. for(int i = 0, j = array.size();i < j;i++) {
  97. JsonNode node = array.get(i);
  98. if(node != null && node.isObject()) {
  99. resetAdmProperty((ObjectNode) node, projection);
  100. }
  101. }
  102. try {
  103. return JSONEntityUtil.toEntity(array, clazz, "infos");
  104. } catch (IOException e) {
  105. e.printStackTrace();
  106. }
  107. return null;
  108. }
  109. /**
  110. * 转换为数据中心对象
  111. * @param node
  112. * @param clazz
  113. * @param <T>
  114. * @return
  115. */
  116. public static <T> T toAdmSingleEntity(ObjectNode node, List<String> projection, Class<T> clazz) {
  117. resetAdmProperty(node, projection);
  118. return JsonNodeUtils.toEntity(node, clazz, "infos");
  119. }
  120. /**
  121. * 处理dmp转adm对象的属性名
  122. * @param node
  123. */
  124. private static void resetAdmProperty(ObjectNode node, List<String> projection) {
  125. // 转换属性名 TODO 目前只有创建时间和修改时间需要转换,后续有其他时通过建立映射在此转换即可
  126. copyProperty(node, "creationTime", "createTime");
  127. copyProperty(node, "modifiedTime", "lastUpdate");
  128. copyProperty(node, "objType", "objectType");
  129. // outline特殊处理
  130. JsonNode outLine = node.get("outline");
  131. if(outLine != null && outLine.isTextual()) {
  132. node.remove("outline");
  133. ArrayNode arrayNode = toSingleEntityQuietly(outLine.textValue(), ArrayNode.class);
  134. node.set("outline", arrayNode);
  135. }
  136. removeProperty(node, projection);
  137. }
  138. /**
  139. * 转换为指定对象
  140. * @param jsonStr
  141. * @param clazz
  142. * @param <T>
  143. * @return
  144. */
  145. public static <T> T toSingleEntityQuietly(String jsonStr, Class<T> clazz) {
  146. try {
  147. return SpringHelper.getBean(ObjectMapper.class).readValue(jsonStr, clazz);
  148. } catch (IOException e) {
  149. throw new BusinessException("outline格式解析失败");
  150. }
  151. }
  152. /**
  153. * 拷贝属性
  154. * @param dmpData 数据中台对象
  155. * @param srcProp 数据中台属性名
  156. * @param desProp 对应的数据中心属性名
  157. */
  158. private static void copyProperty(ObjectNode dmpData, String srcProp, String desProp) {
  159. if(dmpData == null) {
  160. return;
  161. }
  162. JsonNode value = dmpData.get(srcProp);
  163. if(value == null || value.isNull()) {
  164. return;
  165. }
  166. dmpData.set(desProp, value);
  167. dmpData.remove(srcProp);
  168. }
  169. /**
  170. * 删除掉数据中心不需要的属性
  171. * @param dmpData
  172. */
  173. private static void removeProperty(ObjectNode dmpData, List<String> projection){
  174. if(CollUtil.isNotEmpty(projection)) {
  175. // 转换为Set,提供遍历效率
  176. Set<String> fieldSet = CollUtil.newHashSet(projection);
  177. if(fieldSet.contains("localID")){//兼容adm前端数据
  178. fieldSet.add("localId");
  179. }
  180. Iterator<String> fields = dmpData.fieldNames();
  181. while (fields.hasNext()) {
  182. String field = fields.next();
  183. // 返回结果中包含的不处理
  184. if(fieldSet.contains(field)) {
  185. continue;
  186. }
  187. // 去掉不包含的属性
  188. fields.remove();
  189. }
  190. } else {
  191. // 返回全部时,去掉不需要属性
  192. List<String> removeList = CollUtil.newArrayList("creator","valid", "createApp", "virtualCodes", "updateApp", "grouping", "modifier");
  193. for(String removeField:removeList) {
  194. dmpData.remove(removeField);
  195. }
  196. }
  197. }
  198. }