Эх сурвалжийг харах

优化 getExamStudentPage

deason 4 жил өмнө
parent
commit
8b96ebec75

+ 86 - 59
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamStudentController.java

@@ -15,11 +15,9 @@ import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
 import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
 import cn.com.qmth.examcloud.core.basic.api.bean.StudentBean;
-import cn.com.qmth.examcloud.core.basic.api.request.GetOrgReq;
-import cn.com.qmth.examcloud.core.basic.api.request.GetStudentReq;
+import cn.com.qmth.examcloud.core.basic.api.request.GetOrgMapsReq;
+import cn.com.qmth.examcloud.core.basic.api.request.GetStudentMapsReq;
 import cn.com.qmth.examcloud.core.basic.api.request.SaveStudentReq;
-import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
-import cn.com.qmth.examcloud.core.basic.api.response.GetStudentResp;
 import cn.com.qmth.examcloud.core.basic.api.response.SaveStudentResp;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.ExamStudentDomain;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamRepo;
@@ -28,6 +26,8 @@ import cn.com.qmth.examcloud.core.examwork.dao.ExamStudentRepo;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamEntity;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStageEntity;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudentEntity;
+import cn.com.qmth.examcloud.core.examwork.service.ExamService;
+import cn.com.qmth.examcloud.core.examwork.service.ExamStageService;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentService;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
 import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordCloudService;
@@ -56,10 +56,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.persistence.criteria.Predicate;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -80,6 +77,9 @@ public class ExamStudentController extends ControllerSupport {
     @Autowired
     ExamRepo examRepo;
 
+    @Autowired
+    ExamService examService;
+
     @Autowired
     StudentCloudService studentCloudService;
 
@@ -95,6 +95,9 @@ public class ExamStudentController extends ControllerSupport {
     @Autowired
     ExamStageRepo examStageRepo;
 
+    @Autowired
+    ExamStageService examStageService;
+
     /**
      * 方法注释
      *
@@ -267,88 +270,112 @@ public class ExamStudentController extends ControllerSupport {
         PageRequest pageable = PageRequest.of(curPage, pageSize, Sort.by(Direction.DESC, "id", "updateTime"));
         Page<ExamStudentEntity> page = examStudentRepo.findAll(specification, pageable);
 
-        List<ExamStudentDomain> examStudents = Lists.newArrayList();
-        for (ExamStudentEntity cur : page) {
-            ExamEntity exam = GlobalHelper.getEntity(examRepo, cur.getExamId(), ExamEntity.class);
-
-            GetOrgReq getOrgReq = new GetOrgReq();
-            getOrgReq.setOrgId(cur.getOrgId());
-            GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
-            OrgBean org = getOrgResp.getOrg();
-
-            GetStudentReq getStudentReq = new GetStudentReq();
-            getStudentReq.setRootOrgId(accessUser.getRootOrgId());
-            getStudentReq.setIdentityNumber(cur.getIdentityNumber());
-            GetStudentResp getStudentResp = studentCloudService.getStudent(getStudentReq);
-            StudentBean studentBean = getStudentResp.getStudentInfo();
-
-            Boolean started = null;
-            if (null != withStarted && withStarted) {
-                CheckExamIsStartedReq checkExamIsStartedReq = new CheckExamIsStartedReq();
-                checkExamIsStartedReq.setExamId(exam.getId());
-                checkExamIsStartedReq.setCourseId(cur.getCourseId());
-                checkExamIsStartedReq.setStudentId(studentBean.getId());
-                checkExamIsStartedReq.setExamId(exam.getId());
-                try {
-                    CheckExamIsStartedResp checkExamIsStartedResp = examRecordCloudService
-                            .checkExamIsStarted(checkExamIsStartedReq);
-                    started = checkExamIsStartedResp.getIsStarted();
-                } catch (Exception e) {
-                    LOGGER.error("fail to invoke remote method: checkExamIsStarted()", e);
-                }
+        if (!page.hasContent()) {
+            return new PageInfo(Page.empty());
+        }
+
+        Set<Long> orgIds = new HashSet<>(), examIds = new HashSet<>(), examStageIds = new HashSet<>(), studentIds = new HashSet<>();
+        for (ExamStudentEntity entity : page.getContent()) {
+            orgIds.add(entity.getOrgId());
+            examIds.add(entity.getExamId());
+            studentIds.add(entity.getStudentId());
+            if (entity.getExamStageId() != null) {
+                examStageIds.add(entity.getExamStageId());
             }
+        }
+
+        // 获取考试信息列表
+        Map<Long, ExamEntity> examMaps = examService.getExamMapsByIds(examIds);
+
+        // 获取场次信息列表
+        Map<Long, ExamStageEntity> examStageMaps = examStageService.getExamStageMapsByIds(examStageIds);
+
+        // 获取机构信息列表
+        GetOrgMapsReq orgMapsReq = new GetOrgMapsReq();
+        orgMapsReq.setOrgIds(orgIds);
+        Map<Long, OrgBean> orgMaps = orgCloudService.getOrgMaps(orgMapsReq).getOrgMaps();
+
+        // 获取学生信息列表
+        GetStudentMapsReq studentMapsReq = new GetStudentMapsReq();
+        studentMapsReq.setStudentIds(studentIds);
+        Map<Long, StudentBean> studentMaps = studentCloudService.getStudentMaps(studentMapsReq).getStudentMaps();
+
+        List<ExamStudentDomain> examStudents = new ArrayList<>();
+        for (ExamStudentEntity cur : page.getContent()) {
+            ExamEntity exam = examMaps.get(cur.getExamId());
+            OrgBean org = orgMaps.get(cur.getOrgId());
+            StudentBean student = studentMaps.get(cur.getStudentId());
 
             ExamStudentDomain bean = new ExamStudentDomain();
             bean.setRootOrgId(cur.getRootOrgId());
             bean.setId(cur.getId());
-            bean.setExamId(exam.getId());
-            bean.setExamName(exam.getName());
             bean.setStudentId(cur.getStudentId());
             bean.setStudentName(cur.getName());
             bean.setStudentCode(cur.getStudentCode());
             bean.setIdentityNumber(cur.getIdentityNumber());
+
+            bean.setPhone(student.getPhoneNumber());
+            bean.setPhotoPath(student.getPhotoPath());
+
+            bean.setOrgId(cur.getOrgId());
+            bean.setOrgCode(org.getCode());
+            bean.setOrgName(org.getName());
+
+            bean.setExamId(cur.getExamId());
+            bean.setExamName(exam.getName());
+            bean.setExamType(exam.getExamType().name());
+            bean.setLocked(exam.getExamStudentLocked() == null ? false : exam.getExamStudentLocked());
+
             bean.setCourseId(cur.getCourseId());
             bean.setCourseCode(cur.getCourseCode());
             bean.setCourseName(cur.getCourseName());
             bean.setCourseLevel(cur.getCourseLevel());
-            bean.setInfoCollector(cur.getInfoCollector());
-            bean.setOrgId(cur.getOrgId());
-            bean.setOrgCode(org.getCode());
-            bean.setOrgName(org.getName());
+
             bean.setPaperType(cur.getPaperType());
-            bean.setPhone(studentBean.getPhoneNumber());
-            bean.setGrade(cur.getGrade());
             bean.setSpecialtyName(cur.getSpecialtyName());
+            bean.setGrade(cur.getGrade());
             bean.setExamSite(cur.getExamSite());
-            bean.setExamType(exam.getExamType().name());
+            bean.setInfoCollector(cur.getInfoCollector());
             bean.setUpdateTime(cur.getUpdateTime());
             bean.setEnable(cur.getEnable());
-            bean.setLocked(null == exam.getExamStudentLocked() ? false : exam.getExamStudentLocked());
-            bean.setStarted(started);
-            bean.setPhotoPath(studentBean.getPhotoPath());
 
             bean.setExt1(cur.getExt1());
-            bean.setExt2(IdentityNumberHelper.conceal(cur.getRootOrgId(), cur.getIdentityNumber()));//特殊处理:把ext2
-            // 当作隐私模式下的身份证号
+            // 特殊处理:把ext2当作隐私模式下的身份证号
+            bean.setExt2(IdentityNumberHelper.conceal(cur.getRootOrgId(), cur.getIdentityNumber()));
             bean.setExt3(cur.getExt3());
             bean.setExt4(cur.getExt4());
             bean.setExt5(cur.getExt5());
-            if (null != cur.getExamStageId()) {
-                ExamStageEntity examStageEntity = GlobalHelper.getEntity(examStageRepo, cur.getExamStageId(), ExamStageEntity.class);
-                if (null == examStageEntity) {
+
+            if (cur.getExamStageId() != null) {
+                ExamStageEntity examStage = examStageMaps.get(cur.getExamStageId());
+                if (examStage == null) {
                     throw new StatusException("005001", "场次id不正确");
                 }
 
-                if (examStageEntity.getEnable() == false) {
+                if (!examStage.getEnable()) {
                     throw new StatusException("005002", "场次被禁用,请重新选择场次");
                 }
 
-                bean.setExamStageOrder(examStageEntity.getStageOrder());
-                bean.setStartTime(examStageEntity.getStartTime());
-                bean.setEndTime(examStageEntity.getEndTime());
+                bean.setExamStageId(cur.getExamStageId());
+                bean.setExamStageOrder(examStage.getStageOrder());
+                bean.setStartTime(examStage.getStartTime());
+                bean.setEndTime(examStage.getEndTime());
+            }
+
+            if (withStarted != null && withStarted) {
+                CheckExamIsStartedReq checkReq = new CheckExamIsStartedReq();
+                checkReq.setExamId(cur.getExamId());
+                checkReq.setCourseId(cur.getCourseId());
+                checkReq.setStudentId(cur.getStudentId());
+                try {
+                    // todo 优化
+                    CheckExamIsStartedResp checkResp = examRecordCloudService.checkExamIsStarted(checkReq);
+                    bean.setStarted(checkResp.getIsStarted());
+                } catch (Exception e) {
+                    LOGGER.warn("checkExamIsStarted fail..." + e.getMessage(), e);
+                }
             }
 
-            bean.setExamStageId(cur.getExamStageId());
             examStudents.add(bean);
         }