Browse Source

feat:提供根据别名表直接更新nav和asset接口

mozuwen 1 tháng trước cách đây
mục cha
commit
4603397780

+ 4 - 0
service-base/src/main/java/com/simuwang/base/mapper/EmailFundAssetMapper.java

@@ -31,4 +31,8 @@ public interface EmailFundAssetMapper {
     List<EmailFundAssetDO> selectAssetByFundId(@Param("fundId") String sourceFundId);
 
     Long countEmailAssetTotal();
+
+    List<EmailFundAssetDO> queryByNameAndReg(@Param("fundName") String sourceFundName, @Param("registerNumber") String registerNumber);
+
+    void updateFundIdByIds(@Param("fundId") String fundId, @Param("idList") List<Integer> idList);
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/mapper/EmailFundNavMapper.java

@@ -35,4 +35,8 @@ public interface EmailFundNavMapper {
     List<EmailFundNavDO> selectNavByFundId(@Param("fundId") String sourceFundId);
 
     Long countEmailNavTotal();
+
+    List<EmailFundNavDO> queryByNameAndReg(@Param("fundName") String sourceFundName, @Param("registerNumber") String registerNumber);
+
+    void updateFundIdByIds(@Param("fundId") String fundId, @Param("idList") List<Integer> idList);
 }

+ 1 - 0
service-base/src/main/java/com/simuwang/base/mapper/FundAliasMapper.java

@@ -34,4 +34,5 @@ public interface FundAliasMapper {
 
     void batchInsert(@Param("itemDoList") List<FundAliasDO> fundAliasDOS);
 
+    List<FundAliasDO> queryByLatestDate(@Param("updateTime") String updateTime);
 }

+ 22 - 0
service-base/src/main/resources/mapper/EmailFundAssetMapper.xml

@@ -239,4 +239,26 @@
           and file_id = #{fileId}
     </delete>
 
+    <select id="queryByNameAndReg" resultMap="BaseResultMap">
+        select *
+        from email_fund_asset
+        where isvalid = 1
+          and fund_name = #{fundName}
+          and register_number = #{registerNumber}
+          and fund_id is null
+          and exception_status = 3
+          and is_stored = 0
+    </select>
+
+    <update id="updateFundIdByIds">
+        update email_fund_asset
+        set fund_id = #{fundId},
+        updatetime = now(),
+        exception_status = 1,
+        is_stored = 1
+        where id in
+        <foreach collection="idList" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
 </mapper>

+ 21 - 0
service-base/src/main/resources/mapper/EmailFundNavMapper.xml

@@ -276,5 +276,26 @@
         select count(1) from email_fund_nav where isvalid=1
     </select>
 
+    <select id="queryByNameAndReg" resultMap="BaseResultMap">
+        select *
+        from email_fund_nav
+        where isvalid = 1
+          and fund_name = #{fundName}
+          and register_number = #{registerNumber}
+          and fund_id is null
+          and exception_status = 3
+          and is_stored = 0
+    </select>
 
+    <update id="updateFundIdByIds">
+        update email_fund_nav
+        set fund_id = #{fundId},
+        updatetime = now(),
+        exception_status = 1,
+        is_stored = 1
+        where id in
+        <foreach collection="idList" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
 </mapper>

+ 7 - 0
service-base/src/main/resources/mapper/FundAliasMapper.xml

@@ -167,4 +167,11 @@
         </foreach>
     </insert>
 
+    <select id="queryByLatestDate" resultMap="BaseResultMap">
+        select *
+        from fund_alias
+        where isvalid = 1
+          and target_fund_id is not null
+          and updatetime >= #{updateTime}
+    </select>
 </mapper>

+ 26 - 0
service-manage/src/main/java/com/simuwang/manage/api/email/FundAliasController.java

@@ -0,0 +1,26 @@
+package com.simuwang.manage.api.email;
+
+import com.simuwang.manage.service.FundAliasService;
+import com.smppw.common.pojo.ResultVo;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/v1/fund-alias")
+public class FundAliasController {
+
+    private final FundAliasService fundAliasService;
+
+    public FundAliasController(FundAliasService fundAliasService) {
+        this.fundAliasService = fundAliasService;
+    }
+
+    @GetMapping("/update-fund-nav")
+    public ResultVo<Void> updateFundNavAndAsset(@RequestParam(name = "date") String date){
+        fundAliasService.updateFundNavAndAsset(date);
+        return null;
+    }
+
+}

+ 2 - 0
service-manage/src/main/java/com/simuwang/manage/service/FundAliasService.java

@@ -19,4 +19,6 @@ public interface FundAliasService {
     void saveFundAlias(FundAliasVO fundAliasVO);
 
     void deleteFundAlias(IdListVO idListVO);
+
+    void updateFundNavAndAsset(String date);
 }

+ 100 - 5
service-manage/src/main/java/com/simuwang/manage/service/impl/FundAliasServiceImpl.java

@@ -1,12 +1,12 @@
 package com.simuwang.manage.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+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.CompanyInformationMapper;
-import com.simuwang.base.mapper.EmailFundAssetMapper;
-import com.simuwang.base.mapper.EmailFundNavMapper;
-import com.simuwang.base.mapper.FundAliasMapper;
-import com.simuwang.base.pojo.dos.FundAliasDO;
+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;
@@ -15,6 +15,8 @@ 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;
 
@@ -31,6 +33,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class FundAliasServiceImpl implements FundAliasService {
+
+    private static final Logger log = LoggerFactory.getLogger(FundAliasServiceImpl.class);
     @Autowired
     private FundAliasMapper fundAliasMapper;
 
@@ -52,6 +56,12 @@ public class FundAliasServiceImpl implements FundAliasService {
     @Autowired
     private EmailFundAssetService emailFundAssetService;
 
+    @Autowired
+    private NavMapper navMapper;
+
+    @Autowired
+    private AssetMapper assetMapper;
+
     @Override
     public MybatisPage<FundAliasVO> searchFundAlias(FundAliasPageQuery fundAliasPageQuery) {
         List<FundAliasDO> fundAliasDOList = fundAliasMapper.searchFundAlias(fundAliasPageQuery);
@@ -112,4 +122,89 @@ public class FundAliasServiceImpl implements FundAliasService {
             fundAliasMapper.batchDelete(idList,userId);
         }
     }
+
+    @Override
+    public void updateFundNavAndAsset(String date) {
+        // 获取别名管理表信息fund_alias
+        List<FundAliasDO> 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);
+            }
+        }
+    }
+
+    private void updateFundAsset(String fundId, String fundName, String registerNumber) {
+        List<EmailFundAssetDO> emailFundAssetDOList = emailFundAssetMapper.queryByNameAndReg(fundName, registerNumber);
+        if (CollUtil.isEmpty(emailFundAssetDOList)) {
+            return;
+        }
+        List<String> 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<String> 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<AssetDO> 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<Integer> emailFundAssetIdList = emailFundAssetDOList.stream().map(EmailFundAssetDO::getId).toList();
+        emailFundAssetMapper.updateFundIdByIds(fundId, emailFundAssetIdList);
+    }
+
+    private void updateFundNav(String fundId, String fundName, String registerNumber) {
+        List<EmailFundNavDO> emailFundNavDOList = emailFundNavMapper.queryByNameAndReg(fundName, registerNumber);
+        if (CollUtil.isEmpty(emailFundNavDOList)) {
+            return;
+        }
+        // 1.将数据插入到nav表 -> 更新email_fund_nav的fund_id字段
+        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();
+        if (CollUtil.isEmpty(priceDateList)) {
+            return;
+        }
+        // 不处理基金本身已存在的净值日期
+        List<String> 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<NavDO> 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<Integer> emailFundNavIdList = emailFundNavDOList.stream().map(EmailFundNavDO::getId).toList();
+        emailFundNavMapper.updateFundIdByIds(fundId, emailFundNavIdList);
+    }
 }