瀏覽代碼

feat:输出基金净值采集结果明细表格

mozuwen 5 月之前
父節點
當前提交
974fc8402a

+ 29 - 0
service-base/src/main/java/com/simuwang/base/config/CompetitionConfig.java

@@ -0,0 +1,29 @@
+package com.simuwang.base.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "competition.output")
+public class CompetitionConfig {
+
+    private Integer method;
+
+    private String  directory;
+
+    public Integer getMethod() {
+        return method;
+    }
+
+    public void setMethod(Integer method) {
+        this.method = method;
+    }
+
+    public String getDirectory() {
+        return directory;
+    }
+
+    public void setDirectory(String directory) {
+        this.directory = directory;
+    }
+}

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/FundInfoMapper.java

@@ -51,4 +51,6 @@ public interface FundInfoMapper {
     FundInfoDO searchFundDetail(@Param("fundId")String fundId);
 
     Long countFundTotal();
+
+    List<FundInfoDO> queryFundInfoByFundId(@Param("fundIdList") List<String> fundIdList);
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/NavMapper.java

@@ -30,4 +30,6 @@ public interface NavMapper {
     void batchDeleteNav(@Param("fundId")String sourceFundId, @Param("priceDateList")List<String> priceDateList);
 
     Long countNavTotal();
+
+    List<NavDO> queryAllNav();
 }

+ 46 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/FundNavDataDTO.java

@@ -0,0 +1,46 @@
+package com.simuwang.base.pojo.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import lombok.Data;
+
+@Data
+public class FundNavDataDTO {
+
+    /**
+     * 基金名称
+     */
+    @HeadFontStyle(fontHeightInPoints = 10)
+    @ColumnWidth(25)
+    @ExcelProperty("基金名称")
+    private String fundName;
+
+    /**
+     * 备案编码
+     */
+    @ColumnWidth(15)
+    @ExcelProperty("备案编码")
+    private String registerNumber;
+
+    /**
+     * 净值日期
+     */
+    @ColumnWidth(15)
+    @ExcelProperty("净值日期")
+    private String priceDate;
+
+    /**
+     * 单位净值
+     */
+    @ColumnWidth(15)
+    @ExcelProperty("单位净值")
+    private String nav;
+
+    /**
+     * 累计净值
+     */
+    @ColumnWidth(15)
+    @ExcelProperty("累计净值")
+    private String cumulativeNavWithdrawal;
+}

+ 12 - 0
service-base/src/main/resources/mapper/FundInfoMapper.xml

@@ -218,4 +218,16 @@
     <select id="countFundTotal" resultType="java.lang.Long">
         select count(1) from pvn_fund_info where isvalid=1
     </select>
+
+    <select id="queryFundInfoByFundId" resultType="com.simuwang.base.pojo.dos.FundInfoDO">
+        select t.fund_id as fundId,
+               t.fund_name as fundName,
+               t.register_number as registerNumber
+        from pvn_fund_info t
+        where t.isvalid = 1
+        and t.fund_id in
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
 </mapper>

+ 5 - 1
service-base/src/main/resources/mapper/NavMapper.xml

@@ -102,5 +102,9 @@
         select count(1) from nav where isvalid=1
     </select>
 
-
+    <select id="queryAllNav" resultMap="BaseResultMap">
+        SELECT fund_id, price_date, nav, cumulative_nav, cumulative_nav_withdrawal
+        from nav
+        where isvalid = 1
+    </select>
 </mapper>

+ 2 - 0
service-deploy/src/main/java/com/simuwang/Application.java

@@ -2,10 +2,12 @@ package com.simuwang;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @EnableTransactionManagement
 @SpringBootApplication
+@EnableCaching
 public class Application {
 
     public static void main(String[] args) {

+ 7 - 0
service-deploy/src/main/resources/application.yml

@@ -60,6 +60,13 @@ email:
   parse:
     force-template-enable: false
 
+competition:
+  output:
+    # 输出方式:1-邮箱,2-指定目录.默认1
+    method: 1
+    # 输出目录(仅当 method 为 2 时有效)
+    directory: C:\\Users\\Administrator\\Desktop\\大赛工具需求\\净值采集结果\\
+
 # 配置
 simuwang:
   # 操作日志功能是否启用,启用了才会记录操作日志

+ 15 - 0
service-manage/src/main/java/com/simuwang/manage/service/FundNavService.java

@@ -0,0 +1,15 @@
+package com.simuwang.manage.service;
+
+import com.simuwang.base.pojo.dto.FundNavDataDTO;
+
+import java.util.List;
+
+public interface FundNavService {
+
+    /**
+     * 获取基金净值数据
+     * @return 基金净值数据
+     */
+    List<FundNavDataDTO> getFungNavData();
+
+}

+ 66 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/FundNavServiceImpl.java

@@ -0,0 +1,66 @@
+package com.simuwang.manage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import com.simuwang.base.common.conts.DateConst;
+import com.simuwang.base.mapper.FundInfoMapper;
+import com.simuwang.base.mapper.NavMapper;
+import com.simuwang.base.pojo.dos.FundInfoDO;
+import com.simuwang.base.pojo.dos.NavDO;
+import com.simuwang.base.pojo.dto.FundNavDataDTO;
+import com.simuwang.manage.service.FundNavService;
+import org.springframework.stereotype.Service;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class FundNavServiceImpl implements FundNavService {
+
+    private final NavMapper navMapper;
+    private final FundInfoMapper fundInfoMapper;
+
+    public FundNavServiceImpl(NavMapper navMapper, FundInfoMapper fundInfoMapper) {
+        this.navMapper = navMapper;
+        this.fundInfoMapper = fundInfoMapper;
+    }
+
+    @Override
+    public List<FundNavDataDTO> getFungNavData() {
+        List<FundNavDataDTO> navDataDTOList = CollUtil.newArrayList();
+        List<NavDO> navDOList = navMapper.queryAllNav();
+        if (CollUtil.isEmpty(navDOList)) {
+            return navDataDTOList;
+        }
+        List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).distinct().toList();
+        List<FundInfoDO> fundInfoDOList = fundInfoMapper.queryFundInfoByFundId(fundIdList);
+        Map<String, FundInfoDO> fundIdInfoMap = fundInfoDOList.stream().collect(Collectors.toMap(FundInfoDO::getFundId, v -> v, (oldValue, newValue) -> oldValue));
+
+        Map<String, List<NavDO>> fundIdNavMap = navDOList.stream().collect(Collectors.groupingBy(NavDO::getFundId));
+        for (Map.Entry<String, List<NavDO>> fundIdNavEntry : fundIdNavMap.entrySet()) {
+            String fundId = fundIdNavEntry.getKey();
+            List<NavDO> fundNavDoList = fundIdNavEntry.getValue();
+            FundInfoDO fundInfoDO = fundIdInfoMap.get(fundId);
+            List<FundNavDataDTO> fundNavDataDTOList = buildFundNavDataDTO(fundInfoDO, fundNavDoList);
+            navDataDTOList.addAll(fundNavDataDTOList);
+        }
+        return navDataDTOList;
+    }
+
+    private List<FundNavDataDTO> buildFundNavDataDTO(FundInfoDO fundInfoDO, List<NavDO> fundNavDoList) {
+        String fundName = fundInfoDO.getFundName();
+        String registerNumber = fundInfoDO.getRegisterNumber();
+        return fundNavDoList.stream().map(e -> {
+            FundNavDataDTO fundNavDataDTO = new FundNavDataDTO();
+            fundNavDataDTO.setFundName(fundName);
+            fundNavDataDTO.setRegisterNumber(registerNumber);
+            fundNavDataDTO.setPriceDate(e.getPriceDate() != null ? DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD) : null);
+            fundNavDataDTO.setNav(e.getNav() != null ? String.valueOf(e.getNav()) : null);
+            fundNavDataDTO.setCumulativeNavWithdrawal(e.getCumulativeNavWithdrawal() != null ? String.valueOf(e.getCumulativeNavWithdrawal()) : null);
+            return fundNavDataDTO;
+        }).sorted(Comparator.comparing(FundNavDataDTO::getPriceDate)).toList();
+    }
+
+}

+ 49 - 0
service-manage/src/main/java/com/simuwang/manage/task/GenerateNavDataTask.java

@@ -0,0 +1,49 @@
+package com.simuwang.manage.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.simuwang.base.common.conts.DateConst;
+import com.simuwang.base.config.CompetitionConfig;
+import com.simuwang.base.pojo.dto.FundNavDataDTO;
+import com.simuwang.manage.service.FundNavService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class GenerateNavDataTask {
+
+    private static final Logger log = LoggerFactory.getLogger(GenerateNavDataTask.class);
+
+    private final FundNavService fundNavService;
+    private final CompetitionConfig competitionConfig;
+
+    public GenerateNavDataTask(FundNavService fundNavService, CompetitionConfig competitionConfig) {
+        this.fundNavService = fundNavService;
+        this.competitionConfig = competitionConfig;
+    }
+
+     @Scheduled(cron = "0 0/1 * * * ?")
+    public void runTask() {
+        List<FundNavDataDTO> navDataDTOList = fundNavService.getFungNavData();
+        if (CollUtil.isEmpty(navDataDTOList)) {
+            return;
+        }
+        String fileName = competitionConfig.getDirectory() + "基金净值采集结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDDHHMMSS24) + ".xlsx";
+        EasyExcel.write(fileName, FundNavDataDTO.class)
+                .sheet("基金净值采集结果明细")
+                .doWrite(navDataDTOList);
+        log.info("基金净值采集结果明细表格已输出... -> 文件:{}", fileName);
+
+        Integer method = competitionConfig.getMethod();
+        // 通过邮件发送"基金净值采集结果明细表格"
+        if(method == 1){
+
+        }
+    }
+}