Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/edu-saas

yonge 5 years ago
parent
commit
29fa2f674f
31 changed files with 382 additions and 42 deletions
  1. 8 0
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysUserService.java
  2. 9 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/EmployeeDao.java
  3. 9 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamOrganizationRelationDao.java
  4. 9 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRegistrationDao.java
  5. 20 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java
  6. 11 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java
  7. 9 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/StudentExamResultDao.java
  8. 11 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/ExamCertificationDto.java
  9. 11 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/entity/Employee.java
  10. 11 2
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/ExamRoomStudentRelationService.java
  11. 7 0
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/OrganizationService.java
  12. 0 3
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/EmployeeServiceImpl.java
  13. 2 9
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamOrganizationRelationServiceImpl.java
  14. 6 5
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java
  15. 34 6
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java
  16. 19 7
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java
  17. 4 1
      edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java
  18. 12 1
      edu-user/edu-user-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  19. 2 1
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamCertificationMapper.xml
  20. 16 4
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamOrganizationRelationMapper.xml
  21. 10 0
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRegistrationMapper.xml
  22. 14 0
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomMapper.xml
  23. 14 0
      edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml
  24. 5 0
      edu-user/edu-user-biz/src/main/resources/config/mybatis/StudentExamResultMapper.xml
  25. 0 1
      edu-user/edu-user-client-api/src/main/java/com/keao/edu/user/api/entity/ExamRoomStudentRelation.java
  26. 7 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamOrganizationRelationController.java
  27. 51 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExcelInController.java
  28. 55 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExportController.java
  29. 8 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/OrganizationController.java
  30. 6 0
      edu-user/edu-user-server/src/main/resources/columnMapper.ini
  31. 2 2
      edu-util/src/main/java/com/keao/edu/util/excel/POIUtil.java

+ 8 - 0
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysUserService.java

@@ -118,4 +118,12 @@ public interface SysUserService extends BaseService<Integer, SysUser> {
 	 * @return
 	 */
     Integer queryUserOrganId(String clientId, Integer userId);
+
+	/**
+	 * 获取用户organId
+	 * @param clientId
+	 * @param userId
+	 * @return
+	 */
+    Integer queryEmployee(String clientId, Integer userId);
 }

+ 9 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/EmployeeDao.java

@@ -2,6 +2,15 @@ package com.keao.edu.user.dao;
 
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.user.entity.Employee;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface EmployeeDao extends BaseDAO<Integer, Employee> {
+
+    /**
+     * 批量锁定员工
+     * @param organIds
+     */
+    void batchLock(@Param("organIds") List<Integer> organIds);
 }

+ 9 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamOrganizationRelationDao.java

@@ -136,4 +136,13 @@ public interface ExamOrganizationRelationDao extends BaseDAO<Long, ExamOrganizat
      */
     List<ExamOrganizationRelation> getExamOrganizationRelations(@Param("examId") Long examId, @Param("organIds") List<Integer> organIds);
 
+    /**
+     * @describe 统计指定考级项目下已发送报名链接的分部数量
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @return int
+     */
+    int countExamIsSendUrlOrgans(@Param("examId") Long examId);
+
 }

+ 9 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRegistrationDao.java

@@ -168,4 +168,13 @@ public interface ExamRegistrationDao extends BaseDAO<Long, ExamRegistration> {
      * @return
      */
     StuRecordDetailDto getStuRecordDetail(Long examRegistrationId);
+
+    /**
+     * @describe 获取未排考的报名学员
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @return java.util.List<com.keao.edu.user.entity.ExamRegistration>
+     */
+    List<ExamRegistration> getNotInRoomStudents(@Param("examId") Long examId);
 }

+ 20 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java

@@ -69,6 +69,17 @@ public interface ExamRoomDao extends BaseDAO<Long, ExamRoom> {
     List<ExamRoom> getWithExam(@Param("organIds") List<Integer> organIds,
                                 @Param("examId") Long examId);
 
+    /**
+     * @describe 获取指定考级项目及声部下的考场
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @param subjectIds:
+     * @return java.util.List<com.keao.edu.user.api.entity.ExamRoom>
+     */
+    List<ExamRoom> getWithExamAndSubjects(@Param("examId") Long examId,
+                                          @Param("subjectIds") List<Integer> subjectIds);
+
     int updateSL(ExamRoom examRoom);
 
     ExamRoom lockRoom(@Param("examRoomId") Long examRoomId);
@@ -100,4 +111,13 @@ public interface ExamRoomDao extends BaseDAO<Long, ExamRoom> {
      * @return java.util.List<com.keao.edu.user.api.entity.ExamRoom>
      */
     List<ExamRoom> getHistoryOpenExamRoom();
+
+    /**
+     * @describe 统计已发送考场数量
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @return int
+     */
+    int countSendExamPlanRooms(@Param("examId") Long examId);
 }

+ 11 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java

@@ -176,4 +176,15 @@ public interface ExamRoomStudentRelationDao extends BaseDAO<Long, ExamRoomStuden
      * @return int
      */
     int countStudentsWithRoom(Long examRoomId);
+
+    /**
+     * @describe 根据考级项目及声部获取考场学员
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @param subjectIds:
+     * @return java.util.List<com.keao.edu.user.api.entity.ExamRoomStudentRelation>
+     */
+    List<ExamRoomStudentRelation> getWithExamAndRoomSubjects(@Param("examId") Long examId,
+                                                             @Param("subjectIds") List<Integer> subjectIds);
 }

+ 9 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dao/StudentExamResultDao.java

@@ -114,4 +114,13 @@ public interface StudentExamResultDao extends BaseDAO<Long, StudentExamResult> {
      * @return int
      */
     int countExamNoResultStudentNum(@Param("examId") Long examId);
+
+    /**
+     * @describe 统计考级项目结果记录数量
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examId:
+     * @return int
+     */
+    int countExamResultRecordNum(@Param("examId") Long examId);
 }

+ 11 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/dto/ExamCertificationDto.java

@@ -4,6 +4,9 @@ import io.swagger.annotations.ApiModelProperty;
 
 public class ExamCertificationDto{
 
+    @ApiModelProperty(value = "项目名")
+    private String baseExamName;
+
     @ApiModelProperty(value = "报名编号")
     private Long examRegistrationId;
 
@@ -43,6 +46,14 @@ public class ExamCertificationDto{
     @ApiModelProperty(value = "考试内容")
     private String songJson;
 
+    public String getBaseExamName() {
+        return baseExamName;
+    }
+
+    public void setBaseExamName(String baseExamName) {
+        this.baseExamName = baseExamName;
+    }
+
     public Integer getConfirmStatus() {
         return confirmStatus;
     }

+ 11 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/entity/Employee.java

@@ -69,6 +69,9 @@ public class Employee {
 	@ApiModelProperty(value = "是否删除0否1是",required = false)
 	private boolean delFlag;
 
+	@ApiModelProperty(value = "是否锁定0否1是",required = false)
+	private Integer lockFlag;
+
 	@ApiModelProperty(value = "员工信息",required = false)
 	private SysUser sysUser;
 
@@ -78,6 +81,14 @@ public class Employee {
 
 	private String employeeType;
 
+	public Integer getLockFlag() {
+		return lockFlag;
+	}
+
+	public void setLockFlag(Integer lockFlag) {
+		this.lockFlag = lockFlag;
+	}
+
 	public String getEmployeeType() {
 		return employeeType;
 	}

+ 11 - 2
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/ExamRoomStudentRelationService.java

@@ -3,10 +3,9 @@ package com.keao.edu.user.service;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.service.BaseService;
 import com.keao.edu.im.api.entity.PublishMessageDto;
-import com.keao.edu.user.dto.ExamRoomStudentRelationDto;
 import com.keao.edu.user.api.entity.ExamRoomStudentRelation;
+import com.keao.edu.user.dto.ExamRoomStudentRelationDto;
 import com.keao.edu.user.dto.NeedCheckingDetailDto;
-import com.keao.edu.user.dto.RoomStudentListDto;
 import com.keao.edu.user.dto.StuRecordDetailDto;
 import com.keao.edu.user.page.ExamRoomStudentRelationQueryInfo;
 
@@ -34,6 +33,16 @@ public interface ExamRoomStudentRelationService extends BaseService<Long, ExamRo
     void addStudentForRoom(Long examRoomId, String registIds, Integer organId);
 
     /**
+     * @describe 自动分配学员到考场
+     * @author Joburgess
+     * @date 2020.08.06
+     * @param examRoomId:
+     * @param selfOrganId:
+     * @return void
+     */
+    void autoSplitStudentToRoom(Long examRoomId, Integer selfOrganId);
+
+    /**
      * @describe 更换学员考场
      * @author Joburgess
      * @date 2020.07.08

+ 7 - 0
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/OrganizationService.java

@@ -58,4 +58,11 @@ public interface OrganizationService extends BaseService<Integer, Organization>
     Organization getOrganization(Integer id);
 
     Organization findByUserId(Integer id);
+
+    /**
+     * 启用/停用合作单位
+     * @param organId
+     * @param lockFlag
+     */
+    void lock(Integer organId, Integer lockFlag);
 }

+ 0 - 3
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/EmployeeServiceImpl.java

@@ -63,9 +63,6 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
 			}
 			Employee employee1 = employeeDao.get(user.getId());
 			if(employee1 == null){
-				if(StringUtils.isEmpty(user.getPassword())){
-					sysUser.setPassword(new BCryptPasswordEncoder().encode("123456"));
-				}
 				employee.setUserId(user.getId());
 				employee.setEmployeeType("EMPLOYEE");
 				employeeDao.insert(employee);

+ 2 - 9
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamOrganizationRelationServiceImpl.java

@@ -1,6 +1,5 @@
 package com.keao.edu.user.service.impl;
 
-import cfca.sadk.org.bouncycastle.apache.bzip2.BZip2Constants;
 import com.keao.edu.auth.api.client.SysUserFeignService;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
@@ -11,7 +10,6 @@ import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.service.SysMessageService;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
 import com.keao.edu.common.tenant.TenantContextHolder;
-import com.keao.edu.thirdparty.message.provider.JiguangPushPlugin;
 import com.keao.edu.thirdparty.message.provider.YimeiSmsPlugin;
 import com.keao.edu.user.dao.*;
 import com.keao.edu.user.dto.ExamOrganStatisticsDto;
@@ -27,7 +25,6 @@ import com.keao.edu.user.service.ShortUrlService;
 import com.keao.edu.user.service.SysConfigService;
 import com.keao.edu.util.collection.MapUtil;
 import com.keao.edu.util.date.DateUtil;
-import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -35,7 +32,6 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
@@ -204,7 +200,6 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			throw new BizException("合作单位信息错误");
 		}
 
-		Map<Integer, Organization> idOrganMap = organs.stream().collect(Collectors.toMap(Organization::getId, o -> o));
 		for (ExamOrganizationRelation og : organizationRelations) {
 			if(organIdsWithExam.contains(og.getOrganId())){
 				throw new BizException("合作单位冲突");
@@ -234,6 +229,7 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			og.setSelfPaymentAmount(BigDecimal.ZERO);
 		}
 		examOrganizationRelationDao.batchInsert(organizationRelations);
+		sendUrl(examOrganizationRelation.getId().intValue(), selfOrganId);
 	}
 
 	@Override
@@ -286,8 +282,6 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			throw new BizException("请指定考级项目");
 		}
 
-		List<Integer> childOrganIds = organizationService.getNextLevelOrganIds(selfOrganId, false);
-
 		ExamOrganStatisticsDto examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examId.longValue(), selfOrganId);
 		if(Objects.isNull(examOrganizationRelation)){
 			throw new BizException("数据异常");
@@ -296,8 +290,7 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			throw new BizException("发送失败");
 		}
 
-		List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getExamOrganizationRelations(examId.longValue(), childOrganIds);
-		Set<Integer> existOrganizationIds = examOrgans.stream().map(ExamOrganizationRelation::getOrganId).collect(Collectors.toSet());
+		List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getExamOrganizationRelations(examId.longValue(), null);
 
 		ExaminationBasic examinationBasic = examinationBasicDao.get(examId.longValue());
 		if(Objects.isNull(examinationBasic)){

+ 6 - 5
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java

@@ -28,7 +28,6 @@ import com.keao.edu.user.api.enums.ExamModeEnum;
 import com.keao.edu.user.dao.*;
 import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.*;
-import com.keao.edu.user.enums.ExamStatusEnum;
 import com.keao.edu.user.page.ExamRoomListQueryInfo;
 import com.keao.edu.user.page.ExamRoomQueryInfo;
 import com.keao.edu.user.service.*;
@@ -552,7 +551,9 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 						examName, examDayStr, examTimeStr, locationName, downloadUrl + student.getExamRegistrationId());
 			}
 
-			needUpdateExamRooms.add(new ExamRoom(examRoom.getId(), 1));
+            ExamRoom newExamRoom = new ExamRoom(examRoom.getId(), 1);
+			newExamRoom.setExamLocationId(examRoom.getExamLocationId());
+            needUpdateExamRooms.add(newExamRoom);
 
 			if(!teacherExamRoomsMap.containsKey(examRoom.getMainTeacherUserId())){
 				teacherExamRoomsMap.put(examRoom.getMainTeacherUserId(), new ArrayList<>());
@@ -572,8 +573,8 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		Map<Integer, String> idTeacherPhoneMap = this.getMap("sys_user", "id_", "phone_", new ArrayList(teacherExamRoomsMap.keySet()), Integer.class, String.class);
 		for (Map.Entry<Integer, List<ExamRoom>> teacherRoomEntry : teacherExamRoomsMap.entrySet()) {
 			String teacherPhone = idTeacherPhoneMap.get(teacherRoomEntry.getKey());
-			Date examStartTime = teacherRoomEntry.getValue().stream().min(Comparator.comparing(ExamRoom::getExamStartTime)).get().getExamStartTime();
-			String examStartTimeStr = DateUtil.dateToString(examStartTime, "MM月dd日 HH时mm分");
+			List<String> examStartTimes = teacherRoomEntry.getValue().stream().map(e-> DateUtil.dateToString(e.getExamStartTime(), "MM月dd日 HH点mm分")).collect(Collectors.toList());
+			String examStartTimeStr = StringUtils.join(examStartTimes, " ");
 			int examRoomNum = teacherRoomEntry.getValue().size();
 			Map<Integer, String> phoneMap = new HashMap<>();
 			phoneMap.put(teacherRoomEntry.getKey(), teacherPhone);
@@ -594,7 +595,7 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		if(!CollectionUtils.isEmpty(studentExamResults)){
 			studentExamResultDao.batchInsert(studentExamResults);
 		}
-		return BaseController.succeed("发送成功");
+		return BaseController.succeedMsg("发送成功");
 	}
 
 	@Override

+ 34 - 6
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java

@@ -113,7 +113,10 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 			throw new BizException("考级结果已确认");
 		}
 		Date now=new Date();
-		if(now.compareTo(examRoom.getExamStartTime())>0||DateUtil.isSameDay(now, examRoom.getExamStartTime())){
+		if(DateUtil.isSameDay(now, examRoom.getExamStartTime())){
+			throw new BizException("考试当天不可添加学员");
+		}
+		if(now.compareTo(examRoom.getExamStartTime())>0){
 			throw new BizException("无法添加学员");
 		}
 
@@ -252,6 +255,31 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 	}
 
 	@Override
+	public void autoSplitStudentToRoom(Long examId, Integer selfOrganId) {
+		ExaminationBasic examinationBasic = examinationBasicDao.get(examId);
+		if(Objects.isNull(examinationBasic)){
+			throw new BizException("考级项目不存在");
+		}
+		int sendExamPlanRooms = examRoomDao.countSendExamPlanRooms(examId);
+		if(sendExamPlanRooms>0){
+			throw new BizException("已发送考试安排,请手动处理未排考学员");
+		}
+		//未排考学员
+		List<ExamRegistration> notInRoomStudents = examRegistrationDao.getNotInRoomStudents(examId);
+		Map<Integer, List<ExamRegistration>> subjectRegistMap = notInRoomStudents.stream().collect(Collectors.groupingBy(ExamRegistration::getSubjectId));
+		Set<Integer> subjectIds = subjectRegistMap.keySet();
+		//未排考学员可排考考场
+		List<ExamRoom> examRooms = examRoomDao.getWithExamAndSubjects(examId, new ArrayList<>(subjectIds));
+		//未排考学员可排考考场学员
+		List<ExamRoomStudentRelation> examRoomStudents = examRoomStudentRelationDao.getWithExamAndRoomSubjects(examId, new ArrayList<>(subjectIds));
+		Map<Long, List<ExamRoomStudentRelation>> roomStudentsMap = examRoomStudents.stream().collect(Collectors.groupingBy(ExamRoomStudentRelation::getExamRoomId));
+		Set<Long> roomIds = roomStudentsMap.keySet();
+		//考场数量
+		Integer roomNum = roomIds.size();
+
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void changeStudentExamRoom(Long registId, Long examRoomId, Integer organId) {
 		if(Objects.isNull(registId)){
@@ -424,7 +452,7 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 					HashMap<Integer, String> map = new HashMap<>();
 					map.put(studentListDto.getStudentId(),studentListDto.getStudentId().toString());
 					String url = "3?examRegistrationId=" + studentListDto.getExamRegistrationId();
-					sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_WILL_START_PUSH,map,null,null,url, JiguangPushPlugin.PLUGIN_NAME,actionExamPush);
+					sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_WILL_START_PUSH,map,null,0,url, JiguangPushPlugin.PLUGIN_NAME,actionExamPush);
 				}
 			}
 			//将当前学员退踢出教室
@@ -578,7 +606,7 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 					HashMap<Integer, String> map = new HashMap<>();
 					map.put(studentListDto.getStudentId(),studentListDto.getStudentId().toString());
 					String url = "3?examRegistrationId=" + studentListDto.getExamRegistrationId();
-					sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_WILL_START_PUSH,map,null,null,url, JiguangPushPlugin.PLUGIN_NAME,actionExamPush);
+					sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_WILL_START_PUSH,map,null,0,url, JiguangPushPlugin.PLUGIN_NAME,actionExamPush);
 				}
 			}
 		}
@@ -597,7 +625,7 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 			HashMap<Integer, String> map = new HashMap<>(1);
 			map.put(examRoomStudentRelation.getStudentId(),examRoomStudentRelation.getStudentId().toString());
 			ExaminationBasic examinationBasic = examinationBasicDao.get(examRoomStudentRelation.getExaminationBasicId());
-			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_ROOM_STUDENT_SIGN_IN_AGAIN_PUSH,map,null,null,null,JiguangPushPlugin.PLUGIN_NAME,examinationBasic.getName());
+			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_ROOM_STUDENT_SIGN_IN_AGAIN_PUSH,map,null,0,null,JiguangPushPlugin.PLUGIN_NAME,examinationBasic.getName());
 		}else {
             imFeignService.kickRoom(new ReqUserData(examRoomStudentRelation.getExamRegistrationId(),examRoomStudentRelation.getStudentId().toString()));
 			//结束考试
@@ -616,8 +644,8 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 		examRoomStudentRelationDao.update(examRoomStudentRelation);
 		HashMap<Integer, String> map = new HashMap<>(1);
 		map.put(examRoomStudentRelation.getStudentId(),examRoomStudentRelation.getStudentId().toString());
-		String url = "3?examRegistrationId=" + nextExamRoomStudentRelationId;
-		sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_STARTED_PUSH,map,null,null,url,JiguangPushPlugin.PLUGIN_NAME);
+		String url = "3?examRegistrationId=" + examRoomStudentRelation.getExamRegistrationId();
+		sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_STARTED_PUSH,map,null,0,url,JiguangPushPlugin.PLUGIN_NAME);
 
 		//状态变更为呼叫中
 		studentExamResultDao.updateFinishedExam(examRoomStudentRelation.getExamRegistrationId(),1);

+ 19 - 7
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java

@@ -25,10 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -82,9 +79,6 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 			}
 			Organization organization = organDao.findByUserId(user.getId());
 			if(organization == null){
-				if(StringUtils.isEmpty(user.getPassword())){
-					sysUser.setPassword(new BCryptPasswordEncoder().encode("123456"));
-				}
 				organ.setUserId(user.getId());
 				organDao.insert(organ);
 				organ.setParentOrganIdTag(currentOrganization.getParentOrganIdTag() + "," + organ.getId());
@@ -323,4 +317,22 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	public Organization findByUserId(Integer userId) {
 		return organDao.findByUserId(userId);
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void lock(Integer organId, Integer lockFlag) {
+		Organization organization = organDao.get(organId);
+		SysUser queryUserInfo = sysUserFeignService.queryUserInfo();
+		if(queryUserInfo.getId().equals(organization.getUserId())){
+			throw new BizException("操作失败:不支持此操作");
+		}
+		if(lockFlag == 1){
+			List<Integer> organIds = getNextLevelOrganIds(organId, true);
+			employeeDao.batchLock(organIds);
+		}else {
+			Employee employee = employeeDao.get(organization.getUserId());
+			employee.setLockFlag(lockFlag);
+			employeeDao.update(employee);
+		}
+	}
 }

+ 4 - 1
edu-user/edu-user-biz/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java

@@ -20,6 +20,7 @@ import com.keao.edu.user.service.TeacherService;
 import com.keao.edu.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -85,7 +86,9 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 			return id;
 		}
 		sysUser.setUserType("TEACHER");
-
+		if(StringUtils.isEmpty(user.getPassword())){
+			sysUser.setPassword(new BCryptPasswordEncoder().encode("123456"));
+		}
 		sysUserDao.insert(sysUser);
 		Integer userId = sysUser.getId();
 		teacher.setUserId(userId);

+ 12 - 1
edu-user/edu-user-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -22,6 +22,7 @@
 		<result column="contact_address_" property="contactAddress" />
 		<result column="postal_code_" property="postalCode" />
 		<result column="role_name_" property="roleName" />
+		<result column="lock_flag_" property="lockFlag" />
 		<result column="del_flag_" property="delFlag" />
 		<result column="tenant_id_" property="tenantId" />
 		<result column="employee_type_" property="employeeType" />
@@ -56,6 +57,9 @@
             <if test="employeeType != null">
 				employee_type_ = #{employeeType},
             </if>
+            <if test="lockFlag != null">
+				lock_flag_ = #{lockFlag},
+            </if>
             <if test="graduateSchool != null">
                 graduate_school_ = #{graduateSchool},
             </if>
@@ -108,7 +112,14 @@
 	<update id="delete" >
 		UPDATE employee SET del_flag_ = 1,update_time_ = NOW() WHERE user_id_ = #{userId}
 	</update>
-	<sql id="employeeQueryPage">
+    <update id="batchLock">
+		UPDATE employee SET lock_flag_ = 1 WHERE user_id_ IN (SELECT user_id_ FROM organization WHERE id_ IN
+		<foreach collection="organIds" separator="," open="(" close=")" item="item">
+			#{item}
+		</foreach>
+		)
+	</update>
+    <sql id="employeeQueryPage">
 		<where>
 				e.del_flag_ = 0 AND e.user_id_ != #{userId} AND e.employee_type_ = 'EMPLOYEE'
 			<if test="search != null and search != ''">

+ 2 - 1
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamCertificationMapper.xml

@@ -137,9 +137,10 @@
 		<result column="student_id_" property="studentId" />
 		<result column="level_" property="level" />
 		<result column="address_" property="examAddress" />
+		<result column="name_" property="baseExamName" />
 	</resultMap>
 	<select id="queryExamCertificationDtoPage" resultMap="ExamCertificationDtoMap">
-		SELECT ec.exam_registration_id_,ec.exam_start_time_,ec.card_no_,ec.subject_id_,ec.level_,ec.exam_address_
+		SELECT ec.exam_registration_id_,ec.exam_start_time_,ec.card_no_,ec.subject_id_,ec.level_,ec.exam_address_,eb.name_
 		FROM exam_room_student_relation ersr
 		LEFT JOIN exam_certification ec ON ec.exam_registration_id_ = ersr.exam_registration_id_
 		LEFT JOIN examination_basic eb ON eb.id_ = ersr.examination_basic_id_

+ 16 - 4
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamOrganizationRelationMapper.xml

@@ -373,10 +373,13 @@
 		SELECT * FROM exam_organization_relation WHERE examination_basic_id_=#{examId} AND organ_id_=#{OrganId} FOR UPDATE
 	</select>
 	<select id="getExamOrganizationRelations" resultMap="ExamOrganizationRelation">
-		SELECT * FROM exam_organization_relation WHERE examination_basic_id_=#{examId} AND organ_id_ IN
-		<foreach collection="organIds" item="organId" separator="," open="(" close=")">
-			#{organId}
-		</foreach>
+		SELECT * FROM exam_organization_relation WHERE examination_basic_id_=#{examId}
+		<if test="organIds != null">
+			AND organ_id_ IN
+			<foreach collection="organIds" item="organId" separator="," open="(" close=")">
+				#{organId}
+			</foreach>
+		</if>
 	</select>
 
 	<select id="getExamChildOrgans" resultMap="ExamOrganizationRelationExtraDto">
@@ -394,5 +397,14 @@
 			</foreach>
 		</if>
 	</select>
+    <select id="countExamIsSendUrlOrgans" resultType="int">
+		SELECT
+			COUNT( organ_id_ )
+		FROM
+			exam_organization_relation
+		WHERE
+			examination_basic_id_ = #{examId}
+			AND send_url_flag_ = 1;
+	</select>
 
 </mapper>

+ 10 - 0
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRegistrationMapper.xml

@@ -634,4 +634,14 @@
 		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = er.id_
 		WHERE er.id_ = #{examRegistrationId} LIMIT 1
 	</select>
+
+    <select id="getNotInRoomStudents" resultMap="ExamRegistration">
+		SELECT
+			*
+		FROM
+			exam_registration er
+		WHERE
+			examination_basic_id_ = #{examId}
+			AND NOT EXISTS ( SELECT id_ FROM exam_room_student_relation WHERE examination_basic_id_ = #{examId} AND er.id_ = exam_registration_id_ )
+	</select>
 </mapper>

+ 14 - 0
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomMapper.xml

@@ -435,6 +435,7 @@
 			MAX(exam_end_time_) examEndTime
 		FROM exam_room WHERE examination_basic_id_=#{examId}
     </select>
+
     <select id="getHistoryOpenExamRoom" resultMap="ExamRoom">
 		SELECT
 			*
@@ -444,4 +445,17 @@
 			exam_start_time_ &lt; NOW( )
 			AND open_flag_ =1
 	</select>
+
+    <select id="countSendExamPlanRooms" resultType="int">
+		SELECT COUNT(id_) FROM exam_room WHERE examination_basic_id_=#{examId} AND exam_plan_push_flag_=1
+	</select>
+
+	<select id="getWithExamAndSubjects" resultMap="ExamRoom">
+		SELECT * FROM exam_room
+		WHERE examination_basic_id_=#{examId}
+		AND subject_id_list_ IN
+		<foreach collection="subjectIds" item="subjectId" separator="," open="(" close=")">
+			#{subjectId}
+		</foreach>
+	</select>
 </mapper>

+ 14 - 0
edu-user/edu-user-biz/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml

@@ -292,4 +292,18 @@
 	<select id="countStudentsWithRoom" resultType="int">
 		SELECT COUNT(DISTINCT exam_registration_id_) FROM exam_room_student_relation WHERE exam_room_id_=#{examRoomId}
 	</select>
+
+    <select id="getWithExamAndRoomSubjects" resultMap="ExamRoomStudentRelation">
+		SELECT
+			ersr.*
+		FROM
+			exam_room_student_relation ersr
+			LEFT JOIN exam_room er ON ersr.exam_room_id_ = er.id_
+		WHERE
+			ersr.examination_basic_id_ = #{examId}
+			AND er.subject_id_list_ IN
+			<foreach collection="subjectIds" item="subjectId" separator="," open="(" close=")">
+				#{subjectId}
+			</foreach>
+	</select>
 </mapper>

+ 5 - 0
edu-user/edu-user-biz/src/main/resources/config/mybatis/StudentExamResultMapper.xml

@@ -297,4 +297,9 @@
 		SELECT COUNT(exam_registration_id_) FROM student_exam_result
 		WHERE examination_basic_id_=#{examId} AND is_finished_exam_=5 AND result_ IS NULL
 	</select>
+
+    <select id="countExamResultRecordNum" resultType="java.lang.Integer">
+		SELECT COUNT(exam_registration_id_) FROM student_exam_result
+		WHERE examination_basic_id_=#{examId}
+	</select>
 </mapper>

+ 0 - 1
edu-user/edu-user-client-api/src/main/java/com/keao/edu/user/api/entity/ExamRoomStudentRelation.java

@@ -1,6 +1,5 @@
 package com.keao.edu.user.api.entity;
 
-import com.keao.edu.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 

+ 7 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamOrganizationRelationController.java

@@ -5,6 +5,7 @@ import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.controller.BaseController;
 import com.keao.edu.common.entity.HttpResponseResult;
 import com.keao.edu.common.page.PageInfo;
+import com.keao.edu.user.dao.ExamOrganizationRelationDao;
 import com.keao.edu.user.dto.ExamOrganizationRelationExtraDto;
 import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.entity.ExamOrganizationRelation;
@@ -35,6 +36,8 @@ public class ExamOrganizationRelationController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private EmployeeService employeeService;
+    @Autowired
+    private ExamOrganizationRelationDao examOrganizationRelationDao;
 
     @ApiOperation("分页查询")
     @GetMapping(value = "/list")
@@ -110,6 +113,10 @@ public class ExamOrganizationRelationController extends BaseController {
         if(Objects.isNull(employee)){
             return failed("用户异常");
         }
+        int sendUrlOrgans = examOrganizationRelationDao.countExamIsSendUrlOrgans(examId.longValue());
+        if(sendUrlOrgans>0){
+            return failed("已发送过报名链接");
+        }
         examOrganizationRelationService.sendUrl(examId,employee.getOrganId());
         return succeed();
     }

+ 51 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExcelInController.java

@@ -0,0 +1,51 @@
+package com.keao.edu.user.controller;
+
+
+import com.keao.edu.auth.api.entity.SysUser;
+import com.keao.edu.common.controller.BaseController;
+import com.keao.edu.util.collection.MapUtil;
+import com.keao.edu.util.excel.POIUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.beans.IntrospectionException;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@RequestMapping
+@Api(tags = "数据导入服务")
+@RestController
+public class ExcelInController extends BaseController {
+
+    @ApiOperation(value = "导入")
+    @PostMapping("/queryTeacherAttendances")
+    public void ImportTeacherAttendances(@RequestParam("file") MultipartFile file) throws IOException {
+        Map<String, List<Map<String, Object>>> stringListMap = POIUtil.importExcel(file.getInputStream(), 2,file.getOriginalFilename());
+        Set<String> strings = stringListMap.keySet();
+        List<SysUser> sysUserList = new ArrayList<>();
+        strings.forEach(e->{
+            List<Map<String, Object>> maps = stringListMap.get(e);
+            maps.forEach(m->{
+                try {
+                    sysUserList.add(MapUtil.mapToJavaBean(SysUser.class, m));
+                } catch (IllegalAccessException e1) {
+                    e1.printStackTrace();
+                } catch (IntrospectionException e1) {
+                    e1.printStackTrace();
+                } catch (InstantiationException e1) {
+                    e1.printStackTrace();
+                }
+            });
+        });
+    }
+}

+ 55 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExportController.java

@@ -0,0 +1,55 @@
+package com.keao.edu.user.controller;
+
+
+import com.keao.edu.common.controller.BaseController;
+import com.keao.edu.common.page.QueryInfo;
+import com.keao.edu.util.date.DateUtil;
+import com.keao.edu.util.excel.POIUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
+@RequestMapping
+@Api(tags = "数据导出服务")
+@RestController
+public class ExportController extends BaseController {
+
+    @ApiOperation(value = "导出")
+    @PostMapping("export/queryTeacherAttendances")
+    @PreAuthorize("@pcs.hasPermissions('export/queryTeacherAttendances')")
+    public void exportTeacherAttendances(HttpServletResponse response, QueryInfo queryInfo) throws IOException {
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "老师编号", "老师姓名", "课程编号", "课程名称", "上课日期",
+                    "课程开始时间", "课程结束时间", "课程类型", "签到时间", "签到状态", "签退时间", "签退状态", "备注"}, new String[]{
+                    "organName", "teacherId", "teacherName", "courseScheduleId", "courseScheduleName", "classDate",
+                    "startClassTime", "endClassTime", "courseScheduleType.msg", "signInTime", "signInStatus.msg", "signOutTime", "signOutStatus.msg",
+                    "remark"}, null);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 8 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/OrganizationController.java

@@ -75,6 +75,14 @@ public class OrganizationController extends BaseController {
 		return succeed();
 	}
 
+	@ApiOperation(value = "启用/停用合作单位")
+	@PostMapping(value = "lock")
+    @PreAuthorize("@pcs.hasPermissions('organization/lock')")
+	public HttpResponseResult lock(Integer id,Integer lockFlag) {
+		organizationService.lock(id,lockFlag);
+		return succeed();
+	}
+
 	@ApiOperation(value = "获取当前分部及其所有子合作单位")
 	@GetMapping(value = "getChildOrgans")
 	@PreAuthorize("@pcs.hasPermissions('organization/getChildOrgans')")

+ 6 - 0
edu-user/edu-user-server/src/main/resources/columnMapper.ini

@@ -0,0 +1,6 @@
+曲目名称=songName
+曲目作者=songAuthor
+所属声部=subjectList
+曲目级别=levelList
+曲目类别(练习曲or演奏曲)=type
+曲谱=fileUrlList

+ 2 - 2
edu-util/src/main/java/com/keao/edu/util/excel/POIUtil.java

@@ -441,10 +441,10 @@ public class POIUtil {
 		Workbook workbook = null;
 
 		try {
-			if (".xlsx".equals(extName.toLowerCase())) {
+			if (extName.endsWith(".xlsx")) {
 				// 支持excel2007 xlsx格式
 				workbook = new XSSFWorkbook(inputStream);
-			} else if (".xls".equals(extName)) {
+			} else if (extName.endsWith(".xls")) {
 				// 支持excel2003以前 xls格式
 				workbook = new HSSFWorkbook(inputStream);
 			} else {