ソースを参照

feat:模板配置-数据提取规则支持转换单位

mozuwen 7 ヶ月 前
コミット
4a3e4caef5

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.simuwang.base.pojo.vo.EmailTemplateDataRuleVO;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
@@ -50,7 +51,7 @@ public class EmailTemplateDataRuleDO {
      * 单位转换
      */
     @TableId(value = "unit_convert")
-    private Integer unitConvert;
+    private BigDecimal unitConvert;
     /**
      * 是否有效:0-无效,1-有效
      */

+ 3 - 1
service-base/src/main/java/com/simuwang/base/pojo/dto/TemplateDataRuleDTO.java

@@ -2,6 +2,8 @@ package com.simuwang.base.pojo.dto;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class TemplateDataRuleDTO {
     /**
@@ -27,5 +29,5 @@ public class TemplateDataRuleDTO {
     /**
      * 单位转换
      */
-    private Integer unitConvert;
+    private BigDecimal unitConvert;
 }

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

@@ -1,11 +1,8 @@
 package com.simuwang.base.pojo.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
-import java.util.Date;
+import java.math.BigDecimal;
 
 @Data
 public class EmailTemplateDataRuleVO {
@@ -40,6 +37,6 @@ public class EmailTemplateDataRuleVO {
     /**
      * 单位转换
      */
-    private Integer unitConvert;
+    private BigDecimal unitConvert;
 
 }

+ 63 - 28
service-daq/src/main/java/com/simuwang/daq/service/EmailTemplateService.java

@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -157,9 +158,9 @@ public class EmailTemplateService {
             return CollUtil.newArrayList();
         }
 
-        List<Map<String, String>> fieldValueMapList = CollUtil.newArrayList();
         Map<String, Pair<Integer, Integer>> fieldPositionMap = MapUtil.newHashMap();
-        Map<String, String> fieldPatternMap = MapUtil.newHashMap();
+        Map<String, String> fieldPatternMap = MapUtil.newHashMap(8);
+        Map<String, BigDecimal> fieldUnitConvertMap = MapUtil.newHashMap(8);
         for (TemplateDataRuleDTO dataRuleDTO : dataRuleDTOS) {
             Integer row = dataRuleDTO.getRow() - 1;
             int column = columnLetterToIndex(dataRuleDTO.getColumn());
@@ -168,7 +169,12 @@ public class EmailTemplateService {
             if (StrUtil.isNotBlank(dataRuleDTO.getFieldRule())) {
                 fieldPatternMap.put(FILE_TYPE_MAP.get(dataRuleDTO.getFieldName()), dataRuleDTO.getFieldRule());
             }
+            if (dataRuleDTO.getUnitConvert() != null) {
+                fieldUnitConvertMap.put(FILE_TYPE_MAP.get(dataRuleDTO.getFieldName()), dataRuleDTO.getUnitConvert());
+            }
         }
+
+        List<Map<String, String>> fieldValueMapList = CollUtil.newArrayList();
         if (direction.equals(EmailDataDirectionConst.ROW_DIRECTION_TYPE)) {
             int startRow = fieldPositionMap.values().stream().map(Pair::getKey).min(Integer::compareTo).orElse(0);
             for (int i = startRow + 1; i <= sheet.getLastRowNum(); i++) {
@@ -179,10 +185,13 @@ public class EmailTemplateService {
                 }
                 for (Map.Entry<String, Pair<Integer, Integer>> fieldEntry : fieldPositionMap.entrySet()) {
                     String fieldName = fieldEntry.getKey();
-                    String fieldRule = fieldPatternMap.get(fieldName);
                     int columnIndex = fieldEntry.getValue().getValue();
                     Cell cell = row.getCell(columnIndex);
+                    String fieldRule = fieldPatternMap.get(fieldName);
                     String cellValue = getValueByPattern(ExcelUtil.getCellValue(cell), fieldRule);
+
+                    BigDecimal unitConvert = fieldUnitConvertMap.get(fieldName);
+                    cellValue = getValueAfterUnitConvert(cellValue, unitConvert);
                     fieldValueMap.put(fieldName, cellValue);
                 }
                 fieldValueMapList.add(fieldValueMap);
@@ -194,15 +203,18 @@ public class EmailTemplateService {
                 Map<String, String> fieldValueMap = MapUtil.newHashMap();
                 for (Map.Entry<String, Pair<Integer, Integer>> fieldEntry : fieldPositionMap.entrySet()) {
                     String fieldName = fieldEntry.getKey();
-                    String fieldRule = fieldPatternMap.get(fieldName);
                     Integer rowIndex = fieldEntry.getValue().getKey();
-                    Integer columnIndex = fieldEntry.getValue().getValue();
                     Row row = sheet.getRow(rowIndex);
                     if (row == null) {
                         continue;
                     }
+                    Integer columnIndex = fieldEntry.getValue().getValue();
                     Cell cell = row.getCell(columnIndex);
+                    String fieldRule = fieldPatternMap.get(fieldName);
                     String cellValue = getValueByPattern(ExcelUtil.getCellValue(cell), fieldRule);
+
+                    BigDecimal unitConvert = fieldUnitConvertMap.get(fieldName);
+                    cellValue = getValueAfterUnitConvert(cellValue, unitConvert);
                     fieldValueMap.put(fieldName, cellValue);
                 }
                 fieldValueMapList.add(fieldValueMap);
@@ -213,7 +225,7 @@ public class EmailTemplateService {
             Map<String, String> fieldValueMap = MapUtil.newHashMap();
             for (Map.Entry<String, Pair<Integer, Integer>> fieldEntry : fieldPositionMap.entrySet()) {
                 String fieldName = fieldEntry.getKey();
-                String fieldRule = fieldPatternMap.get(fieldName);
+
                 Integer rowIndex = fieldEntry.getValue().getKey();
                 Integer columnIndex = fieldEntry.getValue().getValue();
                 Row row = sheet.getRow(rowIndex);
@@ -221,35 +233,19 @@ public class EmailTemplateService {
                     continue;
                 }
                 Cell cell = row.getCell(columnIndex);
+                String fieldRule = fieldPatternMap.get(fieldName);
                 String cellValue = getValueByPattern(ExcelUtil.getCellValue(cell), fieldRule);
+
+                BigDecimal unitConvert = fieldUnitConvertMap.get(fieldName);
+                cellValue = getValueAfterUnitConvert(cellValue, unitConvert);
                 fieldValueMap.put(fieldName, cellValue);
             }
             fieldValueMapList.add(fieldValueMap);
         }
-
         return fieldValueMapList;
     }
 
     /**
-     * 根据正则表达式提取内容
-     *
-     * @param text      文本
-     * @param fieldRule 正则表达式
-     * @return 内容
-     */
-    private String getValueByPattern(String text, String fieldRule) {
-        if (StrUtil.isBlank(text) || StrUtil.isBlank(fieldRule)) {
-            return text;
-        }
-        Pattern pattern = Pattern.compile(fieldRule);
-        Matcher matcher = pattern.matcher(text);
-        while (matcher.find()) {
-            return matcher.group(1);
-        }
-        return null;
-    }
-
-    /**
      * 封装解析的数据为净值数据
      *
      * @param textFieldValueMap      从正文表格中解析到的数据
@@ -290,11 +286,12 @@ public class EmailTemplateService {
         int type = StrUtil.isNotBlank(emailContentInfoDTO.getFilePath()) && ExcelUtil.isHTML(emailContentInfoDTO.getFilePath()) ? 2 : 1;
         // 查询邮箱配置的模板Id
         List<EmailTemplateInfoDO> emailTemplateInfoDOList = emailTemplateMappingMapper.queryByEmail(senderEmail, type);
-        List<Integer> templateIdList = emailTemplateInfoDOList.stream().map(EmailTemplateInfoDO::getId).collect(Collectors.toList());
+        List<Integer> templateIdList = emailTemplateInfoDOList.stream().map(EmailTemplateInfoDO::getId).distinct().collect(Collectors.toList());
         if (CollUtil.isEmpty(templateIdList)) {
             return templateDetailDTOList;
         }
-        Map<Integer, EmailTemplateInfoDO> templateIdDirectionMap = emailTemplateInfoDOList.stream().collect(Collectors.toMap(EmailTemplateInfoDO::getId, v -> v));
+        Map<Integer, EmailTemplateInfoDO> templateIdDirectionMap = emailTemplateInfoDOList.stream()
+                .collect(Collectors.toMap(EmailTemplateInfoDO::getId, v -> v, (oldValue, newValue) -> newValue));
         // 查询模版适用性规则 -> 判断邮件是否满足模板适用性规则
         List<EmailTemplateApplicationRuleDO> templateApplicationRuleDOList = emailTemplateApplicationRuleMapper.queryByTemplateId(templateIdList);
         if (CollUtil.isEmpty(templateApplicationRuleDOList)) {
@@ -415,6 +412,44 @@ public class EmailTemplateService {
         return isMatch;
     }
 
+    /**
+     * 进行单位转换
+     *
+     * @param cellValue   待进行单位转换的值
+     * @param unitConvert 转换单位
+     * @return 单位转换后的值
+     */
+    private String getValueAfterUnitConvert(String cellValue, BigDecimal unitConvert) {
+        if (unitConvert == null) {
+            return cellValue;
+        }
+        try {
+            BigDecimal bigDecimal = new BigDecimal(cellValue);
+            return String.valueOf(bigDecimal.multiply(unitConvert));
+        } catch (Exception e) {
+            return cellValue;
+        }
+    }
+
+    /**
+     * 根据正则表达式提取内容
+     *
+     * @param text      文本
+     * @param fieldRule 正则表达式
+     * @return 内容
+     */
+    private String getValueByPattern(String text, String fieldRule) {
+        if (StrUtil.isBlank(text) || StrUtil.isBlank(fieldRule)) {
+            return text;
+        }
+        Pattern pattern = Pattern.compile(fieldRule);
+        Matcher matcher = pattern.matcher(text);
+        while (matcher.find()) {
+            return matcher.group(1);
+        }
+        return null;
+    }
+
     private EmailFundNavDTO buildEmailFundNavDTO(Map<String, String> excelFieldValueMap, Map<String, String> textFieldValueMap) {
         EmailFundNavDTO fundNavDTO = new EmailFundNavDTO();
         String registerNumber = MapUtil.isNotEmpty(excelFieldValueMap) && StrUtil.isNotBlank(excelFieldValueMap.get(EmailFieldConst.REGISTER_NUMBER))