UploadPatentBatchUtil.java 12 KB

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