From 604d00f67ddcf25a9d079ceddd1c668b2a4e5288 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 19 四月 2024 15:08:22 +0800
Subject: [PATCH] bug修复

---
 ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java |  150 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 121 insertions(+), 29 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
index b23a913..a170461 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
@@ -4,15 +4,18 @@
 import com.alibaba.excel.event.AnalysisEventListener;
 import com.alibaba.excel.util.ListUtils;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 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.ruoyi.common.enums.CalculateTypeEnum;
+import com.ruoyi.common.enums.DataScreenConfigEnum;
 import com.ruoyi.common.enums.FieldInputTypeEnum;
 import com.ruoyi.common.enums.FieldTypeEnum;
 import com.ruoyi.common.enums.ReportingStatusEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.enums.ValueTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.CalculateUtil;
 import com.ruoyi.common.utils.CollUtils;
@@ -21,21 +24,26 @@
 import com.ruoyi.system.domain.TbBasicDataConfig;
 import com.ruoyi.system.domain.TbBasicDataConfigDetail;
 import com.ruoyi.system.domain.TbBasicDataField;
+import com.ruoyi.system.domain.TbDataScreenScore;
 import com.ruoyi.system.domain.TbField;
 import com.ruoyi.system.domain.TbScore;
+import com.ruoyi.system.dto.CalculateItemDTO;
 import com.ruoyi.system.service.TbBasicDataConfigDetailService;
 import com.ruoyi.system.service.TbBasicDataConfigService;
 import com.ruoyi.system.service.TbBasicDataFieldService;
 import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.service.TbDataScreenConfigService;
+import com.ruoyi.system.service.TbDataScreenScoreService;
 import com.ruoyi.system.service.TbFieldService;
 import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.DataScreenConfigVO;
 import java.time.LocalDate;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 
@@ -55,13 +63,16 @@
     public TbBasicDataConfigService tbBasicDataConfigService;
     public TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
     public TbScoreService tbScoreService;
+    public TbDataScreenScoreService tbDataScreenScoreService;
+    public TbDataScreenConfigService tbDataScreenConfigService;
 
     public BasicDataListener(TbBasicDataService tbBasicDataService,
             TbFieldService tbFieldService,
             String areaCode, TbBasicDataFieldService tbBasicDataFieldService,
             TbBasicDataConfigService tbBasicDataConfigService,
             TbBasicDataConfigDetailService tbBasicDataConfigDetailService,
-            TbScoreService tbScoreService) {
+            TbScoreService tbScoreService, TbDataScreenScoreService tbDataScreenScoreService,
+            TbDataScreenConfigService tbDataScreenConfigService) {
         this.tbBasicDataService = tbBasicDataService;
         this.tbFieldService = tbFieldService;
         this.areaCode = areaCode;
@@ -69,6 +80,8 @@
         this.tbBasicDataConfigService = tbBasicDataConfigService;
         this.tbBasicDataConfigDetailService = tbBasicDataConfigDetailService;
         this.tbScoreService = tbScoreService;
+        this.tbDataScreenConfigService = tbDataScreenConfigService;
+        this.tbDataScreenScoreService = tbDataScreenScoreService;
     }
 
     @Override
@@ -91,8 +104,8 @@
     @Override
     public void doAfterAllAnalysed(AnalysisContext context) {
         try {
-            TbBasicData tbBasicData = saveData();
-            calculateScore(tbBasicData);
+            saveData();
+
         } catch (Exception e) {
             if (e instanceof ServiceException) {
                 throw new ServiceException(e.getMessage());
@@ -140,7 +153,7 @@
     /**
      * 加上存储数据库
      */
-    private TbBasicData saveData() throws Exception {
+    private void saveData() throws Exception {
         // 查询需要填写的动态字段
         List<TbField> fieldList =
                 tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
@@ -163,7 +176,7 @@
         }
         LocalDate now = LocalDate.now();
         TbBasicData tbBasicData;
-        String quarter = String.format("%s年%s", now.getYear(), dataMap.get(1));
+        String quarter = dataMap.get(1);
         Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery().
                 eq(TbBasicData::getQuarter, quarter)
                 .eq(TbBasicData::getDeptAreaCode, areaCode).oneOpt();
@@ -213,10 +226,13 @@
         tbBasicData.setStatus(ReportingStatusEnum.FILLED);
         tbBasicDataService.updateById(tbBasicData);
         log.info(String.format("%s导入基础数据成功!", dataMap.get(0)));
-        return tbBasicData;
+        CompletableFuture.runAsync(() -> {
+            calculateScore(tbBasicData, fields);
+            calculateScreenScore(tbBasicData, fields);
+        });
     }
 
-    private void calculateScore(TbBasicData tbBasicData) {
+    private void calculateScore(TbBasicData tbBasicData, List<TbBasicDataField> fields) {
         List<TbScore> scoreList = new ArrayList<>();
         //计算得分
         List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery()
@@ -232,22 +248,29 @@
                 .collect(Collectors.toList());
         tbScoreService.remove(
                 new LambdaQueryWrapper<TbScore>().eq(TbScore::getBasicDataId, tbBasicData.getId()));
+        Map<Long, TbBasicDataField> basicDataFieldMap = fields.stream()
+                .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
         if (CollUtils.isNotEmpty(numCalculates)) {
             for (TbBasicDataConfig item : numCalculates) {
-                Map<String, Object> valueMap = new HashMap<>();
                 String numberCalculateFormula = item.getNumberCalculateFormula();
-                Map<String, Integer> fieldsAndValue = CalculateUtil.getFieldsAndValue(
-                        numberCalculateFormula);
-                for (Map.Entry<String, Integer> stringIntegerEntry : fieldsAndValue.entrySet()) {
-                    Optional<TbBasicDataField> tbBasicDataField = tbBasicDataFieldService.lambdaQuery()
-                            .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId())
-                            .eq(TbBasicDataField::getFieldId, stringIntegerEntry.getValue())
-                            .oneOpt();
-                    tbBasicDataField.ifPresent(
-                            basicDataField -> valueMap.put(stringIntegerEntry.getKey(),
-                                    basicDataField.getFieldValue()));
+                List<CalculateItemDTO> calculateItemDTOS = JSONArray.parseArray(
+                        numberCalculateFormula,
+                        CalculateItemDTO.class);
+                for (CalculateItemDTO dto : calculateItemDTOS) {
+                    if (ValueTypeEnum.FIELD.equals(dto.getValueType())) {
+                        TbBasicDataField tbBasicDataField = basicDataFieldMap.get(
+                                Long.valueOf(dto.getContent()));
+                        if (Objects.nonNull(tbBasicDataField)) {
+                            dto.setContent(tbBasicDataField.getFieldValue());
+                        }
+                    }
                 }
-                double score = CalculateUtil.calculate(numberCalculateFormula, valueMap);
+                String numberCalculateFormulaStr = calculateItemDTOS.stream()
+                        .map(CalculateItemDTO::getContent).collect(Collectors.joining());
+                double score = CalculateUtil.calculate(numberCalculateFormulaStr);
+                if (Objects.nonNull(item.getMaxScore()) && score > item.getMaxScore()) {
+                    score = item.getMaxScore();
+                }
                 TbScore tbScore = new TbScore();
                 tbScore.setBasicDataId(tbBasicData.getId());
                 tbScore.setScore(score);
@@ -266,14 +289,11 @@
                         Collectors.toMap(TbBasicDataConfigDetail::getKey,
                                 TbBasicDataConfigDetail::getValue));
                 if (CollectionUtils.isNotEmpty(details)) {
-                    Optional<TbBasicDataField> tbBasicDataFieldOptional = tbBasicDataFieldService.lambdaQuery()
-                            .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId())
-                            .eq(TbBasicDataField::getFieldId, textAndPercentage.getFieldIdStr())
-                            .oneOpt();
-                    if (tbBasicDataFieldOptional.isPresent()) {
-                        TbBasicDataField tbBasicDataField = tbBasicDataFieldOptional.get();
+                    TbBasicDataField textAndPercentageData = basicDataFieldMap.get(
+                            Long.valueOf(textAndPercentage.getFieldIdStr()));
+                    if (Objects.nonNull(textAndPercentageData)) {
                         if (CalculateTypeEnum.TEXT.equals(textAndPercentage.getCalculateType())) {
-                            String score = scoreMap.get(tbBasicDataField.getFieldValue());
+                            String score = scoreMap.get(textAndPercentageData.getFieldValue());
                             tbScore.setBasicDataId(tbBasicData.getId());
                             tbScore.setScore(Double.parseDouble(score));
                             tbScore.setBasicDataConfigId(textAndPercentage.getId());
@@ -282,14 +302,19 @@
                         if (CalculateTypeEnum.PERCENTAGE.equals(
                                 textAndPercentage.getCalculateType())) {
                             for (Map.Entry<String, String> stringStringEntry : scoreMap.entrySet()) {
-                                String[] split = stringStringEntry.getKey().split("-");
-                                double v = Double.parseDouble(tbBasicDataField.getFieldValue());
+                                String[] split = stringStringEntry.getKey().split("_");
+                                double v = Double.parseDouble(
+                                        textAndPercentageData.getFieldValue());
                                 double min = Double.parseDouble(split[0]);
                                 double max = Double.parseDouble(split[1]);
                                 if (v >= min && v <= max) {
                                     tbScore.setScore(
                                             Double.parseDouble(stringStringEntry.getValue()));
                                 }
+                            }
+                            //如果都不匹配,得分为0
+                            if (Objects.isNull(tbScore.getScore())) {
+                                tbScore.setScore(0D);
                             }
                             tbScore.setBasicDataId(tbBasicData.getId());
                             tbScore.setBasicDataConfigId(textAndPercentage.getId());
@@ -301,4 +326,71 @@
         }
         tbScoreService.saveBatch(scoreList);
     }
+
+    private void calculateScreenScore(TbBasicData tbBasicData,
+            List<TbBasicDataField> tbBasicDataFields) {
+        Map<Long, TbBasicDataField> basicDataFieldMap = tbBasicDataFields.stream()
+                .collect(Collectors.toMap(TbBasicDataField::getFieldId, e -> e));
+        DataScreenConfigVO riskLevel = tbDataScreenConfigService.getRiskLevel();
+        List<DataScreenConfigVO> dataIndicatorsConfig = tbDataScreenConfigService.getIndicatorsConfig(
+                DataScreenConfigEnum.DATA_INDICATORS);
+        List<DataScreenConfigVO> formalIndicatorsConfig = tbDataScreenConfigService.getIndicatorsConfig(
+                DataScreenConfigEnum.FORMAL_INDICATORS);
+        handleScoreCalculate(tbBasicData, riskLevel, basicDataFieldMap);
+        for (DataScreenConfigVO config : dataIndicatorsConfig) {
+            handleScoreCalculate(tbBasicData, config, basicDataFieldMap);
+        }
+        for (DataScreenConfigVO config : formalIndicatorsConfig) {
+            handleScoreCalculate(tbBasicData, config, basicDataFieldMap);
+        }
+    }
+
+    private void handleScoreCalculate(TbBasicData tbBasicData, DataScreenConfigVO vo,
+            Map<Long, TbBasicDataField> basicDataFieldMap) {
+        TbDataScreenScore tbDataScreenScore = tbDataScreenScoreService.lambdaQuery()
+                .eq(TbDataScreenScore::getBasicDataId, tbBasicData.getId()).eq(
+                        TbDataScreenScore::getDataScreenConfigId, vo.getId()).one();
+        if (Objects.isNull(tbDataScreenScore)) {
+            tbDataScreenScore = new TbDataScreenScore();
+            tbDataScreenScore.setDataScreenConfigId(vo.getId());
+            tbDataScreenScore.setBasicDataId(tbBasicData.getId());
+            tbDataScreenScore.setDeptAreaCode(tbBasicData.getDeptAreaCode());
+        }
+        List<CalculateItemDTO> scoreCalculateList = vo.getScoreCalculateList();
+        for (CalculateItemDTO item : scoreCalculateList) {
+            if (item.getValueType().equals(ValueTypeEnum.FIELD)) {
+                TbBasicDataField basicDataField = basicDataFieldMap.get(
+                        Long.valueOf(item.getContent()));
+                if (Objects.nonNull(basicDataField)) {
+                    item.setContent(basicDataField.getFieldValue());
+                }
+            }
+        }
+        String calculateFormulaStr = scoreCalculateList.stream()
+                .map(CalculateItemDTO::getContent).collect(Collectors.joining());
+        double score = CalculateUtil.calculate(calculateFormulaStr);
+        if (vo.getType().equals(DataScreenConfigEnum.FORMAL_INDICATORS)) {
+            if (Objects.nonNull(vo.getMaxScore()) && score > vo.getMaxScore()) {
+                score = vo.getMaxScore();
+            }
+        }
+        tbDataScreenScore.setScore(score);
+        if (vo.getType().equals(DataScreenConfigEnum.DATA_INDICATORS)) {
+            List<CalculateItemDTO> rateCalculateList = vo.getRateCalculateList();
+            for (CalculateItemDTO calculateItemDTO : rateCalculateList) {
+                if (calculateItemDTO.getValueType().equals(ValueTypeEnum.FIELD)) {
+                    TbBasicDataField basicDataField = basicDataFieldMap.get(
+                            Long.valueOf(calculateItemDTO.getContent()));
+                    if (Objects.nonNull(basicDataField)) {
+                        calculateItemDTO.setContent(basicDataField.getFieldValue());
+                    }
+                }
+            }
+            String calculateRateFormulaStr = rateCalculateList.stream()
+                    .map(CalculateItemDTO::getContent).collect(Collectors.joining());
+            double scoreRate = CalculateUtil.calculate(calculateRateFormulaStr);
+            tbDataScreenScore.setScoreRate(scoreRate);
+        }
+        tbDataScreenScoreService.saveOrUpdate(tbDataScreenScore);
+    }
 }

--
Gitblit v1.7.1