Browse Source

省份校区等缓存

xiatian 8 months ago
parent
commit
f404ec9af7

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

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

+ 5 - 3
src/main/java/cn/com/qmth/scancentral/controller/admin/ExamWorkController.java

@@ -34,8 +34,10 @@ 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) {
@@ -57,13 +59,13 @@ public class ExamWorkController {
     @ApiOperation(value = "获取所有校区")
     @RequestMapping(value = "/campus/list", method = RequestMethod.POST)
     public List<CampusVo> campusList(@RequestParam Long examId) {
-        return studentService.listCampusByExamId(examId);
+        return dataCacheService.listCampusByExamId(examId);
     }
 
     @ApiOperation(value = "获取所有考点")
     @RequestMapping(value = "/exam-site/list", method = RequestMethod.POST)
     public List<ExamSiteVo> siteList(@RequestParam Long examId) {
-        return studentService.listSiteByExamId(examId);
+        return dataCacheService.listExamSiteByExamId(examId);
     }
 
     @ApiOperation(value = "获取所有省份")
@@ -75,6 +77,6 @@ public class ExamWorkController {
     @ApiOperation(value = "获取所有考场号")
     @RequestMapping(value = "exam-room/list", method = RequestMethod.POST)
     public List<String> examRoomList(@RequestParam Long examId) {
-        return studentService.listExamRoomByExamId(examId);
+        return dataCacheService.listExamRoomByExamId(examId);
     }
 }

+ 5 - 4
src/main/java/cn/com/qmth/scancentral/dao/StudentDao.java

@@ -12,6 +12,7 @@ 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.bean.student.ExamRoomInfo;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryParam;
@@ -29,9 +30,9 @@ import cn.com.qmth.scancentral.vo.subject.SubjectScanProgressVo;
 
 public interface StudentDao extends BaseMapper<StudentEntity> {
 
-    List<CampusVo> listCampusByExamId(@Param("examId") Long examId);
+    List<CampusVo> listCampus();
 
-    List<ExamSiteVo> listSiteByExamId(@Param("examId") Long examId);
+    List<ExamSiteVo> listExamSite();
 
     AbsentInfoVo absentInfo(@Param("examId") Long examId, @Param("groupType") String groupType,
             @Param("groupName") String groupName);
@@ -113,8 +114,8 @@ public interface StudentDao extends BaseMapper<StudentEntity> {
 
     StudentAnswerVo getStudentVo(@Param("studentId") Long studentId);
 
-    List<String> listExamRoomByExamId(@Param("examId") Long examId);
-
     List<ExamProvinceInfo> listProvince();
 
+    List<ExamRoomInfo> listExamRoom();
+
 }

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

@@ -2,10 +2,19 @@ package cn.com.qmth.scancentral.service;
 
 import java.util.List;
 
+import cn.com.qmth.scancentral.vo.CampusVo;
+import cn.com.qmth.scancentral.vo.ExamSiteVo;
+
 public interface DataCacheService {
 
     void loadCache();
 
     List<String> listProvinceByExamId(Long examId);
 
+    List<ExamSiteVo> listExamSiteByExamId(Long examId);
+
+    List<CampusVo> listCampusByExamId(Long examId);
+
+    List<String> listExamRoomByExamId(Long examId);
+
 }

+ 6 - 5
src/main/java/cn/com/qmth/scancentral/service/StudentService.java

@@ -20,6 +20,7 @@ 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.bean.student.ExamRoomInfo;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.entity.StudentPaperEntity;
 import cn.com.qmth.scancentral.enums.ExamStatus;
@@ -79,10 +80,6 @@ public interface StudentService extends IService<StudentEntity> {
 
     PaperDeleteVo paperDelete(User user, PageDeleteDomain domain);
 
-    List<CampusVo> listCampusByExamId(Long examId);
-
-    List<ExamSiteVo> listSiteByExamId(Long examId);
-
     StudentVo findOne(StudentQuery query);
 
     int getCountByExam(Long examId);
@@ -244,5 +241,9 @@ public interface StudentService extends IService<StudentEntity> {
 
     List<ExamProvinceInfo> listProvince();
 
-    List<String> listExamRoomByExamId(Long examId);
+    List<ExamSiteVo> listExamSite();
+
+    List<CampusVo> listCampus();
+
+    List<ExamRoomInfo> listExamRoom();
 }

+ 131 - 4
src/main/java/cn/com/qmth/scancentral/service/impl/DataCacheServiceImpl.java

@@ -2,6 +2,7 @@ package cn.com.qmth.scancentral.service.impl;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -17,8 +18,11 @@ 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.bean.student.ExamRoomInfo;
 import cn.com.qmth.scancentral.service.DataCacheService;
 import cn.com.qmth.scancentral.service.StudentService;
+import cn.com.qmth.scancentral.vo.CampusVo;
+import cn.com.qmth.scancentral.vo.ExamSiteVo;
 
 @Service
 public class DataCacheServiceImpl implements DataCacheService {
@@ -29,20 +33,35 @@ public class DataCacheServiceImpl implements DataCacheService {
 
     private Lock provinceLock = new ReentrantLock();
 
+    private Map<Long, Set<ExamSiteVo>> examSiteCache = new ConcurrentHashMap<>();
+
+    private Lock examSiteLock = new ReentrantLock();
+
+    private Map<Long, Set<CampusVo>> campusCache = new ConcurrentHashMap<>();
+
+    private Lock campusLock = new ReentrantLock();
+
+    private Map<Long, Set<String>> examRoomCache = new ConcurrentHashMap<>();
+
+    private Lock examRoomLock = new ReentrantLock();
+
     @Autowired
     private StudentService studentService;
 
     @Override
     public void loadCache() {
         loadProvince();
+        loadExamSite();
+        loadCampus();
+        loadExamRoom();
     }
 
     private void loadProvince() {
         provinceCache.clear();
-        List<ExamProvinceInfo> provinces = studentService.listProvince();
-        for (ExamProvinceInfo province : provinces) {
-            if (StringUtils.isNotBlank(province.getProvince())) {
-                addProvinceCache(province.getExamId(), province.getProvince());
+        List<ExamProvinceInfo> list = studentService.listProvince();
+        for (ExamProvinceInfo info : list) {
+            if (StringUtils.isNotBlank(info.getProvince())) {
+                addProvinceCache(info.getExamId(), info.getProvince());
             }
         }
     }
@@ -73,4 +92,112 @@ public class DataCacheServiceImpl implements DataCacheService {
         return ret;
     }
 
+    private void loadExamSite() {
+        examSiteCache.clear();
+        List<ExamSiteVo> list = studentService.listExamSite();
+        for (ExamSiteVo info : list) {
+            if (StringUtils.isNotBlank(info.getCode())) {
+                addExamSiteCache(info.getExamId(), info);
+            }
+        }
+    }
+
+    private void addExamSiteCache(Long examId, ExamSiteVo info) {
+        examSiteLock.lock();
+        try {
+            Set<ExamSiteVo> cache = examSiteCache.get(examId);
+            if (cache == null) {
+                cache = new HashSet<>();
+                examSiteCache.put(examId, cache);
+            }
+            cache.add(info);
+        } finally {
+            examSiteLock.unlock();
+        }
+    }
+
+    @Override
+    public List<ExamSiteVo> listExamSiteByExamId(Long examId) {
+        Set<ExamSiteVo> cache = examSiteCache.get(examId);
+        List<ExamSiteVo> ret = new ArrayList<>();
+        if (cache == null) {
+            return ret;
+        }
+        ret.addAll(cache);
+        ret.sort(Comparator.comparing(ExamSiteVo::getCode));
+        return ret;
+    }
+
+    private void loadCampus() {
+        campusCache.clear();
+        List<CampusVo> list = studentService.listCampus();
+        for (CampusVo info : list) {
+            if (StringUtils.isNotBlank(info.getCode())) {
+                addCampusCache(info.getExamId(), info);
+            }
+        }
+    }
+
+    private void addCampusCache(Long examId, CampusVo info) {
+        campusLock.lock();
+        try {
+            Set<CampusVo> cache = campusCache.get(examId);
+            if (cache == null) {
+                cache = new HashSet<>();
+                campusCache.put(examId, cache);
+            }
+            cache.add(info);
+        } finally {
+            campusLock.unlock();
+        }
+    }
+
+    @Override
+    public List<CampusVo> listCampusByExamId(Long examId) {
+        Set<CampusVo> cache = campusCache.get(examId);
+        List<CampusVo> ret = new ArrayList<>();
+        if (cache == null) {
+            return ret;
+        }
+        ret.addAll(cache);
+        ret.sort(Comparator.comparing(CampusVo::getCode));
+        return ret;
+    }
+
+    private void loadExamRoom() {
+        examRoomCache.clear();
+        List<ExamRoomInfo> list = studentService.listExamRoom();
+        for (ExamRoomInfo info : list) {
+            if (StringUtils.isNotBlank(info.getExamRoom())) {
+                addExamRoomCache(info.getExamId(), info.getExamRoom());
+            }
+        }
+    }
+
+    private void addExamRoomCache(Long examId, String examRoom) {
+        examRoomLock.lock();
+        try {
+            Set<String> cache = examRoomCache.get(examId);
+            if (cache == null) {
+                cache = new HashSet<>();
+                examRoomCache.put(examId, cache);
+            }
+            cache.add(examRoom);
+        } finally {
+            examRoomLock.unlock();
+        }
+    }
+
+    @Override
+    public List<String> listExamRoomByExamId(Long examId) {
+        Set<String> cache = examRoomCache.get(examId);
+        List<String> ret = new ArrayList<>();
+        if (cache == null) {
+            return ret;
+        }
+        ret.addAll(cache);
+        Collections.sort(ret);
+        return ret;
+    }
+
 }

+ 1 - 1
src/main/java/cn/com/qmth/scancentral/service/impl/SessionServiceImpl.java

@@ -22,7 +22,7 @@ public class SessionServiceImpl implements SessionService {
 
     @Override
     public Long updateUserSession(User user) {
-        if (user.getSessionId() == null) {
+        if (user == null || user.getSessionId() == null) {
             return null;
         }
         user.setActiveTime(new Date().getTime());

+ 7 - 6
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -68,6 +68,7 @@ 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.bean.student.ExamRoomInfo;
 import cn.com.qmth.scancentral.config.SysProperty;
 import cn.com.qmth.scancentral.consumer.BreachImportConsumer;
 import cn.com.qmth.scancentral.consumer.CustStatusImportConsumer;
@@ -369,8 +370,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     @Override
-    public List<CampusVo> listCampusByExamId(Long examId) {
-        return baseMapper.listCampusByExamId(examId);
+    public List<CampusVo> listCampus() {
+        return baseMapper.listCampus();
     }
 
     @Override
@@ -385,8 +386,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     @Override
-    public List<ExamSiteVo> listSiteByExamId(Long examId) {
-        return baseMapper.listSiteByExamId(examId);
+    public List<ExamSiteVo> listExamSite() {
+        return baseMapper.listExamSite();
     }
 
     @Override
@@ -2625,8 +2626,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     @Override
-    public List<String> listExamRoomByExamId(Long examId) {
-        return this.baseMapper.listExamRoomByExamId(examId);
+    public List<ExamRoomInfo> listExamRoom() {
+        return this.baseMapper.listExamRoom();
     }
 
 }

+ 10 - 0
src/main/java/cn/com/qmth/scancentral/vo/CampusVo.java

@@ -2,6 +2,8 @@ package cn.com.qmth.scancentral.vo;
 
 public class CampusVo {
 
+    private Long examId;
+
     private String name;
 
     private String code;
@@ -22,4 +24,12 @@ public class CampusVo {
         this.code = code;
     }
 
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
 }

+ 29 - 0
src/main/java/cn/com/qmth/scancentral/vo/ExamSiteVo.java

@@ -1,7 +1,11 @@
 package cn.com.qmth.scancentral.vo;
 
+import java.util.Objects;
+
 public class ExamSiteVo {
 
+    private Long examId;
+
     private String name;
 
     private String code;
@@ -22,4 +26,29 @@ public class ExamSiteVo {
         this.code = code;
     }
 
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(code, examId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ExamSiteVo other = (ExamSiteVo) obj;
+        return Objects.equals(code, other.code) && Objects.equals(examId, other.examId);
+    }
+
 }

+ 9 - 21
src/main/resources/mapper/StudentMapper.xml

@@ -8,43 +8,31 @@
         sc_student s
         group by s.exam_id, s.province
     </select>
-    <select id="listExamRoomByExamId" resultType="string">
+    <select id="listExamRoom" resultType="cn.com.qmth.scancentral.bean.student.ExamRoomInfo">
         SELECT
-        distinct s.exam_room 
+        s.exam_id, s.exam_room 
         FROM
         sc_student s
-        <where>
-            s.exam_id = #{examId}
-            and s.exam_room is not null
-            and s.exam_room !=''
-        </where>
+        group by s.exam_id, s.exam_room 
     </select>
-    <select id="listCampusByExamId" resultType="cn.com.qmth.scancentral.vo.CampusVo">
+    <select id="listCampus" resultType="cn.com.qmth.scancentral.vo.CampusVo">
         SELECT
+        s.exam_id,
         s.campus_name name,
         s.campus_code code
         FROM
         sc_student s
-        <where>
-            s.exam_id = #{examId}
-            and s.campus_code is not null
-            and s.campus_code !=''
-        </where>
-        group by s.campus_code,s.campus_name
+        group by s.exam_id,s.campus_code
     </select>
 
-    <select id="listSiteByExamId" resultType="cn.com.qmth.scancentral.vo.ExamSiteVo">
+    <select id="listExamSite" resultType="cn.com.qmth.scancentral.vo.ExamSiteVo">
         SELECT
+        s.exam_id,
         s.exam_site code,
         s.exam_site_name name
         FROM
         sc_student s
-        <where>
-            s.exam_id = #{examId}
-            and s.exam_site is not null
-            and s.exam_site !=''
-        </where>
-        group by s.exam_site,s.exam_site_name
+        group by  s.exam_id,s.exam_site
     </select>
 
     <select id="absentInfo"