haogh пре 1 месец
родитељ
комит
2d7d1ff12f

+ 5 - 0
src/main/java/com/qmth/exam/reserve/dao/TimePeriodExamRoomDao.java

@@ -1,8 +1,13 @@
 package com.qmth.exam.reserve.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.exam.reserve.entity.ExamRoomEntity;
 import com.qmth.exam.reserve.entity.TimePeriodExamRoomEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface TimePeriodExamRoomDao extends BaseMapper<TimePeriodExamRoomEntity> {
 
+    List<ExamRoomEntity> listExamRoom(@Param("examSiteId") Long examSiteId, @Param("timePeriodId") Long timePeriodId, @Param("enable") Boolean enable);
 }

+ 3 - 0
src/main/java/com/qmth/exam/reserve/service/TimePeriodExamRoomService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.exam.reserve.bean.login.LoginUser;
 import com.qmth.exam.reserve.bean.timeperiod.TimePeriodExamSiteReq;
 import com.qmth.exam.reserve.bean.timeperiod.TimePeriodExamSiteVo;
+import com.qmth.exam.reserve.entity.ExamRoomEntity;
 import com.qmth.exam.reserve.entity.TimePeriodExamRoomEntity;
 
 import java.util.List;
@@ -13,4 +14,6 @@ public interface TimePeriodExamRoomService extends IService<TimePeriodExamRoomEn
     List<TimePeriodExamSiteVo> ListDetail(LoginUser loginUser, Long examRoomId);
 
     void save(Long userId, Long examRoomId, List<TimePeriodExamSiteReq> timePeriodExamSiteList);
+
+    List<ExamRoomEntity> listExamRoom(Long examSiteId, Long timePeriodId, Boolean enable);
 }

+ 52 - 5
src/main/java/com/qmth/exam/reserve/service/impl/StudentApplyServiceImpl.java

@@ -125,6 +125,9 @@ public class StudentApplyServiceImpl extends ServiceImpl<StudentApplyDao, Studen
     @Autowired
     private OrgCacheService orgCacheService;
 
+    @Autowired
+    private TimePeriodExamRoomService timePeriodExamRoomService;
+
     @Override
     public PageResult<StudentApplyVO> page(StudentApplyReq req) {
         ApplyTaskEntity task = getApplyTask();
@@ -336,6 +339,12 @@ public class StudentApplyServiceImpl extends ServiceImpl<StudentApplyDao, Studen
                     msg.append(" 证件号码不能为空");
                 }
 
+                //有空行跳出循序-结束执行
+                if (StringUtils.isBlank(studentCode) && StringUtils.isBlank(name) && StringUtils.isBlank(identityNumber)) {
+                    failRecords.add(newError(i + 1, "该行数据为空,请检查"));
+                    break;
+                }
+
                 //判断考生是否存在
                 StudentEntity studentEntity = checkStudent(studentCode, name, identityNumber, task.getTaskId());
                 if (studentEntity == null) {
@@ -905,13 +914,13 @@ public class StudentApplyServiceImpl extends ServiceImpl<StudentApplyDao, Studen
                 Map<Long, List<StudentApplyEntity>> timeLayoutStudentMap = studentApplyList.stream()
                         .collect(Collectors.groupingBy(StudentApplyEntity::getTimePeriodId));
 
-                List<ExamRoomEntity> roomList = listExamRoom(examSiteId);
+                /*List<ExamRoomEntity> roomList = listExamRoom(examSiteId);
                 if (roomList.isEmpty()) {
                     log.warn("{}:未设置考场", examSiteId);
                     return;
-                }
+                }*/
                 ExamSiteEntity examSite = examSiteService.getById(examSiteId);
-                layoutStudentByTimePeriod(applyTask.getTaskId(), examSite, roomList, timeLayoutStudentMap);
+                layoutStudentByTimePeriod(applyTask.getTaskId(), examSite, timeLayoutStudentMap);
             }
         } catch (StatusException e) {
             log.error(e.getMessage());
@@ -928,15 +937,53 @@ public class StudentApplyServiceImpl extends ServiceImpl<StudentApplyDao, Studen
         }
     }
 
-    private void layoutStudentByTimePeriod(Long taskId, ExamSiteEntity examSite, List<ExamRoomEntity> roomList,
-            Map<Long, List<StudentApplyEntity>> timeLayoutStudentMap) {
+    private void layoutStudentByTimePeriod(Long taskId, ExamSiteEntity examSite,Map<Long, List<StudentApplyEntity>> timeLayoutStudentMap) {
+        List<ExamRoomEntity> roomList;
         for (Long timePeriodId : timeLayoutStudentMap.keySet()) {
+            // 根据考点和时段查询可用考场
+            roomList = listAvailableExamRoom(examSite.getId(), timePeriodId);
+            if (CollectionUtils.isEmpty(roomList)) {
+                log.error("[autoLayout]考点{}:时段{}:未有可用考场", examSite.getId(), timePeriodId);
+                continue;
+            }
+
             List<StudentApplyEntity> studentApplyList = timeLayoutStudentMap.get(timePeriodId);
             TimePeriodEntity timePeriod = timePeriodService.getById(timePeriodId);
             layoutStudentToRoom(taskId, examSite, roomList, studentApplyList, timePeriod);
         }
     }
 
+    /*
+       查询可用考场列表
+     */
+    private List<ExamRoomEntity> listAvailableExamRoom(Long examSiteId, Long timePeriodId) {
+        // 获取所有考场列表
+        List<ExamRoomEntity> examRoomList = listExamRoom(examSiteId);
+        if (examRoomList == null || examRoomList.isEmpty()) {
+            return Collections.emptyList(); // 如果没有考场,直接返回空列表
+        }
+
+        // 获取禁用的考场列表
+        List<ExamRoomEntity> disableExamRoomList = timePeriodExamRoomService.listExamRoom(examSiteId, timePeriodId, false);
+        if (CollectionUtils.isEmpty(disableExamRoomList)) {
+            return examRoomList; // 如果没有禁用考场,直接返回所有考场
+        }
+
+        // 提取禁用考场的 ID 到 Set中
+        Set<Long> disableRoomIdSet = disableExamRoomList.stream()
+                .filter(Objects::nonNull)
+                .map(ExamRoomEntity::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 过滤掉禁用的考场
+        return examRoomList.stream()
+                .filter(room -> room != null && room.getId() != null && !disableRoomIdSet.contains(room.getId()))
+                .collect(Collectors.toList());
+    }
+
+
+
     private void layoutStudentToRoom(Long taskId, ExamSiteEntity examSite, List<ExamRoomEntity> roomList,
             List<StudentApplyEntity> studentApplyList, TimePeriodEntity timePeriod) {
         Integer timePeriodOrder = getTimePeriodOrder(taskId, timePeriod);

+ 5 - 0
src/main/java/com/qmth/exam/reserve/service/impl/TimePeriodExamRoomServiceImpl.java

@@ -249,6 +249,11 @@ public class TimePeriodExamRoomServiceImpl extends ServiceImpl<TimePeriodExamRoo
         }
     }
 
+    @Override
+    public List<ExamRoomEntity> listExamRoom(Long examSiteId, Long timePeriodId, Boolean enable) {
+        return getBaseMapper().listExamRoom(examSiteId, timePeriodId, enable);
+    }
+
     // 校验是否可编辑
     private void canEdit(List<Long> timePeriodExamRoomList, CurrentApplyTaskVO curApplyTask) {
         if (CollectionUtils.isNotEmpty(timePeriodExamRoomList)) {

+ 19 - 0
src/main/resources/mapper/TimePeriodExamRoomMapper.xml

@@ -0,0 +1,19 @@
+<?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="com.qmth.exam.reserve.dao.TimePeriodExamRoomDao">
+
+    <select id="listExamRoom" resultType="com.qmth.exam.reserve.entity.ExamRoomEntity">
+        SELECT
+            er.*
+        FROM
+            t_time_period_exam_room tper,
+            t_exam_site es,
+            t_exam_room er
+        WHERE
+            tper.exam_room_id = er.id
+          AND er.exam_site_id = es.id
+          AND tper.ENABLE = #{enable}
+          AND tper.time_period_id = #{timePeriodId}
+          AND es.id = #{examSiteId}
+    </select>
+</mapper>