From 789b5b823440d174a198a35fd033ca975cb54f4a Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 27 三月 2024 19:23:13 +0800
Subject: [PATCH] 部门端基础数据导入、得分计算接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java                       |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java                 |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java        |   52 ++++-
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreVO.java                                 |   24 +++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberDisplaceChineseUtil.java            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java                     |    6 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java      |    7 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java |    5 
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java   |   27 ++
 ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java                 |  184 +++++++++++++++++++---
 ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java                           |   28 +++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java                        |   57 +++++++
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java                    |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataConfigDTO.java                     |   25 ++-
 ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml                             |   19 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java            |    9 +
 17 files changed, 395 insertions(+), 70 deletions(-)

diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
index 05e86bc..711cf98 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -1,10 +1,13 @@
 package com.ruoyi.web.controller.api;
 
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.dto.BasicDataDTO;
+import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.TbBasicDataService;
 import com.ruoyi.system.vo.BasicDataReportingVO;
+import com.ruoyi.system.vo.ScoreVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -26,6 +29,7 @@
     private final TbBasicDataService tbBasicDataService;
 
     @ApiOperation("获取基础数据填报相关信息")
+    @GetMapping("/basic-fields")
     public R<BasicDataReportingVO> getBasicFields(@RequestParam("deptAreaCode") String deptAreaCode) {
         //TODO 如果能够获取到当前登录用户,则不需要传区划代码
         try {
@@ -58,16 +62,17 @@
      */
     @GetMapping("/download")
     @ApiOperation("模板下载")
-    public void downloadImportTemplate() {
+    public R<Void> downloadImportTemplate() {
         try {
             tbBasicDataService.downloadImportTemplate();
         } catch (Exception e) {
             log.error("模板下载异常",e);
-            throw new ServiceException("模板下载失败,请联系管理员!");
+            return R.fail("模板下载失败,请联系管理员!");
         }
+        return R.ok();
     }
 
-    @PostMapping("import")
+    @PostMapping("/import")
     @ApiOperation("基础数据导入")
     public R<Void> importBasicData(@RequestPart("file") MultipartFile file) {
         try {
@@ -77,8 +82,22 @@
                 return R.fail(e.getMessage());
             }
             log.error("基础数据导入异常",e);
-            throw new ServiceException("基础数据导入失败,请联系管理员!");
+            return R.fail("基础数据导入失败,请联系管理员!");
         }
         return R.ok();
     }
+
+    @PostMapping("/page-score")
+    @ApiOperation("得分计算分页查询")
+    public R<PageDTO<ScoreVO>> pageScore(@RequestBody ScoreQuery query) {
+        try {
+            return R.ok(tbBasicDataService.pageScore(query));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("查询得分计算异常",e);
+            return R.fail();
+        }
+    }
 }
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
index ae4b66e..df1c793 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
@@ -10,6 +10,7 @@
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Field;
+import java.time.LocalDateTime;
 import java.util.*;
 
 @Slf4j
@@ -56,7 +57,7 @@
                     //注入创建时间
                     if ("createTime".equals(field.getName())) {
                         field.setAccessible(true);
-                        field.set(parameter, new Date());
+                        field.set(parameter, LocalDateTime.now());
                         field.setAccessible(false);
                     } 
                 } catch (Exception e) {
@@ -79,7 +80,7 @@
                     }
                     if ("updateTime".equals(field.getName())) {
                         field.setAccessible(true);
-                        field.set(parameter, new Date());
+                        field.set(parameter, LocalDateTime.now());
                         field.setAccessible(false);
                     }
                 } catch (Exception e) {
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 0b7e1de..4775983 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -106,12 +106,7 @@
         ajax.put("userInfo",loginUser);
         return ajax;
     }
-    /**
-     * 账号密码登录
-     *
-     * @param loginBody 部门管理后台登录
-     * @return 结果
-     */
+
     @ApiOperation(value = "初始化账号",notes = "初始化账号")
     @PostMapping("/genAccount")
     public AjaxResult genAccount(String account,String password)
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java
new file mode 100644
index 0000000..300eb79
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CalculateUtil.java
@@ -0,0 +1,57 @@
+package com.ruoyi.common.utils;
+
+import org.apache.commons.jexl3.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author mitao
+ * @date 2024/3/27
+ */
+public class CalculateUtil {
+    public static Map<String,Integer> getFieldsAndValue(String rule) {
+        // 正则表达式模式,匹配形如 "fieldName:value" 的字符串
+        Pattern pattern = Pattern.compile("\\b(\\w+)_(\\d+)\\b");
+        Matcher matcher = pattern.matcher(rule);
+        Map<String, Integer> map = new HashMap<>();
+        // 循环匹配并输出字段名和值
+        while (matcher.find()) {
+            String fieldName = matcher.group(1);
+            int value = Integer.parseInt(matcher.group(2));
+            map.put(fieldName+"_"+value, value);
+        }
+        return map;
+    }
+    public static double calculate(String expression,Map<String,Object> value) {
+        expression = formatExpression(expression);
+        // 创建 JEXL 引擎
+        JexlEngine jexl = new JexlBuilder().create();
+
+        // 创建表达式对象
+        JexlExpression exp = jexl.createExpression(expression);
+        // 创建上下文
+        JexlContext context = new MapContext();
+        for (Map.Entry<String, Object> stringObjectEntry : value.entrySet()) {
+            context.set(stringObjectEntry.getKey(),stringObjectEntry.getValue());
+        }
+        // 执行计算
+        Object result = exp.evaluate(context);
+
+        // 输出结果
+        System.out.println("Result: " + result);
+        return Double.parseDouble(result.toString());
+    }
+
+    public static String formatExpression(String expression) {
+        return expression
+                .replaceAll("×", "*")
+                .replaceAll("÷", "/")
+                .replaceAll("(", "(")
+                .replaceAll(")", ")")
+                .replaceAll("+","+")
+                .replaceAll("-", "-");
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberDisplaceChineseUtil.java
similarity index 98%
rename from ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java
rename to ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberDisplaceChineseUtil.java
index 318b6e7..8bd9405 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberDisplaceChineseUtil.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common;
+package com.ruoyi.common.utils;
 
 public class NumberDisplaceChineseUtil {
  
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index acaa7b8..88fbc3b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -182,7 +182,7 @@
         // 用户验证
         Authentication authentication = null;
         // 用户验证
-        TbDept dept = tbDeptService.getOne(Wrappers.<TbDept>lambdaQuery().ge(TbDept::getAccount, account));
+        TbDept dept = tbDeptService.getOne(Wrappers.<TbDept>lambdaQuery().eq(TbDept::getAccount, account));
         if (StringUtils.isNull(dept)){
             log.info("登录用户:{} 不存在.", account);
             throw new ServiceException(MessageUtils.message("user.not.exists"));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
index 10e6c39..57f4636 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
@@ -26,7 +26,7 @@
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "动态字段id")
-    @TableId("id")
+    @TableId(value = "id",type = IdType.AUTO)
     private Integer id;
 
     @ApiModelProperty(value = "基础数据id")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataConfigDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataConfigDTO.java
index 2a4b5e4..c0abdc7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataConfigDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataConfigDTO.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.dto;
 
 import com.ruoyi.common.enums.CalculateTypeEnum;
+import com.ruoyi.common.utils.CalculateUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -8,8 +9,7 @@
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.Map;
 
 /**
  * @author mitao
@@ -35,7 +35,7 @@
     @NotNull(message = "计算类型不能为空")
     private CalculateTypeEnum calculateType;
 
-    @ApiModelProperty(value = "字段id (多个id使用 ',' 拼接)")
+    @ApiModelProperty(value = "字段id ",notes = "多个id使用 ',' 拼接")
     @NotBlank(message = "字段id不能为空")
     private String fieldIdStr;
 
@@ -47,12 +47,13 @@
     private List<CalculateDTO> dtoList;
 
     public static void main(String[] args) {
-        String rule = "(field1_13+field2_50) × 5 ÷field3_63×10";
+    /*    String rule = "(field1_13+field2_50) × 5 ÷ field3_63×10";
 
         // 正则表达式模式,匹配形如 "fieldName:value" 的字符串
         Pattern pattern = Pattern.compile("\\b(\\w+)_(\\d+)\\b");
         Matcher matcher = pattern.matcher(rule);
 
+        Map<String, Integer> map = new HashMap<>();
         // 循环匹配并输出字段名和值
         while (matcher.find()) {
             String fieldName = matcher.group(1);
@@ -60,10 +61,10 @@
             System.out.println("Field: " + fieldName + ", Value: " + value);
         }
 
-       /* // 假设用户上传的字段值
-        int field1 = 500;
-        int field2 = 30;
-        int field3 = 1000;
+        // 假设用户上传的字段值
+        int field1_13 = 500;
+        int field2_50 = 30;
+        int field3_63 = 1000;
 
         // 计算表达式
         String expression = "(field1_13 + field2_50) * 5 / field3_63 * 10";
@@ -85,5 +86,13 @@
 
         // 输出结果
         System.out.println("Result: " + result);*/
+
+        String expression = "(field_13 + field_50) × 5 ÷ field_63 × 10-1";
+        expression = CalculateUtil.formatExpression(expression);
+        System.err.println(expression);
+        Map<String, Integer> fieldsAndValue = CalculateUtil.getFieldsAndValue(expression);
+        System.out.println(fieldsAndValue);
+      /*  double calculate = CalculateUtil.calculate(expression, fieldsAndValue);
+        System.out.println(calculate);*/
     }
  }
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 e3ae9c4..b38a865 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,24 +4,19 @@
 import com.alibaba.excel.event.AnalysisEventListener;
 import com.alibaba.excel.util.ListUtils;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
-import com.ruoyi.common.NumberDisplaceChineseUtil;
-import com.ruoyi.common.enums.ReportingStatusEnum;
-import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.enums.*;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.system.domain.TbBasicData;
-import com.ruoyi.system.domain.TbBasicDataField;
-import com.ruoyi.system.domain.TbDept;
-import com.ruoyi.system.domain.TbField;
-import com.ruoyi.system.service.TbBasicDataFieldService;
-import com.ruoyi.system.service.TbBasicDataService;
-import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.common.utils.CalculateUtil;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.service.*;
 import lombok.extern.slf4j.Slf4j;
 
 import java.time.LocalDate;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -29,22 +24,30 @@
     /**
      * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
      */
-    private static final int BATCH_COUNT = 10;
+    private static final int BATCH_COUNT = 100;
     private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
     public TbBasicDataService tbBasicDataService;
     public List<TbField> fieldList;
     public TbFieldService tbFieldService;
     public TbDept dept;
     public TbBasicDataFieldService tbBasicDataFieldService;
+    public TbBasicDataConfigService tbBasicDataConfigService;
+    public TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
+    public TbScoreService tbScoreService;
     public BasicDataListener() {
     }
 
-    public BasicDataListener(TbBasicDataService tbBasicDataService, List<TbField> fieldList, TbFieldService tbFieldService, TbDept dept, TbBasicDataFieldService tbBasicDataFieldService) {
+    public BasicDataListener(TbBasicDataService tbBasicDataService, List<TbField> fieldList,TbFieldService tbFieldService,
+                             TbDept dept,TbBasicDataFieldService tbBasicDataFieldService,TbBasicDataConfigService tbBasicDataConfigService,
+                             TbBasicDataConfigDetailService tbBasicDataConfigDetailService,TbScoreService tbScoreService ) {
         this.tbBasicDataService = tbBasicDataService;
         this.fieldList = fieldList;
         this.tbFieldService = tbFieldService;
         this.dept = dept;
         this.tbBasicDataFieldService = tbBasicDataFieldService;
+        this.tbBasicDataConfigService = tbBasicDataConfigService;
+        this.tbBasicDataConfigDetailService = tbBasicDataConfigDetailService;
+        this.tbScoreService = tbScoreService;
     }
 
     @Override
@@ -55,6 +58,9 @@
             try {
                 saveData();
             } catch (Exception e) {
+                if (e instanceof ServiceException) {
+                    throw new ServiceException(e.getMessage());
+                }
                 throw new RuntimeException(e);
             }
             cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@@ -66,6 +72,9 @@
         try {
             saveData();
         } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                throw new ServiceException(e.getMessage());
+            }
             throw new RuntimeException(e);
         }
         log.info("所有数据解析完成!");
@@ -74,48 +83,161 @@
     /**
      * 加上存储数据库
      */
-    private void saveData() throws Exception {
+    private void saveData() {
         Map<Integer, String> headMap = cachedDataList.get(2);
         Map<Integer, String> quarterMap = cachedDataList.get(4);
         Map<Integer, String> dataMap = cachedDataList.get(5);
         log.info("{}条数据,开始存储数据库!", cachedDataList.size());
         log.info("表头:{}", JSON.toJSONString(headMap));
-        log.info("填写的数据:{}",JSON.toJSONString(dataMap));
-        int remarkIndex = headMap.size()-1;
-        Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream().filter(entry -> {
-            return !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) || entry.getKey() == remarkIndex);
-        }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+        log.info("填写的数据:{}", JSON.toJSONString(dataMap));
+        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){
+        if (dynamicFields.size() != collect.size() || !flag) {
             throw new ServiceException("导入失败,请下载最新的导入模板");
         }
-        Date date = new Date();
-        //当前所在季度
-        int quarterOfYear = DateUtils.getQuarterOfYear(date);
-        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
         LocalDate now = LocalDate.now();
-        TbBasicData tbBasicData = new TbBasicData();
-        tbBasicData.setQuarter(String.format("%s年%s",now.getYear(),quarterMap.get(1)));
+        TbBasicData tbBasicData;
+        Optional<TbBasicData> tbBasicDataOpt = tbBasicDataService.lambdaQuery().
+                eq(TbBasicData::getQuarter, String.format("%s年%s", now.getYear(), quarterMap.get(1)))
+                .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode()).oneOpt();
+        tbBasicData = tbBasicDataOpt.orElseGet(TbBasicData::new);
+        tbBasicData.setQuarter(String.format("%s年%s", now.getYear(), quarterMap.get(1)));
         tbBasicData.setTransferPaymentScale(dataMap.get(2));
         tbBasicData.setCurrentGdp(dataMap.get(3));
         tbBasicData.setDeptAreaCode(dept.getAreaCode());
         tbBasicData.setRemark(dataMap.get(remarkIndex));
         tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA);
         tbBasicDataService.saveOrUpdate(tbBasicData);
-        tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery().eq(TbBasicDataField::getBasicDataId, tbBasicData));
+        tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery().eq(TbBasicDataField::getBasicDataId, tbBasicData.getId()));
+        List<TbBasicDataField> fields = new ArrayList<>();
+        //遍历动态字段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();
             if (tbField.isPresent()) {
+                TbField field = tbField.get();
+                String value = validateFields(integerStringEntry, dataMap, field);
                 TbBasicDataField tbBasicDataField = new TbBasicDataField();
                 tbBasicDataField.setBasicDataId(tbBasicData.getId());
-                tbBasicDataField.setFieldId(tbField.get().getId());
-                tbBasicDataField.setFieldValue(dataMap.get(integerStringEntry.getKey()));
-                tbBasicDataFieldService.save(tbBasicDataField);
+                tbBasicDataField.setFieldId(field.getId());
+                tbBasicDataField.setFieldValue(value);
+                fields.add(tbBasicDataField);
             }
         }
-        log.info("存储数据库成功!");
+        //异步执行批量保存
+        CompletableFuture.runAsync(() -> tbBasicDataFieldService.saveBatch(fields));
+        tbBasicData.setStatus(ReportingStatusEnum.FILLED);
+        tbBasicDataService.updateById(tbBasicData);
+        log.info(String.format("%s导入基础数据成功!", quarterMap.get(0)));
+        CompletableFuture.runAsync(() -> calculateScore(tbBasicData));
+    }
+
+    private void calculateScore(TbBasicData tbBasicData) {
+        //计算得分
+        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());
+        if (CollectionUtils.isNotEmpty(numCalculates)) {
+            numCalculates.forEach(item -> {
+                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();
+                    if (tbBasicDataField.isPresent()) {
+                        valueMap.put(stringIntegerEntry.getKey(), tbBasicDataField.get().getFieldValue());
+                    }
+
+                }
+                double score = CalculateUtil.calculate(numberCalculateFormula, valueMap);
+                TbScore tbScore = new TbScore();
+                tbScore.setBasicDataId(tbBasicData.getId());
+                tbScore.setScore(score);
+                tbScore.setBasicDataConfigId(item.getId());
+                tbScoreService.save(tbScore);
+            });
+        }
+        if (CollectionUtils.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)) {
+                    Optional<TbBasicDataField> tbBasicDataFieldOptional = tbBasicDataFieldService.lambdaQuery()
+                            .eq(TbBasicDataField::getBasicDataId, tbBasicData.getId())
+                            .eq(TbBasicDataField::getFieldId, textAndPercentage.getFieldIdStr())
+                            .oneOpt();
+                    if (tbBasicDataFieldOptional.isPresent()) {
+                        TbBasicDataField tbBasicDataField = tbBasicDataFieldOptional.get();
+                        if (CalculateTypeEnum.TEXT.equals(textAndPercentage.getCalculateType())) {
+                            String score = scoreMap.get(tbBasicDataField.getFieldValue());
+                            tbScore.setBasicDataId(tbBasicData.getId());
+                            tbScore.setScore(Double.parseDouble(score));
+                            tbScore.setBasicDataConfigId(textAndPercentage.getId());
+                            tbScoreService.save(tbScore);
+                        }
+                        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());
+                                double min = Double.parseDouble(split[0]);
+                                double max = Double.parseDouble(split[1]);
+                                if (v >= min && v <= max) {
+                                    tbScore.setScore(Double.parseDouble(stringStringEntry.getValue()));
+                                }
+                            }
+                            tbScore.setBasicDataId(tbBasicData.getId());
+                            tbScore.setBasicDataConfigId(textAndPercentage.getId());
+                            tbScoreService.save(tbScore);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private static String validateFields(Map.Entry<Integer, String> integerStringEntry, Map<Integer, String> dataMap, TbField field) {
+        String value = dataMap.get(integerStringEntry.getKey());
+        if (FieldTypeEnum.NUMBER.getCode().equals(field.getFieldType())) {
+            Integer numMin = field.getNumMin();
+            Integer numMax = field.getNumMax();
+            if (Objects.nonNull(numMin) && Objects.nonNull(numMax)) {
+                if (numMin > Integer.parseInt(value) || numMax < Integer.parseInt(value)) {
+                    throw new ServiceException(String.format("字段%s的内容不在%d~%d范围内", field.getFieldName(),numMin,numMax));
+                }
+            }
+        }
+        if (FieldInputTypeEnum.MANUAL_INPUT.getCode().equals(field.getTextInputType()) && FieldTypeEnum.TEXT.getCode().equals(field.getFieldType())) {
+            Integer textMinNum = field.getTextMinNum();
+            Integer textMaxNum = field.getTextMaxNum();
+            if (Objects.nonNull(textMinNum) && Objects.nonNull(textMaxNum)) {
+                if (textMinNum > value.length() || textMaxNum < value.length()) {
+                    throw new ServiceException(String.format("字段%s的内容长度超出%d~%d的范围", field.getFieldName(),textMinNum,textMaxNum));
+                }
+            }
+        }
+        if (FieldTypeEnum.PERCENTAGE.getCode().equals(field.getFieldType())) {
+            if (0 > Double.parseDouble(value) || 100 < Double.parseDouble(value)) {
+                throw new ServiceException(String.format("字段%s的内容不在0~100范围内", field.getFieldName()));
+            }
+        }
+        return value;
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
index 1b19e95..febcccb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TbScoreMapper.java
@@ -1,7 +1,13 @@
 package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.domain.TbScore;
+import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.vo.ScoreVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,5 @@
  */
 public interface TbScoreMapper extends BaseMapper<TbScore> {
 
+    List<ScoreVO> pageScore(@Param("query") ScoreQuery query, @Param("page") Page<ScoreVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java
new file mode 100644
index 0000000..622cc9a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ScoreQuery.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import com.ruoyi.common.enums.FieldTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/3/27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("得分计算条件查询对象")
+public class ScoreQuery extends BasePage {
+
+    private static final long serialVersionUID = -3063606775652464607L;
+    @ApiModelProperty(value = "类型名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "计算方式")
+    private FieldTypeEnum type;
+
+    @ApiModelProperty(value = "基础数据Id",hidden = true)
+    private Integer basicDataId;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
index 3c6535e..3f33c57 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
@@ -1,13 +1,14 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.domain.TbBasicData;
 import com.ruoyi.system.dto.BasicDataDTO;
+import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.vo.BasicDataReportingVO;
+import com.ruoyi.system.vo.ScoreVO;
 import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
 
 /**
  * <p>
@@ -25,5 +26,7 @@
 
     void downloadImportTemplate() throws Exception;
 
-    void importBasicData(MultipartFile file) throws IOException;
+    void importBasicData(MultipartFile file) throws Exception;
+
+    PageDTO<ScoreVO> pageScore(ScoreQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
index 841d514..f6e8801 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbScoreService.java
@@ -1,7 +1,12 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.domain.TbScore;
+import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.vo.ScoreVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,5 @@
  */
 public interface TbScoreService extends IService<TbScore> {
 
+    List<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
index e6639e2..d755803 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
@@ -2,9 +2,10 @@
 
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
-import com.ruoyi.common.NumberDisplaceChineseUtil;
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.ReportingStatusEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
@@ -12,19 +13,16 @@
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.system.domain.TbBasicData;
-import com.ruoyi.system.domain.TbBasicDataField;
-import com.ruoyi.system.domain.TbDept;
-import com.ruoyi.system.domain.TbField;
+import com.ruoyi.common.utils.NumberDisplaceChineseUtil;
+import com.ruoyi.system.domain.*;
 import com.ruoyi.system.dto.BasicDataDTO;
 import com.ruoyi.system.listener.BasicDataListener;
 import com.ruoyi.system.mapper.TbBasicDataMapper;
-import com.ruoyi.system.service.TbBasicDataFieldService;
-import com.ruoyi.system.service.TbBasicDataService;
-import com.ruoyi.system.service.TbDeptService;
-import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.query.ScoreQuery;
+import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.BasicDataReportingVO;
 import com.ruoyi.system.vo.FieldReportingVO;
+import com.ruoyi.system.vo.ScoreVO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -32,7 +30,6 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.net.URLEncoder;
 import java.time.Instant;
 import java.time.LocalDate;
@@ -58,7 +55,9 @@
     private final HttpServletResponse response;
     private final TbFieldService tbFieldService;
     private final TbBasicDataFieldService tbBasicDataFieldService;
-
+    private final TbBasicDataConfigService tbBasicDataConfigService;
+    private final TbBasicDataConfigDetailService tbBasicDataConfigDetailService;
+    private final TbScoreService scoreService;
     @Override
     public R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception {
         BasicDataReportingVO vo = new BasicDataReportingVO();
@@ -189,12 +188,39 @@
     }
 
     @Override
-    public void importBasicData(MultipartFile file) throws IOException {
+    @Transactional(rollbackFor = Exception.class)
+    public void importBasicData(MultipartFile file) throws Exception {
         //TODO
         //LoginUser loginUser = SecurityUtils.getLoginUser();
         TbDept dept = tbDeptService.getById(44);
         //查询需要填写的动态字段
         List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
-        EasyExcel.read(file.getInputStream(), new BasicDataListener(this,fieldList,tbFieldService,dept,tbBasicDataFieldService)).sheet().doRead();
+        EasyExcel.read(file.getInputStream(), new BasicDataListener(this,fieldList,
+                tbFieldService,dept,tbBasicDataFieldService,tbBasicDataConfigService,
+                tbBasicDataConfigDetailService,scoreService)).sheet().doRead();
+    }
+
+    @Override
+    public PageDTO<ScoreVO> pageScore(ScoreQuery query) {
+        Page<ScoreVO> page = new Page<>(query.getPageNum(), query.getPageSize());
+        //todo 获取当前登录部门
+        //校验区划代码
+        TbDept dept = tbDeptService.getById(44);
+        Map<String, Date> quarterDate = DateUtils.getQuarterDate(new Date());
+        //当前季度开始
+        Date quarterStart = quarterDate.get("first");
+        //当前季度结束
+        Date quarterEnd = quarterDate.get("last");
+        //查询是否有当前季度的填报记录
+        TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery()
+                .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode())
+                .between(TbBasicData::getCreateTime, quarterStart,quarterEnd));
+        if (Objects.isNull(basicData)) {
+            return PageDTO.empty(page);
+        }
+        query.setBasicDataId(basicData.getId());
+        //查询对应的基础数据配置
+        List<ScoreVO> vos = scoreService.pageScore(query,page);
+        return PageDTO.of(page, vos);
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
index 487ac14..fd44836 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbScoreServiceImpl.java
@@ -1,10 +1,15 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.domain.TbScore;
 import com.ruoyi.system.mapper.TbScoreMapper;
+import com.ruoyi.system.query.ScoreQuery;
 import com.ruoyi.system.service.TbScoreService;
+import com.ruoyi.system.vo.ScoreVO;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -17,4 +22,8 @@
 @Service
 public class TbScoreServiceImpl extends ServiceImpl<TbScoreMapper, TbScore> implements TbScoreService {
 
+    @Override
+    public List<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
+        return baseMapper.pageScore(query,page);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreVO.java
new file mode 100644
index 0000000..e15390c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ScoreVO.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.enums.CalculateTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/3/27
+ */
+@Data
+@ApiModel(value="得分计算视图对象")
+public class ScoreVO {
+
+    @ApiModelProperty("类型名称")
+    private String typeName;
+
+    @ApiModelProperty("计算方式")
+    private CalculateTypeEnum calculateType;
+
+    @ApiModelProperty("得分")
+    private Double score;
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
index 0230d6a..bd90752 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbScoreMapper.xml
@@ -19,5 +19,24 @@
     <sql id="Base_Column_List">
         id, basic_data_config_id, basic_data_id, score, del_flag, create_by, create_time, update_by, update_time
     </sql>
+    <select id="pageScore" resultType="com.ruoyi.system.vo.ScoreVO">
+        SELECT
+            tbdc.type_name,
+            tbdc.calculate_type,
+            ts.score
+        FROM
+            tb_score ts
+                LEFT JOIN tb_basic_data tbd ON ts.basic_data_id = tbd.id
+                LEFT JOIN tb_basic_data_config tbdc ON ts.basic_data_config_id = tbdc.id
+        WHERE
+            1=1
+            AND tbd.id = #{query.basicDataId}
+            <if test="query.typeName !=null and query.typeName!=''">
+                AND tbdc.type_name like Concat('%',#{query.typeName},'%')
+            </if>
+            <if test="query.typeName !=null and query.typeName!=''">
+                AND tbdc.calculate_type = #{query.type}
+            </if>
+    </select>
 
 </mapper>

--
Gitblit v1.7.1