Browse Source

Merge remote-tracking branch 'origin/master'

周箭河 4 năm trước cách đây
mục cha
commit
a82b10971e
82 tập tin đã thay đổi với 2113 bổ sung551 xóa
  1. 10 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java
  2. 70 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserDevice.java
  3. 1 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  4. 15 8
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/WebSecurityConfig.java
  5. 5 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  6. 23 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/UsernameAuthenticationFilter.java
  7. 47 11
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  8. 13 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDeviceDao.java
  9. 21 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserDeviceService.java
  10. 58 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserDeviceServiceImpl.java
  11. 83 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserDeviceMapper.xml
  12. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  13. 70 38
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  14. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  15. 30 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  16. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  17. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  18. 27 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  19. 16 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  20. 6 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMessageDao.java
  21. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  22. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java
  23. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentNoStartCoursesDto.java
  24. 78 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeCourseDto.java
  25. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  26. 34 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java
  27. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMessage.java
  28. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  29. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderDetailQueryInfo.java
  30. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  31. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMessageQueryInfo.java
  32. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  34. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  35. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesMessageService.java
  36. 18 10
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  37. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java
  38. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  39. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  40. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  41. 7 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  42. 43 28
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  43. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  44. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesMessageServiceImpl.java
  45. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  46. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  47. 12 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  48. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  49. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java
  50. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  51. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  52. 64 35
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  53. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  54. 323 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  55. 8 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  56. 20 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  57. 19 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  58. 41 45
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  59. 9 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  60. 19 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  61. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  62. 207 119
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  63. 38 4
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  64. 38 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  65. 13 6
      mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  66. 13 4
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  67. 7 2
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  68. 5 17
      mec-im/src/main/java/com/ym/controller/RoomController.java
  69. 9 0
      mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java
  70. 31 31
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  71. 2 2
      mec-im/src/main/java/com/ym/service/RoomService.java
  72. 3 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  73. 24 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java
  74. 5 31
      mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  75. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  76. 4 3
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java
  77. 5 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseHomeworkReplyController.java
  78. 7 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  79. 2 73
      mec-web/src/main/java/com/ym/mec/web/controller/SysMessageController.java
  80. 6 3
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  81. 10 2
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java
  82. 100 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/SysEduMessageController.java

+ 10 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java

@@ -10,6 +10,8 @@ public class LoginEntity {
     private Boolean isRegister;
 
     private String phone;
+    
+    private String deviceNum;
 
     public Boolean getIsRegister() {
 		return isRegister;
@@ -50,4 +52,12 @@ public class LoginEntity {
     public void setPhone(String phone) {
         this.phone = phone;
     }
+
+	public String getDeviceNum() {
+		return deviceNum;
+	}
+
+	public void setDeviceNum(String deviceNum) {
+		this.deviceNum = deviceNum;
+	}
 }

+ 70 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserDevice.java

@@ -0,0 +1,70 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_user_device):
+ */
+public class SysUserDevice {
+
+	/**  */
+	private Integer id;
+	
+	/** 用户编号 */
+	private Integer userId;
+	
+	/** 设备号 */
+	private String deviceNum;
+	
+	/** 绑定时间 */
+	private java.util.Date bindTime;
+	
+	/** 设备类型 */
+	private String deviceType;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setDeviceNum(String deviceNum){
+		this.deviceNum = deviceNum;
+	}
+	
+	public String getDeviceNum(){
+		return this.deviceNum;
+	}
+			
+	public void setBindTime(java.util.Date bindTime){
+		this.bindTime = bindTime;
+	}
+	
+	public java.util.Date getBindTime(){
+		return this.bindTime;
+	}
+			
+	public void setDeviceType(String deviceType){
+		this.deviceType = deviceType;
+	}
+	
+	public String getDeviceType(){
+		return this.deviceType;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 1 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java

@@ -13,7 +13,7 @@ public class SysUserRole {
 	public static Integer EDUCATIONAL_TEACHER = 4;
 	//运营主管
 	public static Integer OPERATION_EXECUTIVE = 5;
-	//招生主管
+	//招生主管(意见反馈)
 	public static Integer ADMISSIONS_DIRECTOR = 6;
 	//教学主任、乐队指导
 	public static Integer DEAN_OF_STUDIES = 7;

+ 15 - 8
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/WebSecurityConfig.java

@@ -1,13 +1,5 @@
 package com.ym.mec.auth.config;
 
-import com.ym.mec.auth.core.filter.PhoneLoginAuthenticationFilter;
-import com.ym.mec.auth.core.filter.UsernameAuthenticationFilter;
-import com.ym.mec.auth.core.handler.BaseAuthenticationFailureEvenHandler;
-import com.ym.mec.auth.core.handler.BaseAuthenticationSuccessEventHandler;
-import com.ym.mec.auth.core.provider.PhoneAuthenticationProvider;
-import com.ym.mec.auth.core.provider.service.DefaultUserDetailsService;
-import com.ym.mec.auth.service.SysUserService;
-import com.ym.mec.common.service.IdGeneratorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -23,6 +15,16 @@ import org.springframework.security.crypto.factory.PasswordEncoderFactories;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
+import com.ym.mec.auth.core.filter.PhoneLoginAuthenticationFilter;
+import com.ym.mec.auth.core.filter.UsernameAuthenticationFilter;
+import com.ym.mec.auth.core.handler.BaseAuthenticationFailureEvenHandler;
+import com.ym.mec.auth.core.handler.BaseAuthenticationSuccessEventHandler;
+import com.ym.mec.auth.core.provider.PhoneAuthenticationProvider;
+import com.ym.mec.auth.core.provider.service.DefaultUserDetailsService;
+import com.ym.mec.auth.service.SysUserDeviceService;
+import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.common.service.IdGeneratorService;
+
 @Configuration
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)//会拦截注解了@PreAuthrize注解的配置.
@@ -43,6 +45,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 	@Autowired
 	private SysUserService sysUserService;
 	
+	@Autowired
+	private SysUserDeviceService sysUserDeviceService;
+	
 	@Override
 	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
 		auth.authenticationProvider(daoAuthenticationProvider());
@@ -102,6 +107,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
         provider.setUserDetailsService(defaultUserDetailsService);
         provider.setSmsCodeService(smsCodeService);
         provider.setSysUserService(sysUserService);
+        provider.setSysUserDeviceService(sysUserDeviceService);
 		// 禁止隐藏用户未找到异常
 		provider.setHideUserNotFoundExceptions(false);
 		
@@ -115,6 +121,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 		filter.setAuthenticationSuccessHandler(successEventHandler);
 		filter.setAuthenticationFailureHandler(failureEvenHandler);
 		filter.setSysUserService(sysUserService);
+		filter.setSysUserDeviceService(sysUserDeviceService);
 		return filter;
 	}
 

+ 5 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -25,6 +25,8 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 	private static final String SPRING_SECURITY_RESTFUL_VERIFY_CODE_KEY = "smsCode";
 	private static final String clientIdParameter = "clientId";
 	private static final String IS_LESSEE = "isLessee";
+	
+	private static final String DEVICE_NUM = "deviceNum";
 
 	private static final String SPRING_SECURITY_RESTFUL_LOGIN_URL = "/smsLogin";
 	private boolean postOnly = true;
@@ -53,6 +55,8 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		if ("EDUCATION".equals(clientId)) {
 			clientId = "SYSTEM";
 		}
+		
+		String deviceNum = request.getParameter(DEVICE_NUM);
 
 		principal = principal.trim();
 
@@ -61,6 +65,7 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		loginEntity.setPhone(principal);
 		loginEntity.setSmsCode(credentials);
 		loginEntity.setIsRegister(isRegister);
+		loginEntity.setDeviceNum(deviceNum);
 
 		authRequest = new PhoneAuthenticationToken(SecurityConstants.PHONE_PRINCIPAL_PREFIX + principal, loginEntity);
 

+ 23 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/UsernameAuthenticationFilter.java

@@ -7,7 +7,9 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
@@ -18,12 +20,15 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 import org.springframework.util.Assert;
 
 import com.ym.mec.auth.api.dto.SysUserInfo;
+import com.ym.mec.auth.service.SysUserDeviceService;
 import com.ym.mec.auth.service.SysUserService;
 import com.ym.mec.common.security.SecurityConstants;
 
 public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 
 	private SysUserService sysUserService;
+	
+	private SysUserDeviceService sysUserDeviceService;
 
 	// ~ Static fields/initializers
 	// =====================================================================================
@@ -31,6 +36,7 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 	private String usernameParameter = "username";
 	private String passwordParameter = "password";
 	private String clientIdParameter = "clientId";
+	private String deviceNumParameter = "deviceNum";
 	private boolean postOnly = true;
 
 	// ~ Constructors
@@ -84,8 +90,20 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 
 		// Allow subclasses to set the "details" property
 		setDetails(request, authRequest);
+		
+		Authentication authentication = this.getAuthenticationManager().authenticate(authRequest);
+		
+		String deviceNum = request.getParameter(deviceNumParameter);
+		if (StringUtils.isNotBlank(deviceNum) && !StringUtils.equals("STUDENT", clientId)) {
+			// 检查设备
+			try {
+				sysUserDeviceService.bindDevice(userInfo.getSysUser().getId(), deviceNum);
+			} catch (Exception e) {
+				throw new BadCredentialsException("当前设备已绑定账号,请更换设备");
+			}
+		}
 
-		return this.getAuthenticationManager().authenticate(authRequest);
+		return authentication;
 	}
 
 	@Override
@@ -186,4 +204,8 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 		this.sysUserService = sysUserService;
 	}
 
+	public void setSysUserDeviceService(SysUserDeviceService sysUserDeviceService) {
+		this.sysUserDeviceService = sysUserDeviceService;
+	}
+
 }

+ 47 - 11
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java

@@ -1,6 +1,7 @@
 package com.ym.mec.auth.core.provider;
 
 import java.util.Date;
+import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -16,9 +17,11 @@ import org.springframework.transaction.annotation.Transactional;
 import com.ym.mec.auth.api.dto.SysUserInfo;
 import com.ym.mec.auth.api.entity.LoginEntity;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.entity.SysUserDevice;
 import com.ym.mec.auth.config.token.PhoneAuthenticationToken;
+import com.ym.mec.auth.service.SysUserDeviceService;
 import com.ym.mec.auth.service.SysUserService;
-import com.ym.mec.common.security.SecurityConstants;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 
 public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider {
@@ -28,7 +31,9 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 	private IdGeneratorService smsCodeService;
 
 	private SysUserService sysUserService;
-
+	
+	private SysUserDeviceService sysUserDeviceService;
+	
 	@Override
 	protected void additionalAuthenticationChecks(UserDetails userDetails, Authentication authentication) throws AuthenticationException {
 
@@ -48,7 +53,7 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 
 		String smsCode = loginEntity.getSmsCode();
 		
-		String phone = StringUtils.substringAfter(username, SecurityConstants.PHONE_PRINCIPAL_PREFIX);
+		String phone = loginEntity.getPhone();
 
 		// 验证码验证
 		boolean b = smsCodeService.verifyValidCode(phone, smsCode);
@@ -59,26 +64,53 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 		String clientId = loginEntity.getClientId();
 
 		Boolean isRegister = loginEntity.getIsRegister();
+		
+		String deviceNum = loginEntity.getDeviceNum();
 
-		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(loginEntity.getPhone());
+		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(phone);
 
 		if (userInfo == null) {
 			if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
 				throw new LockedException("用户不存在");
 			}
-			sysUserService.initUser(loginEntity.getPhone(), clientId);
+			if (StringUtils.isNotBlank(deviceNum) && !StringUtils.equals("STUDENT", clientId)) {
+				// 检查设备
+				List<SysUserDevice> sysUserDeviceList = sysUserDeviceService.queryByDeviceNum(deviceNum);
+
+				if (sysUserDeviceList != null && sysUserDeviceList.size() > 0) {
+					throw new BadCredentialsException("当前设备已绑定账号,请更换设备");
+				}
+
+				userInfo = sysUserService.initUser(loginEntity.getPhone(), clientId);
+
+				SysUserDevice sysUserDevice = new SysUserDevice();
+				sysUserDevice.setUserId(userInfo.getSysUser().getId());
+				sysUserDevice.setDeviceNum(deviceNum);
+				sysUserDevice.setBindTime(new Date());
+				sysUserDeviceService.insert(sysUserDevice);
+			} else {
+				userInfo = sysUserService.initUser(loginEntity.getPhone(), clientId);
+			}
 		} else {
+			SysUser user = userInfo.getSysUser();
+			if (user == null) {
+				throw new LockedException("用户不存在");
+			}
+			if (StringUtils.isNotBlank(deviceNum) && !StringUtils.equals("STUDENT", clientId)) {
+				// 检查设备
+				try {
+					sysUserDeviceService.bindDevice(user.getId(), deviceNum);
+				} catch (Exception e) {
+					throw new BadCredentialsException("当前设备已绑定账号,请更换设备");
+				}
+			}
 			if (!userInfo.getSysUser().getUserType().contains(clientId)) {
 				if (isRegister == false || StringUtils.equals("SYSTEM", clientId)) {
 					throw new LockedException("用户不存在");
 				} else {
-					SysUser user = sysUserService.queryByPhone(phone);
-					if(user == null){
-						throw new LockedException("用户不存在");
-					}
-					user.setUserType(user.getUserType()+","+clientId);
+					user.setUserType(user.getUserType() + "," + clientId);
 					user.setUpdateTime(new Date());
-					
+
 					// 添加userType以及附加信息
 					if (StringUtils.equals("STUDENT", clientId)) {
 						user.setOrganId(sysUserService.getLesseeOrganId());
@@ -130,4 +162,8 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 	public void setSmsCodeService(IdGeneratorService smsCodeService) {
 		this.smsCodeService = smsCodeService;
 	}
+
+	public void setSysUserDeviceService(SysUserDeviceService sysUserDeviceService) {
+		this.sysUserDeviceService = sysUserDeviceService;
+	}
 }

+ 13 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDeviceDao.java

@@ -0,0 +1,13 @@
+package com.ym.mec.auth.dal.dao;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysUserDevice;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysUserDeviceDao extends BaseDAO<Integer, SysUserDevice> {
+
+	List<SysUserDevice> queryByUserId(Integer userId);
+	
+	List<SysUserDevice> queryByDeviceNum(String deviceNum);
+}

+ 21 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserDeviceService.java

@@ -0,0 +1,21 @@
+package com.ym.mec.auth.service;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysUserDevice;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysUserDeviceService extends BaseService<Integer, SysUserDevice> {
+
+	List<SysUserDevice> queryByUserId(Integer userId);
+
+	List<SysUserDevice> queryByDeviceNum(String deviceNum);
+
+	/**
+	 * 绑定设备号
+	 * @param userId
+	 * @param deviceNum
+	 * @return
+	 */
+	boolean bindDevice(Integer userId, String deviceNum) throws Exception;
+}

+ 58 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserDeviceServiceImpl.java

@@ -0,0 +1,58 @@
+package com.ym.mec.auth.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysUserDevice;
+import com.ym.mec.auth.dal.dao.SysUserDeviceDao;
+import com.ym.mec.auth.service.SysUserDeviceService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDevice>  implements SysUserDeviceService {
+	
+	@Autowired
+	private SysUserDeviceDao sysUserDeviceDao;
+
+	@Override
+	public BaseDAO<Integer, SysUserDevice> getDAO() {
+		return sysUserDeviceDao;
+	}
+
+	@Override
+	public List<SysUserDevice> queryByUserId(Integer userId) {
+		return sysUserDeviceDao.queryByUserId(userId);
+	}
+
+	@Override
+	public List<SysUserDevice> queryByDeviceNum(String deviceNum) {
+		return sysUserDeviceDao.queryByDeviceNum(deviceNum);
+	}
+
+	@Override
+	public boolean bindDevice(Integer userId, String deviceNum) throws Exception {
+		//查询设备号是否已存在
+		List<SysUserDevice> sysUserDeviceList = sysUserDeviceDao.queryByDeviceNum(deviceNum);
+		
+		if (sysUserDeviceList != null && sysUserDeviceList.size() > 0) {
+			if (sysUserDeviceList.stream().filter(sud -> sud.getUserId().equals(userId)).count() > 0) {
+				return true;
+			} else {
+				throw new Exception("当前设备已绑定账号,请更换设备");
+			}
+		}
+		
+		SysUserDevice sysUserDevice = new SysUserDevice();
+		sysUserDevice.setUserId(userId);
+		sysUserDevice.setDeviceNum(deviceNum);
+		sysUserDevice.setBindTime(new Date());
+		sysUserDeviceDao.insert(sysUserDevice);
+		
+		return true;
+	}
+	
+}

+ 83 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserDeviceMapper.xml

@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysUserDeviceDao">
+
+	<resultMap type="com.ym.mec.auth.api.entity.SysUserDevice" id="SysUserDevice">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="device_num_" property="deviceNum" />
+		<result column="bind_time_" property="bindTime" />
+		<result column="device_type_" property="deviceType" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysUserDevice">
+		SELECT * FROM
+		sys_user_device WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysUserDevice">
+		SELECT * FROM sys_user_device
+		ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysUserDevice"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO sys_user_device
+		(id_,user_id_,device_num_,bind_time_,device_type_)
+		VALUES(#{id},#{userId},#{deviceNum},#{bindTime},#{deviceType})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysUserDevice">
+		UPDATE sys_user_device
+		<set>
+			<if test="deviceType != null">
+				device_type_ = #{deviceType},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="deviceNum != null">
+				device_num_ = #{deviceNum},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="bindTime != null">
+				bind_time_ = #{bindTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM sys_user_device WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysUserDevice" parameterType="map">
+		SELECT * FROM sys_user_device ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_user_device
+	</select>
+	
+	<select id="queryByUserId" resultMap="SysUserDevice">
+		SELECT * FROM sys_user_device WHERE user_id_ = #{userId}
+	</select>
+	
+	<select id="queryByDeviceNum" resultMap="SysUserDevice">
+		SELECT * FROM sys_user_device WHERE device_num_ = #{deviceNum}
+	</select>
+	
+</mapper>

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java

@@ -277,7 +277,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @describe 获取老师陪练课班级
      */
-    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId);
+    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
 
     /**
      * 根据老师编号列表获取小课数量
@@ -294,7 +294,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @describe 获取老师vip课班级
      */
-    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId);
+    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
 
     /**
      * 根据合奏班编号列表,获取单技班名称列表

+ 70 - 38
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -92,26 +92,26 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     List<CourseSchedule> findMusicGroupAllCourseSchedules(@Param("musicGroupId") String musicGroupId,
-                                                       @Param("groupType") String groupType);
+                                                          @Param("groupType") String groupType);
 
     /**
-     * @describe 获取教师在指定时间的前一节课程
-     * @author Joburgess
-     * @date 2020.10.21
      * @param startClassTime:
      * @param teacherId:
      * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     * @describe 获取教师在指定时间的前一节课程
+     * @author Joburgess
+     * @date 2020.10.21
      */
     CourseSchedule getTeacherPrevCourseWithStartTime(@Param("startClassTime") Date startClassTime,
                                                      @Param("teacherId") Integer teacherId);
 
     /**
-     * @describe 获取教师在指定时间前有签到的课程
-     * @author Joburgess
-     * @date 2020.10.21
      * @param startClassTime:
      * @param teacherId:
      * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     * @describe 获取教师在指定时间前有签到的课程
+     * @author Joburgess
+     * @date 2020.10.21
      */
     CourseSchedule getTeacherAttendanceCourseBeforeStartTime(@Param("startClassTime") Date startClassTime,
                                                              @Param("teacherId") Integer teacherId);
@@ -146,29 +146,29 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                     @Param("userIds") List<Integer> userIds);
 
     /**
+     * @param classGroupId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 获取班级上未开始的课程
      * @author Joburgess
      * @date 2020.11.05
-     * @param classGroupId:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
     List<CourseSchedule> getClassGroupNotStartCourse(@Param("classGroupId") Long classGroupId);
 
     /**
+     * @param classGroupId:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 获取班级上的课程
      * @author qnc99
      * @date 2020/12/8 0008
-     * @param classGroupId:
-     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      */
     List<CourseSchedule> getClassGroupCourses(@Param("classGroupId") Long classGroupId);
 
     /**
+     * @param courseIds:
+     * @return java.util.List<java.lang.Long>
      * @describe 统计课程上被合课程的数量
      * @author qnc99
      * @date 2020/12/8 0008
-     * @param courseIds:
-     * @return java.util.List<java.lang.Long>
      */
     List<Map<Long, Long>> countCourseMergeCourseNum(@Param("courseIds") List<Long> courseIds);
 
@@ -699,7 +699,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param status
      * @return
      */
-    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId,@Param("status") CourseStatusEnum status);
+    List<CourseSchedule> findCoursesByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("status") CourseStatusEnum status);
 
     /**
      * @param courseScheduleId: 课程编号
@@ -1071,7 +1071,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<String, Long>> countTotalCourseScheduleNum(@Param("vipGroupIds") List<String> vipGroupIds, @Param("groupType") String groupType);
 
     int countTotalCourseScheduleNumWithGroup(@Param("groupId") String groupId,
-                                                        @Param("groupType") String groupType);
+                                             @Param("groupType") String groupType);
 
     /**
      * 获取当前课时(已上)
@@ -1297,7 +1297,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     CourseSchedule queryStudentContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
-                                       @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
+                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
      * 获取当前课程,下一次连堂课
@@ -1307,7 +1307,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @return
      */
     CourseSchedule queryTeacherContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
-                                       @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
+                                              @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
      * 获取单节课时长
@@ -1372,13 +1372,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Map<Long, String>> queryTeacherName(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     /**
-     * @describe 统计学生在指定周期内的vip课数量
-     * @author Joburgess
-     * @date 2020.04.28
      * @param studentIds:
      * @param startTime:
      * @param endTime:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
+     * @describe 统计学生在指定周期内的vip课数量
+     * @author Joburgess
+     * @date 2020.04.28
      */
     List<Map<Integer, Long>> countStudentVipCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                             @Param("startTime") Date startTime,
@@ -1387,24 +1387,24 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     /**
-     * @describe 统计学生在指定周期内的付费网管课数量
-     * @author Joburgess
-     * @date 2020.05.06
      * @param studentIds:
      * @param startTime:
      * @param endTime:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Long>>
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Long>>
+     * @describe 统计学生在指定周期内的付费网管课数量
+     * @author Joburgess
+     * @date 2020.05.06
      */
     List<Map<Integer, Long>> countStudentPayPracticeCoursesWithDate(@Param("studentIds") List<Integer> studentIds,
                                                                     @Param("startTime") Date startTime,
                                                                     @Param("endTime") Date endTime);
 
     /**
+     * @param studentIds:
+     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
      * @describe 统计学生在未来的vip课数量
      * @author Joburgess
      * @date 2020.04.28
-     * @param studentIds:
-     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
      */
     List<Map<Integer, Long>> countStudentVipCoursesInFuture(@Param("studentIds") List<Integer> studentIds);
 
@@ -1423,13 +1423,13 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * @param courseId:
-     * @param isLock:    冻结状态:1、冻结,0、正常
+     * @param isLock:   冻结状态:1、冻结,0、正常
      * @return int
      * @describe 通过班级编号更改课程的冻结状态
      * @author zouxuan
      */
     int batchUpdateLockByCourseIds(@Param("courseId") List<Long> courseId,
-                              @Param("isLock") Integer isLock);
+                                   @Param("isLock") Integer isLock);
 
 
     /**
@@ -1547,6 +1547,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取用户课程信息
+     *
      * @param studentIds
      * @param groupType
      * @return
@@ -1557,6 +1558,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取上一次连堂课
+     *
      * @param classGroupId
      * @param startTime
      * @param teacherId
@@ -1569,6 +1571,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程组已结束最后一节课时间
+     *
      * @param vipGroupIds
      * @return
      */
@@ -1576,6 +1579,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程状态列表
+     *
      * @param courseScheduleIds
      * @return
      */
@@ -1583,6 +1587,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取第一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1591,6 +1596,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取最后一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1599,12 +1605,14 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 重置上课学生人数
+     *
      * @param courseScheduleId
      */
     void resetStudentNum(@Param("courseScheduleId") List<Long> courseScheduleId);
 
     /**
      * 获取当前班级列表的所有未开始的课程
+     *
      * @param classGroupIds
      * @param teacherId
      * @param teacherRole
@@ -1614,6 +1622,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 当前班级是否有未开始的课程
+     *
      * @param classGroupIds
      * @param teacherId
      * @return
@@ -1623,6 +1632,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 查询班级未上的课程类型对应的时长
+     *
      * @param classGroupIdList
      * @return
      */
@@ -1630,34 +1640,36 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
 
     /**
+     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseRepeatCheckDto>
      * @describe 获取检测课程冲突需要的数据
      * @author qnc99
      * @date 2020/11/25 0025
-     * @return java.util.List<com.ym.mec.biz.dal.dto.CourseRepeatCheckDto>
      */
     List<CourseRepeatCheckDto> getCourseRepeatCheckInfos();
 
-    CourseSchedule getLock (long courseId);
+    CourseSchedule getLock(long courseId);
 
     /**
+     * @param courseId:
+     * @return int
      * @describe 统计指定课程合并的课程数量
      * @author qnc99
      * @date 2020/11/27 0027
-     * @param courseId:
-     * @return int
      */
     int countCourseMergeTime(@Param("courseId") Long courseId);
 
     /**
      * 获取班级剩余的课程类型和课程数量
-     * @author zouxuan
+     *
      * @param classGroupId
      * @return
+     * @author zouxuan
      */
     List<Map<String, Integer>> querySubCourseNumMap(@Param("classGroupId") Integer classGroupId);
 
     /**
      * 获取所选班级最大剩余课时
+     *
      * @param classGroupIds
      * @return
      */
@@ -1665,28 +1677,48 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 根据学员和班级列表获取未开始的课程列表
-     * @author zouxuan
+     *
      * @param classGroupIds
      * @param studentIds
      * @return
+     * @author zouxuan
      */
     List<Long> queryStudentNotStartByClassIdsAndStudentIds(@Param("classGroupIds") List<Integer> classGroupIds,
                                                            @Param("studentIds") List<Integer> studentIds);
 
     /**
      * 获取没有学员的课程
-     * @author zouxuan
+     *
      * @param courseIds
      * @return
+     * @author zouxuan
      */
     List<Long> findNoStudentCourseIds(@Param("courseIds") List<Long> courseIds);
 
     /**
-     *
      * 根据班级编号获取未开始的主课
-     * @author zouxuan
+     *
      * @param classGroupIds
      * @return
+     * @author zouxuan
      */
     int findNoStartMasterCourseNum(@Param("classGroupIds") List<Integer> classGroupIds);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     *
+     * @param params
+     * @return
+     * @author zouxuan
+     */
+    List<StudentNoStartCoursesDto> queryStudentNoStartCourse(Map<String, Object> params);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     *
+     * @param params
+     * @return
+     * @author zouxuan
+     */
+    int countStudentNoStartCourse(Map<String, Object> params);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -440,4 +440,16 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
     BigDecimal countFinishCoursePriceWithMusicGroup(@Param("groupId") String groupId,
                                                     @Param("groupType") GroupType groupType,
                                                     @Param("userId") Integer userId);
+
+    /**
+     * @describe 获取学生指定日期之前指定类型的最后一节课
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param studentId:
+     * @param monday:
+     * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     */
+    CourseSchedule getStudentHistoryLastCourse(@Param("studentId") Integer studentId,
+                                               @Param("monday") String monday,
+                                               @Param("courseType")CourseSchedule.CourseScheduleType courseType);
 }

+ 30 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -2,7 +2,10 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.common.dal.BaseDAO;
@@ -12,11 +15,11 @@ import org.apache.ibatis.annotations.Param;
 public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> {
 
     /**
+     * @param musicGroupPaymentStudentCourseDetails:
+     * @return int
      * @describe 批量更新
      * @author qnc99
      * @date 2020/12/1 0001
-     * @param musicGroupPaymentStudentCourseDetails:
-     * @return int
      */
     int batchUpdate(@Param("paymentCourseDetails") List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails);
 
@@ -30,8 +33,8 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      * @date 2020.11.04
      */
     List<MusicGroupPaymentStudentCourseDetail> getUnUseWithStudentAndCourseTypeAndCourseMinutes(@Param("batchNo") String batchNo,
-                                                                                          @Param("studentId") Integer studentId,
-                                                                                          @Param("courseType") CourseSchedule.CourseScheduleType courseType);
+                                                                                                @Param("studentId") Integer studentId,
+                                                                                                @Param("courseType") CourseSchedule.CourseScheduleType courseType);
 
     /**
      * @param studentId:
@@ -59,14 +62,16 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
 
     /**
      * 删除用户购买乐团课程记录
+     *
      * @param userId
      * @param musicGroupId
      * @return
      */
     int deleteByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
-    
+
     /**
      * 根据缴费编号删除信息
+     *
      * @param musicGroupPaymentCalenderId
      * @return
      */
@@ -74,15 +79,34 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
 
     /**
      * 删除信息
+     *
      * @param musicGroupPaymentCalenderDetailIdList
      * @return
      */
     int deleteByMusicGroupPaymentCalenderDetailId(List<Long> musicGroupPaymentCalenderDetailIdList);
-    
+
     /**
      * 查询对象
+     *
      * @param musicGroupPaymentCalenderDetailIdList
      * @return
      */
     List<MusicGroupPaymentStudentCourseDetail> queryByMusicGroupPaymentStudentCourseDetailId(List<Long> musicGroupPaymentCalenderDetailIdList);
+
+    /**
+     * 获取乐团学员剩余可排课时长
+     *
+     * @param studentIds
+     * @return
+     */
+    List<Map<Integer, BigDecimal>> queryStudentSubTotalCourseTime(@Param("studentIds") Set<Integer> studentIds, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取学员关联的每种课程类型的剩余可排课时长
+     *
+     * @param userId
+     * @param musicGroupId
+     * @return
+     */
+    List<Map<Integer, Integer>> queryStudentSubTotalCourseTimes(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
 import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
 import com.ym.mec.biz.dal.dto.StudentHomeworkRecordDto;
 import com.ym.mec.biz.dal.dto.StudentServeCourseHomeworkDto;
+import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -97,6 +97,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     List<StudentServeCourseDto> getServeStudentCourseStartTimes(@Param("monday") String monday);
 
+    List<StudentServeCourseDto> getStudentFutureCourseInfo(@Param("monday") String monday,
+                                                           @Param("studentIds") List<Integer> studentIds);
+
     /**
      * @param monday:
      * @return java.util.List<com.ym.mec.biz.dal.dto.StudentServeDto>

+ 27 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -20,6 +20,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      */
     int batchInsert(@Param("situations")List<StudentExtracurricularExercisesSituation> situations);
 
+    int batchUpdate(@Param("situations")List<StudentExtracurricularExercisesSituation> situations);
+
     /**
      * @describe 根据周一日期删除统计信息
      * @author Joburgess
@@ -36,7 +38,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      * @param studentId: 学员编号
      * @return int
      */
-    int deleteByStudent(@Param("studentId") Integer studentId);
+    int deleteByStudent(@Param("studentId") Integer studentId,
+                        @Param("monday") String monday);
 
     List<StudentExercisesSituationDto> findExercisesSituations(Map<String, Object> params);
     int countExercisesSituations(Map<String, Object> params);
@@ -54,6 +57,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
     List<TeacherExercisesServiceDto> findTeacherExercisesServiceSituations(@Param("monday") String monday,
                                                                            @Param("teacherIds") List<Integer> teacherIds);
 
+    List<StudentExtracurricularExercisesSituation> findTeacherNoStartServices(@Param("teacherId") Integer teacherId);
+
     /**
      * @describe 统计上周数据今日跟新的条数
      * @author Joburgess
@@ -83,4 +88,25 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
      */
     List<Map<Integer, Long>> getNoFinishedServiceTeacher(@Param("monday") String monday);
 
+    /**
+     * @describe 统计指定星期的服务记录数量
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param sunday:
+     * @return int
+     */
+    int countWeekServiceNum(@Param("sunday") String sunday);
+
+    /**
+     * @describe 获取指定周指定学员的服务指标
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param monday:
+     * @param studentIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation>
+     */
+    List<StudentExtracurricularExercisesSituation> findWeekServiceWithStudents(@Param("monday") String monday,
+                                                                               @Param("teacherId") Integer teacherId,
+                                                                               @Param("studentIds") List<Integer> studentIds);
+
 }

+ 16 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -283,16 +283,28 @@ public interface StudentManageDao {
     /**
      * 获取教务老师关联vip的学员列表
      *
-     * @param groupType
      * @return
      */
-    List<BasicUserDto> queryVipGroupStudents(@Param("userId") Integer userId);
+    List<BasicUserDto> queryVipGroupStudents(Map<String, Object> params);
+
+    /**
+     * 获取教务老师关联vip的学员列表
+     *
+     * @return
+     */
+    int countVipGroupStudents(Map<String, Object> params);
+
+    /**
+     * 获取教务老师关联网管课的学员列表
+     *
+     * @return
+     */
+    List<BasicUserDto> queryPracticeGroupStudents(Map<String, Object> params);
 
     /**
      * 获取教务老师关联网管课的学员列表
      *
-     * @param groupType
      * @return
      */
-    List<BasicUserDto> queryPracticeGroupStudents(@Param("userId") Integer userId);
+    int countPracticeGroupStudents(Map<String, Object> params);
 }

+ 6 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMessageDao.java

@@ -15,7 +15,8 @@ public interface SysMessageDao extends BaseDAO<Long, SysMessage> {
 
 	/**
 	 * 根据状态查询最近N分钟的记录
-	 * @param status 状态值
+	 *
+	 * @param status    状态值
 	 * @param recentMin 最近分钟数
 	 * @return
 	 */
@@ -23,6 +24,7 @@ public interface SysMessageDao extends BaseDAO<Long, SysMessage> {
 
 	/**
 	 * 批量插入
+	 *
 	 * @param messages
 	 * @return
 	 */
@@ -30,16 +32,17 @@ public interface SysMessageDao extends BaseDAO<Long, SysMessage> {
 
 	/**
 	 * 查询消息未读条数
+	 *
 	 * @param type
 	 * @param userId
 	 * @return
 	 */
-	public List<Mapper> queryCountOfUnread(@Param("type") MessageSendMode type, @Param("userId") Integer userId);
+	public List<Mapper> queryCountOfUnread(@Param("type") MessageSendMode type, @Param("userId") Integer userId, @Param("jpushType") String jpushType);
 
 	/**
 	 * 修改用户所有消息阅读状态
 	 */
-	public int updateStatus(@Param("userId") Integer userId, @Param("status") int status);
+	public int updateStatus(@Param("userId") Integer userId, @Param("status") int status, @Param("jpushType") String jpushType);
 
 	/**
 	 * 修改单个消息状态

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java

@@ -64,6 +64,17 @@ public class MusicGroupStudentsDto{
 
     private String nextPaymentDateStr;
 
+    @ApiModelProperty(value = "剩余可排课时长",required = false)
+    private BigDecimal subTotalCourseTime;
+
+    public BigDecimal getSubTotalCourseTime() {
+        return subTotalCourseTime;
+    }
+
+    public void setSubTotalCourseTime(BigDecimal subTotalCourseTime) {
+        this.subTotalCourseTime = subTotalCourseTime;
+    }
+
     public String getPaymentPeriodList() {
         return paymentPeriodList;
     }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java

@@ -17,11 +17,24 @@ public class StudentAttendanceDto {
 
     private Long courseScheduleId;
 
+    @ApiModelProperty(value = "签退附件")
+    private String signOutAttachments;
+
     @ApiModelProperty(value = "备注",required = false)
     private String remark;
 
+    private String deviceNum;
+
     private List<StudentAttendance> studentAttendances;
 
+    public String getDeviceNum() {
+        return deviceNum;
+    }
+
+    public void setDeviceNum(String deviceNum) {
+        this.deviceNum = deviceNum;
+    }
+
     public String getRemark() {
         return remark;
     }
@@ -61,4 +74,12 @@ public class StudentAttendanceDto {
     public void setStudentAttendances(List<StudentAttendance> studentAttendances) {
         this.studentAttendances = studentAttendances;
     }
+
+    public String getSignOutAttachments() {
+        return signOutAttachments;
+    }
+
+    public void setSignOutAttachments(String signOutAttachments) {
+        this.signOutAttachments = signOutAttachments;
+    }
 }

+ 61 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentNoStartCoursesDto.java

@@ -0,0 +1,61 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentNoStartCoursesDto{
+
+    @ApiModelProperty(value = "教师名称",required = false)
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程名称",required = false)
+    private String name;
+
+    @ApiModelProperty(value = "课程日期",required = false)
+    private String classDate;
+
+    @ApiModelProperty(value = "课程开始时间",required = false)
+    private String startClassTime;
+
+    @ApiModelProperty(value = "课程结束时间",required = false)
+    private String endClassTime;
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+}

+ 78 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeCourseDto.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachModeEnum;
+
 import java.util.Date;
 
 /**
@@ -10,10 +14,48 @@ public class StudentServeCourseDto {
 
     private Integer studentId;
 
+    private Integer leadTeacherId;
+
+    private Long courseScheduleId;
+
+    private GroupType groupType;
+
+    private String musicGroupId;
+
+    private CourseSchedule.CourseScheduleType type;
+
+    private Integer actualTeacherId;
+
     private Date courseStartTime;
 
     private Date serviceTagUpdateTime;
 
+    private TeachModeEnum teachMode;
+
+    public Integer getLeadTeacherId() {
+        return leadTeacherId;
+    }
+
+    public void setLeadTeacherId(Integer leadTeacherId) {
+        this.leadTeacherId = leadTeacherId;
+    }
+
+    public TeachModeEnum getTeachMode() {
+        return teachMode;
+    }
+
+    public void setTeachMode(TeachModeEnum teachMode) {
+        this.teachMode = teachMode;
+    }
+
+    public Date getCourseStartTime() {
+        return courseStartTime;
+    }
+
+    public void setCourseStartTime(Date courseStartTime) {
+        this.courseStartTime = courseStartTime;
+    }
+
     public Date getServiceTagUpdateTime() {
         return serviceTagUpdateTime;
     }
@@ -30,11 +72,43 @@ public class StudentServeCourseDto {
         this.studentId = studentId;
     }
 
-    public Date getCourseStartTime() {
-        return courseStartTime;
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
     }
 
-    public void setCourseStartTime(Date courseStartTime) {
-        this.courseStartTime = courseStartTime;
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public CourseSchedule.CourseScheduleType getType() {
+        return type;
+    }
+
+    public void setType(CourseSchedule.CourseScheduleType type) {
+        this.type = type;
+    }
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
     }
 }

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
@@ -37,6 +39,8 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "班级类型",required = false)
     private ClassGroupTypeEnum classType;
 
+    private CourseSchedule.CourseScheduleType courseType;
+
     @ApiModelProperty(value = "乐团ID",required = false)
     private String musicGroupId;
 
@@ -88,10 +92,29 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "是否是第一次进行学生点名")
     private int studentAttendanceIsFirstTime;
 
+    @ApiModelProperty(value = "能否布置作业")
+    private int enableAssignHomework;
+
     private Integer enableStudentAttendanceTimeRange;
 
     private Integer enableStudentAttendanceTimeRangeVip;
 
+    public CourseSchedule.CourseScheduleType getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
+        this.courseType = courseType;
+    }
+
+    public int getEnableAssignHomework() {
+        return enableAssignHomework;
+    }
+
+    public void setEnableAssignHomework(int enableAssignHomework) {
+        this.enableAssignHomework = enableAssignHomework;
+    }
+
     public Integer getEnableStudentAttendanceTimeRangeVip() {
         return enableStudentAttendanceTimeRangeVip;
     }

+ 34 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
@@ -52,6 +53,34 @@ public class StudentExtracurricularExercisesSituation {
 
 	private String serveType;
 
+	private String courseIds;
+
+	public StudentExtracurricularExercisesSituation() {
+	}
+
+	public StudentExtracurricularExercisesSituation(Integer studentId, Integer teacherId, Integer weekOfYear, Date monday, Date sunday,  String serveType, String courseIds) {
+		this.studentId = studentId;
+		this.weekOfYear = weekOfYear;
+		this.monday = monday;
+		this.sunday = sunday;
+		this.teacherId = teacherId;
+		this.serveType = serveType;
+		this.courseIds = courseIds;
+		this.expectExercisesNum = 1;
+		this.actualExercisesNum = 0;
+		this.exercisesReplyNum = 0;
+		this.exercisesMessageNum = 0;
+		this.exercisesMessageTimelyNum = 0;
+	}
+
+	public String getCourseIds() {
+		return courseIds;
+	}
+
+	public void setCourseIds(String courseIds) {
+		this.courseIds = courseIds;
+	}
+
 	public String getServeType() {
 		return serveType;
 	}
@@ -171,7 +200,11 @@ public class StudentExtracurricularExercisesSituation {
 	public java.util.Date getUpdateTime(){
 		return this.updateTime;
 	}
-			
+
+	public String getStuAndTeaCode(){
+		return StringUtils.join(this.studentId, this.teacherId);
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMessage.java

@@ -64,6 +64,17 @@ public class SysMessage {
 	@ApiModelProperty(value = "消息组",required = false)
 	private String group;
 
+	@ApiModelProperty(value = "极光推送客户端标识",required = false)
+	private String jpushType;
+
+	public String getJpushType() {
+		return jpushType;
+	}
+
+	public void setJpushType(String jpushType) {
+		this.jpushType = jpushType;
+	}
+
 	public SysMessage() {
 	}
 

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -102,6 +102,38 @@ public class TeacherAttendance {
 	@ApiModelProperty(value = "考勤申述凭证")
 	private String url;
 
+	@ApiModelProperty(value = "签到设备号")
+	private String signInDeviceNo;
+
+	@ApiModelProperty(value = "签退设备号")
+	private String signOutDeviceNo;
+
+	private String deviceNum;
+
+	public String getDeviceNum() {
+		return deviceNum;
+	}
+
+	public void setDeviceNum(String deviceNum) {
+		this.deviceNum = deviceNum;
+	}
+
+	public String getSignInDeviceNo() {
+		return signInDeviceNo;
+	}
+
+	public void setSignInDeviceNo(String signInDeviceNo) {
+		this.signInDeviceNo = signInDeviceNo;
+	}
+
+	public String getSignOutDeviceNo() {
+		return signOutDeviceNo;
+	}
+
+	public void setSignOutDeviceNo(String signOutDeviceNo) {
+		this.signOutDeviceNo = signOutDeviceNo;
+	}
+
 	public String getUrl() {
 		return url;
 	}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderDetailQueryInfo.java

@@ -17,6 +17,8 @@ public class MusicCalenderDetailQueryInfo extends QueryInfo {
 	private Long id;
 	
 	private String responsibleRealName;
+	
+	private String batchNo;
 
 	public String getPaymentStatus() {
 		return paymentStatus;
@@ -73,4 +75,12 @@ public class MusicCalenderDetailQueryInfo extends QueryInfo {
 	public void setResponsibleRealName(String responsibleRealName) {
 		this.responsibleRealName = responsibleRealName;
 	}
+
+	public String getBatchNo() {
+		return batchNo;
+	}
+
+	public void setBatchNo(String batchNo) {
+		this.batchNo = batchNo;
+	}
 }

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java

@@ -10,8 +10,38 @@ import java.util.List;
  */
 public class StudentQueryInfo extends QueryInfo {
 
+    private String groupType;
+
+    private Integer teacherId;
+
+    private Integer studentId;
+
     private List<String> organIdList;
 
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
     public List<String> getOrganIdList() {
         return organIdList;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMessageQueryInfo.java

@@ -23,9 +23,19 @@ public class SysMessageQueryInfo extends QueryInfo {
 	private Integer type;
 	
 	private String group;
+
+	private String jpushType;
 	
 	private Integer readStatus;
 
+	public String getJpushType() {
+		return jpushType;
+	}
+
+	public void setJpushType(String jpushType) {
+		this.jpushType = jpushType;
+	}
+
 	public Integer getStatus() {
 		return status;
 	}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java

@@ -1,7 +1,10 @@
 package com.ym.mec.biz.event.listener;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.event.CourseStatusChangeEvent;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.redis.service.RedisCache;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -9,8 +12,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @Author qnc99
@@ -27,6 +34,10 @@ public class CourseEventListener {
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
     private RedisCache<String, Object> redisCache;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Async
     @EventListener
@@ -50,4 +61,29 @@ public class CourseEventListener {
             redisCache.delete(KEY);
         }
     }
+
+    @Async
+    @EventListener
+    public void courseStatusChangeMonitor2(CourseStatusChangeEvent courseStatusChangeEvent){
+        if(redisCache.getRedisTemplate().opsForValue().size("exercisesSituationStatistics2")>0){
+            return;
+        }
+
+        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("exercisesSituationStatistics2", Thread.currentThread().getId(), 1, TimeUnit.HOURS);
+        if(!success){
+            return;
+        }
+
+
+        try{
+            List<CourseScheduleStudentPayment> cssps = courseScheduleStudentPaymentDao.findByCourseScheduleIds(new ArrayList<>(courseStatusChangeEvent.getCourseIds()));
+            if(CollectionUtils.isEmpty(cssps)){
+                return;
+            }
+            List<Integer> studentIds = cssps.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+            studentServeService.exercisesSituationStatistics2(null,studentIds);
+        } finally {
+            redisCache.delete("exercisesSituationStatistics2");
+        }
+    }
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -235,7 +235,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
      * @describe 获取老师所在班级列表
      */
-    List<TeacherClassGroupDto> findTeacherClassGroups(String type);
+    List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status);
 
     /**
      * @Author: Joburgess

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -185,4 +185,22 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherAttendanceDto>
      */
     List<TeacherAttendancesDto> getCourseTeachers(Long courseScheduleId);
+
+    /**
+     * @describe 工资奖金标记
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @return void
+     */
+    void salaryMark();
+
+    /**
+     * @describe 组合工资,使其最接近给定的金额
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param salaries:
+     * @param targetSalary:
+     * @return void
+     */
+    List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesMessageService.java

@@ -16,6 +16,8 @@ public interface ExtracurricularExercisesMessageService extends BaseService<Long
      */
     void addStudentExtraExerciseComment(ExtracurricularExercisesMessage extracurricularExercisesMessage);
 
+
+
     /**
      * @describe 获取学生课外作业评论列表
      * @author Joburgess

+ 18 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -6,15 +6,9 @@ import java.util.Map;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
-import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
-import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 
 /**
  * @Author Joburgess
@@ -197,8 +191,22 @@ public interface StudentManageService {
 
     /**
      * 获取教务老师关联的学员列表
-     * @param groupType
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo queryInfo);
+
+    /**
+     * 获取当前教务老师关联的课程组上该学员的所有剩余课程
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo);
+
+    /**
+     * 乐团管理--乐团详情--学员列表--获取学员可排课时长
+     * @param userId
      * @return
      */
-    List<BasicUserDto> queryGroupStudents(String groupType);
+    Map<Integer, Integer> queryStudentSubTotalCourseTimes(Integer userId,String musicGroupId);
 }

+ 17 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java

@@ -1,6 +1,9 @@
 package com.ym.mec.biz.service;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Author Joburgess
@@ -17,6 +20,8 @@ public interface StudentServeService {
      */
     void exercisesSituationStatistics(String monday);
 
+    void exercisesSituationStatistics2(String monday, List<Integer> studentIds);
+
     /**
      * @describe
      * @author Joburgess
@@ -25,6 +30,17 @@ public interface StudentServeService {
      * @param studentIds:
      * @return int
      */
-    Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIds);
+    Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIds, Integer teacherId);
+
+    /**
+     * @describe 获取教师应布置课程编号列表
+     * @author Joburgess
+     * @date 2020/12/25 0025
+     * @param teacherId:
+     * @return java.util.Set<java.lang.Long>
+     */
+    Set<Long> getTeacherServeCourseIds(Integer teacherId);
+
+    void updateExercisesSituation(Date date, List<Integer> studentIds, Integer teacherId);
 
 }

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java

@@ -107,7 +107,7 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	 * @param userId
 	 * @return
 	 */
-	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId);
+	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId,String jpushType);
 
 	/**
 	 *
@@ -115,7 +115,7 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	 * @param status 状态/1 已读,0未读
 	 * @return
 	 */
-	public int updateStatus(Integer userId, int status);
+	public int updateStatus(Integer userId, int status,String jpushType);
 
 	/**
 	 * 修改单条消息状态

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java

@@ -37,7 +37,8 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @return void
 	 */
 	void addTeacherAttendanceSignOut(Long courseScheduleId,
-									Integer userId);
+									Integer userId,
+									 String deviceNum);
 
 
 
@@ -51,7 +52,7 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param courseScheduleId:
 	 * @return void
 	 */
-	void addTeacherAttendanceSignIn(Long firstCourseId,Integer userId, Long courseScheduleId);
+	void addTeacherAttendanceSignIn(Long firstCourseId,Integer userId, Long courseScheduleId,String deviceNum);
 
 	/**
 	 * 获取教师个人的签到记录

+ 4 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1354,7 +1354,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<TeacherClassGroupDto> findTeacherClassGroups(String type) {
+    public List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (Objects.isNull(user)) {
             throw new BizException("请登录");
@@ -1367,13 +1367,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         switch (type) {
             case "VIP":
-                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue());
+                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue(),status);
                 break;
             case "MUSIC_GROUP":
                 teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(user.getId().longValue());
                 break;
             case "PRACTICE":
-                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue());
+                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue(),status);
                 break;
             default:
                 throw new BizException("课程类型错误");
@@ -1632,7 +1632,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 Map<Integer, Integer> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-//                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
+                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
                 });
             }
         }

+ 7 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -14,6 +14,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.ImPrivateMessage;
 import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.mec.im.ImFeignService;
@@ -29,11 +30,6 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseReview4EduQueryInfo;
 import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.CourseReviewService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -98,6 +94,9 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
     @Autowired
     private VipGroupDao vipGroupDao;
 
+    @Autowired
+    private StudentServeService studentServeService;
+
     @Override
     public BaseDAO<Integer, CourseScheduleReview> getDAO() {
         return courseScheduleReviewDao;
@@ -607,6 +606,9 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_REMIND,
                         userMap, null, 0, 3 + notifyUrl, "STUDENT", teacher.getRealName(), courseSchedule.getName(), dateStr);
             }
+
+            List<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+            studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, courseSchedule.getActualTeacherId());
         }
 
         return courseHomework;

+ 43 - 28
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -30,6 +30,7 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.ym.mec.biz.service.*;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -144,17 +145,6 @@ import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.event.source.CourseEventSource;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseHomeworkService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
@@ -252,6 +242,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
     @Autowired
 	private CourseEventSource courseEventSource;
+    @Autowired
+	private StudentServeService studentServeService;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -297,7 +289,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             currentCourseDetail.setOnlyNormal(YesOrNoEnum.NO);
         }
 
-        currentCourseDetail.setCurrentClassTimes(courseScheduleDao.countClassGroupOverCourseNum(currentCourseDetail.getClassId()));
+		Set<Long> teacherServeCourseIds = studentServeService.getTeacherServeCourseIds(user.getId());
+        if(teacherServeCourseIds.contains(courseID)){
+			currentCourseDetail.setEnableAssignHomework(1);
+		}
+
+		currentCourseDetail.setCurrentClassTimes(courseScheduleDao.countClassGroupOverCourseNum(currentCourseDetail.getClassId()));
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
         SysConfig sysConfigVip = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
         currentCourseDetail.setEnableStudentAttendanceTimeRange(sysConfig.getParanValue(Integer.class));
@@ -311,7 +308,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
-        currentCourseDetail.setAttendanceRange(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
+		currentCourseDetail.setAttendanceRange(CourseScheduleType.VIP.equals(currentCourseDetail.getCourseType())?Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE_VIP)):Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
         currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
         return currentCourseDetail;
     }
@@ -5250,9 +5247,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		allCourseIds.addAll(courseMergeInfo.getMergeCourseIds());
 		List<CourseSchedule> allCourses = courseScheduleDao.findByCourseScheduleIds(allCourseIds);
 		int courseTypeNum = allCourses.stream().map(CourseSchedule::getType).collect(Collectors.toSet()).size();
-		if(courseTypeNum>1){
-			throw new BizException("课程合并仅支持同课程类型");
-		}
+//		if(courseTypeNum>1){
+//			throw new BizException("课程合并仅支持同课程类型");
+//		}
 		for (CourseSchedule courseSchedule : allCourses) {
 			if(Objects.nonNull(courseSchedule.getNewCourseId())){
 				throw new BizException("存在已合并课程");
@@ -5272,12 +5269,31 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			courseSchedule.setNote("课程合并");
 		}
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(allCourseIds);
-//		Map<Long, Set<Integer>> courseStudentIdsMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getUserId, Collectors.toSet())));
+		Map<Long, Set<Integer>> courseStudentIdsMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getUserId, Collectors.toSet())));
 		Set<Integer> allStudentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
-		if(courseScheduleStudentPayments.size()!=allStudentIds.size()){
-			throw new BizException("所选课程中学员重复");
-		}
 
+		Map<Integer, CourseScheduleStudentPayment> mainStudentCourseMap = courseScheduleStudentPayments.stream().filter(c -> courseMergeInfo.getId().equals(c.getCourseScheduleId())).collect(Collectors.toMap(CourseScheduleStudentPayment::getUserId, c -> c, (c1, c2) -> c1));
+		List<CourseScheduleStudentPayment> newPayments = new ArrayList<>();
+		List<CourseScheduleStudentPayment> updatePayments = new ArrayList<>();
+		for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+			CourseScheduleStudentPayment updatePayment = mainStudentCourseMap.get(courseScheduleStudentPayment.getUserId());
+			if(Objects.nonNull(updatePayment)&&updatePayment.getCourseScheduleId().equals(courseScheduleStudentPayment.getCourseScheduleId())){
+				continue;
+			}
+			if(updatePayment.getUserId().equals(courseScheduleStudentPayment.getUserId())){
+				updatePayment.setExpectPrice(updatePayment.getExpectPrice().add(courseScheduleStudentPayment.getExpectPrice()));
+				courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
+				updatePayments.add(updatePayment);
+				updatePayments.add(courseScheduleStudentPayment);
+				continue;
+			}
+			CourseScheduleStudentPayment newPayment = new CourseScheduleStudentPayment();
+			BeanUtils.copyProperties(courseScheduleStudentPayment, newPayment);
+			newPayment.setCourseScheduleId(courseMergeInfo.getId());
+			newPayment.setClassGroupId(courseMergeInfo.getClassGroupId());
+			courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
+			updatePayments.add(courseScheduleStudentPayment);
+		}
 
 		List<CourseSchedule> courseSchedules=new ArrayList<>();
 		courseMergeInfo.setNewCourseId(courseMergeInfo.getId());
@@ -5293,9 +5309,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 			//课程信息变更
 			courseSchedule.setNewCourseId(courseMergeInfo.getId());
-			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
-			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
-			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
+//			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
+//			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
+//			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
 //			courseSchedule.setActualTeacherId(courseMergeInfo.getActualTeacherId());
 //			courseSchedule.setClassGroupId(courseMergeInfo.getClassGroupId());
 //			courseSchedule.setSchoolId(courseMergeInfo.getSchoolId());
@@ -5305,11 +5321,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			insertCourseScheduleModifyLogList.add(courseScheduleModifyLog);
 		}
 		courseScheduleDao.batchUpdate(mergeCourses);
-		for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
-			courseScheduleStudentPayment.setCourseScheduleId(courseMergeInfo.getId());
-			courseScheduleStudentPayment.setClassGroupId(courseMergeInfo.getClassGroupId());
-		}
-		courseScheduleStudentPaymentDao.batchUpdate(courseScheduleStudentPayments);
+
+		courseScheduleStudentPaymentDao.batchUpdate(updatePayments);
+		if(!CollectionUtils.isEmpty(newPayments))
+			courseScheduleStudentPaymentDao.batchInsert(newPayments);
 
 		courseAdjust(courseSchedules);
 

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1352,4 +1352,52 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         return result;
     }
+
+    @Override
+    public void salaryMark() {
+
+    }
+
+    @Override
+    public List<BigDecimal> salaryComposition(List<BigDecimal> salaries, BigDecimal targetSalary) {
+        int target = targetSalary.intValue();
+        BigDecimal zero = new BigDecimal(0);
+
+        List<List<List<BigDecimal>>> result = new LinkedList<>();
+        for(int j=0;j<2;j++){
+            result.add(new ArrayList<>());
+            for(int i=0;i<target+1;i++){
+                List<List<BigDecimal>> t=new ArrayList<>();
+                List<BigDecimal> b = new ArrayList<BigDecimal>();
+                b.add(zero);
+                t.add(b);
+                result.get(j).addAll(t);
+            }
+        }
+
+        int salary_index_pre = 0;
+        int salary_index_cur = 1;
+
+        for(int i=1;i<salaries.size()+1;i++){
+            for(int j = 1;j<target+1;j++){
+                if(j<salaries.get(i-1).intValue()){
+                    result.get(salary_index_cur).get(j).clear();
+                    result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j));
+                }else{
+                    BigDecimal pre = result.get(salary_index_pre).get(j).stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal t = result.get(salary_index_pre).get(j-salaries.get(i-1).intValue()).stream().reduce(BigDecimal.ZERO, BigDecimal::add).add(salaries.get(i-1));
+                    if(t.compareTo(pre)>0){
+                        result.get(salary_index_cur).get(j).clear();
+                        result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j-salaries.get(i-1).intValue()));
+                        result.get(salary_index_cur).get(j).add(salaries.get(i-1));
+                    }else{
+                        result.get(salary_index_cur).get(j).clear();
+                        result.get(salary_index_cur).get(j).addAll(result.get(salary_index_pre).get(j));
+                    }
+                }
+            }
+            Collections.swap(result, 0, 1);
+        }
+        return result.get(0).get(target);
+    }
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesMessageServiceImpl.java

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -45,6 +46,8 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesMessage> getDAO() {
@@ -135,6 +138,7 @@ public class ExtracurricularExercisesMessageServiceImpl extends BaseServiceImpl<
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.EXTRA_STUDENT_REPLY_PUSH,
 					userMap, null, 0, 9+notifyUrl, "TEACHER", extracurricularExercises.getTitle(), user.getUsername());
 		}
+		studentServeService.updateExercisesSituation(extracurricularExercises.getCreateTime(), new ArrayList<>(Arrays.asList(extracurricularExercisesReply.getUserId())), extracurricularExercises.getTeacherId());
 	}
 
 	@Override

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -51,6 +52,8 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 	private StudentDao studentDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercisesReply> getDAO() {
@@ -165,6 +168,8 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		extracurricularExercises.setCompletedNum(submitStudentNum);
 		extracurricularExercisesDao.update(extracurricularExercises);
 
+		studentServeService.updateExercisesSituation(extracurricularExercises.getCreateTime(), Arrays.asList(extracurricularExercisesReply.getUserId()), extracurricularExercises.getTeacherId());
+
 		if(push){
 			Map<Integer, String> userMap = new HashMap<>();
 			userMap.put(extracurricularExercises.getTeacherId(), extracurricularExercises.getTeacherId().toString());

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1281,6 +1281,16 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		List<Long> calenderIds = new ArrayList<Long>();
 		calenderIds.add(id);
 		musicGroupPaymentCalenderCourseSettingsDao.deleteByMusicGroupPaymentCalenderId(calenderIds);
+		
+		//如果乐团是“费用审核”,则需要修改状态
+		MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+		if(musicGroup != null){
+			if(musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT){
+				musicGroup.setStatus(MusicGroupStatusEnum.DRAFT);
+				musicGroup.setUpdateTime(new Date());
+				musicGroupDao.update(musicGroup);
+			}
+		}
 	}
 
 	@Override

+ 12 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -1578,8 +1578,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             //删除续费周期
             musicGroupStudentFeeDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
-            //删除缴费明细
-            musicGroupPaymentCalenderDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
             // 退团
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.QUIT);
             studentRegistration.setUpdateTime(date);
@@ -1600,9 +1598,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentDao.update(student);
             }
 
+
             //删除用户购买的课程记录
             musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
 
+            //缴费项目预计人数减一
+            musicGroupPaymentCalenderDao.cutCalenderExpectNum(userId, musicGroupId);
+            //删除缴费项目详情
+            musicGroupPaymentCalenderDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
             //操作人
             SysUser operator = sysUserFeignService.queryUserInfo();
 
@@ -1754,6 +1758,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         //删除用户购买的课程记录
         musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
 
+        //缴费项目预计人数减一
+        musicGroupPaymentCalenderDao.cutCalenderExpectNum(userId, musicGroupId);
+        //删除缴费项目详情
+        musicGroupPaymentCalenderDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
+
         //操作人
         SysUser operator = sysUserFeignService.queryUserInfo();
 
@@ -1834,16 +1843,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
                     PlatformCashAccountDetailTypeEnum.REFUNDS, null, SUCCESS, "退出乐团", null);
         }
-
-        //缴费项目预计人数减一
-        musicGroupPaymentCalenderDao.cutCalenderExpectNum(userId, musicGroupId);
-        //删除缴费项目
-        List<Long> calenderIds = musicGroupPaymentCalenderDao.findStudentNoPaymentCalender(userId, musicGroupId);
-        //删除缴费项目详情
-        musicGroupPaymentCalenderDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
-        if (calenderIds != null && calenderIds.size() > 0) {
-            musicGroupPaymentCalenderDao.delByIds(calenderIds);
-        }
+        
         return true;
     }
 

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -278,6 +278,9 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         teacherAttendance.setSignOutStatus(isInScore?YesOrNoEnum.YES:YesOrNoEnum.NO);
         teacherAttendance.setCurrentClassTimes(classTimes + 1);
         teacherAttendance.setRemark(studentAttendanceInfos.getRemark());
+        teacherAttendance.setSignInDeviceNo(studentAttendanceInfos.getDeviceNum());
+        teacherAttendance.setSignOutDeviceNo(studentAttendanceInfos.getDeviceNum());
+        teacherAttendance.setSignOutAttachments(studentAttendanceInfos.getSignOutAttachments());
         if (Objects.nonNull(teacherAttendance.getId())) {
             teacherAttendanceDao.update(teacherAttendance);
         } else {

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java

@@ -12,10 +12,7 @@ import com.ym.mec.biz.dal.entity.StudentCourseHomeworkReply;
 import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
-import com.ym.mec.biz.service.StudentCourseHomeworkReplyService;
-import com.ym.mec.biz.service.StudentCourseHomeworkService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -44,6 +41,8 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 	private SysConfigDao sysConfigDao;
 	@Autowired
 	private SysMessageService sysMessageService;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, StudentCourseHomeworkReply> getDAO() {
@@ -111,6 +110,8 @@ public class StudentCourseHomeworkReplyServiceImpl extends BaseServiceImpl<Long,
 
 		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.HOMEWORK_TEACHER_REPLY_PUSH,
 				userMap, null, 0, 3+notifyUrl, "STUDENT", user.getRealName(), courseSchedule.getName());
+
+		studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), Arrays.asList(studentCourseHomework.getUserId()), courseSchedule.getActualTeacherId());
 		super.insert(bean);
 	}
 

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -62,6 +63,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     private StudentDao studentDao;
     @Autowired
     private SubjectDao subjectDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
@@ -146,6 +149,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
             }
         }
 
+        studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(bean.getUserId())), courseSchedule.getTeacherId());
+
 //        CourseHomework temp = courseHomeworkService.get(courseHomework.getId());
 //        if (temp.getExpectNum().equals(courseHomework.getCompletedNum())) {
         Integer userId = bean.getUserId();

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -60,8 +60,6 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			pageInfo.setTotal(count);
 			params.put("offset", pageInfo.getOffset());
 			dataList = studentExtracurricularExercisesSituationDao.findExercisesSituations(params);
-			long until = LocalDateTime.ofInstant(queryInfo.getMonday().toInstant(), DateUtil.zoneId).until(LocalDateTime.ofInstant(queryInfo.getSunday().toInstant(), DateUtil.zoneId), ChronoUnit.WEEKS);
-
 			List<Integer> studentIds = dataList.stream().map(StudentExtracurricularExercisesSituation::getStudentId).collect(Collectors.toList());
 			List<Map<Integer, Long>> studentVipCoursesMaps = courseScheduleDao.countStudentVipCoursesWithDate(studentIds, queryInfo.getMonday(), queryInfo.getSunday(), GroupType.VIP);
 			Map<Integer, Long> studentVipCourseMap = MapUtil.convertIntegerMap(studentVipCoursesMaps);

+ 64 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -8,8 +12,11 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.SysConfigService;
 
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,14 +47,6 @@ import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
-import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
-import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
 import com.ym.mec.biz.service.StudentManageService;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -68,7 +67,7 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Autowired
     private StudentManageDao studentManageDao;
     @Autowired
-    private OrganizationDao organizationDao;
+    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
     @Autowired
     private CourseScheduleStudentPaymentDao scheduleStudentPaymentDao;
     @Autowired
@@ -416,18 +415,8 @@ public class StudentManageServiceImpl implements StudentManageService {
         PageInfo<MusicGroupStudentsDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-//        if(StringUtils.isNotEmpty(queryInfo.getPaymentStatus())){
-//            List<Integer> userIds;
-//            if("NON_PAYMENT".equals(queryInfo.getPaymentStatus())){
-//                userIds = musicGroupPaymentCalenderDao.queryUserByNoPayment(queryInfo.getClassGroupId());
-//            }else {
-//                userIds = musicGroupPaymentCalenderDao.queryUserByPayment(queryInfo.getClassGroupId());
-//            }
-//            if(userIds != null && userIds.size() > 0){
-//                params.put("userIds",userIds);
-//            }
-//        }
         List<MusicGroupStudentsDto> dataList = null;
+        String musicGroupId = queryInfo.getMusicGroupId();
         int count = studentManageDao.countMusicGroupStudent(params);
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
@@ -438,7 +427,11 @@ public class StudentManageServiceImpl implements StudentManageService {
             dataList = studentManageDao.queryMusicGroupStudent(params);
             //退团的学生
             List<Integer> quitUserIds = dataList.stream().filter(e -> e.getStudentStatus().equals("QUIT")).map(MusicGroupStudentsDto::getUserId).collect(Collectors.toList());
-
+            Set<Integer> studentIds = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+            Map<Integer, BigDecimal> subTotalCourseTimeMap = MapUtil.convertIntegerMap(musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTime(studentIds,musicGroupId));
+            for (MusicGroupStudentsDto musicGroupStudentsDto : dataList) {
+                musicGroupStudentsDto.setSubTotalCourseTime(subTotalCourseTimeMap.get(musicGroupStudentsDto.getUserId()));
+            }
             if (quitUserIds.size() > 0) {
                 List<MusicGroupQuit> quits = musicGroupQuitDao.getQuits(queryInfo.getMusicGroupId(), quitUserIds);
                 for (MusicGroupStudentsDto musicGroupStudentsDto : dataList) {
@@ -448,15 +441,6 @@ public class StudentManageServiceImpl implements StudentManageService {
                     }
                 }
             }
-//            Map<Integer,String> maps = MapUtil.convertIntegerMap(musicGroupStudentFeeDao.findPaymentStatusMap(queryInfo.getMusicGroupId()));
-//            dataList.forEach(e->{
-//                e.setPaymentStatus(maps.get(e.getUserId()));
-//            Set<Integer> collect = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-//            Map<Integer,String> paymentStatusMap = MapUtil.convertIntegerMap(
-//                    musicGroupPaymentCalenderDao.queryUserCoursePaymentStatus(collect,queryInfo.getMusicGroupId()));
-//            dataList.forEach(e -> {
-//                e.setPaymentStatus(paymentStatusMap.get(e.getUserId()));
-//            });
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -597,7 +581,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         student.setTeacherId(student.getTeacherId());
         studentService.upSet(student);
         if (new Integer(2).equals(student.getServiceTag())) {
-            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId());
+            LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+            LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+            studentExtracurricularExercisesSituationDao.deleteByStudent(student.getId(), monDayDate.toString());
         }
         return userId;
     }
@@ -689,15 +675,58 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
-    public List<BasicUserDto> queryGroupStudents(String groupType) {
+    public PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null || sysUser.getId() == null){
             throw new BizException("用户信息获取失败");
         }
-        if("VIP".equals(groupType)){
-            return studentManageDao.queryVipGroupStudents(sysUser.getId());
+        PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        queryInfo.setTeacherId(sysUser.getId());
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        Integer count = 0;
+        if("VIP".equals(queryInfo.getGroupType())){
+            count = studentManageDao.countVipGroupStudents(params);
         }else {
-            return studentManageDao.queryPracticeGroupStudents(sysUser.getId());
+            count = studentManageDao.countPracticeGroupStudents(params);
         }
+        List<BasicUserDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            if("VIP".equals(queryInfo.getGroupType())){
+                dataList = studentManageDao.queryVipGroupStudents(params);
+            }else {
+                dataList = studentManageDao.queryPracticeGroupStudents(params);
+            }
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            throw new BizException("用户信息获取失败");
+        }
+        PageInfo<StudentNoStartCoursesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        queryInfo.setTeacherId(sysUser.getId());
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        Integer count = courseScheduleDao.countStudentNoStartCourse(params);
+        List<StudentNoStartCoursesDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = courseScheduleDao.queryStudentNoStartCourse(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public Map<Integer, Integer> queryStudentSubTotalCourseTimes(Integer userId,String musicGroupId) {
+        return MapUtil.convertIntegerMap(musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(userId,musicGroupId));
     }
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -274,7 +274,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
         Student student = studentDao.getLocked(userId);
         if (student == null) {
-            throw new BizException("查询学生信息失败");
+            throw new BizException("您已登录超时,请重新登录后再次报名");
         }
 
         StudentRegistration hasReg = getByPhoneAndMusicGroupId(studentRegistration.getMusicGroupId(), studentRegistration.getParentsPhone());

+ 323 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -45,6 +45,8 @@ public class StudentServeServiceImpl implements StudentServeService {
     private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
     @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -288,8 +290,317 @@ public class StudentServeServiceImpl implements StudentServeService {
     }
 
     @Override
-    public Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIdsStr) {
+    @Transactional(rollbackFor = Exception.class)
+    public void exercisesSituationStatistics2(String monday, List<Integer> studentIds) {
+        LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+
+        if(StringUtils.isNotBlank(monday)){
+            nowDate=LocalDate.parse(monday, DateUtil.dateFormatter);
+        }
+
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+        Date nextMonday = Date.from(sunDayDate.plusDays(1).atStartOfDay(DateUtil.zoneId).toInstant());
+
+        int weekServiceNum = studentExtracurricularExercisesSituationDao.countWeekServiceNum(monDayDate.toString());
+        if(weekServiceNum>0&&CollectionUtils.isEmpty(studentIds)){
+            return;
+        }
+
+        List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), studentIds);
+        Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
+
+        List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
+
+        for (Map.Entry<Integer, List<StudentServeCourseDto>> studentCourseMapEntry : studentCourseMap.entrySet()) {
+            Map<CourseSchedule.CourseScheduleType, List<StudentServeCourseDto>> typeCourseMap = studentCourseMapEntry.getValue().stream().collect(Collectors.groupingBy(StudentServeCourseDto::getType));
+
+            if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.SINGLE)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<String, List<StudentServeCourseDto>> groupCourseInfoEntry : groupCourseInfo.entrySet()) {
+                        StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        if(!teacherServiceCourseIdMap.containsKey(courseInfo.getActualTeacherId())){
+                            teacherServiceCourseIdMap.put(courseInfo.getActualTeacherId(), new HashSet<>());
+                        }
+                        teacherServiceCourseIdMap.get(courseInfo.getActualTeacherId()).add(courseInfo.getCourseScheduleId());
+                    }
+                    for (Map.Entry<Integer, Set<Long>> teacherServiceCourseIdMapEntry : teacherServiceCourseIdMap.entrySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherServiceCourseIdMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "HOMEWORK", StringUtils.join(teacherServiceCourseIdMapEntry.getValue(), ","));
+                        studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherServiceCourseIdMapEntry.getValue().size());
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.VIP)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<Integer, List<StudentServeCourseDto>> teacherCourseMapEntry : teacherCourseMap.entrySet()) {
+                        StudentServeCourseDto courseInfo = teacherCourseMapEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation;
+                        if(TeachModeEnum.OFFLINE.equals(courseInfo.getTeachMode())){
+                            studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                    futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                    DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                    "EXERCISE", null);
+                        }else{
+                            studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                    teacherCourseMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                    DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                    "HOMEWORK", String.valueOf(courseInfo.getCourseScheduleId()));
+                        }
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.MIX)){
+                CourseSchedule studentHistoryLastCourse = courseScheduleStudentPaymentDao.getStudentHistoryLastCourse(studentCourseMapEntry.getKey(), monDayDate.toString(), CourseSchedule.CourseScheduleType.SINGLE);
+                StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                        Objects.isNull(studentHistoryLastCourse)?studentCourseMapEntry.getValue().get(0).getLeadTeacherId():studentHistoryLastCourse.getActualTeacherId(),
+                        nowDate.get(DateUtil.weekFields.weekOfYear()),
+                        DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                        "EXERCISE", null);
+                if(Objects.isNull(studentExtracurricularExercisesSituation.getTeacherId())){
+                    continue;
+                }
+                results.add(studentExtracurricularExercisesSituation);
+            }else if(typeCourseMap.containsKey(CourseSchedule.CourseScheduleType.PRACTICE)){
+                List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
+                List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(weekCourseInfo)){
+                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                            "EXERCISE", null);
+                    results.add(studentExtracurricularExercisesSituation);
+                }else{
+                    Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
+                    Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
+                    for (Map.Entry<Integer, List<StudentServeCourseDto>> teacherCourseMapEntry : teacherCourseMap.entrySet()) {
+                        StudentServeCourseDto courseInfo = teacherCourseMapEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        teacherServiceCourseIdMap.put(teacherCourseMapEntry.getKey(), new HashSet<>());
+                        teacherServiceCourseIdMap.get(teacherCourseMapEntry.getKey()).add(courseInfo.getCourseScheduleId());
+                    }
+                    for (Map.Entry<Integer, Set<Long>> teacherServiceCourseIdMapEntry : teacherServiceCourseIdMap.entrySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherServiceCourseIdMapEntry.getKey(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "HOMEWORK", StringUtils.join(teacherServiceCourseIdMapEntry.getValue(), ","));
+                        studentExtracurricularExercisesSituation.setExpectExercisesNum(teacherServiceCourseIdMapEntry.getValue().size());
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
+                }
+            }else{
+                continue;
+            }
+        }
+
+        if(CollectionUtils.isEmpty(studentIds)){
+            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
+            BigDecimal currentPage1=BigDecimal.ONE,
+                    pageSize1=new BigDecimal(10000),
+                    total1=new BigDecimal(results.size()),
+                    totalPage1=total1.divide(pageSize1, BigDecimal.ROUND_UP);
+
+            while (currentPage1.compareTo(totalPage1)<=0){
+                List<StudentExtracurricularExercisesSituation> rows=results.stream().skip(pageSize1.multiply(currentPage1.subtract(BigDecimal.ONE)).longValue()).limit(pageSize1.longValue()).collect(Collectors.toList());
+                studentExtracurricularExercisesSituationDao.batchInsert(rows);
+                currentPage1=currentPage1.add(BigDecimal.ONE);
+            }
+            return;
+        }
+
+        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), null, studentIds);
+        Map<String, StudentExtracurricularExercisesSituation> codeServeMap = weekServiceWithStudents.stream().collect(Collectors.toMap(StudentExtracurricularExercisesSituation::getStuAndTeaCode, s -> s, (s1, s2) -> s1));
+
+        Set<String> newCodes = results.stream().map(StudentExtracurricularExercisesSituation::getStuAndTeaCode).collect(Collectors.toSet());
+        for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
+            if(weekServiceWithStudent.getActualExercisesNum()>0||newCodes.contains(weekServiceWithStudent.getStuAndTeaCode())){
+                continue;
+            }
+            studentExtracurricularExercisesSituationDao.delete(weekServiceWithStudent.getId());
+        }
+
+        List<StudentExtracurricularExercisesSituation> newService = new ArrayList<>();
+        List<StudentExtracurricularExercisesSituation> updateService = new ArrayList<>();
+        for (StudentExtracurricularExercisesSituation result : results) {
+            if(codeServeMap.containsKey(result.getStuAndTeaCode())){
+                StudentExtracurricularExercisesSituation s = codeServeMap.get(result.getStuAndTeaCode());
+                List<Long> courseIds = new ArrayList<>();
+                if(StringUtils.isNotBlank(s.getCourseIds())&&s.getActualExercisesNum()>0){
+                    courseIds = Arrays.stream(s.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toList());
+                }
+                if(StringUtils.isNotBlank(result.getCourseIds())){
+                    courseIds.addAll(Arrays.stream(result.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toList()));
+                }
+                s.setServeType(result.getServeType());
+                s.setCourseIds(StringUtils.join(courseIds, ","));
+                if(StringUtils.isBlank(s.getCourseIds())){
+                    s.setExpectExercisesNum(1);
+                }else{
+                    s.setExpectExercisesNum(courseIds.size());
+                }
+                updateService.add(s);
+            }else{
+                newService.add(result);
+            }
+        }
+        if(!CollectionUtils.isEmpty(updateService))
+            studentExtracurricularExercisesSituationDao.batchUpdate(updateService);
+        if(!CollectionUtils.isEmpty(newService))
+            studentExtracurricularExercisesSituationDao.batchInsert(newService);
+    }
+
+    @Override
+    public void updateExercisesSituation(Date date,List<Integer> studentIds, Integer teacherId) {
+        LocalDate nowDate = LocalDateTime.ofInstant(date.toInstant(), DateUtil.zoneId).toLocalDate();
+        if(Objects.isNull(date)){
+            nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+        }
+
+        LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+
+        Map<Integer, List<StudentServeCourseHomeworkDto>> studentHomeworkMap=new HashMap<>();
+        Map<Integer, List<ExtracurricularExercisesReply>> studentExercisesMap=new HashMap<>();
+
+        List<StudentServeCourseHomeworkDto> allStudentHomeworks = studentCourseHomeworkDao.findStudentHomeworkWithCourseDateRange(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(studentIds));
+        List<StudentServeCourseHomeworkDto> studentHomeworksTmp =new ArrayList<>();
+        for (StudentServeCourseHomeworkDto studentHomework : allStudentHomeworks) {
+            LocalDate courseStartLocalDate = LocalDateTime.ofInstant(studentHomework.getCourseStartTime().toInstant(), DateUtil.zoneId).toLocalDate();
+            switch (courseStartLocalDate.getDayOfWeek()){
+                case SATURDAY:
+                    if(DateUtil.daysBetween(studentHomework.getCourseStartTime(), studentHomework.getHomeworkCreateTime())<4){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+                case SUNDAY:
+                    if(DateUtil.daysBetween(studentHomework.getCourseStartTime(), studentHomework.getHomeworkCreateTime())<3){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+                default:
+                    LocalDate homeworkCreateTime = LocalDateTime.ofInstant(studentHomework.getHomeworkCreateTime().toInstant(), DateUtil.zoneId).toLocalDate();
+                    if(courseStartLocalDate.get(DateUtil.weekFields.weekOfYear())==homeworkCreateTime.get(DateUtil.weekFields.weekOfYear())){
+                        studentHomeworksTmp.add(studentHomework);
+                    }
+                    break;
+            }
+        }
+        if(!CollectionUtils.isEmpty(studentHomeworksTmp)){
+            studentHomeworkMap = studentHomeworksTmp.stream()
+                    .collect(Collectors.groupingBy(StudentServeCourseHomeworkDto::getUserId));
+        }
+
+
+        List<ExtracurricularExercisesReply> allStudentExercises = extracurricularExercisesReplyDao.getStudentExercisesWithTimeZone(monDayDate.toString(), sunDayDate.toString(), new ArrayList<>(studentIds));
+        if(!CollectionUtils.isEmpty(allStudentExercises)){
+            studentExercisesMap = allStudentExercises.stream().collect(Collectors.groupingBy(ExtracurricularExercisesReply::getUserId));
+        }
+
+        List<StudentExtracurricularExercisesSituation> weekServiceWithStudents = studentExtracurricularExercisesSituationDao.findWeekServiceWithStudents(monDayDate.toString(), teacherId, studentIds);
+        if(!CollectionUtils.isEmpty(weekServiceWithStudents)){
+            return;
+        }
+
+        for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
+            List<StudentServeCourseHomeworkDto> studentHomeworks = studentHomeworkMap.get(weekServiceWithStudent.getStudentId());
+            if(!CollectionUtils.isEmpty(studentHomeworks)){
+                weekServiceWithStudent.setActualExercisesNum(1);
+                long replyNum = studentHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())).count();
+                weekServiceWithStudent.setExercisesReplyNum(replyNum>0?1:0);
+                long haveSubmitTimes = studentHomeworks.stream().filter(e -> Objects.nonNull(e.getSubmitTime())).count();
+                if(replyNum>0&&haveSubmitTimes>0){
+                    Date lastSubmitTime = studentHomeworks.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(StudentServeCourseHomeworkDto::getSubmitTime)).get().getSubmitTime();
+                    weekServiceWithStudent.setLastSubmitTime(lastSubmitTime);
+                }
+                int exercisesMessageNum=0;
+                int exercisesMessageTimelyNum=0;
+                for (StudentServeCourseHomeworkDto studentHomework : studentHomeworks) {
+                    if(!YesOrNoEnum.YES.equals(studentHomework.getStatus())){
+                        continue;
+                    }
+                    if(!YesOrNoEnum.YES.equals(studentHomework.getIsReplied())){
+                        continue;
+                    }
+                    exercisesMessageNum+=1;
+                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                        exercisesMessageTimelyNum+=1;
+                    }
+                }
+                weekServiceWithStudent.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                weekServiceWithStudent.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
+            }
+
+            List<ExtracurricularExercisesReply> studentExercises = studentExercisesMap.get(weekServiceWithStudent.getStudentId());
+            if(!CollectionUtils.isEmpty(studentExercises)){
+                weekServiceWithStudent.setActualExercisesNum(1);
+                long replyNum = studentExercises.stream().filter(e -> e.getStatus()==1).count();
+                if(weekServiceWithStudent.getExercisesReplyNum()<=0){
+                    weekServiceWithStudent.setExercisesReplyNum(replyNum>0?1:0);
+                }
+                long haveSubmitTimes = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).count();
+                if(replyNum>0&&haveSubmitTimes>0){
+                    Date lastSubmitTime = studentExercises.stream().filter(e->Objects.nonNull(e.getSubmitTime())).max(Comparator.comparing(ExtracurricularExercisesReply::getSubmitTime)).get().getSubmitTime();
+                    if(Objects.isNull(weekServiceWithStudent.getLastSubmitTime())||lastSubmitTime.after(weekServiceWithStudent.getLastSubmitTime())){
+                        weekServiceWithStudent.setLastSubmitTime(lastSubmitTime);
+                    }
+                }
+                int exercisesMessageNum=0;
+                int exercisesMessageTimelyNum=0;
+                for (ExtracurricularExercisesReply studentHomework : studentExercises) {
+                    if(!new Integer(1).equals(studentHomework.getStatus())){
+                        continue;
+                    }
+                    if(!new Integer(1).equals(studentHomework.getIsReplied())){
+                        continue;
+                    }
+                    exercisesMessageNum+=1;
+                    if(new Integer(1).equals(studentHomework.getIsRepliedTimely())){
+                        exercisesMessageTimelyNum+=1;
+                    }
+                }
+                if(weekServiceWithStudent.getExercisesMessageNum()<=0){
+                    weekServiceWithStudent.setExercisesMessageNum(exercisesMessageNum>0?1:0);
+                }
+                if(weekServiceWithStudent.getExercisesMessageTimelyNum()<=0){
+                    weekServiceWithStudent.setExercisesMessageTimelyNum(exercisesMessageTimelyNum>0?1:0);
+                }
+            }
+        }
+        studentExtracurricularExercisesSituationDao.batchUpdate(weekServiceWithStudents);
+    }
+
+    @Override
+    public Map<String, Object> checkeIsAssignHomework(Long courseScheduleId, String studentIdsStr, Integer teacherId) {
         Map<String, Object> result=new HashMap<>();
+
+        Set<Long> teacherServeCourseIds = studentServeService.getTeacherServeCourseIds(teacherId);
+        if(teacherServeCourseIds.contains(courseScheduleId)){
+            result.put("enableAssignHomework", 1);
+        }else{
+            result.put("enableAssignHomework", 0);
+        }
+
         if(Objects.isNull(courseScheduleId)&&Objects.isNull(studentIdsStr)){
             result.put("isAssignHomework", 0);
             return result;
@@ -330,4 +641,15 @@ public class StudentServeServiceImpl implements StudentServeService {
         result.put("isAssignHomework", 1);
         return result;
     }
+
+    @Override
+    public Set<Long> getTeacherServeCourseIds(Integer teacherId) {
+        List<StudentExtracurricularExercisesSituation> teacherNoStartServices = studentExtracurricularExercisesSituationDao.findTeacherNoStartServices(teacherId);
+        List<String> courseIdsList = teacherNoStartServices.stream().filter(s->StringUtils.isNotBlank(s.getCourseIds())).map(StudentExtracurricularExercisesSituation::getCourseIds).collect(Collectors.toList());
+        Set<Long> courseIds = new HashSet<>();
+        for (String courseIdStr : courseIdsList) {
+            courseIds.addAll(Arrays.stream(courseIdStr.split(",")).mapToLong(Long::valueOf).boxed().collect(Collectors.toSet()));
+        }
+        return courseIds;
+    }
 }

+ 8 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -102,7 +102,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	 * @return
 	 */
 	private int addMessage(Map<Integer, String> receivers, String subject, String content, Date triggerTime, MessageSendMode mode, SendStatusEnum status,
-			String errorMsg, Integer readStatus, String memo, String group) {
+			String errorMsg, Integer readStatus, String memo, String group,String jpushType) {
 		SysMessage message = null;
 		Date date = new Date();
 
@@ -137,7 +137,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			message.setReadStatus(readStatus);
 			message.setMemo(memo);
 			message.setGroup(group);
-
+			message.setJpushType(jpushType);
 			messages.add(message);
 		}
 
@@ -335,7 +335,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			mode = MessageSendMode.EMAIL;
 		}
 		addMessage(receivers, messageConfig.getDescription(), MessageFormatter.arrayFormat(messageConfig.getContent(), args), triggerTime, mode, status, errorMsg, readStatus,
-				url, messageConfig.getGroup());
+				url, messageConfig.getGroup(),jpushType);
 	}
 
 	@Override
@@ -371,7 +371,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		}
 		Map<Integer, String> receivers = new HashMap<Integer, String>();
 		receivers.put(userId, receiver);
-		addMessage(receivers, title, content, triggerTime, mode, status, errorMsg, readStatus, url, null);
+		addMessage(receivers, title, content, triggerTime, mode, status, errorMsg, readStatus, url, null,jpushType);
 	}
 
 	@Override
@@ -413,8 +413,8 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId) {
-		List<Mapper> mappers = sysMessageDao.queryCountOfUnread(type, userId);
+	public Map<String, Integer> queryCountOfUnread(MessageSendMode type, Integer userId,String jpushType) {
+		List<Mapper> mappers = sysMessageDao.queryCountOfUnread(type, userId,jpushType);
 
 		Map<String, Integer> map = new HashMap<String, Integer>();
 
@@ -452,8 +452,8 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	 * @return 修改的条数
 	 */
 	@Override
-	public int updateStatus(Integer userId, int status) {
-		return sysMessageDao.updateStatus(userId, status);
+	public int updateStatus(Integer userId, int status,String jpushType) {
+		return sysMessageDao.updateStatus(userId, status,jpushType);
 	}
 
 	@Override

+ 20 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -71,6 +71,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	@Autowired
 	private CourseHomeworkDao courseHomeworkDao;
 
+	@Autowired
+	private StudentServeService studentServeService;
+
 	@Override
 	public BaseDAO<Long, TeacherAttendance> getDAO() {
 		return teacherAttendanceDao;
@@ -200,6 +203,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			}else {
 				throw new BizException("签到时间异常");
 			}
+			teacherAttendance.setSignInDeviceNo(teacherSignOutDto.getTeacherAttendanceInfo().getDeviceNum());
 			if(Objects.nonNull(teacherAttendance.getId())){
 				teacherAttendanceDao.update(teacherAttendance);
 			}else{
@@ -252,6 +256,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			}else {
 				throw new BizException("签退时间异常");
 			}
+			teacherAttendance.setSignOutDeviceNo(teacherSignOutDto.getTeacherAttendanceInfo().getDeviceNum());
 			if(Objects.nonNull(teacherAttendance.getId())){
 				teacherAttendanceDao.update(teacherAttendance);
 			}else{
@@ -277,6 +282,8 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 						throw new BizException("此课程没有学生");
 					}
 					studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
+					List<Integer> studentIds = studentCourseHomeworks.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
+					studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, teacherAttendance.getTeacherId());
 				}else{
 					courseHomework.setContent(teacherSignOutDto.getCourseHomeworkInfo().getContent());
 					courseHomework.setAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
@@ -295,7 +302,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addTeacherAttendanceSignOut(Long firstCourseId, Integer userId) {
+	public void addTeacherAttendanceSignOut(Long firstCourseId, Integer userId,String deviceNum) {
 		Date date = new Date();
 		//签退
 		CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId);
@@ -335,19 +342,19 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			//不是最后一节课
 			if(i == courseSchedules.size() - 1){
 				if(date.after(endDateTime)){
-					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.YES,schedule,firstCourseId);
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.YES,schedule,firstCourseId,deviceNum);
 				}else {
-					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.NO,schedule,firstCourseId);
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.NO,schedule,firstCourseId,deviceNum);
 				}
 			}else {
-				isBreak = upsetAttendance(userId,startDateTime,endDateTime,YesOrNoEnum.YES,schedule,firstCourseId);
+				isBreak = upsetAttendance(userId,startDateTime,endDateTime,YesOrNoEnum.YES,schedule,firstCourseId,deviceNum);
 			}
 		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addTeacherAttendanceSignIn(Long firstCourseId, Integer userId, Long courseScheduleId) {
+	public void addTeacherAttendanceSignIn(Long firstCourseId, Integer userId, Long courseScheduleId,String deviceNum) {
 		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId.intValue(),0);
 		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseScheduleId);
 		if(Objects.isNull(teacherAttendance)){
@@ -358,9 +365,13 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 			teacherAttendance.setClassGroupId(classGroup.getId());
 			teacherAttendance.setTeacherId(userId);
+			teacherAttendance.setSignInDeviceNo(deviceNum);
 			teacherAttendance.setCurrentScheduleId(firstCourseId);
 			teacherAttendanceDao.insert(teacherAttendance);
 		}else {
+			if(StringUtils.isEmpty(teacherAttendance.getSignInDeviceNo())){
+				teacherAttendance.setSignInDeviceNo(deviceNum);
+			}
 			teacherAttendance.setCurrentScheduleId(firstCourseId);
 			teacherAttendance.setGroupType(classGroup.getGroupType());
 			teacherAttendance.setTeacherId(userId);
@@ -400,7 +411,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		}
 	}
 
-	public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,YesOrNoEnum status,CourseSchedule courseSchedule,Long courseScheduleId){
+	public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,YesOrNoEnum status,CourseSchedule courseSchedule,Long courseScheduleId,String deviceNum){
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseSchedule.getId());
 		Boolean flag = false;
 		Long courseId = teacherAttendanceDao.findFirstSign(courseScheduleId,userId);
@@ -420,8 +431,11 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			teacherAttendance.setSignOutTime(signOutTime);
 			teacherAttendance.setSignInTime(signInTime);
 			teacherAttendance.setCurrentScheduleId(courseScheduleId);
+			teacherAttendance.setSignInDeviceNo(deviceNum);
+			teacherAttendance.setSignOutDeviceNo(deviceNum);
 			teacherAttendanceDao.insert(teacherAttendance);
 		}else {
+			teacherAttendance.setSignOutDeviceNo(deviceNum);
 			teacherAttendance.setSignOutStatus(status);
 			teacherAttendance.setSignOutTime(signOutTime);
 			teacherAttendance.setCurrentScheduleId(courseScheduleId);

+ 19 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -598,6 +598,15 @@
             LEFT JOIN class_group cg ON pg.id_=cg.music_group_id_ AND cg.group_type_='PRACTICE'
         WHERE
             pg.user_id_ = #{teacherId} AND cg.del_flag_ = 0 AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
+            <if test="status == null or status == ''">
+                AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
+            </if>
+            <if test="status == 'NORMAL'">
+                AND pg.group_status_ IN ('APPLYING','NORMAL','LOCK')
+            </if>
+            <if test="status == 'FINISH'">
+                AND pg.group_status_ = 'FINISH'
+            </if>
     </select>
     <select id="findTeacherVipClassGroup" resultMap="TeacherClassGroupDto">
         SELECT
@@ -623,7 +632,16 @@
             LEFT JOIN course_schedule cs ON cg.id_=cs.class_group_id_
             LEFT JOIN school s ON vg.teacher_school_id_ = s.id_
         WHERE
-            vg.user_id_ = #{teacherId} AND vg.group_status_!=7 AND (vg.group_status_ = 2 OR vg.group_status_ = 5)
+            vg.user_id_ = #{teacherId}
+            <if test="status == null or status == ''">
+                AND vg.group_status_ != 7 AND (vg.group_status_ = 2 OR vg.group_status_ = 5)
+            </if>
+            <if test="status == 'NORMAL'">
+                AND vg.group_status_ IN (1,2,5,6)
+            </if>
+            <if test="status == 'FINISH'">
+                AND vg.group_status_ = 4
+            </if>
         GROUP BY
         vg.id_,cg.id_
     </select>

+ 41 - 45
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -383,6 +383,7 @@
         <result property="classId" column="class_id"/>
         <result property="className" column="class_name"/>
         <result property="classType" column="class_type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="courseType" column="course_type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="musicGroupId" column="music_group_id"/>
         <result property="musicGroupName" column="music_group_name"/>
         <result property="schoolId" column="school_id_"/>
@@ -409,6 +410,7 @@
                cg.current_class_times_,
                cg.student_num_,
                cs.type_                                          class_type,
+               cs.type_                                          course_type,
                mg.id_                                            music_group_id,
                mg.name_                                          music_group_name,
                s.id_                                             school_id_,
@@ -458,36 +460,6 @@
         ORDER BY cs.id_
     </select>
 
-
-
-    <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">
-        <result property="classGroupId" column="class_group_id_"/>
-        <result property="studentId" column="student_id_"/>
-        <result property="userName" column="username_"/>
-        <result property="musicGroupId" column="music_group_id_"/>
-        <result property="subjectId" column="subject_id_"/>
-        <result property="subjectName" column="subject_name_"/>
-        <result property="status" column="status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-    </resultMap>
-
-    <select id="getCurrentCourseStudents" resultMap="studentAttendanceViewUtilEntity">
-        SELECT cgsm.class_group_id_,
-               su.id_  student_id_,
-               su.username_,
-               mg.id_  music_group_id_,
-               s.id_   subject_id_,
-               s.name_ subject_name_,
-               cgsm.status_
-        FROM class_group cg
-                 LEFT JOIN class_group_student_mapper cgsm ON cg.id_ = cgsm.class_group_id_
-                 LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
-                 LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
-                 LEFT JOIN `subject` s ON cg.subject_id_ = s.id_
-        WHERE cgsm.class_group_id_ = #{classID}
-          AND cgsm.status_ != 'QUIT'
-          AND cg.group_type_ = 'MUSIC'
-    </select>
-
     <select id="countStudentInClass" resultType="java.lang.Integer">
         SELECT
         COUNT(class_group_id_)
@@ -544,6 +516,7 @@
             cs.music_group_id_,
             cs.group_type_,
             cs.class_group_id_,
+            cs.new_course_id_,
             cg.student_num_ total_student_num_,
             su.real_name_ teacher_name_,
             IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
@@ -556,7 +529,6 @@
             LEFT JOIN school s ON cs.schoole_id_=s.id_
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         <if test="classGroupIds != null and organIdList!=null">
             AND cs.class_group_id_ IN
             <foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
@@ -583,7 +555,6 @@
         LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND cs.id_ IS NOT NULL
         <if test="type!=null">
             AND cg.group_type_ = #{type}
@@ -613,7 +584,8 @@
             su.real_name_ teacher_name_,
             IF(sa.status_ IS NULL,'NORMAL',sa.status_) attendance_status_,
             csc.id_ IS NOT NULL complaint_status_,
-            cs.teach_mode_
+            cs.teach_mode_,
+            cs.new_course_id_
         FROM
             course_schedule_student_payment cssp
             LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
@@ -624,7 +596,6 @@
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND cs.class_date_ = DATE_FORMAT(#{classDate},'%Y%m%d')
         AND cssp.user_id_ = #{studentId}
         <if test="quitClassGroupIds != null and quitClassGroupIds.size()>0">
@@ -639,6 +610,7 @@
     <select id="getTeacherCourseSchedulesWithDate" resultMap="courseScheduleDto">
         SELECT
         cs.id_ seal_class_id_,
+        cs.new_course_id_,
         cg.name_,
         su.real_name_ teacher_name_,
         cs.type_,
@@ -668,7 +640,6 @@
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND cs.class_date_ = DATE_FORMAT(#{classDate},'%Y%m%d')
         <if test="type!=null and type!=''">
             AND cs.type_=#{type}
@@ -732,6 +703,7 @@
                CONCAT(cs.class_date_, ' ', cs.start_class_time_) start_class_time_,
                CONCAT(cs.class_date_, ' ', cs.end_class_time_)   end_class_time_,
                cs.status_,
+               cs.new_course_id_,
                csts.user_id_                                     actual_teacher_id_,
                csts.teacher_role_,
                cs.schoole_id_,
@@ -756,7 +728,6 @@
                  LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_ AND ta.teacher_id_ = #{teacherId}
         WHERE (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
           AND cs.class_date_ = DATE_FORMAT(#{classDate}, '%Y%m%d')
           AND csts.user_id_ = #{teacherId}
           AND CONCAT(cs.class_date_, ' ', cs.end_class_time_) &lt; NOW()
@@ -887,7 +858,6 @@
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND cssp.user_id_ = #{studentId}
         <if test="month==null">
             AND DATE_FORMAT( NOW(), '%Y%m' ) = DATE_FORMAT( cs.class_date_, '%Y%m' )
@@ -912,7 +882,6 @@
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND csts.user_id_ = #{teacherId}
         <if test="month==null">
             AND DATE_FORMAT( NOW(), '%Y%m' ) = DATE_FORMAT( cs.class_date_, '%Y%m' )
@@ -964,7 +933,6 @@
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
         AND CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
         AND csts.user_id_ = #{teacherId}
         AND cg.del_flag_ = 0
@@ -985,7 +953,6 @@
             LEFT JOIN teacher t ON cs.actual_teacher_id_=t.id_
         WHERE
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
-            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
             AND cs.class_group_id_ IN
             <foreach collection="classGroupIds" item="classGroupId" separator="," open="(" close=")">
                 #{classGroupId}
@@ -1022,7 +989,6 @@
             AND cs.status_ != 'NOT_START'
             AND cs.del_flag_ = 0
             AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
             <if test="teachMode!=null and teachMode!=''">
                 AND cs.teach_mode_=#{teachMode}
             </if>
@@ -1085,7 +1051,6 @@
                  LEFT JOIN sys_user su ON cs.teacher_id_ = su.id_
         WHERE (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
             AND cs.status_ = 'NOT_START'
             AND cgsm.user_id_ = #{userId}
             AND cs.class_date_ = DATE_FORMAT(#{date}, '%Y%m%d')
@@ -1365,7 +1330,6 @@
         <where>
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             AND (cs.is_lock_=0 OR cs.is_lock_ IS NULL)
-            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
             AND cs.class_group_id_ = #{classGroupId}
             <if test="userId != null">
                 AND csts.user_id_ = #{userId}
@@ -1860,8 +1824,7 @@
                cs.leave_student_num_,
                cs.schoole_id_
         FROM course_schedule cs
-        WHERE (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
-          AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
+        WHERE cs.class_date_ BETWEEN #{startDate} AND #{endDate}
           AND cs.group_type_ = 'MUSIC'
           AND (cs.del_flag_ IS NULL OR cs.del_flag_ = 0)
     </select>
@@ -3477,4 +3440,37 @@
             new_course_id_
     </select>
 
+    <resultMap id="StudentNoStartCoursesDto" type="com.ym.mec.biz.dal.dto.StudentNoStartCoursesDto">
+        <result property="classDate" column="class_date_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="name" column="name_"/>
+        <result property="teacherName" column="real_name_"/>
+    </resultMap>
+    <select id="queryStudentNoStartCourse" resultMap="StudentNoStartCoursesDto">
+        SELECT cs.name_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,su.real_name_ FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        WHERE cssp.user_id_ = #{studentId} AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW()
+        AND vg.educational_teacher_id_ = #{teacherId}
+        <include refid="global.limit"/>
+    </select>
+    <select id="countStudentNoStartCourse" resultType="int">
+        SELECT COUNT(cssp.course_schedule_id_) FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group vg ON vg.id_ = cs.music_group_id_
+        </if>
+        WHERE cssp.user_id_ = #{studentId} AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW()
+        AND vg.educational_teacher_id_ = #{teacherId}
+    </select>
 </mapper>

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -674,4 +674,13 @@
 		SELECT SUM(expect_price_)-SUM(actual_price_) FROM course_schedule_student_payment
 		WHERE music_group_id_=#{groupId} AND user_id_=#{userId} AND group_type_=#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>
+
+    <select id="getStudentHistoryLastCourse" resultMap="com.ym.mec.biz.dal.dao.CourseScheduleDao.CourseSchedule">
+		SELECT cs.* FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
+		WHERE cssp.user_id_=#{studentId}
+		  AND cs.class_date_&lt;#{monday}
+		  AND cs.type_=#{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) LIMIT 1
+	</select>
 </mapper>

+ 19 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -225,4 +225,23 @@
             WHERE music_group_id_ = #{musicGroupId}
         )
     </delete>
+
+    <select id="queryStudentSubTotalCourseTime" resultType="java.util.Map">
+        SELECT mgpscd.user_id_ 'key',SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+        FROM music_group_payment_student_course_detail mgpscd
+        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ IN
+        <foreach collection="studentIds" open="(" close=")" item="item" separator=",">
+            #{item}
+        </foreach>
+        GROUP BY mgpscd.user_id_
+    </select>
+
+    <select id="queryStudentSubTotalCourseTimes" resultType="java.util.Map">
+        SELECT mgpscd.course_type_ 'key',SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
+        FROM music_group_payment_student_course_detail mgpscd
+        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ = #{userId}
+        GROUP BY mgpscd.course_type_
+    </select>
 </mapper>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -530,7 +530,7 @@
                 AND FIND_IN_SET(cs.organ_id_,#{organId})
             </if>
         </where>
-        ORDER BY cs.id_ asc
+        ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) asc
         <include refid="global.limit"/>
     </select>
     

+ 207 - 119
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -22,6 +22,7 @@
 		<result column="update_time_" property="updateTime" />
 		<result column="last_submit_time_" property="lastSubmitTime"/>
 		<result column="serve_type_" property="serveType"/>
+		<result column="course_ids_" property="courseIds"/>
 	</resultMap>
 
 	<resultMap id="StudentExercisesSituationDto" type="com.ym.mec.biz.dal.dto.StudentExercisesSituationDto" extends="StudentExtracurricularExercisesSituation">
@@ -48,15 +49,24 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO student_extracurricular_exercises_situation_ (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,actual_exercises_num_,exercises_reply_num_,exercises_message_num_,exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,serve_type_)
-		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},#{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType})
+		INSERT INTO student_extracurricular_exercises_situation_ (id_,student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+		                                                          serve_type_,course_ids_)
+		VALUES(#{id},#{studentId},#{weekOfYear},#{monday},#{sunday},#{teacherId},#{expectExercisesNum},#{actualExercisesNum},#{exercisesReplyNum},
+		       #{exercisesMessageNum},#{exercisesMessageTimelyNum},NOW(),NOW(),#{lastSubmitTime},#{serveType},#{courseIds})
 	</insert>
 
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO student_extracurricular_exercises_situation_ (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,actual_exercises_num_,exercises_reply_num_,exercises_message_num_,exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,serve_type_)
+		INSERT INTO student_extracurricular_exercises_situation_ (student_id_,week_of_year_,monday_,sunday_,teacher_id_,expect_exercises_num_,
+		                                                          actual_exercises_num_,exercises_reply_num_,exercises_message_num_,
+		                                                          exercises_message_timely_num_,create_time_,update_time_,last_submit_time_,
+		                                                          serve_type_,course_ids_)
 		VALUES
 		<foreach collection="situations" item="situation" separator=",">
-			(#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},#{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType})
+			(#{situation.studentId},#{situation.weekOfYear},#{situation.monday},#{situation.sunday},#{situation.teacherId},#{situation.expectExercisesNum},
+			#{situation.actualExercisesNum},#{situation.exercisesReplyNum},#{situation.exercisesMessageNum},#{situation.exercisesMessageTimelyNum},
+			NOW(),NOW(),#{situation.lastSubmitTime},#{situation.serveType},#{situation.courseIds})
 		</foreach>
 	</insert>
 
@@ -106,10 +116,61 @@
 			<if test="serveType!=null">
 				serve_type_=#{serveType},
 			</if>
+			<if test="courseIds!=null and courseIds!=''">
+				course_ids_=#{courseIds},
+			</if>
 			update_time_ = #{updateTime}
 		</set> WHERE id_ = #{id}
 	</update>
 
+	<update id="batchUpdate" parameterType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+		<foreach collection="situations" item="situation" separator=";">
+			UPDATE student_extracurricular_exercises_situation_
+			<set>
+				<if test="situation.exercisesReplyNum != null">
+					exercises_reply_num_ = #{situation.exercisesReplyNum},
+				</if>
+				<if test="situation.monday != null">
+					monday_ = #{situation.monday},
+				</if>
+				<if test="situation.weekOfYear != null">
+					week_of_year_ = #{situation.weekOfYear},
+				</if>
+				<if test="situation.exercisesMessageNum != null">
+					exercises_message_num_ = #{situation.exercisesMessageNum},
+				</if>
+				<if test="situation.teacherId != null">
+					teacher_id_ = #{situation.teacherId},
+				</if>
+				<if test="situation.actualExercisesNum != null">
+					actual_exercises_num_ = #{situation.actualExercisesNum},
+				</if>
+				<if test="situation.exercisesMessageTimelyNum != null">
+					exercises_message_timely_num_ = #{situation.exercisesMessageTimelyNum},
+				</if>
+				<if test="situation.studentId != null">
+					student_id_ = #{situation.studentId},
+				</if>
+				<if test="situation.expectExercisesNum != null">
+					expect_exercises_num_ = #{situation.expectExercisesNum},
+				</if>
+				<if test="situation.sunday != null">
+					sunday_ = #{situation.sunday},
+				</if>
+				<if test="situation.lastSubmitTime!=null">
+					last_submit_time_=#{situation.lastSubmitTime},
+				</if>
+				<if test="situation.serveType!=null">
+					serve_type_=#{situation.serveType},
+				</if>
+				<if test="situation.courseIds!=null and situation.courseIds!=''">
+					course_ids_=#{situation.courseIds},
+				</if>
+				update_time_ = NOW()
+			</set> WHERE id_ = #{situation.id}
+		</foreach>
+	</update>
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM student_extracurricular_exercises_situation_ WHERE id_ = #{id} 
@@ -119,6 +180,9 @@
 	</delete>
 	<delete id="deleteByStudent">
 		DELETE FROM student_extracurricular_exercises_situation_ WHERE student_id_ = #{studentId}
+		<if test="monday!=null and monday!=''">
+			AND monday_=#{monday}
+		</if>
 	</delete>
 
 	<!-- 分页查询 -->
@@ -133,31 +197,33 @@
 
 	<select id="findExercisesSituations" resultMap="StudentExercisesSituationDto">
 		SELECT
-		MAX(sees.id_) id_,
+		sees.id_ id_,
 		student_id_,
 		stu.username_ student_name_,
-		GROUP_CONCAT(DISTINCT tea.real_name_ ORDER BY tea.id_) teacher_name_,
+		tea.real_name_ teacher_name_,
 		o.name_ organ_name_,
-		SUM( expect_exercises_num_ ) expect_exercises_num_,
-		SUM( actual_exercises_num_ ) actual_exercises_num_,
+		sees.monday_,
+		sees.sunday_,
+		expect_exercises_num_ expect_exercises_num_,
+		actual_exercises_num_ actual_exercises_num_,
 		<if test="submitStartDate==null or submitEndDate==null">
-			SUM( exercises_reply_num_ ) exercises_reply_num_,
-			SUM( exercises_message_num_ ) exercises_message_num_,
-			SUM( exercises_message_timely_num_ ) exercises_message_timely_num_,
-			MAX(last_submit_time_) last_submit_time_
+			exercises_reply_num_ exercises_reply_num_,
+			exercises_message_num_ exercises_message_num_,
+			exercises_message_timely_num_ exercises_message_timely_num_,
+			last_submit_time_ last_submit_time_
 		</if>
 		<if test="submitStartDate!=null and submitEndDate!=null">
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) exercises_reply_num_,
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) exercises_message_num_,
-			SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) exercises_message_timely_num_,
-			MAX(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},last_submit_time_, NULL)) last_submit_time_
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) exercises_reply_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) exercises_message_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) exercises_message_timely_num_,
+			IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},last_submit_time_, NULL) last_submit_time_
 		</if>
 		FROM
-		student_extracurricular_exercises_situation_ sees
-		LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
-		LEFT JOIN teacher t ON t.id_=sees.teacher_id_
-		LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
-		LEFT JOIN organization o ON stu.organ_id_=o.id_
+			student_extracurricular_exercises_situation_ sees
+			LEFT JOIN sys_user stu ON stu.id_=sees.student_id_
+			LEFT JOIN teacher t ON t.id_=sees.teacher_id_
+			LEFT JOIN sys_user tea ON tea.id_=sees.teacher_id_
+			LEFT JOIN organization o ON stu.organ_id_=o.id_
 		WHERE
 		sees.monday_ &gt;= #{monday}
 		AND sees.sunday_ &lt;= #{sunday}
@@ -182,57 +248,56 @@
 		<if test="existPracticeCourse!=null and existPracticeCourse==0">
 			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
 		</if>
-		GROUP BY
-		student_id_
-		<trim prefix="HAVING" suffixOverrides="and">
-			<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-				SUM( actual_exercises_num_ )&lt;SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-				SUM( actual_exercises_num_ )&gt;=SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="submitStartDate==null or submitEndDate==null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM( exercises_reply_num_ ) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM( exercises_reply_num_ ) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM( exercises_message_num_ ) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM( exercises_message_num_ ) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM( exercises_message_timely_num_ ) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM( exercises_message_timely_num_ ) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+
+		<if test="expectExercisesNum!=null">
+			AND expect_exercises_num_ = #{expectExercisesNum}
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+			AND actual_exercises_num_ &lt; expect_exercises_num_
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+			AND actual_exercises_num_ &gt;= expect_exercises_num_
+		</if>
+		<if test="submitStartDate==null or submitEndDate==null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND exercises_reply_num_ &lt; SUM( actual_exercises_num_ )
 			</if>
-			<if test="submitStartDate!=null and submitEndDate!=null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND exercises_reply_num_ &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND exercises_message_num_ &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND exercises_message_num_ &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND exercises_message_timely_num_ &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND exercises_message_timely_num_ &gt;= exercises_message_num_
+			</if>
+		</if>
+		<if test="submitStartDate!=null and submitEndDate!=null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
 			</if>
-		</trim>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+			</if>
+		</if>
 		ORDER BY student_id_
 		<include refid="global.limit"/>
 	</select>
@@ -271,65 +336,66 @@
 		<if test="existPracticeCourse!=null and existPracticeCourse==0">
 			AND NOT EXISTS (SELECT cssp.id_ FROM course_schedule_student_payment cssp LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_ LEFT JOIN practice_group pg ON pg.id_=cssp.music_group_id_ WHERE cssp.user_id_=sees.student_id_ AND cssp.group_type_='PRACTICE' AND pg.type_='CHARGE' AND class_date_ BETWEEN #{monday} AND #{sunday})
 		</if>
-		GROUP BY
-		student_id_
-		<trim prefix="HAVING" suffixOverrides="and">
-			<if test="expectExercisesNum!=null">  SUM( expect_exercises_num_ ) = #{expectExercisesNum}</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
-				SUM( actual_exercises_num_ )&lt;SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
-				SUM( actual_exercises_num_ )&gt;=SUM( expect_exercises_num_ ) and
-			</if>
-			<if test="submitStartDate==null or submitEndDate==null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM( exercises_reply_num_ ) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM( exercises_reply_num_ ) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM( exercises_message_num_ ) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM( exercises_message_num_ ) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM( exercises_message_timely_num_ ) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM( exercises_message_timely_num_ ) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+
+		<if test="expectExercisesNum!=null">
+			AND expect_exercises_num_ = #{expectExercisesNum}
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==0">
+			AND actual_exercises_num_ &lt; expect_exercises_num_
+		</if>
+		<if test="actualExercisesNumIsAchieve!=null and actualExercisesNumIsAchieve==1">
+			AND actual_exercises_num_ &gt;= expect_exercises_num_
+		</if>
+		<if test="submitStartDate==null or submitEndDate==null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND exercises_reply_num_ &lt; SUM( actual_exercises_num_ )
 			</if>
-			<if test="submitStartDate!=null and submitEndDate!=null">
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &lt; SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0)) &gt;= SUM( actual_exercises_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &lt; SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0)) &gt;= SUM( exercises_reply_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &lt; SUM( exercises_message_num_ ) and
-				</if>
-				<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
-					SUM(IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0)) &gt;= SUM( exercises_message_num_ ) and
-				</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND exercises_reply_num_ &gt;= actual_exercises_num_
 			</if>
-		</trim>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND exercises_message_num_ &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND exercises_message_num_ &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND exercises_message_timely_num_ &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND exercises_message_timely_num_ &gt;= exercises_message_num_
+			</if>
+		</if>
+		<if test="submitStartDate!=null and submitEndDate!=null">
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &lt; actual_exercises_num_
+			</if>
+			<if test="exercisesReplyNumIsAchieve!=null and exercisesReplyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_reply_num_,0) &gt;= actual_exercises_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
+			</if>
+			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==0">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &lt; exercises_message_num_
+			</if>
+			<if test="exercisesMessageTimelyNumIsAchieve!=null and exercisesMessageTimelyNumIsAchieve==1">
+				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_timely_num_,0) &gt;= exercises_message_num_
+			</if>
+		</if>
 		) tmp
 	</select>
+
 	<select id="findExercisesSituationsById" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE id_ IN
 		<foreach collection="ids" item="id" separator="," open="(" close=")">
 			#{id}
 		</foreach>
 	</select>
+
 	<select id="findTeacherExercisesServiceSituations" resultType="com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto">
 		SELECT
 		teacher_id_ teacherId,
@@ -346,12 +412,15 @@
 		GROUP BY
 		teacher_id_;
 	</select>
+
 	<select id="findLastWeekTodayUpdateNum" resultType="int">
 		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE sunday_=#{sunday} AND DATE_FORMAT(update_time_,'%Y-%m-%d')=DATE_FORMAT(NOW(),'%Y-%m-%d')
     </select>
+
 	<select id="findStudentExercisesSituationsWithMonDay" resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND student_id_=#{studentId}
 	</select>
+
 	<select id="getNoFinishedServiceTeacher" resultType="java.util.Map">
 		SELECT
 			teacher_id_ AS 'key',
@@ -366,4 +435,23 @@
 		GROUP BY
 			teacher_id_
 	</select>
+
+	<select id="countWeekServiceNum" resultType="int">
+		SELECT COUNT(id_) FROM student_extracurricular_exercises_situation_ WHERE monday_=#{sunday}
+	</select>
+
+	<select id="findWeekServiceWithStudents" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT * FROM student_extracurricular_exercises_situation_
+		WHERE monday_=#{monday}
+		  <if test="teacherId!=null">
+			  AND teacher_id_=#{teacherId}
+		  </if>
+		  AND student_id_ IN
+		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+			#{studentId}
+		</foreach>
+	</select>
+    <select id="findTeacherNoStartServices" resultMap="StudentExtracurricularExercisesSituation">
+		SELECT * FROM student_extracurricular_exercises_situation_ WHERE teacher_id_=#{teacherId} AND actual_exercises_num_&lt;=0 AND serve_type_='HOMEWORK';
+	</select>
 </mapper>

+ 38 - 4
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -814,24 +814,58 @@
     </select>
 
     <select id="queryVipGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
+        SELECT su.id_ user_id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
         vip_group vg
         LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
         LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'VIP' AND cgsm.status_ != 'QUIT'
-        AND vg.educational_teacher_id_ = #{userId}
+        AND vg.educational_teacher_id_ = #{teacherId}
         AND vg.group_status_ IN (0,1,2,5)
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
         GROUP BY cgsm.user_id_
+        <include refid="global.limit"/>
     </select>
 
     <select id="queryPracticeGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
+        SELECT su.id_ user_id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
         practice_group pg
         LEFT JOIN class_group_student_mapper cgsm ON pg.id_ = cgsm.music_group_id_
         LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
         WHERE cgsm.group_type_ = 'PRACTICE' AND cgsm.status_ != 'QUIT'
-        AND pg.educational_teacher_id_ = #{userId}
+        AND pg.educational_teacher_id_ = #{teacherId}
         AND pg.group_status_ NOT IN ('FINISH','CANCEL')
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
         GROUP BY cgsm.user_id_
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="countVipGroupStudents" resultType="int">
+        SELECT COUNT(DISTINCT cgsm.user_id_) FROM
+        vip_group vg
+        LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
+        LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
+        WHERE cgsm.group_type_ = 'VIP' AND cgsm.status_ != 'QUIT'
+        AND vg.educational_teacher_id_ = #{teacherId}
+        AND vg.group_status_ IN (0,1,2,5)
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
+    </select>
+
+    <select id="countPracticeGroupStudents" resultType="int">
+        SELECT COUNT(DISTINCT cgsm.user_id_) FROM
+        practice_group pg
+        LEFT JOIN class_group_student_mapper cgsm ON pg.id_ = cgsm.music_group_id_
+        LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
+        WHERE cgsm.group_type_ = 'PRACTICE' AND cgsm.status_ != 'QUIT'
+        AND pg.educational_teacher_id_ = #{teacherId}
+        AND pg.group_status_ NOT IN ('FINISH','CANCEL')
+        <if test="search != null and search != ''">
+            AND (su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+        </if>
     </select>
 </mapper>

+ 38 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -471,6 +471,44 @@
         WHERE stu.service_tag_=1 AND class_date_&gt;=#{monday}
     </select>
 
+    <resultMap id="StudentServeCourseDto" type="com.ym.mec.biz.dal.dto.StudentServeCourseDto">
+        <result column="student_id_" property="studentId"/>
+        <result column="lead_teacher_id_" property="leadTeacherId"/>
+        <result column="course_schedule_id_" property="courseScheduleId"/>
+        <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="music_group_id_" property="musicGroupId"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="actual_teacher_id_" property="actualTeacherId"/>
+        <result column="course_start_time_" property="courseStartTime"/>
+        <result column="teach_mode_" property="teachMode"/>
+    </resultMap>
+
+    <select id="getStudentFutureCourseInfo" resultMap="StudentServeCourseDto">
+        SELECT
+            cssp.user_id_ student_id_,
+            stu.teacher_id_ lead_teacher_id_,
+            cs.id_ course_schedule_id_,
+            cs.group_type_,
+            cs.music_group_id_,
+            cs.type_,
+            cs.actual_teacher_id_,
+            CONCAT(cs.class_date_, ' ', cs.start_class_time_) course_start_time_,
+            cs.teach_mode_
+        FROM course_schedule_student_payment cssp
+            LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+            LEFT JOIN student stu ON cssp.user_id_ = stu.user_id_
+        WHERE stu.service_tag_=1
+            AND cs.class_date_&gt;=#{monday}
+            AND cs.type_ IN ('SINGLE','VIP','MIX','PRACTICE')
+            <if test="studentIds!=null and studentIds.size()>0">
+                AND cssp.user_id_ IN
+                <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                    #{studentId}
+                </foreach>
+            </if>
+        ORDER BY cssp.user_id_,course_start_time_
+    </select>
+
     <select id="getStudentNames" resultType="string">
         SELECT username_ FROM sys_user WHERE id_ IN
         <foreach collection="studentIds" item="studentId" separator="," open="(" close=")">

+ 13 - 6
mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -21,6 +21,7 @@
         <result column="memo_" property="memo"/>
         <result column="read_status_" property="readStatus"/>
         <result column="group_" property="group"/>
+        <result column="jpush_type_" property="jpushType"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -30,6 +31,9 @@
 
 	<sql id="queryCondition">
 		<where>
+			<if test="jpushType != null and jpushType != ''">
+				and (jpush_type_ = #{jpushType} OR jpush_type_ IS NULL)
+			</if>
 			<if test="userId != null">
 				and user_id_ = #{userId}
 			</if>
@@ -72,8 +76,9 @@
 
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMessage">
 		insert into sys_message (user_id_,title_, content_,type_, receiver_,
-		send_time_, error_msg_,memo_, create_on_,modify_on_,group_)
-		values (#{userId}, #{title},#{content},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{receiver},now(),#{errorMsg},#{memo},now(),now(),#{group})
+		send_time_, error_msg_,memo_, create_on_,modify_on_,group_,jpush_type_)
+		values (#{userId}, #{title},#{content},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+				#{receiver},now(),#{errorMsg},#{memo},now(),now(),#{group},#{jpushType})
 	</insert>
 
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.SysMessage">
@@ -81,7 +86,7 @@
 		title_, content_,
 		type_, status_, receiver_,
 		send_time_, error_msg_,read_status_,memo_, create_on_,
-		modify_on_,group_)
+		modify_on_,group_,jpush_type_)
 		values
 		<foreach collection="list" item="item" index="index"
 			separator=",">
@@ -92,7 +97,7 @@
 			#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{item.receiver,jdbcType=VARCHAR},
 			#{item.sendTime},#{item.errorMsg,jdbcType=VARCHAR},#{item.readStatus},#{item.memo},
 			#{item.createOn},
-			#{item.modifyOn},#{item.group}
+			#{item.modifyOn},#{item.group},#{item.jpushType}
 			)
 		</foreach>
 	</insert>
@@ -144,7 +149,7 @@
 	</update>
 	<update id="updateStatus">
 		update sys_message set read_status_=#{status}
-		where user_id_ =#{userId}
+		where user_id_ = #{userId} AND (jpush_type_ = #{jpushType} OR jpush_type_ IS NULL)
 	</update>
 
     <update id="updateOneStatus">
@@ -172,7 +177,9 @@
 	</select>
 
 	<select id="queryCountOfUnread" resultMap="Mapper" parameterType="map">
-		SELECT group_ key_,COUNT(*) value_ FROM sys_message WHERE user_id_ = #{userId} AND read_status_ = 0 and status_ = 2
+		SELECT group_ key_,COUNT(*) value_ FROM sys_message
+		WHERE user_id_ = #{userId} AND read_status_ = 0 and status_ = 2
+		AND (jpush_type_ = #{jpushType} OR jpush_type_ IS NULL)
 		<if test="type != null">
 		and type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 		</if>

+ 13 - 4
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -34,6 +34,8 @@
         <result column="sign_out_attachments_" property="signOutAttachments"/>
         <result column="sign_out_remark_" property="signOutRemark"/>
         <result column="url_" property="url"/>
+        <result column="sign_in_device_no_" property="signInDeviceNo"/>
+        <result column="sign_out_device_no_" property="signOutDeviceNo"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -58,12 +60,12 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
         sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_)
+        sign_out_remark_,update_attendance_type_,url_,sign_in_device_no_,sign_out_device_no_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
         #{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},
         now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments},#{signOutRemark},
-        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url})
+        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url},#{signInDeviceNo},#{signOutDeviceNo})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
@@ -71,7 +73,7 @@
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
         remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
-        sign_out_remark_,update_attendance_type_,url_)
+        sign_out_remark_,update_attendance_type_,url_,sign_in_device_no_,sign_out_device_no_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -82,7 +84,8 @@
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},
             #{teacherAttendance.signOutAttachments},#{teacherAttendance.signOutRemark},
-            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url})
+            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url},
+            #{teacherAttendance.signInDeviceNo},#{teacherAttendance.signOutDeviceNo})
         </foreach>
     </insert>
 
@@ -162,6 +165,12 @@
             <if test="signOutRemark != null">
                 sign_out_remark_ = #{signOutRemark},
             </if>
+            <if test="signInDeviceNo != null and signInDeviceNo != ''">
+                sign_in_device_no_ = #{signInDeviceNo},
+            </if>
+            <if test="signOutDeviceNo != null and signOutDeviceNo != ''">
+                sign_out_device_no_ = #{signOutDeviceNo},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>

+ 7 - 2
mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml

@@ -560,10 +560,13 @@
         sys_user_cash_account suca
         LEFT JOIN sys_user su ON suca.user_id_=su.id_
         WHERE
-        suca.course_balance_ >0
+            1=1
+        AND su.user_type_ LIKE '%STUDENT%'
+#         suca.course_balance_ >0
         <if test="search!=null and search!=''">
             AND (su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
         </if>
+        ORDER BY suca.course_balance_ DESC
         <include refid="global.limit"/>
     </select>
     <select id="countHaveCourseBalanceStudentNum" resultType="int">
@@ -573,7 +576,9 @@
         sys_user_cash_account suca
         LEFT JOIN sys_user su ON suca.user_id_=su.id_
         WHERE
-        suca.course_balance_ >0
+            1=1
+        AND su.user_type_ LIKE '%STUDENT%'
+#         suca.course_balance_ >0
         <if test="search!=null and search!=''">
             AND (su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
         </if>

+ 5 - 17
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -35,26 +35,13 @@ public class RoomController{
 
     @RequestMapping(value = "/statusImMsg", method = RequestMethod.POST)
     public Object statusImMsg(ImMsg imMsg){
-//        log.info("statusImMsg body{}:",body);
-        String str = "timestamp=1608175805527" +
-                "&signTimestamp=1608175805527" +
-                "&nonce=1816421725" +
-                "&signature=fa06f0d300687919c8af009d4ad5f1923d753648&appKey=c9kqb3rdc451j" +
-                "&channelType=PERSON&fromUserId=325&toUserId=2109272" +
-                "&msgTimestamp=1608175805490" +
-                "&objectName=RC%3ATxtMsg" +
-                "&content=%7B%22content%22%3A%22%E5%A5%BD%22%7D" +
-                "&sensitiveType=0" +
-                "&source=iOS" +
-                "&msgUID=BMDQ-VM8C-J785-8785:";
-
         return new BaseResponse<>();
     }
 
     @RequestMapping(value = "/leave", method = RequestMethod.POST)
     public Object leaveRoom(@RequestBody RoomStatusNotify roomStatusNotify) throws Exception {
         //成员退出
-        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId());
+        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId(),roomStatusNotify.getDeviceNum());
         return new BaseResponse<>();
     }
 
@@ -80,8 +67,9 @@ public class RoomController{
         log.info("joinRoomStatusNotify: {}",JSONObject.toJSON(roomStatusNotify));
         String roomId = roomStatusNotify.getRoomId();
         String userId = roomStatusNotify.getUserId();
+        String deviceNum = roomStatusNotify.getDeviceNum();
         if(roomStatusNotify.isRequestStatus()){
-            roomService.joinRoomSuccess(roomId, userId);
+            roomService.joinRoomSuccess(roomId, userId,deviceNum);
         }else {
             roomService.joinRoomFailure(roomId, userId);
         }
@@ -97,11 +85,11 @@ public class RoomController{
         switch (notify.getEvent()){
             case 11:
                 //成员加入
-                roomService.joinRoomSuccess(roomId, userId);
+                roomService.joinRoomSuccess(roomId, userId,null);
                 break;
             case 12:
                 //成员退出
-                roomService.leaveRoomSuccess(roomId, userId);
+                roomService.leaveRoomSuccess(roomId, userId,null);
                 break;
         }
     }

+ 9 - 0
mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java

@@ -4,8 +4,17 @@ package com.ym.pojo;
 public class RoomStatusNotify {
 	private String roomId;
 	private String userId;
+	private String deviceNum;
 	private boolean requestStatus;
 
+	public String getDeviceNum() {
+		return deviceNum;
+	}
+
+	public void setDeviceNum(String deviceNum) {
+		this.deviceNum = deviceNum;
+	}
+
 	public String getRoomId() {
 		return roomId;
 	}

+ 31 - 31
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -271,24 +271,23 @@ public class RoomServiceImpl implements RoomService {
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     @Override
-    public void joinRoomSuccess(String roomId,String userId) throws Exception {
+    public void joinRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if(roomMember == null){
             return ;
         }
-        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(joinSuccessKey)){
-            //兼容旧版本,防止重复调用
-            redisTemplate.delete(joinSuccessKey);
-            return;
-        }
-
-        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(leaveSuccessKey)){
-            redisTemplate.delete(leaveSuccessKey);
-        }
-        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
-        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
+//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(joinSuccessKey)){
+//            //兼容旧版本,防止重复调用
+//            redisTemplate.delete(joinSuccessKey);
+//            return;
+//        }
+//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(leaveSuccessKey)){
+//            redisTemplate.delete(leaveSuccessKey);
+//        }
+//        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
+//        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
 
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
@@ -351,10 +350,10 @@ public class RoomServiceImpl implements RoomService {
         msg.setExamSongSwitch(examSong);
         imHelper.publishMessage(userId, roomId, msg);
         log.info("join room success: roomId = {}, userId = {}, role = {}", roomId, userId, roleEnum);
-        signInSuccess(roomMember);
+        signInSuccess(roomMember,deviceNum);
     }
 
-    public void signInSuccess(RoomMember roomMember) {
+    public void signInSuccess(RoomMember roomMember,String deviceNum) {
         String roomId = roomMember.getRid();
         String userId = roomMember.getUid();
         String currentRoomIdKey = roomId + userId;
@@ -373,7 +372,7 @@ public class RoomServiceImpl implements RoomService {
 
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         if(roleEnum == RoleTeacher){
-            teacherAttendanceService.addTeacherAttendanceSignIn(firstCourseId,userIdInt,currentRoomId);
+            teacherAttendanceService.addTeacherAttendanceSignIn(firstCourseId,userIdInt,currentRoomId,deviceNum);
         }else {
             studentAttendanceService.addStudentAttendanceSignIn(firstCourseId,userIdInt,currentRoomId);
         }
@@ -406,30 +405,31 @@ public class RoomServiceImpl implements RoomService {
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     @Override
-    public void leaveRoomSuccess(String roomId,String userId) throws Exception {
+    public void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
         RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
         if(roomMember == null){
             return ;
         }
-        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(leaveSuccessKey)){
-            redisTemplate.delete(leaveSuccessKey);
-            return;
-        }
-        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-        if(redisTemplate.hasKey(joinSuccessKey)){
-            redisTemplate.delete(joinSuccessKey);
-        }
-        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
-        //记录
-        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
+//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(leaveSuccessKey)){
+//            redisTemplate.delete(leaveSuccessKey);
+//            //如果设备号不为空,更新设备号
+//            return;
+//        }
+//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+//        if(redisTemplate.hasKey(joinSuccessKey)){
+//            redisTemplate.delete(joinSuccessKey);
+//        }
+//        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
+//        //记录
+//        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
 
         if(roleEnum == RoleTeacher){
             courseScheduleStudentPaymentDao.adjustPlayMidi(firstCourseId,null,null);
             courseScheduleStudentPaymentDao.adjustExamSong(firstCourseId.longValue(),null,null);
-            teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId));
+            teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId),deviceNum);
         }else {
             studentAttendanceService.addStudentAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId));
         }

+ 2 - 2
mec-im/src/main/java/com/ym/service/RoomService.java

@@ -20,9 +20,9 @@ public interface RoomService {
 
     Boolean kickMember(String roomId) throws Exception;
 
-    void joinRoomSuccess(String roomId,String userId) throws Exception;
+    void joinRoomSuccess(String roomId,String userId,String deviceNum) throws Exception;
 
-    void leaveRoomSuccess(String roomId,String userId) throws Exception;
+    void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception;
 
     //only teacher
     Boolean display(String roomId, int type, String uri, String userId) throws Exception;

+ 3 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -35,6 +36,8 @@ public class StudentCourseHomeworkController extends BaseController {
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentServeService studentServeService;
 
     @ApiOperation(value = "提交作业")
     @PostMapping(value = "/add",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

+ 24 - 2
mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java

@@ -1,12 +1,17 @@
 package com.ym.mec.student.controller;
 
+import com.netflix.discovery.converters.Auto;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.entity.ExtracurricularExercisesMessage;
-import com.ym.mec.biz.dal.entity.StudentCourseHomeworkReply;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.ExtracurricularExercisesDao;
+import com.ym.mec.biz.dal.dao.ExtracurricularExercisesReplyDao;
+import com.ym.mec.biz.dal.dao.StudentCourseHomeworkDao;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentCourseHomeworkReplyQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesMessageService;
 import com.ym.mec.biz.service.StudentCourseHomeworkReplyService;
+import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,6 +21,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * @Author Joburgess
@@ -30,9 +37,19 @@ public class StudentCourseHomeworkReplyController extends BaseController {
     @Autowired
     private StudentCourseHomeworkReplyService studentCourseHomeworkReplyService;
     @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
+    @Autowired
     private ExtracurricularExercisesMessageService extracurricularExercisesMessageService;
     @Resource
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentServeService studentServeService;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
+    @Autowired
+    private ExtracurricularExercisesDao extracurricularExercisesDao;
 
     @ApiOperation(value = "新增回复")
     @PostMapping("/add")
@@ -53,9 +70,14 @@ public class StudentCourseHomeworkReplyController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        Integer teacherId = null;
         if(!studentCourseHomeworkReply.isExtra()){
             studentCourseHomeworkReply.setUserId(sysUser.getId());
             studentCourseHomeworkReplyService.insert(studentCourseHomeworkReply);
+            StudentCourseHomework studentCourseHomework = studentCourseHomeworkDao.get(studentCourseHomeworkReply.getStudentCourseHomeworkId());
+            CourseSchedule courseSchedule = courseScheduleDao.get(studentCourseHomework.getCourseScheduleId());
+            teacherId=courseSchedule.getActualTeacherId();
+            studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(sysUser.getId())), teacherId);
         }else{
             ExtracurricularExercisesMessage extracurricularExercisesMessage=new ExtracurricularExercisesMessage();
             extracurricularExercisesMessage.setExtracurricularExercisesReplyId(studentCourseHomeworkReply.getStudentCourseHomeworkId());

+ 5 - 31
mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java

@@ -35,13 +35,14 @@ public class SysMessageController extends BaseController {
 
 	@ApiOperation("获取所有消息列表")
 	@GetMapping(value = "list")
-	public Object list(SysMessageQueryInfo queryInfo) throws IOException {
+	public Object list(SysMessageQueryInfo queryInfo){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		queryInfo.setUserId(sysUser.getId());
 		queryInfo.setType(MessageSendMode.PUSH.getCode());
+		queryInfo.setJpushType("STUDENT");
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
@@ -53,7 +54,7 @@ public class SysMessageController extends BaseController {
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return sysMessageService.updateStatus(sysUser.getId(), status) > 0 ? succeed() : failed();
+		return sysMessageService.updateStatus(sysUser.getId(), status,"STUDENT") > 0 ? succeed() : failed();
 	}
 
 	@ApiOperation("设置已读")
@@ -74,7 +75,7 @@ public class SysMessageController extends BaseController {
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId());
+		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId(),"STUDENT");
 
 		if (map == null || map.size() == 0) {
 			return succeed();
@@ -82,33 +83,6 @@ public class SysMessageController extends BaseController {
 		return succeed(map);
 	}
 
-	/*
-	 * @ApiOperation(value = "发送短信验证码")
-	 * 
-	 * @PostMapping("/sendSmsCode") public Object sendSmsCode(String sendCodeType, String mobileNo) {
-	 * 
-	 * SysUser sysUser;
-	 * 
-	 * if (StringUtils.isBlank(mobileNo)) { sysUser = sysUserFeignService.queryUserInfo(); } else { sysUser =
-	 * sysUserFeignService.queryUserByMobile(mobileNo); } if (sysUser == null) { return failed(HttpStatus.FORBIDDEN, "请登录"); } Integer userId =
-	 * sysUser.getId();
-	 * 
-	 * mobileNo = sysUser.getPhone();
-	 * 
-	 * MessageType messageType = MessageType.getMessageType(sendCodeType); if (messageType == null) { throw new BizException("消息类型参数错误"); } if
-	 * (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) { throw new BizException("请输入正确的手机号"); }
-	 * sysMessageService.sendSecurityCode(MessageSender.YIMEI, userId, MessageSendMode.SMS, messageType, mobileNo); return succeed(); }
-	 */
-
-	/*
-	 * @ApiOperation(value = "发送短信验证码")
-	 * 
-	 * @PostMapping("/noAuth/sendSmsCode") public Object noAuthSendSmsCode(String sendCodeType, String mobileNo) { MessageType messageType =
-	 * MessageType.getMessageType(sendCodeType); if (messageType == null) { throw new BizException("消息类型参数错误"); } if (StringUtils.isBlank(mobileNo) ||
-	 * !CommonValidator.isMobileNo(mobileNo)) { throw new BizException("请输入正确的手机号"); } // sysMessageService.sendSecurityCode(MessageSender.YIMEI,
-	 * userId, MessageSendMode.SMS, messageType, mobileNo); return succeed(); }
-	 */
-
 	@ApiOperation(value = "发送消息")
 	@PostMapping("/sendMessage")
 	public Object sendMessage(MessageSender messageSender, String content, String receiver, int readStatus, String url, String group) {
@@ -122,7 +96,7 @@ public class SysMessageController extends BaseController {
 		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
 			throw new BizException("请输入正确的手机号");
 		}
-		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group, "");
+		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group, "STUDENT");
 		return succeed();
 	}
 }

+ 2 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java

@@ -45,8 +45,8 @@ public class ClassGroupController extends BaseController {
 
     @ApiOperation(value = "教师关联班级获取")
     @GetMapping("/findTeacherClassGroups")
-    public Object findTeacherClassGroups(@ApiParam(value = "课程类型:MUSIC_GROUP,VIP,PRACTICE", required = true)String type){
-        return succeed(classGroupService.findTeacherClassGroups(type));
+    public Object findTeacherClassGroups(String type,String status){
+        return succeed(classGroupService.findTeacherClassGroups(type,status));
     }
 
     @ApiOperation(value = "获取教师班级详情界面头部信息")

+ 4 - 3
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java

@@ -46,6 +46,7 @@ public class SysMessageController extends BaseController {
 		}
 		queryInfo.setUserId(sysUser.getId());
 		queryInfo.setType(3);
+		queryInfo.setJpushType("TEACHER");
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
@@ -57,7 +58,7 @@ public class SysMessageController extends BaseController {
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return sysMessageService.updateStatus(sysUser.getId(), status) > 0 ? succeed() : failed();
+		return sysMessageService.updateStatus(sysUser.getId(), status,"TEACHER") > 0 ? succeed() : failed();
 	}
 
 	@ApiOperation("设置已读")
@@ -78,7 +79,7 @@ public class SysMessageController extends BaseController {
 		if (sysUser == null) {
 			return failed("请重新登录");
 		}
-		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId());
+		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId(),"TEACHER");
 
 		if (map == null || map.size() == 0) {
 			return succeed();
@@ -99,7 +100,7 @@ public class SysMessageController extends BaseController {
 		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
 			throw new BizException("请输入正确的手机号");
 		}
-		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group,null);
+		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group,"TEACHER");
 		return succeed();
 	}
 }

+ 5 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseHomeworkReplyController.java

@@ -97,7 +97,11 @@ public class TeacherCourseHomeworkReplyController extends BaseController {
     @ApiOperation(value = "检测是否都布置了作业")
     @GetMapping("/checkeIsAssignHomework")
     public HttpResponseResult checkeIsAssignHomework(Long courseScheduleId, String studentIds){
-        return succeed(studentServeService.checkeIsAssignHomework(courseScheduleId, studentIds));
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(studentServeService.checkeIsAssignHomework(courseScheduleId, studentIds, user.getId()));
     }
 
 }

+ 7 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -121,6 +121,13 @@ public class StudentManageController extends BaseController {
         return succeed(studentManageService.queryMusicGroupStudent(queryInfo));
     }
 
+    @ApiOperation(value = "乐团管理--乐团详情--学员列表--获取学员可排课时长")
+    @GetMapping("/queryStudentSubTotalCourseTimes")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/queryStudentSubTotalCourseTimes')")
+    public Object queryStudentSubTotalCourseTimes(Integer userId,String musicGroupId){
+        return succeed(studentManageService.queryStudentSubTotalCourseTimes(userId,musicGroupId));
+    }
+
     @ApiOperation(value = "乐团修改--学员缴费记录--可新增学员列表")
     @GetMapping("/queryCanAddStudent")
     @PreAuthorize("@pcs.hasPermissions('studentManage/queryCanAddStudent')")

+ 2 - 73
mec-web/src/main/java/com/ym/mec/web/controller/SysMessageController.java

@@ -38,7 +38,7 @@ public class SysMessageController extends BaseController {
 
 	@ApiOperation("获取所有消息列表")
 	@GetMapping(value = "list")
-	public Object list(SysMessageQueryInfo queryInfo) throws IOException {
+	public Object list(SysMessageQueryInfo queryInfo){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -51,17 +51,6 @@ public class SysMessageController extends BaseController {
 		return succeed(pageInfo);
 	}
 
-	@ApiOperation("一键已读")
-	@PostMapping("batchSetRead")
-	public Object batchSetRead() {
-		int status = 1;
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		return sysMessageService.updateStatus(sysUser.getId(), status) > 0 ? succeed() : failed();
-	}
-
 	@ApiOperation("设置已读")
 	@PostMapping("setRead")
 	public Object setRead(Long id) {
@@ -80,66 +69,6 @@ public class SysMessageController extends BaseController {
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return succeed(sysMessageService.queryCountOfUnread(MessageSendMode.SEO, sysUser.getId()));
-	}
-
-	/*@ApiOperation(value = "发送短信验证码")
-	@PostMapping("/sendSmsCode")
-	public Object sendSmsCode(String sendCodeType, String mobileNo) {
-
-		SysUser sysUser;
-
-		if (StringUtils.isBlank(mobileNo)) {
-			sysUser = sysUserFeignService.queryUserInfo();
-		} else {
-			sysUser = sysUserFeignService.queryUserByMobile(mobileNo);
-		}
-		if (sysUser == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		Integer userId = sysUser.getId();
-
-		mobileNo = sysUser.getPhone();
-
-		MessageType messageType = MessageType.getMessageType(sendCodeType);
-		if (messageType == null) {
-			throw new BizException("消息类型参数错误");
-		}
-		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
-			throw new BizException("请输入正确的手机号");
-		}
-		sysMessageService.sendSecurityCode(MessageSender.YIMEI, userId, MessageSendMode.SMS, messageType, mobileNo);
-		return succeed();
-	}*/
-
-	/*@ApiOperation(value = "发送短信验证码")
-	@PostMapping("/noAuth/sendSmsCode")
-	public Object noAuthSendSmsCode(String sendCodeType, String mobileNo) {
-		MessageType messageType = MessageType.getMessageType(sendCodeType);
-		if (messageType == null) {
-			throw new BizException("消息类型参数错误");
-		}
-		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
-			throw new BizException("请输入正确的手机号");
-		}
-//		sysMessageService.sendSecurityCode(MessageSender.YIMEI, userId, MessageSendMode.SMS, messageType, mobileNo);
-		return succeed();
-	}*/
-
-	@ApiOperation(value = "发送消息")
-	@PostMapping("/sendMessage")
-	public Object sendMessage(MessageSender messageSender, String content, String receiver, int readStatus, String url, String group) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		Integer userId = sysUser.getId();
-
-		String mobileNo = sysUser.getPhone();
-		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
-			throw new BizException("请输入正确的手机号");
-		}
-		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group,null);
-		return succeed();
+		return succeed(sysMessageService.queryCountOfUnread(MessageSendMode.SEO, sysUser.getId(),null));
 	}
 }

+ 6 - 3
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 
 @RequestMapping("task")
@@ -260,9 +262,10 @@ public class TaskController extends BaseController {
 
 	//学生服务信息统计
 	@GetMapping("/exercisesSituationStatistics")
-	public void exercisesSituationStatistics(){
-//		extracurricularExercisesReplyService.exercisesSituationStatistics2(null);
-		studentServeService.exercisesSituationStatistics(null);
+	public void exercisesSituationStatistics(String monday){
+		studentServeService.exercisesSituationStatistics2(monday,null);
+//		studentServeService.exercisesSituationStatistics2(null,new ArrayList<>(Arrays.asList(1095257)));
+//		studentServeService.exercisesSituationStatistics(null);
 	}
 
 	//更新学生运营指标

+ 10 - 2
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

@@ -1,6 +1,8 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiOperation;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,8 +43,14 @@ public class EduStudentStudentController extends BaseController {
 
     @ApiOperation(value = "教务老师关联的学员列表")
     @GetMapping("studentManage/queryGroupStudents")
-    public Object queryGroupStudents(String groupType){
-        return succeed(studentManageService.queryGroupStudents(groupType));
+    public Object queryGroupStudents(StudentQueryInfo queryInfo){
+        return succeed(studentManageService.queryGroupStudents(queryInfo));
+    }
+
+    @ApiOperation(value = "获取当前教务老师关联的课程组上该学员的所有剩余课程")
+    @GetMapping("studentManage/queryStudentNoStartCourse")
+    public Object queryStudentNoStartCourse(StudentQueryInfo queryInfo){
+        return succeed(studentManageService.queryStudentNoStartCourse(queryInfo));
     }
 
 }

+ 100 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/SysEduMessageController.java

@@ -0,0 +1,100 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.MessageSendMode;
+import com.ym.mec.biz.dal.page.SysMessageQueryInfo;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.ym.mec.util.validator.CommonValidator;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.Map;
+
+@RestController
+@Api(tags = "消息服务")
+@RequestMapping("sysEduMessage")
+public class SysEduMessageController extends BaseController {
+
+	@Autowired
+	private SysMessageService sysMessageService;
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("获取所有消息列表")
+	@GetMapping(value = "list")
+	public Object list(SysMessageQueryInfo queryInfo){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		queryInfo.setUserId(sysUser.getId());
+		queryInfo.setType(3);
+		queryInfo.setJpushType("SYSTEM");
+		return succeed(sysMessageService.queryPage(queryInfo));
+	}
+
+	@ApiOperation("一键已读")
+	@PostMapping("batchSetRead")
+	public Object batchSetRead() {
+		int status = 1;
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return sysMessageService.updateStatus(sysUser.getId(), status,"SYSTEM") > 0 ? succeed() : failed();
+	}
+
+	@ApiOperation("设置已读")
+	@PostMapping("setRead")
+	public Object setRead(Long id) {
+		int status = 1;
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return sysMessageService.updateOneStatus(id, status) > 0 ? succeed() : failed();
+	}
+
+	@ApiOperation(value = "查询用户未读消息条数")
+	@GetMapping("/queryCountOfUnread")
+	public Object queryCountOfUnread() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("请重新登录");
+		}
+		Map<String, Integer> map = sysMessageService.queryCountOfUnread(MessageSendMode.PUSH, sysUser.getId(),"SYSTEM");
+
+		if (map == null || map.size() == 0) {
+			return succeed();
+		}
+		return succeed(map);
+	}
+
+	@ApiOperation(value = "发送消息")
+	@PostMapping("/sendMessage")
+	public Object sendMessage(MessageSender messageSender, String content, String receiver, int readStatus, String url, String group) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		Integer userId = sysUser.getId();
+
+		String mobileNo = sysUser.getPhone();
+		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
+			throw new BizException("请输入正确的手机号");
+		}
+		sysMessageService.sendMessage(messageSender, userId, "", content, receiver, null, readStatus, url, group,"SYSTEM");
+		return succeed();
+	}
+}