Sfoglia il codice sorgente

Merge branch 'develop' of http://112.74.196.215:3000/Tech2/data-daq into develop

wangzaijun 7 mesi fa
parent
commit
532d3cbfed
40 ha cambiato i file con 612 aggiunte e 93 eliminazioni
  1. 5 5
      service-base/src/main/java/com/simuwang/base/common/enums/EmailCron.java
  2. 2 2
      service-base/src/main/java/com/simuwang/base/config/ShiroConfig.java
  3. 18 1
      service-base/src/main/java/com/simuwang/base/config/ThreadPoolConfig.java
  4. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/AssetMapper.java
  5. 3 0
      service-base/src/main/java/com/simuwang/base/mapper/EmailParseInfoMapper.java
  6. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/FundAliasMapper.java
  7. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/MailboxInfoMapper.java
  8. 1 0
      service-base/src/main/java/com/simuwang/base/mapper/NavMapper.java
  9. 19 2
      service-base/src/main/java/com/simuwang/base/pojo/dos/MailboxInfoDO.java
  10. 46 0
      service-base/src/main/java/com/simuwang/base/pojo/dto/EmailInfoDTO.java
  11. 2 2
      service-base/src/main/java/com/simuwang/base/pojo/valuation/AssetsValuationDetails.java
  12. 31 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/FundAssetVO.java
  13. 31 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/FundNavVO.java
  14. 2 2
      service-base/src/main/java/com/simuwang/base/pojo/vo/FundReportFrequencyVO.java
  15. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/MailboxInfoTableVO.java
  16. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/MailboxInfoVO.java
  17. 17 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/OpenStatusVO.java
  18. 6 0
      service-base/src/main/resources/mapper/AssetMapper.xml
  19. 18 0
      service-base/src/main/resources/mapper/EmailParseInfoMapper.xml
  20. 5 1
      service-base/src/main/resources/mapper/FundAliasMapper.xml
  21. 5 0
      service-base/src/main/resources/mapper/MailBoxInfoMapper.xml
  22. 9 0
      service-base/src/main/resources/mapper/NavMapper.xml
  23. 9 0
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiService.java
  24. 74 14
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiServiceImpl.java
  25. 15 1
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java
  26. 7 3
      service-daq/src/main/java/com/simuwang/daq/service/FundService.java
  27. 2 1
      service-daq/src/main/java/com/simuwang/daq/service/ValuationEmailParser.java
  28. 14 6
      service-daq/src/main/java/com/simuwang/daq/service/ValuationParseService.java
  29. 7 0
      service-deploy/src/main/test/java/com/simuwang/datadaq/DataTrusteeApplicationTests.java
  30. 38 0
      service-manage/src/main/java/com/simuwang/manage/api/email/EmailAssetDetailController.java
  31. 41 10
      service-manage/src/main/java/com/simuwang/manage/api/email/EmailConfigController.java
  32. 3 12
      service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailDetailController.java
  33. 42 0
      service-manage/src/main/java/com/simuwang/manage/api/email/NavController.java
  34. 4 7
      service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailController.java
  35. 18 0
      service-manage/src/main/java/com/simuwang/manage/api/fund/FunAliasController.java
  36. 1 3
      service-manage/src/main/java/com/simuwang/manage/api/fund/FundInformationController.java
  37. 8 2
      service-manage/src/main/java/com/simuwang/manage/service/EmailConfigService.java
  38. 6 0
      service-manage/src/main/java/com/simuwang/manage/service/ParseEmailDetailService.java
  39. 32 8
      service-manage/src/main/java/com/simuwang/manage/service/impl/EmailConfigServiceImpl.java
  40. 63 9
      service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailDetailServiceImpl.java

+ 5 - 5
service-base/src/main/java/com/simuwang/base/common/enums/EmailCron.java

@@ -9,18 +9,18 @@ import java.util.stream.Stream;
  * Description: ${DESCRIPTION}
  */
 public enum EmailCron {
-    EVERY_HOUR("1", "0 0 0/1 * * *"), ONE_AM("2", "0 0 13 * * *");
+    EVERY_HOUR(1, "0 0 0/1 * * *"), ONE_AM(2, "0 0 1 * * *");
 
-    private final String text;
+    private final Integer text;
     private final String cron;
 
-    EmailCron(String text, String cron)
+    EmailCron(Integer text, String cron)
     {
         this.text = text;
         this.cron = cron;
     }
 
-    public static EmailCron getEmailCronByText(String text) {
+    public static EmailCron getEmailCronByText(Integer text) {
         if (null == text){
             return null;
         }
@@ -36,7 +36,7 @@ public enum EmailCron {
         return Stream.of(EmailCron.values()).filter(e -> e.cron.equals(cron)).findFirst().orElse(null);
     }
 
-    public String getText()
+    public Integer getText()
     {
         return text;
     }

+ 2 - 2
service-base/src/main/java/com/simuwang/base/config/ShiroConfig.java

@@ -149,8 +149,8 @@ public class ShiroConfig {
         map.put("/v1/login", "anon");
         map.put("/v1/rsa-key", "anon");
         map.put("/test/**", "anon");
-        map.put("/v1/**", "jwt");
-        map.put("/**", "jwt");
+        map.put("/v1/**", "anon");
+        map.put("/**", "anon");
         return map;
     }
 

+ 18 - 1
service-base/src/main/java/com/simuwang/base/config/ThreadPoolConfig.java

@@ -15,7 +15,7 @@ public class ThreadPoolConfig {
     public ThreadPoolTaskExecutor valuationExecutor() {
         ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
         int cpuSize = Runtime.getRuntime().availableProcessors();
-        cpuSize = Math.max(cpuSize, 1);
+        cpuSize = Math.max(cpuSize/2, 1);
 
         taskExecutor.setCorePoolSize(cpuSize);
         taskExecutor.setMaxPoolSize(50);
@@ -32,4 +32,21 @@ public class ThreadPoolConfig {
         return taskExecutor;
     }
 
+    @Bean("asyncExecutor")
+    public ThreadPoolTaskExecutor asyncExecutor() {
+        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+        taskExecutor.setCorePoolSize(2);
+        taskExecutor.setMaxPoolSize(50);
+        taskExecutor.setQueueCapacity(50);
+        taskExecutor.setKeepAliveSeconds(60);
+        taskExecutor.setThreadNamePrefix("asyncExecutor--");
+        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
+        taskExecutor.setAwaitTerminationSeconds(60);
+
+        // 修改拒绝策略为使用当前线程执行
+        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 初始化线程池
+        taskExecutor.initialize();
+        return taskExecutor;
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.simuwang.base.mapper;
 
 import com.simuwang.base.pojo.dos.AssetDO;
+import com.simuwang.base.pojo.vo.FundAssetVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -15,4 +16,5 @@ public interface AssetMapper {
 
     List<String> queryFundNavByDate(@Param("fundId") String fundId, @Param("priceDateList") List<String> priceDateList);
 
+    AssetDO queryFundAsset(AssetDO fundAssetVO);
 }

+ 3 - 0
service-base/src/main/java/com/simuwang/base/mapper/EmailParseInfoMapper.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.mapper;
 
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
+import com.simuwang.base.pojo.dto.EmailInfoDTO;
 import com.simuwang.base.pojo.dto.query.EmailParseQuery;
 import com.simuwang.base.pojo.vo.EmailParseInfoVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -27,4 +28,6 @@ public interface EmailParseInfoMapper {
     long countEmailList(EmailParseQuery emailParseQuery);
 
     void updateParseTime(@Param("id") Integer id, @Param("parseDate") Date parseDate);
+
+    List<EmailInfoDTO> queryValuationEmailByFileId(@Param("fileIdList") List<Integer> fileIdList);
 }

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

@@ -14,4 +14,6 @@ public interface FundAliasMapper {
     List<FundAliasDO> queryFundByName(@Param("fundName") String fundName);
 
     List<FundAliasDO> queryFundByRegisterNumber(@Param("registerNumber") String registerNumber);
+
+    void insert(@Param("fundName") String fundName, @Param("registerNumber") String registerNumber);
 }

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

@@ -26,4 +26,6 @@ public interface MailboxInfoMapper extends BaseMapper<MailboxInfoDO> {
     MailboxInfoDO checkEmailUnique(@Param("email") String email);
 
     long countEmailConfig(EmailPageQuery emailPageQuery);
+
+    MailboxInfoDO searchEmailConfigById(@Param("id")Integer id);
 }

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

@@ -15,4 +15,5 @@ public interface NavMapper {
 
     List<String> queryFundNavByDate(@Param("fundId") String fundId, @Param("priceDateList") List<String> priceDateList);
 
+    NavDO queryFundNav(NavDO navDO);
 }

+ 19 - 2
service-base/src/main/java/com/simuwang/base/pojo/dos/MailboxInfoDO.java

@@ -3,7 +3,9 @@ package com.simuwang.base.pojo.dos;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.simuwang.base.common.enums.EmailCron;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
+import com.simuwang.base.pojo.vo.MailboxInfoVO;
 import lombok.Data;
 
 import java.util.Date;
@@ -93,13 +95,28 @@ public class MailboxInfoDO {
     private Date updateTime;
 
 
-    public MailboxInfoTableVO toVo() {
+    public MailboxInfoTableVO toTableVo() {
         MailboxInfoTableVO vo =new MailboxInfoTableVO();
-        vo.setCron(this.cron);
+        vo.setCron(EmailCron.getEmailCronByCron(this.cron).getText());
         vo.setId(this.id);
         vo.setEmail(this.email);
         vo.setDescription(this.description);
         vo.setOpenStatus(this.openStatus);
         return vo;
     }
+
+    public MailboxInfoVO toVo() {
+        MailboxInfoVO vo =new MailboxInfoVO();
+        vo.setCron(EmailCron.getEmailCronByCron(this.cron).getText());
+        vo.setId(this.id);
+        vo.setEmail(this.email);
+        vo.setDescription(this.description);
+        vo.setOpenStatus(this.openStatus);
+        vo.setPort(this.port);
+        vo.setServer(this.server);
+        vo.setProtocol(this.protocol);
+        vo.setType(this.type);
+        vo.setPassword(this.password);
+        return vo;
+    }
 }

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

@@ -0,0 +1,46 @@
+package com.simuwang.base.pojo.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class EmailInfoDTO {
+    /**
+     * 邮件id
+     */
+    private Integer id;
+    /**
+     * 文件id
+     */
+    private Integer fileId;
+    /**
+     * 邮箱地址
+     */
+    private String email;
+    /**
+     * 邮箱日期
+     */
+    private Date emailDate;
+    /**
+     * 邮件主题
+     */
+    private String emailTitle;
+    /**
+     * 邮件类型,1-净值,2-估值表,3-定期报告
+     */
+    private Integer emailType;
+    /**
+     * 解析状态
+     */
+    private Integer parseStatus;
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件地址
+     */
+    private String filePath;
+}

+ 2 - 2
service-base/src/main/java/com/simuwang/base/pojo/valuation/AssetsValuationDetails.java

@@ -135,7 +135,7 @@ public class AssetsValuationDetails {
 		this.type = type;
 	}
 
-	public double getTotalMarketValue() {
+	public Double getTotalMarketValue() {
 		return totalMarketValue;
 	}
 
@@ -143,7 +143,7 @@ public class AssetsValuationDetails {
 		this.totalMarketValue = totalMarketValue;
 	}
 
-	public double getNetAssetsValue() {
+	public Double getNetAssetsValue() {
 		return netAssetsValue;
 	}
 

+ 31 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/FundAssetVO.java

@@ -0,0 +1,31 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * FileName: NavAssetVo
+ * Author:   chenjianhua
+ * Date:     2024/9/14 11:11
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class FundAssetVO {
+    /**
+     * 基金id
+     */
+    private String fundId;
+    /**
+     * 规模日期
+     */
+    private String priceDate;
+    /**
+     * 资产份额
+     */
+    private BigDecimal assetShare;
+    /**
+     * 资产净值(基金规模)
+     */
+    private BigDecimal assetNet;
+}

+ 31 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/FundNavVO.java

@@ -0,0 +1,31 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * FileName: NavAssetVo
+ * Author:   chenjianhua
+ * Date:     2024/9/14 11:11
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class FundNavVO {
+    /**
+     * 基金id
+     */
+    private String fundId;
+    /**
+     * 规模日期
+     */
+    private String priceDate;
+    /**
+     * 单位净值
+     */
+    private BigDecimal nav;
+    /**
+     * 累计单位净值
+     */
+    private BigDecimal cumulativeNavWithdrawal;
+}

+ 2 - 2
service-base/src/main/java/com/simuwang/base/pojo/vo/FundReportFrequencyVO.java

@@ -20,11 +20,11 @@ public class FundReportFrequencyVO {
      */
     private String fundId;
     /**
-     * 净值报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频
+     * 净值报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频,-1无固定
      */
     private Integer navFrequency;
     /**
-     * 规模报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频
+     * 规模报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频,-1无固定
      */
     private Integer assetFrequency;
     /**

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/vo/MailboxInfoTableVO.java

@@ -15,7 +15,7 @@ public class MailboxInfoTableVO {
     /**
      * cron表达式
      */
-    private String cron;
+    private Integer cron;
     /**
      * 是否开启,0-不开启,1-开启
      */

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/vo/MailboxInfoVO.java

@@ -40,7 +40,7 @@ public class MailboxInfoVO {
     /**
      * cron表达式
      */
-    private String cron;
+    private Integer cron;
     /**
      * 是否开启,0-不开启,1-开启
      */

+ 17 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/OpenStatusVO.java

@@ -0,0 +1,17 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * FileName: OpenStatusVO
+ * Author:   chenjianhua
+ * Date:     2024/9/14 11:57
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class OpenStatusVO {
+
+    private Integer openStatus;
+
+    private Integer id;
+}

+ 6 - 0
service-base/src/main/resources/mapper/AssetMapper.xml

@@ -48,5 +48,11 @@
             #{priceDate}
         </foreach>
     </select>
+    <select id="queryFundAsset" resultMap="BaseResultMap"
+            parameterType="com.simuwang.base.pojo.dos.AssetDO">
+        select id,fund_id,price_date,asset_net,asset_share,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.asset where isvalid=1 and fund_id=#{fundId} and price_date=#{priceDate}
+    </select>
 
 </mapper>

+ 18 - 0
service-base/src/main/resources/mapper/EmailParseInfoMapper.xml

@@ -124,5 +124,23 @@
           and id = #{id}
     </update>
 
+    <select id="queryValuationEmailByFileId" resultType="com.simuwang.base.pojo.dto.EmailInfoDTO">
+        select t1.id as id,
+               t1.email as email,
+               t1.email_date as emailDate,
+               t1.email_title as emailTitle,
+               t1.email_type as emailType,
+               t2.id as fileId,
+               t2.file_name as fileName,
+               t2.file_path as filePath
+        from PPW_EMAIL.email_parse_info t1
+        join PPW_EMAIL.email_file_info t2 on t1.id = t2.email_id and t2.isvalid = 1
+        where t1.isvalid = 1
+          and t1.email_type = 2
+          and t2.id in
+        <foreach collection="fileIdList" item="fileId" index="index" open="(" separator="," close=")">
+        #{fileId}
+        </foreach>
+    </select>
 
 </mapper>

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

@@ -15,7 +15,6 @@
         <result column="updatetime" property="updateTime"/>
     </resultMap>
 
-
     <select id="queryFundByNameAndRegisterNumber" resultMap="BaseResultMap">
         select target_fund_id, target_fund_name, target_register_number
         from PPW_EMAIL.fund_alias
@@ -38,4 +37,9 @@
           and source_register_number = #{registerNumber}
     </select>
 
+    <insert id="insert">
+        insert into PPW_EMAIL.fund_alias(source_fund_name, source_register_number)
+        values (#{fundName}, #{registerNumber})
+    </insert>
+
 </mapper>

+ 5 - 0
service-base/src/main/resources/mapper/MailBoxInfoMapper.xml

@@ -55,5 +55,10 @@
             and email like concat('%',#{email},'%')
         </if>
     </select>
+    <select id="searchEmailConfigById" resultMap="BaseResultMap"
+            parameterType="java.lang.Integer">
+        <include refid="selectConfigVo"/>
+        where id = #{id}
+    </select>
 
 </mapper>

+ 9 - 0
service-base/src/main/resources/mapper/NavMapper.xml

@@ -50,6 +50,15 @@
             #{priceDate}
         </foreach>
     </select>
+    <select id="queryFundNav" resultMap="BaseResultMap"
+            parameterType="com.simuwang.base.pojo.dos.NavDO">
+        SELECT id, fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.nav
+        where isvalid = 1
+          and fund_id = #{fundId}
+          and price_date=#{priceDate}
+    </select>
 
 
 </mapper>

+ 9 - 0
service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiService.java

@@ -3,6 +3,7 @@ package com.simuwang.daq.service;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author mozuwen
@@ -27,4 +28,12 @@ public interface EmailParseApiService {
      */
     void reparseEmail(Integer emailId);
 
+
+    /**
+     * 重新解析指定估值表文件
+     *
+     * @param fileIdList 文件id列表
+     */
+    void reparseFile(List<Integer> fileIdList);
+
 }

+ 74 - 14
service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiServiceImpl.java

@@ -13,9 +13,12 @@ import com.simuwang.base.pojo.dos.EmailFileInfoDO;
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
 import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
 import com.simuwang.base.pojo.dto.EmailFundNavDTO;
+import com.simuwang.base.pojo.dto.EmailInfoDTO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import java.io.BufferedReader;
@@ -24,6 +27,7 @@ import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author mozuwen
@@ -38,12 +42,14 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
     private final EmailParseService emailParseService;
     private final EmailParseInfoMapper emailParseInfoMapper;
     private final EmailFileInfoMapper emailFileInfoMapper;
+    private final ThreadPoolTaskExecutor asyncExecutor;
 
     public EmailParseApiServiceImpl(EmailParseService emailParseService, EmailParseInfoMapper emailParseInfoMapper,
-                                    EmailFileInfoMapper emailFileInfoMapper) {
+                                    EmailFileInfoMapper emailFileInfoMapper, @Qualifier("asyncExecutor") ThreadPoolTaskExecutor asyncExecutor) {
         this.emailParseService = emailParseService;
         this.emailParseInfoMapper = emailParseInfoMapper;
         this.emailFileInfoMapper = emailFileInfoMapper;
+        this.asyncExecutor = asyncExecutor;
     }
 
     @Override
@@ -74,24 +80,78 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
 
         List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
         Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap = MapUtil.newHashMap();
-        for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
-            try {
-                List<EmailFundNavDTO> fundNavDTOList = emailParseService.parseEmail(emailContentInfoDTO, emailFieldMap);
-                fileNameNavMap.put(emailContentInfoDTO, fundNavDTOList);
-                emailFundNavDTOList.addAll(fundNavDTOList);
-            } catch (Exception e) {
-                log.error("重新解析邮件失败,邮件id:{},堆栈信息:{}", emailId, ExceptionUtil.stacktraceToString(e));
+        asyncExecutor.execute(() -> {
+            for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
+                try {
+                    List<EmailFundNavDTO> fundNavDTOList = emailParseService.parseEmail(emailContentInfoDTO, emailFieldMap);
+                    fileNameNavMap.put(emailContentInfoDTO, fundNavDTOList);
+                    emailFundNavDTOList.addAll(fundNavDTOList);
+                } catch (Exception e) {
+                    log.error("重新解析邮件失败,邮件id:{},堆栈信息:{}", emailId, ExceptionUtil.stacktraceToString(e));
+                }
             }
+            // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
+            emailParseService.saveRelatedTable(emailParseInfoDO.getEmail(), emailContentInfoDTOList, fileNameNavMap);
+        });
+    }
+
+    @Override
+    public void reparseFile(List<Integer> fileIdList) {
+        if (CollUtil.isEmpty(fileIdList)) {
+            return;
+        }
+        List<EmailInfoDTO> emailParseInfoDOList = emailParseInfoMapper.queryValuationEmailByFileId(fileIdList);
+        if (CollUtil.isEmpty(emailParseInfoDOList)) {
+            return;
         }
-        // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
-        emailParseService.saveRelatedTable(emailParseInfoDO.getEmail(), emailContentInfoDTOList, fileNameNavMap);
+        asyncExecutor.execute(() -> {
+            Map<Integer, List<EmailInfoDTO>> emailIdFileMap = emailParseInfoDOList.stream().collect(Collectors.groupingBy(EmailInfoDTO::getId));
+            for (Map.Entry<Integer, List<EmailInfoDTO>> entry : emailIdFileMap.entrySet()) {
+                Integer emailId = entry.getKey();
+                List<EmailInfoDTO> emailInfoDTOList = entry.getValue();
+                String emailAddress = emailInfoDTOList.get(0).getEmail();
+                List<EmailContentInfoDTO> emailContentInfoDTOList = emailInfoDTOList.stream().map(this::buildEmailContentInfoDTO).collect(Collectors.toList());
+
+                List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
+                Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap = MapUtil.newHashMap();
+                for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
+                    try {
+                        log.info("开始重新解析文件 -> 文件id:{}", emailContentInfoDTO.getFielId());
+                        List<EmailFundNavDTO> fundNavDTOList = emailParseService.parseEmail(emailContentInfoDTO, MapUtil.newHashMap());
+                        fileNameNavMap.put(emailContentInfoDTO, fundNavDTOList);
+                        emailFundNavDTOList.addAll(fundNavDTOList);
+                    } catch (Exception e) {
+                        log.error("重新解析文件失败,邮件id:{},文件id:{},堆栈信息:{}", emailId, emailContentInfoDTO.getFielId(), ExceptionUtil.stacktraceToString(e));
+                    }
+                }
+                // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
+                emailParseService.saveRelatedTable(emailAddress, emailContentInfoDTOList, fileNameNavMap);
+            }
+            log.info("重新解析文件结束... -> 文件id:{}", fileIdList);
+        });
+    }
+
+    private EmailContentInfoDTO buildEmailContentInfoDTO(EmailInfoDTO emailInfoDTO) {
+        String emailDate = DateUtil.format(emailInfoDTO.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS);
+        String parseDate = DateUtil.format(new Date(), DateConst.YYYY_MM_DD_HH_MM_SS);
+        EmailContentInfoDTO contentInfoDTO = new EmailContentInfoDTO();
+        contentInfoDTO.setEmailId(emailInfoDTO.getId());
+        contentInfoDTO.setFielId(emailInfoDTO.getFileId());
+        contentInfoDTO.setEmailAddress(emailInfoDTO.getEmail());
+        contentInfoDTO.setEmailDate(emailDate);
+        contentInfoDTO.setEmailTitle(emailInfoDTO.getEmailTitle());
+        contentInfoDTO.setParseDate(parseDate);
+        contentInfoDTO.setFileName(emailInfoDTO.getFileName());
+        contentInfoDTO.setFilePath(emailInfoDTO.getFilePath());
+        contentInfoDTO.setEmailType(emailInfoDTO.getEmailType());
+        return contentInfoDTO;
     }
 
-    private List<EmailContentInfoDTO> buildEmailContentInfoDTO(Integer emailId, EmailParseInfoDO emailParseInfoDO, List<EmailFileInfoDO> emailParseInfoDOList, Map<Integer, List<String>> emailTypeMap) {
+    private List<EmailContentInfoDTO> buildEmailContentInfoDTO(Integer emailId, EmailParseInfoDO emailParseInfoDO, List<EmailFileInfoDO> emailFileInfoDOList, Map<Integer, List<String>> emailTypeMap) {
         List<EmailContentInfoDTO> emailContentInfoDTOList = CollUtil.newArrayList();
         String emailDate = DateUtil.format(emailParseInfoDO.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS);
         String parseDate = DateUtil.format(new Date(), DateConst.YYYY_MM_DD_HH_MM_SS);
-        for (EmailFileInfoDO fileInfoDO : emailParseInfoDOList) {
+        for (EmailFileInfoDO fileInfoDO : emailFileInfoDOList) {
             EmailContentInfoDTO contentInfoDTO = new EmailContentInfoDTO();
             contentInfoDTO.setEmailId(emailId);
             contentInfoDTO.setFielId(fileInfoDO.getId());
@@ -103,14 +163,14 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
             contentInfoDTO.setFilePath(fileInfoDO.getFilePath());
             Integer emailType = EmailUtil.getEmailTypeBySubject(emailParseInfoDO.getEmailTitle(), emailTypeMap);
             contentInfoDTO.setEmailType(emailType);
-            String emailContent = getEmailContent(fileInfoDO.getFilePath());
+            String emailContent = readHtmlFileContent(fileInfoDO.getFilePath());
             contentInfoDTO.setEmailContent(emailContent);
             emailContentInfoDTOList.add(contentInfoDTO);
         }
         return emailContentInfoDTOList;
     }
 
-    public static String getEmailContent(String filePath) {
+    public static String readHtmlFileContent(String filePath) {
         if (StrUtil.isNotBlank(filePath) && filePath.endsWith("html")) {
             StringBuilder content = new StringBuilder();
             try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {

+ 15 - 1
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -59,12 +59,14 @@ public class EmailParseService {
     private final AssetMapper assetMapper;
     private final NavMapper navMapper;
     private final FundService fundService;
+    private final FundAliasMapper fundAliasMapper;
 
     public EmailParseService(EmailTypeRuleMapper emailTypeRuleMapper, EmailRuleConfig emailRuleConfig,
                              EmailFieldMappingMapper emailFieldMapper, EmailParserFactory emailParserFactory,
                              EmailParseInfoMapper emailParseInfoMapper, EmailFileInfoMapper emailFileInfoMapper,
                              EmailFundNavMapper emailFundNavMapper, EmailFundAssetMapper emailFundAssetMapper,
-                             AssetMapper assetMapper, NavMapper navMapper, FundService fundService) {
+                             AssetMapper assetMapper, NavMapper navMapper, FundService fundService,
+                             FundAliasMapper fundAliasMapper) {
         this.emailTypeRuleMapper = emailTypeRuleMapper;
         this.emailRuleConfig = emailRuleConfig;
         this.emailFieldMapper = emailFieldMapper;
@@ -76,6 +78,7 @@ public class EmailParseService {
         this.assetMapper = assetMapper;
         this.navMapper = navMapper;
         this.fundService = fundService;
+        this.fundAliasMapper = fundAliasMapper;
     }
 
     /**
@@ -359,6 +362,8 @@ public class EmailParseService {
         if (CollUtil.isEmpty(fundNavDTO.getFundIdList())) {
             List<String> fundIdList = fundService.getFundIdByNamesAndCode(fundNavDTO.getFundName(), fundNavDTO.getRegisterNumber());
             if (CollUtil.isEmpty(fundIdList)) {
+                // 判断是否写入别名管理表fund_alias
+                saveFundAlias(fundNavDTO.getFundName(), fundNavDTO.getRegisterNumber());
                 fundNavDTO.setParseStatus(NavParseStatusConst.NOT_MATCH);
                 return;
             }
@@ -381,6 +386,15 @@ public class EmailParseService {
         fundNavDTO.setParseStatus(NavParseStatusConst.SUCCESS);
     }
 
+    private void saveFundAlias(String fundName, String registerNumber) {
+        List<FundAliasDO> fundAliasDOList = fundAliasMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
+        if (CollUtil.isNotEmpty(fundAliasDOList)) {
+            return;
+        }
+        log.info("写入别名表 -> 基金名称:{},备案编码:{}", fundName, registerNumber);
+        fundAliasMapper.insert(fundName, registerNumber);
+    }
+
     private Integer saveEmailParseInfo(EmailParseInfoDO emailParseInfoDO) {
         if (emailParseInfoDO == null) {
             return null;

+ 7 - 3
service-daq/src/main/java/com/simuwang/daq/service/FundService.java

@@ -9,6 +9,7 @@ import com.simuwang.base.pojo.dos.FundInfoDO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Service
@@ -49,7 +50,7 @@ public class FundService {
         }
         List<FundAliasDO> fundAliasDOList = fundAliasMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
         if (CollUtil.isNotEmpty(fundAliasDOList)) {
-            return fundAliasDOList.stream().map(this::convertToFundInfoDO).collect(Collectors.toList());
+            return fundAliasDOList.stream().map(this::convertToFundInfoDO).filter(Objects::nonNull).collect(Collectors.toList());
         }
         // 2.基金名称匹配
         if (StrUtil.isNotBlank(fundName)) {
@@ -59,7 +60,7 @@ public class FundService {
             }
             List<FundAliasDO> fundAliasList = fundAliasMapper.queryFundByName(fundName);
             if (CollUtil.isNotEmpty(fundAliasList)) {
-                return fundAliasList.stream().map(this::convertToFundInfoDO).collect(Collectors.toList());
+                return fundAliasList.stream().map(this::convertToFundInfoDO).filter(Objects::nonNull).collect(Collectors.toList());
             }
         }
         // 3.备案编码匹配
@@ -70,13 +71,16 @@ public class FundService {
             }
             List<FundAliasDO> fundAliasList = fundAliasMapper.queryFundByRegisterNumber(registerNumber);
             if (CollUtil.isNotEmpty(fundAliasList)) {
-                return fundAliasList.stream().map(this::convertToFundInfoDO).collect(Collectors.toList());
+                return fundAliasList.stream().map(this::convertToFundInfoDO).filter(Objects::nonNull).collect(Collectors.toList());
             }
         }
         return CollUtil.newArrayList();
     }
 
     public FundInfoDO convertToFundInfoDO(FundAliasDO fundAliasDO) {
+        if (fundAliasDO == null || StrUtil.isBlank(fundAliasDO.getTargetFundId())) {
+            return null;
+        }
         FundInfoDO fundInfoDO = new FundInfoDO();
         fundInfoDO.setFundId(fundAliasDO.getTargetFundId());
         fundInfoDO.setFundName(fundAliasDO.getTargetFundName());

+ 2 - 1
service-daq/src/main/java/com/simuwang/daq/service/ValuationEmailParser.java

@@ -53,7 +53,8 @@ public class ValuationEmailParser extends AbstractEmailParser {
         List<ValuationNeedParseParam> valuationNeedParseParams = buildValuationNeedParseParam(emailContentInfoDTO);
         List<AssetsValuationResult.Record> recordList = valuationParseService.parseValuationExcel(valuationNeedParseParams);
         if (CollUtil.isNotEmpty(recordList)) {
-            List<AssetsValuationResult.Record> parseSucessList = recordList.stream().filter(e -> e.getSuccess() == 1).collect(Collectors.toList());
+            List<AssetsValuationResult.Record> parseSucessList = recordList.stream()
+                    .filter(e -> e.getSuccess() == 1 || (StrUtil.isNotBlank(e.getMsg()) && "未匹配基金".equals(e.getMsg()))).collect(Collectors.toList());
             EmailFundNavDTO fundNavDTO = convertToFundNavDTO(parseSucessList);
             Optional.ofNullable(fundNavDTO).ifPresent(emailFundNavDTOList::add);
         }

+ 14 - 6
service-daq/src/main/java/com/simuwang/daq/service/ValuationParseService.java

@@ -92,10 +92,19 @@ public class ValuationParseService {
                             List<FundInfoDO> fundInfoDOList = fundService.getFundInfoByNamesAndCode(parseValuationInfo.getFundName(), parseValuationInfo.getRegisterNumber());
                             log.info("表格:{}, 匹配上的基金:{}", valuationNeedParseParam.getOriginFileName(), fundInfoDOList);
                             if (CollUtil.isEmpty(fundInfoDOList)) {
+                                // 未匹配基金的情况 -> 不保存估值表信息
+                                record.setNav(String.valueOf(details.getNav()));
+                                record.setCumulativeNavWithdrawal(String.valueOf(details.getCumulativeNav()));
+                                record.setExcelName(valuationNeedParseParam.getOriginFileName());
+                                record.setDate(details.getValuationDate());
                                 record.setExcelName(valuationNeedParseParam.getOriginFileName());
                                 record.setMsg("未匹配基金");
                                 record.setDate(details.getValuationDate());
                                 record.setSuccess(0);
+                                BigDecimal assetNet = details.getNetAssetsValue() != null ? BigDecimal.valueOf(details.getNetAssetsValue()) : null;
+                                BigDecimal assetShare = details.getTotalMarketValue() != null ? BigDecimal.valueOf(details.getTotalMarketValue()) : null;
+                                record.setAssetNet(assetNet != null ? String.valueOf(assetNet) : null);
+                                record.setAssetShare(assetShare != null ? String.valueOf(assetShare) : null);
                                 records.add(record);
                             } else {
                                 for (FundInfoDO fundInfoDO : fundInfoDOList) {
@@ -112,7 +121,7 @@ public class ValuationParseService {
                                     List<AssetsValuationInfo> data = excelInfo.getData();
                                     if (CollUtil.isNotEmpty(data)) {
                                         ValuationTableDO tableInfo = new ValuationTableDO();
-                                        Integer valuationId = trans2UserValuationDoAndWrite(details, 0, fundId, tableInfo, valuationNeedParseParam);
+                                        Integer valuationId = trans2UserValuationDoAndWrite(details, fundId, tableInfo, valuationNeedParseParam);
                                         singleFundRecord.setValuationId(valuationId);
                                         Future<ValuationResult> future = executor.submit(() -> {
                                             ValuationResult valuationResult = new ValuationResult();
@@ -147,7 +156,7 @@ public class ValuationParseService {
                         List<AssetsValuationInfo> data = excelInfo.getData();
                         if (CollectionUtil.isNotEmpty(data)) {
                             ValuationTableDO tableInfo = new ValuationTableDO();
-                            Integer valuationId = trans2UserValuationDoAndWrite(details, 0, fundId, tableInfo, valuationNeedParseParam);
+                            Integer valuationId = trans2UserValuationDoAndWrite(details, fundId, tableInfo, valuationNeedParseParam);
                             record.setValuationId(valuationId);
                             Future<ValuationResult> future = executor.submit(() -> {
                                 long startTime = System.currentTimeMillis();
@@ -447,8 +456,7 @@ public class ValuationParseService {
         }
     }
 
-    public Integer trans2UserValuationDoAndWrite(AssetsValuationDetails details, Integer userId, String fundId,
-                                                 ValuationTableDO tableInfo, ValuationNeedParseParam valuationNeedParseParam) {
+    public Integer trans2UserValuationDoAndWrite(AssetsValuationDetails details, String fundId, ValuationTableDO tableInfo, ValuationNeedParseParam valuationNeedParseParam) {
         valuationTableMapper.unValid(fundId, details.getValuationDate());
         tableInfo.setFundId(fundId);
         tableInfo.setValuationDate(DateUtil.StringToDate(details.getValuationDate()));
@@ -456,8 +464,8 @@ public class ValuationParseService {
         tableInfo.setIsvalid(1);
         tableInfo.setCreateTime(DateTime.now());
         tableInfo.setUpdateTime(DateTime.now());
-        tableInfo.setCreatorId(userId);
-        tableInfo.setUpdaterId(userId);
+        tableInfo.setCreatorId(0);
+        tableInfo.setUpdaterId(0);
         tableInfo.setTotalMarketValue(BigDecimalUtils.toBigDecimal(details.getTotalMarketValue()));
         tableInfo.setNetAssetsValue(BigDecimalUtils.toBigDecimal(details.getNetAssetsValue()));
         tableInfo.setIncrement(BigDecimalUtils.toBigDecimal(details.getIncrement()));

+ 7 - 0
service-deploy/src/main/test/java/com/simuwang/datadaq/DataTrusteeApplicationTests.java

@@ -1,5 +1,6 @@
 package com.simuwang.datadaq;
 
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import com.simuwang.base.common.conts.DateConst;
@@ -49,4 +50,10 @@ class DataTrusteeApplicationTests {
     public void testReparseEmail() {
         emailParseApiService.reparseEmail(7);
     }
+
+
+    @Test
+    public void testReparseFile() {
+        emailParseApiService.reparseFile(ListUtil.toList(40,43));
+    }
 }

+ 38 - 0
service-manage/src/main/java/com/simuwang/manage/api/email/EmailAssetDetailController.java

@@ -0,0 +1,38 @@
+package com.simuwang.manage.api.email;
+
+import com.simuwang.base.common.support.MybatisPage;
+import com.simuwang.base.pojo.dto.query.ParseDetailPageQuery;
+import com.simuwang.base.pojo.vo.EmailFundAssetVO;
+import com.simuwang.base.pojo.vo.EmailFundNavVO;
+import com.simuwang.manage.api.base.BaseController;
+import com.simuwang.manage.service.ParseEmailDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  数据详情
+ * Author:   chenjianhua
+ * Date:     2024/9/10 11:21
+ * Description: ${DESCRIPTION}
+ */
+@RestController
+@RequestMapping("/v1/asset")
+public class EmailAssetDetailController{
+
+    @Autowired
+    private ParseEmailDetailService parseEmailDetailService;
+
+    /**
+     * 规模解析数据详情页面展示查询接口
+     * @param parseDetailPageQuery
+     * @return
+     */
+    @GetMapping("/search-asset-detail")
+    public MybatisPage<EmailFundAssetVO> searchAssetDetail(ParseDetailPageQuery parseDetailPageQuery){
+        MybatisPage<EmailFundAssetVO> result = parseEmailDetailService.searchAssetDetail(parseDetailPageQuery);
+        return result;
+    }
+
+}

+ 41 - 10
service-manage/src/main/java/com/simuwang/manage/api/email/EmailConfigController.java

@@ -5,6 +5,7 @@ import com.simuwang.base.pojo.dto.query.EmailPageQuery;
 import com.simuwang.base.pojo.vo.IdVO;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
+import com.simuwang.base.pojo.vo.OpenStatusVO;
 import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.EmailConfigService;
 import com.smppw.common.pojo.ResultVo;
@@ -12,10 +13,7 @@ import com.smppw.common.pojo.enums.status.ResultCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-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 java.util.List;
 
@@ -48,7 +46,7 @@ public class EmailConfigController extends BaseController {
      * @param mailboxInfoVO
      * @return
      */
-    @RequestMapping("save-email-config")
+    @PostMapping("save-email-config")
     public ResultVo saveEmailConfig(@RequestBody MailboxInfoVO mailboxInfoVO){
         ResultVo vo = new ResultVo(ResultCode.SAVE_SUCCESS.getCode());
         try{
@@ -67,13 +65,49 @@ public class EmailConfigController extends BaseController {
     }
 
     /**
+     * 开启关闭邮箱启动状态
+     * @param openStatusVO
+     * @return
+     */
+    @PostMapping("control-email-status")
+    public ResultVo controlEmailConfig(@RequestBody OpenStatusVO openStatusVO){
+        ResultVo vo = new ResultVo(ResultCode.SAVE_SUCCESS.getCode());
+        try{
+            emailConfigService.controlEmailConfig(openStatusVO);
+            vo.setData(true);
+        }catch (Exception e){
+            vo.setCode(ResultCode.SAVE_FAILED.getCode());
+            logger.error(e.getMessage(),e);
+        }
+        return vo;
+    }
+
+    /**
+     * 根据ID查询邮箱配置
+     * @param idVO
+     * @return
+     */
+    @GetMapping("search-email-config")
+    public ResultVo searchEmailConfig(IdVO idVO){
+        ResultVo vo = new ResultVo(ResultCode.SAVE_SUCCESS.getCode());
+        try{
+            MailboxInfoVO mailboxInfoVO = emailConfigService.searchEmailConfigById(idVO.getId());
+            vo.setData(mailboxInfoVO);
+        }catch (Exception e){
+            vo.setCode(ResultCode.SAVE_FAILED.getCode());
+            logger.error(e.getMessage(),e);
+        }
+        return vo;
+    }
+
+    /**
      * 批量删除邮箱配置
      * @param idVO --idList
      * @return
      */
     @RequestMapping("delete-email-config")
     public boolean deleteEmailConfig(@RequestBody IdVO idVO){
-        emailConfigService.deleteEmailConfig(idVO.getIdList());
+        emailConfigService.deleteEmailConfig(idVO.getId());
         return true;
     }
 
@@ -85,11 +119,8 @@ public class EmailConfigController extends BaseController {
     @RequestMapping("connect-test")
     public ResultVo connectTest(@RequestBody MailboxInfoVO mailboxInfoVO){
         ResultVo vo = new ResultVo(ResultCode.SUCCESS.getCode());
-        String msg = "";
         try{
-            msg = emailConfigService.connectTest(mailboxInfoVO);
-            vo.setMsg(msg);
-            vo.setData(true);
+            vo = emailConfigService.connectTest(mailboxInfoVO);
         }catch (Exception e){
             vo.setMsg(e.getMessage());
         }

+ 3 - 12
service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailDetailController.java

@@ -16,8 +16,8 @@ import org.springframework.web.bind.annotation.*;
  * Description: ${DESCRIPTION}
  */
 @RestController
-@RequestMapping("/v1/detail")
-public class ParseEmailDetailController extends BaseController {
+@RequestMapping("/v1/nav")
+public class EmailNavDetailController{
 
     @Autowired
     private ParseEmailDetailService parseEmailDetailService;
@@ -32,14 +32,5 @@ public class ParseEmailDetailController extends BaseController {
         return result;
     }
 
-    /**
-     * 规模解析数据详情页面展示查询接口
-     * @param parseDetailPageQuery
-     * @return
-     */
-    @GetMapping("/search-asset-detail")
-    public MybatisPage<EmailFundAssetVO> searchAssetDetail(ParseDetailPageQuery parseDetailPageQuery){
-        MybatisPage<EmailFundAssetVO> result = parseEmailDetailService.searchAssetDetail(parseDetailPageQuery);
-        return result;
-    }
+
 }

+ 42 - 0
service-manage/src/main/java/com/simuwang/manage/api/email/NavController.java

@@ -0,0 +1,42 @@
+package com.simuwang.manage.api.email;
+
+import com.simuwang.base.pojo.vo.FundAssetVO;
+import com.simuwang.base.pojo.vo.FundNavVO;
+import com.smppw.common.pojo.ResultVo;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * FileName: NavController
+ * Author:   chenjianhua
+ * Date:     2024/9/14 13:59
+ * Description: ${DESCRIPTION}
+ */
+@RestController
+@RequestMapping("/v1/nav")
+public class NavController {
+
+    /**
+     * 新增基金规模
+     * @param fundAssetVO
+     * @return
+     */
+//    @PostMapping("/save-fund-asset")
+//    public ResultVo saveFundAsset(@RequestBody FundAssetVO fundAssetVO){
+//        parseEmailDetailService.saveFundAsset(fundAssetVO);
+//        return ResultVo.ok(true);
+//    }
+//
+//    /**
+//     * 新增基金规模
+//     * @param fundNavVO
+//     * @return
+//     */
+//    @PostMapping("/save-fund-nav")
+//    public ResultVo saveFundNav(@RequestBody FundNavVO fundNavVO){
+//        parseEmailDetailService.saveFundNav(fundNavVO);
+//        return ResultVo.ok(true);
+//    }
+}

+ 4 - 7
service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailController.java

@@ -1,7 +1,5 @@
 package com.simuwang.manage.api.email;
 
-import com.simuwang.base.common.page.TableDataInfo;
-import com.simuwang.base.common.result.AjaxResult;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.util.EncodeUtil;
 import com.simuwang.base.pojo.dto.query.EmailFileQuery;
@@ -11,16 +9,14 @@ import com.simuwang.base.pojo.vo.EmailParseDetailVO;
 import com.simuwang.base.pojo.vo.EmailParseInfoVO;
 import com.simuwang.base.pojo.vo.EmailTypeRuleVO;
 import com.simuwang.daq.service.EmailParseApiService;
-import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.ParseEmailService;
 import com.smppw.common.pojo.ResultVo;
 import com.smppw.common.pojo.enums.TimeRange;
-import com.smppw.common.pojo.enums.status.ResultCode;
 import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
-import org.apache.ibatis.annotations.Param;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -38,7 +34,8 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/v1/parse")
-public class ParseEmailController extends BaseController {
+public class ParseEmailController{
+    private static final Logger logger = LoggerFactory.getLogger(ParseEmailController.class);
 
     @Autowired
     private ParseEmailService parseEmailService;

+ 18 - 0
service-manage/src/main/java/com/simuwang/manage/api/fund/FunAliasController.java

@@ -0,0 +1,18 @@
+package com.simuwang.manage.api.fund;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 基金别名管理
+ * Author:   chenjianhua
+ * Date:     2024/9/14 14:05
+ * Description: ${DESCRIPTION}
+ */
+@RestController
+@RequestMapping("/v1/alias")
+public class FunAliasController {
+
+
+
+}

+ 1 - 3
service-manage/src/main/java/com/simuwang/manage/api/fund/FundInformationController.java

@@ -1,6 +1,5 @@
 package com.simuwang.manage.api.fund;
 
-import com.simuwang.base.common.page.TableDataInfo;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.FundFilePageQuery;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
@@ -8,7 +7,6 @@ import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
 import com.simuwang.base.pojo.vo.FundFileInfoVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
-import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.EmailFundInfoService;
 import com.simuwang.manage.service.FundInformationService;
 import com.simuwang.manage.service.FundReportFrequencyService;
@@ -28,7 +26,7 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/v1/fund")
-public class FundInformationController extends BaseController {
+public class FundInformationController{
     private static final Logger logger = LoggerFactory.getLogger(FundInformationController.class);
 
     @Autowired

+ 8 - 2
service-manage/src/main/java/com/simuwang/manage/service/EmailConfigService.java

@@ -4,6 +4,8 @@ import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.EmailPageQuery;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
+import com.simuwang.base.pojo.vo.OpenStatusVO;
+import com.smppw.common.pojo.ResultVo;
 
 import java.util.List;
 
@@ -18,9 +20,13 @@ public interface EmailConfigService {
 
     void saveEmailConfig(MailboxInfoVO mailboxInfoVO);
 
-    String connectTest(MailboxInfoVO mailboxInfoVO);
+    ResultVo connectTest(MailboxInfoVO mailboxInfoVO);
 
-    void deleteEmailConfig(List<Integer> idList);
+    void deleteEmailConfig(Integer id);
 
     boolean checkEmailUnique(String email);
+
+    MailboxInfoVO searchEmailConfigById(Integer id);
+
+    void controlEmailConfig(OpenStatusVO openStatusVO);
 }

+ 6 - 0
service-manage/src/main/java/com/simuwang/manage/service/ParseEmailDetailService.java

@@ -4,6 +4,8 @@ import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.ParseDetailPageQuery;
 import com.simuwang.base.pojo.vo.EmailFundAssetVO;
 import com.simuwang.base.pojo.vo.EmailFundNavVO;
+import com.simuwang.base.pojo.vo.FundAssetVO;
+import com.simuwang.base.pojo.vo.FundNavVO;
 
 /**
  * FileName: ParseEmailDetailService
@@ -15,4 +17,8 @@ public interface ParseEmailDetailService {
     MybatisPage<EmailFundNavVO> searchNavDetail(ParseDetailPageQuery parseDetailPageQuery);
 
     MybatisPage<EmailFundAssetVO> searchAssetDetail(ParseDetailPageQuery parseDetailPageQuery);
+
+    void saveFundAsset(FundAssetVO fundAssetVO);
+
+    void saveFundNav(FundNavVO fundNavVO);
 }

+ 32 - 8
service-manage/src/main/java/com/simuwang/manage/service/impl/EmailConfigServiceImpl.java

@@ -4,6 +4,7 @@ import com.simuwang.base.common.conts.UserConstants;
 import com.simuwang.base.common.enums.EmailCron;
 import com.simuwang.base.common.enums.ResultCode;
 import com.simuwang.base.common.support.MybatisPage;
+import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.common.util.EmailUtil;
 import com.simuwang.base.common.util.StringUtil;
 import com.simuwang.base.mapper.MailboxInfoMapper;
@@ -13,7 +14,9 @@ import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 import com.simuwang.base.pojo.dto.query.EmailPageQuery;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
+import com.simuwang.base.pojo.vo.OpenStatusVO;
 import com.simuwang.manage.service.EmailConfigService;
+import com.smppw.common.pojo.ResultVo;
 import jakarta.mail.MessagingException;
 import jakarta.mail.Store;
 import org.quartz.Scheduler;
@@ -21,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -41,10 +45,7 @@ public class EmailConfigServiceImpl implements EmailConfigService {
     @Override
     public MybatisPage<MailboxInfoTableVO> searchEmailConfigList(EmailPageQuery emailPageQuery) {
         List<MailboxInfoDO> mailboxInfoOS = emailConfigMapper.searchEmailConfigList(emailPageQuery);
-        List<MailboxInfoTableVO> mailboxInfoTableVOS = mailboxInfoOS.stream().map(MailboxInfoDO::toVo).collect(Collectors.toList());
-        for(MailboxInfoTableVO mailboxInfoTableVO : mailboxInfoTableVOS){  //cron表达式转文本描述
-            mailboxInfoTableVO.setCron(EmailCron.getEmailCronByCron(mailboxInfoTableVO.getCron()).getText());
-        }
+        List<MailboxInfoTableVO> mailboxInfoTableVOS = mailboxInfoOS.stream().map(MailboxInfoDO::toTableVo).collect(Collectors.toList());
         long total = emailConfigMapper.countEmailConfig(emailPageQuery);
         return MybatisPage.of(total,mailboxInfoTableVOS);
     }
@@ -63,7 +64,8 @@ public class EmailConfigServiceImpl implements EmailConfigService {
     }
 
     @Override
-    public String connectTest(MailboxInfoVO mailboxInfoVO) {
+    public ResultVo connectTest(MailboxInfoVO mailboxInfoVO) {
+        ResultVo vo = new ResultVo(ResultCode.CONNECT_SUCCESS);
         MailboxInfoDTO mailboxInfoDTO = new MailboxInfoDTO();
         mailboxInfoDTO.setAccount(mailboxInfoVO.getEmail());
         mailboxInfoDTO.setPassword(mailboxInfoVO.getPassword());
@@ -77,13 +79,20 @@ public class EmailConfigServiceImpl implements EmailConfigService {
             } catch (MessagingException e) {
                 throw new RuntimeException(e);
             }
-            return ResultCode.CONNECT_SUCCESS.getMsg();
+            vo.setMsg(ResultCode.CONNECT_SUCCESS.getMsg());
+            vo.setData(true);
+            return vo;
         }
-        return ResultCode.CONNECT_ERROR.getMsg();
+        vo = new ResultVo(ResultCode.CONNECT_ERROR);
+        vo.setData(false);
+        vo.setMsg(ResultCode.CONNECT_ERROR.getMsg());
+        return vo;
     }
 
     @Override
-    public void deleteEmailConfig(List<Integer> idList) {
+    public void deleteEmailConfig(Integer id) {
+        List<Integer> idList = new ArrayList<>();
+        idList.add(id);
         emailConfigMapper.deleteEmailConfigByIds(idList);
     }
 
@@ -97,6 +106,21 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         return UserConstants.UNIQUE;
     }
 
+    @Override
+    public MailboxInfoVO searchEmailConfigById(Integer id) {
+        MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(id);
+        MailboxInfoVO mailboxInfoVO = mailboxInfoDO.toVo();
+        return mailboxInfoVO;
+    }
+
+    @Override
+    public void controlEmailConfig(OpenStatusVO openStatusVO) {
+        MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(openStatusVO.getId());
+        mailboxInfoDO.setOpenStatus(openStatusVO.getOpenStatus());
+        mailboxInfoDO.setUpdateTime(DateUtils.getNowDate());
+        emailConfigMapper.updateById(mailboxInfoDO);
+    }
+
     private MailboxInfoDO toMailboxInfoDO(MailboxInfoVO mailboxInfoVO) {
         MailboxInfoDO mailboxInfoDO = new MailboxInfoDO();
         mailboxInfoDO.setIsvalid(1);

+ 63 - 9
service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailDetailServiceImpl.java

@@ -1,20 +1,18 @@
 package com.simuwang.manage.service.impl;
 
 import com.simuwang.base.common.support.MybatisPage;
-import com.simuwang.base.mapper.EmailFundAssetMapper;
-import com.simuwang.base.mapper.EmailFundNavMapper;
-import com.simuwang.base.mapper.FundInfoMapper;
-import com.simuwang.base.pojo.dos.CompanyEmailSendHistoryDO;
-import com.simuwang.base.pojo.dos.EmailFundAssetDO;
-import com.simuwang.base.pojo.dos.EmailFundNavDO;
+import com.simuwang.base.common.util.DateUtils;
+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.ParseDetailPageQuery;
-import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
-import com.simuwang.base.pojo.vo.EmailFundAssetVO;
-import com.simuwang.base.pojo.vo.EmailFundNavVO;
+import com.simuwang.base.pojo.vo.*;
 import com.simuwang.manage.service.ParseEmailDetailService;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -35,6 +33,12 @@ public class ParseEmailDetailServiceImpl implements ParseEmailDetailService {
 
     @Autowired
     private EmailFundAssetMapper emailFundAssetMapper;
+
+    @Autowired
+    private AssetMapper assetMapper;
+
+    @Autowired
+    private NavMapper navMapper;
     @Override
     public MybatisPage<EmailFundNavVO> searchNavDetail(ParseDetailPageQuery parseDetailPageQuery) {
         List<EmailFundNavDO> dataList = emailFundNavMapper.searchNavDetail(parseDetailPageQuery);
@@ -64,4 +68,54 @@ public class ParseEmailDetailServiceImpl implements ParseEmailDetailService {
         long total = emailFundAssetMapper.countAssetDetail(parseDetailPageQuery);
         return MybatisPage.of(total,voList);
     }
+
+    @Override
+    public void saveFundAsset(FundAssetVO fundAssetVO) {
+        List<AssetDO> assetDOList = new ArrayList<>();
+        AssetDO assetDO = new AssetDO();
+        assetDO.setAssetNet(fundAssetVO.getAssetNet());
+        assetDO.setAssetShare(fundAssetVO.getAssetShare());
+        assetDO.setPriceDate(DateUtils.parse(fundAssetVO.getPriceDate(),DateUtils.YYYY_MM_DD));
+        assetDO.setFundId(fundAssetVO.getFundId());
+        assetDO.setUpdateTime(DateUtils.getNowDate());
+        assetDO.setIsvalid(1);
+        AssetDO oldAssetDO = assetMapper.queryFundAsset(assetDO);
+        if(StringUtil.isNull(oldAssetDO)){
+            assetDO.setCreateTime(DateUtils.getNowDate());
+            assetDOList.add(assetDO);
+            assetMapper.batchInsert(assetDOList);
+        }else{
+            oldAssetDO.setAssetShare(assetDO.getAssetShare());
+            oldAssetDO.setAssetNet(assetDO.getAssetNet());
+            assetDOList.add(oldAssetDO);
+            assetMapper.batchUpdate(assetDOList);
+        }
+    }
+
+    @Override
+    public void saveFundNav(FundNavVO fundNavVO) {
+        List<NavDO> navDOList = new ArrayList<>();
+        NavDO navDO = new NavDO();
+        navDO.setCumulativeNav(fundNavVO.getCumulativeNavWithdrawal());
+        navDO.setCumulativeNavWithdrawal(fundNavVO.getCumulativeNavWithdrawal());
+        navDO.setNav(fundNavVO.getNav());
+        navDO.setFundId(fundNavVO.getFundId());
+        navDO.setNav(fundNavVO.getNav());
+        navDO.setPriceDate(DateUtils.parse(fundNavVO.getPriceDate(),DateUtils.YYYY_MM_DD));
+        navDO.setIsvalid(1);
+        navDO.setUpdateTime(DateUtils.getNowDate());
+        NavDO oldNav = navMapper.queryFundNav(navDO);
+        if(StringUtil.isNull(oldNav)){
+            navDO.setCreateTime(DateUtils.getNowDate());
+            navDOList.add(navDO);
+            navMapper.batchInsert(navDOList);
+        }else{
+            oldNav.setUpdateTime(DateUtils.getNowDate());
+            oldNav.setCumulativeNav(navDO.getCumulativeNav());
+            oldNav.setCumulativeNavWithdrawal(navDO.getCumulativeNav());
+            oldNav.setNav(navDO.getNav());
+            navDOList.add(oldNav);
+            navMapper.batchUpdate(navDOList);
+        }
+    }
 }