package com.simuwang.manage.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.ExceptionUtil; import com.simuwang.base.common.conts.DateConst; import com.simuwang.base.common.support.MybatisPage; import com.simuwang.base.common.util.StringUtil; import com.simuwang.base.mapper.*; import com.simuwang.base.pojo.dos.*; import com.simuwang.base.pojo.dto.query.FundAliasPageQuery; import com.simuwang.base.pojo.vo.FundAliasVO; import com.simuwang.base.pojo.vo.IdListVO; import com.simuwang.manage.service.EmailFundAssetService; import com.simuwang.manage.service.EmailFundNavService; import com.simuwang.manage.service.EmailFundInfoService; import com.simuwang.manage.service.FundAliasService; import com.simuwang.shiro.utils.UserUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * FileName: FunAliasServiceImpl * Author: chenjianhua * Date: 2024/9/14 16:18 * Description: ${DESCRIPTION} */ @Service public class FundAliasServiceImpl implements FundAliasService { private static final Logger log = LoggerFactory.getLogger(FundAliasServiceImpl.class); @Autowired private FundAliasMapper fundAliasMapper; @Autowired private EmailFundNavMapper emailFundNavMapper; @Autowired private EmailFundAssetMapper emailFundAssetMapper; @Autowired private CompanyInformationMapper companyInformationMapper; @Autowired private EmailFundInfoService emailFundInfoService; @Autowired private EmailFundNavService emailFileNavService; @Autowired private EmailFundAssetService emailFundAssetService; @Autowired private NavMapper navMapper; @Autowired private AssetMapper assetMapper; @Override public MybatisPage searchFundAlias(FundAliasPageQuery fundAliasPageQuery) { List fundAliasDOList = fundAliasMapper.searchFundAlias(fundAliasPageQuery); List fundAliasVOList = fundAliasDOList.stream().map(FundAliasDO::toVo).collect(Collectors.toList()); for(FundAliasVO vo : fundAliasVOList){ //异常净值数量 Integer navTotal = emailFundNavMapper.countNoStoreNav(vo.getSourceFundName(),vo.getSourceRegisterNumber()); vo.setNavTotal(navTotal); //异常净值数量 Integer assetTotal = emailFundAssetMapper.countNoStoreAsset(vo.getSourceFundName(),vo.getSourceRegisterNumber()); vo.setAssetTotal(assetTotal); //最新净值日期 vo.setPriceDate(emailFundNavMapper.getMaxPriceDate(vo.getSourceFundName())); } long total = fundAliasMapper.countFundAlias(fundAliasPageQuery); return MybatisPage.of(total,fundAliasVOList); } @Override public FundAliasVO searchFundAliasById(Integer id) { FundAliasDO fundAliasDO = fundAliasMapper.searchFundAliasById(id); if(StringUtil.isNull(fundAliasDO)){ return null; } return fundAliasDO.toVo(); } @Override public void saveFundAlias(FundAliasVO fundAliasVO) { FundAliasDO fundAliasDO = new FundAliasDO(); fundAliasDO.setSourceFundName(fundAliasVO.getSourceFundName()); fundAliasDO.setTargetFundId(fundAliasVO.getTargetFundId()); fundAliasDO.setSourceRegisterNumber(fundAliasVO.getSourceRegisterNumber()); fundAliasDO.setTargetFundName(fundAliasVO.getTargetFundName()); fundAliasDO.setTargetRegisterNumber(fundAliasVO.getTargetRegisterNumber()); fundAliasDO.setId(fundAliasVO.getId()); fundAliasDO.setIsvalid(1); fundAliasDO.setUpdaterId(UserUtils.getLoginUser().getUserId()); fundAliasDO.setCreatorId(UserUtils.getLoginUser().getUserId()); fundAliasDO.setUpdateTime(new Date()); FundAliasDO oldFundAliasDO = fundAliasMapper.searchFundAliasById(fundAliasVO.getId()); String oldFundId = oldFundAliasDO.getTargetFundId(); fundAliasMapper.saveFundAlias(fundAliasDO); //将采集的净值数据匹配之后重新入库 emailFileNavService.reparseFileNav(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber(),fundAliasVO.getTargetFundId(),oldFundId); //将采集的规模数据匹配之后重新入库 emailFundAssetService.reparseFileAsset(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber(),fundAliasVO.getTargetFundId(),oldFundId); //处理采集数据,将采集的数据入库 emailFundInfoService.reparseValuationFile(fundAliasVO.getSourceFundName(),fundAliasVO.getSourceRegisterNumber()); } @Override public void deleteFundAlias(IdListVO idListVO) { List idList = idListVO.getIdList(); Integer userId = UserUtils.getLoginUser().getUserId(); if(idList.size() > 0){ fundAliasMapper.batchDelete(idList,userId); } } @Override public void updateFundNavAndAsset(String date) { // 获取别名管理表信息fund_alias List fundAliasDOList = fundAliasMapper.queryByLatestDate(date); if (CollUtil.isEmpty(fundAliasDOList)) { return; } // 查询基金名称和备案编码对应的邮件净值表email_fund_nav(异常情况为未匹配基金ID && is_stored=0未入库) for (FundAliasDO fundAliasDO : fundAliasDOList) { String fundId = fundAliasDO.getTargetFundId(); String fundName = fundAliasDO.getSourceFundName(); String registerNumber = fundAliasDO.getSourceRegisterNumber(); try { long startTime = System.currentTimeMillis(); // 1.更新净值nav updateFundNav(fundId, fundName, registerNumber); // 2.更新资产净值asset updateFundAsset(fundId, fundName, registerNumber); log.info("更新基金nav和asset完成 -> fundId:{}, cost:{}ms", fundId, (System.currentTimeMillis()-startTime)); } catch (Exception e) { log.error("更新基金nav和asset异常 fundId:{}, fundName:{}, registerNumber:{} -> 堆栈信息:{}", fundId, fundName, registerNumber, ExceptionUtil.stacktraceToString(e)); } } } private void updateFundAsset(String fundId, String fundName, String registerNumber) { List emailFundAssetDOList = emailFundAssetMapper.queryByNameAndReg(fundName, registerNumber); if (CollUtil.isEmpty(emailFundAssetDOList)) { return; } List priceDateList = emailFundAssetDOList.stream().filter(e -> e.getPriceDate() != null) .map(e -> cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD)).distinct().toList(); if (CollUtil.isEmpty(priceDateList)) { return; } // 不处理基金本身已存在的净值日期 List dateList = assetMapper.queryFundNavByDate(fundId, priceDateList); emailFundAssetDOList = emailFundAssetDOList.stream().filter(e -> !dateList.contains(cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).toList(); List assetDOList = emailFundAssetDOList.stream().map(e -> { AssetDO assetDO = BeanUtil.copyProperties(e, AssetDO.class); assetDO.setId(null); assetDO.setFundId(fundId); assetDO.setCreateTime(new Date()); assetDO.setUpdateTime(new Date()); return assetDO; }).toList(); if (CollUtil.isNotEmpty(assetDOList)) { assetMapper.batchInsert(assetDOList); } List emailFundAssetIdList = emailFundAssetDOList.stream().map(EmailFundAssetDO::getId).toList(); emailFundAssetMapper.updateFundIdByIds(fundId, emailFundAssetIdList); } private void updateFundNav(String fundId, String fundName, String registerNumber) { List emailFundNavDOList = emailFundNavMapper.queryByNameAndReg(fundName, registerNumber); if (CollUtil.isEmpty(emailFundNavDOList)) { return; } // 1.将数据插入到nav表 -> 更新email_fund_nav的fund_id字段 List priceDateList = emailFundNavDOList.stream().filter(e -> e.getPriceDate() != null).map(e -> cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD)).distinct().toList(); if (CollUtil.isEmpty(priceDateList)) { return; } // 不处理基金本身已存在的净值日期 List dateList = navMapper.queryFundNavByDate(fundId, priceDateList); emailFundNavDOList = emailFundNavDOList.stream().filter(e -> !dateList.contains(cn.hutool.core.date.DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).toList(); List navDOList = emailFundNavDOList.stream().map(e -> { NavDO navDO = BeanUtil.copyProperties(e, NavDO.class); navDO.setId(null); navDO.setFundId(fundId); navDO.setCreateTime(new Date()); navDO.setUpdateTime(new Date()); return navDO; }).toList(); if (CollUtil.isNotEmpty(navDOList)) { navMapper.batchInsert(navDOList); } List emailFundNavIdList = emailFundNavDOList.stream().map(EmailFundNavDO::getId).toList(); emailFundNavMapper.updateFundIdByIds(fundId, emailFundNavIdList); } }