From 07c83c163675e24252de05d029cef2eab046e583 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 09 七月 2024 19:32:40 +0800
Subject: [PATCH] 完成基础数据导入

---
 finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java |  177 ++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 145 insertions(+), 32 deletions(-)

diff --git a/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java b/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java
index b5563bd..6fb5348 100644
--- a/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java
+++ b/finance-system/src/main/java/com/finance/system/listener/HistoryDataListener.java
@@ -8,7 +8,6 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
 import com.finance.common.core.domain.entity.SysUser;
 import com.finance.common.enums.CalculateTypeEnum;
 import com.finance.common.enums.DataScreenConfigEnum;
@@ -22,6 +21,7 @@
 import com.finance.common.utils.CalculateUtil;
 import com.finance.common.utils.CollUtils;
 import com.finance.common.utils.DateUtils;
+import com.finance.common.utils.StringUtils;
 import com.finance.system.domain.TbBasicData;
 import com.finance.system.domain.TbBasicDataConfig;
 import com.finance.system.domain.TbBasicDataConfigDetail;
@@ -30,6 +30,7 @@
 import com.finance.system.domain.TbField;
 import com.finance.system.domain.TbScore;
 import com.finance.system.dto.CalculateItemDTO;
+import com.finance.system.service.AsyncService;
 import com.finance.system.service.ISysUserService;
 import com.finance.system.service.TbBasicDataConfigDetailService;
 import com.finance.system.service.TbBasicDataConfigService;
@@ -40,15 +41,17 @@
 import com.finance.system.service.TbFieldService;
 import com.finance.system.service.TbScoreService;
 import com.finance.system.vo.DataScreenConfigVO;
+import com.google.common.collect.Lists;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 
 @Slf4j
 public class HistoryDataListener extends AnalysisEventListener<Map<Integer, String>> {
@@ -67,6 +70,7 @@
     public String quarter;
     public TbDataScreenScoreService tbDataScreenScoreService;
     public TbDataScreenConfigService tbDataScreenConfigService;
+    public AsyncService asyncService;
     private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(
             BATCH_COUNT);
 
@@ -77,7 +81,7 @@
             TbBasicDataConfigDetailService tbBasicDataConfigDetailService,
             TbScoreService tbScoreService, ISysUserService sysUserService, String quarter,
             TbDataScreenScoreService tbDataScreenScoreService,
-            TbDataScreenConfigService tbDataScreenConfigService) {
+            TbDataScreenConfigService tbDataScreenConfigService, AsyncService asyncService) {
         this.tbBasicDataService = tbBasicDataService;
         this.tbFieldService = tbFieldService;
         this.tbBasicDataFieldService = tbBasicDataFieldService;
@@ -88,6 +92,7 @@
         this.quarter = quarter;
         this.tbDataScreenConfigService = tbDataScreenConfigService;
         this.tbDataScreenScoreService = tbDataScreenScoreService;
+        this.asyncService = asyncService;
     }
 
     @Override
@@ -128,6 +133,14 @@
         List<TbField> fieldList =
                 tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
         Map<Integer, String> headMap = getHeadMap();
+        int remarkIndex = headMap.size() - 1;
+        Map<Integer, String> dynamicFieldsMap = getDynamicHeadMap(headMap, remarkIndex);
+        Map<Integer, String> dynamicCategoryOneMap = getDynamicHeadMap(cachedDataList.get(0),
+                remarkIndex);
+        Map<Integer, String> dynamicCategoryTwoMap = getDynamicHeadMap(cachedDataList.get(1),
+                remarkIndex);
+        Map<Integer, String> dynamicCategoryThreeMap = getDynamicHeadMap(cachedDataList.get(2),
+                remarkIndex);
         List<Map<Integer, String>> dataMapList = getMapList();
         if (headMap == null || dataMapList == null) {
             throw new ServiceException("导入失败,请下载最新的导入模板");
@@ -135,31 +148,33 @@
         log.info("{}条数据,开始存储数据库!", dataMapList.size());
         log.info("表头:{}", JSON.toJSONString(headMap));
         log.info("填写的数据:{}", JSON.toJSONString(dataMapList));
+
+           /*  boolean flag = new ArrayList<>(dynamicFields).containsAll(collect);
+            if (dynamicFields.size() != collect.size() || !flag) {
+                throw new ServiceException("导入失败,请下载最新的导入模板");
+            }*/
+        List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values());
+        List<String> collect = fieldList.stream().map(TbField::getFieldName)
+                .collect(Collectors.toList());
+        boolean flag = new ArrayList<>(dynamicFields).containsAll(collect);
+        if (dynamicFields.size() != fieldList.size() || !flag) {
+            throw new ServiceException("导入失败,请下载最新的导入模板");
+        }
+        List<SysUser> departmentList = sysUserService.lambdaQuery()
+                .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT).list();
+        List<TbBasicData> basicDataList = tbBasicDataService.lambdaQuery().
+                eq(TbBasicData::getQuarter, quarter).list();
         for (Map<Integer, String> dataMap : dataMapList) {
-            Optional<SysUser> sysUser = sysUserService.lambdaQuery()
-                    .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT)
-                    .eq(SysUser::getAreaName, dataMap.get(0)).oneOpt();
+            Optional<SysUser> sysUser = departmentList.stream()
+                    .filter(dept -> dept.getAreaName().equals(dataMap.get(0))).findFirst();
             if (!sysUser.isPresent()) {
                 throw new ServiceException("该地区不存在,请修改后重新导入!");
             }
             String areaCode = sysUser.get().getAreaCode();
-            int remarkIndex = headMap.size() - 1;
-            Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream()
-                    .filter(entry -> !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey())
-                            || entry.getKey() == remarkIndex))
-                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
-            List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values());
-            List<String> collect = fieldList.stream().map(TbField::getFieldName)
-                    .collect(Collectors.toList());
-            boolean flag = new ArrayList<>(dynamicFields).containsAll(collect);
-            if (dynamicFields.size() != collect.size() || !flag) {
-                throw new ServiceException("导入失败,请下载最新的导入模板");
-            }
             LocalDate now = LocalDate.now();
             TbBasicData tbBasicData;
-            Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery().
-                    eq(TbBasicData::getQuarter, quarter)
-                    .eq(TbBasicData::getDeptAreaCode, areaCode).oneOpt();
+            Optional<TbBasicData> tbBasicDataOpt = basicDataList.stream()
+                    .filter(basicData -> basicData.getDeptAreaCode().equals(areaCode)).findFirst();
             tbBasicData = tbBasicDataOpt.orElseGet(TbBasicData::new);
             tbBasicData.setQuarter(quarter);
             tbBasicData.setTransferPaymentScale(dataMap.get(2));
@@ -168,11 +183,15 @@
             tbBasicData.setRemark(dataMap.get(remarkIndex));
             tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA);
             tbBasicData.setReportingTime(DateUtils.getQuarterDate(quarter));
+            long count = dataMap.entrySet().stream()
+                    .filter(entry -> StringUtils.isBlank(entry.getValue())).count();
+            tbBasicData.setStatus(
+                    count > 0 ? ReportingStatusEnum.MISSING_DATA : ReportingStatusEnum.FILLED);
             tbBasicDataService.saveOrUpdate(tbBasicData);
             tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery()
                     .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()));
             List<TbBasicDataField> fields = new ArrayList<>();
-            //添加固定字段 转移支付规模、当期GDP
+            // 添加固定字段 转移支付规模、当期GDP
             TbBasicDataField transferPaymentScale = new TbBasicDataField();
             transferPaymentScale.setBasicDataId(tbBasicData.getId());
             transferPaymentScale.setFieldId(-1L);
@@ -186,8 +205,8 @@
             currentGdp.setFieldName("当期GDP");
             currentGdp.setFieldValue(tbBasicData.getCurrentGdp());
             fields.add(currentGdp);
-            //遍历动态字段map
-            for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) {
+            // 遍历动态字段map
+            /*for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) {
                 Optional<TbField> tbField = tbFieldService.lambdaQuery()
                         .eq(TbField::getFieldName, integerStringEntry.getValue())
                         .eq(TbField::getStatus, ShowStatusEnum.SHOW).oneOpt();
@@ -201,17 +220,101 @@
                     tbBasicDataField.setFieldValue(value);
                     fields.add(tbBasicDataField);
                 }
+            }*/
+            // 遍历动态字段map
+            for (Entry<Integer, String> entry : dynamicFieldsMap.entrySet()) {
+                Integer key = entry.getKey();
+                String fieldStr = entry.getValue();
+                String categoryOne = dynamicCategoryOneMap.get(key);
+                String categoryTwo = dynamicCategoryTwoMap.get(key);
+                String categoryThree = dynamicCategoryThreeMap.get(key);
+
+                TbField field = getFieldByFieldName(fieldList, categoryOne, categoryTwo,
+                        categoryThree, fieldStr);
+
+                if (Objects.nonNull(field)) {
+                    String value = dataMap.get(key);
+                    TbBasicDataField tbBasicDataField = new TbBasicDataField();
+                    tbBasicDataField.setBasicDataId(tbBasicData.getId());
+                    tbBasicDataField.setFieldId(field.getId());
+                    tbBasicDataField.setFieldName(field.getFieldName());
+                    tbBasicDataField.setFieldValue(value);
+                    fields.add(tbBasicDataField);
+                }
             }
             tbBasicDataFieldService.saveBatch(fields);
-            tbBasicData.setStatus(ReportingStatusEnum.FILLED);
-            tbBasicDataService.updateById(tbBasicData);
-            CompletableFuture.runAsync(() -> {
-                calculateScore(tbBasicData, fields);
-                calculateScreenScore(tbBasicData, fields);
-            });
+            // CompletableFuture.runAsync(() -> {
+            //     calculateScore(tbBasicData, fields);
+            //     calculateScreenScore(tbBasicData, fields);
+            // });
+            asyncService.calculateScoreWithFixedRules(tbBasicData, fields, fieldList);
         }
         log.info(String.format("%s导入基础数据成功!", JSON.toJSONString(dataMapList)));
     }
+
+    private TbField getFieldByFieldName(List<TbField> fieldList, String categoryOne,
+            String categoryTwo,
+            String categoryThree,
+            String fieldStr) {
+        TbField field = null;
+        if (!fieldList.isEmpty()) {
+            /*
+            判断字段有几级分类,如果字段如果fieldStr与categoryTwo不同,说明该字段有二级分类。
+            如果字段如果fieldStr与categoryThree不同,说明该字段有三级分类。
+           res = 1 表示只有一级分类 res=2 表示该字段有二级分类,res=3表示该字段有三级分类
+             */
+            int res =
+                    !fieldStr.equals(categoryTwo) ? (!fieldStr.equals(categoryThree) ? 3 : 2) : 1;
+            Optional<TbField> fieldOptional = Optional.empty();
+            switch (res) {
+                case 1:
+                    fieldOptional = fieldList.stream()
+                            .filter(item -> item.getFieldName().equals(fieldStr)
+                                    && item.getLevelOneCategory().equals(categoryOne)
+                                    && item.getStatus()
+                                    == ShowStatusEnum.SHOW)
+                            .findFirst();
+                    if (fieldOptional.isPresent()) {
+                        field = fieldOptional.get();
+                        field.setFieldName(categoryOne + "-" + field.getFieldName());
+                    }
+                    break;
+                case 2:
+                    fieldOptional = fieldList.stream()
+                            .filter(item -> item.getFieldName().equals(fieldStr)
+                                    && item.getLevelOneCategory().equals(categoryOne)
+                                    && item.getStatus()
+                                    == ShowStatusEnum.SHOW)
+                            .filter(item -> item.getLevelTwoCategory().equals(categoryTwo))
+                            .findFirst();
+                    if (fieldOptional.isPresent()) {
+                        field = fieldOptional.get();
+                        field.setFieldName(
+                                categoryOne + "-" + categoryTwo + "-" + field.getFieldName());
+                    }
+                    break;
+                case 3:
+                    fieldOptional = fieldList.stream()
+                            .filter(item -> item.getFieldName().equals(fieldStr)
+                                    && item.getLevelOneCategory().equals(categoryOne)
+                                    && item.getStatus()
+                                    == ShowStatusEnum.SHOW)
+                            .filter(item -> item.getLevelTwoCategory().equals(categoryTwo))
+                            .filter(item -> item.getLevelThreeCategory()
+                                    .equals(categoryThree))
+                            .findFirst();
+                    if (fieldOptional.isPresent()) {
+                        field = fieldOptional.get();
+                        field.setFieldName(
+                                categoryOne + "-" + categoryTwo + "-" + categoryThree + "-"
+                                        + field.getFieldName());
+                    }
+                    break;
+            }
+        }
+        return field;
+    }
+
 
     /**
      * 需要导入的数据
@@ -225,6 +328,16 @@
             }
         }
         return null;
+    }
+
+    @NotNull
+    private static Map<Integer, String> getDynamicHeadMap(Map<Integer, String> headMap,
+            int remarkIndex) {
+        Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream()
+                .filter(entry -> !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey())
+                        || entry.getKey() == remarkIndex))
+                .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+        return dynamicFieldsMap;
     }
 
     /**
@@ -293,7 +406,7 @@
      */
     private void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields) {
         List<TbScore> scoreList = new ArrayList<>();
-        //计算得分
+        // 计算得分
         List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery()
                 .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
         if (CollectionUtils.isEmpty(list)) {
@@ -371,7 +484,7 @@
                                             Double.parseDouble(stringStringEntry.getValue()));
                                 }
                             }
-                            //如果都不匹配,得分为0
+                            // 如果都不匹配,得分为0
                             if (Objects.isNull(tbScore.getScore())) {
                                 tbScore.setScore(0D);
                             }

--
Gitblit v1.7.1