Procházet zdrojové kódy

feat:支持导入基金名称和基金id匹配表

mozuwen před 1 měsícem
rodič
revize
be6d01b79a

+ 5 - 0
service-base/src/main/java/com/simuwang/base/common/util/FileUtil.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.common.util;
 
 import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
 import jakarta.mail.Part;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,4 +67,8 @@ public class FileUtil {
         bos.close();
         is.close();
     }
+
+    public static boolean isExcel(String fileName){
+        return StrUtil.isNotBlank(fileName) && (fileName.endsWith(".xls") || fileName.endsWith(".xlsx"));
+    }
 }

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

@@ -35,4 +35,6 @@ public interface FundAliasMapper {
     void batchInsert(@Param("itemDoList") List<FundAliasDO> fundAliasDOS);
 
     List<FundAliasDO> queryByLatestDate(@Param("updateTime") String updateTime);
+
+    int batchUpdate(@Param("itemDoList") List<FundAliasDO> fundAliasDOList);
 }

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

@@ -174,4 +174,28 @@
           and target_fund_id is not null
           and updatetime >= #{updateTime}
     </select>
+
+    <update id="batchUpdate">
+        <foreach collection="itemDoList" item="item">
+            UPDATE fund_alias
+            SET target_fund_id = #{item.targetFundId},
+            updatetime = #{item.updateTime}
+            WHERE isvalid = 1
+            <if test="item.sourceFundName!=null">
+                and source_fund_name = #{item.sourceFundName}
+            </if>
+            <if test="item.sourceFundName==null">
+                and source_fund_name = null
+            </if>
+
+            <if test="item.sourceRegisterNumber!=null and item.sourceRegisterNumber!='null'">
+                AND source_register_number = #{item.sourceRegisterNumber}
+            </if>
+            <if test="item.sourceRegisterNumber==null">
+                AND source_register_number = null
+            </if>
+            and target_fund_id is null;
+        </foreach>
+    </update>
+
 </mapper>

+ 4 - 0
service-manage/pom.xml

@@ -27,6 +27,10 @@
             <groupId>com.simuwang</groupId>
             <artifactId>service-calc</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
     </dependencies>
 
 <!--    <build>-->

+ 20 - 5
service-manage/src/main/java/com/simuwang/manage/api/email/FundAliasController.java

@@ -2,10 +2,8 @@ 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;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 @RestController
 @RequestMapping("/v1/fund-alias")
@@ -17,10 +15,27 @@ public class FundAliasController {
         this.fundAliasService = fundAliasService;
     }
 
+    /**
+     * 通过别名更新基金净值和规模数据
+     *
+     * @param date 日期
+     * @return /
+     */
     @GetMapping("/update-fund-nav")
-    public ResultVo<Void> updateFundNavAndAsset(@RequestParam(name = "date") String date){
+    public ResultVo<Void> updateFundNavAndAsset(@RequestParam(name = "date") String date) {
         fundAliasService.updateFundNavAndAsset(date);
         return null;
     }
 
+    /**
+     * 导入文件更新基金别名
+     *
+     * @param file 文件
+     * @return /
+     */
+    @PostMapping("/update")
+    public ResultVo<String> updateFundAlias(@RequestParam(name = "file") MultipartFile file) {
+        return ResultVo.ok(fundAliasService.updateFundAlias(file));
+    }
+
 }

+ 17 - 0
service-manage/src/main/java/com/simuwang/manage/dto/FundAliasDTO.java

@@ -0,0 +1,17 @@
+package com.simuwang.manage.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class FundAliasDTO {
+
+    @ExcelProperty("基金名称")
+    private String sourceFundName;
+
+    @ExcelProperty("备案编码")
+    private String sourceRegisterNumber;
+
+    @ExcelProperty("基金id")
+    private String targetFundId;
+}

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

@@ -4,6 +4,7 @@ import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.vo.FundAliasVO;
 import com.simuwang.base.pojo.vo.IdListVO;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * FileName: FunAliasService
@@ -21,4 +22,6 @@ public interface FundAliasService {
     void deleteFundAlias(IdListVO idListVO);
 
     void updateFundNavAndAsset(String date);
+
+    String updateFundAlias(MultipartFile file);
 }

+ 37 - 1
service-manage/src/main/java/com/simuwang/manage/service/impl/FundAliasServiceImpl.java

@@ -3,18 +3,23 @@ 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.alibaba.excel.EasyExcel;
 import com.simuwang.base.common.conts.DateConst;
+import com.simuwang.base.common.exception.APIException;
 import com.simuwang.base.common.support.MybatisPage;
+import com.simuwang.base.common.util.FileUtil;
 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.dto.FundAliasDTO;
 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.manage.service.listener.FundAliasReadListener;
 import com.simuwang.shiro.utils.UserUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,8 +27,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -157,6 +163,36 @@ public class FundAliasServiceImpl implements FundAliasService {
         }
     }
 
+    @Override
+    public String updateFundAlias(MultipartFile file) {
+        String filename = file.getOriginalFilename();
+        boolean isExcel = FileUtil.isExcel(filename);
+        if (!isExcel) {
+            return "the file format is incorrect. Please upload an Excel file";
+        }
+        List<FundAliasDTO> fundAliasDTOList = CollUtil.newArrayList();
+        try {
+            EasyExcel.read(file.getInputStream(), FundAliasDTO.class, new FundAliasReadListener(fundAliasDTOList)).sheet().doRead();
+        } catch (IOException e) {
+            log.error("read exception -> stack trace is :{}", ExceptionUtil.stacktraceToString(e));
+            throw new APIException("There is an exception when reading the file.");
+        }
+        if (CollUtil.isEmpty(fundAliasDTOList)) {
+            return "the content of the file is empty.";
+        }
+
+        Date date = new Date();
+        List<FundAliasDO> fundAliasDOList = fundAliasDTOList.stream().map(e -> {
+            FundAliasDO fundAliasDO = BeanUtil.copyProperties(e, FundAliasDO.class);
+            fundAliasDO.setUpdateTime(date);
+            return fundAliasDO;
+        }).toList();
+        if (CollUtil.isNotEmpty(fundAliasDOList)) {
+          fundAliasMapper.batchUpdate(fundAliasDOList);
+        }
+        return "update success";
+    }
+
     private void updateFundAsset(String fundId, String fundName, String registerNumber) {
         List<EmailFundAssetDO> emailFundAssetDOList = emailFundAssetMapper.queryByNameAndReg(fundName, registerNumber);
         if (CollUtil.isEmpty(emailFundAssetDOList)) {

+ 39 - 0
service-manage/src/main/java/com/simuwang/manage/service/listener/FundAliasReadListener.java

@@ -0,0 +1,39 @@
+package com.simuwang.manage.service.listener;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.read.listener.ReadListener;
+import com.simuwang.manage.dto.FundAliasDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class FundAliasReadListener implements ReadListener<FundAliasDTO> {
+
+    private static final Logger log = LoggerFactory.getLogger(FundAliasReadListener.class);
+
+    private final List<FundAliasDTO> dataList;
+
+    public FundAliasReadListener(List<FundAliasDTO> dataList) {
+        this.dataList = dataList;
+    }
+
+    @Override
+    public void invoke(FundAliasDTO data, AnalysisContext context) {
+        Integer rowIndex = context.readRowHolder().getRowIndex();
+        log.info("row index : {}, data : {}", rowIndex, data);
+        if (data != null && StrUtil.isNotBlank(data.getTargetFundId())) {
+            this.dataList.add(data);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("read done, data size is : {}", dataList.size());
+    }
+
+}