Ver Fonte

Merge branch 'master' into adapay_delay_1231

周箭河 há 4 anos atrás
pai
commit
395a098900
100 ficheiros alterados com 2488 adições e 767 exclusões
  1. 1 1
      codegen/src/main/resources/generateConfigration.xml
  2. 10 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/LoginEntity.java
  3. 70 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserDevice.java
  4. 1 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  5. 15 8
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/WebSecurityConfig.java
  6. 5 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  7. 23 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/UsernameAuthenticationFilter.java
  8. 47 11
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  9. 13 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDeviceDao.java
  10. 21 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserDeviceService.java
  11. 58 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserDeviceServiceImpl.java
  12. 83 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserDeviceMapper.xml
  13. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  14. 80 38
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  15. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  17. 39 19
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  18. 30 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  19. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  20. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  21. 27 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  22. 23 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  23. 6 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMessageDao.java
  24. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderAddStudentDto.java
  25. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  26. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentAttendanceDto.java
  27. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentNoStartCoursesDto.java
  28. 78 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeCourseDto.java
  29. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  30. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  31. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java
  32. 34 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentExtracurricularExercisesSituation.java
  33. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMessage.java
  34. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  35. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseSalaryQueryInfo4Web.java
  36. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicCalenderDetailQueryInfo.java
  37. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentRouteOrderQueryInfo.java
  38. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  39. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMessageQueryInfo.java
  40. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java
  41. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  42. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  43. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesMessageService.java
  44. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  45. 2 9
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  46. 18 10
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  47. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentServeService.java
  48. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  49. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  50. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  51. 13 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  52. 7 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  53. 43 28
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  54. 177 34
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  55. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesMessageServiceImpl.java
  56. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  57. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  58. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupOrganizationCourseSettingsServiceImpl.java
  59. 17 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  60. 46 102
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  61. 36 25
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  62. 7 49
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java
  63. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  64. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkReplyServiceImpl.java
  65. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  66. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  67. 66 33
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  68. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  69. 25 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  70. 326 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  71. 8 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  72. 24 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  73. 21 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  74. 57 45
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  75. 9 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  76. 29 4
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  77. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  78. 2 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  79. 19 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  80. 3 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml
  81. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  82. 209 119
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  83. 49 14
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  84. 38 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  85. 16 12
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  86. 13 6
      mec-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  87. 13 4
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  88. 7 2
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  89. 5 17
      mec-im/src/main/java/com/ym/controller/RoomController.java
  90. 9 0
      mec-im/src/main/java/com/ym/pojo/RoomStatusNotify.java
  91. 31 31
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  92. 2 2
      mec-im/src/main/java/com/ym/service/RoomService.java
  93. 22 6
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  94. 3 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkController.java
  95. 24 2
      mec-student/src/main/java/com/ym/mec/student/controller/StudentCourseHomeworkReplyController.java
  96. 5 31
      mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  97. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  98. 4 3
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java
  99. 5 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseHomeworkReplyController.java
  100. 7 0
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

+ 1 - 1
codegen/src/main/resources/generateConfigration.xml

@@ -8,7 +8,7 @@
 		<catalog>mec_dev</catalog>
 		<schema>mec_dev</schema>
 	</dbConfiguration>
-	<srcBase>d:/javabean</srcBase>
+	<srcBase>/Users/zouxuan/Documents/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
 	<daoPackageName>com.ym.mec.biz.dal.dao</daoPackageName>
 	<servicePackageName>com.ym.mec.biz.service</servicePackageName>

+ 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);
 
     /**
      * 根据合奏班编号列表,获取单技班名称列表

+ 80 - 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: 课程编号
@@ -841,6 +841,16 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<CourseSchedule> findCourseScheduleWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
     /**
+     * @describe 统计指定时间段内已结算的课程组类型数量
+     * @author Joburgess
+     * @date 2020/12/29 0029
+     * @param startDate:
+     * @param endDate:
+     * @return int
+     */
+    int countIsSalaryGroupTypes(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    /**
      * @param classGroupId: 班级编号
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 根据班级获取课程计划
@@ -1071,7 +1081,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 +1307,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 +1317,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 +1382,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 +1397,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 +1433,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 +1557,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取用户课程信息
+     *
      * @param studentIds
      * @param groupType
      * @return
@@ -1557,6 +1568,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取上一次连堂课
+     *
      * @param classGroupId
      * @param startTime
      * @param teacherId
@@ -1569,6 +1581,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程组已结束最后一节课时间
+     *
      * @param vipGroupIds
      * @return
      */
@@ -1576,6 +1589,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取课程状态列表
+     *
      * @param courseScheduleIds
      * @return
      */
@@ -1583,6 +1597,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取第一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1591,6 +1606,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取最后一节课时间
+     *
      * @param practiceGroupId
      * @param groupType
      * @return
@@ -1599,12 +1615,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 +1632,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 当前班级是否有未开始的课程
+     *
      * @param classGroupIds
      * @param teacherId
      * @return
@@ -1623,6 +1642,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 查询班级未上的课程类型对应的时长
+     *
      * @param classGroupIdList
      * @return
      */
@@ -1630,34 +1650,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 +1687,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);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java

@@ -506,4 +506,15 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 * @return
 	 */
 	List<Map<Long, String>> queryTeacherIdMap(@Param("courseScheduleIds") List<Long> courseScheduleIds, @Param("teacherRole") String teacherRole);
+
+	/**
+	 * @describe 获取指定时间段内已结算的教师课酬记录
+	 * @author Joburgess
+	 * @date 2020/12/29 0029
+	 * @param startDate:
+	 * @param endDate:
+	 * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+	 */
+	List<CourseScheduleTeacherSalary> getIsSalaryWithDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
 }

+ 39 - 19
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java

@@ -15,6 +15,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 批量新增
+	 *
 	 * @param musicGroupPaymentCalenderDetailList
 	 * @return
 	 */
@@ -22,6 +23,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取列表
+	 *
 	 * @param ids
 	 * @return
 	 */
@@ -29,12 +31,14 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 批量修改
+	 *
 	 * @param calenderDetails
 	 */
 	void batchUpdate(@Param("calenderDetails") List<MusicGroupPaymentCalenderDetail> calenderDetails);
 
 	/**
 	 * 根据指定的日历编号查询
+	 *
 	 * @param calenderId
 	 * @return
 	 */
@@ -42,6 +46,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 根据声部获取乐团下完成缴费的学员
+	 *
 	 * @param musicGroupId
 	 * @param subjectId
 	 * @return
@@ -51,6 +56,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取学生最后一期续费记录
+	 *
 	 * @param musicGroupId
 	 * @param userId
 	 * @return
@@ -59,6 +65,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取可开启缴费的数据集
+	 *
 	 * @param ids
 	 * @return
 	 */
@@ -66,6 +73,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 当前用户是否有进行中的订单
+	 *
 	 * @param musicGroupId
 	 * @param userId
 	 * @return
@@ -79,6 +87,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取可以推送缴费提醒的列表
+	 *
 	 * @param musicGroupPaymentCalenderId
 	 * @return
 	 */
@@ -86,24 +95,28 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取当天创建,已开启缴费,并且未缴费的用户列表
+	 *
 	 * @return
 	 */
 	List<MusicGroupPaymentCalenderDetail> queryNoPaymentCanPushList();
 
 	/**
 	 * 获取学员对应的乐团
+	 *
 	 * @return
 	 */
 	List<Map<Integer, String>> queryPaymentPushMap();
 
 	/**
 	 * 删除缴费详情
+	 *
 	 * @param musicGroupPaymentCalenderIds
 	 */
 	void batchDel(String musicGroupPaymentCalenderIds);
 
 	/**
 	 * 删除未缴费的明细
+	 *
 	 * @param userId
 	 * @param musicGroupId
 	 */
@@ -111,12 +124,14 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 根据缴费记录删除缴费详情
+	 *
 	 * @param id
 	 */
     void deleteByCalenderId(@Param("id") Long id);
 
 	/**
 	 * 获取缴费详情学员列表
+	 *
 	 * @param calenderId
 	 * @return
 	 */
@@ -124,6 +139,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 获取未缴费的员列表
+	 *
 	 * @param calenderId
 	 * @return
 	 */
@@ -131,6 +147,7 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 
 	/**
 	 * 查询进行中的缴费
+	 *
 	 * @param musicGroupId
 	 * @param userId
 	 * @return
@@ -138,74 +155,77 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
     Integer countOpenPayment(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 
 	/**
+	 * @param calenderId:
+	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
 	 * @describe 获取指定缴费日历的详情
 	 * @author Joburgess
 	 * @date 2020.10.27
-	 * @param calenderId:
-	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
 	 */
 	List<MusicGroupPaymentCalenderDetail> getCalenderDetailWithCalender(@Param("calenderId") Long calenderId);
 
 	/**
+	 * @param calenderIds:
+	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
 	 * @describe 获取指定缴费日历的详情
 	 * @author Joburgess
 	 * @date 2020.10.30
-	 * @param calenderIds:
-	 * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail>
 	 */
 	List<MusicGroupPaymentCalenderDetail> getWithCalenderIds(@Param("calenderIds") List<Long> calenderIds);
 
     /**
-     * @describe 获取缴费日历学员列表
-     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
-     * @author zouxuan
-     * @date 2020/10/30
-     * @time 16:39
-     * @param batchNo:
-     * @param musicGroupId:
-     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
-     */
+	 * @param batchNo:
+	 * @param musicGroupId:
+	 * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
+	 * @describe 获取缴费日历学员列表
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/10/30
+	 * @time 16:39
+	 */
 	List<SimpleUserDto> querySimpleUserDto(@Param("batchNo") String batchNo, @Param("musicGroupId") String musicGroupId);
 
 	/**
 	 * 统计实际收款金额
+	 *
 	 * @param id
 	 * @return
 	 */
 	BigDecimal sumActualAmount(@Param("id") Long id);
 
 	/**
+	 * @param calenderId:
+	 * @param userId:
+	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
 	 * @describe 获取学员缴费日历详情
 	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
 	 * @author zouxuan
 	 * @date 2020/11/3
 	 * @time 14:47
-	 * @param calenderId:
-	 * @param userId:
-	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
 	 */
 	MusicGroupPaymentCalenderDetail findByCalenderIdAndUserId(@Param("calenderId") Long calenderId, @Param("userId") Integer userId);
 
 	/**
+	 * @param orderId:
+	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
 	 * @describe 根据订单编号获取缴费详情
 	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
 	 * @author zouxuan
 	 * @date 2020/11/3
 	 * @time 15:41
-	 * @param orderId:
-	 * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail
 	 */
 	MusicGroupPaymentCalenderDetail findByOrderId(@Param("orderId") Long orderId);
 
 	/**
 	 * 获取未缴费且不是0元的学员列表
+	 *
 	 * @param calenderId
 	 * @return
 	 */
-    List<Map<Integer, String>> queryNoPaymentAndNotZeroStudent(Long calenderId);
+    List<Map<Integer, String>> queryNoPaymentAndNotZeroStudent(@Param("calenderId") Long calenderId, @Param("studentIds") Set studentIds);
 
 	/**
 	 * 将0元未缴费学员缴费状态更新为已缴费
+	 *
 	 * @param calenderId
 	 */
 	void updateNoPaymentAndZeroPaymentStatus(Long calenderId);

+ 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);
+
 }

+ 23 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -281,10 +281,30 @@ public interface StudentManageDao {
     List<StudentListCourseDto> queryStudentRemianCourse(@Param("userIds") Set<Integer> userIds);
 
     /**
-     * 获取教务老师关联的学员列表
+     * 获取教务老师关联vip的学员列表
      *
-     * @param groupType
      * @return
      */
-    List<BasicUserDto> queryGroupStudents(@Param("groupType") String groupType, @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);
+
+    /**
+     * 获取教务老师关联网管课的学员列表
+     *
+     * @return
+     */
+    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);
 
 	/**
 	 * 修改单个消息状态

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderAddStudentDto.java

@@ -1,12 +1,13 @@
 package com.ym.mec.biz.dal.dto;
 
 import java.util.List;
+import java.util.Set;
 
 public class MusicGroupPaymentCalenderAddStudentDto {
 
 	private String batchNo;
 
-	private List<Integer> userIdList;
+	private Set<Integer> userIdList;
 
 	public String getBatchNo() {
 		return batchNo;
@@ -16,11 +17,11 @@ public class MusicGroupPaymentCalenderAddStudentDto {
 		this.batchNo = batchNo;
 	}
 
-	public List<Integer> getUserIdList() {
+	public Set<Integer> getUserIdList() {
 		return userIdList;
 	}
 
-	public void setUserIdList(List<Integer> userIdList) {
+	public void setUserIdList(Set<Integer> userIdList) {
 		this.userIdList = userIdList;
 	}
 }

+ 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;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java

@@ -67,6 +67,16 @@ public class CourseScheduleTeacherSalary {
 
 	private String deductionReason;
 
+	private Boolean belongToDaya;
+
+	public Boolean getBelongToDaya() {
+		return belongToDaya;
+	}
+
+	public void setBelongToDaya(Boolean belongToDaya) {
+		this.belongToDaya = belongToDaya;
+	}
+
 	public BigDecimal getTeacherActualSalary() {
 		return teacherActualSalary;
 	}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupSubjectGoodsGroup.java

@@ -46,6 +46,9 @@ public class MusicGroupSubjectGoodsGroup {
 	//团购减免课程费用
 	private BigDecimal remissionCourseFee;
 
+	//团购减免课程费用 1-是 0-否
+	private Integer groupRemissionCourseFee;
+
 	//租赁押金
 	private BigDecimal depositFee;
 
@@ -205,4 +208,11 @@ public class MusicGroupSubjectGoodsGroup {
 		return ToStringBuilder.reflectionToString(this);
 	}
 
+	public Integer getGroupRemissionCourseFee() {
+		return groupRemissionCourseFee;
+	}
+
+	public void setGroupRemissionCourseFee(Integer groupRemissionCourseFee) {
+		this.groupRemissionCourseFee = groupRemissionCourseFee;
+	}
 }

+ 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/CourseSalaryQueryInfo4Web.java

@@ -27,6 +27,16 @@ public class CourseSalaryQueryInfo4Web extends QueryInfo {
 
     private Integer confirmStatus;
 
+    private Integer belongDaya;
+
+    public Integer getBelongDaya() {
+        return belongDaya;
+    }
+
+    public void setBelongDaya(Integer belongDaya) {
+        this.belongDaya = belongDaya;
+    }
+
     public Integer getTeacherId() {
         return teacherId;
     }

+ 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;
+	}
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentRouteOrderQueryInfo.java

@@ -13,6 +13,9 @@ public class StudentPaymentRouteOrderQueryInfo extends QueryInfo {
 	
 	private String type;//SERVICE、SELL
 
+	//不包含淘气
+	private Integer noneTqType;//TQ
+
 	public String getTransNo() {
 		return transNo;
 	}
@@ -44,4 +47,12 @@ public class StudentPaymentRouteOrderQueryInfo extends QueryInfo {
 	public void setType(String type) {
 		this.type = type;
 	}
+
+	public Integer getNoneTqType() {
+		return noneTqType;
+	}
+
+	public void setNoneTqType(Integer noneTqType) {
+		this.noneTqType = noneTqType;
+	}
 }

+ 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

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.FeeStudentDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
@@ -49,14 +50,14 @@ public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long
      * @param musicGroupPaymentCalenderId
      * @param userIdList
      */
-    void batchAdd(Long musicGroupPaymentCalenderId, List<Integer> userIdList);
+    void batchAdd(Long musicGroupPaymentCalenderId, Set<Integer> userIdList);
 
     /**
      * 乐团缴费记录新增学员
      * @param batchNo
      * @param userIdList
      */
-    void batchAdd(String batchNo, List<Integer> userIdList);
+    void batchAdd(String batchNo, Set<Integer> userIdList);
 
     /**
      * 获取fee表学员列表

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import java.util.List;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDetailDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
@@ -73,14 +74,6 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	boolean deleteByBatchNo(String batchNo);
 
 	/**
-	 * 推送乐团缴费提醒
-	 * @param id
-	 * @param userIds
-	 * @return
-	 */
-	void paymentPush(Long id, String userIds);
-
-	/**
 	 * @describe 更新乐团学员缴费状态
 	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
 	 * @author zouxuan
@@ -171,5 +164,5 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @param musicGroup:
 	 * @return com.ym.mec.biz.dal.entity.MusicGroupStudentFee
 	 */
-	void pushWaitRenewMessage(Long calenderId, MusicGroup musicGroup);
+	void pushWaitRenewMessage(Long calenderId, MusicGroup musicGroup, Set<Integer> studentIds);
 }

+ 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 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -209,6 +209,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     String VIP_SPECIAL_ACTIVITY_IDS = "vip_special_activity_ids";
 
+    String DAYA_BASE_SALARY_AMOUNT = "daya_base_salary_amount";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

+ 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);
 
 	/**
 	 * 获取教师个人的签到记录

+ 13 - 5
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("课程类型错误");
@@ -1625,14 +1625,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<StudentAttendanceViewDto> tempIds = truantStudent.stream()
                     .filter(studentAttendanceViewDto -> studentAttendanceViewDto.getGroupType().equals("MUSIC"))
                     .collect(Collectors.toList());
-            if (!CollectionUtils.isEmpty(tempIds)) {
+
+            if (!CollectionUtils.isEmpty(tempIds)&&schedule.getGroupType() == MUSIC) {
                 List<Map<Integer, String>> studentSubjectNameMaps = subjectDao.findStudentSubjectNameMaps(tempIds);
                 Map<Integer, String> studentSubjectNameMap = MapUtil.convertIntegerMap(studentSubjectNameMaps);
                 List<Map<Integer, Integer>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
                 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());
+                });
+            }else if(schedule.getGroupType() != MUSIC){
+                ClassGroup classGroup = classGroupDao.get(schedule.getClassGroupId());
+                Subject subject = subjectDao.get(Integer.valueOf(classGroup.getSubjectIdList()));
+                truantStudent.forEach(studentAttendanceViewDto -> {
+                    studentAttendanceViewDto.setSubjectName(subject.getName());
+                    studentAttendanceViewDto.setSubjectId(Objects.nonNull(subject.getId())?subject.getId().longValue():0);
                 });
             }
         }

+ 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);
 

+ 177 - 34
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -222,22 +222,41 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
+        //获取课程对应教学点补贴
+        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(new ArrayList<>(courseScheduleIds));
+        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+            List<String> deductReasons = new ArrayList<>();
+
+            BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+
+            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            if (Objects.isNull(subsidy)) {
+                subsidy = new BigDecimal(0);
+            }
+            courseScheduleTeacherSalary.setSubsidy(subsidy);
+            expectSalary = expectSalary.add(subsidy);
+
+            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+                deductReasons.add("教学点补贴:" + subsidy);
+            }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
             if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0){
-                courseScheduleTeacherSalary.setExpectSalary(courseScheduleTeacherSalary.getExpectSalary().multiply(new BigDecimal("0.8")));
+                expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+                deductReasons.add("未转正");
             }
 
             //扣除费用
             BigDecimal deductCost = new BigDecimal(0);
-            List<String> deductReasons = new ArrayList<>();
+
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
             TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
                 //未签到扣除全部课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签到扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
                 //异常签到
@@ -245,18 +264,18 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
                 if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)));
                     deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
                 }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
                 }
             }
 
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
                 //未签退扣除全部课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签退扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
@@ -265,22 +284,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)));
                     deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
             }
 
-            BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+            BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
-                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
-
+            if(!CollectionUtils.isEmpty(deductReasons))
+                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
@@ -340,23 +359,40 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
         Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
 
+        //获取课程对应教学点补贴
+        List<Map<Long, BigDecimal>> courseSubsidyByCourses = courseScheduleTeacherSalaryDao.findCourseSubsidyByCourses(courseScheduleIds);
+        Map<Integer, BigDecimal> courseSubsidyMap = MapUtil.convertIntegerMap(courseSubsidyByCourses);
+
         //处理课酬信息
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+            List<String> deductReasons = new ArrayList<>();
+
+            BigDecimal expectSalary = courseScheduleTeacherSalary.getExpectSalary();
+
+            BigDecimal subsidy = courseSubsidyMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            if (Objects.isNull(subsidy)) {
+                subsidy = new BigDecimal(0);
+            }
+            courseScheduleTeacherSalary.setSubsidy(subsidy);
+            expectSalary = expectSalary.add(subsidy);
+            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+                deductReasons.add("教学点补贴:" + subsidy);
+            }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
             if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0){
-                courseScheduleTeacherSalary.setExpectSalary(courseScheduleTeacherSalary.getExpectSalary().multiply(new BigDecimal("0.8")));
+                expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
+                deductReasons.add("未转正");
             }
 
             //扣除费用
             BigDecimal deductCost = new BigDecimal(0);
-            List<String> deductReasons = new ArrayList<>();
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
             TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
                 //未签到扣除全部课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签到扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
                 //异常签到
@@ -364,24 +400,23 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
                 if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)));
                     deductReasons.add("课程开始前1分钟至开始后3分钟进入教室扣除一半课酬");
                 }else if(signCourseTimeBetween<=-3){
                     //课程开始后3分钟后进入教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("课程开始后3分钟进入教室扣除全部课酬");
                 }
 
                 if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                    deductCost = courseScheduleTeacherSalary.getExpectSalary();
-                    deductReasons.clear();
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
                 }
             }
 
             if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
                 //未签退扣除全部课酬
-                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签退扣除全部课酬");
             }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
                 //异常签退
@@ -390,27 +425,27 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 if(signOutCourseTimeBetween>3){
                     //课程开始前20分钟至开始后3分钟退出教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary());
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("课程结束前3分钟之前退出教室扣除全部课酬");
                 }else if(signOutCourseTimeBetween<=3&&signOutCourseTimeBetween>0){
                     //课程结束前3分钟后至课程结束前退出教室
-                    deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                    deductCost = deductCost.add(expectSalary.divide(new BigDecimal(2)));
                     deductReasons.add("课程结束前3分钟后至课程结束前退出教室扣除一半课酬");
                 }
 
                 if(TeachModeEnum.OFFLINE.equals(courseScheduleTeacherSalary.getCourseSchedule().getTeachMode())){
-                    deductCost = courseScheduleTeacherSalary.getExpectSalary();
-                    deductReasons.clear();
+                    deductCost = deductCost.add(expectSalary);
                     deductReasons.add("点名时经纬度不在范围内扣除全部课酬");
                 }
             }
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
-                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             }
+            if(!CollectionUtils.isEmpty(deductReasons))
+                courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
 
-            BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+            BigDecimal finalSalary = expectSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
@@ -541,15 +576,25 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(Objects.isNull(teacherSalary)){
                     teacherSalary = BigDecimal.ZERO;
                 }
+                List<String> deductReasons = new ArrayList<>();
+
+                BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
+                if (Objects.isNull(subsidy)) {
+                    subsidy = new BigDecimal(0);
+                }
+                teacherSalary = teacherSalary.add(subsidy);
+                if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+                    deductReasons.add("教学点补贴:" + subsidy);
+                }
 
                 //如果上课日期在转正日期之前的按80%结算
                 if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0){
                     teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
+                    deductReasons.add("未转正");
                 }
 
                 //扣除费用
                 BigDecimal deductCost = new BigDecimal(0);
-                List<String> deductReasons = new ArrayList<>();
                 deductReasons.add("课程应到人数:" + normalStudentNum);
                 List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
@@ -598,9 +643,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(BigDecimal.ZERO.compareTo(deductCost)<0){
                     deductReasons.add("扣除总费用:" + deductCost);
                 }
-                courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
+                if(!CollectionUtils.isEmpty(deductReasons))
+                    courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
 
                 //更新教师结算信息
+                courseScheduleTeacherSalary.setSubsidy(subsidy);
                 courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
                 courseScheduleTeacherSalary.setSettlementTime(now);
                 courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
@@ -645,19 +692,24 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
             }
 
-            if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0){
-                teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
-            }
+            List<String> deductReasons = new ArrayList<>();
 
-            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getSchoolId());
+            BigDecimal subsidy = courseSubsidyMap.get(courseSchedule.getId());
             if (Objects.isNull(subsidy)) {
                 subsidy = new BigDecimal(0);
             }
             teacherSalary = teacherSalary.add(subsidy);
+            if(BigDecimal.ZERO.compareTo(subsidy)!=0){
+                deductReasons.add("教学点补贴:" + subsidy);
+            }
+
+            if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0){
+                teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
+                deductReasons.add("未转正");
+            }
 
             //扣除费用
             BigDecimal deductCost = BigDecimal.ZERO;
-            List<String> deductReasons = new ArrayList<>();
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
             boolean isCallName = false;
@@ -746,9 +798,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             if(!signInInRange&&!signOutInRange){
-                deductReasons.clear();
                 //签到签退GPS定位在指定距离外
-                deductCost = teacherSalary;
+                deductCost = deductCost.add(teacherSalary);
                 deductReasons.add("签到签退GPS定位在指定距离外,扣除全部课酬");
             }
 
@@ -756,10 +807,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             if(BigDecimal.ZERO.compareTo(deductCost)<0){
                 deductReasons.add("扣除总费用:" + deductCost);
+            }
+            if(!CollectionUtils.isEmpty(deductReasons)){
                 courseScheduleTeacherSalary.setDeductionReason(org.apache.commons.lang3.StringUtils.join(deductReasons, ";"));
             }
 
             //更新教师结算信息
+            courseScheduleTeacherSalary.setSubsidy(subsidy);
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
@@ -1298,4 +1352,93 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         }
         return result;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void salaryMark() {
+        Date now = new Date();
+        Date date = DateUtil.addMonths(now, -1);
+        String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
+        String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
+
+        int isSalaryGroupTypes = courseScheduleDao.countIsSalaryGroupTypes(startDate, endDate);
+        if(isSalaryGroupTypes<3){
+            return;
+        }
+        List<CourseScheduleTeacherSalary> salaries = courseScheduleTeacherSalaryDao.getIsSalaryWithDate(startDate, endDate);
+        if(CollectionUtils.isEmpty(salaries)){
+            return;
+        }
+        SysConfig dayaBaseSalaryAmountConfig = sysConfigService.findByParamName(SysConfigService.DAYA_BASE_SALARY_AMOUNT);
+        BigDecimal dayaBaseSalaryAmount = new BigDecimal(4000);
+        if(Objects.nonNull(dayaBaseSalaryAmountConfig)&&StringUtils.isNotBlank(dayaBaseSalaryAmountConfig.getParanValue())){
+            dayaBaseSalaryAmount = new BigDecimal(dayaBaseSalaryAmountConfig.getParanValue());
+        }
+
+        Map<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMap = salaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getUserId));
+        List<CourseScheduleTeacherSalary> updateRecords = new ArrayList<>();
+        for (Map.Entry<Integer, List<CourseScheduleTeacherSalary>> teacherSalariesMapEntry : teacherSalariesMap.entrySet()) {
+            List<CourseScheduleTeacherSalary> teacherSalaries = teacherSalariesMapEntry.getValue();
+            List<BigDecimal> amounts = teacherSalaries.stream().map(CourseScheduleTeacherSalary::getActualSalary).collect(Collectors.toList());
+            List<BigDecimal> resultAmounts = salaryComposition(amounts, dayaBaseSalaryAmount);
+            for (BigDecimal resultAmount : resultAmounts) {
+                Iterator<CourseScheduleTeacherSalary> iterator = teacherSalaries.iterator();
+                while (iterator.hasNext()){
+                    CourseScheduleTeacherSalary teacherSalary = iterator.next();
+                    if(teacherSalary.getActualSalary().compareTo(resultAmount)==0){
+                        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                        courseScheduleTeacherSalary.setId(teacherSalary.getId());
+                        courseScheduleTeacherSalary.setBelongToDaya(true);
+                        updateRecords.add(courseScheduleTeacherSalary);
+                        iterator.remove();
+                        break;
+                    }
+                }
+            }
+        }
+        courseScheduleTeacherSalaryDao.batchUpdate(updateRecords);
+    }
+
+    @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());

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

@@ -13,6 +13,7 @@ import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesService;
+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;
@@ -47,6 +48,8 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	private SysMessageService sysMessageService;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentServeService studentServeService;
 
 	@Override
 	public BaseDAO<Long, ExtracurricularExercises> getDAO() {
@@ -111,6 +114,7 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 					userMap, null, 0, 3+notifyUrl, "STUDENT",
 					teacher.getRealName(),exercises.getTitle(), dateStr);
 		}
+		studentServeService.updateExercisesSituation(new Date(), studentIds, exercises.getTeacherId());
 	}
 
 	@Override

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

@@ -43,7 +43,7 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         musicGroupOrganizationCourseSettingsDao.insert(setting);
         for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
             detail.setMusicGroupOrganizationCourseSettingsId(setting.getId());
-            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 2, BigDecimal.ROUND_DOWN));
+            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
         }
         musicGroupOrganizationCourseSettingsDetailDao.batchInsert(setting.getDetails());
         return setting;
@@ -79,7 +79,7 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
             detail.setId(null);
             detail.setMusicGroupOrganizationCourseSettingsId(setting.getId());
-            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 2, BigDecimal.ROUND_DOWN));
+            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
         }
         musicGroupOrganizationCourseSettingsDetailDao.batchInsert(setting.getDetails());
         return setting;

+ 17 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.STUDENT;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
 
 import java.math.BigDecimal;
@@ -122,7 +123,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		}*/
 		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
 		//推送消息
-		if (studentIds.size() > 0) {
+		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
 			String musicGroupId = calenderDetails.get(0).getMusicGroupId();
 			Map<Integer, String> push = new HashMap<>();
 			for (Integer userId : studentIds) {
@@ -130,13 +131,13 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			}
 			MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
+			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
 			// 发送续费通知
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 					null, 0, memo,"STUDENT",musicGroup.getName());
 
 			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(),studentIds));
 			if(studentMaps.size() > 0){
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
 						null, 0, memo, null, musicGroup.getName());
@@ -169,19 +170,19 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
 		Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
 		//推送消息
-		if (studentIds.size() > 0) {
+		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
 			Map<Integer, String> push = new HashMap<>();
 			for (Integer userId : studentIds) {
 				push.put(userId, userId + "");
 			}
 			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + calender.getMusicGroupId();
+			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
 			// 发送续费通知
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 					null, 0, memo,"STUDENT",musicGroup.getName());
 			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(),studentIds));
 			if(studentMaps.size() > 0){
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
 						null, 0, memo, null, musicGroup.getName());
@@ -222,7 +223,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
 		
 		BigDecimal totalPrice = new BigDecimal(0);
-		if (calender.getPayUserType() == PayUserType.STUDENT) {
+		if (calender.getPayUserType() == STUDENT) {
 			for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
 				// 剔除可选课程
 				if (courseSettings.getIsStudentOptional() == false) {
@@ -278,7 +279,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(Long musicGroupPaymentCalenderId, List<Integer> userIdList) {
+	public void batchAdd(Long musicGroupPaymentCalenderId, Set<Integer> userIdList) {
 		
 		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(musicGroupPaymentCalenderId);
 		if(musicGroupPaymentCalender == null){
@@ -302,7 +303,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
 		
 		BigDecimal totalPrice = new BigDecimal(0);
-		if (musicGroupPaymentCalender.getPayUserType() == PayUserType.STUDENT) {
+		if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
 			for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
 				// 剔除可选课程
 				if (courseSettings.getIsStudentOptional() == false) {
@@ -372,14 +373,14 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
 		}
 		//给学员推送缴费通知
-		if(musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
-			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()));
+		if(musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
+			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),userIdList);
 		}
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(String batchNo, List<Integer> userIdList) {
+	public void batchAdd(String batchNo, Set<Integer> userIdList) {
 		
 		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
 		
@@ -410,7 +411,7 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			
 			BigDecimal totalPrice = new BigDecimal(0);
 			
-			if (musicGroupPaymentCalender.getPayUserType() == PayUserType.STUDENT) {
+			if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
 				for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
 					// 剔除可选课程
 					if (courseSettings.getIsStudentOptional() == false) {
@@ -481,9 +482,9 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		}
 		//给学员推送缴费通知
 		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
-			if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
-				musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,
-						musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()));
+			if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+				musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
+						musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),userIdList);
 			}
 		}
 	}

+ 46 - 102
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -252,7 +252,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				if(dtoStatus != null && dtoStatus == AUDITING){
 					status = AUDITING;
 				}else {
-					// 如果是临时加课,是否审核是根据单价判断
+					// 如果是临时加课,判断是否审核
 					for (MusicGroupPaymentCalenderCourseSettings courseSettings : musicGroupPaymentCalenderCourseSettingsList) {
 						OrganizationCourseUnitPriceSettings defaultUnitPrice = organizationCourseUnitPriceSettingsDao.queryByOrganIdAndCourseTypeAndChargeType(
 								musicGroup.getOrganId(), courseSettings.getCourseType(), musicGroup.getChargeTypeId());
@@ -260,10 +260,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 							throw new BizException("请先设置分部课程类型单价");
 						}
 						if (courseSettings.getCourseTotalMinuties() != 0) {
-							if (courseSettings
-									.getCourseCurrentPrice()
-									.divide(new BigDecimal(courseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN)
-									.compareTo(defaultUnitPrice.getUnitPrice()) != 0) {
+							
+							if (defaultUnitPrice.getUnitPrice().multiply(new BigDecimal(courseSettings.getCourseTotalMinuties()))
+									.compareTo(courseSettings.getCourseCurrentPrice()) != 0) {
+
 								status = AUDITING;
 								break;
 							}
@@ -319,17 +319,17 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties());
 					} else {
 						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().subtract(
-								pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
-										.setScale(2, BigDecimal.ROUND_DOWN)));
+								pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
+										.setScale(0, BigDecimal.ROUND_DOWN)));
 						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().subtract(
-								pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
-										.setScale(2, BigDecimal.ROUND_DOWN)));
+								pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
+										.setScale(0, BigDecimal.ROUND_DOWN)));
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties() - pccs.getCourseTotalMinuties() / times * (times - 1));
 					}
 				} else {
 					if (!pccs.getIsStudentOptional()) {
-						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
-						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
+						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN));
+						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN));
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties() / times);
 					} else {
 						continue;
@@ -419,7 +419,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				}else if(musicGroupPaymentCalenderDto.getMergeClassFlag()){
 					//缴费项目添加学员
 					int[] ints = Arrays.stream(musicGroupPaymentCalenderDto.getStudentIds().split(",")).mapToInt(Integer::parseInt).toArray();
-					List<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toList());
+					Set<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toSet());
 					musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender.getId(),list2);
 				}
 			}
@@ -563,7 +563,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					}
 				}
 			} else if (paymentType == PaymentType.ADD_COURSE || paymentType == PaymentType.ADD_STUDENT) {
-				// 如果是临时加课,是否审核是根据单价判断
+				// 如果是临时加课,判断是否审核
 				for (MusicGroupPaymentCalenderCourseSettings courseSettings : musicGroupPaymentCalenderCourseSettingsList) {
 					OrganizationCourseUnitPriceSettings defaultUnitPrice = organizationCourseUnitPriceSettingsDao.queryByOrganIdAndCourseTypeAndChargeType(
 							musicGroup.getOrganId(), courseSettings.getCourseType(), musicGroup.getChargeTypeId());
@@ -571,9 +571,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						throw new BizException("请先设置分部课程类型单价");
 					}
 					if (courseSettings.getCourseTotalMinuties() != 0) {
-						if (courseSettings.getCourseCurrentPrice()
-								.divide(new BigDecimal(courseSettings.getCourseTotalMinuties()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_DOWN)
-								.compareTo(defaultUnitPrice.getUnitPrice()) != 0) {
+						if (defaultUnitPrice.getUnitPrice().multiply(new BigDecimal(courseSettings.getCourseTotalMinuties()))
+								.compareTo(courseSettings.getCourseCurrentPrice()) != 0) {
+
 							status = AUDITING;
 							break;
 						}
@@ -628,17 +628,17 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties());
 					} else {
 						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().subtract(
-								pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
-										.setScale(2, BigDecimal.ROUND_DOWN)));
+								pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
+										.setScale(0, BigDecimal.ROUND_DOWN)));
 						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().subtract(
-								pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
-										.setScale(2, BigDecimal.ROUND_DOWN)));
+								pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(times - 1))
+										.setScale(0, BigDecimal.ROUND_DOWN)));
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties() - pccs.getCourseTotalMinuties() / times * (times - 1));
 					}
 				} else {
 					if (!pccs.getIsStudentOptional()) {
-						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
-						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 2, BigDecimal.ROUND_DOWN));
+						tempPccs.setCourseCurrentPrice(pccs.getCourseCurrentPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN));
+						tempPccs.setCourseOriginalPrice(pccs.getCourseOriginalPrice().divide(new BigDecimal(times), 0, BigDecimal.ROUND_DOWN));
 						tempPccs.setCourseTotalMinuties(pccs.getCourseTotalMinuties() / times);
 					}
 				}
@@ -965,7 +965,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		for (MusicGroupPaymentCalender calender : musicGroupPaymentCalenders) {
 			//缴费项目添加学员
 			int[] ints = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::parseInt).toArray();
-			List<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toList());
+			Set<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toSet());
 			musicGroupPaymentCalenderDetailService.batchAdd(calender.getId(),list2);
 		}
 		//每种课程类型单独排课
@@ -1103,11 +1103,13 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	}
 
 	//推送待续费通知
-	public void pushWaitRenewMessage(Long calenderId,MusicGroup musicGroup){
-		Set<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentStudentIds(calenderId);
+	public void pushWaitRenewMessage(Long calenderId,MusicGroup musicGroup,Set<Integer> studentIds){
+		if(studentIds == null){
+			studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentStudentIds(calenderId);
+		}
 		if (studentIds.size() > 0) {
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroup.getId();
+			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calenderId+"&id=" + musicGroup.getId();
 			Map<Integer, String> push = new HashMap<>();
 			for (Integer userId : studentIds) {
 				push.put(userId, userId + "");
@@ -1117,7 +1119,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 					null, 0, memo, "STUDENT", musicGroup.getName());
 
 			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId));
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId,studentIds));
 			if(studentMaps.size() > 0){
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
 						null, 0, memo, null, musicGroup.getName());
@@ -1156,8 +1158,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				mgpc.setUpdateTime(date);
 				mgpc.setStatus(PaymentCalenderStatusEnum.OPEN);
 				updateMusicGroupPaymentCalenderList.add(mgpc);
-				//推送待续费通知
-				pushWaitRenewMessage(mgpc.getId(),musicGroup);
+				if(mgpc.getPayUserType() == STUDENT){
+					//推送待续费通知
+					pushWaitRenewMessage(mgpc.getId(),musicGroup,null);
+				}
 			}
 		}
 		if (updateMusicGroupPaymentCalenderList.size() > 0) {
@@ -1180,9 +1184,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void updateStartTime(MusicGroupPaymentCalender paymentCalender) {
-		// if (startTime == null || id == null || endTime == null) {
-		// throw new BizException("参数校验失败");
-		// }
 		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(paymentCalender.getId());
 		if (calender == null) {
 			throw new BizException("缴费信息不存在");
@@ -1191,15 +1192,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			throw new BizException("修改失败,缴费状态不匹配");
 		}
 		Date date = new Date();
-		// 判断缴费开始时间、结束时间是否被其他缴费记录占用
-//		int count = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(calender.getMusicGroupId(), paymentCalender.getStartPaymentDate(),
-//				paymentCalender.getDeadlinePaymentDate(), paymentCalender.getId());
-		// String format = DateUtil.format(startTime, DateUtil.DEFAULT_PATTERN);
-		// String format1 = DateUtil.format(endTime, DateUtil.DEFAULT_PATTERN);
-		// int count = musicGroupPaymentCalenderDao.queryIntersectionByDate(calender.getMusicGroupId(), format,format1);
-		/*if (count > 0) {
-			throw new BizException("缴费时间存在冲突,请修改缴费开始日期");
-		}*/
 		if(paymentCalender.getPaymentType() != ADD_STUDENT){
 			int count = musicGroupPaymentCalenderDao.queryIntersectionByValidDate(paymentCalender.getMusicGroupId(), paymentCalender.getPayUserType(), paymentCalender.getPaymentValidStartDate(),
 					paymentCalender.getPaymentValidEndDate(), paymentCalender.getId());
@@ -1221,19 +1213,19 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			musicGroupStudentFeeDao.updatePaymentStatus(calender.getId(), "NON_PAYMENT");
 			List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryByCalenderId(calender.getId(),null);
 			Set<Integer> studentIds = details.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-			if (studentIds.size() > 0) {
+			if (paymentCalender.getPayUserType() == STUDENT && studentIds.size() > 0) {
 				Map<Integer, String> push = new HashMap<>();
 				for (Integer userId : studentIds) {
 					push.put(userId, userId + "");
 				}
 				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
 				String configValue = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-				String memo = "4?" + configValue + "/#/renew?musicGroupId=" + musicGroup.getId();
+				String memo = "4?" + configValue + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
 				// 发送续费通知
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 						null, 0, memo, "STUDENT", musicGroup.getName());
 				//获取未缴费且不是0元的学员列表
-				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(),studentIds));
 				if(studentMaps.size() > 0){
 					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
 							null, 0, memo, null, musicGroup.getName());
@@ -1255,9 +1247,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		if (calender == null) {
 			throw new BizException("缴费信息不存在");
 		}
-		if(calender.getPaymentType() == MUSIC_APPLY){
-			throw new BizException("报名的缴费记录不能删除");
-		}
 		if (calender.getStatus() != PaymentCalenderStatusEnum.AUDITING && calender.getStatus() != PaymentCalenderStatusEnum.NO
 				&& calender.getStatus() != PaymentCalenderStatusEnum.REJECT) {
 			throw new BizException("删除失败,只有[审核中]、[拒绝]或[未开启缴费]状态才能删除");
@@ -1292,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
@@ -1308,61 +1307,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	}
 
 	@Override
-	public void paymentPush(Long id, String userIds) {
-		// 推送所有
-		if (StringUtils.isEmpty(userIds)) {
-			List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryCanPushList(id);
-			if (details == null || details.size() == 0) {
-				return;
-			}
-			String musicGroupId = details.get(0).getMusicGroupId();
-			Set<Integer> studentIds = details.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-			// 推送消息
-			if (studentIds.size() > 0) {
-				Map<Integer, String> push = new HashMap<>();
-				for (Integer userId : studentIds) {
-					push.put(userId, userId + "");
-				}
-				MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-				String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-				String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
-				// 发送续费通知
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-						null, 0, memo, "STUDENT", musicGroup.getName());
-				//获取未缴费且不是0元的学员列表
-				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(id));
-				if(studentMaps.size() > 0){
-					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
-							null, 0, memo, null, musicGroup.getName());
-				}
-			}
-		} else {
-			// 获取课推送列表
-			// 批量推送
-			MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
-			Set<String> studentIds = new HashSet<>(Arrays.asList(userIds.split(",")));
-			if (studentIds.size() > 0) {
-				Map<Integer, String> push = new HashMap<>();
-				for (String userId : studentIds) {
-					push.put(Integer.parseInt(userId), userId + "");
-				}
-				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-				String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-				String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + calender.getMusicGroupId();
-				// 发送续费通知
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-						null, 0, memo, "STUDENT", musicGroup.getName());
-				//获取未缴费且不是0元的学员列表
-				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(id));
-				if(studentMaps.size() > 0){
-					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
-							null, 0, memo, null, musicGroup.getName());
-				}
-			}
-		}
-	}
-
-	@Override
 	public MusicGroupPaymentCalender findByMusicGroupRegCalender(String musicGroupId) {
 		return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
 	}

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

@@ -350,6 +350,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
                     throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                 }
+                if(musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee() == null){
+                    musicGroupSubjectGoodsGroup.setGroupRemissionCourseFee(0);
+                }
             }
             musicGroupSubjectGoodsGroupDao.batchInsert(musicGroupSubjectGoodsGroups, musicGroupId);
         }
@@ -516,7 +519,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         orderAmount = orderAmount.add(courseFee);
 
         BigDecimal remitFee = BigDecimal.ZERO;
-        BigDecimal courseRemitFee = BigDecimal.ZERO;
+        BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
+        boolean remitCourseRFeeFlag = false; //减免课程费用标识
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -560,8 +564,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
                 });
 
-                Map<String, BigDecimal> coursePurchase = JSONObject.parseObject(goodsGroup.getCoursePurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
-                });
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
                     if (!groupType.containsKey(kitGroupPurchaseType)) {
@@ -569,17 +571,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     }
                     if (!kitGroupPurchaseType.equals("GROUP")) {
                         goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
+                    }else{
+                        remitCourseRFeeFlag  = goodsGroup.getGroupRemissionCourseFee().equals(1);
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                     remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
-                    if (coursePurchase != null) {
-                        courseRemitFee = coursePurchase.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : coursePurchase.get(kitGroupPurchaseType);
-                    }
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
                 goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
             }
-            orderAmount = orderAmount.subtract(remitFee).subtract(courseRemitFee);
+            orderAmount = orderAmount.subtract(remitFee);
         }
 
         //单独辅件
@@ -625,6 +626,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
+                if(remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()){
+                    courseRemitFee = courseRemitFee.add(calenderCourseSetting.getCourseCurrentPrice());
+                    continue;
+                }
                 orderAmount = orderAmount.add(calenderCourseSetting.getCourseCurrentPrice());
             }
         }
@@ -734,7 +739,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         orderAmount = orderAmount.add(courseFee);
 
         BigDecimal remitFee = BigDecimal.ZERO;
-        BigDecimal courseRemitFee = BigDecimal.ZERO;
+        BigDecimal courseRemitFee = BigDecimal.ZERO; //课程减免费用
+        boolean remitCourseRFeeFlag = false; //减免课程费用标识
+
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -777,8 +784,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
                 });
-                Map<String, BigDecimal> coursePurchase = JSONObject.parseObject(goodsGroup.getCoursePurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
-                });
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());
                     if (!groupType.containsKey(kitGroupPurchaseType)) {
@@ -786,12 +791,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     }
                     if (!kitGroupPurchaseType.equals("GROUP")) {
                         goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
+                    }else {
+                        remitCourseRFeeFlag = goodsGroup.getGroupRemissionCourseFee().equals(1);
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                     remitFee = groupType.get(kitGroupPurchaseType);
-                    if (coursePurchase != null) {
-                        courseRemitFee = coursePurchase.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : coursePurchase.get(kitGroupPurchaseType);
-                    }
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
                 goodsGroup.setGoodsList(goodsService.findGoodsByIds(goodsGroup.getGoodsIdList()));
@@ -842,6 +846,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
+                if(remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()){
+                    courseRemitFee = courseRemitFee.add(calenderCourseSetting.getCourseCurrentPrice());
+                    continue;
+                }
                 orderAmount = orderAmount.add(calenderCourseSetting.getCourseCurrentPrice());
             }
         }
@@ -972,6 +980,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                             || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
                         throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                     }
+                    if(musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee()==null){
+                        musicGroupSubjectGoodsGroup.setGroupRemissionCourseFee(0);
+                    }
                 }
 
                 musicGroupSubjectGoodsGroupDao.batchInsert(subFeeSettingDto.getMusicGroupSubjectGoodsGroups(), musicGroupId);
@@ -1567,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);
@@ -1589,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();
 
@@ -1743,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();
 
@@ -1823,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;
     }
 

+ 7 - 49
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java

@@ -1,29 +1,22 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
-import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.service.MusicGroupStudentFeeService;
-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.service.impl.BaseServiceImpl;
-import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
-import com.ym.mec.util.collection.MapUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.*;
 
 @Service
 public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, MusicGroupStudentFee> implements MusicGroupStudentFeeService {
@@ -47,41 +40,6 @@ public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, Music
 
 	@Override
 	public boolean refreshPaymentFeeStatus() {
-
-		int days = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.REFRESH_PAYMENT_STATUS_EARLY_DAYS));
-
-		Date date = new Date();
-
-		List<MusicGroupStudentFee> updateList = new ArrayList<MusicGroupStudentFee>();
-
-		List<MusicGroupStudentFee> musicGroupStudentFeeList = musicGroupStudentFeeDao.queryWillRenewList(days);
-		for (MusicGroupStudentFee musicGroupStudentFee : musicGroupStudentFeeList) {
-			//课程费用为空,或者课程费用为0,只更新下次缴费时间
-			if (musicGroupStudentFee.getPaymentStatus() == PaymentStatus.PAID_COMPLETED &&
-					(musicGroupStudentFee.getCourseFee() != null && musicGroupStudentFee.getCourseFee().doubleValue() > 0)) {
-				musicGroupStudentFee.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-				musicGroupStudentFee.setUpdateTime(date);
-				updateList.add(musicGroupStudentFee);
-			}
-		}
-
-		if (updateList.size() > 0) {
-			musicGroupStudentFeeDao.batchUpdate(updateList);
-			MusicGroup musicGroup = musicGroupDao.get(updateList.get(0).getMusicGroupId());
-			Map<Integer, String> push = new HashMap<>();
-			for (MusicGroupStudentFee sf : updateList) {
-				push.put(sf.getUserId(), sf.getUserId() + "");
-			}
-			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroup.getId();
-			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-					null, 0, memo,"STUDENT",musicGroup.getName());
-		}
-
-		// int i = DateUtil.daysBetween(new Date(), musicGroupStudentFee.getNextPaymentDate());
-		// e.setRenewStatus(i < 8 ? 0 : 1);
-
 		return true;
 	}
 

+ 5 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -150,13 +150,12 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                 throw new BizException("乐团课禁止跨天点名");
             }
         } else {
-            SysConfig beforeAttendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_BEFOR_COURSE_START_TIME_RANGE_VIP);
+            SysConfig beforeAttendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
             int courseStartTime = DateUtil.minutesBetween(date, courseSchedule.getStartClassTime());
             if (date.before(courseSchedule.getStartClassTime()) && courseStartTime > beforeAttendanceTimeRange.getParanValue(Integer.class)) {
                 throw new BizException("VIP课开课前{}分钟禁止点名", beforeAttendanceTimeRange.getParanValue(Integer.class));
             }
             attendanceTimeRange = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
-
             int courseEndTime = DateUtil.minutesBetween(courseSchedule.getEndClassTime(), date);
             if (date.after(courseSchedule.getEndClassTime()) && courseEndTime > attendanceTimeRange.getParanValue(Integer.class)) {
                 throw new BizException("VIP课结束{}分钟后禁止点名",attendanceTimeRange.getParanValue(Integer.class));
@@ -265,6 +264,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
         TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(sysUser.getId().longValue(), courseSchedule.getId());
 
         teacherAttendance.setSignInLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
+        teacherAttendance.setSignOutLongitudeLatitude(studentAttendanceInfos.getSignInLongitudeLatitude());
 
         if (Objects.isNull(teacherAttendance)) {
             teacherAttendance = new TeacherAttendance();
@@ -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);

+ 66 - 33
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,11 +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("用户信息获取失败");
+        }
+        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 {
+            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("用户信息获取失败");
         }
-        return studentManageDao.queryGroupStudents(groupType,sysUser.getId());
+        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/StudentPaymentRouteOrderServiceImpl.java

@@ -262,7 +262,7 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
 
                     BigDecimal hasRouteSellOrderActualAmount = BigDecimal.ZERO;
                     for (SellOrder sellOrder : sellOrderList) {
-                        if (Integer.valueOf(goodsMap.getKey()).equals(sellOrder.getParentGoodsId()) && !Integer.valueOf(goodsMap.getKey()).equals(sellOrder.getGoodsId())) {
+                        if (!Integer.valueOf(goodsMap.getKey()).equals(sellOrder.getParentGoodsId()) && !Integer.valueOf(goodsMap.getKey()).equals(sellOrder.getGoodsId())) {
                             continue;
                         }
                         BigDecimal sellOrderActualAmount = BigDecimal.ZERO;

+ 25 - 7
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());
@@ -350,8 +350,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         ArrayList<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
         StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
         studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(courseFee.subtract(courseRemitFee));
-        studentPaymentOrderDetail.setRemitFee(courseRemitFee);
+        studentPaymentOrderDetail.setPrice(BigDecimal.ZERO);
+        studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
         studentPaymentOrderDetail.setCreateTime(date);
         studentPaymentOrderDetail.setUpdateTime(date);
         studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
@@ -427,6 +427,13 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
                 studentPaymentOrderDetailCourse.setType(OrderDetailTypeEnum.valueOf(newCourse.getCourseType().getCode()));
                 studentPaymentOrderDetailCourse.setPrice(newCourse.getCourseCurrentPrice());
+                if (courseRemitFee.compareTo(BigDecimal.ZERO) > 0 && !newCourse.getIsStudentOptional()) {
+                    studentPaymentOrderDetailCourse.setPrice(BigDecimal.ZERO);
+                    studentPaymentOrderDetailCourse.setRemitFee(newCourse.getCourseCurrentPrice());
+                } else {
+                    studentPaymentOrderDetailCourse.setPrice(newCourse.getCourseCurrentPrice());
+                    studentPaymentOrderDetailCourse.setRemitFee(BigDecimal.ZERO);
+                }
                 studentPaymentOrderDetailCourse.setCreateTime(date);
                 studentPaymentOrderDetailCourse.setUpdateTime(date);
                 studentPaymentOrderDetailCourse.setPaymentOrderId(studentPaymentOrder.getId());
@@ -486,8 +493,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
         StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
         studentPaymentOrderDetail.setType(OrderDetailTypeEnum.COURSE);
-        studentPaymentOrderDetail.setPrice(courseFee.subtract(courseRemitFee));
-        studentPaymentOrderDetail.setRemitFee(courseRemitFee);
+        studentPaymentOrderDetail.setPrice(BigDecimal.ZERO);
+        studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
         studentPaymentOrderDetail.setCreateTime(date);
         studentPaymentOrderDetail.setUpdateTime(date);
         studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
@@ -563,7 +570,13 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             for (MusicGroupPaymentCalenderCourseSettings newCourse : newCourses) {
                 StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
                 studentPaymentOrderDetailCourse.setType(OrderDetailTypeEnum.valueOf(newCourse.getCourseType().getCode()));
-                studentPaymentOrderDetailCourse.setPrice(newCourse.getCourseCurrentPrice());
+                if (courseRemitFee.compareTo(BigDecimal.ZERO) > 0 && !newCourse.getIsStudentOptional()) {
+                    studentPaymentOrderDetailCourse.setPrice(BigDecimal.ZERO);
+                    studentPaymentOrderDetailCourse.setRemitFee(newCourse.getCourseCurrentPrice());
+                } else {
+                    studentPaymentOrderDetailCourse.setPrice(newCourse.getCourseCurrentPrice());
+                    studentPaymentOrderDetailCourse.setRemitFee(BigDecimal.ZERO);
+                }
                 studentPaymentOrderDetailCourse.setCreateTime(date);
                 studentPaymentOrderDetailCourse.setUpdateTime(date);
                 studentPaymentOrderDetailCourse.setPaymentOrderId(studentPaymentOrder.getId());
@@ -1108,6 +1121,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
         List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupRegCalender.getId());
         BigDecimal courseTotalPrice = courseSettings.stream().filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal optionalCourseFee = courseSettings.stream().filter(MusicGroupPaymentCalenderCourseSettings::getIsStudentOptional).filter(e -> orderDetailTypes.contains(e.getCourseType().getCode())).map(MusicGroupPaymentCalenderCourseSettings::getCourseCurrentPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 
         List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
 
@@ -1119,7 +1133,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
             if (currentPaymentCalenderId.longValue() == musicGroupPaymentCalender.getId()) {
                 musicGroupPaymentCalenderDetail.setExpectAmount(courseTotalPrice);
-                musicGroupPaymentCalenderDetail.setActualAmount(courseTotalPrice);
+                if (studentPaymentOrder.getCourseRemitFee() != null && (studentPaymentOrder.getCourseRemitFee().compareTo(BigDecimal.ZERO) > 0)) {
+                    musicGroupPaymentCalenderDetail.setActualAmount(optionalCourseFee);
+                } else {
+                    musicGroupPaymentCalenderDetail.setActualAmount(courseTotalPrice);
+                }
                 musicGroupPaymentCalenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
                 musicGroupPaymentCalenderDetail.setPayTime(nowDate);
                 musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());

+ 326 - 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,320 @@ 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));
+                    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(),
+                                    teacherCourseMapEntry.getKey(),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());
+                Set<Long> courseIds = new HashSet<>();
+                if(StringUtils.isNotBlank(s.getCourseIds())&&s.getActualExercisesNum()>0){
+                    courseIds = Arrays.stream(s.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toSet());
+                }
+                if(StringUtils.isNotBlank(result.getCourseIds())){
+                    courseIds.addAll(Arrays.stream(result.getCourseIds().split(",")).map(id->Long.valueOf(id)).collect(Collectors.toSet()));
+                }
+                s.setServeType(result.getServeType());
+                if(s.getServeType().equals("HOMEWORK")){
+                    s.setCourseIds(StringUtils.join(courseIds, ","));
+                }else{
+                    s.setCourseIds("");
+                }
+                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.getServeType().equals("HOMEWORK")){
+                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.getServeType().equals("EXERCISE")){
+                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 +644,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

+ 24 - 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{
@@ -230,6 +234,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				}
 			}
 
+			if(Objects.isNull(teacherAttendance.getSignInTime())){
+				throw new BizException("未签到不可点名和签退");
+			}
+
 			//正常签退范围(结束后1小时内)
 			teacherAttendance.setSignOutTime(date);
 			teacherAttendance.setSignOutAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
@@ -252,6 +260,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 +286,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 +306,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 +346,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 +369,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 +415,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 +435,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);

+ 21 - 3
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -448,7 +448,7 @@
     </select>
 
     <select id="countClassStudent" resultType="int">
-        select count(*) from class_group_student_mapper
+        select count(*) from class_group_student_mapper cgsm
         where class_group_id_=#{classGroupId} AND cgsm.status_ != 'QUIT'
     </select>
 
@@ -561,7 +561,7 @@
             mg.id_ music_group_id_,
             mg.name_ music_group_name_,
             s.id_ school_id_,
-            CASE WHEN cg.type_ IN ("HIGH_ONLINE","MUSIC_NETWORK") THEN '网络教室' ELSE s.name_ END school_name_
+            CASE WHEN cg.type_ IN ('HIGH_ONLINE','MUSIC_NETWORK') THEN '网络教室' ELSE s.name_ END school_name_
         FROM
             course_schedule_teacher_salary csts
             LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
@@ -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>

+ 57 - 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}
@@ -1736,6 +1700,7 @@
         </foreach>
         )
         AND (cs.del_flag_ IS NULL OR cs.del_flag_=0)
+        AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
     </select>
 
     <select id="findByClassDateWithoutMusicGroup" resultMap="CourseSchedule">
@@ -1860,11 +1825,25 @@
                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>
+
+    <select id="countIsSalaryGroupTypes" resultType="int">
+        SELECT
+            COUNT(DISTINCT csts.group_type_)
+        FROM
+            course_schedule_teacher_salary csts
+                LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
+        WHERE
+            cs.class_date_ BETWEEN #{startDate} AND #{endDate}
+          AND ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+          AND csts.settlement_time_ IS NOT NULL
+        GROUP BY
+            csts.group_type_
+    </select>
+
     <select id="findByClassGroup" resultMap="CourseSchedule">
         select cs.id_,
                cs.class_group_id_,
@@ -3477,4 +3456,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>

+ 29 - 4
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -27,9 +27,11 @@
 		<result column="class_date_" property="courseSchedule.classDate" />
 		<result column="start_class_time_" property="courseSchedule.startClassTime" />
 		<result column="end_class_time_" property="courseSchedule.endClassTime" />
+		<result column="schoole_id_" property="courseSchedule.schoolId" />
 		<result column="reduce_salary" property="reduceSalary" />
 		<result column="confirm_status_" property="confirmStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="memo_" property="memo" />
+		<result column="is_belong_to_daya_" property="belongToDaya" />
 	</resultMap>
 	
 	<resultMap type="com.ym.mec.biz.dal.dto.TeacherVipSalaryDto" id="teacherVipSalaryDto" extends="CourseScheduleTeacherSalary">
@@ -119,6 +121,9 @@
 			<if test="deductionReason != null">
 				deduction_reason_ = #{deductionReason},
 			</if>
+			<if test="belongToDaya != null">
+				is_belong_to_daya_ = #{belongToDaya},
+			</if>
 		</set> WHERE id_ = #{id} 
 	</update>
 
@@ -135,12 +140,15 @@
         <foreach collection="courseScheduleTeacherSalaries" item="courseScheduleTeacherSalary" separator=";">
             UPDATE course_schedule_teacher_salary
             <set>
-                <if test="courseScheduleTeacherSalary.expectSalary">
+                <if test="courseScheduleTeacherSalary.expectSalary!=null">
                     expect_salary_ = #{courseScheduleTeacherSalary.expectSalary},
                 </if>
-                <if test="courseScheduleTeacherSalary.userId">
+                <if test="courseScheduleTeacherSalary.userId!=null">
                     user_id_ = #{courseScheduleTeacherSalary.userId},
                 </if>
+				<if test="courseScheduleTeacherSalary.belongToDaya!=null">
+					is_belong_to_daya_ = #{courseScheduleTeacherSalary.belongToDaya},
+				</if>
                 update_time_ = NOW()
             </set>
             WHERE
@@ -270,6 +278,7 @@
 			CONCAT(cs.class_date_	,' ',cs.start_class_time_) start_class_time_,
 			CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) end_class_time_,
 			cs.teach_mode_,
+		    cs.schoole_id_,
 			csts.*
 		FROM
 		course_schedule_teacher_salary csts
@@ -300,6 +309,7 @@
 		cs.class_date_,
 		CONCAT(cs.class_date_	,' ',cs.start_class_time_) start_class_time_,
 		CONCAT( cs.class_date_, ' ', cs.end_class_time_ ) end_class_time_,
+		cs.schoole_id_,
 		csts.*
 		FROM
 		course_schedule_teacher_salary csts
@@ -359,8 +369,8 @@
 	</select>
 	<select id="findCourseSubsidyByCourses" resultType="map">
 		SELECT
-			cs.id_,
-			s.subsidy_
+			cs.id_ AS 'key',
+			s.subsidy_ AS 'value'
 		FROM
 			course_schedule cs
 			LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -836,6 +846,9 @@
 			<if test="search!=null">
 				AND (csts.course_schedule_id_=#{search} OR cs.name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
+			<if test="belongDaya!=null">
+				AND csts.is_belong_to_daya_ = #{belongDaya}
+			</if>
 		</where>
 	</sql>
 
@@ -1011,4 +1024,16 @@
 		</if>
 		GROUP BY course_schedule_id_
 	</select>
+
+	<select id="getIsSalaryWithDate" resultMap="CourseScheduleTeacherSalary">
+		SELECT
+			csts.*
+		FROM
+			course_schedule_teacher_salary csts
+			LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_
+		WHERE
+			cs.class_date_ BETWEEN #{startDate} AND #{endDate}
+		  AND ( cs.del_flag_ IS NULL OR cs.del_flag_ = 0 )
+		  AND csts.settlement_time_ IS NOT NULL
+	</select>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml

@@ -387,6 +387,12 @@
 		SELECT mgpcd.user_id_ 'key',su.phone_ 'value' FROM music_group_payment_calender_detail mgpcd
 		LEFT JOIN sys_user su ON su.id_ = mgpcd.user_id_
 		WHERE music_group_payment_calender_id_ = #{calenderId} AND expect_amount_ != 0 AND payment_status_ = 'NON_PAYMENT'
+		<if test="studentIds != null">
+			AND mgpcd.user_id_ IN
+			<foreach collection="studentIds" separator="," close=")" open="(" item="item">
+				#{item}
+			</foreach>
+		</if>
     </select>
 
 	<update id="updateNoPaymentAndZeroPaymentStatus">

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

@@ -320,6 +320,7 @@
         WHERE music_group_id_ = #{musicGroupId}
         AND (payment_valid_end_date_ IS NULL OR payment_valid_start_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate}
         OR payment_valid_end_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate}) AND payment_valid_start_date_ IS NOT NULL
+        AND mgpc.payment_type_ != 'ADD_STUDENT' AND mgpc.batch_no_ IS NOT NULL
         <if test="payUserType != null">
         	and pay_user_type_ = #{payUserType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
@@ -460,7 +461,7 @@
     <select id="queryAuditList" resultMap="MusicGroupPaymentCalenderAuditDtoMap">
         SELECT mgpc.batch_no_,MAX(mgpc.music_group_id_) music_group_id_
         ,MAX(mgpc.create_time_) create_time_,MAX(mgpc.payment_type_) payment_type_,MAX(mgpc.operator_) operator_,
-        MAX(mgpc.pay_user_type_) pay_user_type_,MAX(mgpc.memo_) memo_,MAX(mgpc.status_) status_,
+        MAX(mgpc.pay_user_type_) pay_user_type_,MAX(mgpc.memo_) memo_,MAX(mgpc.audit_memo_) audit_memo_,MAX(mgpc.status_) status_,
         SUM(mgpccs.course_total_minuties_) course_total_minuties_,
         SUM(mgpccs.course_original_price_) course_original_price_,SUM(mgpccs.course_current_price_) course_current_price_,
         MAX(mg.name_) music_group_name_,MAX(mg.organ_id_) organ_id_,MAX(mgpc.payment_pattern_)payment_pattern_

+ 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>

+ 3 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupSubjectGoodsGroupMapper.xml

@@ -17,6 +17,7 @@
         <result column="price_" property="price"/>
         <result column="deposit_fee_" property="depositFee"/>
         <result column="remission_course_fee_" property="remissionCourseFee"/>
+        <result column="group_remission_course_fee_" property="groupRemissionCourseFee"/>
         <result column="kit_group_purchase_type_json_" property="kitGroupPurchaseTypeJson"/>
         <result column="course_purchase_type_json_" property="coursePurchaseTypeJson"/>
     </resultMap>
@@ -45,10 +46,10 @@
 
     <insert id="batchInsert" parameterType="java.util.List">
         INSERT INTO music_group_subject_goods_group
-        (name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,kit_group_purchase_type_json_,course_purchase_type_json_) VALUES
+        (name_,type_,music_group_id_,subject_id_,goods_id_list_,create_time_,update_time_,price_,deposit_fee_,remission_course_fee_,group_remission_course_fee_,kit_group_purchase_type_json_,course_purchase_type_json_) VALUES
         <foreach collection="lists" item="item" index="index" separator=",">
             (#{item.name},#{item.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{musicGroupId},#{item.subjectId},#{item.goodsIdList},now(),now(),#{item.price},#{item.depositFee},#{item.remissionCourseFee},#{item.kitGroupPurchaseTypeJson},#{item.coursePurchaseTypeJson})
+            #{musicGroupId},#{item.subjectId},#{item.goodsIdList},now(),now(),#{item.price},#{item.depositFee},#{item.remissionCourseFee},#{item.groupRemissionCourseFee},#{item.kitGroupPurchaseTypeJson},#{item.coursePurchaseTypeJson})
         </foreach>
     </insert>
 

+ 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>
     

+ 209 - 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,35 @@
 
 	<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_,
+		sees.serve_type_,
+		sees.course_ids_,
+		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 +250,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 +338,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 +414,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 +437,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>

+ 49 - 14
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -813,24 +813,59 @@
 		GROUP BY cssp.`user_id_`
     </select>
 
-    <select id="queryGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
-        <if test="groupType = 'PRACTICE'">
-            practice_group pg
-        </if>
-        <if test="groupType = 'VIP'">
-            vip_group pg
+    <select id="queryVipGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
+        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_ = #{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_ 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_ = #{groupType} AND cgsm.status_ != 'QUIT'
-        AND pg.educational_teacher_id_ = #{userId}
-        <if test="groupType = 'PRACTICE'">
-            AND pg.group_status_ NOT IN ('FINISH','CANCEL')
-        </if>
-        <if test="groupType = 'VIP'">
-            AND pg.group_status_ IN (0,1,2,5)
+        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>
         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=")">

+ 16 - 12
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -338,15 +338,17 @@
         	<if test="auditStatus != null">
         		and spro.audit_status_ = #{auditStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
-        	<if test="type != null and type != ''">
-        		and
-        		<if test="type == 'SERVICE'">
-        			(spro.service_amount_ is not null and spro.service_amount_ &gt; 0)
-        		</if>
-        		<if test="type == 'SELL'">
-        			(spro.sale_amount_ is not null and spro.sale_amount_ &gt; 0)
-        		</if>
-        	</if>
+            <if test="type != null and type != ''">
+                <if test="type == 'SERVICE'">
+                    and (spro.service_amount_ is not null and spro.service_amount_ &gt; 0)
+                </if>
+                <if test="type == 'SELL'">
+                    and (spro.sale_amount_ is not null and spro.sale_amount_ &gt; 0)
+                </if>
+            </if>
+            <if test="noneTqType != null">
+                and spro.mer_no_ != '淘气微信'
+            </if>
         </where>
 		order by spro.id_ desc
 	</select>
@@ -368,14 +370,16 @@
         		and spro.audit_status_ = #{auditStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         	</if>
         	<if test="type != null and type != ''">
-        		and
         		<if test="type == 'SERVICE'">
-        			(spro.service_amount_ is not null and spro.service_amount_ &gt; 0)
+                    and (spro.service_amount_ is not null and spro.service_amount_ &gt; 0)
         		</if>
         		<if test="type == 'SELL'">
-        			(spro.sale_amount_ is not null and spro.sale_amount_ &gt; 0)
+                    and (spro.sale_amount_ is not null and spro.sale_amount_ &gt; 0)
         		</if>
         	</if>
+            <if test="noneTqType != null">
+                and spro.mer_no_ != '淘气微信'
+            </if>
         </where>
 		order by spro.id_ desc
 		<include refid="global.limit" />

+ 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;

+ 22 - 6
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -186,22 +186,22 @@ public class MusicGroupController extends BaseController {
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }
-        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId,userId);
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(calenderId, userId);
         if (calenderDetail == null) {
             throw new BizException("缴费项不存在该学员,请联系教务老师");
         }
-        if(calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED){
+        if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
             throw new BizException("您已缴费,请勿重复提交");
-        }else if(calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING){
+        } else if (calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING) {
             throw new BizException("存在待处理的订单,请稍候尝试");
         }
         //缴费项目已开启或者单独开启
         Map renew;
-        if(calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1){
+        if (calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1) {
             renew = musicGroupService.renew(calenderId, userId, isUseBalancePayment);
-        }else if(calender.getStatus() == PaymentCalenderStatusEnum.OVER){
+        } else if (calender.getStatus() == PaymentCalenderStatusEnum.OVER) {
             throw new BizException("缴费已截止,如有问题请联系指导老师");
-        }else {
+        } else {
             throw new BizException("缴费暂未开始,如有问题请联系指导老师");
         }
         if (renew.containsKey("tradeState")) {
@@ -217,6 +217,22 @@ public class MusicGroupController extends BaseController {
         return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId));
     }
 
+    @ApiOperation(value = "查询是否有待支付的报名订单")
+    @GetMapping("/checkWaitPayApplyOrder")
+    @ApiImplicitParams({@ApiImplicitParam(name = "registerId", value = "注册id", required = true, dataType = "int")})
+    public HttpResponseResult<StudentPaymentOrder> checkWaitPayApplyOrder(Long registerId) throws Exception {
+
+        StudentRegistration studentRegistration = studentRegistrationService.get(registerId);
+        if (studentRegistration == null) {
+            return failed("报名信息有误,请核查");
+        }
+        Integer userId = studentRegistration.getUserId();
+
+        //判断用户是否已存在订单
+        StudentPaymentOrder applyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
+        return succeed(applyOrder);
+    }
+
     @ApiOperation(value = "乐团报名支付")
     @PostMapping("/pay")
     @ApiImplicitParams({@ApiImplicitParam(name = "registerPayDto", value = "支付信息", required = true, dataType = "RegisterPayDto")})

+ 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')")

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff