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/BasicDataListener.java | 285 ++++++++++++++++++++++++++++++--------------------------- 1 files changed, 150 insertions(+), 135 deletions(-) diff --git a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java b/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java index 1a71082..faba84a 100644 --- a/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java +++ b/finance-system/src/main/java/com/finance/system/listener/BasicDataListener.java @@ -4,11 +4,7 @@ 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.finance.common.enums.CalculateTypeEnum; import com.finance.common.enums.DataScreenConfigEnum; import com.finance.common.enums.FieldInputTypeEnum; import com.finance.common.enums.FieldTypeEnum; @@ -17,16 +13,14 @@ import com.finance.common.enums.ValueTypeEnum; import com.finance.common.exception.ServiceException; 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; import com.finance.system.domain.TbBasicDataField; import com.finance.system.domain.TbDataScreenScore; 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.TbBasicDataConfigDetailService; import com.finance.system.service.TbBasicDataConfigService; import com.finance.system.service.TbBasicDataFieldService; @@ -41,9 +35,9 @@ 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; @@ -65,7 +59,9 @@ public TbBasicDataConfigDetailService tbBasicDataConfigDetailService; public TbScoreService tbScoreService; public TbDataScreenScoreService tbDataScreenScoreService; + public String quarter; public TbDataScreenConfigService tbDataScreenConfigService; + public AsyncService asyncService; public BasicDataListener(TbBasicDataService tbBasicDataService, TbFieldService tbFieldService, @@ -73,7 +69,8 @@ TbBasicDataConfigService tbBasicDataConfigService, TbBasicDataConfigDetailService tbBasicDataConfigDetailService, TbScoreService tbScoreService, TbDataScreenScoreService tbDataScreenScoreService, - TbDataScreenConfigService tbDataScreenConfigService) { + String quarter, + TbDataScreenConfigService tbDataScreenConfigService, AsyncService asyncService) { this.tbBasicDataService = tbBasicDataService; this.tbFieldService = tbFieldService; this.areaCode = areaCode; @@ -82,7 +79,9 @@ this.tbBasicDataConfigDetailService = tbBasicDataConfigDetailService; this.tbScoreService = tbScoreService; this.tbDataScreenConfigService = tbDataScreenConfigService; + this.quarter = quarter; this.tbDataScreenScoreService = tbDataScreenScoreService; + this.asyncService = asyncService; } @Override @@ -158,51 +157,50 @@ // 查询需要填写的动态字段 List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); - - Map<Integer, String> categoryOneMap = cachedDataList.get(0); - Map<Integer, String> categoryTwoMap = cachedDataList.get(1); - Map<Integer, String> categoryThreeMap = cachedDataList.get(2); Map<Integer, String> headMap = cachedDataList.get(3); + 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); Map<Integer, String> dataMap = cachedDataList.get(5); log.info("{}条数据,开始存储数据库!", cachedDataList.size()); log.info("表头:{}", JSON.toJSONString(headMap)); log.info("填写的数据:{}", JSON.toJSONString(dataMap)); log.info("所有数据:{}", JSON.toJSONString(cachedDataList)); - int remarkIndex = headMap.size() - 1; - Map<Integer, String> dynamicFieldsMap = getIntegerStringMap(headMap, remarkIndex); - Map<Integer, String> dynamicCategoryOneMap = getIntegerStringMap(categoryOneMap, - remarkIndex); - Map<Integer, String> dynamicCategoryTwoMap = getIntegerStringMap(categoryTwoMap, - remarkIndex); - Map<Integer, String> dynamicCategoryThreeMap = getIntegerStringMap(categoryThreeMap, - remarkIndex); + 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) { + if (dynamicFields.size() != fieldList.size() || !flag) { throw new ServiceException("导入失败,请下载最新的导入模板"); } LocalDate now = LocalDate.now(); TbBasicData tbBasicData; - String quarter = dataMap.get(1); Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery(). eq(TbBasicData::getQuarter, quarter) .eq(TbBasicData::getDeptAreaCode, areaCode).oneOpt(); tbBasicData = tbBasicDataOpt.orElseGet(TbBasicData::new); - tbBasicData.setQuarter(DateUtils.getNowQuarter()); + tbBasicData.setQuarter(quarter); tbBasicData.setTransferPaymentScale(dataMap.get(2)); tbBasicData.setCurrentGdp(dataMap.get(3)); tbBasicData.setDeptAreaCode(areaCode); 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); @@ -216,12 +214,37 @@ currentGdp.setFieldName("当期GDP"); currentGdp.setFieldValue(tbBasicData.getCurrentGdp()); fields.add(currentGdp); - //遍历动态字段map - for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { + // 遍历动态字段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); + } + } + + /*for (Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) { String categoryOne = dynamicCategoryOneMap.get(integerStringEntry.getKey()); String categoryTwo = dynamicCategoryTwoMap.get(integerStringEntry.getKey()); String categoryThree = dynamicCategoryThreeMap.get(integerStringEntry.getKey()); String fieldStr = integerStringEntry.getValue(); + if (fieldStr.equals("库款保障水平-第一月") || fieldStr.equals("库款保障水平-第二月") + || fieldStr.equals("库款保障水平-第三月")) { + continue; + } boolean res = !fieldStr.equals(categoryTwo); List<TbField> tbField = tbFieldService.lambdaQuery() .eq(TbField::getFieldName, fieldStr) @@ -231,131 +254,123 @@ .eq(!fieldStr.equals(categoryThree) && res, TbField::getLevelThreeCategory, categoryThree) .list(); - if (CollUtils.isNotEmpty(tbField)) { - TbField field = tbField.get(0); - String value = validateFields(integerStringEntry, dataMap, field); + TbField field = getFieldByFieldName(fieldList, categoryOne, + categoryTwo, categoryThree, fieldStr); + // String value = validateFields(integerStringEntry, dataMap, field); + if (Objects.nonNull(field)) { + String value = dataMap.get(integerStringEntry.getKey()); + TbBasicDataField tbBasicDataField = new TbBasicDataField(); tbBasicDataField.setBasicDataId(tbBasicData.getId()); tbBasicDataField.setFieldId(field.getId()); tbBasicDataField.setFieldName(field.getFieldName()); tbBasicDataField.setFieldValue(value); + if (fieldStr.equals("库款保障水平")) { + String firstMonthValue = dataMap.get(integerStringEntry.getKey() + 1); + String secondMonthValue = dataMap.get(integerStringEntry.getKey() + 2); + String thirdMonthValue = dataMap.get(integerStringEntry.getKey() + 3); + tbBasicDataField.setFirstMonthValue(firstMonthValue); + tbBasicDataField.setSecondMonthValue(secondMonthValue); + tbBasicDataField.setThirdMonthValue(thirdMonthValue); + } fields.add(tbBasicDataField); } - } + }*/ tbBasicDataFieldService.saveBatch(fields); - tbBasicData.setStatus(ReportingStatusEnum.FILLED); - tbBasicDataService.updateById(tbBasicData); log.info(String.format("%s导入基础数据成功!", dataMap.get(0))); - CompletableFuture.runAsync(() -> { - calculateScore(tbBasicData, fields); - calculateScreenScore(tbBasicData, fields); - }); + // asyncService.calculateScore(tbBasicData, fields); + asyncService.asyncTask(); + } + /** + * 需要导入的数据 + * + * @return List<Map < Integer, String>> + */ + private List<Map<Integer, String>> getMapList() { + for (int i = 0; i < cachedDataList.size(); i++) { + if (cachedDataList.get(i).get(0).equals("栏号")) { + return cachedDataList.subList(i + 1, cachedDataList.size()); + } + } + return null; + } + + 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; + } + + @NotNull - private static Map<Integer, String> getIntegerStringMap(Map<Integer, String> headMap, + 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(Map.Entry::getKey, Map.Entry::getValue)); + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); return dynamicFieldsMap; } - 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)) { - throw new ServiceException("计算得分失败,平台未配置得分计算规则"); - } - List<TbBasicDataConfig> numCalculates = list.stream() - .filter(item -> CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) - .collect(Collectors.toList()); - List<TbBasicDataConfig> textAndPercentages = list.stream() - .filter(item -> !CalculateTypeEnum.NUMBER.equals(item.getCalculateType())) - .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) { - String numberCalculateFormula = item.getNumberCalculateFormula(); - 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()); - } - } - } - 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); - tbScore.setBasicDataConfigId(item.getId()); - scoreList.add(tbScore); - } - } - if (CollUtils.isNotEmpty(textAndPercentages)) { - for (TbBasicDataConfig textAndPercentage : textAndPercentages) { - TbScore tbScore = new TbScore(); - List<TbBasicDataConfigDetail> details = tbBasicDataConfigDetailService.lambdaQuery() - .eq(TbBasicDataConfigDetail::getBasicDataConfigId, - textAndPercentage.getId()) - .list(); - Map<String, String> scoreMap = details.stream().collect( - Collectors.toMap(TbBasicDataConfigDetail::getKey, - TbBasicDataConfigDetail::getValue)); - if (CollectionUtils.isNotEmpty(details)) { - TbBasicDataField textAndPercentageData = basicDataFieldMap.get( - Long.valueOf(textAndPercentage.getFieldIdStr())); - if (Objects.nonNull(textAndPercentageData)) { - if (CalculateTypeEnum.TEXT.equals(textAndPercentage.getCalculateType())) { - String score = scoreMap.get(textAndPercentageData.getFieldValue()); - tbScore.setBasicDataId(tbBasicData.getId()); - tbScore.setScore(Double.parseDouble(score)); - tbScore.setBasicDataConfigId(textAndPercentage.getId()); - scoreList.add(tbScore); - } - if (CalculateTypeEnum.PERCENTAGE.equals( - textAndPercentage.getCalculateType())) { - for (Map.Entry<String, String> stringStringEntry : scoreMap.entrySet()) { - 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()); - scoreList.add(tbScore); - } - } - } - } - } - tbScoreService.saveBatch(scoreList); - } private void calculateScreenScore(TbBasicData tbBasicData, List<TbBasicDataField> tbBasicDataFields) { -- Gitblit v1.7.1