UploadPatentBatchUtil.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package cn.cslg.pas.common.utils;
  2. import cn.cslg.pas.common.utils.handler.DataProcessHandler;
  3. import cn.cslg.pas.common.utils.handler.StringSpecialHandler;
  4. import cn.cslg.pas.common.vo.UploadSettingVO;
  5. import org.springframework.stereotype.Component;
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.Method;
  8. import java.lang.reflect.ParameterizedType;
  9. import java.lang.reflect.Type;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.Objects;
  14. /**
  15. * @date 2022/7/7
  16. * @description 批量上传专利数据的数据处理工具类
  17. */
  18. @Component
  19. public class UploadPatentBatchUtil {
  20. /**
  21. *
  22. * @param getSettingJson 配置文件解析出的Json串
  23. * @return uploadParamsVO 返回一个由processData方法填充完数据的Pojo类
  24. * @date 2022/7/7
  25. * @name 解析配置文件
  26. * @description 通过与前段传入参数中的数据源ID进行比对从而得到对应数据源的配置项目
  27. */
  28. public static List<UploadSettingVO.Column> parsingConfigurationFiles(String sourceId, String getSettingJson) {
  29. //将uploadSetting.json数据源配置文件的json字符串转换为UploadSettingVO对象(即实体类)集合
  30. List<UploadSettingVO> uploadSettingVOs = JsonUtils.jsonToList(getSettingJson, UploadSettingVO.class);
  31. //创建一个存放单一数据源的对象 这个对象存放的是 我们需要使用哪一个数据源的配置数据 所以只存一个 正常在Json文件里面会有多个数据源 也就是多条数据
  32. List<UploadSettingVO.Column> jsonData = new ArrayList<>();
  33. //遍历uploadSettingVOs,
  34. for (int i = 0; i < Objects.requireNonNull(uploadSettingVOs).size(); i++) {
  35. //提取一个常量
  36. UploadSettingVO constant = Objects.requireNonNull(uploadSettingVOs).get(i);
  37. //判断 如果说 Json 解析出来的 List<T> 中的 sourceId 和传入参数的 sourceId 匹配成功 则开始装配数据
  38. if (constant.getSourceId().equals(sourceId)) {
  39. //填充数据
  40. jsonData = constant.getColumn();
  41. }
  42. }
  43. //返回填充好的数据
  44. return jsonData;
  45. }
  46. /**
  47. * @param getSettingJson 配置文件解析出的Json串
  48. * @return uploadParamsVO 返回一个由processData方法填充完数据的Pojo类
  49. * @date 2022/7/7
  50. * @name 解析配置文件
  51. * @description 通过与前段传入参数中的数据源ID进行比对从而得到对应数据源的配置(parsingConfigurationFiles的兄弟方法)
  52. */
  53. public static List<UploadSettingVO.Column> parsingConfigurationFilesBro(String getSettingJson) {
  54. //将 Json 转换为 对象数组
  55. List<UploadSettingVO> test = JsonUtils.jsonToList(getSettingJson, UploadSettingVO.class);
  56. //创建一个存放单一数据源的对象 这个对象存放的是 我们需要使用哪一个数据源的配置数据 所以只存一个 正常在Json文件里面会有多个数据源 也就是多条数据
  57. List<UploadSettingVO.Column> jsonData = new ArrayList<>();
  58. //开始将前端传入的数据源参数与 Json 中解析出来的 sourceId(数据来源ID) 进行比对 并将比对中的那一条数据放入上方定义的 jsonData 中 用于后续使用
  59. for (int i = 0; i < Objects.requireNonNull(test).size(); i++) {
  60. //提取一个常量
  61. UploadSettingVO constant = Objects.requireNonNull(test).get(i);
  62. //判断 如果说 Json 解析出来的 List<T> 中的 sourceId 和传入参数的 sourceId 匹配成功 则开始装配数据
  63. if (constant.getSourceId().equals("1")) {
  64. //填充数据
  65. jsonData = constant.getColumn();
  66. }
  67. }
  68. //返回填充好的数据
  69. return jsonData;
  70. }
  71. private static List<UploadSettingVO.Column> getColumn(List<UploadSettingVO.Column> jsonData, String key) {
  72. List<UploadSettingVO.Column> columnList = new ArrayList<>();
  73. for (UploadSettingVO.Column jsonDatum : jsonData) {
  74. if (jsonDatum.getSetName().equals(key)) {
  75. columnList.add(jsonDatum);
  76. }
  77. }
  78. return columnList;
  79. }
  80. /**
  81. * @param obj 装配对象(UploadParamsVO)
  82. * @param propertyPath 以.隔开的属性路径(配置文件中的 Column)
  83. * @param value 值(row 每一行的值 在上层方法中叫 value)
  84. * @name 装配对象
  85. * @description 通过反射将处理后的数据赋值到装配对象的给定路径的属性值
  86. */
  87. private static void assemblyObject(Object obj, String propertyPath, Object value) {
  88. //将属性的路径通过 "." 进行拆分 数据样式大致为 patentRightList.content 或者 patentInstructionText.manual
  89. //"."前面的是UploadParamsVO的属性名称 可能是List或者Object
  90. //"."后面的是List中的Object的属性 或者Object的属性
  91. String[] splitProperty = propertyPath.split("\\.");
  92. //初始化一个基类 用于存储数据
  93. Object temObj = obj;
  94. try {
  95. //进行属性路径的循环 这里一般都是两次
  96. for (int i = 0; i < splitProperty.length; i++) {
  97. //如果需要为对应参数赋值 第一次循环不会进入这一分支
  98. if (i == splitProperty.length - 1) {
  99. //如果是列表
  100. if (temObj instanceof List) {
  101. //取创建空数据中的第一条
  102. Object firstItem = ((List<?>) temObj).get(0);
  103. //获取该条数据的类型
  104. String listObjectType = firstItem.getClass().getTypeName();
  105. //如果列表中的数据少于给的值的列表中的数据量
  106. //添加数据以与给定的值对齐
  107. if (((List<?>) temObj).size() < ((List<?>) Objects.requireNonNull(value)).size()) {
  108. for (int iIndex = ((List<?>) temObj).size(); iIndex < ((List<?>) value).size(); iIndex++) {
  109. Object cObj = Class.forName(listObjectType).newInstance();// trueType.newInstance();
  110. ((List<Object>) temObj).add(cObj);
  111. }
  112. }
  113. //给列表中的对象相对应的属性赋值
  114. for (int iIndex = 0; iIndex < ((List<?>) value).size(); iIndex++) {
  115. Object inListObj = ((List<?>) temObj).get(iIndex);
  116. Field f = inListObj.getClass().getDeclaredField(splitProperty[i]);
  117. f.setAccessible(true);
  118. if (!((List<?>) value).isEmpty()) {
  119. f.set(inListObj, ((List<?>) value).get(iIndex));
  120. }
  121. }
  122. } else {
  123. Field f = temObj.getClass().getDeclaredField(splitProperty[i]);
  124. f.setAccessible(true);
  125. if (value != null) {
  126. f.set(temObj, value);
  127. }
  128. }
  129. } else {
  130. //
  131. Field f = temObj.getClass().getDeclaredField(splitProperty[i]);
  132. //允许设置私有(private)属性
  133. f.setAccessible(true);
  134. //获取
  135. Object propertyValue = f.get(obj);
  136. if (propertyValue == null) {
  137. if (f.getType().getName().contains("List")) {
  138. propertyValue = createList(f);
  139. } else {
  140. propertyValue = f.getType().newInstance();
  141. }
  142. f.set(temObj, propertyValue);
  143. }
  144. temObj = propertyValue;
  145. }
  146. }
  147. } catch (Exception e) {
  148. e.printStackTrace();
  149. }
  150. }
  151. private static List<Object> createList(Field f) {
  152. //如果是列表,创建一个List<Object>并添加一个对应类型的对象
  153. List<Object> lst = new ArrayList<>();
  154. //取List属性中包含的对象类型
  155. Type trueType = f.getGenericType();
  156. Type listArgumentObj = ((ParameterizedType) trueType).getActualTypeArguments()[0];
  157. Object cObj = null;
  158. try {
  159. cObj = Class.forName(listArgumentObj.getTypeName()).newInstance();
  160. } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
  161. e.printStackTrace();
  162. }
  163. lst.add(cObj);
  164. return lst;
  165. }
  166. }