xiatian 8 сар өмнө
parent
commit
8e08964699

+ 25 - 0
src/main/java/cn/com/qmth/scancentral/bean/student/ExamProvinceInfo.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.scancentral.bean.student;
+
+public class ExamProvinceInfo {
+
+    private Long examId;
+
+    private String province;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+}

+ 8 - 0
src/main/java/cn/com/qmth/scancentral/config/InitData.java

@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
+import cn.com.qmth.scancentral.service.DataCacheService;
 import cn.com.qmth.scancentral.util.FileUtil;
 
 @Component
@@ -19,6 +20,9 @@ public class InitData implements CommandLineRunner {
     @Autowired
     private SysProperty sysProperty;
 
+    @Autowired
+    private DataCacheService dataCacheService;
+
     @Override
     public void run(String... args) throws IOException {
         // log.info("开始系统初始化...");
@@ -34,6 +38,10 @@ public class InitData implements CommandLineRunner {
         if (temp.exists()) {
             FileUtil.deleteDirectory(temp);
         }
+
+        log.warn("开始加载缓存数据...");
+        dataCacheService.loadCache();
+        log.warn("完成加载缓存数据...");
     }
 
 }

+ 4 - 2
src/main/java/cn/com/qmth/scancentral/controller/admin/ExamWorkController.java

@@ -13,6 +13,7 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 
 import cn.com.qmth.scancentral.entity.SubjectEntity;
+import cn.com.qmth.scancentral.service.DataCacheService;
 import cn.com.qmth.scancentral.service.StudentService;
 import cn.com.qmth.scancentral.service.SubjectService;
 import cn.com.qmth.scancentral.vo.CampusVo;
@@ -33,7 +34,8 @@ public class ExamWorkController {
 
     @Autowired
     private SubjectService subjectService;
-
+    @Autowired
+    private DataCacheService dataCacheService;
     @ApiOperation(value = "获取考生信息")
     @RequestMapping(value = "/student/find", method = RequestMethod.POST)
     public StudentVo student(@Validated StudentQuery query) {
@@ -67,7 +69,7 @@ public class ExamWorkController {
     @ApiOperation(value = "获取所有省份")
     @RequestMapping(value = "province/list", method = RequestMethod.POST)
     public List<String> provinceList(@RequestParam Long examId) {
-        return studentService.listProvinceByExamId(examId);
+        return dataCacheService.listProvinceByExamId(examId);
     }
 
     @ApiOperation(value = "获取所有考场号")

+ 3 - 2
src/main/java/cn/com/qmth/scancentral/dao/StudentDao.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import cn.com.qmth.scancentral.bean.AbsentQueryDomain;
 import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
 import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
+import cn.com.qmth.scancentral.bean.student.ExamProvinceInfo;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryParam;
@@ -112,8 +113,8 @@ public interface StudentDao extends BaseMapper<StudentEntity> {
 
     StudentAnswerVo getStudentVo(@Param("studentId") Long studentId);
 
-    List<String> listProvinceByExamId(@Param("examId") Long examId);
-
     List<String> listExamRoomByExamId(@Param("examId") Long examId);
 
+    List<ExamProvinceInfo> listProvince();
+
 }

+ 11 - 0
src/main/java/cn/com/qmth/scancentral/service/DataCacheService.java

@@ -0,0 +1,11 @@
+package cn.com.qmth.scancentral.service;
+
+import java.util.List;
+
+public interface DataCacheService {
+
+    void loadCache();
+
+    List<String> listProvinceByExamId(Long examId);
+
+}

+ 2 - 1
src/main/java/cn/com/qmth/scancentral/service/StudentService.java

@@ -19,6 +19,7 @@ import cn.com.qmth.scancentral.bean.User;
 import cn.com.qmth.scancentral.bean.omredit.OmrEditDomain;
 import cn.com.qmth.scancentral.bean.omredit.OmrFieldEditDomain;
 import cn.com.qmth.scancentral.bean.refix.AnswerRefixDomain;
+import cn.com.qmth.scancentral.bean.student.ExamProvinceInfo;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.entity.StudentPaperEntity;
 import cn.com.qmth.scancentral.enums.ExamStatus;
@@ -241,7 +242,7 @@ public interface StudentService extends IService<StudentEntity> {
 
     boolean existUncheck(Long examId, String subjectCode);
 
-    List<String> listProvinceByExamId(Long examId);
+    List<ExamProvinceInfo> listProvince();
 
     List<String> listExamRoomByExamId(Long examId);
 }

+ 76 - 0
src/main/java/cn/com/qmth/scancentral/service/impl/DataCacheServiceImpl.java

@@ -0,0 +1,76 @@
+package cn.com.qmth.scancentral.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.scancentral.bean.student.ExamProvinceInfo;
+import cn.com.qmth.scancentral.service.DataCacheService;
+import cn.com.qmth.scancentral.service.StudentService;
+
+@Service
+public class DataCacheServiceImpl implements DataCacheService {
+
+    protected static final Logger log = LoggerFactory.getLogger(DataCacheServiceImpl.class);
+
+    private Map<Long, Set<String>> provinceCache = new ConcurrentHashMap<>();
+
+    private Lock provinceLock = new ReentrantLock();
+
+    @Autowired
+    private StudentService studentService;
+
+    @Override
+    public void loadCache() {
+        loadProvince();
+    }
+
+    private void loadProvince() {
+        provinceCache.clear();
+        List<ExamProvinceInfo> provinces = studentService.listProvince();
+        for (ExamProvinceInfo province : provinces) {
+            if (StringUtils.isNotBlank(province.getProvince())) {
+                addProvinceCache(province.getExamId(), province.getProvince());
+            }
+        }
+    }
+
+    private void addProvinceCache(Long examId, String province) {
+        provinceLock.lock();
+        try {
+            Set<String> cache = provinceCache.get(examId);
+            if (cache == null) {
+                cache = new HashSet<>();
+                provinceCache.put(examId, cache);
+            }
+            cache.add(province);
+        } finally {
+            provinceLock.unlock();
+        }
+    }
+
+    @Override
+    public List<String> listProvinceByExamId(Long examId) {
+        Set<String> cache = provinceCache.get(examId);
+        List<String> ret = new ArrayList<>();
+        if (cache == null) {
+            return ret;
+        }
+        ret.addAll(cache);
+        Collections.sort(ret);
+        return ret;
+    }
+
+}

+ 7 - 2
src/main/java/cn/com/qmth/scancentral/service/impl/StudentImportServiceImpl.java

@@ -2,6 +2,7 @@ package cn.com.qmth.scancentral.service.impl;
 
 import cn.com.qmth.scancentral.bean.ImportStudentDomain;
 import cn.com.qmth.scancentral.enums.AsyncTaskStatus;
+import cn.com.qmth.scancentral.service.DataCacheService;
 import cn.com.qmth.scancentral.service.StudentImportService;
 import cn.com.qmth.scancentral.service.StudentService;
 import cn.com.qmth.scancentral.service.SubjectService;
@@ -32,6 +33,9 @@ public class StudentImportServiceImpl implements StudentImportService {
     @Autowired
     private StudentService studentService;
 
+    @Autowired
+    private DataCacheService dataCacheService;
+
     @Override
     public ImportTaskVo studentImportProgress(String taskId) {
         ImportTaskVo task = IMPORT_TASKS.get(taskId);
@@ -54,7 +58,7 @@ public class StudentImportServiceImpl implements StudentImportService {
     @Async
     @Override
     public void studentImport(String taskId, List<String> lines, Long examId, String subjectCode, Integer yearConfig,
-                              Integer yearHalfConfig) {
+            Integer yearHalfConfig) {
         ImportTaskVo task = new ImportTaskVo();
         task.setTaskId(taskId);
         task.setProgress(0d);
@@ -104,6 +108,7 @@ public class StudentImportServiceImpl implements StudentImportService {
             task.setProgress(100d);
             long cost = (System.currentTimeMillis() - startTime) / 1000L;
             log.info("【考生导入】共{}条 已导入:{}条 已耗时:{}秒 进度:100% taskId:{}", total, finishCount, cost, taskId);
+            dataCacheService.loadCache();
         } catch (Exception e) {
             task.setStatus(AsyncTaskStatus.FAILED);
             task.setErrMsg(String.format("导入异常终止,已导入%s条,未导入%s条!", finishCount, total - finishCount));
@@ -130,7 +135,7 @@ public class StudentImportServiceImpl implements StudentImportService {
     }
 
     private void parseValues(List<String> lines, List<StudentImportInfo> list, Long examId, String subjectCodeConfig,
-                             Integer yearConfig, Integer yearHalfConfig) {
+            Integer yearConfig, Integer yearHalfConfig) {
         Set<String> subjectCodes = new HashSet<>();
         Set<String> examNumbers = new HashSet<>();
         Pattern examNumberPattern = Pattern.compile("^[0-9]{15}$");

+ 3 - 2
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -67,6 +67,7 @@ import cn.com.qmth.scancentral.bean.omredit.OmrFieldEditDomain;
 import cn.com.qmth.scancentral.bean.refix.AnswerRefixDomain;
 import cn.com.qmth.scancentral.bean.refix.PageRefixDomain;
 import cn.com.qmth.scancentral.bean.refix.PaperRefixDomain;
+import cn.com.qmth.scancentral.bean.student.ExamProvinceInfo;
 import cn.com.qmth.scancentral.config.SysProperty;
 import cn.com.qmth.scancentral.consumer.BreachImportConsumer;
 import cn.com.qmth.scancentral.consumer.CustStatusImportConsumer;
@@ -2619,8 +2620,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     @Override
-    public List<String> listProvinceByExamId(Long examId) {
-        return this.baseMapper.listProvinceByExamId(examId);
+    public List<ExamProvinceInfo> listProvince() {
+        return this.baseMapper.listProvince();
     }
 
     @Override

+ 3 - 3
src/main/java/cn/com/qmth/scancentral/service/impl/ToolExportServiceImpl.java

@@ -200,6 +200,9 @@ public class ToolExportServiceImpl implements ToolExportService {
                     throw new StatusException("文件拷贝出错", e);
                 }
             }
+            if (targetSliceFile.length() < 3 * 1024) {
+                throw new StatusException("文件大小有误");
+            }
         }
     }
 
@@ -283,9 +286,6 @@ public class ToolExportServiceImpl implements ToolExportService {
             } catch (Exception e) {
                 throw new StatusException("文件拷贝出错", e);
             }
-            if (targetSliceFile.length() < 3 * 1024) {
-                throw new StatusException("文件大小有误");
-            }
         }
     }
 

+ 3 - 7
src/main/resources/mapper/StudentMapper.xml

@@ -1,16 +1,12 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="cn.com.qmth.scancentral.dao.StudentDao">
-    <select id="listProvinceByExamId" resultType="string">
+    <select id="listProvince" resultType="cn.com.qmth.scancentral.bean.student.ExamProvinceInfo">
         SELECT
-        distinct s.province 
+        s.exam_id, s.province 
         FROM
         sc_student s
-        <where>
-            s.exam_id = #{examId}
-            and s.province is not null
-            and s.province !=''
-        </where>
+        group by s.exam_id, s.province
     </select>
     <select id="listExamRoomByExamId" resultType="string">
         SELECT