wangzaijun 7 месяцев назад
Родитель
Сommit
8355e493c8
46 измененных файлов с 1186 добавлено и 189 удалено
  1. 34 0
      service-base/pom.xml
  2. 3 0
      service-base/src/main/java/com/simuwang/base/common/conts/EmailFieldConst.java
  3. 1 1
      service-base/src/main/java/com/simuwang/base/common/enums/EmailCron.java
  4. 7 2
      service-base/src/main/java/com/simuwang/base/common/result/AjaxResult.java
  5. 199 0
      service-base/src/main/java/com/simuwang/base/common/util/EncodeUtil.java
  6. 95 1
      service-base/src/main/java/com/simuwang/base/common/util/ExcelUtil.java
  7. 18 0
      service-base/src/main/java/com/simuwang/base/mapper/AssetMapper.java
  8. 9 1
      service-base/src/main/java/com/simuwang/base/mapper/CompanyEmailConfigMapper.java
  9. 3 2
      service-base/src/main/java/com/simuwang/base/mapper/CompanyEmailSendHistoryMapper.java
  10. 7 0
      service-base/src/main/java/com/simuwang/base/mapper/EmailFileInfoMapper.java
  11. 3 0
      service-base/src/main/java/com/simuwang/base/mapper/EmailParseInfoMapper.java
  12. 1 1
      service-base/src/main/java/com/simuwang/base/mapper/FundInfomationMapper.java
  13. 18 0
      service-base/src/main/java/com/simuwang/base/mapper/NavMapper.java
  14. 64 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/AssetDO.java
  15. 5 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailConfigDO.java
  16. 2 2
      service-base/src/main/java/com/simuwang/base/pojo/dos/FundInformationDO.java
  17. 5 5
      service-base/src/main/java/com/simuwang/base/pojo/dos/MailboxInfoDO.java
  18. 69 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/NavDO.java
  19. 4 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/CompanyEmailConfigVO.java
  20. 15 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/SaveSuccessVO.java
  21. 52 0
      service-base/src/main/resources/mapper/AssetMapper.xml
  22. 24 2
      service-base/src/main/resources/mapper/CompanyEmailConfigMapper.xml
  23. 15 11
      service-base/src/main/resources/mapper/CompanyEmailHistoryMapper.xml
  24. 1 1
      service-base/src/main/resources/mapper/CompanyInformationMapper.xml
  25. 13 0
      service-base/src/main/resources/mapper/EmailFileInfoMapper.xml
  26. 8 0
      service-base/src/main/resources/mapper/EmailParseInfoMapper.xml
  27. 8 8
      service-base/src/main/resources/mapper/FundInformationMapper.xml
  28. 1 2
      service-base/src/main/resources/mapper/MailBoxInfoMapper.xml
  29. 55 0
      service-base/src/main/resources/mapper/NavMapper.xml
  30. 30 0
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiService.java
  31. 56 0
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiServiceImpl.java
  32. 94 37
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java
  33. 74 51
      service-daq/src/main/java/com/simuwang/daq/service/NavEmailParser.java
  34. 4 0
      service-deploy/src/main/resources/application.yml
  35. 2 2
      service-deploy/src/main/test/java/com/simuwang/datadaq/DataTrusteeApplicationTests.java
  36. 28 13
      service-manage/src/main/java/com/simuwang/manage/api/company/CompanyEmailSendHistoryController.java
  37. 3 2
      service-manage/src/main/java/com/simuwang/manage/api/email/EmailConfigController.java
  38. 45 0
      service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailController.java
  39. 4 3
      service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailConfigService.java
  40. 4 1
      service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailSendHistoryService.java
  41. 4 0
      service-manage/src/main/java/com/simuwang/manage/service/ParseEmailService.java
  42. 58 29
      service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailConfigServiceImpl.java
  43. 15 5
      service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailSendHistoryServiceImpl.java
  44. 3 2
      service-manage/src/main/java/com/simuwang/manage/service/impl/EmailConfigServiceImpl.java
  45. 4 4
      service-manage/src/main/java/com/simuwang/manage/service/impl/FundInformationServiceImpl.java
  46. 19 0
      service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailServiceImpl.java

+ 34 - 0
service-base/pom.xml

@@ -174,6 +174,40 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-simple</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>technology.tabula</groupId>
+            <artifactId>tabula</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-simple</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.16.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.27.1</version>
+        </dependency>
     </dependencies>
 
 <!--    <build>-->

+ 3 - 0
service-base/src/main/java/com/simuwang/base/common/conts/EmailFieldConst.java

@@ -19,4 +19,7 @@ public class EmailFieldConst {
     public final static String PARENT_ASSET_SHARE = "parentAssetShare";
     public final static String PARENT_ASSET_NET = "parentAssetNet";
 
+    public final static String LEVEL_FUND_NAME = "levelFundName";
+    public final static String LEVEL_REGISTER_NUMBER = "levelRegisterNumber";
+
 }

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

@@ -9,7 +9,7 @@ import java.util.stream.Stream;
  * Description: ${DESCRIPTION}
  */
 public enum EmailCron {
-    EVERY_HOUR("每小时执行", "0 0 0/1 * * *"), ONE_AM("每天一点整", "0 0 13 * * *");
+    EVERY_HOUR("1", "0 0 0/1 * * *"), ONE_AM("2", "0 0 13 * * *");
 
     private final String text;
     private final String cron;

+ 7 - 2
service-base/src/main/java/com/simuwang/base/common/result/AjaxResult.java

@@ -1,6 +1,8 @@
 package com.simuwang.base.common.result;
 
 import com.simuwang.base.common.util.StringUtil;
+import com.simuwang.base.pojo.vo.SaveSuccessVO;
+import com.smppw.common.pojo.enums.status.ResultCode;
 
 import java.util.HashMap;
 import java.util.Objects;
@@ -90,7 +92,10 @@ public class AjaxResult extends HashMap<String, Object>
      */
     public static AjaxResult success()
     {
-        return AjaxResult.success("操作成功");
+        SaveSuccessVO successVO = new SaveSuccessVO();
+        successVO.setStatus(1);
+        successVO.setMsg(ResultCode.SUCCESS.getMsg());
+        return AjaxResult.success(successVO);
     }
 
     /**
@@ -100,7 +105,7 @@ public class AjaxResult extends HashMap<String, Object>
      */
     public static AjaxResult success(Object data)
     {
-        return AjaxResult.success("操作成功", data);
+        return AjaxResult.success("", data);
     }
 
     /**

+ 199 - 0
service-base/src/main/java/com/simuwang/base/common/util/EncodeUtil.java

@@ -0,0 +1,199 @@
+package com.simuwang.base.common.util;
+
+import javax.crypto.*;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Base64;
+
+/**
+ * TODO
+ *
+ * @author chenjianhua
+ * @version 1.0
+ * @date 2022/7/31 23:35
+ */
+public class EncodeUtil {
+    private EncodeUtil() {
+        throw new Error("该类不能被实例化!");
+    }
+
+    private static Cipher makeCipher() throws Exception {
+        return Cipher.getInstance("DES");
+    }
+
+    private static SecretKey makeKeyFactory(String sKey) {
+        SecretKey secretKey = null;
+
+        try {
+            SecretKeyFactory des = SecretKeyFactory.getInstance("DES");
+            secretKey = des.generateSecret(new DESKeySpec(sKey.getBytes()));
+            return secretKey;
+        } catch (Exception var3) {
+            var3.printStackTrace();
+            return secretKey;
+        }
+    }
+
+    public static String encrypt(String key, String text) {
+        try {
+            Cipher cipher = makeCipher();
+            SecretKey secretKey = makeKeyFactory(key);
+            cipher.init(1, secretKey);
+            return new String(Base64.getEncoder().encode(cipher.doFinal(text.getBytes())));
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return text;
+        }
+    }
+
+    public static String decrypt(String key, String text) {
+        try {
+            Cipher cipher = makeCipher();
+            SecretKey secretKey = makeKeyFactory(key);
+            cipher.init(2, secretKey);
+            return new String(cipher.doFinal(Base64.getDecoder().decode(text.getBytes())));
+        } catch (Exception var4) {
+            var4.printStackTrace();
+            return text;
+        }
+    }
+
+    public static final String md5(String s) {
+        char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+        try {
+            byte[] strTemp = s.getBytes();
+            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
+            mdTemp.update(strTemp);
+            byte[] md = mdTemp.digest();
+            int j = md.length;
+            char[] str = new char[j * 2];
+            int k = 0;
+
+            for(int i = 0; i < j; ++i) {
+                byte byte0 = md[i];
+                str[k++] = hexDigits[byte0 >>> 4 & 15];
+                str[k++] = hexDigits[byte0 & 15];
+            }
+
+            return new String(str);
+        } catch (Exception var10) {
+            return null;
+        }
+    }
+
+    public static String encodeUTF8(String source) {
+        String result = source;
+
+        try {
+            result = URLEncoder.encode(source, StandardCharsets.UTF_8.name());
+            result = result.replace("+", "%20");
+        } catch (UnsupportedEncodingException var3) {
+            var3.printStackTrace();
+        }
+
+        return result;
+    }
+
+    public static String decodeUTF8(String source) {
+        String result = source;
+
+        try {
+            result = URLDecoder.decode(source, StandardCharsets.UTF_8.name());
+        } catch (UnsupportedEncodingException var3) {
+            var3.printStackTrace();
+        }
+
+        return result;
+    }
+
+    public static String AESEncrypt(String content, String key) {
+        try {
+            KeyGenerator kgen = KeyGenerator.getInstance("AES");
+            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
+            random.setSeed(key.getBytes());
+            kgen.init(128, random);
+            SecretKey secretKey = kgen.generateKey();
+            byte[] enCodeFormat = secretKey.getEncoded();
+            SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
+            Cipher cipher = Cipher.getInstance("AES");
+            byte[] byteContent = content.getBytes("utf-8");
+            cipher.init(1, secretKeySpec);
+            byte[] byteRresult = cipher.doFinal(byteContent);
+            StringBuffer sb = new StringBuffer();
+
+            for(int i = 0; i < byteRresult.length; ++i) {
+                String hex = Integer.toHexString(byteRresult[i] & 255);
+                if (hex.length() == 1) {
+                    hex = '0' + hex;
+                }
+
+                sb.append(hex.toUpperCase());
+            }
+
+            return sb.toString();
+        } catch (NoSuchAlgorithmException var13) {
+            var13.printStackTrace();
+        } catch (NoSuchPaddingException var14) {
+            var14.printStackTrace();
+        } catch (InvalidKeyException var15) {
+            var15.printStackTrace();
+        } catch (UnsupportedEncodingException var16) {
+            var16.printStackTrace();
+        } catch (IllegalBlockSizeException var17) {
+            var17.printStackTrace();
+        } catch (BadPaddingException var18) {
+            var18.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static String AESDecrypt(String content, String key) {
+        if (content.length() < 1) {
+            return null;
+        } else {
+            byte[] byteRresult = new byte[content.length() / 2];
+
+            for(int i = 0; i < content.length() / 2; ++i) {
+                int high = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);
+                int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);
+                byteRresult[i] = (byte)(high * 16 + low);
+            }
+
+            try {
+                KeyGenerator kgen = KeyGenerator.getInstance("AES");
+                SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
+                random.setSeed(key.getBytes());
+                kgen.init(128, random);
+                SecretKey secretKey = kgen.generateKey();
+                byte[] enCodeFormat = secretKey.getEncoded();
+                SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
+                Cipher cipher = Cipher.getInstance("AES");
+                cipher.init(2, secretKeySpec);
+                byte[] result = cipher.doFinal(byteRresult);
+                return new String(result);
+            } catch (NoSuchAlgorithmException var10) {
+                var10.printStackTrace();
+            } catch (NoSuchPaddingException var11) {
+                var11.printStackTrace();
+            } catch (InvalidKeyException var12) {
+                var12.printStackTrace();
+            } catch (IllegalBlockSizeException var13) {
+                var13.printStackTrace();
+            } catch (BadPaddingException var14) {
+                var14.printStackTrace();
+            }
+
+            return null;
+        }
+    }
+}

+ 95 - 1
service-base/src/main/java/com/simuwang/base/common/util/ExcelUtil.java

@@ -1,16 +1,29 @@
 package com.simuwang.base.common.util;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.simuwang.base.common.conts.DateConst;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.text.NumberFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.archivers.ArchiveStreamFactory;
+import org.apache.commons.compress.utils.IOUtils;
 
 public class ExcelUtil {
 
@@ -149,7 +162,8 @@ public class ExcelUtil {
             case NUMERIC:
                 if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                     // 如果是日期格式的数字
-                    cellValue = cell.getDateCellValue().toString();
+                    Date dateCellValue = cell.getDateCellValue();
+                    cellValue = DateUtil.format(dateCellValue, DateConst.YYYY_MM_DD);
                 } else {
                     // 否则是纯数字
                     NumberFormat numberFormat = NumberFormat.getNumberInstance();
@@ -182,4 +196,84 @@ public class ExcelUtil {
         cellValue = StrUtil.isNotBlank(cellValue) ? cellValue.replaceAll("[\\r\\n]+", "") : "";
         return cellValue;
     }
+
+    public static List<String> extractCompressedFiles(String zipFilePath, String destFilePath) {
+        List<String> filePathList = CollUtil.newArrayList();
+
+        File destFile = new File(destFilePath);
+        if (!destFile.exists()) {
+            destFile.mkdirs();
+        }
+
+        try (BufferedInputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath));
+             ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(fis)) {
+            ArchiveEntry entry;
+            while ((entry = ais.getNextEntry()) != null) {
+                File entryFile = new File(destFilePath, entry.getName());
+                if (entry.isDirectory()) {
+                    entryFile.mkdirs();
+                } else {
+                    try (FileOutputStream fos = new FileOutputStream(entryFile)) {
+                        IOUtils.copy(ais, fos);
+                        filePathList.add(entryFile.getPath());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return filePathList;
+    }
+
+    public static void writeDataToSheet(Sheet sheet, Elements rows) {
+        int rowSize = rows.size();
+        for (int rowNum = 0; rowNum < rowSize; rowNum++) {
+            Row sheetRow = sheet.createRow(rowNum);
+
+            Element elementRow = rows.get(rowNum);
+            Elements cells = elementRow.select("td");
+            int cellSize = cells.size();
+            for (int cellNum = 0; cellNum < cellSize; cellNum++) {
+                Cell sheetRowCell = sheetRow.createCell(cellNum);
+                sheetRowCell.setCellValue(cells.get(cellNum).text());
+            }
+        }
+    }
+
+
+    /**
+     * 获取优先级高的字段值
+     *
+     * @param sheetRow         行
+     * @param priorityPosition 字段位置
+     * @param basePosition     优先级搞的字段位置
+     * @return 优先级高的字段值
+     */
+    public static String getPriorityFieldValue(Row sheetRow, Integer priorityPosition, Integer basePosition) {
+        boolean hasPriorityValue = priorityPosition != null && sheetRow.getCell(priorityPosition) != null && StrUtil.isNotBlank(ExcelUtil.getCellValue(sheetRow.getCell(priorityPosition)));
+        if (hasPriorityValue) {
+            return ExcelUtil.getCellValue(sheetRow.getCell(priorityPosition));
+        }
+        return basePosition != null && sheetRow.getCell(basePosition) != null ? ExcelUtil.getCellValue(sheetRow.getCell(basePosition)) : null;
+    }
+
+    /**
+     * 去掉逗号
+     *
+     * @param numberData 数字型字符串
+     * @return 无逗号的数字型字符串
+     */
+    public static String numberDataStripCommas(String numberData) {
+        if (StrUtil.isBlank(numberData)) {
+            return null;
+        }
+        // pdf解析到的值带有",",比如:"10,656,097.37"
+        String data = numberData.replaceAll(",", "");
+        if (!StringUtil.isNumeric(data)) {
+            return null;
+        }
+        return data;
+    }
+
 }

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

@@ -0,0 +1,18 @@
+package com.simuwang.base.mapper;
+
+import com.simuwang.base.pojo.dos.AssetDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface AssetMapper {
+
+    void batchInsert(@Param("itemDoList") List<AssetDO> assetDOList);
+
+    void batchUpdate(@Param("itemDoList") List<AssetDO> assetDOList);
+
+    List<String> queryFundNavByDate(@Param("fundId") String fundId, @Param("priceDateList") List<String> priceDateList);
+
+}

+ 9 - 1
service-base/src/main/java/com/simuwang/base/mapper/CompanyEmailConfigMapper.java

@@ -2,7 +2,11 @@ package com.simuwang.base.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.simuwang.base.pojo.dos.CompanyEmailConfigDO;
+import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * FileName: CompanyEmailConfigMapper
@@ -12,11 +16,15 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface CompanyEmailConfigMapper extends BaseMapper<CompanyEmailConfigDO> {
-    void deleteCompanyEmailConfig(String email);
+    void deleteCompanyEmailConfig(@Param("companyId") String companyId);
 
     void saveCompanyEmailConfig(CompanyEmailConfigDO emailConfigDO);
 
     void updateCompanyEmailConfig(CompanyEmailConfigDO emailConfigDO);
 
     CompanyEmailConfigDO selectCompanyEmailConfigById(Integer id);
+
+    List<String> searchEmailByCompanyId(@Param("companyId")String companyId);
+
+    List<CompanyEmailConfigVO> searchEmailConfig(@Param("companyId") String companyId);
 }

+ 3 - 2
service-base/src/main/java/com/simuwang/base/mapper/CompanyEmailSendHistoryMapper.java

@@ -1,5 +1,6 @@
 package com.simuwang.base.mapper;
 
+import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -18,9 +19,9 @@ public interface CompanyEmailSendHistoryMapper {
                                                                   @Param("email") String email,
                                                                   @Param("sendStatus") Integer sendStatus);
 
-    List<CompanyEmailSendHistoryVO> searchEmailHistory(@Param("email") String email);
+    List<CompanyEmailSendHistoryVO> searchEmailHistory(@Param("companyId") String companyId);
 
-    void deleteEmailHistory(@Param("email")String email);
+    void deleteEmailHistory(@Param("emailList")List<String> email);
 
     void deleteEmailHistoryByIds(@Param("ids") String[] split);
 }

+ 7 - 0
service-base/src/main/java/com/simuwang/base/mapper/EmailFileInfoMapper.java

@@ -1,12 +1,19 @@
 package com.simuwang.base.mapper;
 
 import com.simuwang.base.pojo.dos.EmailFileInfoDO;
+import com.simuwang.base.pojo.dos.EmailParseInfoDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 @Mapper
 public interface EmailFileInfoMapper {
 
     Integer insert(@Param("itemDo") EmailFileInfoDO emailFileInfoDO);
 
+    EmailFileInfoDO getEmailFileById(@Param("id") Integer fileId);
+
+    List<EmailParseInfoDO> queryByEmailId(@Param("emailId") Integer emailId);
+
 }

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

@@ -19,4 +19,7 @@ public interface EmailParseInfoMapper {
     EmailParseInfoVO searchEmailById(@Param("id") Integer id);
 
     Integer searchEmailCount(@Param("parseDate") String parseDate, @Param("parseStatus")Integer parseStatus);
+
+    EmailParseInfoDO queryById(@Param("id") Integer id);
+
 }

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

@@ -14,7 +14,7 @@ import java.util.Map;
  * Description: ${DESCRIPTION}
  */
 @Mapper
-public interface FundInfomationMapper {
+public interface FundInfoMapper {
     List<Map<String, String>> searchFundInfoByKeyword(@Param("keyword") String keyword);
 
     List<FundInformationVO> searchFundInfoList(@Param("fundId") String fundId, @Param("fundName") String fundName,

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

@@ -0,0 +1,18 @@
+package com.simuwang.base.mapper;
+
+import com.simuwang.base.pojo.dos.NavDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface NavMapper {
+
+    void batchInsert(@Param("itemDoList") List<NavDO> navDOList);
+
+    void batchUpdate(@Param("itemDoList") List<NavDO> navDOList);
+
+    List<String> queryFundNavByDate(@Param("fundId") String fundId, @Param("priceDateList") List<String> priceDateList);
+
+}

+ 64 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/AssetDO.java

@@ -0,0 +1,64 @@
+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 lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("asset")
+public class AssetDO {
+    /**
+     * 主键Id
+     */
+    @TableId(value = "id")
+    private Integer id;
+    /**
+     * 基金id
+     */
+    @TableField(value = "fund_id")
+    private String fundId;
+    /**
+     * 规模日期
+     */
+    @TableField(value = "price_date")
+    private Date priceDate;
+    /**
+     * 资产份额
+     */
+    @TableField(value = "asset_share")
+    private BigDecimal assetShare;
+    /**
+     * 资产净值(基金规模)
+     */
+    @TableField(value = "asset_net")
+    private BigDecimal assetNet;
+    /**
+     * 是否有效:0-无效,1-有效
+     */
+    @TableField(value = "isvalid")
+    private Integer isvalid;
+    /**
+     * 创建者Id
+     */
+    @TableField(value = "creatorid")
+    private Integer creatorId;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "createtime")
+    private Date createTime;
+    /**
+     * 修改者Id
+     */
+    @TableField(value = "updaterid")
+    private Integer updaterId;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updatetime")
+    private Date updateTime;
+}

+ 5 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailConfigDO.java

@@ -43,6 +43,11 @@ public class CompanyEmailConfigDO {
     @TableField(value = "open_status")
     private Integer openStatus;
     /**
+     * 备注
+     */
+    @TableField(value = "remark")
+    private String remark;
+    /**
      * 记录的有效性;1-有效;0-无效;
      */
     @TableField(value = "isvalid")

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

@@ -14,8 +14,8 @@ import java.util.Date;
  * Description: ${DESCRIPTION}
  */
 @Data
-@TableName("fund_information")
-public class FundInformationDO {
+@TableName("pvn_fund_info")
+public class FundInfoDO {
     /**
      * 主键Id
      */

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

@@ -15,11 +15,11 @@ public class MailboxInfoDO {
      */
     @TableId(value = "id")
     private Integer id;
-    /**
-     * 用户id
-     */
-    @TableField(value = "user_id")
-    private Integer userId;
+//    /**
+//     * 用户id
+//     */
+//    @TableField(value = "user_id")
+//    private Integer userId;
     /**
      * 邮箱类型:1-QQ邮箱,2-腾讯企业邮箱,3-网易邮箱,4-新浪邮箱,99-其他
      */

+ 69 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/NavDO.java

@@ -0,0 +1,69 @@
+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 lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("nav")
+public class NavDO {
+    /**
+     * 主键Id
+     */
+    @TableId(value = "id")
+    private Integer id;
+    /**
+     * 基金id
+     */
+    @TableField(value = "fund_id")
+    private String fundId;
+    /**
+     * 规模日期
+     */
+    @TableField(value = "price_date")
+    private Date priceDate;
+    /**
+     * 单位净值
+     */
+    @TableField(value = "nav")
+    private BigDecimal nav;
+    /**
+     * 复权净值
+     */
+    @TableField(value = "cumulative_nav")
+    private BigDecimal cumulativeNav;
+    /**
+     * 累计净值
+     */
+    @TableField(value = "cumulative_nav_withdrawal")
+    private BigDecimal cumulativeNavWithdrawal;
+    /**
+     * 是否有效:0-无效,1-有效
+     */
+    @TableField(value = "isvalid")
+    private Integer isvalid;
+    /**
+     * 创建者Id
+     */
+    @TableField(value = "creatorid")
+    private Integer creatorId;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "createtime")
+    private Date createTime;
+    /**
+     * 修改者Id
+     */
+    @TableField(value = "updaterid")
+    private Integer updaterId;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updatetime")
+    private Date updateTime;
+}

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

@@ -15,7 +15,6 @@ import java.util.Date;
  * Description: ${DESCRIPTION}
  */
 @Data
-@TableName("company_email_config")
 public class CompanyEmailConfigVO {
     /**
      * ID
@@ -37,5 +36,9 @@ public class CompanyEmailConfigVO {
      * 邮箱地址
      */
     private Integer openStatus;
+    /**
+     * 邮箱地址
+     */
+    private String remark;
 
 }

+ 15 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/SaveSuccessVO.java

@@ -0,0 +1,15 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * FileName: SaveSuccessVO
+ * Author:   chenjianhua
+ * Date:     2024/9/12 14:17
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class SaveSuccessVO {
+    private Integer status;
+    private String msg;
+}

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

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.simuwang.base.mapper.AssetMapper">
+    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.AssetDO">
+        <id column="id" property="id"/>
+        <result column="fund_id" property="fundId"/>
+        <result column="price_date" property="priceDate"/>
+        <result column="asset_net" property="assetNet"/>
+        <result column="asset_share" property="assetShare"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="creatorid" property="creatorId"/>
+        <result column="createtime" property="createTime"/>
+        <result column="updaterid" property="updaterId"/>
+        <result column="updatetime" property="updateTime"/>
+    </resultMap>
+
+    <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.AssetDO">
+        insert into PPW_EMAIL.asset(fund_id,price_date,asset_net,asset_share,
+                                              isvalid, creatorid, createtime, updaterid, updatetime)
+        values
+        <foreach collection="itemDoList" item="itemDo" index="index" separator=",">
+            (#{itemDo.fundId},#{itemDo.priceDate},#{itemDo.assetNet},#{itemDo.assetShare},
+            #{itemDo.isvalid}, #{itemDo.creatorId}, #{itemDo.createTime}, #{itemDo.updaterId}, #{itemDo.updateTime})
+        </foreach>
+    </insert>
+
+    <insert id="batchUpdate">
+        <foreach collection="itemDoList" item="itemDo" index="index" open="" close="" separator=";">
+            update PPW_EMAIL.asset
+            <set>
+                asset_net = #{itemDo.assetNet},
+                asset_share = #{itemDo.assetShare},
+                updatetime=#{itemDo.updateTime}
+            </set>
+            where isvalid = 1
+            and fund_id = #{itemDo.fundId}
+            and price_date = #{itemDo.priceDate}
+        </foreach>
+    </insert>
+
+    <select id="queryFundNavByDate" resultType="java.lang.String">
+        select price_date
+        from PPW_EMAIL.asset
+        where isvalid = 1
+        and fund_id = #{fundId}
+        and price_date in
+        <foreach collection="priceDateList" index="index" item="priceDate" separator="," open="(" close=")">
+            #{priceDate}
+        </foreach>
+    </select>
+
+</mapper>

+ 24 - 2
service-base/src/main/resources/mapper/CompanyEmailConfigMapper.xml

@@ -7,6 +7,7 @@
         <if test="companyName != null and companyName != ''">company_name,</if>
         <if test="email != null and email != ''">email,</if>
         <if test="openStatus != null and openStatus != ''">open_status,</if>
+        <if test="remark != null and remark != ''">remark,</if>
         <if test="creatorId != null and creatorId != ''">creatorid,</if>
         <if test="updaterId != null and updaterId != ''">updaterId,</if>
         isvalid,
@@ -17,6 +18,7 @@
         <if test="companyName != null and companyName != ''">#{companyName},</if>
         <if test="email != null and email != ''">#{email},</if>
         <if test="openStatus != null and openStatus != ''">#{openStatus},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
         <if test="creatorId != null and creatorId != ''">#{creatorId},</if>
         <if test="updaterId != null and updaterId != ''">#{updaterId},</if>
         1,
@@ -32,6 +34,7 @@
             <if test="companyName != null and companyName != ''">company_name=#{companyName},</if>
             <if test="email != null and email != ''">email=#{email},</if>
             <if test="openStatus != null and openStatus != ''">open_status=#{openStatus},</if>
+            <if test="remark != null and remark != ''">remark=#{remark},</if>
             <if test="updaterId != null and updaterId != ''">updaterid=#{updaterId},</if>
             <if test="updateTime != null">updatetime=#{updateTime},</if>
         </set>
@@ -39,7 +42,7 @@
     </update>
 
     <update id="deleteCompanyEmailConfig">
-        update PPW_EMAIL.company_email_config set isvalid =0 where email=#{email}
+        update PPW_EMAIL.company_email_config set isvalid =0 where company_id=#{companyId}
     </update>
     <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.CompanyEmailConfigDO">
         <id column="id" property="id"/>
@@ -47,6 +50,7 @@
         <result column="company_name" property="companyName"/>
         <result column="email" property="email"/>
         <result column="open_status" property="openStatus"/>
+        <result column="remark" property="remark"/>
         <result column="creatorid" property="creatorId"/>
         <result column="updaterid" property="updaterId"/>
         <result column="createtime" property="createTime"/>
@@ -54,7 +58,7 @@
         <result column="isvalid" property="isvalid"/>
     </resultMap>
     <sql id="selectCompanyEmailConfigDo">
-        select company_id, company_name, email, open_status, creatorid, createtime, updaterid, updatetime,isvalid
+        select company_id, company_name, email, open_status,remark, creatorid, createtime, updaterid, updatetime,isvalid
         from PPW_EMAIL.company_email_config
     </sql>
     <!-- 查询条件 -->
@@ -70,4 +74,22 @@
         <include refid="selectCompanyEmailConfigDo"/>
         <include refid="sqlwhereSearch"/>
     </select>
+    <select id="searchEmailByCompanyId" resultType="java.lang.String" parameterType="java.lang.String">
+        select email from PPW_EMAIL.company_email_config where company_id = #{companyId} and isvalid =1
+    </select>
+
+
+
+    <resultMap id="BaseVOMap" type="com.simuwang.base.pojo.vo.CompanyEmailConfigVO">
+        <id column="id" property="id"/>
+        <result column="company_id" property="companyId"/>
+        <result column="company_name" property="companyName"/>
+        <result column="email" property="email"/>
+        <result column="open_status" property="openStatus"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <select id="searchEmailConfig" resultMap="BaseVOMap"
+            parameterType="java.lang.String">
+        select id,company_id,company_name,email,open_status,remark from  PPW_EMAIL.company_email_config where isvalid =1 and company_id=#{companyId}
+    </select>
 </mapper>

+ 15 - 11
service-base/src/main/resources/mapper/CompanyEmailHistoryMapper.xml

@@ -11,7 +11,10 @@
         <result column="send_remark" property="sendRemark"/>
     </resultMap>
     <update id="deleteEmailHistory">
-        update PPW_EMAIL.company_email_send_history set isvalid =0,updatetime=sysdate() where email=#{email}
+        update PPW_EMAIL.company_email_send_history set isvalid =0,updatetime=sysdate() where email in
+        <foreach item="email" collection="emailList" open="(" separator="," close=")">
+            #{email}
+        </foreach>
     </update>
     <update id="deleteEmailHistoryByIds">
         update PPW_EMAIL.company_email_send_history set isvalid =0,updatetime=sysdate() where id in
@@ -25,16 +28,16 @@
             cec.id,
             cec.company_id,
             c.company_name,
-            cec.email,
-            MAX(cesh.send_time) AS send_time,
+            listagg(cec.email,',') as email,
+            max(cesh.send_time) as send_time,
             cesh.send_remark,
             cesh.send_status
         FROM
-            PPW_EMAIL.company_email_config cec
-                JOIN PPW_EMAIL.company_information c
-                     ON cec.company_id = c.company_id
-                LEFT JOIN PPW_EMAIL.company_email_send_history cesh
-                     ON cec.email = cesh.email AND cesh.isvalid = 1
+        PPW_EMAIL.company_email_config cec
+        JOIN PPW_EMAIL.pvn_company_info c
+        ON cec.company_id = c.company_id
+        LEFT JOIN PPW_EMAIL.company_email_send_history cesh
+        ON cec.email = cesh.email AND cesh.isvalid = 1
         WHERE cec.isvalid = 1 and c.isvalid=1
         <if test="companyName != null and companyName !=''">
             and (c.company_name like concat('',#{companyName},'') or c.company_short_name like concat('',#{companyName},''))
@@ -45,6 +48,7 @@
         <if test="sendStatus != null and sendStatus !=''">
             and cesh.send_status=#{sendStatus}
         </if>
+        group by cec.company_id
     </select>
     <select id="searchEmailHistory" resultMap="BaseResultMap">
         SELECT
@@ -58,13 +62,13 @@
         FROM
             PPW_EMAIL.company_email_send_history cesh
             JOIN PPW_EMAIL.company_email_config cec
-            JOIN PPW_EMAIL.company_information c
+            JOIN PPW_EMAIL.pvn_company_info c
             ON cec.company_id = c.company_id
             ON cec.email = cesh.email
         WHERE cec.isvalid = 1
         AND cesh.isvalid = 1 and c.isvalid =1
-        <if test="email != null and email !=''">
-            and cec.email=#{email}
+        <if test="companyId != null and companyId !=''">
+            and c.company_id=#{companyId}
         </if>
     </select>
 </mapper>

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

@@ -44,7 +44,7 @@
         select c.company_id as `companyId`,
         c.company_name as `companyName`,
         c.register_number as `registerNumber`
-        from PPW_EMAIL.company_information c where c.isvalid =1
+        from PPW_EMAIL.pvn_company_info c where c.isvalid =1
         <if test="keyword != null and keyword !=''">
             and (c.company_name like concat('%',#{keyword},'%') or c.company_short_name like concat('%',#{keyword},'%') or c.register_number like concat('%',#{keyword},'%'))
         </if>

+ 13 - 0
service-base/src/main/resources/mapper/EmailFileInfoMapper.xml

@@ -21,5 +21,18 @@
                 #{itemDo.isvalid}, #{itemDo.creatorId}, #{itemDo.createTime}, #{itemDo.updaterId}, #{itemDo.updateTime})
     </insert>
 
+    <select id="getEmailFileById" resultMap="BaseResultMap"
+            parameterType="java.lang.Integer">
+        select id ,email_id, file_name, file_path,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.email_file_info where id=#{id} and isvalid=1
+    </select>
+
+    <select id="queryByEmailId" resultMap="BaseResultMap">
+        select id, file_name, file_path,
+        from PPW_EMAIL.email_file_info
+        where email - id = #{emailId}
+          and isvalid = 1
+    </select>
 
 </mapper>

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

@@ -87,6 +87,7 @@
         <include refid="selectEmailParse"/>
         where epi.isvalid =1 and epi.id =#{id}
     </select>
+
     <select id="searchEmailCount" resultType="java.lang.Integer">
         select count(1) from PPW_EMAIL.email_parse_info where isvalid=1
         <if test="parseStatus != null and parseStatus != -1">
@@ -97,4 +98,11 @@
         </if>
     </select>
 
+    <select id="queryById" resultMap="BaseResultMap">
+        select id, email, email_date, parse_date, email_title, email_type
+        from PPW_EMAIL.email_parse_info
+        where isvalid = 1
+          and id = #{id}
+    </select>
+
 </mapper>

+ 8 - 8
service-base/src/main/resources/mapper/FundInformationMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.simuwang.base.mapper.FundInfomationMapper">
-    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.FundInformationDO">
+<mapper namespace="com.simuwang.base.mapper.FundInfoMapper">
+    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.FundInfoDO">
         <id column="id" property="id"/>
         <result column="p_fund_id" property="pFundId"/>
         <result column="fund_name" property="fundName"/>
@@ -31,7 +31,7 @@
         select f.fund_id as fundId,
         f.fund_short_name as fundShortName,
         f.register_number as registerNumber
-        from PPW_EMAIL.fund_information f where f.isvalid =1
+        from PPW_EMAIL.pvn_fund_info f where f.isvalid =1
         <if test="keyword != null and keyword !=''">
             and (f.fund_name like concat('%',#{keyword},'%') or f.fund_short_name like concat('%',#{keyword},'%') or f.register_number like concat('%',#{keyword},'%'))
         </if>
@@ -45,8 +45,8 @@
                r.nav_frequency as navFrequency,
                r.asset_Frequency as assetFrequency,
                r.frequency_remark as frequencyRemark
-        from PPW_EMAIL.fund_information f
-        join PPW_EMAIL.company_information c on f.trust_id = c.company_id
+        from PPW_EMAIL.pvn_fund_info f
+        join PPW_EMAIL.pvn_company_info c on f.trust_id = c.company_id
         left join (select nv.fund_id,max(nv.price_date) as last_price_date from PPW_EMAIL.nav nv where nv.isvalid =1 group by nv.fund_id) n
         on f.fund_id = n .fund_id
         left join PPW_EMAIL.fund_report_frequency r on r.fund_id = f.fund_id and r.isvalid =1
@@ -76,7 +76,7 @@
 
     <select id="queryFundByNameAndRegisterNumber" resultType="java.lang.String">
         select fund_id
-        from PPW_EMAIL.fund_information
+        from PPW_EMAIL.pvn_fund_info
         where isvalid = 1
           and fund_name = #{fundName}
           and register_number = #{registerNumber}
@@ -84,14 +84,14 @@
 
     <select id="queryFundByName" resultType="java.lang.String">
         select fund_id
-        from PPW_EMAIL.fund_information
+        from PPW_EMAIL.pvn_fund_info
         where isvalid = 1
           and fund_name = #{fundName}
     </select>
 
     <select id="queryFundByRegisterNumber" resultType="java.lang.String">
         select fund_id
-        from PPW_EMAIL.fund_information
+        from PPW_EMAIL.pvn_fund_info
         where isvalid = 1
           and register_number = #{registerNumber}
     </select>

+ 1 - 2
service-base/src/main/resources/mapper/MailBoxInfoMapper.xml

@@ -3,7 +3,6 @@
 <mapper namespace="com.simuwang.base.mapper.MailboxInfoMapper">
     <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.MailboxInfoDO">
         <id column="id" property="id"/>
-        <result column="user_id" property="userId"/>
         <result column="type" property="type"/>
         <result column="email" property="email"/>
         <result column="password" property="password"/>
@@ -48,7 +47,7 @@
         </if>
     </select>
     <sql id="selectConfigVo">
-        select id, user_id, type, email, password, protocol, server, port, cron, open_status,description,isvalid,creatorid,createtime,updaterid,updatetime
+        select id, type, email, password, protocol, server, port, cron, open_status,description,isvalid,creatorid,createtime,updaterid,updatetime
         from PPW_EMAIL.mailbox_info
     </sql>
     <select id="checkEmailUnique" resultType="com.simuwang.base.pojo.dos.MailboxInfoDO">

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

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.simuwang.base.mapper.NavMapper">
+    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.NavDO">
+        <id column="id" property="id"/>
+        <result column="fund_id" property="fundId"/>
+        <result column="price_date" property="priceDate"/>
+        <result column="nav" property="nav"/>
+        <result column="cumulative_nav" property="cumulativeNav"/>
+        <result column="cumulative_nav_withdrawal" property="cumulativeNavWithdrawal"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="creatorid" property="creatorId"/>
+        <result column="createtime" property="createTime"/>
+        <result column="updaterid" property="updaterId"/>
+        <result column="updatetime" property="updateTime"/>
+    </resultMap>
+
+    <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.NavDO">
+        insert into PPW_EMAIL.nav(fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+                                  isvalid, creatorid, createtime, updaterid, updatetime)
+        values
+        <foreach collection="itemDoList" item="itemDo" index="index" separator=",">
+            (#{itemDo.fundId},#{itemDo.priceDate},#{itemDo.nav},#{itemDo.cumulativeNav},#{itemDo.cumulativeNavWithdrawal},
+            #{itemDo.isvalid}, #{itemDo.creatorId}, #{itemDo.createTime}, #{itemDo.updaterId}, #{itemDo.updateTime})
+        </foreach>
+
+    </insert>
+
+    <insert id="batchUpdate">
+        <foreach collection="itemDoList" item="itemDo" index="index" open="" close="" separator=";">
+            update PPW_EMAIL.nav
+            <set>
+                nav = #{itemDo.nav},
+                cumulative_nav_withdrawal = #{itemDo.cumulativeNavWithdrawal},
+                updatetime=#{itemDo.updateTime}
+            </set>
+            where isvalid = 1
+            and fund_id = #{itemDo.fundId}
+            and price_date = #{itemDo.priceDate}
+        </foreach>
+    </insert>
+
+    <select id="queryFundNavByDate" resultType="java.lang.String">
+        select price_date
+        from PPW_EMAIL.nav
+        where isvalid = 1
+          and fund_id = #{fundId}
+        and price_date in
+        <foreach collection="priceDateList" index="index" item="priceDate" separator="," open="(" close=")">
+            #{priceDate}
+        </foreach>
+    </select>
+
+
+</mapper>

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

@@ -0,0 +1,30 @@
+package com.simuwang.daq.service;
+
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+
+import java.util.Date;
+
+/**
+ * @author mozuwen
+ * @date 2024-09-12
+ * @description 邮件解析服务对外接口
+ */
+public interface EmailParseApiService {
+
+    /**
+     * 解析指定邮箱指定时间范围内的邮件
+     *
+     * @param mailboxInfoDTO 邮箱配置信息
+     * @param startDate      邮件起始日期(yyyy-MM-dd HH:mm:ss)
+     * @param endDate        邮件截止日期(yyyy-MM-dd HH:mm:ss, 为null,将解析邮件日期小于等于startDate的当天邮件)
+     */
+    void parseEmail(MailboxInfoDTO mailboxInfoDTO, Date startDate, Date endDate);
+
+    /**
+     * 重新解析指定邮件
+     *
+     * @param emailId 邮件id
+     */
+    void reparseEmail(Integer emailId);
+
+}

+ 56 - 0
service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiServiceImpl.java

@@ -0,0 +1,56 @@
+package com.simuwang.daq.service;
+
+import cn.hutool.core.collection.CollUtil;
+import com.simuwang.base.mapper.EmailFileInfoMapper;
+import com.simuwang.base.mapper.EmailParseInfoMapper;
+import com.simuwang.base.pojo.dos.EmailParseInfoDO;
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2024-09-12
+ * @description 邮件解析服务对外接口实现层
+ */
+@Service
+public class EmailParseApiServiceImpl implements EmailParseApiService {
+
+    private static final Logger log = LoggerFactory.getLogger(EmailParseApiServiceImpl.class);
+
+    private final EmailParseService emailParseService;
+    private final EmailParseInfoMapper emailParseInfoMapper;
+    private final EmailFileInfoMapper emailFileInfoMapper;
+
+    public EmailParseApiServiceImpl(EmailParseService emailParseService, EmailParseInfoMapper emailParseInfoMapper,
+                                    EmailFileInfoMapper emailFileInfoMapper) {
+        this.emailParseService = emailParseService;
+        this.emailParseInfoMapper = emailParseInfoMapper;
+        this.emailFileInfoMapper = emailFileInfoMapper;
+    }
+
+    @Override
+    public void parseEmail(MailboxInfoDTO mailboxInfoDTO, Date startDate, Date endDate) {
+        emailParseService.parseEmail(mailboxInfoDTO, startDate, endDate);
+    }
+
+    @Override
+    public void reparseEmail(Integer emailId) {
+        // 查询邮件信息
+        EmailParseInfoDO emailParseInfoDO = emailParseInfoMapper.queryById(emailId);
+        if (emailParseInfoDO == null) {
+            log.info("邮件不存在 ->邮件id:{}", emailId);
+            return;
+        }
+        List<EmailParseInfoDO> emailParseInfoDOList = emailFileInfoMapper.queryByEmailId(emailId);
+        if (CollUtil.isNotEmpty(emailParseInfoDOList)) {
+            log.info("该邮件不存在附件 -> 邮件id:{}", emailId);
+            return;
+        }
+        // todo 走解析流程
+    }
+}

+ 94 - 37
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -1,5 +1,6 @@
 package com.simuwang.daq.service;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.exceptions.ExceptionUtil;
@@ -26,6 +27,7 @@ import jakarta.mail.search.ReceivedDateTerm;
 import jakarta.mail.search.SearchTerm;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
@@ -43,32 +45,40 @@ public class EmailParseService {
 
     private static final Logger log = LoggerFactory.getLogger(EmailParseService.class);
 
+    @Value("${email.file.path}")
+    private String path;
+
     private final EmailTypeRuleMapper emailTypeRuleMapper;
     private final EmailRuleConfig emailRuleConfig;
     private final EmailFieldMappingMapper emailFieldMapper;
     private final EmailParserFactory emailParserFactory;
     private final EmailParseInfoMapper emailParseInfoMapper;
-    private final FundInfomationMapper fundInfomationMapper;
+    private final FundInfoMapper fundInfoMapper;
     private final EmailFileInfoMapper emailFileInfoMapper;
     private final EmailFundNavMapper emailFundNavMapper;
     private final EmailFundAssetMapper emailFundAssetMapper;
     private final FundAliasMapper fundAliasMapper;
+    private final AssetMapper assetMapper;
+    private final NavMapper navMapper;
 
     public EmailParseService(EmailTypeRuleMapper emailTypeRuleMapper, EmailRuleConfig emailRuleConfig,
                              EmailFieldMappingMapper emailFieldMapper, EmailParserFactory emailParserFactory,
-                             EmailParseInfoMapper emailParseInfoMapper, FundInfomationMapper fundInfomationMapper,
+                             EmailParseInfoMapper emailParseInfoMapper, FundInfoMapper fundInfoMapper,
                              EmailFileInfoMapper emailFileInfoMapper, EmailFundNavMapper emailFundNavMapper,
-                             EmailFundAssetMapper emailFundAssetMapper, FundAliasMapper fundAliasMapper) {
+                             EmailFundAssetMapper emailFundAssetMapper, FundAliasMapper fundAliasMapper,
+                             AssetMapper assetMapper, NavMapper navMapper) {
         this.emailTypeRuleMapper = emailTypeRuleMapper;
         this.emailRuleConfig = emailRuleConfig;
         this.emailFieldMapper = emailFieldMapper;
         this.emailParserFactory = emailParserFactory;
         this.emailParseInfoMapper = emailParseInfoMapper;
-        this.fundInfomationMapper = fundInfomationMapper;
+        this.fundInfoMapper = fundInfoMapper;
         this.emailFileInfoMapper = emailFileInfoMapper;
         this.emailFundNavMapper = emailFundNavMapper;
         this.emailFundAssetMapper = emailFundAssetMapper;
         this.fundAliasMapper = fundAliasMapper;
+        this.assetMapper = assetMapper;
+        this.navMapper = navMapper;
     }
 
     /**
@@ -140,7 +150,7 @@ public class EmailParseService {
             }
             for (EmailFundNavDTO fundNavDTO : fundNavDTOList) {
                 // 设置净值数据的解析状态
-                setNavParseStatus(fundNavDTO, emailTitle, emailDate);
+                setNavParseStatus(fundNavDTO, emailTitle);
             }
             // 保存净值表和规模表
             saveNavAndAssetNet(fileId, fundNavDTOList, parseDate);
@@ -158,15 +168,61 @@ public class EmailParseService {
         }
         // 净值数据
         List<EmailFundNavDO> emailFundNavDOList = fundNavDTOList.stream()
-                .map(e -> buildEmailFundNavDo(fileId, e, parseDate)).flatMap(List::stream).collect(Collectors.toList());
+                .map(e -> buildEmailFundNavDo(fileId, e, parseDate)).filter(CollUtil::isNotEmpty).flatMap(List::stream).collect(Collectors.toList());
         if (CollUtil.isNotEmpty(emailFundNavDOList)) {
             emailFundNavMapper.batchInsert(emailFundNavDOList);
+            List<NavDO> navDOList = emailFundNavDOList.stream().filter(e -> StrUtil.isNotBlank(e.getFundId()))
+                    .map(e -> BeanUtil.copyProperties(e, NavDO.class)).collect(Collectors.toList());
+            saveNavDo(navDOList);
         }
         // 保存规模数据
         List<EmailFundAssetDO> emailFundAssetDOList = fundNavDTOList.stream()
-                .map(e -> buildEmailFundAssetDo(fileId, e, parseDate)).flatMap(List::stream).collect(Collectors.toList());
+                .map(e -> buildEmailFundAssetDo(fileId, e, parseDate)).filter(CollUtil::isNotEmpty).flatMap(List::stream).collect(Collectors.toList());
         if (CollUtil.isNotEmpty(emailFundAssetDOList)) {
             emailFundAssetMapper.batchInsert(emailFundAssetDOList);
+            List<AssetDO> assetDOList = emailFundAssetDOList.stream().filter(e -> StrUtil.isNotBlank(e.getFundId()))
+                    .map(e -> BeanUtil.copyProperties(e, AssetDO.class)).collect(Collectors.toList());
+            saveAssetDo(assetDOList);
+        }
+    }
+
+    private void saveNavDo(List<NavDO> navDOList) {
+        if (CollUtil.isEmpty(navDOList)) {
+            return;
+        }
+        Map<String, List<NavDO>> fundIdNavMap = navDOList.stream().collect(Collectors.groupingBy(NavDO::getFundId));
+        for (Map.Entry<String, List<NavDO>> entry : fundIdNavMap.entrySet()) {
+            List<NavDO> navDOS = entry.getValue();
+            List<String> priceDateList = navDOS.stream().map(NavDO::getPriceDate).map(e -> DateUtil.format(e, DateConst.YYYY_MM_DD)).collect(Collectors.toList());
+            List<String> dateList = navMapper.queryFundNavByDate(entry.getKey(), priceDateList);
+            List<NavDO> updateNavDoList = navDOS.stream().filter(e -> dateList.contains(DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).collect(Collectors.toList());
+            List<NavDO> insertNavDoList = navDOS.stream().filter(e -> !dateList.contains(DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).collect(Collectors.toList());
+            if(CollUtil.isNotEmpty(insertNavDoList)){
+                navMapper.batchInsert(insertNavDoList);
+            }
+            if(CollUtil.isNotEmpty(updateNavDoList)){
+                navMapper.batchUpdate(updateNavDoList);
+            }
+        }
+    }
+
+    private void saveAssetDo(List<AssetDO> assetDOList) {
+        if (CollUtil.isEmpty(assetDOList)) {
+            return;
+        }
+        Map<String, List<AssetDO>> fundIdNavMap = assetDOList.stream().collect(Collectors.groupingBy(AssetDO::getFundId));
+        for (Map.Entry<String, List<AssetDO>> entry : fundIdNavMap.entrySet()) {
+            List<AssetDO> assetDOS = entry.getValue();
+            List<String> priceDateList = assetDOS.stream().map(AssetDO::getPriceDate).map(e -> DateUtil.format(e, DateConst.YYYY_MM_DD)).collect(Collectors.toList());
+            List<String> dateList = assetMapper.queryFundNavByDate(entry.getKey(), priceDateList);
+            List<AssetDO> updateAssetDoList = assetDOS.stream().filter(e -> dateList.contains(DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).collect(Collectors.toList());
+            List<AssetDO> insertAssetDoList = assetDOS.stream().filter(e -> !dateList.contains(DateUtil.format(e.getPriceDate(), DateConst.YYYY_MM_DD))).collect(Collectors.toList());
+            if(CollUtil.isNotEmpty(insertAssetDoList)){
+                assetMapper.batchInsert(insertAssetDoList);
+            }
+            if(CollUtil.isNotEmpty(updateAssetDoList)){
+                assetMapper.batchUpdate(updateAssetDoList);
+            }
         }
     }
 
@@ -218,6 +274,9 @@ public class EmailParseService {
         Date priceDate = DateUtil.parse(fundNavDTO.getPriceDate(), DateConst.YYYY_MM_DD);
         BigDecimal nav = StrUtil.isNotBlank(fundNavDTO.getNav()) ? new BigDecimal(fundNavDTO.getNav()) : null;
         BigDecimal cumulativeNavWithdrawal = StrUtil.isNotBlank(fundNavDTO.getCumulativeNavWithdrawal()) ? new BigDecimal(fundNavDTO.getCumulativeNavWithdrawal()) : null;
+        if (nav == null && cumulativeNavWithdrawal == null) {
+            return CollUtil.newArrayList();
+        }
         Integer isStored = fundNavDTO.getParseStatus() != null && !fundNavDTO.getParseStatus().equals(NavParseStatusConst.NAV_DEFICIENCY)
                 && !fundNavDTO.getParseStatus().equals(NavParseStatusConst.NOT_MATCH) ? 1 : 0;
         if (CollUtil.isNotEmpty(fundNavDTO.getFundIdList())) {
@@ -261,7 +320,8 @@ public class EmailParseService {
 
     private Integer saveEmailFileInfo(Integer emailId, String fileName, String filePath, Date parseDate) {
         EmailFileInfoDO emailFileInfoDO = buildEmailFileInfoDO(emailId, fileName, filePath, parseDate);
-        return emailFileInfoMapper.insert(emailFileInfoDO);
+        emailFileInfoMapper.insert(emailFileInfoDO);
+        return emailFileInfoDO.getId();
     }
 
     private EmailFileInfoDO buildEmailFileInfoDO(Integer emailId, String fileName, String filePath, Date parseDate) {
@@ -277,11 +337,10 @@ public class EmailParseService {
         return emailFileInfoDO;
     }
 
-    private void setNavParseStatus(EmailFundNavDTO fundNavDTO, String emailTitle, String emailDate) {
-        Integer navParseStatus = getDataParseStatus(fundNavDTO);
-        fundNavDTO.setParseStatus(navParseStatus);
-        if (navParseStatus.equals(NavParseStatusConst.NAV_DEFICIENCY)) {
-            log.info("判断数据的解析状态 -> 邮件主题:{},邮件日期:{},数据解析状态:{}", emailTitle, emailDate, fundNavDTO.getParseStatus());
+    private void setNavParseStatus(EmailFundNavDTO fundNavDTO, String emailTitle) {
+        // 1.单位净值或累计净值缺失
+        if (StrUtil.isBlank(fundNavDTO.getNav()) || StrUtil.isBlank(fundNavDTO.getCumulativeNavWithdrawal())) {
+            fundNavDTO.setParseStatus(NavParseStatusConst.NAV_DEFICIENCY);
             return;
         }
         // 2.匹配基金
@@ -289,13 +348,27 @@ public class EmailParseService {
         if (CollUtil.isEmpty(fundIdList)) {
             fundNavDTO.setParseStatus(NavParseStatusConst.NOT_MATCH);
         }
-        log.info("判断数据的解析状态 -> 邮件主题:{},邮件日期:{},数据解析状态:{}", emailTitle, emailDate, fundNavDTO.getParseStatus());
         fundNavDTO.setFundIdList(fundIdList);
+        // 考虑单独规模文件时 -> 无单位净值和累计净值
+        // 3.单位净值或累计净值不大于0
+        if (!emailTitle.contains("规模")) {
+            if (StrUtil.isBlank(fundNavDTO.getNav()) || StrUtil.isBlank(fundNavDTO.getCumulativeNavWithdrawal())
+                    || (fundNavDTO.getNav().compareTo("0") <= 0 || fundNavDTO.getCumulativeNavWithdrawal().compareTo("0") <= 0)) {
+                fundNavDTO.setParseStatus(NavParseStatusConst.NAV_NEGATIVE);
+                return;
+            }
+        }
+        // 4.资产净值不大于0
+        if (StrUtil.isNotBlank(fundNavDTO.getAssetNet()) && fundNavDTO.getAssetNet().compareTo("0") <= 0) {
+            fundNavDTO.setParseStatus(NavParseStatusConst.ASSET_NET_NEGATIVE);
+            return;
+        }
+        fundNavDTO.setParseStatus(NavParseStatusConst.SUCCESS);
     }
 
     private List<String> matchFund(String fundName, String registerNumber) {
         // 1.基金名称 + 备案编码 一起进行匹配
-        List<String> fundIdList = fundInfomationMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
+        List<String> fundIdList = fundInfoMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
         if (CollUtil.isNotEmpty(fundIdList)) {
             return fundIdList;
         }
@@ -305,7 +378,7 @@ public class EmailParseService {
         }
         // 2.基金名称匹配
         if (StrUtil.isNotBlank(fundName)) {
-            List<String> fundIds = fundInfomationMapper.queryFundByName(fundName);
+            List<String> fundIds = fundInfoMapper.queryFundByName(fundName);
             if (CollUtil.isNotEmpty(fundIds)) {
                 return fundIdList;
             }
@@ -316,7 +389,7 @@ public class EmailParseService {
         }
         // 3.备案编码匹配
         if (StrUtil.isNotBlank(fundName)) {
-            List<String> fundIds = fundInfomationMapper.queryFundByRegisterNumber(registerNumber);
+            List<String> fundIds = fundInfoMapper.queryFundByRegisterNumber(registerNumber);
             if (CollUtil.isNotEmpty(fundIds)) {
                 return fundIds;
             }
@@ -332,7 +405,8 @@ public class EmailParseService {
         if (emailParseInfoDO == null) {
             return null;
         }
-        return emailParseInfoMapper.insert(emailParseInfoDO);
+        emailParseInfoMapper.insert(emailParseInfoDO);
+        return emailParseInfoDO.getId();
     }
 
     private EmailParseInfoDO buildEmailParseInfo(String emailAddress, String emailDate, String emailTitle, Integer emailType, Integer parseStatus, Date parseDate) {
@@ -351,22 +425,6 @@ public class EmailParseService {
         return emailParseInfoDO;
     }
 
-    private Integer getDataParseStatus(EmailFundNavDTO fundNavDTO) {
-        // 1.单位净值或累计净值缺失
-        if (StrUtil.isBlank(fundNavDTO.getNav()) || StrUtil.isBlank(fundNavDTO.getCumulativeNavWithdrawal())) {
-            return NavParseStatusConst.NAV_DEFICIENCY;
-        }
-        // 3.单位净值或累计净值不大于0
-        if (fundNavDTO.getNav().compareTo("0") <= 0 || fundNavDTO.getCumulativeNavWithdrawal().compareTo("0") <= 0) {
-            return NavParseStatusConst.NAV_NEGATIVE;
-        }
-        // 4.资产净值不大于0
-        if (StrUtil.isNotBlank(fundNavDTO.getAssetNet()) && fundNavDTO.getAssetNet().compareTo("0") <= 0) {
-            return NavParseStatusConst.ASSET_NET_NEGATIVE;
-        }
-        return NavParseStatusConst.SUCCESS;
-    }
-
     public Map<String, List<String>> getEmailFieldMapping() {
         List<EmailFieldMappingDO> emailFieldMappingDOList = emailFieldMapper.getEmailFieldMapping();
         return emailFieldMappingDOList.stream()
@@ -406,7 +464,6 @@ public class EmailParseService {
         // 获取邮件日期大于等于startDate的邮件(搜索条件只支持按天)
         SearchTerm startDateTerm = new ReceivedDateTerm(ComparisonTerm.GE, startDate);
         Message[] messages = folder.search(startDateTerm);
-        String path = "/data/file/nav";
         Map<String, List<EmailContentInfoDTO>> emailMessageMap = MapUtil.newHashMap();
         for (Message message : messages) {
             List<EmailContentInfoDTO> emailContentInfoDTOList = CollUtil.newArrayList();
@@ -437,8 +494,8 @@ public class EmailParseService {
                     emailContentInfoDTO.setEmailContent(content.toString());
                     emailContentInfoDTO.setEmailDate(emailDateStr);
                     String fileName = message.getSubject() + DateUtil.format(emailDate, DateConst.YYYYMMDDHHMMSS24);
-                    String filePath = path + mailboxInfoDTO.getAccount() + "/" + fileName + ".html";
-                    File savefile = new File(path + filePath);
+                    String filePath = path + mailboxInfoDTO.getAccount() + "/" + DateUtil.format(emailDate, DateConst.YYYY_MM_DD) + "/" + fileName + ".html";
+                    File savefile = new File(filePath);
                     savefile.setReadable(true);
                     if (!savefile.exists()) {
                         if (!savefile.getParentFile().exists()) {

+ 74 - 51
service-daq/src/main/java/com/simuwang/daq/service/NavEmailParser.java

@@ -26,6 +26,7 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import technology.tabula.*;
 import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
@@ -35,10 +36,7 @@ import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -51,6 +49,9 @@ public class NavEmailParser extends AbstractEmailParser {
 
     private static final Logger log = LoggerFactory.getLogger(AbstractEmailParser.class);
 
+    @Value("${email.file.path}")
+    private String path;
+
     private static final Integer ROW_DIRECTION_TYPE = 1;
     private static final Integer COLUMN_DIRECTION_TYPE = 2;
 
@@ -76,7 +77,14 @@ public class NavEmailParser extends AbstractEmailParser {
         }
         // 3.解析邮件pdf附件
         if (StrUtil.isNotBlank(emailContentInfoDTO.getFilePath()) && ExcelUtil.isPdf(emailContentInfoDTO.getFileName())) {
-            List<EmailFundNavDTO> fundNavDTOList = parsePdfFile(emailContentInfoDTO, emailContentInfoDTO.getFilePath(), emailFieldMap);
+            String excelFilePath = path + emailContentInfoDTO.getEmailAddress() + "/" + emailContentInfoDTO.getEmailDate().substring(0, 10).replaceAll("-", "")
+                    + "/" + emailContentInfoDTO.getFileName().replace(".pdf", ".xlsx").replace(".PDF", ".xlsx");
+            List<EmailFundNavDTO> fundNavDTOList = parsePdfFile(emailContentInfoDTO.getFilePath(), excelFilePath, emailFieldMap);
+            Optional.ofNullable(fundNavDTOList).ifPresent(emailFundNavDTOList::addAll);
+        }
+        // 4.解析邮件zip,rar附件
+        if (StrUtil.isNotBlank(emailContentInfoDTO.getFilePath()) && ExcelUtil.isZip(emailContentInfoDTO.getFileName())) {
+            List<EmailFundNavDTO> fundNavDTOList = parsePackageFile(emailContentInfoDTO, emailContentInfoDTO.getFileName(), emailContentInfoDTO.getFilePath(), emailFieldMap);
             Optional.ofNullable(fundNavDTOList).ifPresent(emailFundNavDTOList::addAll);
         }
 
@@ -87,17 +95,48 @@ public class NavEmailParser extends AbstractEmailParser {
         return emailFundNavDTOList;
     }
 
+    private List<EmailFundNavDTO> parsePackageFile(EmailContentInfoDTO emailContentInfoDTO, String fileName, String filePath, Map<String, List<String>> emailFieldMap) {
+        String destPath = filePath.substring(0, filePath.indexOf(fileName)) + fileName.replaceAll(".zip", "").replaceAll(".ZIP", "");
+        log.info("压缩包地址:{},解压后文件地址:{}", filePath, destPath);
+        List<String> dir = ExcelUtil.extractCompressedFiles(filePath, destPath);
+        List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
+        for (String zipFilePath : dir) {
+            emailFundNavDTOList.addAll(parseZipFile(emailContentInfoDTO, zipFilePath, emailFieldMap));
+            File file = new File(zipFilePath);
+            if (file.isDirectory()) {
+                for (String navFilePath : Objects.requireNonNull(file.list())) {
+                    emailFundNavDTOList.addAll(parseZipFile(emailContentInfoDTO, navFilePath, emailFieldMap));
+                }
+            }
+        }
+        return emailFundNavDTOList;
+    }
+
+    private List<EmailFundNavDTO> parseZipFile(EmailContentInfoDTO emailContentInfoDTO, String zipFilePath, Map<String, List<String>> emailFieldMap) {
+        List<EmailFundNavDTO> fundNavDTOList = CollUtil.newArrayList();
+        if (ExcelUtil.isPdf(zipFilePath)) {
+            String excelFilePath = zipFilePath.replace(".pdf", ".xlsx").replace(".PDF", ".xlsx");
+            fundNavDTOList = parsePdfFile(zipFilePath, excelFilePath, emailFieldMap);
+        }
+        if (ExcelUtil.isExcel(zipFilePath)) {
+            fundNavDTOList = parseExcelFile(zipFilePath, emailFieldMap);
+        }
+        if (ExcelUtil.isZip(zipFilePath)) {
+            String name = new File(zipFilePath).getName();
+            fundNavDTOList = parsePackageFile(emailContentInfoDTO, name, zipFilePath, emailFieldMap);
+        }
+        return fundNavDTOList;
+    }
+
     /**
      * 解析邮件pdf附件
      *
-     * @param emailContentInfoDTO 邮件信息
-     * @param filePath            邮件excel附件地址
-     * @param emailFieldMap       邮件字段识别规则映射表
+     * @param filePath      邮件pdf附件路径
+     * @param excelFilePath pdf转excel路径
+     * @param emailFieldMap 邮件字段识别规则映射表
      * @return 解析到的净值数据
      */
-    private List<EmailFundNavDTO> parsePdfFile(EmailContentInfoDTO emailContentInfoDTO, String filePath, Map<String, List<String>> emailFieldMap) {
-        String excelFilePath = "/data/file/pdf/" + emailContentInfoDTO.getEmailAddress() + "/" + emailContentInfoDTO.getEmailDate().substring(0, 10).replaceAll("-", "")
-                + "/" + emailContentInfoDTO.getFileName().replace(".pdf", ".xlsx").replace(".PDF", ".xlsx");
+    private List<EmailFundNavDTO> parsePdfFile(String filePath, String excelFilePath, Map<String, List<String>> emailFieldMap) {
         File savefile = new File(excelFilePath);
         if (!savefile.exists()) {
             if (!savefile.getParentFile().exists()) {
@@ -131,7 +170,7 @@ public class NavEmailParser extends AbstractEmailParser {
             // 将Excel工作簿写入输出流
             workbook.write(outputStream);
         } catch (Exception e) {
-            log.error("解析邮件pdf附件报错 -> 邮件主题:{},邮件日期:{},堆栈信息:{}", emailContentInfoDTO.getEmailTitle(), emailContentInfoDTO.getEmailDate(), ExceptionUtil.stacktraceToString(e));
+            log.error("解析邮件pdf附件报错 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
         }
         return parseExcelFile(excelFilePath, emailFieldMap);
     }
@@ -181,7 +220,7 @@ public class NavEmailParser extends AbstractEmailParser {
             // 创建一个新的Excel工作簿
             Workbook workbook = new XSSFWorkbook();
             Sheet sheet = workbook.createSheet("Sheet1");
-            writeDataToSheet(sheet, rows);
+            ExcelUtil.writeDataToSheet(sheet, rows);
             // 将Excel工作簿写入输出流
             workbook.write(outputStream);
         } catch (Exception e) {
@@ -221,7 +260,7 @@ public class NavEmailParser extends AbstractEmailParser {
                     if (cell == null) {
                         continue;
                     }
-                    fieldValueMap.put(fieldRowMap.get(rowNum), cell.getStringCellValue());
+                    fieldValueMap.put(fieldRowMap.get(rowNum), ExcelUtil.getCellValue(cell));
                 }
                 Optional.ofNullable(buildEmailFundNavDTO(fieldValueMap)).ifPresent(fundNavDTOList::add);
             }
@@ -251,7 +290,7 @@ public class NavEmailParser extends AbstractEmailParser {
                 if (cell == null) {
                     continue;
                 }
-                String cellValue = cell.getStringCellValue();
+                String cellValue = ExcelUtil.getCellValue(cell);
                 if (StrUtil.isNotBlank(cellValue) && cellValue.contains("截至")) {
                     int index = cellValue.indexOf("截至");
                     String date = cellValue.substring(index + 2, index + 2 + 10);
@@ -288,12 +327,11 @@ public class NavEmailParser extends AbstractEmailParser {
 
         // pdf解析到的值带有",",比如:"10,656,097.37"
         String assetNet = fieldValueMap.get(EmailFieldConst.ASSET_NET);
-        assetNet = StrUtil.isNotBlank(assetNet) ? assetNet.replaceAll(",", "") : null;
+        fundNavDTO.setAssetNet(ExcelUtil.numberDataStripCommas(assetNet));
 
-        fundNavDTO.setAssetNet(assetNet);
         String assetShares = fieldValueMap.get(EmailFieldConst.ASSET_NET);
-        assetShares = StrUtil.isNotBlank(assetShares) ? assetShares.replaceAll(",", "") : null;
-        fundNavDTO.setAssetShare(assetShares);
+        fundNavDTO.setAssetNet(ExcelUtil.numberDataStripCommas(assetShares));
+
         return fundNavDTO;
     }
 
@@ -305,7 +343,9 @@ public class NavEmailParser extends AbstractEmailParser {
                 ? ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.NAV))) : null;
         String cumulativeNavWithdrawal = columnFieldMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL))) : null;
-        if (StrUtil.isBlank(nav) && StrUtil.isBlank(cumulativeNavWithdrawal)) {
+        String assetNet = columnFieldMap.get(EmailFieldConst.ASSET_NET) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET)) != null ?
+                ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET))) : null;
+        if (StrUtil.isBlank(nav) && StrUtil.isBlank(cumulativeNavWithdrawal) && StrUtil.isBlank(assetNet)) {
             return null;
         }
         List<EmailFundNavDTO> fundNavDTOList = CollUtil.newArrayList();
@@ -321,30 +361,28 @@ public class NavEmailParser extends AbstractEmailParser {
         // 正常净值文件格式
         if (StrUtil.isNotBlank(priceDate) && !priceDate.contains("-")) {
             // 处理日期yyyyMMdd格式 -> 转成yyyy-MM-dd
+            priceDate = priceDate.replace("年", "").replace("月", "").replace("日", "");
             priceDate = DateUtil.format(DateUtil.parse(priceDate, DateConst.YYYYMMDD), DateConst.YYYY_MM_DD);
         }
         emailFundNavDTO.setPriceDate(priceDate);
-        String fundName = columnFieldMap.get(EmailFieldConst.FUND_NAME) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.FUND_NAME)).getStringCellValue() != null ?
-                ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.FUND_NAME))) : null;
+        String fundName = ExcelUtil.getPriorityFieldValue(sheetRow, columnFieldMap.get(EmailFieldConst.LEVEL_FUND_NAME), columnFieldMap.get(EmailFieldConst.FUND_NAME));
         emailFundNavDTO.setFundName(fundName);
 
-        String registerNumber = columnFieldMap.get(EmailFieldConst.REGISTER_NUMBER) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.REGISTER_NUMBER)) != null ?
-                ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.REGISTER_NUMBER))) : null;
+        String registerNumber = ExcelUtil.getPriorityFieldValue(sheetRow, columnFieldMap.get(EmailFieldConst.LEVEL_REGISTER_NUMBER), columnFieldMap.get(EmailFieldConst.REGISTER_NUMBER));
         emailFundNavDTO.setRegisterNumber(registerNumber);
+
         emailFundNavDTO.setNav(nav);
         emailFundNavDTO.setCumulativeNavWithdrawal(cumulativeNavWithdrawal);
         String virtualNav = columnFieldMap.get(EmailFieldConst.VIRTUAL_NAV) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.VIRTUAL_NAV)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.VIRTUAL_NAV))) : null;
         emailFundNavDTO.setVirtualNav(virtualNav);
-        String assetNet = columnFieldMap.get(EmailFieldConst.ASSET_NET) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET)) != null ?
-                ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET))) : null;
-        // pdf解析到的值带有",",比如:"10,656,097.37"
-        assetNet = StrUtil.isNotBlank(assetNet) ? assetNet.replaceAll(",", "") : null;
-        emailFundNavDTO.setAssetNet(assetNet);
+
+
+        emailFundNavDTO.setAssetNet(ExcelUtil.numberDataStripCommas(assetNet));
+
         String assetShares = columnFieldMap.get(EmailFieldConst.ASSET_SHARE) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE))) : null;
-        assetShares = StrUtil.isNotBlank(assetShares) ? assetShares.replaceAll(",", "") : null;
-        emailFundNavDTO.setAssetShare(assetShares);
+        emailFundNavDTO.setAssetShare(ExcelUtil.numberDataStripCommas(assetShares));
 
         fundNavDTOList.add(emailFundNavDTO);
         return fundNavDTOList;
@@ -361,6 +399,7 @@ public class NavEmailParser extends AbstractEmailParser {
         }
         if (StrUtil.isNotBlank(priceDate) && !priceDate.contains("-")) {
             // 处理日期yyyyMMdd格式 -> 转成yyyy-MM-dd
+            priceDate = priceDate.replace("年", "").replace("月", "").replace("日", "");
             priceDate = DateUtil.format(DateUtil.parse(priceDate, DateConst.YYYYMMDD), DateConst.YYYY_MM_DD);
         }
         emailFundNavDTO.setPriceDate(priceDate);
@@ -378,13 +417,12 @@ public class NavEmailParser extends AbstractEmailParser {
 
         String assetNet = columnFieldMap.get(EmailFieldConst.PARENT_ASSET_NET) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_ASSET_NET)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_ASSET_NET))) : null;
-        assetNet = StrUtil.isNotBlank(assetNet) ? assetNet.replaceAll(",", "") : null;
-        emailFundNavDTO.setAssetNet(assetNet);
+        emailFundNavDTO.setAssetNet(ExcelUtil.numberDataStripCommas(assetNet));
+
         String assetShares = columnFieldMap.get(EmailFieldConst.PARENT_ASSET_SHARE) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_ASSET_SHARE)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_ASSET_SHARE))) : null;
-        assetShares = StrUtil.isNotBlank(assetShares) ? assetShares.replaceAll(",", "") : null;
+        emailFundNavDTO.setAssetNet(ExcelUtil.numberDataStripCommas(assetShares));
 
-        emailFundNavDTO.setAssetShare(assetShares);
         return emailFundNavDTO;
     }
 
@@ -435,7 +473,7 @@ public class NavEmailParser extends AbstractEmailParser {
     private Map<String, Pair<Integer, Integer>> getFieldPosition(Sheet sheet, Map<String, List<String>> emailFieldMap) {
         Map<String, List<Pair<Integer, Integer>>> tempFieldPositionMap = MapUtil.newHashMap();
         int lastRowNum = sheet.getLastRowNum();
-        for (int rowNum = 0; rowNum < lastRowNum; rowNum++) {
+        for (int rowNum = 0; rowNum <= lastRowNum; rowNum++) {
             Row sheetRow = sheet.getRow(rowNum);
             if (sheetRow == null) {
                 continue;
@@ -501,19 +539,4 @@ public class NavEmailParser extends AbstractEmailParser {
         }
         return null;
     }
-
-    private void writeDataToSheet(Sheet sheet, Elements rows) {
-        int rowSize = rows.size();
-        for (int rowNum = 0; rowNum < rowSize; rowNum++) {
-            Row sheetRow = sheet.createRow(rowNum);
-
-            Element elementRow = rows.get(rowNum);
-            Elements cells = elementRow.select("td");
-            int cellSize = cells.size();
-            for (int cellNum = 0; cellNum < cellSize; cellNum++) {
-                Cell sheetRowCell = sheetRow.createCell(cellNum);
-                sheetRowCell.setCellValue(cells.get(cellNum).text());
-            }
-        }
-    }
 }

+ 4 - 0
service-deploy/src/main/resources/application.yml

@@ -44,6 +44,10 @@ email-rule:
   valuation: "估值表"
   report: "月报,年报,季报,报告(待确认)信息披露报告,证券类月报"
 
+email:
+  file:
+    path: /data/file/nav
+
 # 配置
 simuwang:
   token-expire: 86400

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

@@ -32,8 +32,8 @@ class DataTrusteeApplicationTests {
         emailInfoDTO.setProtocol("imap");
         Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap();
         emailTypeMap.put(1, List.of("净值"));
-        Date startDate = DateUtil.parse("2024-09-10 15:30:00", DateConst.YYYY_MM_DD_HH_MM_SS);
-        Date endDate = DateUtil.parse("2024-09-10 18:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date startDate = DateUtil.parse("2024-09-12 11:10:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date endDate = DateUtil.parse("2024-09-12 12:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate);
         } catch (Exception e) {

+ 28 - 13
service-manage/src/main/java/com/simuwang/manage/api/company/CompanyEmailSendHistoryController.java

@@ -5,6 +5,7 @@ import com.simuwang.base.common.page.TableDataInfo;
 import com.simuwang.base.common.result.AjaxResult;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
+import com.simuwang.base.pojo.vo.SaveSuccessVO;
 import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.CompanyEmailConfigService;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
@@ -15,7 +16,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import java.util.List;
-import java.util.Map;
 
 /**
  * FileName: CompanyInformationController
@@ -47,23 +47,35 @@ public class CompanyEmailSendHistoryController extends BaseController {
 
     /**
      * 查询邮箱发送历史
-     * @param email
+     * @param companyId
      * @return
      */
     @RequestMapping("search-email-history")
-    public TableDataInfo searchEmailHistory(@RequestParam(value = "email",required = false)String email){
-        List<CompanyEmailSendHistoryVO> result = companyEmailSendHistoryService.searchEmailHistory(email);
+    public TableDataInfo searchEmailHistory(@RequestParam(value = "companyId")String companyId){
+        List<CompanyEmailSendHistoryVO> result = companyEmailSendHistoryService.searchEmailHistory(companyId);
+        return getDataTable(result);
+    }
+
+
+    /**
+     * 查询邮箱发送历史
+     * @param companyId
+     * @return
+     */
+    @RequestMapping("search-email-config")
+    public TableDataInfo searchEmailConfig(@RequestParam(value = "companyId",required = false)String companyId){
+        List<CompanyEmailConfigVO> result = companyEmailSendHistoryService.searchEmailConfig(companyId);
         return getDataTable(result);
     }
 
     /**
      * 删除邮箱配置
-     * @param email
+     * @param companyId
      * @return
      */
-    @PostMapping("delete-email")
-    public AjaxResult deleteEmail(@RequestParam(value = "email",required = false)String email){
-        companyEmailSendHistoryService.deleteEmail(email);
+    @PostMapping("delete-company-email")
+    public AjaxResult deleteEmail(@RequestParam(value = "companyId")String companyId){
+        companyEmailSendHistoryService.deleteEmail(companyId);
         return AjaxResult.success();
     }
     /**
@@ -79,14 +91,15 @@ public class CompanyEmailSendHistoryController extends BaseController {
 
     /**
      * 保存邮箱配置
-     * @param companyEmailConfigVOS
+     * @param companyEmailConfigVOList
      * @return
      */
     @PostMapping("save-email-config")
-    public ResultVo saveCompanyEmailConfig(@RequestBody List<CompanyEmailConfigVO> companyEmailConfigVOS){
+    public ResultVo saveCompanyEmailConfig(@RequestBody List<CompanyEmailConfigVO> companyEmailConfigVOList){
         ResultVo vo = new ResultVo(ResultCode.SAVE_SUCCESS);
         try{
-            companyEmailConfigService.saveCompanyEmailConfig(companyEmailConfigVOS);
+            SaveSuccessVO saveSuccessVO = companyEmailConfigService.saveCompanyEmailConfig(companyEmailConfigVOList);
+            vo.setData(saveSuccessVO);
         }catch (Exception e){
             vo = new ResultVo(ResultCode.SAVE_FAILED);
             logger.error(e.getMessage(),e);
@@ -103,7 +116,8 @@ public class CompanyEmailSendHistoryController extends BaseController {
     public ResultVo updateCompanyEmailConfig(@RequestBody CompanyEmailConfigVO companyEmailConfigVO){
         ResultVo vo = new ResultVo(ResultCode.SAVE_SUCCESS);
         try{
-            companyEmailConfigService.updateCompanyEmailConfig(companyEmailConfigVO);
+            SaveSuccessVO saveSuccessVO = companyEmailConfigService.updateCompanyEmailConfig(companyEmailConfigVO);
+            vo.setData(saveSuccessVO);
         }catch (Exception e){
             vo = new ResultVo(ResultCode.SAVE_FAILED);
             logger.error(e.getMessage(),e);
@@ -120,7 +134,8 @@ public class CompanyEmailSendHistoryController extends BaseController {
     public ResultVo deleteCompanyEmailConfig(@RequestParam("id")Integer id){
         ResultVo vo = new ResultVo(ResultCode.DELETE_SUCCESS);
         try{
-            companyEmailConfigService.deleteCompanyEmailConfig(id);
+            SaveSuccessVO saveSuccessVO = companyEmailConfigService.deleteCompanyEmailConfig(id);
+            vo.setData(saveSuccessVO);
         }catch (Exception e){
             vo = new ResultVo(ResultCode.DELETE_FAILED);
             logger.error(e.getMessage(),e);

+ 3 - 2
service-manage/src/main/java/com/simuwang/manage/api/email/EmailConfigController.java

@@ -6,6 +6,7 @@ import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
 import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.EmailConfigService;
+import org.apache.ibatis.annotations.Param;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,7 +49,7 @@ public class EmailConfigController extends BaseController {
     @RequestMapping("save-email-config")
     public AjaxResult saveEmailConfig(@RequestBody MailboxInfoVO mailboxInfoVO){
         try{
-            if(mailboxInfoVO.getId() == null && emailConfigService.checkEmailUnique(mailboxInfoVO.getEmail())){
+            if(mailboxInfoVO.getId() == null && !emailConfigService.checkEmailUnique(mailboxInfoVO.getEmail())){
                 return AjaxResult.error("邮箱地址已存在,无需添加");
             }
             emailConfigService.saveEmailConfig(mailboxInfoVO);
@@ -65,7 +66,7 @@ public class EmailConfigController extends BaseController {
      * @return
      */
     @RequestMapping("delete-email-config")
-    public AjaxResult deleteEmailConfig(String ids){
+    public AjaxResult deleteEmailConfig(@RequestParam("ids") String ids){
         try{
             emailConfigService.deleteEmailConfig(ids);
         }catch (Exception e){

+ 45 - 0
service-manage/src/main/java/com/simuwang/manage/api/email/ParseEmailController.java

@@ -2,14 +2,23 @@ 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.util.EncodeUtil;
+import com.simuwang.base.pojo.vo.EmailFileInfoVO;
 import com.simuwang.base.pojo.vo.EmailParseInfoVO;
 import com.simuwang.base.pojo.vo.EmailTypeRuleVO;
 import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.ParseEmailService;
+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.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -95,4 +104,40 @@ public class ParseEmailController extends BaseController {
         Map<String,Integer> result = parseEmailService.searchEmailCount(parseDate);
         return AjaxResult.success(result);
     }
+
+    /**
+     * 下载邮件附件
+     * @param fileId
+     * @return
+     */
+    @PostMapping("/download-email-file")
+    public void downloadEmailFile(@RequestParam("fileId") Integer fileId, HttpServletResponse response, HttpServletRequest request){
+        try {
+            EmailFileInfoVO emailFileInfoVO = parseEmailService.getEmailFileById(fileId);
+            FileInputStream fileInputStream = new FileInputStream(emailFileInfoVO.getFilePath());
+            response.setContentType("application/octet-stream");
+            response.addHeader("Content-Disposition", "attachment;filename=" + EncodeUtil.encodeUTF8(emailFileInfoVO.getFileName()));
+            ServletOutputStream outputStream = response.getOutputStream();
+            byte[] b = new byte[1024];
+            while(fileInputStream.read(b) > 0){
+                outputStream.write(b);
+            }
+            fileInputStream.close();
+            outputStream.flush();
+            outputStream.close();
+        } catch (IOException e) {
+            logger.error(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * 重新解析
+     * @param id
+     * @return
+     */
+    @GetMapping("/reparse/{id}")
+    public AjaxResult reparse(@PathVariable("id")Integer id){
+
+        return AjaxResult.success();
+    }
 }

+ 4 - 3
service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailConfigService.java

@@ -1,6 +1,7 @@
 package com.simuwang.manage.service;
 
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
+import com.simuwang.base.pojo.vo.SaveSuccessVO;
 
 import java.util.List;
 
@@ -12,9 +13,9 @@ import java.util.List;
  */
 public interface CompanyEmailConfigService {
 
-    void saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS);
+    SaveSuccessVO saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS);
 
-    void deleteCompanyEmailConfig(Integer id);
+    SaveSuccessVO deleteCompanyEmailConfig(Integer id);
 
-    void updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO);
+    SaveSuccessVO updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO);
 }

+ 4 - 1
service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailSendHistoryService.java

@@ -1,5 +1,6 @@
 package com.simuwang.manage.service;
 
+import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 
 import java.util.List;
@@ -12,9 +13,11 @@ import java.util.List;
  */
 public interface CompanyEmailSendHistoryService {
     List<CompanyEmailSendHistoryVO> searchCompanyEmail(String companyName, String email, Integer sendStatus);
-    List<CompanyEmailSendHistoryVO> searchEmailHistory(String email);
+    List<CompanyEmailSendHistoryVO> searchEmailHistory(String companyId);
 
     void deleteEmail(String email);
 
     void deleteEmailHistory(String ids);
+
+    List<CompanyEmailConfigVO> searchEmailConfig(String companyId);
 }

+ 4 - 0
service-manage/src/main/java/com/simuwang/manage/service/ParseEmailService.java

@@ -1,5 +1,6 @@
 package com.simuwang.manage.service;
 
+import com.simuwang.base.pojo.vo.EmailFileInfoVO;
 import com.simuwang.base.pojo.vo.EmailParseInfoVO;
 import com.simuwang.base.pojo.vo.EmailTypeRuleVO;
 
@@ -13,6 +14,7 @@ import java.util.Map;
  * Description: ${DESCRIPTION}
  */
 public interface ParseEmailService {
+
     void saveEmailType(EmailTypeRuleVO emailTypeRuleVO);
 
     EmailTypeRuleVO searchEmailType();
@@ -22,4 +24,6 @@ public interface ParseEmailService {
     EmailParseInfoVO searchEmailById(Integer id);
 
     Map<String, Integer> searchEmailCount(String parseDate);
+
+    EmailFileInfoVO getEmailFileById(Integer fileId);
 }

+ 58 - 29
service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailConfigServiceImpl.java

@@ -3,7 +3,9 @@ package com.simuwang.manage.service.impl;
 import com.simuwang.base.mapper.CompanyEmailConfigMapper;
 import com.simuwang.base.pojo.dos.CompanyEmailConfigDO;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
+import com.simuwang.base.pojo.vo.SaveSuccessVO;
 import com.simuwang.manage.service.CompanyEmailConfigService;
+import com.smppw.common.pojo.enums.status.ResultCode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -22,44 +24,71 @@ public class CompanyEmailConfigServiceImpl implements CompanyEmailConfigService
     @Autowired
     private CompanyEmailConfigMapper companyEmailConfigMapper;
     @Override
-    public void saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS) {
-        for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
-            CompanyEmailConfigDO emailConfigDO = new CompanyEmailConfigDO();
-            emailConfigDO.setCompanyId(emailConfigVO.getCompanyId());
-            emailConfigDO.setCompanyName(emailConfigVO.getCompanyName());
-            emailConfigDO.setEmail(emailConfigVO.getEmail());
-            emailConfigDO.setOpenStatus(emailConfigVO.getOpenStatus());
-            emailConfigDO.setIsvalid(1);
-            emailConfigDO.setUpdateTime(new Date());
-            if(emailConfigVO.getId() != null){
-                emailConfigDO.setId(emailConfigVO.getId());
-                companyEmailConfigMapper.updateCompanyEmailConfig(emailConfigDO);
-            }else{
-                emailConfigDO.setCreateTime(new Date());
-                companyEmailConfigMapper.saveCompanyEmailConfig(emailConfigDO);
+    public SaveSuccessVO saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS) {
+        SaveSuccessVO saveSuccessVO = new SaveSuccessVO();
+        try{
+            for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
+                CompanyEmailConfigDO emailConfigDO = new CompanyEmailConfigDO();
+                emailConfigDO.setCompanyId(emailConfigVO.getCompanyId());
+                emailConfigDO.setCompanyName(emailConfigVO.getCompanyName());
+                emailConfigDO.setEmail(emailConfigVO.getEmail());
+                emailConfigDO.setOpenStatus(emailConfigVO.getOpenStatus());
+                emailConfigDO.setIsvalid(1);
+                emailConfigDO.setUpdateTime(new Date());
+                if(emailConfigVO.getId() != null){
+                    emailConfigDO.setId(emailConfigVO.getId());
+                    companyEmailConfigMapper.updateCompanyEmailConfig(emailConfigDO);
+                }else{
+                    emailConfigDO.setCreateTime(new Date());
+                    companyEmailConfigMapper.saveCompanyEmailConfig(emailConfigDO);
+                }
             }
+            saveSuccessVO.setStatus(1);
+            saveSuccessVO.setMsg(ResultCode.SAVE_SUCCESS.getMsg());
+        }catch (Exception e){
+            saveSuccessVO.setStatus(0);
+            saveSuccessVO.setMsg(ResultCode.SAVE_FAILED.getMsg());
         }
+        return saveSuccessVO;
     }
 
     @Override
-    public void deleteCompanyEmailConfig(Integer id) {
-        CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectById(id);
-        if(configDO != null){
-            configDO.setIsvalid(0);
-            configDO.setUpdateTime(new Date());
-            companyEmailConfigMapper.updateById(configDO);
+    public SaveSuccessVO deleteCompanyEmailConfig(Integer id) {
+        SaveSuccessVO saveSuccessVO = new SaveSuccessVO();
+        try {
+            CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectById(id);
+            if (configDO != null) {
+                configDO.setIsvalid(0);
+                configDO.setUpdateTime(new Date());
+                companyEmailConfigMapper.updateById(configDO);
+            }
+            saveSuccessVO.setStatus(1);
+            saveSuccessVO.setMsg(ResultCode.SUCCESS.getMsg());
+        }catch (Exception e){
+            saveSuccessVO.setStatus(0);
+            saveSuccessVO.setMsg(ResultCode.DELETE_FAILED.getMsg());
         }
+        return saveSuccessVO;
     }
 
     @Override
-    public void updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO) {
-        CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(companyEmailConfigVO.getId());
-        if(configDO != null){
-            configDO.setEmail(companyEmailConfigVO.getEmail());
-            configDO.setCompanyId(companyEmailConfigVO.getCompanyId());
-            configDO.setCompanyName(companyEmailConfigVO.getCompanyName());
-            configDO.setUpdateTime(new Date());
-            companyEmailConfigMapper.updateCompanyEmailConfig(configDO);
+    public SaveSuccessVO updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO) {
+        SaveSuccessVO saveSuccessVO = new SaveSuccessVO();
+        try {
+            CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(companyEmailConfigVO.getId());
+            if(configDO != null){
+                configDO.setEmail(companyEmailConfigVO.getEmail());
+                configDO.setCompanyId(companyEmailConfigVO.getCompanyId());
+                configDO.setCompanyName(companyEmailConfigVO.getCompanyName());
+                configDO.setUpdateTime(new Date());
+                companyEmailConfigMapper.updateCompanyEmailConfig(configDO);
+            }
+            saveSuccessVO.setStatus(1);
+            saveSuccessVO.setMsg(ResultCode.SUCCESS.getMsg());
+        }catch (Exception e){
+            saveSuccessVO.setStatus(0);
+            saveSuccessVO.setMsg(ResultCode.SAVE_FAILED.getMsg());
         }
+        return saveSuccessVO;
     }
 }

+ 15 - 5
service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailSendHistoryServiceImpl.java

@@ -2,6 +2,7 @@ package com.simuwang.manage.service.impl;
 
 import com.simuwang.base.mapper.CompanyEmailConfigMapper;
 import com.simuwang.base.mapper.CompanyEmailSendHistoryMapper;
+import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,21 +30,30 @@ public class CompanyEmailSendHistoryServiceImpl implements CompanyEmailSendHisto
     }
 
     @Override
-    public List<CompanyEmailSendHistoryVO> searchEmailHistory(String email) {
-        return companyEmailSendHistoryMapper.searchEmailHistory(email);
+    public List<CompanyEmailSendHistoryVO> searchEmailHistory(String companyId) {
+        return companyEmailSendHistoryMapper.searchEmailHistory(companyId);
     }
 
     @Override
     @Transactional
-    public void deleteEmail(String email) {
+    public void deleteEmail(String companyId) {
+
+        List<String> emailList = companyEmailConfigMapper.searchEmailByCompanyId(companyId);
         //删除配置
-        companyEmailConfigMapper.deleteCompanyEmailConfig(email);
+        companyEmailConfigMapper.deleteCompanyEmailConfig(companyId);
         //删除历史
-        companyEmailSendHistoryMapper.deleteEmailHistory(email);
+        if(emailList.size() > 0){
+            companyEmailSendHistoryMapper.deleteEmailHistory(emailList);
+        }
     }
 
     @Override
     public void deleteEmailHistory(String ids) {
         companyEmailSendHistoryMapper.deleteEmailHistoryByIds(ids.split(","));
     }
+
+    @Override
+    public List<CompanyEmailConfigVO> searchEmailConfig(String companyId) {
+        return companyEmailConfigMapper.searchEmailConfig(companyId);
+    }
 }

+ 3 - 2
service-manage/src/main/java/com/simuwang/manage/service/impl/EmailConfigServiceImpl.java

@@ -49,12 +49,11 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         MailboxInfoDO mailboxInfoDO = toMailboxInfoDO(mailboxInfoVO);
         if(mailboxInfoVO.getId() == null){
             mailboxInfoDO.setCreateTime(new Date());
+            mailboxInfoDO.setCron(EmailCron.getEmailCronByText(mailboxInfoVO.getCron()).getCron());
             emailConfigMapper.insert(mailboxInfoDO);
         }else{
             emailConfigMapper.updateById(mailboxInfoDO);
         }
-        //添加定时任务
-
     }
 
     @Override
@@ -64,6 +63,7 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         mailboxInfoDTO.setPassword(mailboxInfoVO.getPassword());
         mailboxInfoDTO.setPort(mailboxInfoVO.getPort());
         mailboxInfoDTO.setHost(mailboxInfoVO.getServer());
+        mailboxInfoDTO.setProtocol(mailboxInfoVO.getProtocol());
         Store store = EmailUtil.getStoreNew(mailboxInfoDTO);
         if(store != null){
             try {
@@ -103,6 +103,7 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         mailboxInfoDO.setPassword(mailboxInfoVO.getPassword());
         mailboxInfoDO.setType(mailboxInfoVO.getType());
         mailboxInfoDO.setProtocol(mailboxInfoVO.getProtocol());
+        mailboxInfoDO.setOpenStatus(mailboxInfoVO.getOpenStatus());
         mailboxInfoDO.setUpdateTime(new Date());
         mailboxInfoDO.setUpdaterId(999);
         mailboxInfoDO.setCreatorId(999);

+ 4 - 4
service-manage/src/main/java/com/simuwang/manage/service/impl/FundInformationServiceImpl.java

@@ -1,6 +1,6 @@
 package com.simuwang.manage.service.impl;
 
-import com.simuwang.base.mapper.FundInfomationMapper;
+import com.simuwang.base.mapper.FundInfoMapper;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.manage.service.FundInformationService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,15 +18,15 @@ import java.util.Map;
 @Service
 public class FundInformationServiceImpl implements FundInformationService {
     @Autowired
-    private FundInfomationMapper fundInfomationMapper;
+    private FundInfoMapper fundInfoMapper;
     @Override
     public List<Map<String, String>> searchFundInfo(String keyword) {
-        return fundInfomationMapper.searchFundInfoByKeyword(keyword);
+        return fundInfoMapper.searchFundInfoByKeyword(keyword);
     }
 
     @Override
     public List<FundInformationVO> searchFundInfoList(String fundId, String fundName, String companyName, Integer navFrequency, Integer assetFrequency, Integer startDate, Integer endDate) {
-        List<FundInformationVO> result = fundInfomationMapper.searchFundInfoList(fundId,fundName,companyName,navFrequency,assetFrequency,startDate,endDate);
+        List<FundInformationVO> result = fundInfoMapper.searchFundInfoList(fundId,fundName,companyName,navFrequency,assetFrequency,startDate,endDate);
         return result;
     }
 }

+ 19 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailServiceImpl.java

@@ -1,10 +1,13 @@
 package com.simuwang.manage.service.impl;
 
 import com.simuwang.base.common.enums.ParseStatus;
+import com.simuwang.base.mapper.EmailFileInfoMapper;
 import com.simuwang.base.mapper.EmailParseInfoMapper;
 import com.simuwang.base.mapper.EmailTypeRuleMapper;
+import com.simuwang.base.pojo.dos.EmailFileInfoDO;
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
 import com.simuwang.base.pojo.dos.EmailTypeRuleDO;
+import com.simuwang.base.pojo.vo.EmailFileInfoVO;
 import com.simuwang.base.pojo.vo.EmailParseInfoVO;
 import com.simuwang.base.pojo.vo.EmailTypeRuleVO;
 import com.simuwang.manage.service.ParseEmailService;
@@ -30,6 +33,9 @@ public class ParseEmailServiceImpl implements ParseEmailService {
 
     @Autowired
     private EmailParseInfoMapper emailParseInfoMapper;
+
+    @Autowired
+    private EmailFileInfoMapper emailFileInfoMapper;
     @Override
     public void saveEmailType(EmailTypeRuleVO emailTypeRuleVO) {
         EmailTypeRuleDO  ruleDO = new EmailTypeRuleDO();
@@ -82,4 +88,17 @@ public class ParseEmailServiceImpl implements ParseEmailService {
         result.put("parseFail",parseFail);
         return result;
     }
+
+    @Override
+    public EmailFileInfoVO getEmailFileById(Integer fileId) {
+        EmailFileInfoDO emailFileInfoDO = emailFileInfoMapper.getEmailFileById(fileId);
+        EmailFileInfoVO fileInfoVO = new EmailFileInfoVO();
+        if(emailFileInfoDO != null){
+            fileInfoVO.setId(emailFileInfoDO.getId());
+            fileInfoVO.setEmailId(emailFileInfoDO.getEmailId());
+            fileInfoVO.setFilePath(emailFileInfoDO.getFilePath());
+            fileInfoVO.setFileName(emailFileInfoDO.getFileName());
+        }
+        return fileInfoVO;
+    }
 }