소스 검색

Merge remote-tracking branch 'origin/master'

LIVE_YE 1 년 전
부모
커밋
78f6b1e2ef
23개의 변경된 파일381개의 추가작업 그리고 90개의 파일을 삭제
  1. 5 3
      ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
  2. 10 6
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/score/ScoreDataController.java
  3. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/xiake/XiakeConfigController.java
  4. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/RecordLeave.java
  5. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/bo/RecordLeaveBo.java
  6. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/vo/RecordLeaveVo.java
  7. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreData.java
  8. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataDetail.java
  9. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataStudent.java
  10. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataDetailBo.java
  11. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataStudentBo.java
  12. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataDetailVo.java
  13. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataStudentVo.java
  14. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataVo.java
  15. 21 44
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/ScoreDataListener.java
  16. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/ScoreDateUtil.java
  17. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/info/XiaoyuanInfoServiceImpl.java
  18. 91 29
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/score/ScoreDataServiceImpl.java
  19. 43 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/xiake/XiakeConfigServiceImpl.java
  20. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java
  21. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/xiake/IXiakeConfigService.java
  22. 37 0
      ruoyi-modules/ruoyi-system/src/main/resources/badWord.txt
  23. 12 4
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

+ 5 - 3
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.resource.ClassPathResource;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.EasyExcelFactory;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
 import com.alibaba.excel.write.metadata.WriteSheet;
@@ -14,18 +15,19 @@ import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.file.FileUtils;
 import org.dromara.common.excel.convert.ExcelBigNumberConvert;
 import org.dromara.common.excel.core.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * Excel相关处理

+ 10 - 6
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/score/ScoreDataController.java

@@ -18,6 +18,7 @@ import org.dromara.system.domain.score.vo.ScoreDataStudentVo;
 import org.dromara.system.domain.score.vo.ScoreDataVo;
 import org.dromara.system.domain.vo.SysUserImportVo;
 import org.dromara.system.listener.ScoreDataListener;
+import org.dromara.system.listener.ScoreDateUtil;
 import org.dromara.system.listener.SysUserImportListener;
 import org.dromara.system.service.score.IScoreDataService;
 import org.springframework.http.MediaType;
@@ -72,13 +73,16 @@ public class ScoreDataController extends BaseController {
      * 导入数据
      *
      * @param file          导入文件
-     * @param updateSupport 是否更新已存在数据
      */
     @SaCheckPermission("score:data:add")
     @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
-        ExcelResult<ScoreDataVo> result = ExcelUtil.importExcel(file.getInputStream(), ScoreDataVo.class, new ScoreDataListener(updateSupport));
-        return R.ok(result.getAnalysis());
+    public R<Void> importData(ScoreDataBo scoreData,@RequestPart("file") MultipartFile file) throws Exception {
+
+        //获取到处理后的数据
+        List<Map<String, String>> maps = ScoreDateUtil.importExcel(file);
+        //进行新增操作
+        scoreDataService.importData(scoreData,maps);
+        return R.ok();
     }
 
     /**
@@ -210,7 +214,7 @@ public class ScoreDataController extends BaseController {
     }
 
     /**
-     * 级总分平均分排名统计折线
+     * 级总分平均分排名统计折线
      */
     @PostMapping("/avgRankZheXian")
     public AjaxResult avgRankZheXian(@RequestBody ScoreData scoreData)
@@ -219,7 +223,7 @@ public class ScoreDataController extends BaseController {
     }
 
     /**
-     * 各班级总分平均分人数统计
+     * 年级平均分各班级人数统计
      */
     @PostMapping("/avgRank")
     public TableDataInfo<ScoreDataVo> avgRank(@RequestBody ScoreData scoreData)

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/xiake/XiakeConfigController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.domain.AjaxResult;
 import org.dromara.system.domain.xiake.XiakeConfig;
 import org.dromara.system.domain.xiake.bo.XiakeConfigBo;
 import org.dromara.system.domain.xiake.vo.XiakeConfigVo;
@@ -24,6 +25,8 @@ import org.dromara.common.excel.utils.ExcelUtil;
 
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.core.domain.AjaxResult.success;
+
 /**
  * 下课时间配置
  *
@@ -121,4 +124,16 @@ public class XiakeConfigController extends BaseController {
                           @PathVariable Long[] configIds) {
         return toAjax(xiakeConfigService.deleteWithValidByIds(List.of(configIds), true));
     }
+
+    /**
+     * 刷新参数缓存
+     */
+
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public AjaxResult refreshCache()
+    {
+        xiakeConfigService.resetConfigCache();
+        return AjaxResult.success();
+    }
 }

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/RecordLeave.java

@@ -38,11 +38,13 @@ public class RecordLeave extends BaseEntity {
     /**
      * 请假开始时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date startTime;
 
     /**
      * 请假结束时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
     /**

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/bo/RecordLeaveBo.java

@@ -40,12 +40,15 @@ public class RecordLeaveBo extends BaseEntity {
      * 请假开始时间
      */
     //@NotNull(message = "请假开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+
     private Date startTime;
 
     /**
      * 请假结束时间
      */
     //@NotNull(message = "请假结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
     /**

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/record/vo/RecordLeaveVo.java

@@ -3,6 +3,7 @@ package org.dromara.system.domain.record.vo;
 import java.util.Date;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import org.dromara.system.domain.record.RecordLeave;
@@ -41,12 +42,14 @@ public class RecordLeaveVo implements Serializable {
      * 请假开始时间
      */
     @ExcelProperty(value = "请假开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date startTime;
 
     /**
      * 请假结束时间
      */
     @ExcelProperty(value = "请假结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
 
     /**

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreData.java

@@ -37,8 +37,8 @@ public class ScoreData extends TenantEntity {
     /**
      * 考试时间
      */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date scoreTime;
+    //@JsonFormat(pattern = "yyyy-MM-dd")
+    private String scoreTime;
 
     /**
      * 接收班级id

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataDetail.java

@@ -47,6 +47,11 @@ public class ScoreDataDetail extends TenantEntity {
      */
     private Long scoreDataNameId;
 
+    /**
+     * 学号
+     */
+    private String studentNumber;
+
     /**
      * 学科
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataStudent.java

@@ -47,6 +47,11 @@ public class ScoreDataStudent extends TenantEntity {
      */
     private Long scoreDataNameId;
 
+    /**
+     * 学号
+     */
+    private String studentNumber;
+
     /**
      * 总分
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataDetailBo.java

@@ -53,6 +53,11 @@ public class ScoreDataDetailBo extends BaseEntity {
 
     private Long scoreDataNameId;
 
+    /**
+     * 学号
+     */
+    private String studentNumber;
+
     /**
      * 学科
      */

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataStudentBo.java

@@ -52,6 +52,10 @@ public class ScoreDataStudentBo extends BaseEntity {
      */
     //@NotNull(message = "学生姓名id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long scoreDataNameId;
+    /**
+     * 学号
+     */
+    private String studentNumber;
 
     /**
      * 总分

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataDetailVo.java

@@ -55,6 +55,11 @@ public class ScoreDataDetailVo implements Serializable {
     @ExcelProperty(value = "学生姓名id")
     private Long scoreDataNameId;
 
+    /**
+     * 学号
+     */
+    private String studentNumber;
+
     /**
      * 学科
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataStudentVo.java

@@ -34,6 +34,11 @@ public class ScoreDataStudentVo implements Serializable {
     @ExcelProperty(value = "成绩表_子表学生id")
     private Long scoreStudentId;
 
+    /**
+     * 学号
+     */
+    private String studentNumber;
+
     /**
      * 成绩表id
      */

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataVo.java

@@ -46,8 +46,8 @@ public class ScoreDataVo implements Serializable {
      * 考试时间
      */
     @ExcelProperty(value = "考试时间")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private Date scoreTime;
+    //@JsonFormat(pattern = "yyyy-MM-dd")
+    private String scoreTime;
 
     /**
      * 接收班级id

+ 21 - 44
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/ScoreDataListener.java

@@ -22,7 +22,9 @@ import org.dromara.system.service.ISysUserService;
 import org.dromara.system.service.score.IScoreDataService;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 学生成绩自定义导入
@@ -30,59 +32,34 @@ import java.util.List;
  * @author Lion Li
  */
 @Slf4j
-public class ScoreDataListener extends AnalysisEventListener<ScoreDataVo> implements ExcelListener<ScoreDataVo> {
+public class ScoreDataListener extends AnalysisEventListener<Map<Integer, String>> {
+    //表头数据(存储所有的表头数据)
+    private List<Map<Integer, String>> headList = new ArrayList<>();
+    //数据体
+    private List<Map<Integer, String>> dataList = new ArrayList<>();
 
-    private IScoreDataService scoreDataService;
-
-
-    private int successNum = 0;
-    private int failureNum = 0;
-    private final StringBuilder successMsg = new StringBuilder();
-    private final StringBuilder failureMsg = new StringBuilder();
-
-    /**
-     * 是否更新已存在的数据
-     * @param isUpdateSupport
-     */
-    public ScoreDataListener(Boolean isUpdateSupport) {
 
+    @Override//这里会一行行的返回头
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+        //存储全部表头数据
+        headList.add(headMap);
     }
 
-    @Override
-    public void invoke(ScoreDataVo scoreDataVo, AnalysisContext context) {
-        ScoreDataBo scoreData = BeanUtil.toBean(scoreDataVo, ScoreDataBo.class);
-        scoreDataService.insertByBo(scoreData);
+    @Override// 处理每一行数据
+    public void invoke(Map<Integer, String> data, AnalysisContext context) {
+        dataList.add(data);
     }
 
-    @Override
+    @Override// 全部处理结束执行
     public void doAfterAllAnalysed(AnalysisContext context) {
-
     }
 
-    @Override
-    public ExcelResult<ScoreDataVo> getExcelResult() {
-        return new ExcelResult<>() {
-
-            @Override
-            public String getAnalysis() {
-                if (failureNum > 0) {
-                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
-                    throw new ServiceException(failureMsg.toString());
-                } else {
-                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条");
-                }
-                return successMsg.toString();
-            }
-
-            @Override
-            public List<ScoreDataVo> getList() {
-                return null;
-            }
+    public List<Map<Integer, String>> getHeadList() {
+        return headList;
+    }
 
-            @Override
-            public List<String> getErrorList() {
-                return null;
-            }
-        };
+    public List<Map<Integer, String>> getDataList() {
+        return dataList;
     }
+
 }

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/ScoreDateUtil.java

@@ -0,0 +1,84 @@
+package org.dromara.system.listener;
+
+import com.alibaba.excel.EasyExcelFactory;
+import org.apache.commons.collections4.CollectionUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 学生成绩导入
+ * @Author: tjf
+ * @Date: 2023/8/31 10:36
+ * @Describe:
+ */
+public class ScoreDateUtil {
+
+    /**
+     * 动态表头导入功能
+     *
+     * @param file 文件
+     * @return
+     */
+    public static List<Map<String, String>> importExcel(MultipartFile file) {
+        try {
+            // 首先校验传入文件是否为空
+            if (file == null) {
+                throw new RuntimeException("传入数据为空");
+            }
+            // 引入监听器(此处需注意,监听器不可被Spring管理)
+            ScoreDataListener readListener = new ScoreDataListener();
+            // 开始处理excel
+            EasyExcelFactory.read(file.getInputStream(), readListener)
+                .sheet(0)
+                .doRead();
+            // 获取表头(验空)
+            List<Map<Integer, String>> headList = readListener.getHeadList();
+            if (CollectionUtils.isEmpty(headList)) {
+                throw new RuntimeException("Excel表头不能为空");
+            }
+            // 获取表数据(验空)
+            List<Map<Integer, String>> dataList = readListener.getDataList();
+            if (CollectionUtils.isEmpty(dataList)) {
+                throw new RuntimeException("Excel数据内容不能为空");
+            }
+            //获取头部,取最后一次解析的列头数据
+            Map<Integer, String> excelHeadIdxNameMap = headList.get(headList.size() - 1);
+           if (!excelHeadIdxNameMap.containsValue("姓名")){
+               throw new RuntimeException("表头不能缺少姓名");
+           }
+            if (!excelHeadIdxNameMap.containsValue("学号")){
+                throw new RuntimeException("表头不能缺少学号");
+            }
+            //封装满分MAP
+            Map<String, String> manFenMap = new HashMap<>();
+            for (Integer integer : excelHeadIdxNameMap.keySet()) {
+                String title = excelHeadIdxNameMap.get(integer);
+                if (title.contains("/")){
+                    String[] split = title.split("/");
+                    manFenMap.put(split[0],split[1]);
+                    excelHeadIdxNameMap.put(integer,split[0]);
+                }
+            }
+
+            //封装数据体
+            List<Map<String, String>> excelDataList = new ArrayList<Map<String, String>>();
+            excelDataList.add(0,manFenMap);
+            for (Map<Integer, String> dataRow : dataList) {
+                HashMap<String, String> rowData = new HashMap<>();
+                excelHeadIdxNameMap.entrySet().forEach(columnHead -> {
+                    rowData.put(columnHead.getValue(), dataRow.get(columnHead.getKey()));
+                });
+                excelDataList.add(rowData);
+            }
+            return excelDataList;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("导入失败");
+        }
+    }
+}

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/info/XiaoyuanInfoServiceImpl.java

@@ -24,6 +24,7 @@ import org.dromara.system.mapper.info.XiaoyuanInfoMapper;
 import org.dromara.system.service.info.IXiaoyuanInfoService;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.XiaoyuanInfoBo;
+import util.BadWordsUtil;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -187,6 +188,10 @@ public class XiaoyuanInfoServiceImpl implements IXiaoyuanInfoService {
     @Override
     public Boolean insertInfoPingLun(InfoPingLunBo bo) {
         List<InfoPingLunBo> infoPingLunList = new ArrayList<>();
+        //敏感词过滤
+        String infoPingLunContent = bo.getInfoPingLunContent();
+        String content = BadWordsUtil.searchBanWords(infoPingLunContent);
+        bo.setInfoPingLunContent(content);
         infoPingLunList.add(bo);
         List<InfoPingLun> convert = MapstructUtils.convert(infoPingLunList, InfoPingLun.class);
         return infoPingLunMapper.insertBatch(convert);

+ 91 - 29
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/score/ScoreDataServiceImpl.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.controller.system.SysDictTypeController;
 import org.dromara.system.domain.FormalParentsStudent;
 import org.dromara.system.domain.FormalTeacherClass;
 import org.dromara.system.domain.SysUser;
@@ -31,17 +32,21 @@ import org.dromara.system.domain.score.vo.ScoreDataMfVo;
 import org.dromara.system.domain.score.vo.ScoreDataStudentVo;
 import org.dromara.system.domain.score.vo.ScoreDataVo;
 import org.dromara.system.domain.vo.FormalTeacherClassVo;
+import org.dromara.system.domain.vo.SysDictDataVo;
 import org.dromara.system.mapper.FormalParentsStudentMapper;
 import org.dromara.system.mapper.FormalTeacherClassMapper;
+import org.dromara.system.mapper.SysDictTypeMapper;
 import org.dromara.system.mapper.score.ScoreDataDetailMapper;
 import org.dromara.system.mapper.score.ScoreDataMapper;
 import org.dromara.system.mapper.score.ScoreDataMfMapper;
 import org.dromara.system.mapper.score.ScoreDataStudentMapper;
+import org.dromara.system.service.impl.SysDictTypeServiceImpl;
 import org.dromara.system.service.score.IScoreDataService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.DecimalFormat;
+import java.text.NumberFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -58,6 +63,7 @@ import static org.dromara.common.core.constant.CacheConstants.*;
 public class ScoreDataServiceImpl implements IScoreDataService {
 
     private final ScoreDataMapper baseMapper;
+    private final SysDictTypeServiceImpl sysDictTypeService;
     private final ScoreDataStudentMapper scoreDataStudentMapper;
     private final ScoreDataDetailMapper scoreDataDetailMapper;
     private final ScoreDataMfMapper scoreDataMfMapper;
@@ -168,21 +174,21 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ScoreData> lqw = Wrappers.lambdaQuery();
         String scoreType = bo.getScoreType();
-        if (StringUtils.isNotBlank(scoreType) && "5".equals(scoreType)){
+        if (StringUtils.isNotBlank(scoreType) && "5".equals(scoreType)) {
             //说明是统计查询成绩列表的全部 = score_type != 4
-            lqw.ne(ScoreData::getScoreTitle,"4");
+            lqw.ne(ScoreData::getScoreTitle, "4");
         }
-        if (StringUtils.isNotBlank(scoreType) && !"5".equals(scoreType)){
+        if (StringUtils.isNotBlank(scoreType) && !"5".equals(scoreType)) {
             //说明是统计查询成绩列表的全部 = score_type != 4
-            lqw.eq(ScoreData::getScoreTitle,scoreType);
+            lqw.eq(ScoreData::getScoreTitle, scoreType);
         }
         lqw.eq(StringUtils.isNotBlank(bo.getScoreTitle()), ScoreData::getScoreTitle, bo.getScoreTitle());
         lqw.eq(StringUtils.isNotBlank(bo.getScoreTime()), ScoreData::getScoreTime, bo.getScoreTime());
         lqw.like(StringUtils.isNotBlank(bo.getScoreClassName()), ScoreData::getScoreClassName, bo.getScoreClassName());
         lqw.eq(StringUtils.isNotBlank(bo.getPrivacyType()), ScoreData::getPrivacyType, bo.getPrivacyType());
         lqw.eq(StringUtils.isNotBlank(bo.getAvg()), ScoreData::getAvg, bo.getAvg());
-        if (bo.getScoreClassId() != null){
-            lqw.apply("find_in_set(score_class_id,'"+bo.getScoreClassId()+"')");
+        if (bo.getScoreClassId() != null) {
+            lqw.apply("find_in_set(score_class_id,'" + bo.getScoreClassId() + "')");
         }
         return lqw;
     }
@@ -192,6 +198,8 @@ public class ScoreDataServiceImpl implements IScoreDataService {
      */
     @Override
     public Boolean insertByBo(ScoreDataBo bo) {
+
+        DecimalFormat df = new DecimalFormat("#.00");
         ScoreData add = MapstructUtils.convert(bo, ScoreData.class);
         //validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
@@ -225,14 +233,15 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                         zf = zf + scoreDataDetailBo.getScore();
                         scoreDataDetailBo.setScoreId(scoreId);
                         scoreDataDetailBo.setScoreDataName(scoreDataStudentBo.getScoreDataName());
-                        scoreDataDetailBo.setScoreDataNameId(scoreDataStudentBo.getScoreDataNameId());
+                        scoreDataDetailBo.setStudentNumber(scoreDataStudentBo.getStudentNumber());
+                        //scoreDataDetailBo.setScoreDataNameId(scoreDataStudentBo.getScoreDataNameId());
                         //插入满分
                         scoreDataDetailBo.setManfen(map.get(scoreDataDetailBo.getXueke()));
                     }
                     classZf = classZf + zf;
                     scoreDataStudentBo.setZongfen(zf);
-                    //计算平均分 = 总分/学科数
-                    scoreDataStudentBo.setAvg(String.valueOf(zf / scoreDataDetailBoList.size()));
+                    //计算个人平均分 = 总分/学科数
+                    scoreDataStudentBo.setAvg(String.valueOf(df.format(zf / scoreDataDetailBoList.size())));
                     scoreDataStudentBo.setScoreId(scoreId);
 
                     scoreDataDetailMapper.insertBatch(MapstructUtils.convert(scoreDataDetailBoList, ScoreDataDetail.class));
@@ -255,9 +264,11 @@ public class ScoreDataServiceImpl implements IScoreDataService {
             scoreDataStudentMapper.insertBatch(MapstructUtils.convert(scoreDataStudentBoList, ScoreDataStudent.class));
 
             //计算班级总分平均分=各学生总分/学生人数
-            double classAvg = classZf / scoreDataStudentBoList.size();
-            add.setAvg(classAvg);
+            String classAvg = df.format(classZf / scoreDataStudentBoList.size());
+            add.setAvg(Double.parseDouble(classAvg));
             baseMapper.updateById(add);
+            RedisUtils.setCacheObject(SCORE_PEOPLE_ALL + scoreId, scoreDataStudentBoList.size());
+            RedisUtils.setCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + scoreId, 0);
         }
         return flag;
     }
@@ -468,7 +479,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
             //去查询对应学生的具体学科成绩/计算学科平均分
             //获取所有学生id
             List<Long> scoreDataNameIds = scoreDataStudentVos.stream().map(ScoreDataStudentVo::getScoreDataNameId).collect(Collectors.toList());
-            List<ScoreDataDetailVo> scoreDataDetailVos = scoreDataDetailMapper.selectListByscoreDataNameId(scoreDataNameIds,scoreId);
+            List<ScoreDataDetailVo> scoreDataDetailVos = scoreDataDetailMapper.selectListByscoreDataNameId(scoreDataNameIds, scoreId);
             //根据学科进行分组
             if (scoreDataDetailVos != null && scoreDataDetailVos.size() > 0) {
                 Map<String, List<ScoreDataDetailVo>> xuekeCollect = scoreDataDetailVos.parallelStream().collect(Collectors.groupingBy(ScoreDataDetailVo::getXueke));
@@ -535,7 +546,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
     }
 
     /**
-     * 级总分平均分排名统计折线
+     * 级总分平均分排名统计折线
      *
      * @param scoreData
      * @return
@@ -553,19 +564,20 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         //查询出所有对应班级的考试id和平均分
         List<ScoreDataVo> scoreDataVos = baseMapper.avgRank(scoreData);
         if (scoreDataVos != null && scoreDataVos.size() > 0) {
+            //年级平均分
+            double avg = scoreDataVos.stream().mapToDouble(ScoreDataVo::getAvg).sum() / scoreDataVos.size();
             long[] scoreIds = scoreDataVos.stream().mapToLong(ScoreDataVo::getScoreId).toArray();
             //拿着考试id去查询对应学生
             List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.selectScoreByScoreIds(scoreIds);
             List<String> x = new ArrayList<>();
             List<Integer> y1 = new ArrayList<>();
             List<Integer> y2 = new ArrayList<>();
-            //判断对应班级的对应学生的总分在班级总分平均分的位置
+            //判断对应班级的对应学生的平均分在年级平均分的位置
             for (ScoreDataVo scoreDataVo : scoreDataVos) {
                 //存放X轴数据
                 x.add(scoreDataVo.getScoreClassName());
                 Long scoreId = scoreDataVo.getScoreId();
-                //班级平均分
-                double avg = scoreDataVo.getAvg();
+
                 Map<Long, List<ScoreDataStudentVo>> collect = scoreDataStudentVos.stream().collect(Collectors.groupingBy(ScoreDataStudentVo::getScoreId));
                 //获取对应考试的学生集合
                 List<ScoreDataStudentVo> scoreDataStudentVosList = collect.get(scoreId);
@@ -582,6 +594,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                 }
             }
             map.put("x", x);
+            map.put("avg", avg);
             map.put("y1", y1);
             map.put("y2", y2);
         }
@@ -603,14 +616,14 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         //查询出所有对应班级的考试id和平均分
         List<ScoreDataVo> scoreDataVos = baseMapper.avgRank(scoreData);
         if (scoreDataVos != null && scoreDataVos.size() > 0) {
+            //年级平均分
+            double avg = scoreDataVos.stream().mapToDouble(ScoreDataVo::getAvg).sum() / scoreDataVos.size();
             long[] scoreIds = scoreDataVos.stream().mapToLong(ScoreDataVo::getScoreId).toArray();
             //拿着考试id去查询对应学生
             List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.selectScoreByScoreIds(scoreIds);
             //判断对应班级的对应学生的总分在班级总分平均分的位置
             for (ScoreDataVo scoreDataVo : scoreDataVos) {
                 Long scoreId = scoreDataVo.getScoreId();
-                //班级平均分
-                double avg = scoreDataVo.getAvg();
                 Map<Long, List<ScoreDataStudentVo>> collect = scoreDataStudentVos.stream().collect(Collectors.groupingBy(ScoreDataStudentVo::getScoreId));
                 //获取对应考试的学生集合
                 List<ScoreDataStudentVo> scoreDataStudentVosList = collect.get(scoreId);
@@ -618,7 +631,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                 if (scoreDataStudentVosList != null && scoreDataStudentVosList.size() > 0) {
                     List<ScoreDataStudentVo> scoreDataStudentVosListUp = scoreDataStudentVosList.stream().filter(scoreDataStudent -> scoreDataStudent.getZongfen() >= avg)
                         .collect(Collectors.toList());
-                    List<ScoreDataStudentVo> scoreDataStudentVosListDown = scoreDataStudentVosList.stream().filter(scoreDataStudent -> scoreDataStudent.getZongfen() < avg)
+                    List<ScoreDataStudentVo> scoreDataStudentVosListDown = scoreDataStudentVosList.stream().filter(scoreDataStudent -> scoreDataStudent.getZongfen()< avg)
                         .collect(Collectors.toList());
                     scoreDataVo.setUp(scoreDataStudentVosListUp.size());
                     scoreDataVo.setDown(scoreDataStudentVosListDown.size());
@@ -688,39 +701,41 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                 }
             }
             //总人数
-            int size = scoreDataStudentVos.size();
+            float  size = scoreDataStudentVos.size();
+
             if (size > 0) {
-                DecimalFormat df = new DecimalFormat("##.0%");
+                NumberFormat nf = NumberFormat.getPercentInstance();
+                nf.setMaximumFractionDigits(2);
                 if (a > 0) {
-                    map.put("OneZ", df.format(size / a));
+                    map.put("OneZ", nf.format((float) a/size));
 
                 }
                 if (b > 0) {
-                    map.put("TowZ", df.format(size / b));
+                    map.put("TowZ", nf.format((float) b/size));
 
                 }
                 if (c > 0) {
-                    map.put("ThrZ", df.format(size / c));
+                    map.put("ThrZ", nf.format((float) c/size));
 
                 }
                 if (d > 0) {
-                    map.put("ForZ", df.format(size / d));
+                    map.put("ForZ", nf.format((float) d/size));
 
                 }
                 if (e > 0) {
-                    map.put("FivZ", df.format(size / e));
+                    map.put("FivZ", nf.format((float) e/size));
 
                 }
                 if (f > 0) {
-                    map.put("SixZ", df.format(size / f));
+                    map.put("SixZ", nf.format((float) f/size));
 
                 }
                 if (g > 0) {
-                    map.put("SevZ", df.format(size / g));
+                    map.put("SevZ", nf.format((float) g/size));
 
                 }
                 if (h > 0) {
-                    map.put("EigZ", df.format(size / h));
+                    map.put("EigZ", nf.format((float) h/size));
 
                 }
             }
@@ -800,4 +815,51 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         scoreDataVo.setScoreDataStudentVoList(scoreDataStudentVos);
         return scoreDataVo;
     }
+
+    /**
+     * 学生成绩导入
+     *
+     * @param maps
+     */
+    @Override
+    public void importData(ScoreDataBo scoreData, List<Map<String, String>> maps) {
+        //去字典值中匹配学科名称 sys_subject
+        List<SysDictDataVo> sysSubject = sysDictTypeService.selectDictDataByType("sys_subject");
+        List<String> xueKeList = sysSubject.stream().map(SysDictDataVo::getDictLabel).collect(Collectors.toList());
+        List<ScoreDataStudentBo> scoreDataStudentBoList = new ArrayList<>();
+        //获取满分设置
+        Map<String, String> manFenMap = maps.get(0);
+        if (manFenMap != null) {
+            List<ScoreDataMfBo> scoreDataMfBoList = new ArrayList<>();
+            for (String xueKe : manFenMap.keySet()) {
+                ScoreDataMfBo scoreDataMfBo = new ScoreDataMfBo();
+                scoreDataMfBo.setXueke(xueKe);
+                scoreDataMfBo.setManfen(manFenMap.get(xueKe));
+                scoreDataMfBoList.add(scoreDataMfBo);
+            }
+            maps.remove(0);
+            scoreData.setScoreDataMfBoList(scoreDataMfBoList);
+        }
+        //处理数据成对象
+        for (Map<String, String> map : maps) {
+            //每一个Map里面有学生姓名和各科成绩
+            //组装成一个ScoreDataBo对象中的
+            ScoreDataStudentBo studentBo = new ScoreDataStudentBo();
+            studentBo.setScoreDataName(map.get("姓名"));
+            studentBo.setStudentNumber(map.get("学号"));
+            List<ScoreDataDetailBo> scoreDataDetailBoList = new ArrayList<>();
+            for (String key : map.keySet()) {
+                if (xueKeList.contains(key)) {
+                    ScoreDataDetailBo scoreDataDetailBo = new ScoreDataDetailBo();
+                    scoreDataDetailBo.setXueke(key);
+                    scoreDataDetailBo.setScore(Double.valueOf(map.get(key)));
+                    scoreDataDetailBoList.add(scoreDataDetailBo);
+                }
+            }
+            studentBo.setScoreDataDetailBoList(scoreDataDetailBoList);
+            scoreDataStudentBoList.add(studentBo);
+        }
+        scoreData.setScoreDataStudentBoList(scoreDataStudentBoList);
+        this.insertByBo(scoreData);
+    }
 }

+ 43 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/xiake/XiakeConfigServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.system.service.impl.xiake;
 
 import cn.hutool.core.convert.Convert;
+import jakarta.annotation.PostConstruct;
 import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -36,6 +37,15 @@ public class XiakeConfigServiceImpl implements IXiakeConfigService {
 
     private final XiakeConfigMapper baseMapper;
 
+    /**
+     * 项目启动时,初始化参数到缓存
+     */
+    @PostConstruct
+    public void init()
+    {
+        loadingConfigCache();
+    }
+
     /**
      * 查询下课时间配置
      */
@@ -173,4 +183,37 @@ public class XiakeConfigServiceImpl implements IXiakeConfigService {
         }
         return baseMapper.deleteBatchIds(ids) > 0;
     }
+
+    /**
+     * 加载参数缓存数据
+     */
+    @Override
+    public void loadingConfigCache()
+    {
+        List<XiakeConfig> configsList = baseMapper.selectList(buildQueryWrapper(new XiakeConfigBo()));
+        for (XiakeConfig config : configsList)
+        {
+            RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        }
+    }
+
+    /**
+     * 清空参数缓存数据
+     */
+    @Override
+    public void clearConfigCache()
+    {
+        Collection<String> keys = RedisUtils.keys(CacheConstants.XIA_CONFIG_KEY + "*");
+        RedisUtils.deleteObject(keys);
+    }
+
+    /**
+     * 重置参数缓存数据
+     */
+    @Override
+    public void resetConfigCache()
+    {
+        clearConfigCache();
+        loadingConfigCache();
+    }
 }

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java

@@ -108,4 +108,6 @@ public interface IScoreDataService {
      * @return 成绩
      */
     public ScoreDataVo selectScoreDataByScoreId(ScoreData scoreData);
+
+    public void importData(ScoreDataBo scoreData,List<Map<String, String>> maps);
 }

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/xiake/IXiakeConfigService.java

@@ -59,4 +59,19 @@ public interface IXiakeConfigService {
      * 校验并批量删除下课时间配置信息
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 加载参数缓存数据
+     */
+    public void loadingConfigCache();
+
+    /**
+     * 清空参数缓存数据
+     */
+    public void clearConfigCache();
+
+    /**
+     * 重置参数缓存数据
+     */
+    public void resetConfigCache();
 }

+ 37 - 0
ruoyi-modules/ruoyi-system/src/main/resources/badWord.txt

@@ -2,3 +2,40 @@ sb
 SB
 傻逼
 自杀
+恨你
+发泄
+去死
+JB
+死
+傻 逼
+MB
+草泥马
+叼
+贱
+強奸
+Make Love
+TMD
+销魂
+人渣
+王八蛋
+贱逼
+末日
+全脱
+脱光
+屁
+脑残
+Fuck
+F u c k
+王八
+法轮功
+法 轮 功
+法.轮.功
+尻
+操你
+我日
+日你
+日他
+草你妈
+屁
+打到共产党
+打倒共产党

+ 12 - 4
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

@@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="scoreSort"    column="score_sort"    />
         <result property="scoreDataName"    column="score_data_name"    />
         <result property="scoreDataNameId"    column="score_data_name_id"    />
+        <result property="studentNumber"    column="student_number"    />
         <result property="zongfen"    column="zongfen"    />
         <result property="avg"    column="avg"    />
         <collection property="scoreDataDetailVoList"   javaType="java.util.List"           resultMap="ScoreDataDetailResult"   />
@@ -23,10 +24,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="score"    column="sdd_score"    />
         <result property="scoreDataName"    column="sdd_score_data_name"    />
         <result property="scoreDataNameId"    column="sdd_score_data_name_id"    />
+        <result property="studentNumber"    column="sdd_student_number"    />
     </resultMap>
     <select id="selectScoreDataByScoreClassId" parameterType="string" resultMap="ScoreDataStudentResult">
         select
-            s.zongfen,s.score_id,s.avg,s.details_type,s.score_sort,s.score_data_name
+            s.zongfen,s.score_id,s.avg,s.details_type,s.score_sort,s.score_data_name,s.student_number
         from
             score_data_student s
         WHERE
@@ -47,12 +49,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             b.score_sort ,
             b.score_data_name ,
             b.score_data_name_id ,
+            b.student_number ,
             d.xueke as sdd_xueke,
             d.score as sdd_score,
             d.score_data_name as sdd_score_data_name
         FROM
             score_data_student b
-                LEFT JOIN score_data_detail d ON d.score_data_name_id = b.score_data_name_id
+                LEFT JOIN score_data_detail d ON d.student_number = b.student_number
         where b.score_id = #{scoreId} and  find_in_set(b.score_data_name_id,#{params.stdId}) order by  b.score_sort
     </select>
 
@@ -62,18 +65,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             b.score_sort ,
             b.score_data_name ,
             b.score_data_name_id ,
+            b.student_number ,
             d.xueke as sdd_xueke,
             d.score as sdd_score,
             d.score_data_name as sdd_score_data_name
         FROM
             score_data_student b
-                LEFT JOIN score_data_detail d ON d.score_data_name_id = b.score_data_name_id
+                LEFT JOIN score_data_detail d ON d.student_number = b.student_number
         where b.score_id = #{scoreId} order by  b.score_sort
     </select>
 
     <select id="selectScoreByScoreIds"  resultMap="ScoreDataStudentResult">
         SELECT
             b.score_id,
+            b.student_number,
             b.zongfen
         FROM
             score_data_student b
@@ -88,10 +93,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select ( @INDEX := @INDEX + 1 ) AS `score_sort`,
         a.score_data_name,
         a.score_data_name_id,
+        a.student_number,
         a.zongfen,
         a.score_id
         FROM
-        (select s.score_data_name,s.score_data_name_id,s.zongfen,s.score_id
+        (select s.score_data_name,s.score_data_name_id,s.zongfen,s.score_id,s.student_number
         FROM score_data_student s
         <where>
          score_id IN (
@@ -112,12 +118,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select  (@INDEX := @INDEX + 1) AS `sdd_score_sort`,
         a.score_data_name as sdd_score_data_name,
         a.score_data_name_id as sdd_score_data_name_id,
+        a.student_number as sdd_student_number,
         a.xueke as sdd_xueke,
         a.score as sdd_score
         FROM
        ( SELECT
         dd.score_data_name ,
         dd.score_data_name_id,
+        dd.student_number,
         dd.xueke as xueke,
         dd.score as score
         FROM