Просмотр исходного кода

fix:修复python对象转实体对象错误问题

wangzaijun 7 месяцев назад
Родитель
Сommit
0b743d7962

+ 14 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/report/AnnuallyReportData.java

@@ -0,0 +1,14 @@
+package com.simuwang.base.pojo.dto.report;
+
+import com.simuwang.base.common.enums.ReportType;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class AnnuallyReportData extends QuarterlyReportData {
+    @Override
+    public ReportType getReportType() {
+        return ReportType.ANNUALLY;
+    }
+}

+ 2 - 2
service-base/src/main/java/com/simuwang/base/pojo/dto/report/ReportData.java

@@ -11,7 +11,7 @@ import java.util.List;
 public abstract class ReportData {
     public abstract ReportType getReportType();
 
-    private List<ReportBaseInfoDTO> baseInfo;
+    private ReportBaseInfoDTO baseInfo;
 
-    private List<ReportFundInfoDTO> fundInfo;
+    private ReportFundInfoDTO fundInfo;
 }

+ 3 - 3
service-base/src/main/java/com/simuwang/base/pojo/dto/report/ReportNetReportDTO.java

@@ -1,11 +1,11 @@
 package com.simuwang.base.pojo.dto.report;
 
+import cn.hutool.core.date.DateUtil;
 import com.simuwang.base.pojo.dos.report.ReportNetReportDO;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  * @author wangzaijun
@@ -16,7 +16,7 @@ import java.util.Date;
 @Getter
 public class ReportNetReportDTO extends BaseReportDTO<ReportNetReportDO> {
     private String level;
-    private Date valuationDate;
+    private String valuationDate;
 
     /**
      * 累计净值
@@ -40,7 +40,7 @@ public class ReportNetReportDTO extends BaseReportDTO<ReportNetReportDO> {
         ReportNetReportDO entity = new ReportNetReportDO();
         entity.setFileId(this.getFileId());
         entity.setLevel(this.level);
-        entity.setValuationDate(this.valuationDate);
+        entity.setValuationDate(this.valuationDate == null ? null : DateUtil.parseDate(this.valuationDate));
         entity.setCumulativeNav(this.cumulativeNav);
         entity.setEndTotalShares(this.endTotalShares);
         entity.setFundAssetSize(this.fundAssetSize);

+ 4 - 4
service-base/src/main/java/com/simuwang/base/pojo/dto/report/ReportShareChangeDTO.java

@@ -15,14 +15,14 @@ import java.math.BigDecimal;
 @Getter
 public class ReportShareChangeDTO extends BaseReportDTO<ReportShareChangeDO> {
     /**
-     * 报告期期初基金份额总额
-     */
-    private BigDecimal initTotalShares;
-    /**
      * 基金分级
      */
     private String level;
     /**
+     * 报告期期初基金份额总额
+     */
+    private BigDecimal initTotalShares;
+    /**
      * 减: 报告期期间基金总赎回份额
      */
     private BigDecimal redemption;

+ 235 - 0
service-daq/src/main/java/com/simuwang/daq/components/PythonReportConverter.java

@@ -0,0 +1,235 @@
+package com.simuwang.daq.components;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.simuwang.base.pojo.dto.report.*;
+
+import java.util.List;
+import java.util.Objects;
+
+public class PythonReportConverter {
+    @SuppressWarnings("unchecked")
+    public static <T extends ReportData> PythonResult<T> convert(JSONObject jsonObject, Integer type) {
+        PythonResult<T> result = new PythonResult<>();
+        if (jsonObject == null) {
+            return result;
+        }
+        result.setMsg(jsonObject.getStr("msg"));
+        result.setStatus(jsonObject.getInt("status"));
+        JSONObject data = jsonObject.getJSONObject("data");
+        if (data == null || data.isEmpty()) {
+            return result;
+        }
+
+        T reportData;
+        if (Objects.equals(2, type) || Objects.equals(1, type)) {
+            reportData = (T) convertQuarterly(data);
+        } else {
+            reportData = (T) convertMonthly(data);
+        }
+        result.setData(reportData);
+        return result;
+    }
+
+    private static MonthlyReportData convertMonthly(JSONObject jsonObject) {
+        MonthlyReportData reportData = new MonthlyReportData();
+        reportData.setBaseInfo(convertBaseInfo(jsonObject));
+        reportData.setFundInfo(convertFundInfo(jsonObject));
+        reportData.setNetReport(convertNetReport(jsonObject));
+        return reportData;
+    }
+
+    private static QuarterlyReportData convertQuarterly(JSONObject jsonObject) {
+        QuarterlyReportData reportData = new QuarterlyReportData();
+        reportData.setBaseInfo(convertBaseInfo(jsonObject));
+        reportData.setFundInfo(convertFundInfo(jsonObject));
+        reportData.setAssetAllocation(convertAssetAllocation(jsonObject));
+        reportData.setFinancialIndicators(convertFinancialIndicator(jsonObject));
+        reportData.setInvestmentIndustry(convertInvestmentIndustry(jsonObject));
+        reportData.setShareChange(convertShareChange(jsonObject));
+        return reportData;
+    }
+
+    private static ReportBaseInfoDTO convertBaseInfo(JSONObject jsonObject) {
+        ReportBaseInfoDTO baseInfo = new ReportBaseInfoDTO();
+        if (jsonObject == null || !jsonObject.containsKey("base_info")) {
+            return baseInfo;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("base_info");
+        JSONObject obj = jsonArray.getJSONObject(0);
+        if (obj == null || obj.isEmpty()) {
+            return baseInfo;
+        }
+        baseInfo.setFileId(obj.getInt("file_id"));
+        baseInfo.setReportName(obj.getStr("report_name"));
+        baseInfo.setReportType(obj.getStr("report_type"));
+        baseInfo.setReportDate(obj.getStr("report_date"));
+        return baseInfo;
+    }
+
+    private static ReportFundInfoDTO convertFundInfo(JSONObject jsonObject) {
+        ReportFundInfoDTO dto = new ReportFundInfoDTO();
+        if (jsonObject == null || !jsonObject.containsKey("fund_info")) {
+            return dto;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("fund_info");
+        JSONObject obj = jsonArray.getJSONObject(0);
+        if (obj == null || obj.isEmpty()) {
+            return dto;
+        }
+        dto.setFileId(obj.getInt("file_id"));
+        dto.setAdvisorName(obj.getStr("advisor_name"));
+        dto.setCustodianName(obj.getStr("custodian_name"));
+        dto.setFundManager(obj.getStr("fund_manager"));
+        dto.setFundName(obj.getStr("fund_name"));
+        dto.setFundStrategyDescription(obj.getStr("fund_strategy_description"));
+        dto.setInceptionDate(obj.getStr("inception_date"));
+        dto.setIndustryTrend(obj.getStr("industry_trend"));
+        dto.setInvestmentObjective(obj.getStr("investment_objective"));
+        dto.setLeverage(obj.getBigDecimal("leverage"));
+        dto.setLeverageNote(obj.getStr("leverage_note"));
+        dto.setOperationType(obj.getStr("operation_type"));
+        dto.setRegisterNumber(obj.getStr("register_number"));
+        dto.setRiskReturnDesc(obj.getStr("risk_return_desc"));
+        dto.setSecondaryBenchmark(obj.getStr("secondary_benchmark"));
+        dto.setTrustName(obj.getStr("trust_name"));
+        dto.setDueDate(obj.getStr("due_date"));
+        dto.setIsReviewed(obj.getStr("is_reviewed"));
+        return dto;
+    }
+
+    private static List<ReportNetReportDTO> convertNetReport(JSONObject jsonObject) {
+        List<ReportNetReportDTO> dtos = ListUtil.list(false);
+        if (jsonObject == null || !jsonObject.containsKey("new_report")) {
+            return dtos;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("new_report");
+        if (CollUtil.isEmpty(jsonArray)) {
+            return dtos;
+        }
+        for (Object o : jsonArray) {
+            JSONObject obj = JSONUtil.parseObj(o);
+            ReportNetReportDTO dto = new ReportNetReportDTO();
+            if (obj == null || obj.isEmpty()) {
+                continue;
+            }
+            dto.setFileId(obj.getInt("file_id"));
+            dto.setValuationDate(obj.getStr("valuation_date"));
+            dto.setFundAssetSize(obj.getBigDecimal("fund_asset_size"));
+            dto.setEndTotalShares(obj.getBigDecimal("end_total_shares"));
+            dto.setCumulativeNav(obj.getBigDecimal("cumulative_nav"));
+            dto.setNav(obj.getBigDecimal("nav"));
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    private static List<ReportShareChangeDTO> convertShareChange(JSONObject jsonObject) {
+        List<ReportShareChangeDTO> dtos = ListUtil.list(false);
+        if (jsonObject == null || !jsonObject.containsKey("share_change")) {
+            return dtos;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("share_change");
+        if (CollUtil.isEmpty(jsonArray)) {
+            return dtos;
+        }
+        for (Object o : jsonArray) {
+            JSONObject obj = JSONUtil.parseObj(o);
+            ReportShareChangeDTO dto = new ReportShareChangeDTO();
+            if (obj == null || obj.isEmpty()) {
+                continue;
+            }
+            dto.setFileId(obj.getInt("file_id"));
+            dto.setLevel(obj.getStr("level"));
+            dto.setInitTotalShares(obj.getBigDecimal("init_total_shares"));
+            dto.setRedemption(obj.getBigDecimal("redemption"));
+            dto.setSharePerAsset(obj.getBigDecimal("share_per_asset"));
+            dto.setSubscription(obj.getBigDecimal("subscription"));
+            dto.setSplit(obj.getBigDecimal("split"));
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    private static List<ReportAssetAllocationDTO> convertAssetAllocation(JSONObject jsonObject) {
+        List<ReportAssetAllocationDTO> dtos = ListUtil.list(false);
+        if (jsonObject == null || !jsonObject.containsKey("asset_allocation")) {
+            return dtos;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("asset_allocation");
+        if (CollUtil.isEmpty(jsonArray)) {
+            return dtos;
+        }
+        for (Object o : jsonArray) {
+            JSONObject obj = JSONUtil.parseObj(o);
+            ReportAssetAllocationDTO dto = new ReportAssetAllocationDTO();
+            if (obj == null || obj.isEmpty()) {
+                continue;
+            }
+            dto.setFileId(obj.getInt("file_id"));
+            dto.setAssetType(obj.getStr("asset_type"));
+            dto.setColumnName(obj.getStr("column_name"));
+            dto.setMarketValue(obj.getBigDecimal("market_value"));
+            dto.setRemark(obj.getStr("remark"));
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    private static List<ReportFinancialIndicatorDTO> convertFinancialIndicator(JSONObject jsonObject) {
+        List<ReportFinancialIndicatorDTO> dtos = ListUtil.list(false);
+        if (jsonObject == null || !jsonObject.containsKey("financial_indicator")) {
+            return dtos;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("financial_indicator");
+        if (CollUtil.isEmpty(jsonArray)) {
+            return dtos;
+        }
+        for (Object o : jsonArray) {
+            JSONObject obj = JSONUtil.parseObj(o);
+            ReportFinancialIndicatorDTO dto = new ReportFinancialIndicatorDTO();
+            if (obj == null || obj.isEmpty()) {
+                continue;
+            }
+            dto.setFileId(obj.getInt("file_id"));
+            dto.setLevel(obj.getStr("level"));
+            dto.setEndDate(obj.getInt("end_date"));
+            dto.setFundAssetSize(obj.getBigDecimal("fund_asset_aize"));
+            dto.setNav(obj.getBigDecimal("nav"));
+            dto.setProfit(obj.getBigDecimal("profit"));
+            dto.setRealizedIncome(obj.getBigDecimal("realized_income"));
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    private static List<ReportInvestmentIndustryDTO> convertInvestmentIndustry(JSONObject jsonObject) {
+        List<ReportInvestmentIndustryDTO> dtos = ListUtil.list(false);
+        if (jsonObject == null || !jsonObject.containsKey("investment_industry")) {
+            return dtos;
+        }
+        JSONArray jsonArray = jsonObject.getJSONArray("investment_industry");
+        if (CollUtil.isEmpty(jsonArray)) {
+            return dtos;
+        }
+        for (Object o : jsonArray) {
+            JSONObject obj = JSONUtil.parseObj(o);
+            ReportInvestmentIndustryDTO dto = new ReportInvestmentIndustryDTO();
+            if (obj == null || obj.isEmpty()) {
+                continue;
+            }
+            dto.setFileId(obj.getInt("file_id"));
+            dto.setIndustryCode(obj.getStr("industry_code"));
+            dto.setIndustryName(obj.getStr("industry_name"));
+            dto.setInvestType(obj.getInt("invest_type"));
+            dto.setIsbCode(obj.getStr("isb_code"));
+            dto.setMarketValue(obj.getBigDecimal("market_value"));
+            dto.setRatio(obj.getBigDecimal("ratio"));
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+}

+ 6 - 9
service-daq/src/main/java/com/simuwang/daq/components/writer/AbstractReportWriter.java

@@ -1,6 +1,5 @@
 package com.simuwang.daq.components.writer;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.exceptions.ExceptionUtil;
 import com.simuwang.base.mapper.report.ReportBaseInfoMapper;
 import com.simuwang.base.mapper.report.ReportFundInfoMapper;
@@ -14,8 +13,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StopWatch;
 
-import java.util.List;
-
 public abstract class AbstractReportWriter<T extends ReportData> implements ReportWriter<T> {
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -34,14 +31,14 @@ public abstract class AbstractReportWriter<T extends ReportData> implements Repo
         stopWatch.start();
         try {
             // 基本信息+基金信息保存
-            List<ReportBaseInfoDTO> baseInfos = reportData.getBaseInfo();
-            if (CollUtil.isNotEmpty(baseInfos)) {
-                ReportBaseInfoDO entity = baseInfos.get(0).toEntity();
+            ReportBaseInfoDTO baseInfo = reportData.getBaseInfo();
+            if (baseInfo != null) {
+                ReportBaseInfoDO entity = baseInfo.toEntity();
                 this.baseInfoMapper.insert(entity);
             }
-            List<ReportFundInfoDTO> fundInfos = reportData.getFundInfo();
-            if (CollUtil.isNotEmpty(fundInfos)) {
-                ReportFundInfoDO entity = fundInfos.get(0).toEntity();
+            ReportFundInfoDTO fundInfo = reportData.getFundInfo();
+            if (fundInfo != null) {
+                ReportFundInfoDO entity = fundInfo.toEntity();
                 this.fundInfoMapper.insert(entity);
             }
             try {

+ 14 - 0
service-daq/src/main/java/com/simuwang/daq/components/writer/AnnuallyReportWriter.java

@@ -0,0 +1,14 @@
+package com.simuwang.daq.components.writer;
+
+import com.simuwang.base.mapper.report.*;
+import com.simuwang.base.pojo.dto.report.AnnuallyReportData;
+import org.springframework.stereotype.Component;
+
+@Component(ReportWriterConstant.WRITER_ANNUALLY)
+public class AnnuallyReportWriter extends QuarterlyReportWriter<AnnuallyReportData> {
+    public AnnuallyReportWriter(ReportBaseInfoMapper baseInfoMapper, ReportFundInfoMapper fundInfoMapper,
+                                ReportShareChangeMapper shareChangeMapper, ReportAssetAllocationMapper assetAllocationMapper,
+                                ReportInvestmentIndustryMapper investmentIndustryMapper, ReportFinancialIndicatorMapper financialIndicatorMapper) {
+        super(baseInfoMapper, fundInfoMapper, shareChangeMapper, assetAllocationMapper, investmentIndustryMapper, financialIndicatorMapper);
+    }
+}

+ 1 - 1
service-daq/src/main/java/com/simuwang/daq/components/writer/QuarterlyReportWriter.java

@@ -13,7 +13,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 @Component(ReportWriterConstant.WRITER_QUARTERLY)
-public class QuarterlyReportWriter extends AbstractReportWriter<QuarterlyReportData> {
+public class QuarterlyReportWriter<T extends QuarterlyReportData> extends AbstractReportWriter<T> {
     private final ReportShareChangeMapper shareChangeMapper;
     private final ReportAssetAllocationMapper assetAllocationMapper;
     private final ReportInvestmentIndustryMapper investmentIndustryMapper;

+ 3 - 2
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -24,6 +24,7 @@ import com.simuwang.base.pojo.dto.EmailFundNavDTO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 import com.simuwang.base.pojo.dto.report.PythonResult;
 import com.simuwang.base.pojo.dto.report.ReportData;
+import com.simuwang.daq.components.PythonReportConverter;
 import com.simuwang.daq.components.writer.ReportWriterFactory;
 import jakarta.mail.*;
 import jakarta.mail.internet.MimeMultipart;
@@ -234,10 +235,10 @@ public class EmailParseService {
             long millis = System.currentTimeMillis();
             try {
                 String body = HttpUtil.post(this.pyBaseUrl + api, JSONUtil.toJsonStr(params));
-                PythonResult<?> result = JSONUtil.toBean(body, PythonResult.class);
+                PythonResult<?> result = PythonReportConverter.convert(JSONUtil.parseObj(body), type);
                 reportData = result.getData();
             } catch (Exception e) {
-                log.warn("请求python的报告解析接口报错\n{}", ExceptionUtil.stacktraceToString(e));
+                log.error("请求python的报告解析接口报错\n{}", ExceptionUtil.stacktraceToString(e));
             } finally {
                 if (log.isInfoEnabled()) {
                     log.info("当前报告{}解析完成,总计耗时{}ms", params, (System.currentTimeMillis() - millis));

+ 4 - 2
service-daq/src/main/java/com/simuwang/daq/utils/ReportParseUtil.java

@@ -10,6 +10,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.simuwang.base.pojo.dto.report.PythonResult;
 import com.simuwang.daq.components.CustomPDFTextStripper;
+import com.simuwang.daq.components.PythonReportConverter;
 import com.simuwang.daq.dto.ReportFundInfo;
 import com.smppw.common.pojo.ValueLabelVO;
 import org.apache.pdfbox.Loader;
@@ -49,19 +50,20 @@ public class ReportParseUtil {
             registerNumber = matcher.group();
         }
 
+        int type = 1;
         String baseUrl = "http://192.168.0.81:8088";
         String api = "/api/v1/parse/amac_report";
         Map<String, Object> params = MapUtil.newHashMap(16);
         params.put("file_id", 111112);
         params.put("file_path", "E:/workproject/fastparse/src/fastparse/static/reports/quarterly_report/13445.pdf");
         params.put("register_number", registerNumber);
-        params.put("file_type", 1);
+        params.put("file_type", type);
         params.put("file_name", fileName);
         params.put("fund_name", null);
         params.put("trust_name", null);
         String body = HttpUtil.post(baseUrl + api, JSONUtil.toJsonStr(params));
         JSONObject obj = JSONUtil.parseObj(body);
-        PythonResult<?> result = JSONUtil.toBean(JSONUtil.toJsonStr(body), PythonResult.class);
+        PythonResult<?> result = PythonReportConverter.convert(obj, type);
         System.out.println(obj);
 
 //        List<ValueLabelVO> fieldMapper = ListUtil.list(false);