FundAliasServiceImpl.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.simuwang.manage.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.exceptions.ExceptionUtil;
  5. import com.simuwang.base.common.conts.DateConst;
  6. import com.simuwang.base.common.support.MybatisPage;
  7. import com.simuwang.base.common.util.StringUtil;
  8. import com.simuwang.base.mapper.*;
  9. import com.simuwang.base.pojo.dos.*;
  10. import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
  11. import com.simuwang.base.pojo.vo.FundAliasVO;
  12. import com.simuwang.base.pojo.vo.IdListVO;
  13. import com.simuwang.manage.service.EmailFundAssetService;
  14. import com.simuwang.manage.service.EmailFundNavService;
  15. import com.simuwang.manage.service.EmailFundInfoService;
  16. import com.simuwang.manage.service.FundAliasService;
  17. import com.simuwang.shiro.utils.UserUtils;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.stream.Collectors;
  26. /**
  27. * FileName: FunAliasServiceImpl
  28. * Author: chenjianhua
  29. * Date: 2024/9/14 16:18
  30. * Description: ${DESCRIPTION}
  31. */
  32. @Service
  33. public class FundAliasServiceImpl implements FundAliasService {
  34. private static final Logger log = LoggerFactory.getLogger(FundAliasServiceImpl.class);
  35. @Autowired
  36. private FundAliasMapper fundAliasMapper;
  37. @Autowired
  38. private EmailFundNavMapper emailFundNavMapper;
  39. @Autowired
  40. private EmailFundAssetMapper emailFundAssetMapper;
  41. @Autowired
  42. private CompanyInformationMapper companyInformationMapper;
  43. @Autowired
  44. private EmailFundInfoService emailFundInfoService;
  45. @Autowired
  46. private EmailFundNavService emailFileNavService;
  47. @Autowired
  48. private EmailFundAssetService emailFundAssetService;
  49. @Autowired
  50. private NavMapper navMapper;
  51. @Autowired
  52. private AssetMapper assetMapper;
  53. @Override
  54. public MybatisPage<FundAliasVO> searchFundAlias(FundAliasPageQuery fundAliasPageQuery) {
  55. List<FundAliasDO> fundAliasDOList = fundAliasMapper.searchFundAlias(fundAliasPageQuery);
  56. List<FundAliasVO> fundAliasVOList = fundAliasDOList.stream().map(FundAliasDO::toVo).collect(Collectors.toList());
  57. for(FundAliasVO vo : fundAliasVOList){
  58. //异常净值数量
  59. Integer navTotal = emailFundNavMapper.countNoStoreNav(vo.getSourceFundName(),vo.getSourceRegisterNumber());
  60. vo.setNavTotal(navTotal);
  61. //异常净值数量
  62. Integer assetTotal = emailFundAssetMapper.countNoStoreAsset(vo.getSourceFundName(),vo.getSourceRegisterNumber());
  63. vo.setAssetTotal(assetTotal);
  64. //最新净值日期
  65. vo.setPriceDate(emailFundNavMapper.getMaxPriceDate(vo.getSourceFundName()));
  66. }
  67. long total = fundAliasMapper.countFundAlias(fundAliasPageQuery);
  68. return MybatisPage.of(total,fundAliasVOList);
  69. }
  70. @Override
  71. public FundAliasVO searchFundAliasById(Integer id) {
  72. FundAliasDO fundAliasDO = fundAliasMapper.searchFundAliasById(id);
  73. if(StringUtil.isNull(fundAliasDO)){
  74. return null;
  75. }
  76. return fundAliasDO.toVo();
  77. }
  78. @Override
  79. public void saveFundAlias(FundAliasVO fundAliasVO) {
  80. FundAliasDO fundAliasDO = new FundAliasDO();
  81. fundAliasDO.setSourceFundName(fundAliasVO.getSourceFundName());
  82. fundAliasDO.setTargetFundId(fundAliasVO.getTargetFundId());
  83. fundAliasDO.setSourceRegisterNumber(fundAliasVO.getSourceRegisterNumber());
  84. fundAliasDO.setTargetFundName(fundAliasVO.getTargetFundName());
  85. fundAliasDO.setTargetRegisterNumber(fundAliasVO.getTargetRegisterNumber());
  86. fundAliasDO.setId(fundAliasVO.getId());
  87. fundAliasDO.setIsvalid(1);
  88. fundAliasDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
  89. fundAliasDO.setCreatorId(UserUtils.getLoginUser().getUserId());
  90. fundAliasDO.setUpdateTime(new Date());
  91. FundAliasDO oldFundAliasDO = fundAliasMapper.searchFundAliasById(fundAliasVO.getId());
  92. String oldFundId = oldFundAliasDO.getTargetFundId();
  93. fundAliasMapper.saveFundAlias(fundAliasDO);
  94. //将采集的净值数据匹配之后重新入库
  95. emailFileNavService.reparseFileNav(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber(),fundAliasVO.getTargetFundId(),oldFundId);
  96. //将采集的规模数据匹配之后重新入库
  97. emailFundAssetService.reparseFileAsset(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber(),fundAliasVO.getTargetFundId(),oldFundId);
  98. //处理采集数据,将采集的数据入库
  99. emailFundInfoService.reparseValuationFile(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber());
  100. }
  101. @Override
  102. public void deleteFundAlias(IdListVO idListVO) {
  103. List<Integer> idList = idListVO.getIdList();
  104. Integer userId = UserUtils.getLoginUser().getUserId();
  105. if(idList.size() > 0){
  106. fundAliasMapper.batchDelete(idList,userId);
  107. }
  108. }
  109. @Override
  110. public void updateFundNavAndAsset(String date) {
  111. // 获取别名管理表信息fund_alias
  112. List<FundAliasDO> fundAliasDOList = fundAliasMapper.queryByLatestDate(date);
  113. if (CollUtil.isEmpty(fundAliasDOList)) {
  114. return;
  115. }
  116. // 查询基金名称和备案编码对应的邮件净值表email_fund_nav(异常情况为未匹配基金ID && is_stored=0未入库)
  117. for (FundAliasDO fundAliasDO : fundAliasDOList) {
  118. String fundId = fundAliasDO.getTargetFundId();
  119. String fundName = fundAliasDO.getSourceFundName();
  120. String registerNumber = fundAliasDO.getSourceRegisterNumber();
  121. try {
  122. long startTime = System.currentTimeMillis();
  123. // 1.更新净值nav
  124. updateFundNav(fundId, fundName, registerNumber);
  125. // 2.更新资产净值asset
  126. updateFundAsset(fundId, fundName, registerNumber);
  127. log.info("更新基金nav和asset完成 -> fundId:{}, cost:{}ms", fundId, (System.currentTimeMillis()-startTime));
  128. } catch (Exception e) {
  129. log.error("更新基金nav和asset异常 fundId:{}, fundName:{}, registerNumber:{} -> 堆栈信息:{}", fundId, fundName, registerNumber, ExceptionUtil.stacktraceToString(e));
  130. }
  131. }
  132. }
  133. private void updateFundAsset(String fundId, String fundName, String registerNumber) {
  134. List<EmailFundAssetDO> emailFundAssetDOList = emailFundAssetMapper.queryByNameAndReg(fundName, registerNumber);
  135. if (CollUtil.isEmpty(emailFundAssetDOList)) {
  136. return;
  137. }
  138. List<String> priceDateList = emailFundAssetDOList.stream().filter(e -> e.getPriceDate() != null)
  139. .map(e -> cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD)).distinct().toList();
  140. if (CollUtil.isEmpty(priceDateList)) {
  141. return;
  142. }
  143. // 不处理基金本身已存在的净值日期
  144. List<String> dateList = assetMapper.queryFundNavByDate(fundId, priceDateList);
  145. emailFundAssetDOList = emailFundAssetDOList.stream().filter(e -> !dateList.contains(cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).toList();
  146. List<AssetDO> assetDOList = emailFundAssetDOList.stream().map(e -> {
  147. AssetDO assetDO = BeanUtil.copyProperties(e, AssetDO.class);
  148. assetDO.setId(null);
  149. assetDO.setFundId(fundId);
  150. assetDO.setCreateTime(new Date());
  151. assetDO.setUpdateTime(new Date());
  152. return assetDO;
  153. }).toList();
  154. if (CollUtil.isNotEmpty(assetDOList)) {
  155. assetMapper.batchInsert(assetDOList);
  156. }
  157. List<Integer> emailFundAssetIdList = emailFundAssetDOList.stream().map(EmailFundAssetDO::getId).toList();
  158. emailFundAssetMapper.updateFundIdByIds(fundId, emailFundAssetIdList);
  159. }
  160. private void updateFundNav(String fundId, String fundName, String registerNumber) {
  161. List<EmailFundNavDO> emailFundNavDOList = emailFundNavMapper.queryByNameAndReg(fundName, registerNumber);
  162. if (CollUtil.isEmpty(emailFundNavDOList)) {
  163. return;
  164. }
  165. // 1.将数据插入到nav表 -> 更新email_fund_nav的fund_id字段
  166. List<String> priceDateList = emailFundNavDOList.stream().filter(e -> e.getPriceDate() != null).map(e -> cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD)).distinct().toList();
  167. if (CollUtil.isEmpty(priceDateList)) {
  168. return;
  169. }
  170. // 不处理基金本身已存在的净值日期
  171. List<String> dateList = navMapper.queryFundNavByDate(fundId, priceDateList);
  172. emailFundNavDOList = emailFundNavDOList.stream().filter(e -> !dateList.contains(cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).toList();
  173. List<NavDO> navDOList = emailFundNavDOList.stream().map(e -> {
  174. NavDO navDO = BeanUtil.copyProperties(e, NavDO.class);
  175. navDO.setId(null);
  176. navDO.setFundId(fundId);
  177. navDO.setCreateTime(new Date());
  178. navDO.setUpdateTime(new Date());
  179. return navDO;
  180. }).toList();
  181. if (CollUtil.isNotEmpty(navDOList)) {
  182. navMapper.batchInsert(navDOList);
  183. }
  184. List<Integer> emailFundNavIdList = emailFundNavDOList.stream().map(EmailFundNavDO::getId).toList();
  185. emailFundNavMapper.updateFundIdByIds(fundId, emailFundNavIdList);
  186. }
  187. }