PythonReportConverter.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package com.simuwang.daq.components;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.collection.ListUtil;
  4. import cn.hutool.core.util.ReflectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.json.JSONArray;
  7. import cn.hutool.json.JSONObject;
  8. import cn.hutool.json.JSONUtil;
  9. import com.simuwang.base.common.enums.ReportType;
  10. import com.simuwang.base.pojo.dos.report.BaseReportDO;
  11. import com.simuwang.base.pojo.dto.report.*;
  12. import java.util.List;
  13. import java.util.Objects;
  14. import java.util.Set;
  15. /**
  16. * @author wangzaijun
  17. * @date 2024/9/27 16:06
  18. * @description 自定义的python报告解析结果转换器,json -> dto
  19. */
  20. public class PythonReportConverter {
  21. @SuppressWarnings("unchecked")
  22. public static <T extends ReportData> PythonResult<T> convert(JSONObject jsonObject, ReportType type) {
  23. PythonResult<T> result = new PythonResult<>();
  24. if (jsonObject == null) {
  25. return result;
  26. }
  27. result.setMsg(jsonObject.getStr("msg"));
  28. result.setStatus(jsonObject.getInt("status"));
  29. JSONObject data = jsonObject.getJSONObject("data");
  30. if (data == null || data.isEmpty()) {
  31. return result;
  32. }
  33. T reportData;
  34. if (Objects.equals(ReportType.ANNUALLY, type) || Objects.equals(ReportType.QUARTERLY, type)) {
  35. reportData = (T) convertQuarterly(data);
  36. } else {
  37. reportData = (T) convertMonthly(data);
  38. }
  39. result.setData(reportData);
  40. return result;
  41. }
  42. private static MonthlyReportData convertMonthly(JSONObject jsonObject) {
  43. ReportBaseInfoDTO baseInfo = convertToObj(jsonObject, "base_info", ReportBaseInfoDTO.class);
  44. ReportFundInfoDTO fundInfo = convertToObj(jsonObject, "fund_info", ReportFundInfoDTO.class);
  45. MonthlyReportData reportData = new MonthlyReportData(baseInfo, fundInfo);
  46. reportData.setNetReport(convertToList(jsonObject, "net_report", ReportNetReportDTO.class));
  47. return reportData;
  48. }
  49. private static QuarterlyReportData convertQuarterly(JSONObject jsonObject) {
  50. ReportBaseInfoDTO baseInfo = convertToObj(jsonObject, "base_info", ReportBaseInfoDTO.class);
  51. ReportFundInfoDTO fundInfo = convertToObj(jsonObject, "fund_info", ReportFundInfoDTO.class);
  52. QuarterlyReportData reportData = new QuarterlyReportData(baseInfo, fundInfo);
  53. reportData.setAssetAllocation(convertToList(jsonObject, "asset_allocation", ReportAssetAllocationDTO.class));
  54. reportData.setFinancialIndicators(convertToList(jsonObject, "financial_indicators", ReportFinancialIndicatorsDTO.class));
  55. reportData.setInvestmentIndustry(convertToList(jsonObject, "investment_industry", ReportInvestmentIndustryDTO.class));
  56. reportData.setShareChange(convertToList(jsonObject, "share_change", ReportShareChangeDTO.class));
  57. return reportData;
  58. }
  59. /**
  60. * json转集合后取第一个数据
  61. *
  62. * @param jsonObject 待获取的json对象
  63. * @param key 字段
  64. * @param clazz 对象类型class
  65. * @param <T> 泛型
  66. * @return /
  67. */
  68. private static <T extends BaseReportDTO<? extends BaseReportDO>> T convertToObj(JSONObject jsonObject, String key, Class<T> clazz) {
  69. List<T> dtos = convertToList(jsonObject, key, clazz);
  70. return CollUtil.isEmpty(dtos) ? null : dtos.get(0);
  71. }
  72. /**
  73. * json转换为集合
  74. *
  75. * @param jsonObject 待获取的json对象
  76. * @param key 字段
  77. * @param clazz 对象类型class
  78. * @param <T> 泛型
  79. * @return /
  80. */
  81. private static <T extends BaseReportDTO<? extends BaseReportDO>> List<T> convertToList(JSONObject jsonObject, String key, Class<T> clazz) {
  82. List<T> dtos = ListUtil.list(false);
  83. if (jsonObject == null || !jsonObject.containsKey(key)) {
  84. return dtos;
  85. }
  86. JSONArray jsonArray = jsonObject.getJSONArray(key);
  87. return convertDTOs(jsonArray, clazz);
  88. }
  89. /**
  90. * 通过反射绑定对象
  91. *
  92. * @param jsonArray 数据集合
  93. * @param clazz 对象class对象
  94. * @param <T> 泛型对象
  95. * @return /
  96. */
  97. private static <T extends BaseReportDTO<? extends BaseReportDO>> List<T> convertDTOs(JSONArray jsonArray, Class<T> clazz) {
  98. List<T> dtos = ListUtil.list(false);
  99. if (CollUtil.isEmpty(jsonArray)) {
  100. return dtos;
  101. }
  102. for (Object o : jsonArray) {
  103. JSONObject obj = JSONUtil.parseObj(o);
  104. if (obj == null || obj.isEmpty()) {
  105. continue;
  106. }
  107. T dto = setFieldValues(obj, clazz);
  108. if (dto != null) {
  109. dtos.add(dto);
  110. }
  111. }
  112. return dtos;
  113. }
  114. /**
  115. * 通过反射设置对象的字段值
  116. *
  117. * @param jsonObject json对象
  118. * @param clazz 对象class类型
  119. * @param <T> 泛型对象
  120. * @return 如果构建起初始化报错直接返回null,如果没有字段则跳过该字段的设置
  121. */
  122. private static <T extends BaseReportDTO<? extends BaseReportDO>> T setFieldValues(JSONObject jsonObject, Class<T> clazz) {
  123. T obj = null;
  124. try {
  125. obj = clazz.getDeclaredConstructor().newInstance();
  126. } catch (Exception ignored) {
  127. }
  128. if (obj == null) {
  129. return null;
  130. }
  131. Set<String> columns = jsonObject.keySet();
  132. for (String column : columns) {
  133. String fieldName = StrUtil.toCamelCase(column);
  134. try {
  135. ReflectUtil.setFieldValue(obj, fieldName, jsonObject.get(column));
  136. } catch (Exception ignored) {
  137. }
  138. }
  139. return obj;
  140. }
  141. }