소스 검색

Merge remote-tracking branch 'origin/master'

周箭河 5 년 전
부모
커밋
90e3fdba02
94개의 변경된 파일1792개의 추가작업 그리고 276개의 파일을 삭제
  1. 0 6
      .idea/httpRequests/2020-07-10T043131.200.json
  2. 0 6
      .idea/httpRequests/http-requests-log.http
  3. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/core/provider/PhoneAuthenticationProvider.java
  4. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/core/provider/service/DefaultUserDetailsService.java
  5. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/dal/dao/SysUserDao.java
  6. 1 1
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/SysUserService.java
  7. 2 2
      edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysUserServiceImpl.java
  8. 1 1
      edu-auth/edu-auth-server/src/main/resources/application.yml
  9. 1 1
      edu-auth/edu-auth-server/src/main/resources/bootstrap-dev.properties
  10. 5 1
      edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  11. 1 1
      edu-cms/src/main/resources/bootstrap-dev.properties
  12. 17 1
      edu-common/src/main/java/com/keao/edu/common/enums/MessageTypeEnum.java
  13. 0 0
      edu-common/src/main/resources/config/mybatis/SysMessageConfigMapper.xml
  14. 0 0
      edu-common/src/main/resources/config/mybatis/SysMessageMapper.xml
  15. 1 1
      edu-eureka/src/main/resources/bootstrap-dev.properties
  16. 2 2
      edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/client/ImFeignService.java
  17. 27 6
      edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/entity/MemberChangedMessage.java
  18. 1 1
      edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/entity/PublishMessageDto.java
  19. 4 0
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/common/BaseResponse.java
  20. 2 3
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/controller/RoomController.java
  21. 0 2
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/http/HttpHelper.java
  22. 54 25
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/Impl/RoomServiceImpl.java
  23. 5 5
      edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/RoomService.java
  24. 1 1
      edu-im/edu-im-server/src/main/resources/bootstrap-dev.properties
  25. 1 1
      edu-task/src/main/resources/bootstrap-dev.properties
  26. 11 3
      edu-user/edu-user-client-api/src/main/java/com/keao/edu/user/api/entity/ExamRoom.java
  27. 4 4
      edu-user/edu-user-client-api/src/main/java/com/keao/edu/user/api/entity/ExamRoomStudentRelation.java
  28. 1 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/UserServerApplication.java
  29. 11 7
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamRegistrationController.java
  30. 12 2
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamReviewController.java
  31. 3 3
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamRoomStudentRelationController.java
  32. 1 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamTeacherSalaryController.java
  33. 6 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/StudentExamResultController.java
  34. 6 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/SubjectController.java
  35. 11 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamManualLedgerDao.java
  36. 2 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamOrganizationRelationDao.java
  37. 22 5
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRegistrationDao.java
  38. 17 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamReviewDao.java
  39. 2 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java
  40. 26 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java
  41. 9 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamTeacherSalaryDao.java
  42. 2 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExaminationBasicDao.java
  43. 7 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/StudentExamResultDao.java
  44. 3 2
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/SysUserDao.java
  45. 2 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/TeacherDao.java
  46. 11 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/ExamCertificationDto.java
  47. 116 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/ExamReviewRecordDto.java
  48. 21 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/RoomStudentListDto.java
  49. 28 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/StudentBaseExamsDto.java
  50. 196 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/StudentExamListDto.java
  51. 3 4
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/entity/Teacher.java
  52. 25 9
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/enums/ExamStatusEnum.java
  53. 38 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ApplyListQueryInfo.java
  54. 11 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ExamReviewQueryInfo.java
  55. 40 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ExamReviewRecordQueryInfo.java
  56. 29 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamOrganizationRelationService.java
  57. 11 6
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRegistrationService.java
  58. 14 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamReviewService.java
  59. 8 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRoomService.java
  60. 8 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRoomStudentRelationService.java
  61. 9 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamTeacherSalaryService.java
  62. 6 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/StudentExamResultService.java
  63. 2 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/EmployeeServiceImpl.java
  64. 1 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamCertificationServiceImpl.java
  65. 18 16
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamManualLedgerServiceImpl.java
  66. 108 4
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamOrganizationRelationServiceImpl.java
  67. 57 14
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRegistrationServiceImpl.java
  68. 47 1
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamReviewServiceImpl.java
  69. 209 22
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java
  70. 35 18
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java
  71. 14 2
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamSongServiceImpl.java
  72. 50 3
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamTeacherSalaryServiceImpl.java
  73. 23 9
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExaminationBasicServiceImpl.java
  74. 29 7
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java
  75. 5 0
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/StudentExamResultServiceImpl.java
  76. 8 3
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/StudentServiceImpl.java
  77. 2 2
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/SubjectServiceImpl.java
  78. 10 10
      edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java
  79. 1 1
      edu-user/edu-user-server/src/main/resources/bootstrap-dev.properties
  80. 2 1
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamCertificationMapper.xml
  81. 1 1
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamLocationMapper.xml
  82. 10 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamManualLedgerMapper.xml
  83. 15 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamOrganizationRelationMapper.xml
  84. 55 12
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRegistrationMapper.xml
  85. 53 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamReviewMapper.xml
  86. 73 11
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRoomMapper.xml
  87. 42 8
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml
  88. 20 3
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamSongMapper.xml
  89. 9 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExamTeacherSalaryMapper.xml
  90. 3 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/ExaminationBasicMapper.xml
  91. 4 0
      edu-user/edu-user-server/src/main/resources/config/mybatis/StudentExamResultMapper.xml
  92. 2 2
      edu-user/edu-user-server/src/main/resources/config/mybatis/SysUserMapper.xml
  93. 22 3
      edu-user/edu-user-server/src/main/resources/config/mybatis/TeacherMapper.xml
  94. 1 1
      edu-zuul/src/main/resources/bootstrap-dev.properties

+ 0 - 6
.idea/httpRequests/2020-07-10T043131.200.json

@@ -1,6 +0,0 @@
-{
-  "status": false,
-  "msg": "Full authentication is required to access this resource",
-  "data": null,
-  "code": 403
-}

+ 0 - 6
.idea/httpRequests/http-requests-log.http

@@ -1,6 +0,0 @@
-POST http://localhost:8005/examReview/update
-
-<> 2020-07-10T043131.200.json
-
-###
-

+ 1 - 1
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/core/provider/PhoneAuthenticationProvider.java

@@ -50,7 +50,7 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 			throw new BadCredentialsException("验证码校验失败");
 		}
 
-		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(loginEntity.getPhone());
+		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(loginEntity.getPhone(),loginEntity.getClientId());
 		if (userInfo == null && StringUtils.isNotEmpty(loginEntity.getRegisterFlag())) {
 			sysUserService.initUser(loginEntity);
 		}

+ 1 - 1
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/core/provider/service/DefaultUserDetailsService.java

@@ -36,7 +36,7 @@ public class DefaultUserDetailsService implements UserDetailsService {
 		SysUserInfo userInfo = null;
 
 		if (StringUtils.startsWith(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX)) {
-			userInfo = sysUserService.queryUserInfoByPhone(StringUtils.substringAfter(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX));
+			userInfo = sysUserService.queryUserInfoByPhone(StringUtils.substringAfter(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX),null);
 		} else if (StringUtils.startsWith(username, SecurityConstants.USERNAME_PRINCIPAL_PREFIX)) {
 			userInfo = sysUserService.queryUserInfoByUsername(StringUtils.substringAfter(username, SecurityConstants.USERNAME_PRINCIPAL_PREFIX));
 		} else {

+ 1 - 1
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/dal/dao/SysUserDao.java

@@ -29,7 +29,7 @@ public interface SysUserDao extends BaseDAO<Integer, SysUser> {
 	 * @param phone
 	 * @return
 	 */
-	SysUser queryByPhoneAndClient(@Param("phone") String phone, @Param("client") String client);
+	SysUser queryByPhoneAndClient(@Param("phone") String phone, @Param("clientId") String clientId);
 
 	/**
 	 * 修改密码

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

@@ -41,7 +41,7 @@ public interface SysUserService extends BaseService<Integer, SysUser> {
 	 * @param phone
 	 * @return
 	 */
-	SysUserInfo queryUserInfoByPhone(String phone);
+	SysUserInfo queryUserInfoByPhone(String phone,String clientId);
 
 	/**
 	 * 根据手机号获取系统用户详细信息

+ 2 - 2
edu-auth/edu-auth-server/src/main/java/com/keao/edu/auth/service/impl/SysUserServiceImpl.java

@@ -64,8 +64,8 @@ public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implem
 	}
 
 	@Override
-	public SysUserInfo queryUserInfoByPhone(String phone) {
-		return getSysUserInfo(queryByPhone(phone));
+	public SysUserInfo queryUserInfoByPhone(String phone,String clientId) {
+		return getSysUserInfo(queryByPhoneAndClient(phone,clientId));
 	}
 
 	@Override

+ 1 - 1
edu-auth/edu-auth-server/src/main/resources/application.yml

@@ -86,7 +86,7 @@ ribbon:
   ConnectTimeout: 60000
 
 message:
-  debugMode: true
+  debugMode: false
 
 logging:
   level:

+ 1 - 1
edu-auth/edu-auth-server/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 5 - 1
edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -173,7 +173,11 @@
     </select>
 
     <select id="queryByPhoneAndClient" resultMap="SysUser">
-        select * from sys_user where phone_ = #{phone} AND user_type_ LIKE CONCAT('%',#{client},'%') LIMIT 1 FOR UPDATE
+        SELECT * FROM sys_user WHERE phone_ = #{phone}
+        <if test="clientId != null and clientId != ''">
+            AND user_type_ LIKE CONCAT('%',#{clientId},'%')
+        </if>
+        LIMIT 1 FOR UPDATE
     </select>
     <resultMap id="ImUserModel" type="com.keao.edu.im.api.entity.ImUserModel">
         <result column="id_" property="id"/>

+ 1 - 1
edu-cms/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 17 - 1
edu-common/src/main/java/com/keao/edu/common/enums/MessageTypeEnum.java

@@ -4,7 +4,23 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     SMS_VERIFY_CODE_LOGIN("SMS_VERIFY_CODE_LOGIN", "验证码登录"),
     EXAM_REGISTRATION_URL_SMS("EXAM_REGISTRATION_URL_SMS", "报名连接推送"),
-    STUDENT_EXAM_START("STUDENT_EXAM_START", "考试已开始");
+    STUDENT_EXAM_START("STUDENT_EXAM_START", "考试已开始"),
+    EXAM_REGISTRATION_CLOSE_SMS("EXAM_REGISTRATION_CLOSE_SMS", "关闭报名"),
+    EXAM_CLOSE_SMS("EXAM_CLOSE_SMS", "项目关闭"),
+    EXAM_REGIST_TIME_CHANGE_SMS("EXAM_REGIST_TIME_CHANGE_SMS", "报名时间调整"),
+    EXAM_REGIST_EXPIRE_SMS("EXAM_REGIST_EXPIRE_SMS", "报名截至"),
+    REGIST_PASS_PUSH("REGIST_PASS_PUSH", "报名审核通过"),
+    REGIST_REJECT_PUSH("REGIST_REJECT_PUSH", "报名审核未通过"),
+    REGIST_REJECT_SMS("REGIST_REJECT_SMS", "报名审核未通过"),
+    ACTION_EXAM_SIGN_PUSH("ACTION_EXAM_SIGN_PUSH", "开考签到提醒"),
+    EXAM_ROOM_CONFIRM_ONLINE_STUDENT_PUSH("EXAM_ROOM_CONFIRM_ONLINE_STUDENT_PUSH", "考场已确认"),
+    EXAM_ROOM_CONFIRM_ONLINE_STUDENT_SMS("EXAM_ROOM_CONFIRM_ONLINE_STUDENT_SMS", "考场已确认"),
+    EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_PUSH("EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_PUSH", "考场已确认"),
+    EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_SMS("EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_SMS", "考场已确认"),
+    EXAM_ROOM_CONFIRM_TEACHER_SMS("EXAM_ROOM_CONFIRM_TEACHER_SMS", "考场已确认"),
+    BEFORE_EXAM_TEACHER_REMIND_SMS("BEFORE_EXAM_TEACHER_REMIND_SMS","明日考试安排"),
+    BEFORE_EXAM_STUDENT_REMIND_PUSH("BEFORE_EXAM_STUDENT_REMIND_PUSH","明日考试安排"),
+    BEFORE_EXAM_STUDENT_REMIND_SMS("BEFORE_EXAM_STUDENT_REMIND_SMS","明日考试安排");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

+ 0 - 0
edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageConfigMapper.xml → edu-common/src/main/resources/config/mybatis/SysMessageConfigMapper.xml


+ 0 - 0
edu-auth/edu-auth-server/src/main/resources/config/mybatis/SysMessageMapper.xml → edu-common/src/main/resources/config/mybatis/SysMessageMapper.xml


+ 1 - 1
edu-eureka/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 2 - 2
edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/client/ImFeignService.java

@@ -110,7 +110,7 @@ public interface ImFeignService {
 	 * @param groupName
 	 */
 	@PostMapping(value = "room/joinGroup")
-	void joinGroup(@RequestParam("userIds") String userIds,@RequestParam("organId") String groupId,@RequestParam("groupName") String groupName);
+	void joinGroup(@RequestParam("userIds") String userIds,@RequestParam("groupId") String groupId,@RequestParam("groupName") String groupName);
 
 	/**
 	 * 退群
@@ -118,7 +118,7 @@ public interface ImFeignService {
 	 * @param groupId
 	 */
 	@PostMapping(value = "room/quitGroup")
-	void quitGroup(@RequestParam("userIds") String userIds,@RequestParam("organId") String groupId);
+	void quitGroup(@RequestParam("userIds") String userIds,@RequestParam("groupId") String groupId);
 
 	/**
 	 * 解散群

+ 27 - 6
edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/entity/MemberChangedMessage.java

@@ -2,7 +2,7 @@ package com.keao.edu.im.api.entity;
 
 import java.util.Date;
 
-public class MemberChangedMessage extends BaseMessage {
+public class MemberChangedMessage extends BaseMessage{
     public final static int Action_Join = 1;
     public final static int Action_Leave = 2;
     public final static int Action_Kick = 3;
@@ -14,7 +14,9 @@ public class MemberChangedMessage extends BaseMessage {
     private String userId;
     private String userName;
     private String roomId;
-    private String appParamJson;
+//    private String appParamJson;
+    private Integer waitNum;
+    private Integer classroomSwitch;
     private String webParamJson;
     private boolean camera;
     private boolean microphone;
@@ -23,14 +25,33 @@ public class MemberChangedMessage extends BaseMessage {
 
     private Date timestamp;
 
-    public String getAppParamJson() {
-        return appParamJson;
+    public MemberChangedMessage() {
     }
 
-    public void setAppParamJson(String appParamJson) {
-        this.appParamJson = appParamJson;
+    public Integer getClassroomSwitch() {
+        return classroomSwitch;
     }
 
+    public void setClassroomSwitch(Integer classroomSwitch) {
+        this.classroomSwitch = classroomSwitch;
+    }
+
+    public Integer getWaitNum() {
+        return waitNum;
+    }
+
+    public void setWaitNum(Integer waitNum) {
+        this.waitNum = waitNum;
+    }
+
+//    public String getAppParamJson() {
+//        return appParamJson;
+//    }
+
+//    public void setAppParamJson(String appParamJson) {
+//        this.appParamJson = appParamJson;
+//    }
+
     public String getWebParamJson() {
         return webParamJson;
     }

+ 1 - 1
edu-im/edu-im-api/src/main/java/com/keao/edu/im/api/entity/PublishMessageDto.java

@@ -1,6 +1,6 @@
 package com.keao.edu.im.api.entity;
 
-public class PublishMessageDto {
+public class PublishMessageDto{
     private String userId;
 
     private String roomId;

+ 4 - 0
edu-im/edu-im-server/src/main/java/com/keao/edu/im/common/BaseResponse.java

@@ -36,6 +36,10 @@ public class BaseResponse<T> {
         setData(data);
     }
 
+    public void setErrCode(int errCode) {
+        this.errCode = errCode;
+    }
+
     public void setErr(ErrorEnum error, String errDetail) {
         this.errCode = error.getErrCode();
         this.errMsg = error.getErrMsg();

+ 2 - 3
edu-im/edu-im-server/src/main/java/com/keao/edu/im/controller/RoomController.java

@@ -31,10 +31,9 @@ public class RoomController{
     SysUserFeignService sysUserFeignService;
 
     @RequestMapping(value = "/join", method = RequestMethod.POST)
-    public Object joinRoom(@RequestBody ReqUserData data)
+    public BaseResponse joinRoom(@RequestBody ReqUserData data)
             throws Exception {
-        RoomResult roomResult = roomService.joinRoom(data.getRegistrationId(), data.isAudience(), data.isDisableCamera(),data.isMusicMode(),data.getRoomId());
-        return new BaseResponse<>(roomResult);
+        return roomService.joinRoom(data.getRegistrationId(), data.isAudience(), data.isDisableCamera(),data.isMusicMode(),data.getRoomId());
     }
 
     @RequestMapping(value = "/joinRecorded", method = RequestMethod.POST)

+ 0 - 2
edu-im/edu-im-server/src/main/java/com/keao/edu/im/http/HttpHelper.java

@@ -258,14 +258,12 @@ public class HttpHelper {
 
     public HttpURLConnection createPostHttpConnection(String uri, String contentType)
         throws IOException {
-
         URL url = new URL(uri);
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         if (conn == null) {
             log.info("open url connection fail, url={}", uri);
             return null;
         }
-
         conn.setUseCaches(false);
         conn.setDoInput(true);
         conn.setDoOutput(true);

+ 54 - 25
edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/Impl/RoomServiceImpl.java

@@ -8,6 +8,7 @@ import com.keao.edu.im.api.entity.MemberChangedMessage;
 import com.keao.edu.im.api.entity.PublishMessageDto;
 import com.keao.edu.im.api.entity.ReqUserData;
 import com.keao.edu.im.common.ApiException;
+import com.keao.edu.im.common.BaseResponse;
 import com.keao.edu.im.common.ErrorEnum;
 import com.keao.edu.im.config.IMProperties;
 import com.keao.edu.im.dao.*;
@@ -132,15 +133,15 @@ public class RoomServiceImpl implements RoomService {
         if(examRoomStudentRelation == null){
             throw new BizException("学员考试数据异常");
         }
-        if(examRoomStudentRelation.getClassroomSwitch() == YesOrNoEnum.NO){
+        if(examRoomStudentRelation.getClassroomSwitch() == 0){
             throw new BizException("考级入口已关闭");
         }
         if (memberList.isEmpty()) {
             saveRoomMember(userId,sysUser.getAvatar(), realName, recordedRoomId, Student.getValue(), true,true, date);
-            IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, recordedRoomId, recordedRoomId);
+            /*IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, recordedRoomId, recordedRoomId);
             if (!resultInfo.isSuccess()) {
                 throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
-            }
+            }*/
             userResult.setMicrophone(true);
             userResult.setCamera(true);
             userResult.setHandUp(false);
@@ -189,9 +190,14 @@ public class RoomServiceImpl implements RoomService {
         return roomResult;
     }
 
+    private BaseResponse getBaseResponse(BaseResponse baseResponse){
+        baseResponse.setErrCode(500);
+        return baseResponse;
+    }
+
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     @Override
-    public RoomResult joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera,boolean isMusicMode,String roomId) throws ApiException, Exception {
+    public BaseResponse joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera, boolean isMusicMode, String roomId) throws ApiException, Exception {
         if(registrationId != null){
             StudentExamResultApiDto examResult = eduUserFeignService.getExamResult(registrationId);
             Integer recordFlag = examResult.getRecordFlag();
@@ -221,19 +227,20 @@ public class RoomServiceImpl implements RoomService {
         List<Room> roomList = roomDao.findByRid(roomId);
         if (roomList.isEmpty()) {
             saveRoom(roomId, roomId, curTime, null);
-            IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId}, roomId, roomId);
+            /*IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId}, roomId, roomId);
             if (!resultInfo.isSuccess()) {
                 log.error("joinRoom IM error: roomId={}, {}", roomId, resultInfo.getErrorMessage());
                 throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
             }
-//            else {
-//                scheduleManager.addExpiredTask(this, roomId);
-//            }
+            else {
+                scheduleManager.addExpiredTask(this, roomId);
+            }*/
         }/* else {
             display = roomList.get(0).getDisplay();
         }*/
         RoleEnum roleEnum;
         RoomResult roomResult = new RoomResult();
+        BaseResponse baseResponse = new BaseResponse(roomResult);
         RoomResult.MemberResult userResult = new RoomResult.MemberResult();
         List<RoomMember> memberList = roomMemberDao.findByRidAndUid(roomId, userId);
         if (memberList.isEmpty()) {
@@ -244,18 +251,22 @@ public class RoomServiceImpl implements RoomService {
             }else {
                 ExamRoomStudentRelation examRoomStudentRelation = eduUserFeignService.getExamRoomStudentRelation(registrationId);
                 if(examRoomStudentRelation == null){
-                    throw new BizException("学员考试数据异常");
+                    log.info("user join the room: roomId={} , userId={}", roomId, userId);
+                    baseResponse.setErrMsg("学员考试数据异常");
+                    return getBaseResponse(baseResponse);
                 }
-                if(examRoomStudentRelation.getClassroomSwitch() == YesOrNoEnum.NO){
-                    throw new BizException("考级入口已关闭");
+                if(examRoomStudentRelation.getClassroomSwitch() == 0){
+                    log.info("user join the room: roomId={} , userId={}", roomId, userId);
+                    baseResponse.setErrMsg("考级入口已关闭");
+                    return getBaseResponse(baseResponse);
                 }
                 roleEnum = Student;
             }
             saveRoomMember(userId,sysUser.getAvatar(), realName, roomId, roleEnum.getValue(), !isDisableCamera,!isMusicMode, curTime);
-            IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, roomId, roomId);
+            /*IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, roomId, roomId);
             if (!resultInfo.isSuccess()) {
                 throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
-            }
+            }*/
             userResult.setMicrophone(true);
             userResult.setCamera(!isDisableCamera);
             userResult.setHandUp(false);
@@ -267,10 +278,14 @@ public class RoomServiceImpl implements RoomService {
             if(roleEnum == Student){
                 ExamRoomStudentRelation examRoomStudentRelation = eduUserFeignService.getExamRoomStudentRelation(registrationId);
                 if(examRoomStudentRelation == null){
-                    throw new BizException("学员考试数据异常");
+                    log.info("user join the room: roomId={} , userId={}", roomId, userId);
+                    baseResponse.setErrMsg("学员考试数据异常");
+                    return getBaseResponse(baseResponse);
                 }
-                if(examRoomStudentRelation.getClassroomSwitch() == YesOrNoEnum.NO){
-                    throw new BizException("考级入口已关闭");
+                if(examRoomStudentRelation.getClassroomSwitch() == 0){
+                    log.info("user join the room: roomId={} , userId={}", roomId, userId);
+                    baseResponse.setErrMsg("考级入口已关闭");
+                    return getBaseResponse(baseResponse);
                 }
             }
 //            roomMemberDao.updateCameraByRidAndUid(roomId, userId, !isDisableCamera);
@@ -315,6 +330,9 @@ public class RoomServiceImpl implements RoomService {
         roomResult.setUserInfo(userResult);
 //        roomResult.setDisplay(display);
         roomResult.setRoomId(roomId);
+        if (registrationId != null){
+            roomResult.setRegistrationId(registrationId);
+        }
 
         roomResult.setMembers(roomMemberDao.findByRid(roomId));
 //        List<Whiteboard> whiteboardList = whiteboardDao.findByRid(roomId);
@@ -323,7 +341,7 @@ public class RoomServiceImpl implements RoomService {
         if(registrationId != null){
             this.publishMessage(eduUserFeignService.getPublishMessage(registrationId));
         }
-        return roomResult;
+        return baseResponse;
     }
 
     @Override
@@ -496,8 +514,12 @@ public class RoomServiceImpl implements RoomService {
         }*/
 
         if (roomMemberDao.countByRid(roomId) == 1) {
-            IMApiResultInfo apiResultInfo = null;
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+            roomDao.deleteByRid(roomId);
+            /*IMApiResultInfo apiResultInfo = null;
             try {
+                roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+                roomDao.deleteByRid(roomId);
                 apiResultInfo = imHelper.dismiss(userId, roomId);
                 if (apiResultInfo.getCode() == 200) {
                     roomMemberDao.deleteUserByRidAndUid(roomId, userId);
@@ -511,9 +533,11 @@ public class RoomServiceImpl implements RoomService {
             } catch (Exception e) {
                 log.error("{} exit {} room error: {}", userId, roomId, e.getMessage());
                 throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
-            }
+            }*/
         } else {
-            IMApiResultInfo apiResultInfo = null;
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+
+            /*IMApiResultInfo apiResultInfo = null;
             try {
                 apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
                 if (apiResultInfo.isSuccess()) {
@@ -529,7 +553,7 @@ public class RoomServiceImpl implements RoomService {
             } catch (Exception e) {
                 log.error("leave room error: roomId={}, {}", roomId, e.getMessage());
                 throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
-            }
+            }*/
         }
         userDao.deleteByUid(userId);
 //        this.signOut(Long.parseLong(roomId));
@@ -565,7 +589,10 @@ public class RoomServiceImpl implements RoomService {
         log.info("levelRecorded: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
 
         if (roomMemberDao.countByRid(roomId) == 1) {
-            IMApiResultInfo apiResultInfo = null;
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+            roomDao.deleteByRid(roomId);
+
+            /*IMApiResultInfo apiResultInfo = null;
             try {
                 apiResultInfo = imHelper.dismiss(userId, roomId);
                 if (apiResultInfo.getCode() == 200) {
@@ -579,9 +606,11 @@ public class RoomServiceImpl implements RoomService {
             } catch (Exception e) {
                 log.error("levelRecorded {} exit {} room error: {}", userId, roomId, e.getMessage());
                 throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
-            }
+            }*/
         } else {
-            IMApiResultInfo apiResultInfo = null;
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+
+            /*IMApiResultInfo apiResultInfo = null;
             try {
                 apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
                 if (apiResultInfo.isSuccess()) {
@@ -597,7 +626,7 @@ public class RoomServiceImpl implements RoomService {
             } catch (Exception e) {
                 log.error("levelRecorded leave room error: roomId={}, {}", roomId, e.getMessage());
                 throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
-            }
+            }*/
         }
         userDao.deleteByUid(userId);
         if(registrationId != null){

+ 5 - 5
edu-im/edu-im-server/src/main/java/com/keao/edu/im/service/RoomService.java

@@ -1,20 +1,20 @@
 package com.keao.edu.im.service;
 
-import java.io.IOException;
-import java.util.List;
-
-import com.keao.edu.im.api.entity.MemberChangedMessage;
 import com.keao.edu.im.api.entity.PublishMessageDto;
 import com.keao.edu.im.api.entity.ReqUserData;
 import com.keao.edu.im.common.ApiException;
+import com.keao.edu.im.common.BaseResponse;
 import com.keao.edu.im.pojo.*;
 
+import java.io.IOException;
+import java.util.List;
+
 /**
  * Created by super_zou on 2019/11/28.
  */
 public interface RoomService {
     //everyone
-    public RoomResult joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera, boolean isMusicMode,String roomId) throws ApiException, Exception;
+    public BaseResponse joinRoom(Long registrationId, boolean isAudience, boolean isDisableCamera, boolean isMusicMode, String roomId) throws ApiException, Exception;
 
     void signIn(Long roomId);
 

+ 1 - 1
edu-im/edu-im-server/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 1 - 1
edu-task/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 11 - 3
edu-user/edu-user-client-api/src/main/java/com/keao/edu/user/api/entity/ExamRoom.java

@@ -54,7 +54,7 @@ public class ExamRoom {
 
 	private Integer openFlag;
 
-	private YesOrNoEnum examPlanPushFlag;
+	private Integer examPlanPushFlag;
 
 	private Integer examRoomStudentNum;
 
@@ -69,6 +69,14 @@ public class ExamRoom {
 	/**  */
 	private String tenantId;
 
+	public ExamRoom() {
+	}
+
+	public ExamRoom(Long id, Integer examPlanPushFlag) {
+		this.id = id;
+		this.examPlanPushFlag = examPlanPushFlag;
+	}
+
 	public Integer getOpenFlag() {
 		return openFlag;
 	}
@@ -214,11 +222,11 @@ public class ExamRoom {
 		this.examEndTime = examEndTime;
 	}
 
-	public YesOrNoEnum getExamPlanPushFlag() {
+	public Integer getExamPlanPushFlag() {
 		return examPlanPushFlag;
 	}
 
-	public void setExamPlanPushFlag(YesOrNoEnum examPlanPushFlag) {
+	public void setExamPlanPushFlag(Integer examPlanPushFlag) {
 		this.examPlanPushFlag = examPlanPushFlag;
 	}
 

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

@@ -9,7 +9,7 @@ import java.util.Date;
 /**
  * 对应数据库表(exam_room_student_relation):
  */
-public class ExamRoomStudentRelation {
+public class ExamRoomStudentRelation extends  ExamRoom{
 
 	private Long id;
 
@@ -35,7 +35,7 @@ public class ExamRoomStudentRelation {
 	private String tenantId;
 
 	@ApiModelProperty(value = "房间是否开启")
-	private YesOrNoEnum classroomSwitch;
+	private Integer classroomSwitch;
 
 	public Date getSignInTime() {
 		return signInTime;
@@ -45,11 +45,11 @@ public class ExamRoomStudentRelation {
 		this.signInTime = signInTime;
 	}
 
-	public YesOrNoEnum getClassroomSwitch() {
+	public Integer getClassroomSwitch() {
 		return classroomSwitch;
 	}
 
-	public void setClassroomSwitch(YesOrNoEnum classroomSwitch) {
+	public void setClassroomSwitch(Integer classroomSwitch) {
 		this.classroomSwitch = classroomSwitch;
 	}
 

+ 1 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/UserServerApplication.java

@@ -20,7 +20,7 @@ import org.springframework.web.client.RestTemplate;
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableFeignClients({"com.keao.edu"})
-@MapperScan({"com.keao.edu.user.dao"})
+@MapperScan({"com.keao.edu.user.dao", "com.keao.edu.common.dao"})
 @ComponentScan(basePackages="com.keao.edu")
 @Configuration
 @EnableSwagger2Doc

+ 11 - 7
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamRegistrationController.java

@@ -7,12 +7,10 @@ import com.keao.edu.common.entity.HttpResponseResult;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.thirdparty.ocr.Ocr;
-import com.keao.edu.user.dto.ExamRecordDto;
-import com.keao.edu.user.dto.ExamRegistrationDto;
-import com.keao.edu.user.dto.ExamRegistrationRoomDto;
-import com.keao.edu.user.dto.ExamRegistrationStatisticsDto;
+import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.entity.ExamRegistration;
+import com.keao.edu.user.page.ApplyListQueryInfo;
 import com.keao.edu.user.page.ExamRecordQueryInfo;
 import com.keao.edu.user.page.ExamRegistrationQueryInfo;
 import com.keao.edu.user.service.EmployeeService;
@@ -67,13 +65,19 @@ public class ExamRegistrationController extends BaseController {
 
     @ApiOperation(value = "学生端学员报名记录查询")
     @GetMapping(value = "applyList")
-    public HttpResponseResult<PageInfo<ExamRegistrationDto>> applyList(QueryInfo queryInfo) {
+    public HttpResponseResult<PageInfo<ExamRegistrationDto>> applyList(ApplyListQueryInfo queryInfo) {
         return succeed(examRegistrationService.applyList(queryInfo));
     }
 
+    @ApiOperation(value = "学生端考级曲库考试列表")
+    @GetMapping(value = "studentBaseExams")
+    public HttpResponseResult<PageInfo<StudentBaseExamsDto>> studentBaseExams(QueryInfo queryInfo) {
+        return succeed(examRegistrationService.studentBaseExams(queryInfo));
+    }
+
     @ApiOperation(value = "学生端获取学员考试记录")
-    @PostMapping(value = "examList")
-    public HttpResponseResult<PageInfo<ExamRecordDto>> examList(ExamRecordQueryInfo queryInfo) {
+    @GetMapping(value = "examList")
+    public HttpResponseResult<PageInfo<StudentExamListDto>> examList(ExamRecordQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         queryInfo.setStudentId(sysUser.getId());
         return succeed(examRegistrationService.examList(queryInfo));

+ 12 - 2
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamReviewController.java

@@ -7,9 +7,11 @@ import com.keao.edu.common.entity.HttpResponseResult;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.user.dto.ExamReviewDto;
+import com.keao.edu.user.dto.ExamReviewRecordDto;
 import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.entity.ExamReview;
 import com.keao.edu.user.page.ExamReviewQueryInfo;
+import com.keao.edu.user.page.ExamReviewRecordQueryInfo;
 import com.keao.edu.user.service.EmployeeService;
 import com.keao.edu.user.service.ExamReviewService;
 import io.swagger.annotations.Api;
@@ -45,6 +47,14 @@ public class ExamReviewController extends BaseController {
         return succeed(examReviewService.findExamResult(queryInfo));
     }
 
+    @ApiOperation("监考页面分页查询评审结果")
+    @GetMapping(value = "/queryExamReviewRecordList")
+    public HttpResponseResult<PageInfo<ExamReviewRecordDto>> queryExamReviewRecordList(ExamReviewRecordQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(examReviewService.queryExamReviewRecordList(queryInfo));
+    }
+
     @ApiOperation("修改评审结果")
     @PostMapping(value = "/update")
     public HttpResponseResult update(ExamReview examReview){
@@ -52,10 +62,10 @@ public class ExamReviewController extends BaseController {
         return succeed();
     }
 
-    @ApiOperation("创建评审")
+    @ApiOperation("老师评审")
     @PostMapping(value = "/createExamReview")
     public HttpResponseResult createExamReview(ExamReview examReview){
-        examReviewService.insert(examReview);
+        examReviewService.add(examReview);
         return succeed();
     }
 }

+ 3 - 3
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamRoomStudentRelationController.java

@@ -56,20 +56,20 @@ public class ExamRoomStudentRelationController extends BaseController {
         return succeed();
     }
 
-    @ApiOperation("监考端去录播")
+    @ApiOperation("监考端指定学员去录播")
     @PostMapping(value = "/webRecorded")
     public HttpResponseResult webRecorded(Long nextExamRoomStudentRelationId,Long examRoomStudentRelationId,Long roomId) {
         examRoomStudentRelationService.recorded(nextExamRoomStudentRelationId,examRoomStudentRelationId,roomId);
         return succeed();
     }
 
-    @ApiOperation("学生去录播")
+    @ApiOperation("学生选择去录播")
     @PostMapping(value = "/stuRecorded")
     public HttpResponseResult<NeedCheckingDetailDto> stuRecorded(Long examRegistrationId) {
         return succeed(examRoomStudentRelationService.stuRecorded(examRegistrationId));
     }
 
-    @ApiOperation("学生重新排队")
+    @ApiOperation("学生选择重新排队")
     @PostMapping(value = "/againQueue")
     public HttpResponseResult<NeedCheckingDetailDto> againQueue(Long examRegistrationId) {
         return succeed(examRoomStudentRelationService.againQueue(examRegistrationId));

+ 1 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/ExamTeacherSalaryController.java

@@ -67,7 +67,7 @@ public class ExamTeacherSalaryController extends BaseController {
     @PostMapping(value = "/update")
     public HttpResponseResult update(ExamTeacherSalary examTeacherSalary) {
         examTeacherSalary.setUpdateTime(new Date());
-        examTeacherSalaryService.update(examTeacherSalary);
+        examTeacherSalaryService.updateExamTeacherSalary(examTeacherSalary);
         return succeed();
     }
 

+ 6 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/StudentExamResultController.java

@@ -1,6 +1,5 @@
 package com.keao.edu.user.controller;
 
-import com.alibaba.fastjson.JSONObject;
 import com.keao.edu.auth.api.client.SysUserFeignService;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.controller.BaseController;
@@ -81,4 +80,10 @@ public class StudentExamResultController extends BaseController {
         return succeed(studentExamResultService.getStudentExamResultStatisticsInfo(organId, examId));
     }
 
+    @ApiOperation("确认考生")
+    @PostMapping(value = "/confirmStudent")
+    public HttpResponseResult confirmStudent(Long examRegistrationId) {
+        studentExamResultService.confirmStudent(examRegistrationId);
+        return succeed();
+    }
 }

+ 6 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/controller/SubjectController.java

@@ -58,6 +58,12 @@ public class SubjectController extends BaseController {
         return succeed(subjectService.queryPage(queryInfo));
     }
 
+    @ApiOperation(value = "学生端分页查询科目列表")
+    @GetMapping("/studentQueryPage")
+    public HttpResponseResult<PageInfo<Subject>> studentQueryPage(SubjectQueryInfo queryInfo){
+        return succeed(subjectService.queryPage(queryInfo));
+    }
+
     @ApiOperation(value = "分页查询科目树状列表")
     @GetMapping("/queryPageTree")
     @PreAuthorize("@pcs.hasPermissions('subject/queryPageTree')")

+ 11 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamManualLedgerDao.java

@@ -5,6 +5,7 @@ import com.keao.edu.user.dto.ExamManualLedgerStatisticsDto;
 import com.keao.edu.user.entity.ExamManualLedger;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -28,5 +29,14 @@ public interface ExamManualLedgerDao extends BaseDAO<Long, ExamManualLedger> {
                                                      @Param("examId") Long examId,
                                                      @Param("days") List<String> days);
 
-
+    /**
+     * @describe 统计合作单位在指定项目中的累计支出
+     * @author Joburgess
+     * @date 2020.07.21
+     * @param examId:
+     * @param organId:
+     * @return java.math.BigDecimal
+     */
+    BigDecimal countOrganLedgerWithExam(@Param("examId") Long examId,
+                                        @Param("organId") Integer organId);
 }

+ 2 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamOrganizationRelationDao.java

@@ -71,6 +71,8 @@ public interface ExamOrganizationRelationDao extends BaseDAO<Long, ExamOrganizat
      */
     List<ExamOrganizationRelation> getWithExam(@Param("examId") Integer examId);
 
+    List<ExamOrganizationRelation> getOrganInfoWithExam(@Param("examId") Integer examId);
+
     List<ExamOrganizationRelation> getWithExams(@Param("examIds") List<Long> examIds);
 
     List<ExamOrganizationRelation> getWithExamsAndOrgans(@Param("examIds") List<Long> examIds,

+ 22 - 5
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRegistrationDao.java

@@ -2,10 +2,7 @@ package com.keao.edu.user.dao;
 
 
 import com.keao.edu.common.dal.BaseDAO;
-import com.keao.edu.user.dto.ExamRecordDto;
-import com.keao.edu.user.dto.ExamRegistrationDto;
-import com.keao.edu.user.dto.ExamRegistrationRoomDto;
-import com.keao.edu.user.dto.ExamRegistrationStatisticsDto;
+import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.ExamRegistration;
 import com.keao.edu.user.enums.StudentRegistrationStatusEnum;
 import org.apache.ibatis.annotations.Param;
@@ -108,7 +105,7 @@ public interface ExamRegistrationDao extends BaseDAO<Long, ExamRegistration> {
      * @param params
      * @return
      */
-    List<ExamRecordDto> queryExamList(Map<String, Object> params);
+    List<StudentExamListDto> queryExamList(Map<String, Object> params);
 
     /**
      * @param params
@@ -144,4 +141,24 @@ public interface ExamRegistrationDao extends BaseDAO<Long, ExamRegistration> {
                                      @Param("subjectId") Integer subjectId, @Param("level") Integer level,
                                      @Param("statusEnumList") List<StudentRegistrationStatusEnum> statusEnumList);
 
+    /**
+     * 获取学员机构列表
+     * @param userId
+     * @return
+     */
+    List<Integer> queryStudentTenantId(Integer userId);
+
+    /**
+     * 学生端考级曲库考试列表
+     * @param params
+     * @return
+     */
+    int countStudentBaseExams(Map<String, Object> params);
+
+    /**
+     * 学生端考级曲库考试列表
+     * @param params
+     * @return
+     */
+    List<StudentBaseExamsDto> queryStudentBaseExams(Map<String, Object> params);
 }

+ 17 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamReviewDao.java

@@ -3,7 +3,9 @@ package com.keao.edu.user.dao;
 
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.user.dto.ExamReviewDto;
+import com.keao.edu.user.dto.ExamReviewRecordDto;
 import com.keao.edu.user.entity.ExamReview;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -20,4 +22,19 @@ public interface ExamReviewDao extends BaseDAO<Long, ExamReview> {
     List<ExamReviewDto> findExamResult(Map<String, Object> params);
     int countExamResult(Map<String, Object> params);
 
+    /**
+     * 监考页面评审列表查询
+     * @param params
+     * @return
+     */
+    int countExamReviewRecordList(Map<String, Object> params);
+
+    /**
+     * 监考页面评审列表查询
+     * @param params
+     * @return
+     */
+    List<ExamReviewRecordDto> queryExamReviewRecordList(Map<String, Object> params);
+
+    ExamReview findByRegistrationId(@Param("examRegistrationId") Long examRegistrationId, @Param("teacherId") Integer teacherId);
 }

+ 2 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRoomDao.java

@@ -13,6 +13,8 @@ public interface ExamRoomDao extends BaseDAO<Long, ExamRoom> {
 
     int batchInsert(@Param("examRooms") List<ExamRoom> examRooms);
 
+    int batchUpdate(@Param("examRooms") List<ExamRoom> examRooms);
+
     /**
      * COUNT教师考试列表
      * @param params

+ 26 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamRoomStudentRelationDao.java

@@ -57,6 +57,25 @@ public interface ExamRoomStudentRelationDao extends BaseDAO<Long, ExamRoomStuden
     int deleteWithExamRooms(@Param("examRoomIds") List<Long> examRoomIds);
 
     /**
+     * @describe 获取考级项目下指定分部未发送考试安排的学员
+     * @author Joburgess
+     * @date 2020.07.22
+     * @param examId:
+     * @param organIds:
+     * @return java.util.List<com.keao.edu.user.api.entity.ExamRoomStudentRelation>
+     */
+    List<ExamRoomStudentRelation> getNoSendExamPlanRooms(@Param("examId") Long examId,
+                                                               @Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 获取考试时间在指定日期的考场学生记录
+     * @author Joburgess
+     * @date 2020.07.22
+     * @return java.util.List<com.keao.edu.user.api.entity.ExamRoomStudentRelation>
+     */
+    List<ExamRoomStudentRelation> getTomorrowExamStudents(@Param("day") String day);
+
+    /**
      * 获取教室学员关联
      * @param basicId
      * @param roomId
@@ -130,4 +149,11 @@ public interface ExamRoomStudentRelationDao extends BaseDAO<Long, ExamRoomStuden
      * @return
      */
     String getStudentIds(Long examRoomId);
+
+    /**
+     * 获取学员编号注册编号map
+     * @param examRoomId
+     * @return
+     */
+    List<Map<Integer, String>> getStuRegistrationMap(Long examRoomId);
 }

+ 9 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExamTeacherSalaryDao.java

@@ -40,6 +40,15 @@ public interface ExamTeacherSalaryDao extends BaseDAO<Long, ExamTeacherSalary> {
     List<BaseUserInfoDto> getTeachersWithExam(@Param("examId") Integer examId);
 
     /**
+     * @describe 获取指定老师的分润设置
+     * @author Joburgess
+     * @date 2020.07.20
+     * @param teacherIds:
+     * @return java.util.List<com.keao.edu.user.entity.ExamTeacherSalary>
+     */
+    List<ExamTeacherSalary> getWithTeachers(@Param("teacherIds") List<Integer> teacherIds);
+
+    /**
      * @describe 获取指定考级项目下指定老师的分润设置
      * @author Joburgess
      * @date 2020.07.02

+ 2 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/ExaminationBasicDao.java

@@ -12,6 +12,8 @@ public interface ExaminationBasicDao extends BaseDAO<Long, ExaminationBasic> {
 
     int batchUpdate(@Param("exams") List<ExaminationBasic> exams);
 
+    ExaminationBasic lockExam(@Param("examId") Long examId);
+
     ExaminationBasicDto getExaminationBasic(Integer examId);
 
     List<ExaminationBasicDto> findExaminationBasics(Map<String, Object> params);

+ 7 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/StudentExamResultDao.java

@@ -23,6 +23,7 @@ public interface StudentExamResultDao extends BaseDAO<Long, StudentExamResult> {
      * @return java.util.List<com.keao.edu.user.entity.StudentExamResult>
      */
     List<StudentExamResult> queryStudentExamResult(Map<String, Object> params);
+
     int countStudentExamResult(Map<String, Object> params);
 
     /**
@@ -63,4 +64,10 @@ public interface StudentExamResultDao extends BaseDAO<Long, StudentExamResult> {
      * @return
      */
     StudentExamResultApiDto getStudentExamResultApiDto(Long examRegistrationId);
+
+    /**
+     * 确认考生
+     * @param examRegistrationId
+     */
+    void confirmStudent(Long examRegistrationId);
 }

+ 3 - 2
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/SysUserDao.java

@@ -6,6 +6,7 @@ import com.keao.edu.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 public interface SysUserDao extends BaseDAO<Integer, SysUser> {
 
@@ -42,7 +43,7 @@ public interface SysUserDao extends BaseDAO<Integer, SysUser> {
 	 * 删除用户角色
 	 * @param userIds
 	 */
-	void batchDelEmployeeRole(@Param("userIds") List<Integer> userIds);
+	void batchDelEmployeeRole(@Param("userIds") Set<Integer> userIds);
 
 	/**
 	 * 批量新增用户角色
@@ -55,7 +56,7 @@ public interface SysUserDao extends BaseDAO<Integer, SysUser> {
 	 * @param userIds
 	 * @param roles
 	 */
-	void batchAddEmployeeRoles(@Param("userIds") List<Integer> userIds, @Param("roles") Integer roles);
+	void batchAddEmployeeRoles(@Param("userIds") Set<Integer> userIds, @Param("roles") Integer roles);
 
 	/**
 	 * 获取用户角色

+ 2 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dao/TeacherDao.java

@@ -13,6 +13,8 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
 
     List<Teacher> getWithTeachers(@Param("teacherIds") List<Integer> teacherIds);
 
+    int batchUpdate(@Param("teachers") List<Teacher> teachers);
+
     /**
      * 获取教师声部名
      * @param teacherIds

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

@@ -22,6 +22,9 @@ public class ExamCertificationDto{
     @ApiModelProperty(value = "科目")
     private Integer subjectId;
 
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
     @ApiModelProperty(value = "级别")
     private Integer level;
 
@@ -37,6 +40,14 @@ public class ExamCertificationDto{
     @ApiModelProperty(value = "考试内容")
     private String songJson;
 
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
     public String getSongJson() {
         return songJson;
     }

+ 116 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/ExamReviewRecordDto.java

@@ -0,0 +1,116 @@
+package com.keao.edu.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class ExamReviewRecordDto {
+
+    @ApiModelProperty(value = "学员名称")
+    private String realName;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty(value = "是否录制")
+    private Integer recordFlag;
+
+    @ApiModelProperty(value = "考试状态,是否完成考试")
+    private Integer finishedExam;
+
+    @ApiModelProperty(value = "考试形态,直播还是录播")
+    private Integer confirmStatus;
+
+    @ApiModelProperty(value = "开始录制时间")
+    private Integer recordStartTime;
+
+    @ApiModelProperty(value = "评价")
+    private String evaluationContent;
+
+    @ApiModelProperty(value = "视频地址")
+    private String videoUrl;
+
+    @ApiModelProperty(value = "评分")
+    private Integer evaluationResult;
+
+    @ApiModelProperty(value = "评审编号")
+    private Integer examReviewId;
+
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    public Integer getRecordFlag() {
+        return recordFlag;
+    }
+
+    public void setRecordFlag(Integer recordFlag) {
+        this.recordFlag = recordFlag;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public Integer getFinishedExam() {
+        return finishedExam;
+    }
+
+    public void setFinishedExam(Integer finishedExam) {
+        this.finishedExam = finishedExam;
+    }
+
+    public Integer getConfirmStatus() {
+        return confirmStatus;
+    }
+
+    public void setConfirmStatus(Integer confirmStatus) {
+        this.confirmStatus = confirmStatus;
+    }
+
+    public Integer getRecordStartTime() {
+        return recordStartTime;
+    }
+
+    public void setRecordStartTime(Integer recordStartTime) {
+        this.recordStartTime = recordStartTime;
+    }
+
+    public String getEvaluationContent() {
+        return evaluationContent;
+    }
+
+    public void setEvaluationContent(String evaluationContent) {
+        this.evaluationContent = evaluationContent;
+    }
+
+    public Integer getEvaluationResult() {
+        return evaluationResult;
+    }
+
+    public void setEvaluationResult(Integer evaluationResult) {
+        this.evaluationResult = evaluationResult;
+    }
+
+    public Integer getExamReviewId() {
+        return examReviewId;
+    }
+
+    public void setExamReviewId(Integer examReviewId) {
+        this.examReviewId = examReviewId;
+    }
+}

+ 21 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/RoomStudentListDto.java

@@ -1,20 +1,41 @@
 package com.keao.edu.user.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+
 public class RoomStudentListDto {
+
+    @ApiModelProperty(value = "学员房间关联id")
     private Long examRoomStudentRelationId;
 
+    @ApiModelProperty(value = "学员报名编号")
     private Long examRegistrationId;
 
+    @ApiModelProperty(value = "学员名称")
     private String realName;
 
+    @ApiModelProperty(value = "声部名")
     private String subjectName;
 
+    @ApiModelProperty(value = "签到时间(为空代表未签到)")
+    private String signInTime;
+
+    @ApiModelProperty(value = "级别")
     private Integer level;
 
+    @ApiModelProperty(value = "房间编号")
     private Long examRoomId;
 
+    @ApiModelProperty(value = "学员编号")
     private Integer studentId;
 
+    public String getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(String signInTime) {
+        this.signInTime = signInTime;
+    }
+
     public Long getExamRoomStudentRelationId() {
         return examRoomStudentRelationId;
     }

+ 28 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/StudentBaseExamsDto.java

@@ -0,0 +1,28 @@
+package com.keao.edu.user.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentBaseExamsDto {
+
+    @ApiModelProperty(value = "考试名")
+    private String baseExamName;
+
+    @ApiModelProperty(value = "机构编号")
+    private Integer tenantId;
+
+    public String getBaseExamName() {
+        return baseExamName;
+    }
+
+    public void setBaseExamName(String baseExamName) {
+        this.baseExamName = baseExamName;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+}

+ 196 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/dto/StudentExamListDto.java

@@ -0,0 +1,196 @@
+package com.keao.edu.user.dto;
+
+import com.keao.edu.user.api.enums.ExamEvaluationResultEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class StudentExamListDto{
+    @ApiModelProperty(value = "实际考试开始时间")
+    private java.util.Date actualExamStartTime;
+
+    @ApiModelProperty(value = "实际考试结束时间")
+    private java.util.Date actualExamEndTime;
+
+    @ApiModelProperty(value = "考试项目名称")
+    private String examBaseName;
+
+    @ApiModelProperty(value = "考级项目编号")
+    private Long examinationBasicId;
+
+    @ApiModelProperty(value = "准考证号")
+    private String cardNo;
+
+    @ApiModelProperty(value = "专业")
+    private String subjectName;
+
+    @ApiModelProperty(value = "专业")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "报考级别")
+    private Integer level;
+
+    @ApiModelProperty(value = "乐理级别")
+    private Integer examMusicTheoryLevel;
+
+    @ApiModelProperty(value = "乐理考级费用")
+    private BigDecimal theoryLevelFee;
+
+    @ApiModelProperty(value = "考试地点")
+    private String examAddress;
+
+    @ApiModelProperty(value = "准考证编号")
+    private String examCertificationId;
+
+    @ApiModelProperty(value = "学员报考编号")
+    private Long examRegistrationId;
+
+    @ApiModelProperty(value = "考试结果")
+    private ExamEvaluationResultEnum result;
+
+    @ApiModelProperty(value = "教师评审均分")
+    private Float avgScore;
+
+    @ApiModelProperty(value = "是否参与考试")
+    private Integer isFinishedExam;
+
+    @ApiModelProperty(value = "视频连接")
+    private String videoUrl;
+
+    public String getCardNo() {
+        return cardNo;
+    }
+
+    public void setCardNo(String cardNo) {
+        this.cardNo = cardNo;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Date getActualExamStartTime() {
+        return actualExamStartTime;
+    }
+
+    public void setActualExamStartTime(Date actualExamStartTime) {
+        this.actualExamStartTime = actualExamStartTime;
+    }
+
+    public Date getActualExamEndTime() {
+        return actualExamEndTime;
+    }
+
+    public void setActualExamEndTime(Date actualExamEndTime) {
+        this.actualExamEndTime = actualExamEndTime;
+    }
+
+    public String getExamBaseName() {
+        return examBaseName;
+    }
+
+    public void setExamBaseName(String examBaseName) {
+        this.examBaseName = examBaseName;
+    }
+
+    public Long getExaminationBasicId() {
+        return examinationBasicId;
+    }
+
+    public void setExaminationBasicId(Long examinationBasicId) {
+        this.examinationBasicId = examinationBasicId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public Integer getExamMusicTheoryLevel() {
+        return examMusicTheoryLevel;
+    }
+
+    public void setExamMusicTheoryLevel(Integer examMusicTheoryLevel) {
+        this.examMusicTheoryLevel = examMusicTheoryLevel;
+    }
+
+    public BigDecimal getTheoryLevelFee() {
+        return theoryLevelFee;
+    }
+
+    public void setTheoryLevelFee(BigDecimal theoryLevelFee) {
+        this.theoryLevelFee = theoryLevelFee;
+    }
+
+    public String getExamAddress() {
+        return examAddress;
+    }
+
+    public void setExamAddress(String examAddress) {
+        this.examAddress = examAddress;
+    }
+
+    public String getExamCertificationId() {
+        return examCertificationId;
+    }
+
+    public void setExamCertificationId(String examCertificationId) {
+        this.examCertificationId = examCertificationId;
+    }
+
+    public Long getExamRegistrationId() {
+        return examRegistrationId;
+    }
+
+    public void setExamRegistrationId(Long examRegistrationId) {
+        this.examRegistrationId = examRegistrationId;
+    }
+
+    public ExamEvaluationResultEnum getResult() {
+        return result;
+    }
+
+    public void setResult(ExamEvaluationResultEnum result) {
+        this.result = result;
+    }
+
+    public Float getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Float avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public Integer getIsFinishedExam() {
+        return isFinishedExam;
+    }
+
+    public void setIsFinishedExam(Integer isFinishedExam) {
+        this.isFinishedExam = isFinishedExam;
+    }
+
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+}

+ 3 - 4
edu-user/edu-user-server/src/main/java/com/keao/edu/user/entity/Teacher.java

@@ -2,7 +2,6 @@ package com.keao.edu.user.entity;
 
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.user.enums.TeacherSettlementTypeEnum;
-import com.keao.edu.user.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -29,7 +28,7 @@ public class Teacher {
 	private java.math.BigDecimal salary;
 
 	@ApiModelProperty(value = "是否删除",required = false)
-	private YesOrNoEnum delFlag;
+	private Integer delFlag;
 
 	@ApiModelProperty(value = "总监考次数")
 	private Integer totalInvigilationNum;
@@ -79,11 +78,11 @@ public class Teacher {
 		this.tenantId = tenantId;
 	}
 
-	public YesOrNoEnum getDelFlag() {
+	public Integer getDelFlag() {
 		return delFlag;
 	}
 
-	public void setDelFlag(YesOrNoEnum delFlag) {
+	public void setDelFlag(Integer delFlag) {
 		this.delFlag = delFlag;
 	}
 

+ 25 - 9
edu-user/edu-user-server/src/main/java/com/keao/edu/user/enums/ExamStatusEnum.java

@@ -7,25 +7,33 @@ import com.keao.edu.common.enums.BaseEnum;
  * @Date 2020.06.18
  **/
 public enum ExamStatusEnum implements BaseEnum<String, ExamStatusEnum> {
-    SETTING("SETTING", "设置中"),
-    NOT_START("NOT_START", "未开始"),
-    APPLYING("APPLYING","报名中"),
-    APPLIED("APPLIED", "报名结束"),
-    EXAM_ING("EXAM_ING", "考试中"),
-    EXAM_END("EXAM_END", "考试结束"),
-    RESULT_CONFIRM("RESULT_CONFIRM", "确认考试结果"),
-    CLOSE("CLOSE", "关闭"),
-    DELETE("DELETE", "删除");
+    SETTING("SETTING", "设置中", 1),
+    NOT_START("NOT_START", "未开始", 2),
+    APPLYING("APPLYING","报名中", 3),
+    APPLIED("APPLIED", "报名结束", 4),
+    EXAM_ING("EXAM_ING", "考试中", 5),
+    EXAM_END("EXAM_END", "考试结束", 6),
+    RESULT_CONFIRM("RESULT_CONFIRM", "确认考试结果", 7),
+    CLOSE("CLOSE", "关闭", 7),
+    DELETE("DELETE", "删除", 7);
 
     private String code;
 
     private String msg;
 
+    private int order;
+
     ExamStatusEnum(String code, String msg) {
         this.code = code;
         this.msg = msg;
     }
 
+    ExamStatusEnum(String code, String msg, int order) {
+        this.code = code;
+        this.msg = msg;
+        this.order = order;
+    }
+
     @Override
     public String getCode() {
         return this.code;
@@ -41,4 +49,12 @@ public enum ExamStatusEnum implements BaseEnum<String, ExamStatusEnum> {
 
     public void setMsg(String msg) {
         this.msg = msg;
+    }
+
+    public int getOrder() {
+        return order;
+    }
+
+    public void setOrder(int order) {
+        this.order = order;
     }}

+ 38 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ApplyListQueryInfo.java

@@ -0,0 +1,38 @@
+package com.keao.edu.user.page;
+
+import com.keao.edu.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ApplyListQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "是否缴费",required = false)
+    private Integer paymentStatus;
+
+    private Integer studentId;
+
+    private Long examRegistrationId;
+
+    public Integer getPaymentStatus() {
+        return paymentStatus;
+    }
+
+    public void setPaymentStatus(Integer paymentStatus) {
+        this.paymentStatus = paymentStatus;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public Long getExamRegistrationId() {
+        return examRegistrationId;
+    }
+
+    public void setExamRegistrationId(Long examRegistrationId) {
+        this.examRegistrationId = examRegistrationId;
+    }
+}

+ 11 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ExamReviewQueryInfo.java

@@ -13,6 +13,9 @@ public class ExamReviewQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "学员报名编号")
     private Long registId;
 
+    @ApiModelProperty(value = "考场编号")
+    private Long roomId;
+
     @ApiModelProperty(value = "准考证号")
     private String cardNo;
 
@@ -52,6 +55,14 @@ public class ExamReviewQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "考试结束时间")
     private String examEndTime;
 
+    public Long getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(Long roomId) {
+        this.roomId = roomId;
+    }
+
     public Long getRegistId() {
         return registId;
     }

+ 40 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/page/ExamReviewRecordQueryInfo.java

@@ -0,0 +1,40 @@
+package com.keao.edu.user.page;
+
+import com.keao.edu.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ExamReviewRecordQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "考场编号")
+    private Long roomId;
+
+    @ApiModelProperty(value = "是否评审1是0否")
+    private Integer reviewFlag;
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(Long roomId) {
+        this.roomId = roomId;
+    }
+
+    public Integer getReviewFlag() {
+        return reviewFlag;
+    }
+
+    public void setReviewFlag(Integer reviewFlag) {
+        this.reviewFlag = reviewFlag;
+    }
+}

+ 29 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamOrganizationRelationService.java

@@ -6,6 +6,7 @@ import com.keao.edu.user.dto.ExamOrganStatisticsDto;
 import com.keao.edu.user.dto.ExamOrganizationRelationExtraDto;
 import com.keao.edu.user.entity.ExamOrganizationRelation;
 import com.keao.edu.user.entity.Organization;
+import com.keao.edu.user.enums.ExamStatusEnum;
 import com.keao.edu.user.page.ExamOrganizationRelationQueryInfo;
 
 import java.util.List;
@@ -66,6 +67,34 @@ public interface ExamOrganizationRelationService extends BaseService<Long, ExamO
     void sendUrl(Integer examId, Integer selfOrganId);
 
     /**
+     * @describe 考级项目状态变化推送
+     * @author Joburgess
+     * @date 2020.07.21
+     * @param examId:
+     * @param examStatus:
+     * @return void
+     */
+    void examStatusChangePush(Long examId, ExamStatusEnum examStatus);
+
+    /**
+     * @describe 考级项目时间调整推送
+     * @author Joburgess
+     * @date 2020.07.21
+     * @param examId:
+     * @return void
+     */
+    void examDateChangePush(Long examId);
+
+    /**
+     * @describe 考级项目报名截至推送
+     * @author Joburgess
+     * @date 2020.07.21
+     * @param examId:
+     * @return void
+     */
+    void examRegistCutOffPush(Long examId);
+
+    /**
      * @describe 获取本单位统计信息
      * @author Joburgess
      * @date 2020.07.16

+ 11 - 6
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRegistrationService.java

@@ -4,11 +4,9 @@ package com.keao.edu.user.service;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.common.service.BaseService;
-import com.keao.edu.user.dto.ExamRecordDto;
-import com.keao.edu.user.dto.ExamRegistrationDto;
-import com.keao.edu.user.dto.ExamRegistrationRoomDto;
-import com.keao.edu.user.dto.ExamRegistrationStatisticsDto;
+import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.ExamRegistration;
+import com.keao.edu.user.page.ApplyListQueryInfo;
 import com.keao.edu.user.page.ExamRecordQueryInfo;
 import com.keao.edu.user.page.ExamRegistrationQueryInfo;
 
@@ -43,14 +41,14 @@ public interface ExamRegistrationService extends BaseService<Long, ExamRegistrat
     * @param queryInfo
     * @return
     */
-   PageInfo<ExamRegistrationDto> applyList(QueryInfo queryInfo);
+   PageInfo<ExamRegistrationDto> applyList(ApplyListQueryInfo queryInfo);
 
    /**
     * 考试记录
     * @param queryInfo
     * @return
     */
-   PageInfo<ExamRecordDto> examList(ExamRecordQueryInfo queryInfo);
+   PageInfo<StudentExamListDto> examList(ExamRecordQueryInfo queryInfo);
 
 
    /**
@@ -67,4 +65,11 @@ public interface ExamRegistrationService extends BaseService<Long, ExamRegistrat
     * @return
     */
    Map<String,Object> repay(Integer userId,String orderNo) throws Exception;
+
+   /**
+    * 学生端考级曲库考试列表
+    * @param queryInfo
+    * @return
+    */
+   PageInfo<StudentBaseExamsDto> studentBaseExams(QueryInfo queryInfo);
 }

+ 14 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamReviewService.java

@@ -4,8 +4,10 @@ package com.keao.edu.user.service;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.service.BaseService;
 import com.keao.edu.user.dto.ExamReviewDto;
+import com.keao.edu.user.dto.ExamReviewRecordDto;
 import com.keao.edu.user.entity.ExamReview;
 import com.keao.edu.user.page.ExamReviewQueryInfo;
+import com.keao.edu.user.page.ExamReviewRecordQueryInfo;
 
 public interface ExamReviewService extends BaseService<Long, ExamReview> {
 
@@ -18,4 +20,16 @@ public interface ExamReviewService extends BaseService<Long, ExamReview> {
      */
     PageInfo<ExamReviewDto> findExamResult(ExamReviewQueryInfo queryInfo);
 
+    /**
+     * 监考页面评审列表查询
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<ExamReviewRecordDto> queryExamReviewRecordList(ExamReviewRecordQueryInfo queryInfo);
+
+    /**
+     * 老师评审
+     * @param examReview
+     */
+    void add(ExamReview examReview);
 }

+ 8 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRoomService.java

@@ -63,6 +63,14 @@ public interface ExamRoomService extends BaseService<Long, ExamRoom> {
     void sendExamPlan(Integer organId, Integer examId, Integer operatorId);
 
     /**
+     * @describe 明日考试提醒
+     * @author Joburgess
+     * @date 2020.07.22
+     * @return void
+     */
+    void tomorrowExamPlanRemind();
+
+    /**
      * @describe 获取考场统计信息
      * @author Joburgess
      * @date 2020.06.30

+ 8 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamRoomStudentRelationService.java

@@ -76,7 +76,7 @@ public interface ExamRoomStudentRelationService extends BaseService<Long, ExamRo
      */
     void nextBit(Long nextExamRoomStudentRelationId, Long examRoomStudentRelationId, Integer examStatus,Long roomId);
 
-    public void publishMessage(ExamRoomStudentRelation examRoomStudentRelation);
+    public void publishMessage(ExamRoomStudentRelation examRoomStudentRelation,Integer action,Boolean isPush);
 
     public PublishMessageDto getPublishMessage(Long examRegistrationId);
 
@@ -125,4 +125,11 @@ public interface ExamRoomStudentRelationService extends BaseService<Long, ExamRo
     void deleteWithExamRooms(List<Long> examRoomIds);
 
     String getStudentIds(Long examRoomId);
+
+    /**
+     * 获取学员编号注册编号map
+     * @param examRoomId
+     * @return
+     */
+    List<Map<Integer, String>> getStuRegistrationMap(Long examRoomId);
 }

+ 9 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/ExamTeacherSalaryService.java

@@ -51,6 +51,15 @@ public interface ExamTeacherSalaryService extends BaseService<Long, ExamTeacherS
     void addExamTeacherSalary(Long examId, String teacherIdsStr);
 
     /**
+     * @describe 更新
+     * @author Joburgess
+     * @date 2020.07.20
+     * @param examTeacherSalary:
+     * @return void
+     */
+    void updateExamTeacherSalary(ExamTeacherSalary examTeacherSalary);
+
+    /**
      * @describe 获取指定考级项目可排考教师
      * @author Joburgess
      * @date 2020.07.02

+ 6 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/StudentExamResultService.java

@@ -35,4 +35,10 @@ public interface StudentExamResultService extends BaseService<Long, StudentExamR
      * @return
      */
     StudentExamResultApiDto getStudentExamResultApiDto(Long id);
+
+    /**
+     * 确认考生
+     * @param examRegistrationId
+     */
+    void confirmStudent(Long examRegistrationId);
 }

+ 2 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/EmployeeServiceImpl.java

@@ -132,7 +132,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
 		Organization organization = organizationDao.findByUserId(employee.getUserId());
 		if(organization != null){
 			List<Organization> childOrgans = organizationDao.getChildOrgans(organization.getParentOrganIdTag());
-			List<Integer> userIds = childOrgans.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+			Set<Integer> userIds = childOrgans.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+			userIds.add(sysUser.getId());
 
 			sysUserDao.batchDelEmployeeRole(userIds);
 			if(sysUser.getRoles() != null){

+ 1 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamCertificationServiceImpl.java

@@ -81,7 +81,7 @@ public class ExamCertificationServiceImpl extends BaseServiceImpl<Long, ExamCert
 		ExamCertificationDto examCertificationDto = examCertificationDao.getExamCertificationDto(examRegistrationId);
 		Subject subject = subjectDao.get(examCertificationDto.getSubjectId());
 		examCertificationDto.setSubjectName(subject.getName());
-		Student student = studentService.getStudent(examCertificationDto.getSubjectId());
+		Student student = studentService.getStudent(examCertificationDto.getStudentId());
 		examCertificationDto.setRealName(student.getRealName());
 		examCertificationDto.setGender(student.getGender());
 		examCertificationDto.setCertificatePhoto(student.getCertificatePhoto());

+ 18 - 16
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamManualLedgerServiceImpl.java

@@ -7,7 +7,6 @@ import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
 import com.keao.edu.user.dao.ExamManualLedgerDao;
 import com.keao.edu.user.dao.ExamOrganizationRelationDao;
-import com.keao.edu.user.dao.SysUserDao;
 import com.keao.edu.user.dto.ExamManualLedgerStatisticsDto;
 import com.keao.edu.user.entity.ExamManualLedger;
 import com.keao.edu.user.entity.ExamOrganizationRelation;
@@ -19,6 +18,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 @Service
@@ -27,8 +27,6 @@ public class ExamManualLedgerServiceImpl extends BaseServiceImpl<Long, ExamManua
 	@Autowired
 	private ExamManualLedgerDao examManualLedgerDao;
 	@Autowired
-	private SysUserDao sysUserDao;
-	@Autowired
 	private ExamOrganizationRelationDao examOrganizationRelationDao;
 
 	@Override
@@ -45,19 +43,19 @@ public class ExamManualLedgerServiceImpl extends BaseServiceImpl<Long, ExamManua
 		if(Objects.isNull(examManualLedger.getAmount())){
 			throw new BizException("请指定交易金额");
 		}
-		sysUserDao.lockUser(examManualLedger.getOperatorUserId());
-		if(Objects.nonNull(examManualLedger.getOrganId())&&examManualLedger.getOrganId()>0){
-			ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examManualLedger.getExaminationBasicId(), examManualLedger.getOrganId());
+//		examinationBasicDao.lockExam(examManualLedger.getExaminationBasicId());
+		if(Objects.nonNull(examManualLedger.getTargetOrganId())&&examManualLedger.getTargetOrganId()<=0){
+			examManualLedger.setTargetOrganId(null);
+		}
+		examManualLedgerDao.insert(examManualLedger);
+		if(Objects.nonNull(examManualLedger.getTargetOrganId())&&examManualLedger.getTargetOrganId()>0){
+			ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examManualLedger.getExaminationBasicId(), examManualLedger.getTargetOrganId());
 			if(Objects.isNull(examOrganizationRelation)){
 				throw new BizException("合作单位信息异常");
 			}
-			examOrganizationRelation.setTotalTransAmount(examOrganizationRelation.getTotalTransAmount().add(examManualLedger.getAmount()));
+			examOrganizationRelation.setTotalTransAmount(examManualLedgerDao.countOrganLedgerWithExam(examManualLedger.getExaminationBasicId(), examManualLedger.getTargetOrganId()));
 			examOrganizationRelationDao.update(examOrganizationRelation);
 		}
-		if(Objects.nonNull(examManualLedger.getOrganId())&&examManualLedger.getOrganId()<=0){
-			examManualLedger.setOrganId(null);
-		}
-		examManualLedgerDao.insert(examManualLedger);
 	}
 
 	@Override
@@ -83,17 +81,21 @@ public class ExamManualLedgerServiceImpl extends BaseServiceImpl<Long, ExamManua
 		if(Objects.isNull(id)){
 			throw new BizException("请指定需要删除的支出记录");
 		}
-		sysUserDao.lockUser(operatorId);
 		ExamManualLedger examManualLedger = examManualLedgerDao.get(id);
-		if(Objects.nonNull(examManualLedger.getOrganId())&&examManualLedger.getOrganId()>0){
-			ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examManualLedger.getExaminationBasicId(), examManualLedger.getOrganId());
+//		examinationBasicDao.lockExam(examManualLedger.getExaminationBasicId());
+		examManualLedgerDao.delete(id);
+		if(Objects.nonNull(examManualLedger.getTargetOrganId())&&examManualLedger.getTargetOrganId()>0){
+			ExamOrganizationRelation examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examManualLedger.getExaminationBasicId(), examManualLedger.getTargetOrganId());
 			if(Objects.isNull(examOrganizationRelation)){
 				throw new BizException("合作单位信息异常");
 			}
-			examOrganizationRelation.setTotalTransAmount(examOrganizationRelation.getTotalTransAmount().subtract(examManualLedger.getAmount()));
+			BigDecimal amount = examManualLedgerDao.countOrganLedgerWithExam(examManualLedger.getExaminationBasicId(), examManualLedger.getTargetOrganId());
+			if(Objects.isNull(amount)){
+				amount=BigDecimal.ZERO;
+			}
+			examOrganizationRelation.setTotalTransAmount(amount);
 			examOrganizationRelationDao.update(examOrganizationRelation);
 		}
-		examManualLedgerDao.delete(id);
 	}
 
 	@Override

+ 108 - 4
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamOrganizationRelationServiceImpl.java

@@ -12,6 +12,7 @@ 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;
 import com.keao.edu.user.dto.ExamOrganizationRelationExtraDto;
@@ -105,7 +106,7 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 
 	@Override
 	public List<ExamOrganizationRelationExtraDto> getChildOrgans(Long examId, Integer organId) {
-		List<Integer> childOrganIds = organizationService.getChildOrganIds(organId, false);
+		List<Integer> childOrganIds = organizationService.getChildOrganIds(organId, true);
 		return examOrganizationRelationDao.getExamChildOrgans(examId,childOrganIds);
 	}
 
@@ -306,9 +307,9 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			throw new BizException("考级项目已关闭");
 		}
 
-		StringBuffer expectRegistTime = new StringBuffer(DateUtil.dateToString(examinationBasic.getEnrollStartTime(), "yyyy年MM月dd日"));
+		StringBuffer expectRegistTime = new StringBuffer(DateUtil.dateToString(examinationBasic.getEnrollStartTime(), "yyyy年MM月dd日 HH时mm分"));
 		expectRegistTime.append("-");
-		expectRegistTime.append(DateUtil.dateToString(examinationBasic.getEnrollStartTime(), "yyyy年MM月dd日"));
+		expectRegistTime.append(DateUtil.dateToString(examinationBasic.getEnrollEndTime(), "yyyy年MM月dd日 HH时mm分"));
 
 		TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(examinationBasic.getOrganId());
 		if(Objects.isNull(tenantInfo)){
@@ -340,7 +341,7 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 			userPhoneMap.put(examOrgan.getOrganId(), organUser.getPhone());
 
 			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGISTRATION_URL_SMS,
-					userPhoneMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME,
+					userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
 					tenantInfo.getName(), examinationBasic.getName(), expectRegistTime.toString(), examOrgan.getUrl());
 		}
 
@@ -357,6 +358,109 @@ public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, E
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void examStatusChangePush(Long examId, ExamStatusEnum examStatus) {
+		if(Objects.isNull(examId)||Objects.isNull(examStatus)){
+			return;
+		}
+		ExaminationBasic exam = examinationBasicDao.get(examId);
+		if(Objects.isNull(exam)){
+			return;
+		}
+
+		MessageTypeEnum messageType=null;
+
+		switch (examStatus){
+			case APPLIED:
+				messageType = MessageTypeEnum.EXAM_REGISTRATION_CLOSE_SMS;
+				break;
+			case CLOSE:
+				messageType = MessageTypeEnum.EXAM_CLOSE_SMS;
+				break;
+		}
+
+		if(Objects.isNull(messageType)){
+			return;
+		}
+
+		TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
+		List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
+		Map<Integer, String> userPhoneMap = new HashMap<>();
+		for (ExamOrganizationRelation examOrgan : examOrgans) {
+			if(examOrgan.getOrganId().equals(exam.getOrganId())){
+				continue;
+			}
+			userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
+		}
+
+		if(CollectionUtils.isEmpty(userPhoneMap)){
+			return;
+		}
+
+		sysMessageService.batchSendMessage(messageType,
+				userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+				tenantInfo.getName(), exam.getName());
+	}
+
+	@Override
+	public void examDateChangePush(Long examId) {
+		if(Objects.isNull(examId)){
+			return;
+		}
+		ExaminationBasic exam = examinationBasicDao.get(examId);
+		if(Objects.isNull(exam)){
+			return;
+		}
+
+		TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
+		List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
+		Map<Integer, String> userPhoneMap = new HashMap<>();
+		for (ExamOrganizationRelation examOrgan : examOrgans) {
+			if(examOrgan.getOrganId().equals(exam.getOrganId())){
+				continue;
+			}
+			userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
+		}
+
+		if(CollectionUtils.isEmpty(userPhoneMap)){
+			return;
+		}
+
+		String enrollStartTimeStr = DateUtil.dateToString(exam.getEnrollStartTime(), "yyyy年MM月dd日 HH时mm分");
+		String enrollEndTimeStr = DateUtil.dateToString(exam.getEnrollEndTime(), "yyyy年MM月dd日 HH时mm分");
+
+		sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGIST_TIME_CHANGE_SMS,
+				userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+				tenantInfo.getName(), exam.getName(), enrollStartTimeStr, enrollEndTimeStr);
+	}
+
+	@Override
+	public void examRegistCutOffPush(Long examId) {
+		if(Objects.isNull(examId)){
+			return;
+		}
+		ExaminationBasic exam = examinationBasicDao.get(examId);
+		if(Objects.isNull(exam)){
+			return;
+		}
+
+		TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
+		List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
+		Map<Integer, String> userPhoneMap = new HashMap<>();
+		for (ExamOrganizationRelation examOrgan : examOrgans) {
+			userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
+		}
+
+		if(CollectionUtils.isEmpty(userPhoneMap)){
+			return;
+		}
+
+		sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGIST_EXPIRE_SMS,
+				userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+				tenantInfo.getName(), exam.getName());
+	}
+
+	@Override
 	public ExamOrganStatisticsDto getExamOrganStatistics(Integer organId, Long examId) {
 		if(Objects.isNull(examId)){
 			throw new BizException("请指定考级项目");

+ 57 - 14
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRegistrationServiceImpl.java

@@ -1,21 +1,25 @@
 package com.keao.edu.user.service.impl;
 
 
+import com.keao.edu.auth.api.client.SysUserFeignService;
+import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.enums.MessageTypeEnum;
 import com.keao.edu.common.exception.BizException;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.common.service.IdGeneratorService;
+import com.keao.edu.common.service.SysMessageService;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
+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.ExamRecordDto;
-import com.keao.edu.user.dto.ExamRegistrationDto;
-import com.keao.edu.user.dto.ExamRegistrationRoomDto;
-import com.keao.edu.user.dto.ExamRegistrationStatisticsDto;
+import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.*;
 import com.keao.edu.user.enums.ExamStatusEnum;
 import com.keao.edu.user.enums.StudentRegistrationStatusEnum;
 import com.keao.edu.user.enums.TransStatusEnum;
+import com.keao.edu.user.page.ApplyListQueryInfo;
 import com.keao.edu.user.page.ExamRecordQueryInfo;
 import com.keao.edu.user.page.ExamRegistrationQueryInfo;
 import com.keao.edu.user.service.ExamRegistrationPaymentService;
@@ -54,6 +58,12 @@ public class ExamRegistrationServiceImpl extends BaseServiceImpl<Long, ExamRegis
     private ExamRegistrationPaymentService examRegistrationPaymentService;
     @Autowired
     private OrganizationDao organizationDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private SysUserDao sysUserDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     @Override
     public BaseDAO<Long, ExamRegistration> getDAO() {
@@ -207,10 +217,12 @@ public class ExamRegistrationServiceImpl extends BaseServiceImpl<Long, ExamRegis
     }
 
     @Override
-    public PageInfo<ExamRegistrationDto> applyList(QueryInfo queryInfo) {
+    public PageInfo<ExamRegistrationDto> applyList(ApplyListQueryInfo queryInfo) {
         PageInfo<ExamRegistrationDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        params.put("studentId",sysUser.getId());
 
         List<ExamRegistrationDto> dataList = null;
         int count = examRegistrationDao.countStudentList(params);
@@ -232,27 +244,21 @@ public class ExamRegistrationServiceImpl extends BaseServiceImpl<Long, ExamRegis
     }
 
     @Override
-    public PageInfo<ExamRecordDto> examList(ExamRecordQueryInfo queryInfo) {
-        PageInfo<ExamRecordDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+    public PageInfo<StudentExamListDto> examList(ExamRecordQueryInfo queryInfo) {
+        PageInfo<StudentExamListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
 
-        List<ExamRecordDto> dataList = null;
+        List<StudentExamListDto> dataList = null;
         int count = examRegistrationDao.countExamList(params);
         if (count > 0) {
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = examRegistrationDao.queryExamList(params);
             List<Integer> subjectIds = dataList.stream().map(e -> e.getSubjectId()).collect(Collectors.toList());
-            List<Long> basicIds = dataList.stream().map(e -> e.getExaminationBasicId()).collect(Collectors.toList());
-            List<Integer> registrationIds = dataList.stream().map(e -> e.getId()).collect(Collectors.toList());
             Map<Integer, String> subjectNameMap = this.getMap("subject", "id_", "name_", subjectIds, Integer.class, String.class);
-            Map<Integer, String> examNameMap = this.getMap("examination_basic", "id_", "name_", basicIds, Integer.class, String.class);
-            Map<Integer, String> certificationNameMap = this.getMap("exam_certification", "exam_registration_id_", "card_no_", registrationIds, Integer.class, String.class);
             dataList.forEach(e -> {
                 e.setSubjectName(subjectNameMap.get(e.getSubjectId()));
-                e.setSubjectName(examNameMap.get(e.getExaminationBasicId()));
-                e.setSubjectName(certificationNameMap.get(e.getId()));
             });
         }
         if (count == 0) {
@@ -278,6 +284,21 @@ public class ExamRegistrationServiceImpl extends BaseServiceImpl<Long, ExamRegis
                 && !StudentRegistrationStatusEnum.AUDIT_REJECT.equals(examRegistration.getStatus())) {
             throw new BizException("审核状态错误");
         }
+        Map<Integer, String> receiverMap = new HashMap<>(1);
+        receiverMap.put(er.getStudentId(), er.getStudentId().toString());
+        if(StudentRegistrationStatusEnum.AUDIT_PASS.equals(examRegistration.getStatus())){
+            sysMessageService.batchSendMessage(MessageTypeEnum.REGIST_PASS_PUSH,
+                    receiverMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME);
+        }else if(StudentRegistrationStatusEnum.AUDIT_REJECT.equals(examRegistration.getStatus())){
+            sysMessageService.batchSendMessage(MessageTypeEnum.REGIST_REJECT_PUSH,
+                    receiverMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME);
+
+            SysUser student = sysUserDao.get(er.getStudentId());
+            Map<Integer, String> phoneMap = new HashMap<>(1);
+            phoneMap.put(er.getStudentId(), student.getPhone());
+            sysMessageService.batchSendMessage(MessageTypeEnum.REGIST_REJECT_SMS,
+                    phoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME);
+        }
         examRegistrationDao.update(examRegistration);
     }
 
@@ -329,4 +350,26 @@ public class ExamRegistrationServiceImpl extends BaseServiceImpl<Long, ExamRegis
         rpMap.put("payMap", payMap);
         return rpMap;
     }
+
+    @Override
+    public PageInfo<StudentBaseExamsDto> studentBaseExams(QueryInfo queryInfo) {
+        PageInfo<StudentBaseExamsDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        params.put("studentId",sysUser.getId());
+        List<StudentBaseExamsDto> dataList = null;
+        params.put("paymentStatus",1);
+        int count = examRegistrationDao.countStudentBaseExams(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = examRegistrationDao.queryStudentBaseExams(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

+ 47 - 1
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamReviewServiceImpl.java

@@ -1,19 +1,24 @@
 package com.keao.edu.user.service.impl;
 
 
+import com.keao.edu.auth.api.client.SysUserFeignService;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.common.exception.BizException;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
+import com.keao.edu.user.api.entity.ExamRoomStudentRelation;
 import com.keao.edu.user.dao.ExamReviewDao;
 import com.keao.edu.user.dto.ExamReviewDto;
+import com.keao.edu.user.dto.ExamReviewRecordDto;
 import com.keao.edu.user.entity.ExamReview;
 import com.keao.edu.user.entity.ExaminationBasic;
 import com.keao.edu.user.entity.Subject;
 import com.keao.edu.user.enums.YesOrNoEnum;
 import com.keao.edu.user.page.ExamReviewQueryInfo;
+import com.keao.edu.user.page.ExamReviewRecordQueryInfo;
 import com.keao.edu.user.service.ExamReviewService;
+import com.keao.edu.user.service.ExamRoomStudentRelationService;
 import com.keao.edu.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,7 +36,9 @@ public class ExamReviewServiceImpl extends BaseServiceImpl<Long, ExamReview> imp
 	@Autowired
 	private ExamReviewDao examReviewDao;
 	@Autowired
-	private OrganizationServiceImpl organizationService;
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private ExamRoomStudentRelationService examRoomStudentRelationService;
 
 	@Override
 	public BaseDAO<Long, ExamReview> getDAO() {
@@ -73,6 +80,45 @@ public class ExamReviewServiceImpl extends BaseServiceImpl<Long, ExamReview> imp
 	}
 
 	@Override
+	public PageInfo<ExamReviewRecordDto> queryExamReviewRecordList(ExamReviewRecordQueryInfo queryInfo) {
+		PageInfo<ExamReviewRecordDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		List<ExamReviewRecordDto> dataList = null;
+		int count = examReviewDao.countExamReviewRecordList(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = examReviewDao.queryExamReviewRecordList(params);
+			List<Integer> collect = dataList.stream().map(e -> e.getStudentId()).collect(Collectors.toList());
+			Map<Integer, String> realNames = getMap("sys_user", "id_", "real_name_", collect,Integer.class,String.class);
+			dataList.forEach(e->{
+				e.setRealName(realNames.get(e.getStudentId()));
+			});
+			pageInfo.setRows(dataList);
+		}
+		return pageInfo;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void add(ExamReview examReview) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		Long examRegistrationId = examReview.getExamRegistrationId();
+		ExamReview byRegistrationId = examReviewDao.findByRegistrationId(examRegistrationId,sysUser.getId());
+		if(byRegistrationId != null){
+			throw new BizException("评审失败,请勿重复操作");
+		}
+		ExamRoomStudentRelation examRoomStudentRelation = examRoomStudentRelationService.getExamRoomStudentRelation(examRegistrationId);
+		examReview.setExaminationBasicId(examRoomStudentRelation.getExaminationBasicId());
+		examReview.setTeacherId(sysUser.getId());
+		examReview.setStudentId(examRoomStudentRelation.getStudentId());
+		examReview.setExamRoomId(examRoomStudentRelation.getExamRoomId());
+		examReview.setTeacherId(Integer.parseInt(examRoomStudentRelation.getTenantId()));
+		examReviewDao.insert(examReview);
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public int update(ExamReview examReview) {
 		if(Objects.isNull(examReview.getId())){

+ 209 - 22
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRoomServiceImpl.java

@@ -3,18 +3,18 @@ package com.keao.edu.user.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.keao.edu.auth.api.client.SysMessageFeignService;
 import com.keao.edu.auth.api.client.SysUserFeignService;
-import com.keao.edu.auth.api.entity.SysMessageParams;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.common.enums.MessageTypeEnum;
-import com.keao.edu.common.enums.YesOrNoEnum;
 import com.keao.edu.common.exception.BizException;
 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.im.api.client.ImFeignService;
+import com.keao.edu.thirdparty.message.provider.JiguangPushPlugin;
+import com.keao.edu.thirdparty.message.provider.YimeiSmsPlugin;
 import com.keao.edu.user.api.entity.ExamRoom;
 import com.keao.edu.user.api.entity.ExamRoomStudentRelation;
 import com.keao.edu.user.api.enums.ExamModeEnum;
@@ -40,6 +40,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -73,7 +74,9 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
-	private SysMessageFeignService sysMessageFeignService;
+	private SysMessageService sysMessageService;
+	@Autowired
+	private ExamRoomStudentRelationDao examRoomStudentRelationDao;
 
 	@Override
 	public BaseDAO<Long, ExamRoom> getDAO() {
@@ -162,7 +165,7 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		}
 
 		examRoom.setTenantId(TenantContextHolder.getTenantId());
-		examRoom.setExamPlanPushFlag(YesOrNoEnum.NO);
+		examRoom.setExamPlanPushFlag(0);
 		examRoom.setExamRoomStudentNum(0);
 		if(StringUtils.isBlank(examRoom.getExamTimeJson())){
 			examRoomDao.insert(examRoom);
@@ -173,6 +176,10 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		teacherIds.add(examRoom.getMainTeacherUserId());
 		if(StringUtils.isNotBlank(examRoom.getAssistantTeacherUserIdList())){
 			teacherIds.addAll(Arrays.stream(examRoom.getAssistantTeacherUserIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList()));
+			HashSet<Integer> noRepeatTeacherIds = new HashSet<>(teacherIds);
+			if(teacherIds.size()!=noRepeatTeacherIds.size()){
+				throw new BizException("主考老师与监考老师不可重复");
+			}
 		}
 
 		Map<Integer, String> teacherIdNameMap = this.getMap("sys_user", "id_", "real_name_", teacherIds, Integer.class, String.class);
@@ -239,6 +246,8 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 			throw new BizException("请指定教室");
 		}
 
+		ExamRoom existExamRoom = examRoomDao.get(examRoom.getId());
+
 		if(ExamModeEnum.ONLINE.equals(examRoom.getExamMode())){
 			examRoom.setExamLocationId(null);
 		}
@@ -247,6 +256,10 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		teacherIds.add(examRoom.getMainTeacherUserId());
 		if(StringUtils.isNotBlank(examRoom.getAssistantTeacherUserIdList())){
 			teacherIds.addAll(Arrays.stream(examRoom.getAssistantTeacherUserIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList()));
+			HashSet<Integer> noRepeatTeacherIds = new HashSet<>(teacherIds);
+			if(teacherIds.size()!=noRepeatTeacherIds.size()){
+				throw new BizException("主考老师与监考老师不可重复");
+			}
 		}
 
 		Map<Integer, String> teacherIdNameMap = this.getMap("sys_user", "id_", "real_name_", teacherIds, Integer.class, String.class);
@@ -265,7 +278,18 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 		Map<Integer, String> subjectIdNameMap = this.getMap("subject", "id_", "name_", subjectIds, Integer.class, String.class);
 		examRoom.setSubjectNameList(StringUtils.join(subjectIdNameMap.values(),","));
 
+		if(Objects.isNull(examRoom.getExamStartTime())){
+			examRoom.setExamStartTime(existExamRoom.getExamStartTime());
+		}
+		if(Objects.isNull(examRoom.getExamEndTime())){
+			examRoom.setExamEndTime(existExamRoom.getExamEndTime());
+		}
+
+		List<ExamRoom> examRooms=new ArrayList<>(Arrays.asList(examRoom));
+		checkRoomTeachers(examRooms);
+
 		examRoomDao.update(examRoom);
+		examTeacherSalaryService.teacherSalarySettlementWithExam(examRoom.getExaminationBasicId());
 		return examRoom;
 	}
 
@@ -294,14 +318,172 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void sendExamPlan(Integer organId, Integer examId, Integer operatorId) {
-		List<Integer> nextLevelOrganIds = organizationService.getNextLevelOrganIds(organId, true);
-		int withoutExamRoomStudentNum = examRegistrationDao.countWithoutExamRoomStudentNum(nextLevelOrganIds, examId);
+		if(Objects.isNull(examId)){
+			throw new BizException("请指定考级项目");
+		}
+		ExaminationBasic exam = examinationBasicDao.get(examId.longValue());
+		if(Objects.isNull(exam)){
+			throw new BizException("考级项目不存在");
+		}
+
+		int withoutExamRoomStudentNum = examRegistrationDao.countWithoutExamRoomStudentNum(null, examId);
 		if(withoutExamRoomStudentNum>0){
 			throw new BizException("存在未安排教室的学员");
 		}
-
 		examLifecycleLogDao.insert(new ExamLifecycleLog(examId, "确认考试安排", operatorId));
+		List<ExamRoomStudentRelation> examRoomStudentWithOrgans = examRoomStudentRelationDao.getNoSendExamPlanRooms(examId.longValue(), null);
+
+		Set<Integer> locationIds = examRoomStudentWithOrgans.stream().filter(e -> Objects.nonNull(e.getExamLocationId())).map(ExamRoomStudentRelation::getExamLocationId).collect(Collectors.toSet());
+		Map<Integer, String> idLocationMap = this.getMap("exam_location", "id_", "name_", new ArrayList(locationIds), Integer.class, String.class);
+
+		Set<Integer> allStudentIds = examRoomStudentWithOrgans.stream().map(ExamRoomStudentRelation::getStudentId).collect(Collectors.toSet());
+		Map<Integer, String> idPhoneMap = this.getMap("sys_user", "id_", "phone_", new ArrayList(allStudentIds), Integer.class, String.class);
+
+		Map<Long, List<ExamRoomStudentRelation>> examRoomStudentMap = examRoomStudentWithOrgans.stream().collect(Collectors.groupingBy(ExamRoomStudentRelation::getExamRoomId));
+
+		Map<Integer, List<ExamRoom>> teacherExamRoomsMap = new HashMap<>();
+
+		List<ExamRoom> needUpdateExamRooms = new ArrayList<>();
+
+		for (Map.Entry<Long, List<ExamRoomStudentRelation>> examRoomStudentEntry : examRoomStudentMap.entrySet()) {
+			List<ExamRoomStudentRelation> students = examRoomStudentEntry.getValue();
+			Set<Integer> studentIds = students.stream().map(ExamRoomStudentRelation::getStudentId).collect(Collectors.toSet());
+			if(CollectionUtils.isEmpty(studentIds)){
+				continue;
+			}
+			ExamRoom examRoom=students.get(0);
+			examRoom.setId(students.get(0).getExamRoomId());
+
+			needUpdateExamRooms.add(new ExamRoom(examRoom.getId(), 1));
+
+			if(!teacherExamRoomsMap.containsKey(examRoom.getMainTeacherUserId())){
+				teacherExamRoomsMap.put(examRoom.getMainTeacherUserId(), new ArrayList<>());
+			}
+			teacherExamRoomsMap.get(examRoom.getMainTeacherUserId()).add(examRoom);
+			if(StringUtils.isNotBlank(examRoom.getAssistantTeacherUserIdList())){
+				Set<Integer> ateacherIds = Arrays.stream(examRoom.getAssistantTeacherUserIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toSet());
+				for (Integer ateacherId : ateacherIds) {
+					if(!teacherExamRoomsMap.containsKey(ateacherId)){
+						teacherExamRoomsMap.put(ateacherId, new ArrayList<>());
+					}
+					teacherExamRoomsMap.get(ateacherId).add(examRoom);
+				}
+			}
+
+			Map<Integer, String> receiverMap = studentIds.stream().collect(Collectors.toMap(e->e, e->e.toString()));
+			Map<Integer, String> phoneMap = idPhoneMap.entrySet().stream().filter(e->studentIds.contains(e.getKey())).collect(Collectors.toMap(e->e.getKey(), e->e.getValue()));
+
+			MessageTypeEnum pushMessageType = MessageTypeEnum.EXAM_ROOM_CONFIRM_ONLINE_STUDENT_PUSH;
+			MessageTypeEnum smsMessageType = MessageTypeEnum.EXAM_ROOM_CONFIRM_ONLINE_STUDENT_SMS;
+
+			String examName = exam.getName();
+
+			String examDayStr = DateUtil.dateToString(examRoom.getExamStartTime(), "MM月dd日");
+			StringBuffer examTimeStr = new StringBuffer();
+			examTimeStr.append(DateUtil.dateToString(examRoom.getExamStartTime(), "HH时mm分"));
+			examTimeStr.append("-");
+			examTimeStr.append(DateUtil.dateToString(examRoom.getExamEndTime(), "HH时mm分"));
+
+			String locationName = "网络考场";
+			if(ExamModeEnum.OFFLINE.equals(examRoom.getExamMode())){
+				pushMessageType = MessageTypeEnum.EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_PUSH;
+				smsMessageType = MessageTypeEnum.EXAM_ROOM_CONFIRM_OFFLINE_STUDENT_SMS;
+				locationName=idLocationMap.get(examRoom.getExamLocationId());
+			}
+			sysMessageService.batchSendMessage(pushMessageType,
+					receiverMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME,
+					examName, examDayStr, examTimeStr, locationName);
+			sysMessageService.batchSendMessage(smsMessageType,
+					phoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+					examName, examDayStr, examTimeStr, locationName);
+		}
+
+		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分");
+			int examRoomNum = teacherRoomEntry.getValue().size();
+			Map<Integer, String> phoneMap = new HashMap<>();
+			phoneMap.put(teacherRoomEntry.getKey(), teacherPhone);
+			sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_ROOM_CONFIRM_TEACHER_SMS,
+												phoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+												exam.getName(), examStartTimeStr, examRoomNum);
+		}
+
+		if(!CollectionUtils.isEmpty(needUpdateExamRooms)){
+			examRoomDao.batchUpdate(needUpdateExamRooms);
+		}
+	}
+
+	@Override
+	public void tomorrowExamPlanRemind() {
+		LocalDate tomorrowDate = LocalDate.now().plusDays(1);
+		List<ExamRoomStudentRelation> tomorrowExamStudents = examRoomStudentRelationDao.getTomorrowExamStudents(tomorrowDate.toString());
+		if(CollectionUtils.isEmpty(tomorrowExamStudents)){
+			return;
+		}
+
+		Set<Integer> allStudentIds = tomorrowExamStudents.stream().map(ExamRoomStudentRelation::getStudentId).collect(Collectors.toSet());
+		Map<Integer, String> idPhoneMap = this.getMap("sys_user", "id_", "phone_", new ArrayList(allStudentIds), Integer.class, String.class);
+
+		Map<Long, List<ExamRoomStudentRelation>> examRoomStudentMap = tomorrowExamStudents.stream().collect(Collectors.groupingBy(ExamRoomStudentRelation::getExamRoomId));
+
+		Map<Integer, List<ExamRoom>> teacherExamRoomsMap = new HashMap<>();
+
+		for (Map.Entry<Long, List<ExamRoomStudentRelation>> examRoomStudentEntry : examRoomStudentMap.entrySet()) {
+			List<ExamRoomStudentRelation> students = examRoomStudentEntry.getValue();
+			Set<Integer> studentIds = students.stream().map(ExamRoomStudentRelation::getStudentId).collect(Collectors.toSet());
+			if(CollectionUtils.isEmpty(studentIds)){
+				continue;
+			}
+			ExamRoom examRoom=students.get(0);
+			examRoom.setId(students.get(0).getExamRoomId());
+
+			if(!teacherExamRoomsMap.containsKey(examRoom.getMainTeacherUserId())){
+				teacherExamRoomsMap.put(examRoom.getMainTeacherUserId(), new ArrayList<>());
+			}
+			teacherExamRoomsMap.get(examRoom.getMainTeacherUserId()).add(examRoom);
+			if(StringUtils.isNotBlank(examRoom.getAssistantTeacherUserIdList())){
+				Set<Integer> ateacherIds = Arrays.stream(examRoom.getAssistantTeacherUserIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toSet());
+				for (Integer ateacherId : ateacherIds) {
+					if(!teacherExamRoomsMap.containsKey(ateacherId)){
+						teacherExamRoomsMap.put(ateacherId, new ArrayList<>());
+					}
+					teacherExamRoomsMap.get(ateacherId).add(examRoom);
+				}
+			}
+
+			Map<Integer, String> receiverMap = studentIds.stream().collect(Collectors.toMap(e->e, e->e.toString()));
+			Map<Integer, String> phoneMap = idPhoneMap.entrySet().stream().filter(e->studentIds.contains(e.getKey())).collect(Collectors.toMap(e->e.getKey(), e->e.getValue()));
+
+			String examDayStr = DateUtil.dateToString(examRoom.getExamStartTime(), "MM月dd日");
+			StringBuffer examTimeStr = new StringBuffer();
+			examTimeStr.append(DateUtil.dateToString(examRoom.getExamStartTime(), "HH时mm分"));
+
+
+			sysMessageService.batchSendMessage(MessageTypeEnum.BEFORE_EXAM_STUDENT_REMIND_PUSH,
+					receiverMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME,
+					examDayStr, examTimeStr.toString());
+			sysMessageService.batchSendMessage(MessageTypeEnum.BEFORE_EXAM_STUDENT_REMIND_SMS,
+					phoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+					examDayStr, examTimeStr.toString());
+		}
+
+		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分");
+			int examRoomNum = teacherRoomEntry.getValue().size();
+			Map<Integer, String> phoneMap = new HashMap<>();
+			phoneMap.put(teacherRoomEntry.getKey(), teacherPhone);
+			sysMessageService.batchSendMessage(MessageTypeEnum.BEFORE_EXAM_TEACHER_REMIND_SMS,
+					phoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
+					examStartTimeStr, examRoomNum);
+		}
 	}
 
 	@Override
@@ -398,6 +580,9 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 				}
 				ExamRoom preExamRoom=teacherRooms.get(i-1);
 				ExamRoom currentExamRoom = teacherRooms.get(i);
+				if(Objects.nonNull(preExamRoom.getId())&&preExamRoom.getId().equals(currentExamRoom.getId())){
+					continue;
+				}
 				if(preExamRoom.getExamEndTime().compareTo(currentExamRoom.getExamStartTime())>0){
 					SysUser sysUser = sysUserDao.get(teacherRoomEntry.getKey());
 					throw new BizException("{}教师时间存在冲突", sysUser.getRealName());
@@ -421,33 +606,35 @@ public class ExamRoomServiceImpl extends BaseServiceImpl<Long, ExamRoom> impleme
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void changeExamRoom(Long examRoomId, Integer openFlag) {
-		ExamRoom examRoom = new ExamRoom();
+		ExamRoom examRoom = examRoomDao.get(examRoomId);
 		examRoom.setId(examRoomId);
 		examRoom.setOpenFlag(openFlag);
 		examRoomDao.update(examRoom);
 		//加群退群
 		if(openFlag == 1){
 			String studentIds = examRoomStudentRelationService.getStudentIds(examRoomId);
-			StringBuffer stringBuffer = new StringBuffer(examRoom.getMainTeacherUserId());
-			if(StringUtils.isNotEmpty(stringBuffer)){
-				stringBuffer.append(",").append(studentIds);
-			}
-			if(StringUtils.isNotEmpty(examRoom.getAssistantTeacherUserIdList())){
-				stringBuffer.append(",").append(examRoom.getAssistantTeacherUserIdList());
-			}
-			imFeignService.joinGroup(stringBuffer.toString(),examRoomId.toString(),examRoomId.toString());
-			//推送消息
+			StringBuffer stringBuffer = new StringBuffer();
+			stringBuffer.append(examRoom.getMainTeacherUserId());
 			if(StringUtils.isNotEmpty(studentIds)){
-
+				stringBuffer.append(",").append(studentIds);
+				//推送消息
 				String[] split = studentIds.split(",");
 				Map<Integer, String> userPhoneMap = new HashMap<>(split.length);
+//				Map<Integer, String> map = MapUtil.convertMybatisMap(examRoomStudentRelationService.getStuRegistrationMap(examRoomId), Integer.class, String.class);
+
 				for (String s : split) {
 					userPhoneMap.put(Integer.parseInt(s),s);
 				}
-				SysMessageParams sysMessageParams=new SysMessageParams(MessageTypeEnum.STUDENT_EXAM_START,
-						userPhoneMap, null, 0, null, null);
-				sysMessageFeignService.batchSendMessage(sysMessageParams);
+//				String notifyUrl = "?examRegistrationId=" + studentExtraExercise.getId() + "&studentCourseHomeworkId=" + studentExtraExercise.getId() + "&extra=1";
+//				String extra = "dayaedu" + notifyUrl + "&userId=" + studentId;
+				sysMessageService.batchSendMessage(MessageTypeEnum.ACTION_EXAM_SIGN_PUSH,
+						userPhoneMap, null, 0, null, JiguangPushPlugin.PLUGIN_NAME);
 			}
+			if(StringUtils.isNotEmpty(examRoom.getAssistantTeacherUserIdList())){
+				stringBuffer.append(",").append(examRoom.getAssistantTeacherUserIdList());
+			}
+			imFeignService.joinGroup(stringBuffer.toString(),examRoomId.toString(),examRoomId.toString());
+
 		}else {
 			SysUser sysUser = sysUserFeignService.queryUserInfo();
 			imFeignService.dismissGroup(sysUser.getId().toString(),examRoomId.toString());

+ 35 - 18
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamRoomStudentRelationServiceImpl.java

@@ -192,7 +192,7 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 			studentExamRoom.setExamRoomId(examRoomId);
 			studentExamRoom.setExamRegistrationId(examRegistration.getId().longValue());
 			studentExamRoom.setStudentId(examRegistration.getStudentId());
-			studentExamRoom.setClassroomSwitch(YesOrNoEnum.NO);
+			studentExamRoom.setClassroomSwitch(0);
 			examRoomStudentRelationDao.insert(studentExamRoom);
 			return;
 		}
@@ -276,11 +276,11 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 			ExamRoomStudentRelation examRoomStudentRelation = examRoomStudentRelationDao.get(examRoomStudentRelationId);
 			//将当前学员退出教室并添加参考状态,如果考试未完成,清除签到时间,重新签到
 			//关闭学员房间入口
-			examRoomStudentRelation.setClassroomSwitch(YesOrNoEnum.NO);
+			examRoomStudentRelation.setClassroomSwitch(0);
 			examRoomStudentRelationDao.update(examRoomStudentRelation);
-			publishMessage(examRoomStudentRelation);
+			publishMessage(examRoomStudentRelation,MemberChangedMessage.Action_Recorded,true);
 		}
-		nextStudent(nextExamRoomStudentRelationId);
+		nextStudent(nextExamRoomStudentRelationId,false);
 	}
 
 	@Override
@@ -319,7 +319,13 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 	}
 
 	@Override
+	public List<Map<Integer, String>> getStuRegistrationMap(Long examRoomId) {
+		return examRoomStudentRelationDao.getStuRegistrationMap(examRoomId);
+	}
+
+	@Override
 	public void nextBit(Long nextExamRoomStudentRelationId, Long currentExamRoomStudentRelationId, Integer examStatus,Long examRoomId) {
+		Boolean isPush = true;
 		if(currentExamRoomStudentRelationId != null){
 			ExamRoomStudentRelation examRoomStudentRelation = examRoomStudentRelationDao.get(currentExamRoomStudentRelationId);
 			//将当前学员退出教室并添加参考状态,如果考试未完成,清除签到时间,重新签到
@@ -332,11 +338,11 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 				studentExamResultDao.endExam(examRoomStudentRelation.getExamRegistrationId());
 			}
 			//关闭学员房间入口
-			examRoomStudentRelation.setClassroomSwitch(YesOrNoEnum.NO);
+			examRoomStudentRelation.setClassroomSwitch(0);
 			examRoomStudentRelationDao.update(examRoomStudentRelation);
-			publishMessage(examRoomStudentRelation);
+			publishMessage(examRoomStudentRelation,MemberChangedMessage.Student_Queue,isPush);
 		}
-		nextStudent(nextExamRoomStudentRelationId);
+		nextStudent(nextExamRoomStudentRelationId,false);
 
 		/*try {
 			SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -347,25 +353,31 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 		}*/
 	}
 
-	private void nextStudent(Long nextExamRoomStudentRelationId){
+	private void nextStudent(Long nextExamRoomStudentRelationId,Boolean isPush){
 		if(nextExamRoomStudentRelationId != null){
 			ExamRoomStudentRelation examRoomStudentRelation = examRoomStudentRelationDao.get(nextExamRoomStudentRelationId);
 			//开启学员房间入口
-			examRoomStudentRelation.setClassroomSwitch(YesOrNoEnum.YES);
+			examRoomStudentRelation.setClassroomSwitch(1);
 			examRoomStudentRelationDao.update(examRoomStudentRelation);
-			publishMessage(examRoomStudentRelation);
+			publishMessage(examRoomStudentRelation,MemberChangedMessage.Student_Queue,isPush);
 		}
 	}
 
 	@Override
-	public void publishMessage(ExamRoomStudentRelation examRoomStudentRelation){
+	public void publishMessage(ExamRoomStudentRelation examRoomStudentRelation,Integer action,Boolean isPush){
+		if (!isPush){
+			return;
+		}
 		PublishMessageDto publishMessageDto = new PublishMessageDto();
 		String userId = examRoomStudentRelation.getStudentId().toString();
 		publishMessageDto.setUserId(userId);
 		publishMessageDto.setRoomId(examRoomStudentRelation.getExamRoomId().toString());
-		MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Student_Queue, userId,3);
-		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId()));
-		msg.setAppParamJson(jsonString);
+		MemberChangedMessage msg = new MemberChangedMessage(action, userId,3);
+//		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId()));
+		NeedCheckingDetailDto needCheckingDetailDto = examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId());
+		msg.setWaitNum(needCheckingDetailDto.getWaitNum());
+		msg.setClassroomSwitch(needCheckingDetailDto.getClassroomSwitch());
+//		msg.setAppParamJson(jsonString);
 		Map<String,Object> paramMap = new HashMap<>(2);
 		this.queryNeedCheckingList(examRoomStudentRelation.getExamRoomId());
 		paramMap.put("studentQueue",this.queryNeedCheckingList(examRoomStudentRelation.getExamRoomId()));
@@ -382,8 +394,11 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 		publishMessageDto.setUserId(userId);
 		publishMessageDto.setRoomId(examRoomStudentRelation.getExamRoomId().toString());
 		MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Student_Queue, userId,3);
-		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId()));
-		msg.setAppParamJson(jsonString);
+//		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId()));
+//		msg.setAppParamJson(jsonString);
+		NeedCheckingDetailDto needCheckingDetailDto = examCertificationService.needCheckingDetail(examRoomStudentRelation.getExamRegistrationId());
+		msg.setWaitNum(needCheckingDetailDto.getWaitNum());
+		msg.setClassroomSwitch(needCheckingDetailDto.getClassroomSwitch());
 		Map<String,Object> paramMap = new HashMap<>(2);
 		this.queryNeedCheckingList(examRoomStudentRelation.getExamRoomId());
 		paramMap.put("studentQueue",this.queryNeedCheckingList(examRoomStudentRelation.getExamRoomId()));
@@ -424,8 +439,10 @@ public class ExamRoomStudentRelationServiceImpl extends BaseServiceImpl<Long, Ex
 		publishMessageDto.setUserId(userId);
 		publishMessageDto.setRoomId(studentExamRoom.getExamRoomId().toString());
 		MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Student_Queue, userId,3);
-		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRegistrationId));
-		msg.setAppParamJson(jsonString);
+//		String jsonString = JSONObject.toJSONString(examCertificationService.needCheckingDetail(examRegistrationId));
+		NeedCheckingDetailDto needCheckingDetailDto = examCertificationService.needCheckingDetail(examRegistrationId);
+//		msg.setAppParamJson(needCheckingDetailDto.getWaitNum());
+		msg.setWaitNum(needCheckingDetailDto.getWaitNum());
 		publishMessageDto.setMemberChangedMessage(msg);
 		imFeignService.publishMessage(publishMessageDto);
 	}

+ 14 - 2
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamSongServiceImpl.java

@@ -1,20 +1,21 @@
 package com.keao.edu.user.service.impl;
 
+import com.keao.edu.auth.api.client.SysUserFeignService;
+import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
 import com.keao.edu.common.exception.BizException;
 import com.keao.edu.common.page.PageInfo;
 import com.keao.edu.common.page.QueryInfo;
 import com.keao.edu.common.service.impl.BaseServiceImpl;
+import com.keao.edu.user.dao.ExamRegistrationDao;
 import com.keao.edu.user.dao.ExamSongDao;
 import com.keao.edu.user.entity.ExamSong;
 import com.keao.edu.user.page.ExamSongQueryInfo;
 import com.keao.edu.user.service.ExamSongService;
 import com.keao.edu.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 
@@ -23,6 +24,10 @@ public class ExamSongServiceImpl extends BaseServiceImpl<Integer, ExamSong> impl
 	
 	@Autowired
 	private ExamSongDao examSongDao;
+	@Autowired
+	private ExamRegistrationDao examRegistrationDao;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@Override
 	public BaseDAO<Integer, ExamSong> getDAO() {
@@ -72,8 +77,15 @@ public class ExamSongServiceImpl extends BaseServiceImpl<Integer, ExamSong> impl
     @Override
     public PageInfo<ExamSong> querySongPage(ExamSongQueryInfo queryInfo) {
         PageInfo<ExamSong> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+	    //获取学员所在机构
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        List<Integer> tenantIds = examRegistrationDao.queryStudentTenantId(sysUser.getId());
+        if(tenantIds == null || tenantIds.size() == 0){
+            return pageInfo;
+        }
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
+//        params.put("tenantIds",tenantIds);
 
         List<ExamSong> dataList = new ArrayList<>();
         int count = examSongDao.countSongPage(params);

+ 50 - 3
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExamTeacherSalaryServiceImpl.java

@@ -11,6 +11,7 @@ import com.keao.edu.user.dao.*;
 import com.keao.edu.user.dto.*;
 import com.keao.edu.user.entity.ExamTeacherSalary;
 import com.keao.edu.user.entity.Teacher;
+import com.keao.edu.user.enums.TeacherSettlementTypeEnum;
 import com.keao.edu.user.page.ExamTeacherSalaryQueryInfo;
 import com.keao.edu.user.service.ExamTeacherSalaryService;
 import com.keao.edu.util.collection.MapUtil;
@@ -48,7 +49,7 @@ public class ExamTeacherSalaryServiceImpl extends BaseServiceImpl<Long, ExamTeac
 	public void teacherSalarySettlementWithExam(Long examId) {
 		List<ExamRoom> examRooms = examRoomDao.getWithExam(null, examId);
 		if(CollectionUtils.isEmpty(examRooms)){
-			return;
+			examRooms=Collections.EMPTY_LIST;
 		}
 
 		Map<Integer, List<ExamRoom>> teacherExamRoomMap=new HashMap<>();
@@ -83,9 +84,42 @@ public class ExamTeacherSalaryServiceImpl extends BaseServiceImpl<Long, ExamTeac
 			long studentNum = examRoomStudentRelations.stream().filter(e -> examRoomIds.contains(e.getExamRoomId())).count();
 			examTeacherSalary.setTotalInvigilationNum(examRoomIds.size());
 			examTeacherSalary.setTotalInvigilationStudentNum((int) studentNum);
-			examTeacherSalary.setTotalSettlementCost(examTeacherSalary.getShareProfitAmount().multiply(new BigDecimal(studentNum)));
+			if(TeacherSettlementTypeEnum.SINGLE.equals(examTeacherSalary.getSettlementType())){
+				examTeacherSalary.setTotalSettlementCost(examTeacherSalary.getShareProfitAmount().multiply(new BigDecimal(examRoomIds.size())));
+			}else if(TeacherSettlementTypeEnum.PEOPLE_NUM.equals(examTeacherSalary.getSettlementType())){
+				examTeacherSalary.setTotalSettlementCost(examTeacherSalary.getShareProfitAmount().multiply(new BigDecimal(studentNum)));
+			}
+
+		}
+		if(!CollectionUtils.isEmpty(examTeacherSalaries)){
+			examTeacherSalaryDao.batchUpdate(examTeacherSalaries);
+			Set<Integer> teacherIds = examTeacherSalaries.stream().map(ExamTeacherSalary::getTeacherId).collect(Collectors.toSet());
+			List<ExamTeacherSalary> teacherAllExamSalarys = examTeacherSalaryDao.getWithTeachers(new ArrayList<>(teacherIds));
+			Map<Integer, List<ExamTeacherSalary>> teacherExamSalarysMap = teacherAllExamSalarys.stream().collect(Collectors.groupingBy(ExamTeacherSalary::getTeacherId));
+			List<Teacher> updateTeachers=new ArrayList<>();
+			for (Integer teacherId : teacherIds) {
+				List<ExamTeacherSalary> examSalarys = teacherExamSalarysMap.get(teacherId);
+				Integer totalInvigilationNum=0;
+				Integer totalInvigilationStudentNum=0;
+				BigDecimal totalSettlementCost=BigDecimal.ZERO;
+				if(!CollectionUtils.isEmpty(examSalarys)){
+					for (ExamTeacherSalary examSalary : examSalarys) {
+						totalInvigilationNum += examSalary.getTotalInvigilationNum();
+						totalInvigilationStudentNum += examSalary.getTotalInvigilationStudentNum();
+						totalSettlementCost=totalSettlementCost.add(examSalary.getTotalSettlementCost());
+					}
+				}
+				Teacher teacher=new Teacher();
+				teacher.setUserId(teacherId);
+				teacher.setTotalInvigilationNum(totalInvigilationNum);
+				teacher.setTotalInvigilationStudentNum(totalInvigilationStudentNum);
+				teacher.setTotalSettlementCost(totalSettlementCost);
+				updateTeachers.add(teacher);
+			}
+			if(!CollectionUtils.isEmpty(updateTeachers)){
+				teacherDao.batchUpdate(updateTeachers);
+			}
 		}
-		examTeacherSalaryDao.batchUpdate(examTeacherSalaries);
 	}
 
 	@Override
@@ -161,6 +195,19 @@ public class ExamTeacherSalaryServiceImpl extends BaseServiceImpl<Long, ExamTeac
 	}
 
 	@Override
+	public void updateExamTeacherSalary(ExamTeacherSalary examTeacherSalary) {
+		if(Objects.isNull(examTeacherSalary.getId())){
+			throw new BizException("参数错误");
+		}
+		ExamTeacherSalary exist = examTeacherSalaryDao.get(examTeacherSalary.getId());
+		if(Objects.isNull(exist)){
+			throw new BizException("参数错误");
+		}
+		examTeacherSalaryDao.update(examTeacherSalary);
+		teacherSalarySettlementWithExam(exist.getExaminationBasicId());
+	}
+
+	@Override
 	public List<BaseUserInfoDto> getExamTeachers(Integer examId) {
 		if(Objects.isNull(examId)){
 			throw new BizException("请指定考级项目");

+ 23 - 9
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/ExaminationBasicServiceImpl.java

@@ -1,12 +1,14 @@
 package com.keao.edu.user.service.impl;
 
-import com.alibaba.druid.pool.DruidDataSource;
 import com.keao.edu.auth.api.entity.SysUser;
 import com.keao.edu.common.dal.BaseDAO;
+import com.keao.edu.common.enums.MessageTypeEnum;
 import com.keao.edu.common.exception.BizException;
 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.user.api.enums.ExamModeEnum;
 import com.keao.edu.user.dao.*;
 import com.keao.edu.user.dto.ExaminationBasicDto;
@@ -50,6 +52,8 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
     private OrganizationService organizationService;
     @Autowired
     private ExamLifecycleLogDao examLifecycleLogDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     @Override
     public BaseDAO<Long, ExaminationBasic> getDAO() {
@@ -123,24 +127,24 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
         }
         Date now = new Date();
         for (ExaminationBasic exam : exams) {
-            if (!ExamStatusEnum.APPLYING.equals(exam.getStatus())
+            if (exam.getStatus().getOrder()<ExamStatusEnum.APPLYING.getOrder()
                     &&now.compareTo(exam.getEnrollStartTime()) >= 0
                     && now.compareTo(exam.getEnrollEndTime()) <= 0) {
                 exam.setStatus(ExamStatusEnum.APPLYING);
                 examLifecycleLogDao.insert(new ExamLifecycleLog(exam.getId().intValue(), "报名已开启", null, "定时任务自动更新"));
                 continue;
-            }
-            if (!ExamStatusEnum.APPLIED.equals(exam.getStatus())
+            }else if (exam.getStatus().getOrder()<ExamStatusEnum.APPLIED.getOrder()
                     &&now.compareTo(exam.getEnrollEndTime()) >= 0) {
                 exam.setStatus(ExamStatusEnum.APPLIED);
                 examLifecycleLogDao.insert(new ExamLifecycleLog(exam.getId().intValue(), "报名已结束", null,"定时任务自动更新"));
+                examOrganizationRelationService.examRegistCutOffPush(exam.getId());
                 continue;
             }
-            if (Objects.nonNull(exam.getActualExamEndTime())
-                    &&ExamStatusEnum.EXAM_END.equals(exam.getStatus())
-                    &&now.compareTo(exam.getActualExamEndTime()) >= 0) {
-                exam.setStatus(ExamStatusEnum.EXAM_END);
-            }
+//            if (Objects.nonNull(exam.getActualExamEndTime())
+//                    &&exam.getStatus().getOrder()<ExamStatusEnum.EXAM_END.getOrder()
+//                    &&now.compareTo(exam.getActualExamEndTime()) >= 0) {
+//                exam.setStatus(ExamStatusEnum.EXAM_END);
+//            }
         }
         examinationBasicDao.batchUpdate(exams);
     }
@@ -167,6 +171,7 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "确认考试结果", operatorId));
         }else if(ExamStatusEnum.CLOSE.equals(statusEnum)){
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "关闭考级项目", operatorId));
+            examOrganizationRelationService.examStatusChangePush(examId, statusEnum);
         }
         if(ExamStatusEnum.CLOSE.equals(existsExam.getStatus())){
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "开启考级项目", operatorId));
@@ -178,6 +183,7 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
         if(ExamStatusEnum.APPLYING.equals(existsExam.getStatus())&&ExamStatusEnum.APPLIED.equals(statusEnum)){
             existsExam.setEnrollEndTime(new Date());
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "关闭报名连接", operatorId));
+            examOrganizationRelationService.examStatusChangePush(examId, statusEnum);
         }
         existsExam.setStatus(statusEnum);
         examinationBasicDao.update(existsExam);
@@ -272,6 +278,8 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
             examinationBasic.setExamLocationNameList(StringUtils.join(organNameMap.values(),","));
         }
 
+        boolean examRegistIsChange=false;
+
         if(Objects.nonNull(examinationBasic.getEnrollStartTime())
                 &&examinationBasic.getEnrollStartTime().compareTo(existsExam.getEnrollStartTime())!=0){
             if(ExamStatusEnum.EXAM_ING.equals(existsExam.getStatus())||
@@ -279,6 +287,7 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
                 throw new BizException("无法修改");
             }
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "修改报名时间", operatorId));
+            examRegistIsChange=true;
         }
         if(Objects.nonNull(examinationBasic.getEnrollEndTime())
                 &&examinationBasic.getEnrollEndTime().compareTo(existsExam.getEnrollEndTime())!=0){
@@ -287,6 +296,7 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
                 throw new BizException("无法修改");
             }
             examLifecycleLogDao.insert(new ExamLifecycleLog(existsExam.getId().intValue(), "修改报名时间", operatorId));
+            examRegistIsChange=true;
         }
         if(Objects.nonNull(examinationBasic.getEnrollStartTime())&&Objects.nonNull(examinationBasic.getEnrollEndTime())&&!ExamStatusEnum.SETTING.equals(existsExam.getStatus())){
             if(examinationBasic.getEnrollStartTime().compareTo(examinationBasic.getEnrollEndTime())>=0){
@@ -303,6 +313,9 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
         }
 
         examinationBasicDao.update(examinationBasic);
+        if(examRegistIsChange){
+            examOrganizationRelationService.examDateChangePush(examinationBasic.getId());
+        }
     }
 
     @Override
@@ -327,6 +340,7 @@ public class ExaminationBasicServiceImpl extends BaseServiceImpl<Long, Examinati
         examinationBasic.setMemo(reason);
         examinationBasic.setStatus(ExamStatusEnum.CLOSE);
         examinationBasicDao.update(examinationBasic);
+        examOrganizationRelationService.examStatusChangePush(examId.longValue(), ExamStatusEnum.CLOSE);
     }
 
     @Override

+ 29 - 7
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/OrganizationServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.util.CollectionUtils;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 @Service
@@ -76,10 +77,10 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 //			if(!user.getTenantId().equals(tenantId)){
 //				throw new BizException("手机号已被占用");
 //			}
-			if(StringUtils.isNotEmpty(user.getUserType()) && user.getUserType().contains("SYSTEM")){
+			if(StringUtils.isNotEmpty(user.getUserType())){
 				throw new BizException("手机号已被占用");
 			}
-			Organization organization = organDao.get(user.getId());
+			Organization organization = organDao.findByUserId(user.getId());
 			if(organization == null){
 				if(StringUtils.isEmpty(user.getPassword())){
 					sysUser.setPassword(new BCryptPasswordEncoder().encode("123456"));
@@ -93,14 +94,34 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 					sysUserDao.batchAddEmployeeRole(user.getId(),sysUser.getRoles());
 				}else {
 					Integer roleIds = sysUserDao.queryRoleIds(queryUserInfo.getId());
-					sysUserDao.batchAddEmployeeRole(sysUser.getId(),roleIds);
+					sysUserDao.batchAddEmployeeRole(user.getId(),roleIds);
 				}
-				if(!user.getUserType().contains("SYSTEM")){
-					user.setUserType(user.getUserType() + ",SYSTEM");
+				if(StringUtils.isNotEmpty(user.getUserType())){
+					if(!user.getUserType().contains("SYSTEM")){
+						user.setUserType(user.getUserType() + ",SYSTEM");
+					}
+				}else {
+					user.setUserType("SYSTEM");
 				}
 				user.setRealName(organ.getContactName());
 				user.setPhone(organ.getContactPhone());
 				sysUserDao.update(user);
+				Employee employee = employeeDao.get(user.getId());
+				if(employee == null){
+					employee = new Employee();
+					employee.setOrganId(organ.getId());
+					employee.setUserId(user.getId());
+					employee.setTenantId(organ.getTenantId());
+					employee.setEmployeeType("ORGAN");
+					employeeDao.insert(employee);
+				}else {
+					employee.setDelFlag(false);
+					employee.setOrganId(organ.getId());
+					employee.setUserId(user.getId());
+					employee.setTenantId(organ.getTenantId());
+					employee.setEmployeeType("ORGAN");
+					employeeDao.update(employee);
+				}
 			}else if(organization.getDelFlag() == YesOrNoEnum.YES){
 				SysUser sysUser1 = organization.getSysUser();
 				if(StringUtils.isEmpty(sysUser1.getUserType())){
@@ -133,7 +154,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		}
 		sysUser.setPassword(new BCryptPasswordEncoder().encode("123456"));
 		sysUser.setUserType("SYSTEM");
-		sysUser.setRealName(organ.getName());
+		sysUser.setRealName(organ.getContactName());
 		sysUser.setPhone(organ.getContactPhone());
 		sysUserDao.insert(sysUser);
 
@@ -183,7 +204,8 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 		organDao.update(organization);
 
 		List<Organization> childOrgans = organDao.getChildOrgans(organization1.getParentOrganIdTag());
-		List<Integer> userIds = childOrgans.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+		Set<Integer> userIds = childOrgans.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+		userIds.add(sysUser.getId());
 
 		sysUserDao.batchDelEmployeeRole(userIds);
 		if(sysUser.getRoles() != null){

+ 5 - 0
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/StudentExamResultServiceImpl.java

@@ -125,4 +125,9 @@ public class StudentExamResultServiceImpl extends BaseServiceImpl<Long, StudentE
 		resultApiDto.setRoomId(studentExamRoom.getExamRoomId().toString());
 		return resultApiDto;
 	}
+
+	@Override
+	public void confirmStudent(Long examRegistrationId) {
+		studentExamResultDao.confirmStudent(examRegistrationId);
+	}
 }

+ 8 - 3
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/StudentServiceImpl.java

@@ -10,10 +10,12 @@ import com.keao.edu.im.api.client.ImFeignService;
 import com.keao.edu.im.api.entity.ImResult;
 import com.keao.edu.im.api.entity.ImUserModel;
 import com.keao.edu.user.api.entity.Student;
+import com.keao.edu.user.dao.EmployeeDao;
 import com.keao.edu.user.dao.StudentDao;
 import com.keao.edu.user.dao.StudentExamResultDao;
 import com.keao.edu.user.dao.SysUserDao;
 import com.keao.edu.user.dto.StudentExamPaymentDto;
+import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.page.StudentApplyQueryInfo;
 import com.keao.edu.user.service.StudentService;
 import com.keao.edu.util.collection.MapUtil;
@@ -40,6 +42,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private SysUserDao sysUserDao;
     @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
     private StudentExamResultDao studentExamResultDao;
     @Autowired
     private ImFeignService imFeignService;
@@ -58,6 +62,10 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
         SysUser user = sysUserDao.queryByPhone(sysUser.getPhone());
         if (user != null && user.getId() != null) {
+            Employee employee = employeeDao.get(user.getId());
+            if(employee != null && employee.getDelFlag() == false && employee.getEmployeeType().equals("ORGAN")){
+                throw new BizException("手机号被占用");
+            }
             Student stu = studentDao.get(user.getId());
             if (stu == null) {
                 student.setUserId(user.getId());
@@ -71,9 +79,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             }
             return;
         }
-//        Organization organization = organizationService.get(student.getOrganId());
-//        student.setTenantId(organization.getTenantId());
-//        sysUser.setTenantId(organization.getTenantId());
         sysUser.setUserType("STUDENT");
         sysUserDao.insert(sysUser);
         ImResult imResult = imFeignService.register(new ImUserModel(sysUser.getId().toString(), sysUser.getRealName(), null));

+ 2 - 2
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/SubjectServiceImpl.java

@@ -10,12 +10,12 @@ import com.keao.edu.user.entity.Subject;
 import com.keao.edu.user.enums.YesOrNoEnum;
 import com.keao.edu.user.page.SubjectQueryInfo;
 import com.keao.edu.user.service.SubjectService;
+import com.keao.edu.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implements SubjectService {

+ 10 - 10
edu-user/edu-user-server/src/main/java/com/keao/edu/user/service/impl/TeacherServiceImpl.java

@@ -10,11 +10,11 @@ import com.keao.edu.common.service.impl.BaseServiceImpl;
 import com.keao.edu.im.api.client.ImFeignService;
 import com.keao.edu.im.api.entity.ImResult;
 import com.keao.edu.im.api.entity.ImUserModel;
+import com.keao.edu.user.dao.EmployeeDao;
 import com.keao.edu.user.dao.SysUserDao;
 import com.keao.edu.user.dao.TeacherDao;
 import com.keao.edu.user.entity.Employee;
 import com.keao.edu.user.entity.Teacher;
-import com.keao.edu.user.enums.YesOrNoEnum;
 import com.keao.edu.user.page.TeacherQueryInfo;
 import com.keao.edu.user.service.TeacherService;
 import com.keao.edu.util.collection.MapUtil;
@@ -34,6 +34,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 	@Autowired
 	private SysUserDao sysUserDao;
 	@Autowired
+	private EmployeeDao employeeDao;
+	@Autowired
 	private ImFeignService imFeignService;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
@@ -46,17 +48,14 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public int add(Teacher teacher) {
-//		SysUser queryUserInfo = sysUserFeignService.queryUserInfo();
 		SysUser sysUser = teacher.getSysUser();
 		SysUser user = sysUserDao.queryByPhone(sysUser.getPhone());
 		Date date = new Date();
-//		String tenantId = queryUserInfo.getTenantId();
-//		teacher.setTenantId(tenantId);
-//		sysUser.setTenantId(tenantId);
 		if(user != null && user.getId() != null){
-//			if(!user.getTenantId().equals(tenantId)){
-//				throw new BizException("手机号已被占用");
-//			}
+			Employee employee = employeeDao.get(user.getId());
+			if(employee != null && employee.getDelFlag() == false && employee.getEmployeeType().equals("ORGAN")){
+				throw new BizException("手机号被占用");
+			}
 			Integer id = user.getId();
 			sysUser.setId(id);
 			Teacher teacher1 = teacherDao.get(id);
@@ -70,14 +69,15 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
 				}
 				sysUser.setUpdateTime(date);
 				sysUserDao.update(sysUser);
-			}else if (teacher1.getDelFlag() == YesOrNoEnum.YES){
+			}else if (teacher1.getDelFlag() == 1){
+				teacher.setUserId(id);
 				if(StringUtils.isEmpty(user.getUserType())){
 					sysUser.setUserType("TEACHER");
 				}else {
 					sysUser.setUserType(user.getUserType() + ",TEACHER");
 				}
 				sysUserDao.update(sysUser);
-				teacher.setDelFlag(YesOrNoEnum.NO);
+				teacher.setDelFlag(0);
 				teacherDao.update(teacher);
 			}else {
 				throw new BizException("用户已存在");

+ 1 - 1
edu-user/edu-user-server/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

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

@@ -115,7 +115,7 @@
 	</select>
 
 	<select id="getExamCertificationDto" resultMap="ExamCertificationDtoMap">
-		SELECT ec.exam_registration_id_,ec.exam_start_time_,ec.subject_id_,ec.level_,ec.exam_address_,er.song_json_,ec.card_no_
+		SELECT ec.exam_registration_id_,ec.exam_start_time_,ec.subject_id_,ec.level_,ec.exam_address_,er.song_json_,ec.card_no_,er.student_id_
 		FROM exam_registration er
 		LEFT JOIN exam_certification ec ON er.id_ = ec.exam_registration_id_
 		WHERE er.id_ = #{examRegistrationId} LIMIT 1
@@ -126,6 +126,7 @@
 		<result column="card_no_" property="cardNo" />
 		<result column="song_json_" property="songJson" />
 		<result column="subject_id_" property="subjectId" />
+		<result column="student_id_" property="studentId" />
 		<result column="level_" property="level" />
 		<result column="address_" property="examAddress" />
 	</resultMap>

+ 1 - 1
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamLocationMapper.xml

@@ -75,7 +75,7 @@
 				AND is_available_=#{isAvailable}
 			</if>
 			<if test="search!=null">
-				AND (id_=#{search} OR name_ LIKE CONCAT('%', #{serch}, '%'))
+				AND (id_=#{search} OR name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
 			<if test="tenantId != null and tenantId!=0">
 				AND tenant_id_ = #{tenantId}

+ 10 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamManualLedgerMapper.xml

@@ -147,4 +147,14 @@
 				#{day}
 			</foreach>
     </select>
+    <select id="countOrganLedgerWithExam" resultType="java.math.BigDecimal">
+		SELECT
+			SUM(amount_)
+		FROM
+			exam_manual_ledger
+		WHERE
+			examination_basic_id_ = #{examId}
+			AND target_organ_id_ = #{organId}
+			AND trans_direction_ = 'EXPENDITURE'
+	</select>
 </mapper>

+ 15 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamOrganizationRelationMapper.xml

@@ -23,6 +23,7 @@
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 		<result column="tenant_id_" property="tenantId" />
+		<association property="organization" columnPrefix="organ_" resultMap="com.keao.edu.user.dao.OrganizationDao.Organization" />
 	</resultMap>
 
 	<resultMap id="ExamOrganizationRelationExtraDto" type="com.keao.edu.user.dto.ExamOrganizationRelationExtraDto" extends="ExamOrganizationRelation">
@@ -263,6 +264,19 @@
 		SELECT * FROM exam_organization_relation WHERE examination_basic_id_=#{examId}
 	</select>
 
+	<select id="getOrganInfoWithExam" resultMap="ExamOrganizationRelation">
+		SELECT
+			eor.*,
+			o.user_id_ organ_user_id_,
+			o.contact_name_ organ_contact_name_,
+			o.contact_phone_ organ_contact_phone_
+		FROM
+			exam_organization_relation eor
+			LEFT JOIN organization o ON eor.organ_id_ = o.id_
+		WHERE
+			eor.examination_basic_id_ = #{examId}
+	</select>
+
 	<select id="getOrganIdsWithExam" resultType="int">
 		SELECT organ_id_ FROM exam_organization_relation WHERE examination_basic_id_=#{examId} FOR UPDATE
 	</select>
@@ -322,6 +336,7 @@
 
 	<sql id="queryUnRelatedOrgansCondition">
 		<where>
+			o.del_flag_=0
 			<if test="tenantId != null and tenantId != 0">
 				AND o.tenant_id_ = #{tenantId}
 			</if>

+ 55 - 12
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRegistrationMapper.xml

@@ -414,7 +414,7 @@
 		FROM
 		exam_registration er
 		WHERE 1=1
-		AND er.status_ IN ('AUDIT_PASS')
+		AND er.status_ IN ('AUDIT_PASS', 'AUDIT_WAIT')
 		<if test="organIds!=null">
 			AND er.organ_id_ IN
 			<foreach collection="organIds" item="organI" separator="," open="(" close=")">
@@ -470,13 +470,18 @@
 	<sql id="queryStudentListSql">
 		<where>
 			<if test="studentId != null">
-				er.student_id_ = #{studentId}
+				AND er.student_id_ = #{studentId}
 			</if>
 			<if test="examRegistrationId != null">
-				er.id_ = #{examRegistrationId}
+				AND er.id_ = #{examRegistrationId}
 			</if>
-			<if test="status != null and status != ''">
-				er.status_ = #{status}
+			<if test="paymentStatus != null and paymentStatus == 1">
+				<if test="paymentStatus == 1">
+					AND er.status_ = 'AUDIT_PASS'
+				</if>
+				<if test="paymentStatus == 0">
+					AND er.status_ != 'AUDIT_PASS'
+				</if>
 			</if>
 		</where>
 	</sql>
@@ -488,15 +493,33 @@
 		ORDER BY er.update_time_ DESC
 		<include refid="global.limit"/>
 	</select>
-	<resultMap id="ExamRecordDtoMap" type="com.keao.edu.user.dto.ExamRecordDto" extends="ExamRegistration">
-		<result property="subjectName" column="subjectName"/>
-		<result property="examBaseName" column="examBaseName"/>
-		<result property="examCertificationId" column="examCertificationId"/>
-		<association property="studentExamResult" resultMap="com.keao.edu.user.dao.StudentExamResultDao.StudentExamResult"/>
+	<resultMap id="ExamRecordDtoMap" type="com.keao.edu.user.dto.StudentExamListDto">
+		<result property="level" column="level_"/>
+		<result property="examRegistrationId" column="exam_registration_id_"/>
+		<result property="examBaseName" column="exam_base_name_"/>
+		<result property="actualExamEndTime" column="actual_exam_end_time_"/>
+		<result property="actualExamStartTime" column="actual_exam_start_time_"/>
+		<result property="avgScore" column="avg_score_"/>
+		<result property="examAddress" column="exam_address_"/>
+		<result property="examCertificationId" column="exam_certification_id_"/>
+		<result property="examinationBasicId" column="examination_basic_id_"/>
+		<result property="examMusicTheoryLevel" column="exam_music_theory_level_"/>
+		<result property="isFinishedExam" column="is_finished_exam_"/>
+		<result property="result" column="result_"/>
+		<result property="theoryLevelFee" column="theory_level_fee_"/>
+		<result property="videoUrl" column="video_url_"/>
+		<result property="subjectId" column="subject_id_"/>
+		<result property="cardNo" column="card_no_"/>
 	</resultMap>
 	<select id="queryExamList" resultMap="ExamRecordDtoMap">
-		SELECT er.*,ser.* FROM exam_registration er
-		LEFT JOIN student_exam_result ser ON er.id_ = ser.exam_registration_id_
+		SELECT er.level_,ser.exam_registration_id_,eb.name_ exam_base_name_,eb.actual_exam_start_time_,
+		eb.actual_exam_end_time_,ser.avg_score_,ec.exam_address_,ec.id_ exam_certification_id_,
+		er.examination_basic_id_,er.exam_music_theory_level_,ser.is_finished_exam_,er.theory_level_fee_,
+		ser.video_url_,ser.result_,er.subject_id_,ec.card_no_
+		FROM exam_registration er
+		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = er.id_
+		LEFT JOIN examination_basic eb ON eb.id_ = er.examination_basic_id_
+		LEFT JOIN exam_certification ec ON ec.exam_registration_id_ = er.id_
 		WHERE ser.id_ IS NOT NULL AND er.student_id_ = #{studentId}
 	</select>
 	<select id="countExamList" resultType="java.lang.Integer">
@@ -548,4 +571,24 @@
         </where>
         LIMIT 1
     </select>
+    <select id="queryStudentTenantId" resultType="java.lang.Integer">
+		SELECT DISTINCT tenant_id_ FROM exam_registration
+		WHERE student_id_ = #{userId} AND tenant_id_ IS NOT NULL
+	</select>
+
+	<select id="countStudentBaseExams" resultType="java.lang.Integer">
+		SELECT COUNT(er.id_) FROM exam_registration er
+		<include refid="queryStudentListSql"/>
+	</select>
+	<resultMap id="StudentBaseExamsDtoMap" type="com.keao.edu.user.dto.StudentBaseExamsDto">
+		<result property="baseExamName" column="examBaseName"/>
+		<result property="tenantId" column="tenant_id_"/>
+	</resultMap>
+	<select id="queryStudentBaseExams" resultMap="StudentBaseExamsDtoMap">
+		SELECT eb.name_ examBaseName,eb.tenant_id_ FROM examination_basic eb
+		LEFT JOIN exam_registration er ON er.examination_basic_id_ = eb.id_
+		<include refid="queryStudentListSql"/>
+		ORDER BY er.update_time_ DESC
+		<include refid="global.limit"/>
+	</select>
 </mapper>

+ 53 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamReviewMapper.xml

@@ -113,6 +113,9 @@
 			<if test="registId!=null">
 				AND er.exam_registration_id_=#{registId}
 			</if>
+			<if test="roomId!=null">
+				AND er.exam_room_id_ = #{roomId}
+			</if>
 			<if test="examinationBaseId!=null">
 				AND er.examination_basic_id_ = #{examinationBaseId}
 			</if>
@@ -172,4 +175,54 @@
 			LEFT JOIN sys_user su ON su.id_=er.teacher_id_
 		<include refid="findExamResultCondition"/>
 	</select>
+	<select id="countExamReviewRecordList" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT ser.id_)
+		FROM exam_room_student_relation ersr
+		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = ersr.exam_registration_id_
+		LEFT JOIN exam_review er ON ser.exam_registration_id_ = er.exam_registration_id_
+		<include refid="queryExamReviewRecordListSql"/>
+	</select>
+	<resultMap id="ExamReviewRecordDtoMap" type="com.keao.edu.user.dto.ExamReviewRecordDto">
+		<result property="recordStartTime" column="record_start_time_"/>
+		<result property="confirmStatus" column="confirm_status_"/>
+		<result property="recordFlag" column="record_flag_"/>
+		<result property="realName" column="real_name_"/>
+		<result property="studentId" column="student_id_"/>
+		<result property="evaluationContent" column="evaluation_content_"/>
+		<result property="evaluationResult" column="evaluation_result_"/>
+		<result property="examReviewId" column="id_"/>
+		<result property="finishedExam" column="is_finished_exam_"/>
+		<result property="videoUrl" column="video_url_"/>
+	</resultMap>
+	<sql id="queryExamReviewRecordListSql">
+		<where>
+			<if test="reviewFlag == null">
+				AND er.teacher_id_ = #{teacherId} OR er.id_ IS NULL
+			</if>
+			<if test="reviewFlag == 1">
+				AND er.teacher_id_ = #{teacherId}
+			</if>
+			<if test="reviewFlag == 0">
+				AND er.id_ IS NULL
+			</if>
+			<if test="roomId != 0">
+				AND ersr.exam_room_id_ = #{roomId}
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryExamReviewRecordList" resultMap="ExamReviewRecordDtoMap">
+		SELECT ser.is_finished_exam_,ser.record_flag_,ser.confirm_status_,er.evaluation_content_,
+		er.evaluation_result_,ersr.exam_registration_id_,er.id_,ersr.student_id_,ser.video_url_
+		FROM exam_room_student_relation ersr
+		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = ersr.exam_registration_id_
+		LEFT JOIN exam_review er ON ser.exam_registration_id_ = er.exam_registration_id_
+		<include refid="queryExamReviewRecordListSql"/>
+		ORDER BY ser.is_finished_exam_ DESC
+		<include refid="global.limit"/>
+	</select>
+
+	<select id="findByRegistrationId" resultMap="ExamReviewRecordDtoMap">
+		SELECT * FROM exam_review WHERE exam_registration_id_ = #{examRegistrationId} AND teacher_id_ = #{teacherId} LIMIT 1
+	</select>
 </mapper>

+ 73 - 11
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRoomMapper.xml

@@ -21,7 +21,8 @@
 		<result column="exam_end_time_" property="examEndTime" />
 		<result column="del_flag_" property="delFlag" />
 		<result column="organ_id_" property="organId"/>
-		<result column="exam_plan_push_flag_" property="examPlanPushFlag" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
+		<result column="open_flag_" property="openFlag"/>
+		<result column="exam_plan_push_flag_" property="examPlanPushFlag"/>
 		<result column="exam_room_student_num_" property="examRoomStudentNum"/>
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
@@ -46,7 +47,7 @@
 		exam_room_student_num_,create_time_,update_time_,tenant_id_)
 		VALUES(#{id},#{examinationBasicId},#{examMode,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},#{examLocationId},
 		#{subjectIdList},#{subjectNameList},#{mainTeacherUserId},#{mainTeacherName},#{assistantTeacherUserIdList},#{assistantTeacherUserNameList},
-		#{examStartTime},#{examEndTime},#{delFlag},#{organId},#{examPlanPushFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+		#{examStartTime},#{examEndTime},#{delFlag},#{organId},#{examPlanPushFlag},
 		#{examRoomStudentNum},NOW(),NOW(),#{tenantId})
 	</insert>
 
@@ -60,7 +61,7 @@
 			(#{examRoom.examinationBasicId},#{examRoom.examMode,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},#{examRoom.examLocationId},
 			#{examRoom.subjectIdList},#{examRoom.subjectNameList},
 			#{examRoom.mainTeacherUserId},#{examRoom.mainTeacherName},#{examRoom.assistantTeacherUserIdList},#{examRoom.assistantTeacherUserNameList},
-			#{examRoom.examStartTime},#{examRoom.examEndTime},#{examRoom.delFlag},#{examRoom.organId},#{examRoom.examPlanPushFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+			#{examRoom.examStartTime},#{examRoom.examEndTime},#{examRoom.delFlag},#{examRoom.organId},#{examRoom.examPlanPushFlag},
 			#{examRoom.examRoomStudentNum},NOW(),NOW(),#{examRoom.tenantId})
 		</foreach>
 	</insert>
@@ -72,6 +73,9 @@
 			<if test="delFlag != null">
 				del_flag_ = #{delFlag},
 			</if>
+			<if test="openFlag != null">
+				open_flag_ = #{openFlag},
+			</if>
 			<if test="examinationBasicId != null">
 				examination_basic_id_ = #{examinationBasicId},
 			</if>
@@ -93,9 +97,7 @@
 			<if test="examMode != null">
 				exam_mode_ = #{examMode,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
 			</if>
-			<if test="examLocationId != null">
-				exam_location_id_ = #{examLocationId},
-			</if>
+			exam_location_id_ = #{examLocationId},
 			<if test="mainTeacherUserId != null">
 				main_teacher_user_id_ = #{mainTeacherUserId},
 			</if>
@@ -112,7 +114,7 @@
 				organ_id_ = #{organId},
 			</if>
 			<if test="examPlanPushFlag != null">
-				exam_plan_push_flag_ = #{examPlanPushFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+				exam_plan_push_flag_ = #{examPlanPushFlag},
 			</if>
 			<if test="examRoomStudentNum!=null">
 				exam_room_student_num_=#{examRoomStudentNum},
@@ -121,6 +123,65 @@
 		</set> WHERE id_ = #{id}
 	</update>
 
+	<!-- 根据主键查询一条记录 -->
+	<update id="batchUpdate" parameterType="com.keao.edu.user.api.entity.ExamRoom">
+		<foreach collection="examRooms" item="er" separator=";">
+			UPDATE exam_room
+			<set>
+				<if test="er.delFlag != null">
+					del_flag_ = #{er.delFlag},
+				</if>
+				<if test="er.openFlag != null">
+					open_flag_ = #{er.openFlag},
+				</if>
+				<if test="er.examinationBasicId != null">
+					examination_basic_id_ = #{er.examinationBasicId},
+				</if>
+				<if test="er.examStartTime != null">
+					exam_start_time_ = #{er.examStartTime},
+				</if>
+				<if test="er.examEndTime != null">
+					exam_end_time_ = #{er.examEndTime},
+				</if>
+				<if test="er.subjectIdList != null">
+					subject_id_list_ = #{er.subjectIdList},
+				</if>
+				<if test="er.subjectNameList != null">
+					subject_name_list_ = #{er.subjectNameList},
+				</if>
+				<if test="er.tenantId != null and er.tenantId != 0">
+					tenant_id_ = #{er.tenantId},
+				</if>
+				<if test="er.examMode != null">
+					exam_mode_ = #{er.examMode,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+				</if>
+				exam_location_id_ = #{er.examLocationId},
+				<if test="er.mainTeacherUserId != null">
+					main_teacher_user_id_ = #{er.mainTeacherUserId},
+				</if>
+				<if test="er.mainTeacherName != null">
+					main_teacher_user_name_ = #{er.mainTeacherName},
+				</if>
+				<if test="er.assistantTeacherUserIdList != null">
+					assistant_teacher_user_id_list_ = #{er.assistantTeacherUserIdList},
+				</if>
+				<if test="er.assistantTeacherUserNameList != null">
+					assistant_teacher_user_name_list_ = #{er.assistantTeacherUserNameList},
+				</if>
+				<if test="er.organId != null">
+					organ_id_ = #{er.organId},
+				</if>
+				<if test="er.examPlanPushFlag != null">
+					exam_plan_push_flag_ = #{er.examPlanPushFlag},
+				</if>
+				<if test="er.examRoomStudentNum!=null">
+					exam_room_student_num_=#{er.examRoomStudentNum},
+				</if>
+				update_time_ = NOW()
+			</set> WHERE id_ = #{er.id}
+		</foreach>
+	</update>
+
 	<update id="updateSL" parameterType="com.keao.edu.user.api.entity.ExamRoom">
 		UPDATE exam_room
 		<set>
@@ -148,9 +209,7 @@
 			<if test="examMode != null">
 				exam_mode_ = #{examMode,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
 			</if>
-			<if test="examLocationId != null">
 				exam_location_id_ = #{examLocationId},
-			</if>
 			<if test="mainTeacherUserId != null">
 				main_teacher_user_id_ = #{mainTeacherUserId},
 			</if>
@@ -167,7 +226,7 @@
 				organ_id_ = #{organId},
 			</if>
 			<if test="examPlanPushFlag != null">
-				exam_plan_push_flag_ = #{examPlanPushFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+				exam_plan_push_flag_ = #{examPlanPushFlag},
 			</if>
 			<if test="examRoomStudentNum!=null">
 				exam_room_student_num_=#{examRoomStudentNum},
@@ -207,7 +266,7 @@
 				</foreach>
 			</if>
 			<if test="examRoomId!=null">
-				AND er.id_=#{examRoomId}
+				AND er.id_ = #{examRoomId}
 			</if>
 			<if test="examId!=null">
 				AND er.examination_basic_id_ = #{examId}
@@ -270,6 +329,9 @@
 			<if test="examId!=null">
 				AND er.examination_basic_id_ = #{examId}
 			</if>
+			<if test="search!=null and search!=''">
+				AND (er.id_=#{search})
+			</if>
 		</where>
 	</sql>
 

+ 42 - 8
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamRoomStudentRelationMapper.xml

@@ -6,13 +6,13 @@
 -->
 <mapper namespace="com.keao.edu.user.dao.ExamRoomStudentRelationDao">
 	
-	<resultMap type="com.keao.edu.user.api.entity.ExamRoomStudentRelation" id="ExamRoomStudentRelation">
+	<resultMap type="com.keao.edu.user.api.entity.ExamRoomStudentRelation" id="ExamRoomStudentRelation" extends="com.keao.edu.user.dao.ExamRoomDao.ExamRoom">
 		<result column="id_" property="id" />
 		<result column="examination_basic_id_" property="examinationBasicId" />
 		<result column="exam_registration_id_" property="examRegistrationId" />
 		<result column="exam_room_id_" property="examRoomId" />
 		<result column="student_id_" property="studentId" />
-		<result column="classroom_switch_" property="classroomSwitch" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
+		<result column="classroom_switch_" property="classroomSwitch"/>
 		<result column="sign_in_time_" property="signInTime" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
@@ -67,7 +67,7 @@
 				exam_registration_id_ = #{examRegistrationId},
 			</if>
 			<if test="classroomSwitch != null">
-				classroom_switch_ = #{classroomSwitch,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+				classroom_switch_ = #{classroomSwitch},
 			</if>
 			<if test="tenantId != null and tenantId != 0">
 				tenant_id_ = #{tenantId},
@@ -85,12 +85,13 @@
 		UPDATE exam_room_student_relation SET classroom_switch_ = #{openFlag},update_time_ = NOW()
 		WHERE examination_basic_id_ = #{examinationBasicId} AND student_id_ = #{studentId}
 	</update>
+
 	<update id="cleanSignInTime">
 		UPDATE exam_room_student_relation SET sign_in_time_ = NULL,update_time_ = NOW()
 		WHERE exam_registration_id_ = #{examRegistrationId}
 	</update>
 
-	<!-- 根据主键删除一条记录 -->
+    <!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM exam_room_student_relation WHERE id_ = #{id} 
 	</delete>
@@ -122,7 +123,7 @@
 
 	<sql id="queryCondition">
 		<where>
-			er.status_='AUDIT_PASS'
+			er.status_ IN ('AUDIT_PASS', 'AUDIT_WAIT')
 			<if test="organIds!=null">
 				AND er.organ_id_ IN
 				<foreach collection="organIds" item="organI" separator="," open="(" close=")">
@@ -168,7 +169,8 @@
 	</select>
 
 	<select id="findStudentsWithExamRoom" resultMap="ExamRoomStudentRelation">
-		SELECT id_, exam_registration_id_, examination_basic_id_, exam_room_id_, student_id_ FROM exam_room_student_relation WHERE exam_room_id_=#{examRoomId}
+		SELECT id_, exam_registration_id_, examination_basic_id_, exam_room_id_, student_id_
+		FROM exam_room_student_relation WHERE exam_room_id_=#{examRoomId}
 	</select>
 
 	<select id="findStudentsWithExamRooms" resultMap="ExamRoomStudentRelation">
@@ -190,7 +192,7 @@
 		</if>
 	</select>
     <select id="getStudentExamRoom" resultMap="ExamRoomStudentRelation">
-		SELECT * FROM exam_room_student_relation WHERE exam_registration_id_=#{registId}
+		SELECT * FROM exam_room_student_relation WHERE exam_registration_id_ = #{registId}
     </select>
 	<select id="findByStudentIdAndRoomId" resultMap="ExamRoomStudentRelation">
 		SELECT ersr.* FROM exam_room_student_relation ersr
@@ -203,16 +205,18 @@
 		<result property="level" column="level_"/>
 		<result property="realName" column="real_name_"/>
 		<result property="examRoomId" column="exam_room_id_"/>
+		<result property="signInTime" column="sign_in_time_"/>
 		<result property="examRoomStudentRelationId" column="exam_room_student_relation_id_"/>
 	</resultMap>
 	<select id="queryStudentList" resultMap="RoomStudentListDtoMap">
-		SELECT ersr.id_ exam_room_student_relation_id_,ersr.exam_registration_id_,su.real_name_,
+		SELECT ersr.id_ exam_room_student_relation_id_,ersr.exam_registration_id_,su.real_name_,ersr.sign_in_time_,
 		s.name_ subject_name_,ec.level_,ersr.exam_room_id_,ersr.student_id_ FROM exam_room_student_relation ersr
 		LEFT JOIN exam_certification ec ON ec.exam_registration_id_ = ersr.exam_registration_id_
 		LEFT JOIN `subject` s ON s.id_ = ec.subject_id_
 		LEFT JOIN sys_user su ON ersr.student_id_ = su.id_
 		LEFT JOIN student_exam_result ser ON ser.exam_registration_id_ = ersr.exam_registration_id_
 		WHERE ersr.exam_room_id_ = #{roomId} AND ser.is_finished_exam_ = 0
+		ORDER BY ersr.sign_in_time_ IS NULL,ersr.sign_in_time_ ASC
 	</select>
     <select id="querySignTotalNum" resultType="java.lang.Integer">
 		SELECT COUNT(ersr.id_) FROM exam_room_student_relation ersr
@@ -240,4 +244,34 @@
     <select id="getStudentIds" resultType="java.lang.String">
 		SELECT GROUP_CONCAT(DISTINCT student_id_) FROM exam_room_student_relation WHERE exam_room_id_ = #{examRoomId}
 	</select>
+	<select id="getStuRegistrationMap" resultType="java.util.Map">
+		SELECT student_id_ 'key',GROUP_CONCAT(exam_registration_id_) 'value' FROM exam_room_student_relation
+		WHERE exam_room_id_ = #{examRoomId}
+		GROUP BY student_id_
+	</select>
+
+    <select id="getNoSendExamPlanRooms" resultMap="ExamRoomStudentRelation">
+		SELECT
+			*
+		FROM
+			exam_room_student_relation ersr
+			LEFT JOIN exam_room er ON ersr.exam_room_id_ = er.id_
+		WHERE er.exam_plan_push_flag_=0
+			AND ersr.examination_basic_id_ = #{examId}
+			<if test="organIds!=null">
+				AND er.organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+	</select>
+
+	<select id="getTomorrowExamStudents" resultMap="ExamRoomStudentRelation">
+		SELECT
+			*
+		FROM
+			exam_room_student_relation ersr
+			LEFT JOIN exam_room er ON ersr.exam_room_id_ = er.id_
+		WHERE DATE_FORMAT(er.exam_start_time_,'%Y-%m-%d') = #{day}
+	</select>
 </mapper>

+ 20 - 3
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamSongMapper.xml

@@ -116,7 +116,7 @@
 		SELECT * FROM exam_song WHERE FIND_IN_SET(id_,#{ids})
 	</select>
 	<select id="getWithSubject" resultMap="ExamSong">
-		SELECT * FROM exam_song WHERE FIND_IN_SET(#{subjectId}, subject_list_)
+		SELECT * FROM exam_song WHERE FIND_IN_SET(#{subjectId}, subject_list_) AND del_flag_=0
 	</select>
 
     <select id="getWithLevelAndType" resultMap="ExamSong">
@@ -125,11 +125,28 @@
 		AND level_list_=#{level}
 		AND type_=#{songType, typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler}
     </select>
+	<sql id="querySongPageMap">
+		<where>
+			es.del_flag_ = 0
+			<if test="subjectList != null">
+				AND FIND_IN_SET(#{subjectList},es.subject_list_)
+			</if>
+			<if test="level != null">
+				AND FIND_IN_SET(#{level},es.level_list_)
+			</if>
+			<if test="tenantId != null">
+				AND es.tenant_id_ = #{tenantId}
+			</if>
+		</where>
+	</sql>
 	<select id="countSongPage" resultType="java.lang.Integer">
-
+		SELECT COUNT(es.id_) FROM exam_song es
+		<include refid="querySongPageMap"/>
 	</select>
 	<select id="querySongPage" resultMap="ExamSong">
-
+		SELECT es.* FROM exam_song es
+		<include refid="querySongPageMap"/>
+		<include refid="global.limit"/>
 	</select>
 
 	<select id="getWithIds" resultMap="ExamSong">

+ 9 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExamTeacherSalaryMapper.xml

@@ -193,6 +193,14 @@
 		WHERE ets.examination_basic_id_=#{examId}
 	</select>
 
+	<select id="getWithTeachers" resultMap="ExamTeacherSalary">
+		SELECT ets.* FROM exam_teacher_salary ets
+		WHERE ets.teacher_id_ IN
+		<foreach collection="teacherIds" item="teacherId" separator="," open="(" close=")">
+			#{teacherId}
+		</foreach>
+	</select>
+
 	<select id="getWithExamAndTeacher" resultMap="ExamTeacherSalary">
 		SELECT ets.*,su.real_name_ teacher_real_name_ FROM exam_teacher_salary ets
 		LEFT JOIN sys_user su ON ets.teacher_id_=su.id_
@@ -205,6 +213,7 @@
 	<sql id="queryUnRelatedWithExamTeachersCondition">
 		<where>
 			t.tenant_id_=#{tenantId}
+			AND t.del_flag_=0
 			AND NOT EXISTS ( SELECT teacher_id_ FROM exam_teacher_salary WHERE teacher_id_ = t.user_id_ AND examination_basic_id_ = #{examId} )
 		</where>
 	</sql>

+ 3 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/ExaminationBasicMapper.xml

@@ -255,4 +255,7 @@
 			#{examId}
 		</foreach>
 	</select>
+    <select id="lockExam" resultMap="ExaminationBasic">
+		SELECT id_,name_ FROM examination_basic WHERE id_=#{examId}
+	</select>
 </mapper>

+ 4 - 0
edu-user/edu-user-server/src/main/resources/config/mybatis/StudentExamResultMapper.xml

@@ -103,6 +103,10 @@
     <update id="endExam">
 		UPDATE student_exam_result SET is_finished_exam_ = 1 AND update_time_ = NOW() WHERE exam_registration_id_ = #{examRegistrationId}
 	</update>
+    <update id="confirmStudent">
+		UPDATE student_exam_result SET confirm_status_ = 1 AND update_time_ = NOW()
+		WHERE exam_registration_id_ = #{examRegistrationId}
+	</update>
 
     <!-- 根据主键删除一条记录 -->
 	<delete id="delete" >

+ 2 - 2
edu-user/edu-user-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -168,7 +168,7 @@
     </select>
 
     <select id="queryByPhone" resultMap="SysUser">
-		select * from sys_user where phone_ = #{phone} LIMIT 1 FOR UPDATE
+		select * from sys_user where phone_ = #{phone} LIMIT 1
 	</select>
 
     <select id="lockUser" resultType="int">
@@ -180,7 +180,7 @@
     </select>
 
     <select id="queryByPhoneAndClient" resultMap="SysUser">
-        select * from sys_user where (phone_ = #{phone} OR username_ = #{phone}) AND user_type_ LIKE CONCAT('%',#{client},'%') LIMIT 1 FOR UPDATE
+        select * from sys_user where (phone_ = #{phone} OR username_ = #{phone}) AND user_type_ LIKE CONCAT('%',#{client},'%') LIMIT 1
     </select>
     <select id="queryRoleIds" resultType="java.lang.Integer">
         SELECT sur.role_id_ FROM employee e

+ 22 - 3
edu-user/edu-user-server/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -12,7 +12,7 @@
 		<result column="subject_id_list_" property="subjectIdList" />
 		<result column="salary_settlement_type_" property="salarySettlementType" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
 		<result column="salary_" property="salary" />
-		<result column="del_flag_" property="delFlag" typeHandler="com.keao.edu.common.dal.CustomEnumTypeHandler"/>
+		<result column="del_flag_" property="delFlag"/>
 		<result column="total_invigilation_num_" property="totalInvigilationNum"/>
 		<result column="total_invigilation_student_num_" property="totalInvigilationStudentNum"/>
 		<result column="total_settlement_fee_" property="totalSettlementCost"/>
@@ -33,7 +33,8 @@
         	su.username_ sys_user_username_,
         	su.phone_ sys_user_phone_,
         	su.avatar_ sys_user_avatar_,
-        	su.real_name_ sys_user_real_name_
+        	su.real_name_ sys_user_real_name_,
+        	su.user_type_ sys_user_user_type_
         FROM teacher t
         LEFT JOIN sys_user su ON t.user_id_ = su.id_
         WHERE t.user_id_ = #{id}
@@ -52,7 +53,7 @@
 				salary_settlement_type_ = #{salarySettlementType,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
 			</if>
 			<if test="delFlag != null">
-				del_flag_ = #{delFlag,typeHandler=com.keao.edu.common.dal.CustomEnumTypeHandler},
+				del_flag_ = #{delFlag},
 			</if>
 			<if test="salary != null">
 				salary_ = #{salary},
@@ -77,6 +78,24 @@
 		WHERE user_id_ = #{userId}
 	</update>
 
+	<update id="batchUpdate" parameterType="com.keao.edu.user.entity.Teacher">
+		<foreach collection="teachers" item="teacher" separator=";">
+			UPDATE teacher
+			<set>
+				<if test="teacher.totalInvigilationNum != null">
+					total_invigilation_num_ = #{teacher.totalInvigilationNum},
+				</if>
+				<if test="teacher.totalInvigilationStudentNum != null">
+					total_invigilation_student_num_ = #{teacher.totalInvigilationStudentNum},
+				</if>
+				<if test="teacher.totalSettlementCost != null">
+					total_settlement_fee_ = #{teacher.totalSettlementCost},
+				</if>
+				update_time_ = NOW()
+			</set>
+			WHERE user_id_ = #{teacher.userId}
+		</foreach>
+	</update>
 
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="Teacher">

+ 1 - 1
edu-zuul/src/main/resources/bootstrap-dev.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=a5c10b43-0c4d-4e3b-a0ad-9af651cfe89c
+spring.cloud.nacos.config.namespace=753368b1-d0a9-42bc-bb76-c4ab319f0203
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}