Kaynağa Gözat

Merge branch 'online1' into music_group_feature_03_29

周箭河 4 yıl önce
ebeveyn
işleme
2f7ca0da89
61 değiştirilmiş dosya ile 2028 ekleme ve 372 silme
  1. 8 5
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java
  2. 0 41
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/AccessTokenService.java
  3. 415 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/CustomTokenServices.java
  4. 30 2
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java
  5. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  6. 14 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  7. 5 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PracticeGroupDao.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDefaultPracticeGroupSalaryDao.java
  9. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java
  10. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicArrearageStudentDto.java
  11. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeDto.java
  12. 25 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ApprovalStatus.java
  13. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  14. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderDetail.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRepair.java
  16. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java
  17. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexErrorType.java
  18. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ArrearageStudentsQueryInfo.java
  19. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQuitQueryInfo.java
  20. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysExamSongQueryInfo.java
  21. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  22. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  23. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  24. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  25. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  26. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  27. 115 99
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  28. 95 73
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  29. 31 28
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  30. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  31. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  32. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  33. 59 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  34. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  35. 470 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  36. 3 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  37. 12 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  38. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  39. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  40. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherSalaryModifyLogServiceImpl.java
  41. 16 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  42. 2 2
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  43. 16 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  44. 45 1
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  45. 2 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  46. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  47. 12 2
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  48. 2 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  49. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  50. 19 2
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml
  51. 1 0
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  52. 8 0
      mec-biz/src/main/resources/config/mybatis/TeacherDefaultPracticeGroupSalaryMapper.xml
  53. 1 1
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  54. 55 13
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  55. 185 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  56. 2 1
      mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  57. 16 10
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupQuitController.java
  58. 7 0
      mec-web/src/main/java/com/ym/mec/web/controller/OrganizationController.java
  59. 100 14
      mec-web/src/main/java/com/ym/mec/web/controller/StudentRepairController.java
  60. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherSalaryComplaintsController.java
  61. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduPracticeGroupController.java

+ 8 - 5
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java

@@ -1,9 +1,11 @@
 package com.ym.mec.auth.config;
 
-import com.ym.mec.common.constant.CommonConstants;
+import javax.sql.DataSource;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
@@ -12,10 +14,10 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.E
 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
 import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
-import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
 import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
 
-import javax.sql.DataSource;
+import com.ym.mec.auth.core.service.CustomTokenServices;
+import com.ym.mec.common.constant.CommonConstants;
 
 /**
  * 授权服务器配置
@@ -68,8 +70,9 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
 	}
 
 	@Bean
-	public DefaultTokenServices defaultTokenServices() {
-		DefaultTokenServices tokenServices = new DefaultTokenServices();
+	@Primary
+	public CustomTokenServices defaultTokenServices() {
+		CustomTokenServices tokenServices = new CustomTokenServices();
 		tokenServices.setTokenStore(redisTokenStore());
 		tokenServices.setSupportRefreshToken(true);
 		//tokenServices.setAccessTokenValiditySeconds(60 * 60 * 24); // token有效期自定义设置,默认12小时

+ 0 - 41
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/AccessTokenService.java

@@ -1,41 +0,0 @@
-package com.ym.mec.auth.core.service;
-
-import java.util.HashMap;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
-import org.springframework.security.oauth2.provider.ClientDetails;
-import org.springframework.security.oauth2.provider.ClientDetailsService;
-import org.springframework.security.oauth2.provider.OAuth2Authentication;
-import org.springframework.security.oauth2.provider.OAuth2Request;
-import org.springframework.security.oauth2.provider.TokenRequest;
-import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
-import org.springframework.stereotype.Service;
-
-@Service
-public class AccessTokenService {
-
-	@Autowired
-	private ClientDetailsService clientDetailsService;
-
-	@Autowired
-	private AuthorizationServerTokenServices defaultAuthorizationServerTokenServices;
-
-	public OAuth2AccessToken getAccessToken(String clientId, String clientSecret, Authentication authentication) {
-
-		if (clientId == null || clientSecret == null) {
-			throw new UnapprovedClientAuthenticationException("请求头中client信息为空");
-		}
-
-		ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
-		TokenRequest tokenRequest = new TokenRequest(new HashMap<String, String>(), clientId, clientDetails.getScope(), "password");
-		OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
-
-		OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
-		OAuth2AccessToken oAuth2AccessToken = defaultAuthorizationServerTokenServices.createAccessToken(oAuth2Authentication);
-
-		return oAuth2AccessToken;
-	}
-}

+ 415 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/CustomTokenServices.java

@@ -0,0 +1,415 @@
+package com.ym.mec.auth.core.service;
+
+import java.util.Date;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken;
+import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
+import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken;
+import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.common.OAuth2RefreshToken;
+import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
+import org.springframework.security.oauth2.common.exceptions.InvalidScopeException;
+import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
+import org.springframework.security.oauth2.provider.ClientDetails;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.security.oauth2.provider.ClientRegistrationException;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.OAuth2Request;
+import org.springframework.security.oauth2.provider.TokenRequest;
+import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
+import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
+import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices;
+import org.springframework.security.oauth2.provider.token.TokenEnhancer;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+/**
+ * Base implementation for token services using random UUID values for the access token and refresh token values. The
+ * main extension point for customizations is the {@link TokenEnhancer} which will be called after the access and
+ * refresh tokens have been generated but before they are stored.
+ * <p>
+ * Persistence is delegated to a {@code TokenStore} implementation and customization of the access token to a
+ * {@link TokenEnhancer}.
+ * 
+ * @author Ryan Heaton
+ * @author Luke Taylor
+ * @author Dave Syer
+ */
+public class CustomTokenServices implements AuthorizationServerTokenServices, ResourceServerTokenServices,
+		ConsumerTokenServices, InitializingBean {
+
+	private int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; // default 30 days.
+
+	private int accessTokenValiditySeconds = 60 * 60 * 12; // default 12 hours.
+
+	private boolean supportRefreshToken = false;
+
+	private boolean reuseRefreshToken = true;
+
+	private TokenStore tokenStore;
+
+	private ClientDetailsService clientDetailsService;
+
+	private TokenEnhancer accessTokenEnhancer;
+
+	private AuthenticationManager authenticationManager;
+
+	/**
+	 * Initialize these token services. If no random generator is set, one will be created.
+	 */
+	public void afterPropertiesSet() throws Exception {
+		Assert.notNull(tokenStore, "tokenStore must be set");
+	}
+
+	@Transactional
+	public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
+
+		OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication);
+		OAuth2RefreshToken refreshToken = null;
+		if (existingAccessToken != null) {
+			if (existingAccessToken.getRefreshToken() != null) {
+				refreshToken = existingAccessToken.getRefreshToken();
+				// The token store could remove the refresh token when the
+				// access token is removed, but we want to
+				// be sure...
+				tokenStore.removeRefreshToken(refreshToken);
+			}
+			tokenStore.removeAccessToken(existingAccessToken);
+		}
+
+		// Only create a new refresh token if there wasn't an existing one
+		// associated with an expired access token.
+		// Clients might be holding existing refresh tokens, so we re-use it in
+		// the case that the old access token
+		// expired.
+		if (refreshToken == null) {
+			refreshToken = createRefreshToken(authentication);
+		}
+		// But the refresh token itself might need to be re-issued if it has
+		// expired.
+		else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
+			ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken;
+			if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {
+				refreshToken = createRefreshToken(authentication);
+			}
+		}
+
+		OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);
+		tokenStore.storeAccessToken(accessToken, authentication);
+		// In case it was modified
+		refreshToken = accessToken.getRefreshToken();
+		if (refreshToken != null) {
+			tokenStore.storeRefreshToken(refreshToken, authentication);
+		}
+		return accessToken;
+
+	}
+
+	@Transactional(noRollbackFor={InvalidTokenException.class, InvalidGrantException.class})
+	public OAuth2AccessToken refreshAccessToken(String refreshTokenValue, TokenRequest tokenRequest)
+			throws AuthenticationException {
+
+		if (!supportRefreshToken) {
+			throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue);
+		}
+
+		OAuth2RefreshToken refreshToken = tokenStore.readRefreshToken(refreshTokenValue);
+		if (refreshToken == null) {
+			throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue);
+		}
+
+		OAuth2Authentication authentication = tokenStore.readAuthenticationForRefreshToken(refreshToken);
+		if (this.authenticationManager != null && !authentication.isClientOnly()) {
+			// The client has already been authenticated, but the user authentication might be old now, so give it a
+			// chance to re-authenticate.
+			Authentication user = new PreAuthenticatedAuthenticationToken(authentication.getUserAuthentication(), "", authentication.getAuthorities());
+			user = authenticationManager.authenticate(user);
+			Object details = authentication.getDetails();
+			authentication = new OAuth2Authentication(authentication.getOAuth2Request(), user);
+			authentication.setDetails(details);
+		}
+		String clientId = authentication.getOAuth2Request().getClientId();
+		if (clientId == null || !clientId.equals(tokenRequest.getClientId())) {
+			throw new InvalidGrantException("Wrong client for this refresh token: " + refreshTokenValue);
+		}
+
+		// clear out any access tokens already associated with the refresh
+		// token.
+		tokenStore.removeAccessTokenUsingRefreshToken(refreshToken);
+
+		if (isExpired(refreshToken)) {
+			tokenStore.removeRefreshToken(refreshToken);
+			throw new InvalidTokenException("Invalid refresh token (expired): " + refreshToken);
+		}
+
+		authentication = createRefreshedAuthentication(authentication, tokenRequest);
+
+		if (!reuseRefreshToken) {
+			tokenStore.removeRefreshToken(refreshToken);
+			refreshToken = createRefreshToken(authentication);
+		}
+
+		OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);
+		tokenStore.storeAccessToken(accessToken, authentication);
+		if (!reuseRefreshToken) {
+			tokenStore.storeRefreshToken(accessToken.getRefreshToken(), authentication);
+		}
+		return accessToken;
+	}
+
+	public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {
+		return tokenStore.getAccessToken(authentication);
+	}
+
+	/**
+	 * Create a refreshed authentication.
+	 * 
+	 * @param authentication The authentication.
+	 * @param request The scope for the refreshed token.
+	 * @return The refreshed authentication.
+	 * @throws InvalidScopeException If the scope requested is invalid or wider than the original scope.
+	 */
+	private OAuth2Authentication createRefreshedAuthentication(OAuth2Authentication authentication, TokenRequest request) {
+		OAuth2Authentication narrowed = authentication;
+		Set<String> scope = request.getScope();
+		OAuth2Request clientAuth = authentication.getOAuth2Request().refresh(request);
+		if (scope != null && !scope.isEmpty()) {
+			Set<String> originalScope = clientAuth.getScope();
+			if (originalScope == null || !originalScope.containsAll(scope)) {
+				throw new InvalidScopeException("Unable to narrow the scope of the client authentication to " + scope
+						+ ".", originalScope);
+			}
+			else {
+				clientAuth = clientAuth.narrowScope(scope);
+			}
+		}
+		narrowed = new OAuth2Authentication(clientAuth, authentication.getUserAuthentication());
+		return narrowed;
+	}
+
+	protected boolean isExpired(OAuth2RefreshToken refreshToken) {
+		if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
+			ExpiringOAuth2RefreshToken expiringToken = (ExpiringOAuth2RefreshToken) refreshToken;
+			return expiringToken.getExpiration() == null
+					|| System.currentTimeMillis() > expiringToken.getExpiration().getTime();
+		}
+		return false;
+	}
+
+	public OAuth2AccessToken readAccessToken(String accessToken) {
+		return tokenStore.readAccessToken(accessToken);
+	}
+
+	public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException,
+			InvalidTokenException {
+		OAuth2AccessToken accessToken = tokenStore.readAccessToken(accessTokenValue);
+		if (accessToken == null) {
+			throw new InvalidTokenException("Invalid access token: " + accessTokenValue);
+		}
+		else if (accessToken.isExpired()) {
+			tokenStore.removeAccessToken(accessToken);
+			throw new InvalidTokenException("Access token expired: " + accessTokenValue);
+		}
+
+		OAuth2Authentication result = tokenStore.readAuthentication(accessToken);
+		if (result == null) {
+			// in case of race condition
+			throw new InvalidTokenException("Invalid access token: " + accessTokenValue);
+		}
+		if (clientDetailsService != null) {
+			String clientId = result.getOAuth2Request().getClientId();
+			try {
+				clientDetailsService.loadClientByClientId(clientId);
+			}
+			catch (ClientRegistrationException e) {
+				throw new InvalidTokenException("Client not valid: " + clientId, e);
+			}
+		}
+		return result;
+	}
+
+	public String getClientId(String tokenValue) {
+		OAuth2Authentication authentication = tokenStore.readAuthentication(tokenValue);
+		if (authentication == null) {
+			throw new InvalidTokenException("Invalid access token: " + tokenValue);
+		}
+		OAuth2Request clientAuth = authentication.getOAuth2Request();
+		if (clientAuth == null) {
+			throw new InvalidTokenException("Invalid access token (no client id): " + tokenValue);
+		}
+		return clientAuth.getClientId();
+	}
+
+	public boolean revokeToken(String tokenValue) {
+		OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue);
+		if (accessToken == null) {
+			return false;
+		}
+		if (accessToken.getRefreshToken() != null) {
+			tokenStore.removeRefreshToken(accessToken.getRefreshToken());
+		}
+		tokenStore.removeAccessToken(accessToken);
+		return true;
+	}
+
+	private OAuth2RefreshToken createRefreshToken(OAuth2Authentication authentication) {
+		if (!isSupportRefreshToken(authentication.getOAuth2Request())) {
+			return null;
+		}
+		int validitySeconds = getRefreshTokenValiditySeconds(authentication.getOAuth2Request());
+		String value = UUID.randomUUID().toString();
+		if (validitySeconds > 0) {
+			return new DefaultExpiringOAuth2RefreshToken(value, new Date(System.currentTimeMillis()
+					+ (validitySeconds * 1000L)));
+		}
+		return new DefaultOAuth2RefreshToken(value);
+	}
+
+	private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
+		DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
+		int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());
+		if (validitySeconds > 0) {
+			token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));
+		}
+		token.setRefreshToken(refreshToken);
+		token.setScope(authentication.getOAuth2Request().getScope());
+
+		return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;
+	}
+
+	/**
+	 * The access token validity period in seconds
+	 * 
+	 * @param clientAuth the current authorization request
+	 * @return the access token validity period in seconds
+	 */
+	protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
+		if (clientDetailsService != null) {
+			ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+			Integer validity = client.getAccessTokenValiditySeconds();
+			if (validity != null) {
+				return validity;
+			}
+		}
+		return accessTokenValiditySeconds;
+	}
+
+	/**
+	 * The refresh token validity period in seconds
+	 * 
+	 * @param clientAuth the current authorization request
+	 * @return the refresh token validity period in seconds
+	 */
+	protected int getRefreshTokenValiditySeconds(OAuth2Request clientAuth) {
+		if (clientDetailsService != null) {
+			ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+			Integer validity = client.getRefreshTokenValiditySeconds();
+			if (validity != null) {
+				return validity;
+			}
+		}
+		return refreshTokenValiditySeconds;
+	}
+
+	/**
+	 * Is a refresh token supported for this client (or the global setting if
+	 * {@link #setClientDetailsService(ClientDetailsService) clientDetailsService} is not set.
+	 * 
+	 * @param clientAuth the current authorization request
+	 * @return boolean to indicate if refresh token is supported
+	 */
+	protected boolean isSupportRefreshToken(OAuth2Request clientAuth) {
+		if (clientDetailsService != null) {
+			ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+			return client.getAuthorizedGrantTypes().contains("refresh_token");
+		}
+		return this.supportRefreshToken;
+	}
+
+	/**
+	 * An access token enhancer that will be applied to a new token before it is saved in the token store.
+	 * 
+	 * @param accessTokenEnhancer the access token enhancer to set
+	 */
+	public void setTokenEnhancer(TokenEnhancer accessTokenEnhancer) {
+		this.accessTokenEnhancer = accessTokenEnhancer;
+	}
+
+	/**
+	 * The validity (in seconds) of the refresh token. If less than or equal to zero then the tokens will be
+	 * non-expiring.
+	 * 
+	 * @param refreshTokenValiditySeconds The validity (in seconds) of the refresh token.
+	 */
+	public void setRefreshTokenValiditySeconds(int refreshTokenValiditySeconds) {
+		this.refreshTokenValiditySeconds = refreshTokenValiditySeconds;
+	}
+
+	/**
+	 * The default validity (in seconds) of the access token. Zero or negative for non-expiring tokens. If a client
+	 * details service is set the validity period will be read from the client, defaulting to this value if not defined
+	 * by the client.
+	 * 
+	 * @param accessTokenValiditySeconds The validity (in seconds) of the access token.
+	 */
+	public void setAccessTokenValiditySeconds(int accessTokenValiditySeconds) {
+		this.accessTokenValiditySeconds = accessTokenValiditySeconds;
+	}
+
+	/**
+	 * Whether to support the refresh token.
+	 * 
+	 * @param supportRefreshToken Whether to support the refresh token.
+	 */
+	public void setSupportRefreshToken(boolean supportRefreshToken) {
+		this.supportRefreshToken = supportRefreshToken;
+	}
+
+	/**
+	 * Whether to reuse refresh tokens (until expired).
+	 * 
+	 * @param reuseRefreshToken Whether to reuse refresh tokens (until expired).
+	 */
+	public void setReuseRefreshToken(boolean reuseRefreshToken) {
+		this.reuseRefreshToken = reuseRefreshToken;
+	}
+
+	/**
+	 * The persistence strategy for token storage.
+	 * 
+	 * @param tokenStore the store for access and refresh tokens.
+	 */
+	public void setTokenStore(TokenStore tokenStore) {
+		this.tokenStore = tokenStore;
+	}
+
+	/**
+	 * An authentication manager that will be used (if provided) to check the user authentication when a token is
+	 * refreshed.
+	 * 
+	 * @param authenticationManager the authenticationManager to set
+	 */
+	public void setAuthenticationManager(AuthenticationManager authenticationManager) {
+		this.authenticationManager = authenticationManager;
+	}
+
+	/**
+	 * The client details service to use for looking up clients (if necessary). Optional if the access token expiry is
+	 * set globally via {@link #setAccessTokenValiditySeconds(int)}.
+	 * 
+	 * @param clientDetailsService the client details service
+	 */
+	public void setClientDetailsService(ClientDetailsService clientDetailsService) {
+		this.clientDetailsService = clientDetailsService;
+	}
+
+}

+ 30 - 2
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java

@@ -18,10 +18,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
+import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices;
 import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
@@ -33,6 +34,7 @@ import org.springframework.web.client.RestTemplate;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.core.service.CustomTokenServices;
 import com.ym.mec.auth.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -48,7 +50,10 @@ import com.ym.mec.im.ImFeignService;
 public class TokenController extends BaseController {
 
 	@Autowired
-	private DefaultTokenServices tokenService;
+	private CustomTokenServices tokenService;
+	
+	@Autowired
+	private ResourceServerTokenServices resourceServerTokenServices;
 	
 	@Autowired
 	private TokenStore tokenStore;
@@ -176,4 +181,27 @@ public class TokenController extends BaseController {
 		return succeed("退出成功");
 	}
 
+	@GetMapping(value = "/checkToken",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	@ApiOperation(value = "检查token")
+	public HttpResponseResult<Object> checkToken(HttpServletRequest request) throws IOException {
+
+		String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
+		if (StringUtils.isBlank(authHeader)) {
+			return failed(HttpStatus.FORBIDDEN, "token 为空");
+		}
+
+		String tokenValue = authHeader.toLowerCase().replace(OAuth2AccessToken.BEARER_TYPE.toLowerCase(), StringUtils.EMPTY).trim();
+
+		OAuth2AccessToken accessToken = resourceServerTokenServices.readAccessToken(tokenValue);
+		if (accessToken == null) {
+			return failed(HttpStatus.FORBIDDEN, "token 无效");
+		}
+
+		if (accessToken.isExpired()) {
+			return failed(HttpStatus.FORBIDDEN, "token 已过期");
+		}
+
+		return succeed();
+	}
+
 }

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

@@ -811,4 +811,11 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @return
      */
     List<ClassGroupTeachersDto> queryClassGroupPage(Map<String, Object> params);
+
+    /**
+     * 获取教务老师关联的班级列表
+     * @param userId
+     * @return
+     */
+    List<Long> queryGroupClassGroupIds(Integer userId);
 }

+ 14 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -144,35 +144,42 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                                 @Param("groupType")GroupType groupType,
                                                 @Param("courseStatus") CourseStatusEnum courseStatus);
 
-    int countLessThenThreeClassGroupNum(@Param("organIds") Set<Integer> organIds);
+    int countLessThenThreeClassGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
     List<String> getLessThenThreeMusicGroup(@Param("organIds") Set<Integer> organIds);
 
     int queryErrInspection(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime);
 
-    IndexErrInfoDto getNoClassMusicGroupStudentInfo(@Param("organIds") Set<Integer> organIds);
+    IndexErrInfoDto getNoClassMusicGroupStudentInfo(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
-    int countNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds);
-    List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds);
+    int countNoPaymentStudentNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
+    List<String> getNoPaymentMusicGroup(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
-    List<Long> queryApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds);
+    List<Long> queryApplyForQuitGroupNum(@Param("organIds") Set<Integer> organIds, @Param("educationUserId") Integer educationUserId);
 
     int queryStudentAttendanceInfo(@Param("organIds") Set<Integer> organIds,
                                           @Param("type") String type, @Param("startTime") String startTime);
 
 
     /**
+     * 课程时间安排异常
+     * @param organIds
+     * @return
+     */
+    int getCourseTimeError(@Param("organIds") Set<Integer> organIds, @Param("classGroupIds") List<Long> classGroupIds);
+
+    /**
      * 获取考勤异常编号
      * @param organIds
      * @return
      */
-    int getAttendanceError(@Param("organIds") Set<Integer> organIds,@Param("startTime") String startTime);
+    int getAttendanceError(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
 
     /**
      * 获取旷课考勤
      * @param organIds
      * @return
      */
-    int getNoAttendance(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime);
+    int getNoAttendance(@Param("organIds") Set<Integer> organIds, @Param("startTime") String startTime, @Param("classGroupIds") List<Long> classGroupIds);
 
     /**
      * 获取老师离职申请数

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.biz.dal.enums.GroupStatusEnum;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.security.core.parameters.P;
 
@@ -136,7 +137,8 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
      * @author Joburgess
      * @date 2020/2/18
      */
-    List<PracticeCourseDto> findUserBuyPracticeGroups(@Param("userId") Integer userId);
+    List<PracticeCourseDto> findUserBuyPracticeGroups(@Param("userId") Integer userId,
+                                                      @Param("type") PracticeGroupType type);
 
 
     List<PracticeCourseDto> findUserBuyPracticeGroupsWithDate(@Param("userId") Integer userId,
@@ -167,7 +169,8 @@ public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, Pr
      * @date 2020/2/26
      */
     List<PracticeGroup> findUserStatusPracticeGroups(@Param("userId") Integer userId,
-                                                     @Param("groupStatus") GroupStatusEnum groupStatusEnum);
+                                                     @Param("groupStatus") GroupStatusEnum groupStatusEnum,
+                                                     @Param("groupType")PracticeGroupType groupType);
 
     /**
      * @param userId:

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

@@ -31,6 +31,8 @@ public interface TeacherDefaultPracticeGroupSalaryDao extends BaseDAO<Long, Teac
      */
     TeacherDefaultPracticeGroupSalary findByTeacherAndCourseMinutes(@Param("userId")Integer userId,
 																	@Param("minutes") Integer minutes);
+	List<TeacherDefaultPracticeGroupSalary> findByTeachersAndCourseMinutes(@Param("teacherIds")List<Integer> teacherIds,
+																	@Param("minutes") Integer minutes);
 
 
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
+import java.util.List;
 
 public class CourseTimeDto {
 
@@ -35,6 +37,17 @@ public class CourseTimeDto {
     @ApiModelProperty(value = "是否跳过节假日 true-跳过 false-不跳过", required = true)
     private Boolean isHoliday = false;
 
+    @ApiModelProperty(value = "老师设置", required = true)
+    private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+    public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+        return classGroupTeacherMapperList;
+    }
+
+    public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+        this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+    }
+
     public Boolean getHoliday() {
         return isHoliday;
     }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicArrearageStudentDto.java

@@ -1,5 +1,8 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import io.swagger.annotations.ApiModelProperty;
+
 import java.math.BigDecimal;
 
 /**
@@ -32,6 +35,17 @@ public class MusicArrearageStudentDto {
 
     private BigDecimal noPaymentAmount;
 
+    @ApiModelProperty(value = "缴费类型", required = false)
+    private MusicGroupPaymentCalender.PaymentType paymentType;
+
+    public MusicGroupPaymentCalender.PaymentType getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(MusicGroupPaymentCalender.PaymentType paymentType) {
+        this.paymentType = paymentType;
+    }
+
     public Integer getUserId() {
         return userId;
     }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherServeDto.java

@@ -1,5 +1,8 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.enums.JobNatureEnum;
+import io.swagger.annotations.ApiModelProperty;
+
 import java.util.Date;
 
 /**
@@ -16,6 +19,8 @@ public class TeacherServeDto {
 
     private String teacherName;
 
+    private String dateRange;
+
     private String organName;
 
     private int homeworkNum;
@@ -28,6 +33,17 @@ public class TeacherServeDto {
 
     private String operatorName;
 
+    @ApiModelProperty(value = "工作性质(兼职 PART_JOB、全职FULL_JOB)", required = false)
+    private JobNatureEnum jobNature;
+
+    public JobNatureEnum getJobNature() {
+        return jobNature;
+    }
+
+    public void setJobNature(JobNatureEnum jobNature) {
+        this.jobNature = jobNature;
+    }
+
     public Integer getTeacherId() {
         return teacherId;
     }
@@ -107,4 +123,12 @@ public class TeacherServeDto {
     public void setSunday(Date sunday) {
         this.sunday = sunday;
     }
+
+    public String getDateRange() {
+        return dateRange;
+    }
+
+    public void setDateRange(String dateRange) {
+        this.dateRange = dateRange;
+    }
 }

+ 25 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ApprovalStatus.java

@@ -3,7 +3,31 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum ApprovalStatus implements BaseEnum<String, ApprovalStatus> {
-	APPROVED, DENIED, PROCESSING, CANCELED;
+	APPROVED("APPROVED", "同意"),
+	DENIED("DENIED", "拒绝"),
+	PROCESSING("PROCESSING", "处理中"),
+	CANCELED("CANCELED", "取消");
+
+	private String code;
+
+	private String msg;
+
+	ApprovalStatus(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
 
 	@Override
 	public String getCode() {

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -114,6 +114,8 @@ public class CourseSchedule {
 	@ApiModelProperty(value = "助教编号列表(用于记录调整日志)")
 	private String teachingTeacherIds;
 
+	private String teachingTeacherNames;
+
 	/**  */
 	private java.util.Date createTime;
 
@@ -147,7 +149,7 @@ public class CourseSchedule {
 
 	private java.util.Date coursesExpireDate;
 
-	private Integer isLock;
+	private Integer isLock = 0;
 
 	private Integer organId;
 	
@@ -171,6 +173,14 @@ public class CourseSchedule {
 
 	private int isSignOut = 3;
 
+	public String getTeachingTeacherNames() {
+		return teachingTeacherNames;
+	}
+
+	public void setTeachingTeacherNames(String teachingTeacherNames) {
+		this.teachingTeacherNames = teachingTeacherNames;
+	}
+
 	public String getTeachingTeacherIds() {
 		return teachingTeacherIds;
 	}

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

@@ -31,6 +31,8 @@ public class MusicGroupPaymentCalenderDetail {
 	
 	/**  */
 	private PaymentStatus paymentStatus;
+
+	private MusicGroupPaymentCalender.PaymentType paymentType;
 	
 	/**  */
 	private String userStatus;
@@ -78,6 +80,14 @@ public class MusicGroupPaymentCalenderDetail {
 	
 	private SysUser responsible = new SysUser();
 
+	public MusicGroupPaymentCalender.PaymentType getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(MusicGroupPaymentCalender.PaymentType paymentType) {
+		this.paymentType = paymentType;
+	}
+
 	public Date getStartPaymentDateMgpc() {
 		return startPaymentDateMgpc;
 	}

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

@@ -214,6 +214,9 @@ public class StudentRepair {
     @ApiModelProperty(value = "更新时间", required = false)
     private Date updateTime;
 
+    @ApiModelProperty(value = "辅件金额", required = false)
+    private BigDecimal repairGoodsAmount = BigDecimal.ZERO;
+
     public String getGoodsJson() {
         return goodsJson;
     }
@@ -498,4 +501,12 @@ public class StudentRepair {
     public void setRepairImg(String repairImg) {
         this.repairImg = repairImg;
     }
+
+    public BigDecimal getRepairGoodsAmount() {
+        return repairGoodsAmount;
+    }
+
+    public void setRepairGoodsAmount(BigDecimal repairGoodsAmount) {
+        this.repairGoodsAmount = repairGoodsAmount;
+    }
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScoreAccompaniment.java

@@ -52,6 +52,27 @@ public class SysMusicScoreAccompaniment {
 	/**  */
 	private java.util.Date updateTime;
 
+	//是否显示指法
+	private Boolean isShowFingering = true;
+
+	private String memo;
+
+	public Boolean getIsShowFingering() {
+		return isShowFingering;
+	}
+
+	public void setIsShowFingering(Boolean showFingering) {
+		isShowFingering = showFingering;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
 	public Integer getCategoriesId() {
 		return categoriesId;
 	}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexErrorType.java

@@ -21,6 +21,8 @@ public enum IndexErrorType implements BaseEnum<String, IndexErrorType> {
     COURSE_LEAVE_STUDENT_NUM("COURSE_LEAVE_STUDENT_NUM", "学员请假"),
 
     TEACHER_INFO("TEACHER_INFO", "日常行政"),
+
+    COURSE_TIME_ERROR("COURSE_TIME_ERROR", "课程时间安排异常"),
     TEACHER_LEAVE("TEACHER_LEAVE", "老师请假"),
     TEACHER_EXPECT_SALARY_BE_LOW("TEACHER_EXPECT_SALARY_BE_LOW", "预计课酬较低"),
     INSPECTION_ITEM("INSPECTION_ITEM", "乐团巡查任务未计划"),

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ArrearageStudentsQueryInfo.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author Joburgess

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQuitQueryInfo.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.entity.ApprovalStatus;
 import com.ym.mec.common.page.QueryInfo;
 
 public class MusicGroupQuitQueryInfo extends QueryInfo {
@@ -9,6 +10,26 @@ public class MusicGroupQuitQueryInfo extends QueryInfo {
 
     private Boolean visitFlag;
 
+    private ApprovalStatus status;
+
+    private Integer educationUserId;
+
+    public Integer getEducationUserId() {
+        return educationUserId;
+    }
+
+    public void setEducationUserId(Integer educationUserId) {
+        this.educationUserId = educationUserId;
+    }
+
+    public ApprovalStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ApprovalStatus status) {
+        this.status = status;
+    }
+
     public Boolean getVisitFlag() {
         return visitFlag;
     }

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

@@ -21,6 +21,16 @@ public class SysExamSongQueryInfo extends QueryInfo {
 
     private Integer parentId;
 
+    private Boolean isShowFingering;
+
+    public Boolean getIsShowFingering() {
+        return isShowFingering;
+    }
+
+    public void setIsShowFingering(Boolean showFingering) {
+        isShowFingering = showFingering;
+    }
+
     public Integer getParentId() {
         return parentId;
     }

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

@@ -175,11 +175,12 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     PageInfo<StudentPayInfoDto> queryStudentPayLog(StudentPayLogQueryInfo studentPayLogQueryInfo);
 
     /**
-     * 班级添加学生
+     * 班级添加学生-弃用
      * @param classGroup
      * @param userId
      * @return
      */
+    @Deprecated
     ClassGroup addStudent(ClassGroup classGroup, Integer userId, GroupType groupType);
     
     /**

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

@@ -50,12 +50,13 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
     boolean adjustClassGroup(Integer userId,Integer oldClassGroupId,Integer classGroupId) throws Exception;
 
     /**
-     * 添加学员
+     * 添加学员-弃用
      * @param classGroupId
      * @param userIdsStr
      * @return
      * @throws Exception
      */
+    @Deprecated
     boolean addStudents(Integer classGroupId, String userIdsStr, GroupType groupType) throws Exception;
 
     /**

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

@@ -93,4 +93,6 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findAllByRole(String roleIds,String organIds);
+
+    List<Integer> queryUserRole(Integer sysUserId);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -59,4 +59,12 @@ public interface ImGroupService extends BaseService<Long, ImGroup> {
 	 * @return
 	 */
     int updateNickName(Integer userId, String nickName);
+
+	/**
+	 * 修改用户在群、通讯录的备注
+	 * @param userId
+	 * @param nickName
+	 * @return
+	 */
+	void updateNickName1(Integer userId, String nickName);
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java

@@ -25,6 +25,12 @@ public interface OrganizationService extends BaseService<Integer, Organization>
     List<Organization> queryEmployeeOrgan() throws Exception;
 
     /**
+     * 获取员工坐在分部列表
+     * @return
+     */
+    List<Organization> queryEmployeeOrganByUser() throws Exception;
+
+    /**
      * 获取分部名称
      * @return
      */

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.page.PracticeGroupQueryInfo;
 import com.ym.mec.biz.dal.page.StudentBuyPracticeQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
@@ -193,6 +194,16 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
      */
     HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
 
+	/**
+	 * @describe 创建关心包课程
+	 * @author Joburgess
+	 * @date 2021/1/28 0028
+	 * @param practiceGroupBuyParams:
+	 * @param operatorInfo:
+	 * @return com.ym.mec.common.entity.HttpResponseResult
+	 */
+	HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
+
     /**
      * @describe 支付订单回调
      * @author Joburgess
@@ -209,7 +220,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	 * @param userId:
 	 * @return java.util.List<com.ym.mec.biz.dal.dto.PracticeCourseDto>
 	 */
-	List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId, Long groupId);
+	List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId, Long groupId, PracticeGroupType type);
 
 	/**
 	 * @describe 查询订单信息

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

@@ -21,6 +21,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -160,6 +161,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
     @Autowired
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -1317,29 +1320,35 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //4、调整未上课课酬
         if (allNotStartCourses.size() > 0) {
             Date nowDate = new Date();
-            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+//            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
             List<Long> courseScheduleIds = allNotStartCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+            List<CourseScheduleTeacherSalary> oldCourseSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
             courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
-            for (CourseSchedule courseSchedule : allNotStartCourses) {
-                if(!ctm.containsKey(courseSchedule.getClassGroupId())){
-                    continue;
-                }
-                List<ClassGroupTeacherMapper> classGroupTeachers = ctm.get(courseSchedule.getClassGroupId());
-                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
-                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
-                    courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
-                    courseScheduleTeacherSalary.setCreateTime(nowDate);
-                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
-                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, courseSchedule, courseScheduleTeacherSalary);
-                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-                }
+            Map<Long, CourseSchedule> idCourseMap = allNotStartCourses.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+            for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
+                oldCourseSalary.setId(null);
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
-            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+//            for (CourseSchedule courseSchedule : allNotStartCourses) {
+//                if(!ctm.containsKey(courseSchedule.getClassGroupId())){
+//                    continue;
+//                }
+//                List<ClassGroupTeacherMapper> classGroupTeachers = ctm.get(courseSchedule.getClassGroupId());
+//                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+//                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+//                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+//                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+//                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+//                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
+//                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
+//                    courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+//                    courseScheduleTeacherSalary.setCreateTime(nowDate);
+//                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
+//                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, courseSchedule, courseScheduleTeacherSalary);
+//                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+//                }
+//            }
+            courseScheduleTeacherSalaryService.batchInsert(oldCourseSalaries);
         }
 
         return true;
@@ -2277,6 +2286,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (classGroup == null) {
             throw new BizException("班级不存在");
         }
+        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Boolean confirmGenerate = false;
         if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
@@ -2288,35 +2298,29 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             teachMode = TeachModeEnum.ONLINE;
         }
 
-        List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
-        List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
-        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-        if (musicGroup.getStatus() == PROGRESS) {
-            if (byClassGroup != null && byClassGroup.size() > 0) {
-                ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
-                if (groupTeacherMapper != null) {
-                    imGroupMemberService.quit(classGroupId.longValue(), groupTeacherMapper.getUserId());
+        //1、更新班级关联老师信息
+        if (Objects.nonNull(classGroup4MixDtos.get(0).getCourseAddType()) && classGroup4MixDtos.get(0).getCourseAddType().equals("onlyUpdateTeacher")) {
+            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
+            List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
+            if(musicGroup.getStatus() == PROGRESS){
+                if (byClassGroup != null && byClassGroup.size() > 0) {
+                    ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
+                    if (groupTeacherMapper != null) {
+                        imGroupMemberService.quit(classGroupId.longValue(), groupTeacherMapper.getUserId());
+                    }
+                }
+                if (newTeacherMapperList.size() > 0) {
+                    //获取之前的班级老师
+                    Set<Integer> groupTeacher = classGroupDao.findGroupTeacher(classGroupId);
+                    groupTeacher.forEach(e -> {
+                        imGroupMemberService.quit(classGroupId.longValue(), e);
+                    });
+                    newTeacherMapperList.forEach(e -> {
+                        imGroupMemberService.join(classGroupId.longValue(), e.getUserId(), "指导老师", false);
+                    });
                 }
             }
-            if (newTeacherMapperList.size() > 0) {
-                //获取之前的班级老师
-                Set<Integer> groupTeacher = classGroupDao.findGroupTeacher(classGroupId);
-                groupTeacher.forEach(e -> {
-                    imGroupMemberService.quit(classGroupId.longValue(), e);
-                });
-                newTeacherMapperList.forEach(e -> {
-                    imGroupMemberService.join(classGroupId.longValue(), e.getUserId(), "指导老师", false);
-                });
-            }
-        }
-        //1、更新班级关联老师信息
-        List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
 
-        Set<Integer> noRepeatTeacherIds = newClassGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
-        if (noRepeatTeacherIds.size() != newClassGroupTeacherMapperList.size()) {
-            throw new BizException("主教与助教存在冲突");
-        }
-        if (Objects.nonNull(classGroup4MixDtos.get(0).getCourseAddType()) && classGroup4MixDtos.get(0).getCourseAddType().equals("onlyUpdateTeacher")) {
             List<Integer> classGroupIds = new ArrayList<>();
             classGroupIds.add(classGroupId);
             // 删除历史记录
@@ -2345,30 +2349,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
 
-        Integer teacherId = null;
-        for (ClassGroupTeacherMapper groupTeacherMapper : newClassGroupTeacherMapperList) {
-            groupTeacherMapper.setGroupType(classGroup.getGroupType());
-            groupTeacherMapper.setClassGroupId(classGroup.getId());
-            groupTeacherMapper.setMusicGroupId(classGroup4MixDtos.get(0).getMusicGroupId());
-            if (groupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP)) {
-                teacherId = groupTeacherMapper.getUserId();
-            }
-        }
-
-        Set<String> newTeacher = newClassGroupTeacherMapperList.stream().map(
-                classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId()
-        ).collect(Collectors.toSet());
-
-        List<ClassGroupTeacherMapper> oldClassGroupTeacherMapperList = classGroupTeacherMapperDao.findClassGroupTeachers(classGroup.getId().toString());
-
-        Set<String> oldTeacher = oldClassGroupTeacherMapperList.stream().map(
-                classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole().getCode() + classGroupTeacherMapper.getUserId()
-        ).collect(Collectors.toSet());
-
-        if (oldTeacher.size() != newTeacher.size() || !newTeacher.containsAll(oldTeacher)) {
-            classGroupTeacherMapperService.classGroupTeachersInsert(newClassGroupTeacherMapperList);
-        }
-
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
         //2、获取班级学生
@@ -2408,10 +2388,37 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
             }
 
+            Set<Integer> allTeacherIds = new HashSet<>();
+            List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
+            if(!confirmGenerate){
+                for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+                    List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+                    Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
+                    if(!CollectionUtils.isEmpty(teacherIds)){
+                        allTeacherIds.addAll(teacherIds);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                    allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
+                }
+            }
+
             WhileNode:
             while (true) {
                 int dayOfWeek = now.getDayOfWeek().getValue();
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
+                    List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+
+                    Set<Integer> noRepeatTeacherIds = newClassGroupTeacherMapperList.stream().map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (noRepeatTeacherIds.size() != newClassGroupTeacherMapperList.size()) {
+                        throw new BizException("主教与助教存在冲突");
+                    }
+
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if(Objects.isNull(teacherId)){
+                        throw new BizException("请设置主教");
+                    }
+
                     if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
                         throw new BizException("排课循环周期错误,请核查");
                     }
@@ -2476,11 +2483,15 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseSchedule.setTeachMode(teachMode);
                     courseSchedule.setMusicGroupId(classGroup.getMusicGroupId());
                     courseSchedule.setType(classGroup4MixDto.getCourseType());
-                    if (!StringUtils.isBlank(classGroup.getName())) {
+
+                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MIX)) {
+                        courseSchedule.setName(classGroup4MixDto.getCourseType().getMsg());
+                    } else if (classGroup4MixDto.getCourseType().equals(CourseScheduleType.MUSIC_NETWORK)) {
                         courseSchedule.setName(classGroup.getName());
                     } else {
                         courseSchedule.setName(subjectNames + "-" + classGroup4MixDto.getCourseType().getMsg());
                     }
+
                     courseSchedule.setGroupType(MUSIC);
                     courseSchedule.setTeacherId(teacherId);
                     courseSchedule.setActualTeacherId(teacherId);
@@ -2489,6 +2500,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
 
+                    if(!confirmGenerate){
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                        SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
+                        if(Objects.nonNull(mainTeacher)){
+                            courseSchedule.setActualTeacherName(mainTeacher.getUserName());
+                        }
+                        List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
+                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                            courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
+                        }
+                    }
+
                     for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
                         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                         courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -2858,10 +2881,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         PageInfo<MusicGroupCourseScheduleDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-        List<MusicGroupCourseScheduleDto> dataList = null;
+        List<MusicGroupCourseScheduleDto> dataList = new ArrayList<>();
         int count = classGroupDao.countMusicGroupCourseScheduleDetail(params);
-        if (count > 0) {
-            pageInfo.setTotal(count);
+        pageInfo.setTotal(count);
+
+        if (queryInfo.getPage() <= pageInfo.getTotalPage()) {
             params.put("offset", pageInfo.getOffset());
             dataList = classGroupDao.queryMusicGroupCourseScheduleDetail(params);
             //获取当前合奏班班级编号列表
@@ -2928,9 +2952,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }*/
             }
         }
-        if (count == 0) {
-            dataList = new ArrayList<>();
-        }
         pageInfo.setRows(dataList);
         return pageInfo;
     }
@@ -3054,16 +3075,23 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         params.put("groupType", queryInfo.getGroupType().getCode());
 
         List<ClassGroupTeachersDto> dataList = null;
-        int count = classGroupDao.countClassGroup(params);
-
+        int count;
         if (Objects.nonNull(queryInfo.getLessThenThreeHighOnline())) {
             List<Long> lessThenThreeClassGroupIds = classGroupStudentMapperDao.getLessThenThreeClassGroupIds(queryInfo.getOrganIdList());
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+            //如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+            if (userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+                params.put("educationUserId", sysUser.getId());
+            }
             params.put("classGroupIds", lessThenThreeClassGroupIds);
             if (CollectionUtils.isEmpty(lessThenThreeClassGroupIds)) {
                 count = 0;
             } else {
                 count = classGroupDao.countClassGroup(params);
             }
+        }else {
+            count = classGroupDao.countClassGroup(params);
         }
 
         if (count > 0) {
@@ -3905,15 +3933,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 if (aLong != null && aLong > 0) {
                     List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroup.getId());
                     if (courseScheduleList.size() > 0) {
-                        //调整未上课课酬
-                        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroup.getId());
-                        Date nowDate = new Date();
                         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
                         for (CourseSchedule courseSchedule : courseScheduleList) {
                             if (courseSchedule.getType() == CourseScheduleType.HIGH_ONLINE || courseSchedule.getType() == CourseScheduleType.HIGH) {
-                                courseScheduleTeacherSalaryDao.batchDeleteByCourseAndTeacher(courseSchedule.getId(), null);
-                                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), null, null);
+                                List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseSchedule.getId());
+                                for (CourseScheduleTeacherSalary teacherSalary : courseScheduleTeacherSalaries) {
+                                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(teacherSalary.getUserId(), null, null);
                                     if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
                                         throw new BizException("请设置老师线上网管课课酬");
                                     }
@@ -3932,9 +3957,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                         if (Objects.isNull(teacherDefaultMusicGroupSalaryHigh)) {
                                             throw new BizException("请设置老师课酬");
                                         }
-                                        salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher30MinSalary();
+                                        salary = TeachTypeEnum.BISHOP.equals(teacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher30MinSalary();
                                         if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                                            salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher90MinSalary();
+                                            salary = TeachTypeEnum.BISHOP.equals(teacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher90MinSalary();
                                         }
                                         if (Objects.isNull(salary)) {
                                             throw new BizException("请设置老师课酬");
@@ -3944,22 +3969,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                     if (Objects.isNull(salary)) {
                                         throw new BizException("请设置老师课酬");
                                     }
-                                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-                                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-                                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-                                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-                                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
-                                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
-                                    courseScheduleTeacherSalary.setExpectSalary(salary);
-                                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-                                    courseScheduleTeacherSalary.setCreateTime(nowDate);
-                                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
-                                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+                                    teacherSalary.setExpectSalary(salary);
+                                    courseScheduleTeacherSalaryList.add(teacherSalary);
                                 }
                             }
                         }
                         if (courseScheduleTeacherSalaryList.size() > 0) {
-                            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+                            courseScheduleTeacherSalaryDao.batchUpdate(courseScheduleTeacherSalaryList);
                         }
                     }
                 }

+ 95 - 73
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -158,67 +158,79 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         }
 
         //4、调整未上课课酬
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
-        if ((classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.HIGH)) && courseScheduleList.size() > 0) {
-            studentNum -= 1;
-            Date nowDate = new Date();
-            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(courseScheduleList)){
             List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
-            for (CourseSchedule courseSchedule : courseScheduleList) {
-                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), null, null);
-                    if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
-                        throw new BizException("请设置老师线上网管课课酬");
-                    }
-                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
 
-                    if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && studentNum > 5) {
-                        studentNum = 5;
-                    }
-
-                    BigDecimal salary = null;
-                    if(classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)){
-                        if(studentNum>0){
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum + "");
-                        }else{
-                            salary = new BigDecimal("0");
-                        }
-                    }else if(classGroup.getType().equals(ClassGroupTypeEnum.HIGH)){
-                        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-                        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryHigh = collect.get(CourseSchedule.CourseScheduleType.HIGH);
-                        if(Objects.isNull(teacherDefaultMusicGroupSalaryHigh)){
-                            throw new BizException("请设置老师课酬");
-                        }
-                        salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher30MinSalary();
-                        if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                            salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher90MinSalary();
-                        }
-                        if(Objects.isNull(salary)){
-                            throw new BizException("请设置老师课酬");
-                        }
-                        salary = salary.multiply(new BigDecimal(studentNum));
-                    }
-                    if(Objects.isNull(salary)){
-                        throw new BizException("请设置老师课酬");
-                    }
+            List<CourseScheduleTeacherSalary> oldCourseSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
 
-                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
-                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
-                    courseScheduleTeacherSalary.setExpectSalary(salary);
-                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-                    courseScheduleTeacherSalary.setCreateTime(nowDate);
-                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
-                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-                }
+            Map<Long, CourseSchedule> idCourseMap = courseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+            for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
-            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
-        }
+            courseScheduleTeacherSalaryDao.batchUpdate(oldCourseSalaries);
+        }
+
+//        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId);
+//        if ((classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) || classGroup.getType().equals(ClassGroupTypeEnum.HIGH)) && courseScheduleList.size() > 0) {
+//            studentNum -= 1;
+//            Date nowDate = new Date();
+//            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+//            List<Long> courseScheduleIds = courseScheduleList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+//            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+//            for (CourseSchedule courseSchedule : courseScheduleList) {
+//                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+//                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacher.getUserId(), null, null);
+//                    if (teacherSalaryList == null || teacherSalaryList.size() == 0) {
+//                        throw new BizException("请设置老师线上网管课课酬");
+//                    }
+//                    Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+//                    TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
+//
+//                    if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) && studentNum > 5) {
+//                        studentNum = 5;
+//                    }
+//
+//                    BigDecimal salary = null;
+//                    if(classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE)){
+//                        if(studentNum>0){
+//                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum + "");
+//                        }else{
+//                            salary = new BigDecimal("0");
+//                        }
+//                    }else if(classGroup.getType().equals(ClassGroupTypeEnum.HIGH)){
+//                        MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
+//                        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryHigh = collect.get(CourseSchedule.CourseScheduleType.HIGH);
+//                        if(Objects.isNull(teacherDefaultMusicGroupSalaryHigh)){
+//                            throw new BizException("请设置老师课酬");
+//                        }
+//                        salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher30MinSalary();
+//                        if (musicGroup.getSettlementType().equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+//                            salary = TeachTypeEnum.BISHOP.equals(classGroupTeacher.getTeacherRole()) ? teacherDefaultMusicGroupSalaryHigh.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryHigh.getAssistantTeacher90MinSalary();
+//                        }
+//                        if(Objects.isNull(salary)){
+//                            throw new BizException("请设置老师课酬");
+//                        }
+//                        salary = salary.multiply(new BigDecimal(studentNum));
+//                    }
+//                    if(Objects.isNull(salary)){
+//                        throw new BizException("请设置老师课酬");
+//                    }
+//
+//                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+//                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+//                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+//                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+//                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
+//                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
+//                    courseScheduleTeacherSalary.setExpectSalary(salary);
+//                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+//                    courseScheduleTeacherSalary.setCreateTime(nowDate);
+//                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
+//                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+//                }
+//            }
+//            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+//        }
 
         //5、学生退出班级群组
         imGroupMemberService.quit(classGroup.getId().longValue(), userId);
@@ -591,25 +603,35 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         if(!CollectionUtils.isEmpty(classGroupNotStartCourse)){
             List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroupId.intValue());
             Date nowDate = new Date();
-            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+//            List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
             List<Long> courseScheduleIds = classGroupNotStartCourse.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+
+            List<CourseScheduleTeacherSalary> oldCourseSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+
             courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
-            for (CourseSchedule courseSchedule : classGroupNotStartCourse) {
-                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
-                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
-                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
-                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
-                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
-                    courseScheduleTeacherSalary.setCreateTime(nowDate);
-                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
-                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
-                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
-                }
+
+            Map<Long, CourseSchedule> idCourseMap = classGroupNotStartCourse.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+            for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
+                oldCourseSalary.setId(null);
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
             }
-            courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
+
+//            for (CourseSchedule courseSchedule : classGroupNotStartCourse) {
+//                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+//                    CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+//                    courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+//                    courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+//                    courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+//                    courseScheduleTeacherSalary.setTeacherRole(classGroupTeacher.getTeacherRole());
+//                    courseScheduleTeacherSalary.setUserId(classGroupTeacher.getUserId());
+//                    courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+//                    courseScheduleTeacherSalary.setCreateTime(nowDate);
+//                    courseScheduleTeacherSalary.setUpdateTime(nowDate);
+//                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+//                    courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+//                }
+//            }
+            courseScheduleTeacherSalaryService.batchInsert(oldCourseSalaries);
         }
 
         if(musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS){

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

@@ -28,6 +28,7 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
@@ -52,32 +53,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
-import com.ym.mec.biz.dal.dao.ClassGroupTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleComplaintsDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleEvaluateDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleModifyLogDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleReviewDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.CoursesGroupDao;
-import com.ym.mec.biz.dal.dao.CoursesGroupModifyLogDao;
-import com.ym.mec.biz.dal.dao.GroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.PracticeGroupDao;
-import com.ym.mec.biz.dal.dao.SchoolDao;
-import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dao.TeacherDefaultMusicGroupSalaryDao;
-import com.ym.mec.biz.dal.dao.TeacherDefaultPracticeGroupSalaryDao;
-import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao;
-import com.ym.mec.biz.dal.dao.VipGroupDao;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
@@ -214,6 +189,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private CourseEventSource courseEventSource;
     @Autowired
 	private StudentServeService studentServeService;
+    @Autowired
+	private EmployeeDao employeeDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -663,8 +640,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							if(practiceGroup == null){
 								throw new BizException("课程组不存在");
 							}else if (FREE.equals(practiceGroup.getType())){
-								SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
-								BigDecimal teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+								BigDecimal salary = teacherPracticeSalaryMap.get(cgtm.getUserId());
+								if (salary == null) {
+									throw new BizException("请设置老师网管课课酬");
+								}
+								BigDecimal teacherSalary = BigDecimal.ZERO;
+								if(salary.compareTo(new BigDecimal(0))>0){
+									SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+									teacherSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+								}
 								courseScheduleTeacherSalary.setExpectSalary(teacherSalary);
 							}else if (practiceGroup.getType() == TRIAL){
 								courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(0));
@@ -1137,6 +1121,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 teacherIds.add(courseScheduleEndDto.getActualTeacherId());
             }
 
+			List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedules(allCourseScheduleIds);
+            Map<Long, Set<Integer>> courseTeachingTeacherIdsMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+				courseTeachingTeacherIdsMap = courseScheduleTeacherSalaries.stream().filter(c->TeachTypeEnum.TEACHING.equals(c.getTeacherRole())).collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId, Collectors.mapping(CourseScheduleTeacherSalary::getUserId, Collectors.toSet())));
+			}
+
 			List<Integer> classGroupIds = dataList.stream().map(CourseScheduleDto::getClassGroupId).collect(Collectors.toList());
 			List<Group> groupsT = groupDao.findByClassGroupIds(classGroupIds);
             Map<Integer, Group> idGroupMap = groupsT.stream().collect(Collectors.toMap(Group::getClassGroupId, group -> group));
@@ -1155,6 +1145,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					dataList.get(i).setLeaveStudentNum((int) courseStudentAttendances.stream().filter(s->StudentAttendanceStatusEnum.LEAVE.equals(s.getStatus())).count());
 					dataList.get(i).setStudentNum((int) courseStudentAttendances.stream().filter(s->StudentAttendanceStatusEnum.NORMAL.equals(s.getStatus())).count());
 				}
+                if(courseTeachingTeacherIdsMap.containsKey(dataList.get(i).getId())){
+                	dataList.get(i).setTeachingTeacherIds(StringUtils.join(courseTeachingTeacherIdsMap.get(dataList.get(i).getId()), ","));
+				}
             }
         }
         if (count == 0) {
@@ -4442,6 +4435,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         MapUtil.populateMap(params, queryInfo);
 
         List<CourseScheduleEndDto> results = new ArrayList<>();
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+			if(classGroupIds.size() == 0){
+				return pageInfo;
+			}
+			params.put("classGroupIds",classGroupIds);
+		}
         int count = courseScheduleDao.endCountCourseSchedules(params);
         if(queryInfo.getIsExport() && count > 50000){
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");

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

@@ -498,8 +498,6 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         }
     }
 
-
-
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo) {

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

@@ -366,4 +366,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	public List<SimpleUserDto> findAllByRole(String roleIds, String organIds) {
 		return employeeDao.findAllByRole(roleIds,organIds);
 	}
+
+	@Override
+	public List<Integer> queryUserRole(Integer sysUserId) {
+		return employeeDao.queryUserRole(sysUserId);
+	}
 }

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

@@ -135,4 +135,22 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 		return i;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateNickName1(Integer userId, String nickName) {
+		//修改群成员备注
+		imGroupDao.updateNickname(userId, nickName);
+		imGroupDao.updateUserFriendNickname(userId, nickName);
+		//修改sysUser名称,如果包含学员的角色,那么修改userName。否则修改realName
+		SysUser sysUser = sysUserFeignService.queryUserById(userId);
+		if(sysUser.getUserType().contains("STUDENT")){
+			sysUser.setUsername(nickName);
+		}else {
+			sysUser.setRealName(nickName);
+		}
+		sysUserFeignService.updateSysUser(sysUser);
+		//同步融云基本信息
+		imFeignService.update(new ImUserModel(sysUser.getId().toString(),nickName,sysUser.getAvatar()));
+	}
+
 }

+ 59 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -57,6 +57,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 	@Autowired
 	private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
+	@Autowired
+	private ClassGroupDao classGroupDao;
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
 		@Override
@@ -292,6 +294,16 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		Date date = new Date();
 
 		List<IndexErrInfoDto> all = new ArrayList<>();
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		List<Long> classGroupIds = null;
+		Integer educationUserId = null;
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			//获取教务老师关联的班级列表
+			classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+			educationUserId = sysUser.getId();
+		}
 
 		if(IndexErrorType.MUSIC_PATROL.equals(errorType)){
 			IndexErrInfoDto<IndexErrInfoDto> one = new IndexErrInfoDto<>();
@@ -299,11 +311,11 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			one.setDesc(IndexErrorType.MUSIC_PATROL.getMsg());
 			List<IndexErrInfoDto> oneChild = new ArrayList<>();
 
-			oneChild.add(new IndexErrInfoDto(IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE, IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE.getMsg(), indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIds), null));
+			oneChild.add(new IndexErrInfoDto(IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE, IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE.getMsg(), indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIds,educationUserId), null));
 			int errInspection = indexBaseMonthDataDao.queryErrInspection(organIds,startTime);
 			oneChild.add(new IndexErrInfoDto(IndexErrorType.MUSIC_PATROL_ITEM, IndexErrorType.MUSIC_PATROL_ITEM.getMsg(),errInspection, null));
 
-			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds);
+			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds,educationUserId);
 			noClassMusicGroupStudentInfo.setDesc(IndexErrorType.NO_CLASS_MUSIC_GROUP_STUDENT_INFO.getMsg());
 			oneChild.add(noClassMusicGroupStudentInfo);
 
@@ -319,8 +331,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			two.setDesc(IndexErrorType.STUDENT_INFO.getMsg());
 			List<IndexErrInfoDto> twoChild = new ArrayList<>();
 
-			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_NOT_PAYMENT, IndexErrorType.STUDENT_NOT_PAYMENT.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIds), indexBaseMonthDataDao.getNoPaymentMusicGroup(organIds)));
-			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds);
+			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_NOT_PAYMENT, IndexErrorType.STUDENT_NOT_PAYMENT.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIds,educationUserId), Arrays.asList(educationUserId)));
+			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds,educationUserId);
 			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP, IndexErrorType.STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP.getMsg(), quitGroupNum.size(),  quitGroupNum));
 //			int attendanceInfo = indexBaseMonthDataDao.queryStudentAttendanceInfo(organIds, StudentAttendanceStatusEnum.TRUANT.getCode(),startTime);
 //			twoChild.add(new IndexErrInfoDto(IndexErrorType.COURSE_TRUANT_STUDENT_NUM, IndexErrorType.COURSE_TRUANT_STUDENT_NUM.getMsg(), attendanceInfo, null));
@@ -345,12 +357,16 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			int lowTeacherSalary = indexBaseMonthDataDao.queryLowTeacherSalary(organIdsStr,monthStr);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXPECT_SALARY_BE_LOW, IndexErrorType.TEACHER_EXPECT_SALARY_BE_LOW.getMsg(),lowTeacherSalary, null));
 
-			SysUser sysUser = sysUserFeignService.queryUserInfo();
-			List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 			Integer userId = null;
 			if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {
 				userId = sysUser.getId();
 			}
+			int courseTimeError = 0;
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				courseTimeError = indexBaseMonthDataDao.getCourseTimeError(organIds,classGroupIds);
+			}
+			threeChild.add(new IndexErrInfoDto(IndexErrorType.COURSE_TIME_ERROR, IndexErrorType.COURSE_TIME_ERROR.getMsg(), courseTimeError, null));
+
 			int inspectionItem = indexBaseMonthDataDao.queryInspectionItem(organIdsStr,startTime,userId);
 			threeChild.add(new IndexErrInfoDto(IndexErrorType.INSPECTION_ITEM, IndexErrorType.INSPECTION_ITEM.getMsg(),inspectionItem, null));
 
@@ -371,10 +387,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			four.setDesc(IndexErrorType.ATTENDANCE_SERVE.getMsg());
 			List<IndexErrInfoDto> fourChild = new ArrayList<>();
 
-			int attendanceError = indexBaseMonthDataDao.getAttendanceError(organIds,startTime);
+			int attendanceError = 0;
+			int noAttendance = 0;
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				attendanceError = indexBaseMonthDataDao.getAttendanceError(organIds,startTime,classGroupIds);
+				noAttendance = indexBaseMonthDataDao.getNoAttendance(organIds,startTime,classGroupIds);
+			}
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE.getMsg(), attendanceError, null));
 
-			int noAttendance = indexBaseMonthDataDao.getNoAttendance(organIds,startTime);
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, IndexErrorType.TEACHER_NOT_A_CLASS.getMsg(), noAttendance, null));
 
 			Map<String, Object> params = new HashMap<>();
@@ -437,9 +457,19 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		if(StringUtils.isNotBlank(organIdsStr)){
 			organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
 		}
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		List<Long> classGroupIds = null;
+		Integer educationUserId = null;
+		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			//获取教务老师关联的班级列表
+			classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+			educationUserId = sysUser.getId();
+		}
 		Date date = new Date();
 		boolean flag1 = false;
-		int countLessThenThreeClassGroupNum = indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIds);
+		int countLessThenThreeClassGroupNum = indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIds,educationUserId);
 		if(countLessThenThreeClassGroupNum > 0){
 			flag1 = true;
 		}
@@ -450,7 +480,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 		}
 		if(!flag1){
-			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds);
+			IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIds,educationUserId);
 			if(Objects.nonNull(noClassMusicGroupStudentInfo) && noClassMusicGroupStudentInfo.getNum() > 0){
 				flag1 = true;
 			}
@@ -458,13 +488,13 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		resultMap.put("musicPatrol",flag1);
 		boolean flag2 = false;
 		if(!flag2){
-			int countNoPaymentStudentNum = indexBaseMonthDataDao.countNoPaymentStudentNum(organIds);
+			int countNoPaymentStudentNum = indexBaseMonthDataDao.countNoPaymentStudentNum(organIds,educationUserId);
 			if(countNoPaymentStudentNum > 0){
 				flag2 = true;
 			}
 		}
 		if(!flag2){
-			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds);
+			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds,educationUserId);
 			if(quitGroupNum.size() > 0){
 				flag2 = true;
 			}
@@ -484,13 +514,20 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				flag3 = true;
 			}
 		}
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		Integer userId = null;
 		if (!userRole.contains(SysUserRole.SECTION_MANAGER) && !sysUser.getIsSuperAdmin()) {
 			userId = sysUser.getId();
 		}
 		if(!flag3){
+			int courseTimeError = 0;
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				courseTimeError = indexBaseMonthDataDao.getCourseTimeError(organIds,classGroupIds);
+			}
+			if(courseTimeError > 0){
+				flag3 = true;
+			}
+		}
+		if(!flag3){
 			int inspectionItem = indexBaseMonthDataDao.queryInspectionItem(organIdsStr,startTime,userId);
 			if(inspectionItem > 0){
 				flag3 = true;
@@ -512,13 +549,19 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 		boolean flag4 = false;
 		if(!flag4){
-			int attendanceError = indexBaseMonthDataDao.getAttendanceError(organIds,startTime);
+			int attendanceError = 0;
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				attendanceError = indexBaseMonthDataDao.getAttendanceError(organIds,startTime,classGroupIds);
+			}
 			if(attendanceError > 0){
 				flag4 = true;
 			}
 		}
 		if(!flag4){
-			int noAttendance = indexBaseMonthDataDao.getNoAttendance(organIds,startTime);
+			int noAttendance = 0;
+			if(classGroupIds == null || classGroupIds.size() > 0){
+				noAttendance = indexBaseMonthDataDao.getNoAttendance(organIds,startTime,classGroupIds);
+			}
 			if(noAttendance > 0){
 				flag4 = true;
 			}

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

@@ -42,7 +42,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	}
 
 	@Override
-	public List<Organization> queryEmployeeOrgan() throws Exception {
+	public List<Organization> queryEmployeeOrgan(){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if(sysUser == null){
 			throw new BizException("获取用户信息失败");
@@ -52,6 +52,19 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	}
 
 	@Override
+	public List<Organization> queryEmployeeOrganByUser(){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if(sysUser == null){
+			throw new BizException("获取用户信息失败");
+		}
+		Integer userId = sysUser.getId();
+		if(sysUser.getIsSuperAdmin()){
+			userId = null;
+		}
+		return organizationDao.queryEmployeeOrgan(userId);
+	}
+
+	@Override
 	public String getOrganName(String organId) {
 		return organizationDao.getOrganName(organId);
 	}

+ 470 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -811,6 +811,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             sysUser.setOrganId(SHENYANG_ORGAN_ID);
         }
 
+        Integer practiceCourseMinutes = 25;
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        if (Objects.nonNull(practiceCourseMinutesConfig)) {
+            practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        }
+
         List<Integer> includeTeacherIds = new ArrayList<>();
         List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject1(sysUser.getOrganId(), subjectId);
         if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
@@ -819,6 +825,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         List<Integer> allTeacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
 
+        List<TeacherDefaultPracticeGroupSalary> haveDefaultSalaryTeachers = teacherDefaultPracticeGroupSalaryDao.findByTeachersAndCourseMinutes(allTeacherIds, practiceCourseMinutes);
+        if(CollectionUtils.isEmpty(haveDefaultSalaryTeachers)){
+            return Collections.emptyList();
+        }
+        Set<Integer> hasDefaultSalaryTeacherIds = haveDefaultSalaryTeachers.stream().map(TeacherDefaultPracticeGroupSalary::getUserId).collect(Collectors.toSet());
+        allTeacherIds = new ArrayList<>(hasDefaultSalaryTeacherIds);
+
         List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses(userId, allTeacherIds);
 
         if (!CollectionUtils.isEmpty(userCourses)) {
@@ -850,7 +863,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
 
         for (ExtendTeacherBasicDto organAndSubjectTeacher : organAndSubjectTeachers) {
-            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())) {
+            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())&&hasDefaultSalaryTeacherIds.contains(organAndSubjectTeacher.getId())) {
                 includeTeacherIds.add(organAndSubjectTeacher.getId());
             }
         }
@@ -1965,6 +1978,18 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
         List<TeacherAttendance> teacherAttendances = new ArrayList<>();
 
+        TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroup.getUserId(), practiceCourseMinutes);
+        BigDecimal teacherDefaultSalary = null;
+        if (Objects.nonNull(teacherDefaultPracticeGroupSalary)) {
+            teacherDefaultSalary = teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
+        }
+        if(teacherDefaultSalary == null){
+            throw new BizException("请设置教师课酬");
+        }
+        if(teacherDefaultSalary.compareTo(new BigDecimal(0))>0){
+            teacherDefaultSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+        }
+
         for (Date courseDate : allCourseDates) {
             //课表
             CourseSchedule courseSchedule = new CourseSchedule();
@@ -1992,7 +2017,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseScheduleTeacherSalary.setMusicGroupId(practiceGroup.getId().toString());
             courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
             courseScheduleTeacherSalary.setUserId(practiceGroup.getUserId());
-            courseScheduleTeacherSalary.setExpectSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+            courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
             courseScheduleTeacherSalary.setCreateTime(now);
             courseScheduleTeacherSalary.setUpdateTime(now);
             courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
@@ -2363,6 +2388,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 //            sysUser.setOrganId(SHENYANG_ORGAN_ID);
 //        }
 
+        Integer practiceCourseMinutes = 25;
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        if (Objects.nonNull(practiceCourseMinutesConfig)) {
+            practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        }
+
         List<Integer> includeTeacherIds = new ArrayList<>();
         List<ExtendTeacherBasicDto> organAndSubjectTeachers = teacherDao.findTeaTeachersByOrganAndSubject2(sysUser.getOrganId(), subjectId);
         if (CollectionUtils.isEmpty(organAndSubjectTeachers)) {
@@ -2371,6 +2402,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         List<Integer> allTeacherIds = organAndSubjectTeachers.stream().map(TeacherBasicDto::getId).collect(Collectors.toList());
 
+        List<TeacherDefaultPracticeGroupSalary> haveDefaultSalaryTeachers = teacherDefaultPracticeGroupSalaryDao.findByTeachersAndCourseMinutes(allTeacherIds, practiceCourseMinutes);
+        if(CollectionUtils.isEmpty(haveDefaultSalaryTeachers)){
+            return Collections.emptyList();
+        }
+        Set<Integer> hasDefaultSalaryTeacherIds = haveDefaultSalaryTeachers.stream().map(TeacherDefaultPracticeGroupSalary::getUserId).collect(Collectors.toSet());
+        allTeacherIds = new ArrayList<>(hasDefaultSalaryTeacherIds);
+
         List<CourseSchedule> userCourses = courseScheduleDao.findUserCourses2(userId, allTeacherIds);
 
         if (!CollectionUtils.isEmpty(userCourses)) {
@@ -2412,7 +2450,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
 
         for (ExtendTeacherBasicDto organAndSubjectTeacher : organAndSubjectTeachers) {
-            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())) {
+            if (!includeTeacherIds.contains(organAndSubjectTeacher.getId())&&hasDefaultSalaryTeacherIds.contains(organAndSubjectTeacher.getId())) {
                 includeTeacherIds.add(organAndSubjectTeacher.getId());
             }
         }
@@ -3205,6 +3243,421 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams) {
+        studentDao.lockUser(practiceGroupBuyParams.getStudentId());
+        if (Objects.isNull(practiceGroupBuyParams.getUserId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择教师");
+        }
+        if (Objects.isNull(practiceGroupBuyParams.getSubjectId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择声部");
+        }
+        if (Objects.isNull(practiceGroupBuyParams.getBuyMonths())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择需要购买的月数");
+        }
+        if (Objects.isNull(practiceGroupBuyParams.getDrillTimesOnWeek())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择单周陪练次数");
+        }
+        if (CollectionUtils.isEmpty(practiceGroupBuyParams.getDrillTimes())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择训练时间");
+        }
+        if (practiceGroupBuyParams.getDrillTimesOnWeek() != practiceGroupBuyParams.getDrillTimes().size()) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "训练时间与陪练次数不匹配");
+        }
+
+        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroupBuyParams.getStudentId());
+
+        Subject subject = subjectDao.get(practiceGroupBuyParams.getSubjectId());
+        if (Objects.isNull(subject)) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "预约失败,声部选择错误,请重试。");
+        }
+
+        Teacher teacher = teacherService.getDetail(practiceGroupBuyParams.getUserId());
+        if (Objects.isNull(teacher)) {
+            throw new BizException("老师不存在");
+        }
+
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+
+        Date now = new Date();
+
+        LocalDate courseStartDay = LocalDate.now();
+        LocalDate tempCourseLocalDate = LocalDate.parse("2020-03-01", DateUtil.dateFormatter);
+        if (courseStartDay.isBefore(tempCourseLocalDate)) {
+            courseStartDay = tempCourseLocalDate;
+        }
+
+        if (Objects.isNull(practiceGroupBuyParams.getEducationalTeacherId())) {
+            List<String> musicGroupIds = studentRegistrationDao.queryStudentMusicGroup(practiceGroupBuyParams.getStudentId());
+            if (!CollectionUtils.isEmpty(musicGroupIds) && musicGroupIds.size() <= 1) {
+                MusicGroup musicGroup = musicGroupDao.get(musicGroupIds.get(0));
+                if (Objects.nonNull(musicGroup)) {
+                    practiceGroupBuyParams.setEducationalTeacherId(musicGroup.getEducationalTeacherId());
+                }
+            }
+        }
+
+        courseStartDay = courseStartDay.plusDays(1);
+        Date courseStartDate = Date.from(courseStartDay.atStartOfDay(DateUtil.zoneId).toInstant());
+        practiceGroupBuyParams.setCoursesStartDate(courseStartDate);
+        LocalDate currentExpiredDay = courseStartDay.plusMonths(practiceGroupBuyParams.getBuyMonths());
+        Date courseExpiredDate = Date.from(currentExpiredDay.atStartOfDay(DateUtil.zoneId).toInstant());
+        courseExpiredDate = DateUtil.addSeconds(courseExpiredDate, -1);
+        practiceGroupBuyParams.setCoursesExpireDate(courseExpiredDate);
+
+        LocalDate courseExpiredSunday = currentExpiredDay.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue());
+        Date courseExpiredSundayDate = Date.from(courseExpiredSunday.atStartOfDay(DateUtil.zoneId).toInstant());
+
+        practiceGroupBuyParams.setName(subject.getName() + "•" + sysUser.getUsername());
+        List<CourseSchedule> practiceCourses = new ArrayList<>();
+
+        Student student = studentDao.get(practiceGroupBuyParams.getStudentId());
+        List<PracticeGroup> userStatusPracticeGroups = practiceGroupDao.findUserStatusPracticeGroups(practiceGroupBuyParams.getStudentId(), null, PracticeGroupType.COME_ON_PACKAGE);
+        long normalGroupNum = userStatusPracticeGroups.stream().filter(p -> GroupStatusEnum.LOCK.equals(p.getGroupStatus()) || GroupStatusEnum.NORMAL.equals(p.getGroupStatus())).count();
+        if(Objects.isNull(student.getComeOnPackage())||student.getComeOnPackage().equals(0)){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员暂无加油包排课资格");
+        }else if(student.getComeOnPackage().equals(2)||normalGroupNum>0){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员已使用加油包排课资格");
+        }
+        Integer courseTimes = 8;
+
+        while (practiceCourses.size()<courseTimes) {
+            courseStartDay=courseStartDay.plusDays(1);
+            int dayOfWeek = courseStartDay.get(DateUtil.weekFields.dayOfWeek());
+            for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+                if(practiceCourses.size()==courseTimes){
+                    break;
+                }
+                if(dayOfWeek==drillTime.getWeekNum()){
+                    CourseSchedule courseSchedule=new CourseSchedule();
+                    String courseStartDayStr = DateUtil.dateFormatter.format(courseStartDay);
+                    String courseStartDateTimeStr = courseStartDayStr+" "+drillTime.getTimeStr();
+                    LocalDateTime courseStartDateTime = LocalDateTime.parse(courseStartDateTimeStr,DateUtil.dateTimeFormatter);
+                    LocalDateTime courseEndDateTime = courseStartDateTime.plusMinutes(practiceCourseMinutes);
+                    courseSchedule.setStartClassTime(Date.from(courseStartDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setEndClassTime(Date.from(courseEndDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setClassDate(courseSchedule.getStartClassTime());
+                    courseSchedule.setName(practiceGroupBuyParams.getName());
+                    courseSchedule.setTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setActualTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+                    courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+                    courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                    practiceCourses.add(courseSchedule);
+
+                    if(practiceCourses.size()==courseTimes){
+                        break;
+                    }
+
+                    CourseSchedule courseSchedule1=new CourseSchedule();
+                    BeanUtils.copyProperties(courseSchedule, courseSchedule1);
+                    courseSchedule1.setStartClassTime(courseSchedule.getEndClassTime());
+                    courseSchedule1.setEndClassTime(Date.from(courseEndDateTime.plusMinutes(practiceCourseMinutes).atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule1.setClassDate(courseSchedule1.getStartClassTime());
+                    practiceCourses.add(courseSchedule1);
+
+                }
+            }
+        }
+
+        practiceCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        LocalDate classStartDate = LocalDateTime.ofInstant(practiceCourses.get(0).getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
+        LocalDate courseStartMonday = classStartDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+        Date courseStartMondayDate = Date.from(courseStartMonday.atStartOfDay(DateUtil.zoneId).toInstant());
+
+        List<CourseSchedule> allTeacherCourses = courseScheduleDao.findTeacherCoursesWithDateRange(practiceGroupBuyParams.getUserId(), courseStartMondayDate, courseExpiredSundayDate);
+
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.findTeacherFreeTime(practiceGroupBuyParams.getUserId());
+        Integer maxTeacherCourses = null;
+        if (Objects.nonNull(teacherFreeTime)) {
+            if (Objects.nonNull(teacherFreeTime.getTotalTimes())) {
+                maxTeacherCourses = teacherFreeTime.getTotalTimes();
+            }
+        } else {
+            return BaseController.failed(HttpStatus.MULTIPLE_CHOICES, "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
+        }
+
+        int courseWeekNum = 0;
+        int practiceCourseNum = 0;
+        LocalDateTime tempClassDateTime;
+        for (int i = 0; i < allTeacherCourses.size(); i++) {
+            CourseSchedule teacherCourse = allTeacherCourses.get(i);
+            tempClassDateTime = LocalDateTime.ofInstant(teacherCourse.getClassDate().toInstant(), DateUtil.zoneId);
+            if (i == 0 && teacherCourse.getGroupType().equals(GroupType.PRACTICE)) {
+                practiceCourseNum += 1;
+                courseWeekNum = tempClassDateTime.get(DateUtil.weekFields.weekOfYear());
+            }
+            if (Objects.nonNull(maxTeacherCourses) && practiceCourseNum >= maxTeacherCourses) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return BaseController.failed(HttpStatus.MULTIPLE_CHOICES, "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
+            }
+            if (tempClassDateTime.get(DateUtil.weekFields.weekOfYear()) != courseWeekNum) {
+                courseWeekNum = tempClassDateTime.get(DateUtil.weekFields.weekOfYear());
+                practiceCourseNum = 0;
+            }
+            if (teacherCourse.getGroupType().equals(GroupType.PRACTICE)) {
+                practiceCourseNum += 1;
+            }
+        }
+        allTeacherCourses = new ArrayList<>();
+
+        JSONObject drillTimesObject = new JSONObject();
+        for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+            drillTimesObject.put(String.valueOf(drillTime.getWeekNum()), drillTime.getTimeStr());
+        }
+
+        PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(sysUser.getOrganId());
+        if (Objects.isNull(practiceGroupSellPrice)) {
+            throw new BizException("所在城市暂不参与此活动");
+        }
+
+        BigDecimal amount = PracticeGroupType.CARE_PACKAGE.equals(practiceGroupBuyParams.getType())?practiceGroupSellPrice.getCarePackagePrice():practiceGroupSellPrice.getComeOnPackagePrice();
+        if(Objects.isNull(amount)&&PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            throw new BizException("请设置加油包价格");
+        }
+
+        practiceGroupBuyParams.setCoursesStartDate(practiceCourses.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get().getStartClassTime());
+        practiceGroupBuyParams.setCoursesExpireDate(practiceCourses.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get().getEndClassTime());
+        practiceGroupBuyParams.setDrillTimesJson(drillTimesObject.toJSONString());
+        practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
+        practiceGroupBuyParams.setSingleClassMinutes(practiceCourseMinutes);
+        practiceGroupBuyParams.setGroupStatus(GroupStatusEnum.LOCK);
+        practiceGroupBuyParams.setType(PracticeGroupType.COME_ON_PACKAGE);
+        practiceGroupDao.insert(practiceGroupBuyParams);
+
+        //创建班级信息
+        ClassGroup classGroup = new ClassGroup();
+        classGroup.setSubjectIdList(practiceGroupBuyParams.getSubjectId().toString());
+        classGroup.setExpectStudentNum(1);
+        classGroup.setStudentNum(1);
+        classGroup.setName(practiceGroupBuyParams.getName());
+        classGroup.setTotalClassTimes(practiceCourses.size());
+        classGroup.setType(ClassGroupTypeEnum.PRACTICE);
+        classGroup.setDelFlag(0);
+        classGroup.setGroupType(GroupType.PRACTICE);
+        classGroup.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroup.setCreateTime(now);
+        classGroup.setUpdateTime(now);
+        classGroupDao.insert(classGroup);
+
+        //创建班级老师关联记录
+        ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+        classGroupTeacherMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+        classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherMapper.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherMapper.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherMapper.setCreateTime(now);
+        classGroupTeacherMapper.setUpdateTime(now);
+        classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+        //创建班级与老师课酬记录
+        ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
+        classGroupTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+        classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherSalary.setSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setOnlineClassesSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherSalary.setCreateTime(now);
+        classGroupTeacherSalary.setUpdateTime(now);
+        classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+        //班级学生关联表
+        ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+        classGroupStudentMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupStudentMapper.setClassGroupId(classGroup.getId());
+        classGroupStudentMapper.setUserId(practiceGroupBuyParams.getStudentId());
+        classGroupStudentMapper.setCreateTime(now);
+        classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+        classGroupStudentMapper.setGroupType(GroupType.PRACTICE);
+        classGroupStudentMapperDao.insert(classGroupStudentMapper);
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课表
+            courseSchedule.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseSchedule.setClassGroupId(classGroup.getId());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setCreateTime(now);
+            courseSchedule.setUpdateTime(now);
+            courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+            courseSchedule.setGroupType(GroupType.PRACTICE);
+            courseSchedule.setIsLock(1);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
+        }
+        courseScheduleDao.batchAddCourseSchedules(practiceCourses);
+        TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroupBuyParams.getUserId(), practiceCourseMinutes);
+        BigDecimal teacherDefaultSalary = null;
+        if (Objects.nonNull(teacherDefaultPracticeGroupSalary)) {
+            teacherDefaultSalary = teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
+        }
+        if(teacherDefaultSalary == null){
+            throw new BizException("请设置教师课酬");
+        }
+        BigDecimal studentSingleCourseCost = amount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+
+        BigDecimal oneMonthOriginalPrice=practiceGroupBuyParams.getDrillTimesOnWeek()==1?practiceGroupSellPrice.getOnceOriginalPrice():practiceGroupSellPrice.getTwiceOriginalPrice();
+        BigDecimal originalAmount = oneMonthOriginalPrice.multiply(new BigDecimal(practiceGroupBuyParams.getBuyMonths()));
+        BigDecimal studentSingleCourseOriginalCost=originalAmount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课程与老师薪水表
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(GroupType.PRACTICE);
+            courseScheduleTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+            courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+            courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+            courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+            //学生缴费记录
+            CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+            courseScheduleStudentPayment.setGroupType(GroupType.PRACTICE);
+            courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
+            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
+            courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+            courseScheduleStudentPayment.setCreateTime(now);
+            courseScheduleStudentPayment.setUpdateTime(now);
+            courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+
+            //教师签到记录
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            teacherAttendance.setTeacherId(practiceGroupBuyParams.getUserId());
+            teacherAttendance.setClassGroupId(classGroup.getId());
+            teacherAttendance.setGroupType(GroupType.PRACTICE);
+            teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+            teacherAttendance.setCreateTime(now);
+            teacherAttendances.add(teacherAttendance);
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+
+        try {
+            courseScheduleService.checkNewCourseSchedules(practiceCourses, false,false);
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String errMessage = new String();
+            if (e.getMessage().indexOf("主教冲突") != -1) {
+                errMessage = "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
+            } else {
+                String courseName = e.getMessage().substring(e.getMessage().indexOf(")-") + 2);
+                courseName = courseName.substring(0, courseName.indexOf("("));
+                errMessage = "抱歉啦,当前所选时段组合,与您现有课程「";
+                errMessage += courseName;
+                errMessage += "」时段冲突,请选择其他时段重试。";
+            }
+            return BaseController.failed(HttpStatus.FOUND, errMessage);
+        }
+
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
+        studentPaymentOrder.setGroupType(GroupType.PRACTICE);
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
+        if (practiceGroupBuyParams.isRenew()) {
+            studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_RENEW);
+        }
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
+        studentPaymentOrder.setClassGroupId(classGroup.getId());
+        studentPaymentOrder.setVersion(0);
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        BigDecimal balance = BigDecimal.ZERO;
+        if (practiceGroupBuyParams.isUseBalancePayment() || studentPaymentOrder.getExpectAmount().doubleValue() == 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(practiceGroupBuyParams.getStudentId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            if (userCashAccount.getBalance().subtract(studentPaymentOrder.getExpectAmount()).doubleValue() >= 0) {
+                studentPaymentRouteOrderService.addRouteOrder(orderNo, practiceGroupBuyParams.getOrganId(), amount);
+
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setBalancePaymentAmount(studentPaymentOrder.getExpectAmount());
+                studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+                studentPaymentOrder.setUpdateTime(now);
+                studentPaymentOrder.setOrganId(practiceGroupBuyParams.getOrganId());
+                studentPaymentOrder.setRoutingOrganId(practiceGroupBuyParams.getOrganId());
+
+                sysUserCashAccountService.updateBalance(practiceGroupBuyParams.getStudentId(), studentPaymentOrder.getExpectAmount().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "网管课购买");
+
+                studentPaymentOrder.setPayTime(now);
+                this.orderCallback(studentPaymentOrder);
+
+                Map<String, Object> result = new HashMap<>();
+                result.put("orderNo", studentPaymentOrder.getOrderNo());
+
+                return BaseController.succeed(result);
+            } else {
+                if (userCashAccount.getBalance().doubleValue() > 0) {
+                    balance = userCashAccount.getBalance();
+                    sysUserCashAccountService.updateBalance(practiceGroupBuyParams.getStudentId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "网管课购买");
+                    amount = studentPaymentOrder.getExpectAmount().subtract(userCashAccount.getBalance());
+                    studentPaymentOrder.setActualAmount(amount);
+                    studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
+                } else {
+                    studentPaymentOrder.setBalancePaymentAmount(new BigDecimal(0));
+                }
+            }
+        }
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course", amount);
+        classFee.put("instrument", BigDecimal.ZERO);
+        classFee.put("accessories", BigDecimal.ZERO);
+        classFee.put("other", BigDecimal.ZERO);
+        try {
+            Map<String, Object> payMap = payService.getPayMap(
+                    amount,
+                    balance,
+                    orderNo,
+                    baseApiUrl + "/api-student/studentOrder/notify",
+                    baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+                    "网管课购买",
+                    practiceGroupBuyParams.getName(),
+                    practiceGroupBuyParams.getOrganId(),
+                    "practiceBuy"
+            );
+
+            studentPaymentOrder.setOrganId(practiceGroupBuyParams.getOrganId());
+            studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+            studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+            studentPaymentOrder.setUpdateTime(now);
+            studentPaymentOrderService.update(studentPaymentOrder);
+
+            return BaseController.succeed(payMap);
+        } catch (Exception e) {
+            LOGGER.error("网管课购买失败:", e.getCause());
+            throw new BizException("订单提交超时,请尝试重新提交购买");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public void orderCallback(StudentPaymentOrder order) {
         StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(order.getId());
         if (!studentPaymentOrder.getStatus().equals(DealStatusEnum.ING)) {
@@ -3298,6 +3751,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceGroup.setGroupStatus(GroupStatusEnum.NORMAL);
         practiceGroupDao.update(practiceGroup);
 
+        if(PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroup.getType())){
+            Student student = studentDao.get(practiceGroup.getStudentId());
+            student.setComeOnPackage(2);
+            studentDao.update(student);
+        }
+
         try {
             contractService.transferPracticeCoursesContract(order.getUserId(), classGroup.getTotalClassTimes(), practiceGroup.getCoursesStartDate(), practiceGroup.getCoursesExpireDate(), order.getExpectAmount());
         } catch (Exception e) {
@@ -3364,14 +3823,17 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     }
 
     @Override
-    public List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId, Long groupId) {
+    public List<PracticeCourseDto> findUserHistoryBuyPracticeGroups(Integer userId, Long groupId, PracticeGroupType type) {
         List<PracticeCourseDto> userPracticeGroups;
         if (Objects.nonNull(groupId)) {
             PracticeGroup practiceGroup = practiceGroupDao.get(groupId);
+            if(Objects.isNull(practiceGroup)){
+                throw new BizException("课程信息不存在");
+            }
             Date date = DateUtil.addSeconds(practiceGroup.getCoursesExpireDate(), 1);
             userPracticeGroups = practiceGroupDao.findUserBuyPracticeGroupsWithDate(userId, date);
         } else {
-            userPracticeGroups = practiceGroupDao.findUserBuyPracticeGroups(userId);
+            userPracticeGroups = practiceGroupDao.findUserBuyPracticeGroups(userId,type);
         }
 
         if (CollectionUtils.isEmpty(userPracticeGroups)) {
@@ -3387,6 +3849,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 newCourseJson.put("weekName", DateUtil.weekNumNormalWeekNameMap.get(Integer.parseInt(weekNumStr)));
                 LocalTime courseStartTime = LocalTime.parse(courseJson.getString(weekNumStr), DateUtil.timeFormatter);
                 LocalTime courseEndTime = courseStartTime.plusMinutes(practiceCourseMinutes);
+                if(PracticeGroupType.COME_ON_PACKAGE.equals(userPracticeGroup.getType())){
+                    courseEndTime = courseStartTime.plusMinutes(2*practiceCourseMinutes);
+                }
                 newCourseJson.put("startTime", courseStartTime.format(DateUtil.timeFormatter));
                 newCourseJson.put("endTime", courseEndTime.format(DateUtil.timeFormatter));
                 coursesArry.add(newCourseJson);

+ 3 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -444,7 +444,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         PageInfo<MusicGroupStudentsDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-        List<MusicGroupStudentsDto> dataList = null;
+        List<MusicGroupStudentsDto> dataList = new ArrayList<>();
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.getMusicGroupStu(queryInfo.getMusicGroupId());
         if(studentRegistrations.size() == 0){
             return pageInfo;
@@ -475,8 +475,8 @@ public class StudentManageServiceImpl implements StudentManageService {
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
-        if (count > 0) {
-            pageInfo.setTotal(count);
+        pageInfo.setTotal(count);
+        if (queryInfo.getPage() <= pageInfo.getTotalPage()) {
             params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.queryMusicGroupStudent(params);
             //获取乐团学员欠费金额
@@ -504,9 +504,6 @@ public class StudentManageServiceImpl implements StudentManageService {
                 }
             });
         }
-        if (count == 0) {
-            dataList = new ArrayList<>();
-        }
         pageInfo.setRows(dataList);
         return pageInfo;
     }

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

@@ -71,20 +71,20 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         if (applyOrder == null || applyOrder.size() == 0) {
             return null;
         }
-        String goodsIdsStr = "";
+        StringBuilder goodsIdsStr = new StringBuilder();
         for (StudentPaymentOrderDetail studentPaymentOrderDetail : applyOrder) {
-            if (studentPaymentOrderDetail.getGoodsIdList() != null && !studentPaymentOrderDetail.getGoodsIdList().isEmpty()) {
-                goodsIdsStr += studentPaymentOrderDetail.getGoodsIdList() + ",";
+            if (studentPaymentOrderDetail == null) continue;
+            if (StringUtils.isNotBlank(studentPaymentOrderDetail.getGoodsIdList())) {
+                goodsIdsStr.append(studentPaymentOrderDetail.getGoodsIdList()).append(",");
             }
         }
-        if (StringUtils.isBlank(goodsIdsStr)) {
+        if (StringUtils.isBlank(goodsIdsStr.toString())) {
             return null;
         }
-        goodsIdsStr = goodsIdsStr.substring(0, goodsIdsStr.length() - 1);
 
-        String[] goodSIdArr = goodsIdsStr.split(",");
+        String[] goodSIdArr = goodsIdsStr.toString().split(",");
 
-        List<Goods> goodies = goodsService.findGoodsByIds(goodsIdsStr);
+        List<Goods> goodies = goodsService.findGoodsByIds(goodsIdsStr.toString());
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         Organization organization = organizationDao.get(musicGroup.getOrganId());
         goodies.forEach(e -> {
@@ -231,7 +231,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                     goods.setSellCount(goods.getSellCount() + 1);
                 }
             }
-            if(StringUtils.isBlank(goods.getComplementGoodsIdList())) continue;
+            if (StringUtils.isBlank(goods.getComplementGoodsIdList())) continue;
             goods.setGoodsList(goodsService.findGoodsByIds(goods.getComplementGoodsIdList()));
         }
         return goodies;
@@ -243,8 +243,8 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     }
 
     @Override
-    public List<MusicalListDetailDto> getMusicalListDetail(String musicGroupId,Integer studentId) {
-        List<MusicalListDetailDto> musicalListDetailDtos = studentPaymentOrderDetailDao.getMusicalListDetail(musicGroupId,studentId);
+    public List<MusicalListDetailDto> getMusicalListDetail(String musicGroupId, Integer studentId) {
+        List<MusicalListDetailDto> musicalListDetailDtos = studentPaymentOrderDetailDao.getMusicalListDetail(musicGroupId, studentId);
         if (musicalListDetailDtos.size() <= 0) {
             return musicalListDetailDtos;
         }
@@ -258,7 +258,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         Map<Long, BigDecimal> expectAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDao.queryExpectAmount(paymentOrderNo));
         Map<Long, BigDecimal> musicalAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo, "MUSICAL"));
         Map<Long, BigDecimal> accessoriesAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo, "ACCESSORIES"));
-        String courseTypes = Arrays.stream(CourseSchedule.CourseScheduleType.values()).map(CourseSchedule.CourseScheduleType::getCode).collect(Collectors.joining(","))+",COURSE";
+        String courseTypes = Arrays.stream(CourseSchedule.CourseScheduleType.values()).map(CourseSchedule.CourseScheduleType::getCode).collect(Collectors.joining(",")) + ",COURSE";
         Map<Long, BigDecimal> courseAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo, courseTypes));
         Map<Long, String> purchaseTypeMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryPurchaseTypeMap(paymentOrderNo));
         Map<Integer, String> userSubjectMap = subjectDao.getRegisterSubject(musicGroupId, userIds).stream().collect(Collectors.toMap(StudentRegistration::getUserId, StudentRegistration::getSubjectName));
@@ -279,7 +279,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                 e.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.valueOf(purchaseTypeMap.get(e.getPaymentOrderId())));
             }
             SubjectChange studentLastChange = subjectChangeDao.getStudentLastChange(e.getUserId(), musicGroupId);
-            if(studentLastChange != null){
+            if (studentLastChange != null) {
                 studentLastChange.setOriginalKitGroupPurchaseType(studentLastChange.getKitGroupPurchaseType());
             }
 

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

@@ -144,6 +144,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentService studentService;
     @Autowired
     private ImGroupDao imGroupDao;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -1711,6 +1713,12 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             List<Integer> organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
             params.put("organIds", organIds);
         }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+        //如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+        if (userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+            params.put("educationUserId", sysUser.getId());
+        }
 
         List<NoClassMusicStudentDto> dataList = new ArrayList<>();
         int count = studentRegistrationDao.countNoClassMusicStudents(params);

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

@@ -228,9 +228,11 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         SubjectChange studentOriginal = getStudentOriginal(subjectChange.getStudentId(), subjectChange.getMusicGroupId());
         subjectChange.setOriginalOrderId(studentOriginal.getOrderId());
         subjectChange.setOriginalCost(studentOriginal.getOriginalCost());
+        subjectChange.setOriginalAccessories(studentOriginal.getOriginalAccessories());
         subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
         MusicGroup musicGroup = musicGroupDao.get(subjectChange.getMusicGroupId());
         subjectChange.setOrganId(musicGroup.getOrganId());
+        subjectChange.setCooperationOrganId(musicGroup.getCooperationOrganId());
         subjectChange.setEduTeacherId(musicGroup.getEducationalTeacherId());
         subjectChange.setCourseMargin(subjectChange.getChangeCourseFee().subtract(subjectChange.getOriginalCourseFee()));
         BigDecimal goodsMargin = subjectChange.getChangeMusicalPrice().add(subjectChange.getChangeAccessoriesPrice())
@@ -245,8 +247,10 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         if (subjectChange.getChangeMusical() != null) {
             goodsIds += subjectChange.getChangeMusical() + "";
         }
-        if (subjectChange.getChangeAccessories() != null) {
+        if (StringUtils.isNotBlank(subjectChange.getChangeAccessories())) {
             goodsIds += StringUtils.isNotBlank(goodsIds) ? "," + subjectChange.getChangeAccessories() : subjectChange.getChangeAccessories();
+        }else {
+            subjectChange.setChangeAccessories(null);
         }
         BigDecimal goodsPrice = BigDecimal.ZERO;
         List<Goods> goodies = goodsDao.findGoodsByIds(goodsIds);
@@ -343,7 +347,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 subjectChange.setOriginalMusicalPrice(studentLastChange.getChangeMusicalPrice());
             }
 
-            if (studentLastChange.getChangeAccessories() != null) {
+            if (StringUtils.isNotBlank(studentLastChange.getChangeAccessories())) {
                 String[] goodsIdArr = studentLastChange.getChangeAccessories().split(",");
                 String accessoriesId = "";
                 for (String goodsId : goodsIdArr) {

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherSalaryModifyLogServiceImpl.java

@@ -44,6 +44,12 @@ public class TeacherSalaryModifyLogServiceImpl extends BaseServiceImpl<Long, Tea
 		if(modifyLog.getCurrentExpectSalary().compareTo(modifyLog.getCurrentReduceSalary()) < 0){
 			throw new BizException("应发金额不应小于扣款金额");
 		}
+		if(salary.getExpectSalary() == null){
+			salary.setExpectSalary(BigDecimal.ZERO);
+		}
+		if(salary.getReduceSalary() == null){
+			salary.setReduceSalary(BigDecimal.ZERO);
+		}
 		modifyLog.setPreExpectSalary(salary.getExpectSalary());
 		modifyLog.setPreReduceSalary(salary.getReduceSalary());
 		modifyLog.setOperatorId(sysUser.getId());

+ 16 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -1424,6 +1424,9 @@
             <if test="organIdList != null and organIdList != ''">
                 AND FIND_IN_SET(mg.organ_id_,#{organIdList})
             </if>
+            <if test="educationUserId != null">
+                AND mg.educational_teacher_id_ = #{educationUserId}
+            </if>
             <if test="search != null and search != ''">
                 AND (cg.id_ LIKE CONCAT('%',#{search},'%') OR cg.name_ LIKE CONCAT('%',#{search},'%') OR mg.name_ LIKE CONCAT('%',#{search},'%') OR cg.music_group_id_ LIKE CONCAT('%',#{search},'%'))
             </if>
@@ -1464,4 +1467,17 @@
         ORDER BY cg.id_ DESC
         <include refid="global.limit"/>
     </select>
+    <select id="queryGroupClassGroupIds" resultType="java.lang.Long">
+        SELECT cg.id_ FROM music_group mg
+        LEFT JOIN class_group cg ON cg.music_group_id_ = mg.id_
+        WHERE mg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        UNION
+        SELECT cg.id_ FROM vip_group vg
+        LEFT JOIN class_group cg ON cg.music_group_id_ = vg.id_
+        WHERE vg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'VIP' AND vg.group_status_ = 2
+        UNION
+        SELECT cg.id_ FROM practice_group pg
+        LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
+        WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND pg.group_status_ = 'NORMAL'
+    </select>
 </mapper>

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

@@ -298,7 +298,7 @@
         SELECT sr.*,s.name_ subject_name_,su.username_,su.gender_  FROM class_group_student_mapper cgsm
         LEFT JOIN student_registration sr ON (sr.user_id_ = cgsm.user_id_ AND sr.music_group_id_ = cgsm.music_group_id_)
         LEFT JOIN sys_user su on sr.user_id_ = su.id_
-        LEFT JOIN subject s ON sr.subject_id_ = s.id_
+        LEFT JOIN subject s ON sr.actual_subject_id_ = s.id_
         WHERE cgsm.class_group_id_ = #{classGroupId} AND sr.music_group_status_ != 'QUIT'
         AND cgsm.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </select>
@@ -651,7 +651,7 @@
         </if>
         GROUP BY cg.id_
         HAVING
-        COUNT(CASE WHEN cgsm.status_ = 'NORMAL' THEN 1 ELSE NULL END) &lt; 3
+        COUNT(DISTINCT CASE WHEN cgsm.status_ = 'NORMAL' THEN cgsm.user_id_ ELSE NULL END) &lt; 3
     </select>
 
     <select id="getStudentClassGroupWithTeacher" resultMap="com.ym.mec.biz.dal.dao.ClassGroupDao.ClassGroup">

+ 16 - 6
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -2428,10 +2428,10 @@
             left join teacher_attendance ta on ta.course_schedule_id_ = cs.id_
             <if test="searchType == 'ERR_ATTENDANCE'">
                 LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
-                LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND cssp.user_id_ = sa.user_id_
             </if>
-            <if test="searchType != 'ERR_ATTENDANCE'">
-                LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            <if test="searchType == 'ERR_ATTENDANCE'">
+                AND cssp.user_id_ = sa.user_id_
             </if>
             <include refid="endFindCourseSchedulesCondition"/>
         GROUP BY
@@ -2452,10 +2452,10 @@
         course_schedule cs
         <if test="searchType == 'ERR_ATTENDANCE'">
             LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
-            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND cssp.user_id_ = sa.user_id_
         </if>
-        <if test="searchType != 'ERR_ATTENDANCE'">
-            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+        LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+        <if test="searchType == 'ERR_ATTENDANCE'">
+            AND cssp.user_id_ = sa.user_id_
         </if>
         LEFT JOIN teacher_attendance ta on ta.course_schedule_id_ = cs.id_
         LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
@@ -2590,6 +2590,16 @@
             AND cs.status_ = 'OVER' AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.dispose_content_ IS NULL
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
         </if>
+        <if test="searchType == 'COURSE_TIME_ERROR'">
+            AND cs.status_ = 'NOT_START' AND cs.is_lock_ = 0 AND cs.start_class_time_ &lt; '06:00:00'
+            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
+        </if>
+        <if test="classGroupIds != null and classGroupIds.size() > 0">
+            AND cs.class_group_id_ IN
+            <foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+                #{classGroupId}
+            </foreach>
+        </if>
     </sql>
     <select id="queryPracticeCourseScheduleIds" resultType="java.lang.Integer">
         SELECT cs.id_ FROM course_schedule cs

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

@@ -633,6 +633,9 @@
 		AND cs.del_flag_=0
 		AND cs.status_='NOT_START'
 		AND ( cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_ )
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
 		<if test="organIds!=null and organIds.size()>0">
 			AND mg.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -641,7 +644,7 @@
 		</if>
 		GROUP BY cg.id_
 		HAVING
-		COUNT(CASE WHEN cgsm.status_ = 'NORMAL' THEN 1 ELSE NULL END) &lt; 3
+		COUNT(DISTINCT CASE WHEN cgsm.status_ = 'NORMAL' THEN cgsm.user_id_ ELSE NULL END) &lt; 3
 		) t
 	</select>
 
@@ -675,6 +678,9 @@
 		mg.status_ = 'PROGRESS'
 		AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(mgpc.payment_valid_start_date_,'%Y-%m-%d')
 		AND mgpcd.payment_status_ = 'NON_PAYMENT' AND mgpcd.expect_amount_ > 0 AND mgpc.batch_no_ IS NOT NULL AND mgpc.pay_user_type_ = 'STUDENT'
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
 		<if test="organIds!=null and organIds.size()>0">
 			AND mg.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -694,6 +700,9 @@
 			mg.status_ = 'PROGRESS'
 			AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(mgpc.payment_valid_start_date_,'%Y-%m-%d')
 			AND mgpcd.payment_status_ = 'NON_PAYMENT'
+			<if test="educationUserId != null">
+				AND mg.educational_teacher_id_ = #{educationUserId}
+			</if>
 			<if test="organIds!=null and organIds.size()>0">
 				AND mg.organ_id_ IN
 				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -707,6 +716,9 @@
 			LEFT JOIN music_group mg ON mgq.music_group_id_=mg.id_
 		WHERE mg.status_='PROGRESS'
 		  AND mgq.status_='PROCESSING'
+		<if test="educationUserId != null">
+			AND mg.educational_teacher_id_ = #{educationUserId}
+		</if>
 		<if test="organIds!=null and organIds.size() > 0">
 			AND mg.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -739,6 +751,23 @@
 				</foreach>
 			</if>
 	</select>
+    <select id="getCourseTimeError" resultType="int">
+		SELECT COUNT(cs.id_) FROM course_schedule cs
+		WHERE cs.status_ = 'NOT_START' AND cs.del_flag_ = 0 AND cs.is_lock_ = 0 AND cs.start_class_time_ &lt; '06:00:00'
+		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="organIds != null and organIds.size()>0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+				#{organId}
+			</foreach>
+		</if>
+	</select>
     <select id="getAttendanceError" resultType="int">
 		SELECT COUNT(DISTINCT c.id_) FROM (SELECT cs.id_ FROM course_schedule cs
 		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
@@ -749,6 +778,12 @@
 		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
 		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
 		<if test="organIds != null and organIds.size()>0">
 			AND cs.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -764,6 +799,12 @@
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_>='2021-02-01'
 		AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.dispose_content_ IS NULL
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
 		<if test="organIds!=null and organIds.size() > 0">
 			AND cs.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -852,6 +893,9 @@
 			sr.music_group_status_ = 'NORMAL'
 			AND mg.status_ = 'PROGRESS'
 			AND cgsm.id_ IS NULL
+			<if test="educationUserId != null">
+				AND mg.educational_teacher_id_ = #{educationUserId}
+			</if>
 			<if test="organIds!=null and organIds.size()>0">
 				AND mg.organ_id_ IN
 				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">

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

@@ -11,6 +11,7 @@
 		<result column="expect_amount_" property="expectAmount" />
 		<result column="actual_amount_" property="actualAmount" />
 		<result column="payment_status_" property="paymentStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result column="payment_type_" property="paymentType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="user_status_" property="userStatus" />
 		<result column="music_group_id_" property="musicGroupId" />
 		<result column="pay_time_" property="payTime" />
@@ -206,7 +207,7 @@
 		SELECT su.username_,su.phone_,st.name_ subject_names_,sr.music_group_status_,tu.real_name_ responsible_username_,
 		CASE WHEN mgpcd.start_payment_date_ IS NULL THEN mgpc.start_payment_date_ ELSE mgpcd.start_payment_date_ END start_payment_date_mgpc_,
 		CASE WHEN mgpcd.deadline_payment_date_ IS NULL THEN mgpc.deadline_payment_date_ ELSE mgpcd.deadline_payment_date_ END deadline_payment_date_mgpc_,
-		CASE WHEN mgpc.status_ = 'OPEN' OR mgpcd.open_ = 1 THEN 1 ELSE 0 END open_,mgpcd.*
+		CASE WHEN mgpc.status_ = 'OPEN' OR mgpcd.open_ = 1 THEN 1 ELSE 0 END open_,mgpc.payment_type_,mgpcd.*
 		FROM music_group_payment_calender_detail mgpcd
 		LEFT JOIN sys_user su ON su.id_ = mgpcd.user_id_
 		left join sys_user tu on tu.id_ = mgpcd.responsible_user_id_

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

@@ -114,6 +114,12 @@
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(mg.organ_id_,#{organId})
             </if>
+            <if test="educationUserId != null">
+                AND mg.educational_teacher_id_ = #{educationUserId}
+            </if>
+            <if test="status != null">
+                AND mgq.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
             <if test="search != null and search != ''">
                 AND (mgq.user_id_ = #{search} OR mgq.music_group_id_ = #{search})
             </if>

+ 12 - 2
mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml

@@ -214,7 +214,12 @@
                  LEFT JOIN `subject` s ON pg.subject_id_ = s.id_
         WHERE student_id_ = #{userId}
           AND (pg.group_status_ = 'NORMAL' OR pg.group_status_ = 'LOCK')
-          AND pg.type_='CHARGE'
+          <if test="type!=null">
+              AND pg.type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          </if>
+          <if test="type==null">
+              AND pg.type_='CHARGE'
+          </if>
     </select>
 
     <select id="findUserBuyPracticeGroupsWithDate" resultMap="PracticeCourseDto">
@@ -299,7 +304,12 @@
         SELECT *
         FROM practice_group
         WHERE student_id_ = #{userId}
-          AND group_status_ = #{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          <if test="groupStatus!=null">
+              AND group_status_ = #{groupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          </if>
+          <if test="groupType!=null">
+              AND type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          </if>
     </select>
     <select id="findUserLockPracticeGroupWithDate" resultMap="PracticeGroup">
         SELECT *

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -495,6 +495,7 @@
 		<result column="un_done_" property="unDone"/>
 		<result column="remind_time_" property="remindDate"/>
 		<result column="operator_name_" property="operatorName"/>
+		<result column="job_nature_" property="jobNature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 	</resultMap>
 
 	<sql id="queryTeacherServeInfoCondition">
@@ -533,6 +534,7 @@
 			sees.sunday_,
 			sees.teacher_id_,
 			su.real_name_ teacher_name_,
+		    tea.job_nature_,
 			SUM(CASE sees.serve_type_ WHEN 'HOMEWORK' THEN sees.expect_exercises_num_ ELSE 0 END) homework_num_,
 			SUM(CASE sees.serve_type_ WHEN 'EXERCISE' THEN 1 ELSE 0 END) exercise_num_,
 			SUM( sees.expect_exercises_num_-sees.not_over_course_num_ )> SUM( sees.actual_exercises_num_ ) un_done_

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -873,6 +873,9 @@
                     #{organId}
                 </foreach>
             </if>
+            <if test="educationUserId != null">
+                AND mg.educational_teacher_id_ = #{educationUserId}
+            </if>
             <if test="musicGroupSearch!=null and musicGroupSearch!=''">
                 AND (sr.music_group_id_ = #{musicGroupSearch} OR mg.name_ LIKE CONCAT('%', #{musicGroupSearch}, '%'))
             </if>

+ 19 - 2
mec-biz/src/main/resources/config/mybatis/SysMusicScoreAccompanimentMapper.xml

@@ -22,6 +22,8 @@
 		<result column="speed_" property="speed" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
+		<result column="is_show_fingering_" property="isShowFingering" />
+		<result column="memo_" property="memo" />
 	</resultMap>
 
 	<delete id="deleteBySongId">
@@ -48,10 +50,10 @@
 		VALUES(#{examSongId},#{subjectId},#{mp3Url},#{speed},#{xmlUrl},NOW(),NOW())
 	</insert>
     <insert id="batchInsert">
-		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,speed_,xml_url_,create_time_,update_time_)
+		INSERT INTO sys_music_score_accompaniment (exam_song_id_,subject_id_,mp3_url_,speed_,xml_url_,create_time_,update_time_,is_show_fingering_,memo_)
 		VALUES
 		<foreach collection="sysMusicScoreAccompaniments" item="item"  separator=",">
-			(#{sysMusicScoreId},#{item.subjectId},#{item.mp3Url},#{item.speed},#{item.xmlUrl},NOW(),NOW())
+			(#{sysMusicScoreId},#{item.subjectId},#{item.mp3Url},#{item.speed},#{item.xmlUrl},NOW(),NOW(),#{item.isShowFingering},#{item.memo})
 		</foreach>
 	</insert>
 
@@ -59,6 +61,12 @@
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment">
 		UPDATE sys_music_score_accompaniment
 		<set>
+		<if test="isShowFingering != null">
+			is_show_fingering_ = #{isShowFingering},
+		</if>
+		<if test="memo != null">
+			memo_ = #{memo},
+		</if>
 		<if test="subjectId != null">
 			subject_id_ = #{subjectId},
 		</if>
@@ -87,6 +95,12 @@
 		<foreach collection="sysMusicScoreAccompaniments" item="item" separator=";">
 			UPDATE sys_music_score_accompaniment
 			<set>
+				<if test="item.isShowFingering != null">
+					is_show_fingering_ = #{item.isShowFingering},
+				</if>
+				<if test="item.memo != null">
+					memo_ = #{item.memo},
+				</if>
 				<if test="item.speed != null">
 					speed_ = #{item.speed},
 				</if>
@@ -188,6 +202,9 @@
 			<if test="subjectId != null">
 				AND sesa.subject_id_ = #{subjectId}
 			</if>
+			<if test="isShowFingering != null">
+				AND sesa.is_show_fingering_ = #{isShowFingering}
+			</if>
 			<if test="type != null and type == 'COMMON'">
 				AND ses.type_ = #{type}
 			</if>

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

@@ -282,6 +282,7 @@
     <sql id="queryTeacherAttendancesCondition">
         <where>
             cs.del_flag_ = 0
+            AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_)
             <if test="search != null and search != ''">
                 AND (su.id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%') OR cs.id_ = #{search} OR cs.name_ LIKE CONCAT('%',#{search},'%'))
             </if>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/TeacherDefaultPracticeGroupSalaryMapper.xml

@@ -111,4 +111,12 @@
 	<select id="findByTeacherAndCourseMinutes" resultMap="TeacherDefaultPracticeGroupSalary">
 		SELECT * FROM teacher_default_practice_group_salary where user_id_ = #{userId} AND minutes_=#{minutes}
 	</select>
+	<select id="findByTeachersAndCourseMinutes" resultMap="TeacherDefaultPracticeGroupSalary">
+		SELECT * FROM teacher_default_practice_group_salary
+		where minutes_=#{minutes}
+		  AND user_id_ IN
+			<foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+				#{teacherId}
+			</foreach>
+	</select>
 </mapper>

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

@@ -942,7 +942,7 @@ public class RoomServiceImpl implements RoomService {
         if(roomMembers.size() == 0){
             return false;
         }
-        if (data.getExamSongOn() != null) {
+        if (data.getExamSongOn() != null || data.getMusicScoreOn() != null || data.getAccompanimentOn() != null) {
             if(StringUtils.isNotEmpty(data.getUserId())){
                 for (RoomMember e:roomMembers) {
                     data.setUserId(e.getUid());

+ 55 - 13
mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java

@@ -2,17 +2,14 @@ package com.ym.mec.student.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleEvaluateDao;
-import com.ym.mec.biz.dal.dao.PracticeGroupDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.PracticeCourseDto;
 import com.ym.mec.biz.dal.dto.PracticeGroupBuyDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
-import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.GroupStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.service.PracticeGroupService;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -20,15 +17,20 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Author Joburgess
@@ -55,6 +57,8 @@ public class PracticeGroupController extends BaseController {
     private SysConfigDao sysConfigDao;
     @Autowired
     private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
+    @Autowired
+    private StudentDao studentDao;
 
 //    private static final Set<Integer> ENABLE_APPLY_ORGANIDS = new HashSet<>(Arrays.asList(new Integer[]{28,34,37}));
 
@@ -173,12 +177,40 @@ public class PracticeGroupController extends BaseController {
 
     @ApiOperation("获取指定教师的空闲时间——付费")
     @GetMapping(value = "/getPayPracticeTeacherFreeTimes")
-    public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer buyMonths, boolean renew, Long groupId){
+    public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer buyMonths, boolean renew, Long groupId, PracticeGroupType type){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(practiceGroupService.getPayPracticeTeacherFreeTimes(sysUser.getId(),teacherId, buyMonths,renew,groupId));
+        Map payPracticeTeacherFreeTimes = practiceGroupService.getPayPracticeTeacherFreeTimes(sysUser.getId(),teacherId, buyMonths,renew,groupId);
+        if(Objects.nonNull(type)&&PracticeGroupType.COME_ON_PACKAGE.equals(type)){
+            Map<Integer, List<String>> weekNumApplyTimesMap = (Map<Integer, List<String>>) payPracticeTeacherFreeTimes.get("teacherFreeDays");
+            for (Map.Entry<Integer, List<String>> weekNumApplyTimesMapEntry : weekNumApplyTimesMap.entrySet()) {
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
+                Iterator<String> iterator = weekNumApplyTimesMapEntry.getValue().iterator();
+                while (iterator.hasNext()){
+                    String timeStr = iterator.next();
+                    if("23:30:00".equals(timeStr)){
+                        iterator.remove();
+                        continue;
+                    }
+                    LocalTime time = LocalTime.parse(timeStr, dtf);
+                    LocalTime nextTime = time.plusMinutes(30);
+                    if(weekNumApplyTimesMapEntry.getValue().contains(nextTime.format(DateUtil.timeFormatter))){
+                        continue;
+                    }
+                    iterator.remove();
+                }
+            }
+            Iterator<Map.Entry<Integer, List<String>>> iterator = weekNumApplyTimesMap.entrySet().iterator();
+            while (iterator.hasNext()) {
+                Map.Entry<Integer, List<String>> next = iterator.next();
+                if (CollectionUtils.isEmpty(next.getValue())) {
+                    iterator.remove();
+                }
+            }
+        }
+        return succeed(payPracticeTeacherFreeTimes);
     }
 
     @ApiOperation("获取学生上一次的购买信息--付费")
@@ -199,9 +231,15 @@ public class PracticeGroupController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         int studentExitChargePractices = practiceGroupDao.checkStudentExitChargePractice(sysUser.getId(),"2021-03-09 00:00:00");
+        Student student = studentDao.get(sysUser.getId());
         Map<String, Integer> result=new HashMap<>();
         result.put("organId", sysUser.getOrganId());
         result.put("isNewStudent", studentExitChargePractices<=0?0:1);
+
+        List<PracticeGroup> userStatusPracticeGroups = practiceGroupDao.findUserStatusPracticeGroups(sysUser.getId(), null, PracticeGroupType.COME_ON_PACKAGE);
+        long normalGroupNum = userStatusPracticeGroups.stream().filter(p -> GroupStatusEnum.NORMAL.equals(p.getGroupStatus())).count();
+
+        result.put("comeOnPackage", 1==student.getComeOnPackage()&&normalGroupNum<=0?1:0);
         return succeed(result);
     }
 
@@ -217,17 +255,21 @@ public class PracticeGroupController extends BaseController {
             throw new BizException("请联系老师确认您的所属分部");
         }
         practiceGroupBuyParams.setStudentId(sysUser.getId());
-        return practiceGroupService.buyPracticeGroup(practiceGroupBuyParams);
+        if(Objects.isNull(practiceGroupBuyParams.getType())||PracticeGroupType.CHARGE.equals(practiceGroupBuyParams.getType())){
+            return practiceGroupService.buyPracticeGroup(practiceGroupBuyParams);
+        }else{
+            return practiceGroupService.createPackagePracticeGroup(practiceGroupBuyParams);
+        }
     }
 
     @ApiOperation("获取用户历史购买的陪练课")
     @GetMapping(value = "/findUserHistoryBuyPracticeGroups")
-    public HttpResponseResult findUserHistoryBuyPracticeGroups(Long groupId){
+    public HttpResponseResult findUserHistoryBuyPracticeGroups(Long groupId, PracticeGroupType type){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(sysUser.getId(), groupId));
+        return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(sysUser.getId(), groupId, type));
     }
 
     @ApiOperation("查询订单信息")

+ 185 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -62,6 +62,8 @@ public class ExportController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
+    private EmployeeService employeeService;
+    @Autowired
     private EmployeeDao employeeDao;
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
@@ -135,6 +137,8 @@ public class ExportController extends BaseController {
     private ManagerDownloadDao managerDownloadDao;
     @Autowired
     private IdGeneratorService idGeneratorService;
+    @Autowired
+    private MusicGroupQuitService musicGroupQuitService;
 
     @ApiOperation(value = "班级列表导出")
     @PostMapping("export/classGroup")
@@ -464,6 +468,21 @@ public class ExportController extends BaseController {
     @PostMapping("export/teacherSalaryComplaints")
     @PreAuthorize("@pcs.hasPermissions('export/teacherSalaryComplaints')")
     public void exportTeacherSalaryComplaints(HttpServletResponse response, TeacherSalaryModifyQueryInfo queryInfo) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            throw new BizException("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
         List<TeacherSalaryComplaints> rows = teacherSalaryComplaintsService.queryPage(queryInfo).getRows();
@@ -1164,9 +1183,9 @@ public class ExportController extends BaseController {
                     row.setNextPaymentDateStr(DateUtil.format(row.getNextPaymentDate(), DateUtil.DEFAULT_PATTERN));
                 }
             }
-            String[] header = {"学员编号", "学员姓名", "性别", "联系电话", "年级", "班级", "专业", "学员状态", "新增学员", "缴费金额",
+            String[] header = {"学员编号", "学员姓名", "性别", "联系电话", "年级", "班级", "专业", "学员状态", "缴费金额",
                     "下次缴费日期", "是否报名缴费", "是否激活", "是否有剩余VIP", "是否有剩余网管课", "欠费总额"};
-            String[] body = {"userId", "realName", "gender", "phone", "currentGrade", "currentClass", "subjectName", "studentStatus", "isNewStudentStr",
+            String[] body = {"userId", "realName", "gender", "phone", "currentGrade", "currentClass", "subjectName", "studentStatus",
                     "courseFee", "nextPaymentDateStr", "paymentStatus.desc", "activeName", "hasVip ? '是' : '否'", "hasPractice ? '是' : '否'", "noPaymentAmount"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, musicGroupStudentsDtoPageInfo.getRows());
             response.setContentType("application/octet-stream");
@@ -2376,4 +2395,168 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "欠费学员列表导出")
+    @RequestMapping("export/arrearageStudents")
+    @PreAuthorize("@pcs.hasPermissions('export/arrearageStudents')")
+    public void arrearageStudents(ArrearageStudentsQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeService.get(sysUser.getId());
+        if (StringUtils.isBlank(queryInfo.getOrganIds())) {
+            queryInfo.setOrganIds(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            throw new BizException("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganIds().split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        PageInfo<MusicArrearageStudentDto> result = musicGroupPaymentCalenderDetailService.queryArrearageStudents(queryInfo);
+        if (CollectionUtils.isEmpty(result.getRows())) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"学员编号", "学员姓名", "所属分部", "合作单位", "所在乐团", "乐团主管", "声部", "性别", "家长姓名", "家长联系电话", "欠费金额"};
+            String[] body = {"userId", "studentName", "organName", "cooperationName", "musicGroupName", "eduTeacherName", "subjectName", "gender==0?'女':'男'", "parentName", "phone", "noPaymentAmount"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "退团申请列表导出")
+    @RequestMapping("export/musicGroupQuit")
+    @PreAuthorize("@pcs.hasPermissions('export/musicGroupQuit')")
+    public void musicGroupQuit(MusicGroupQuitQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeService.get(sysUser.getId());
+        if (StringUtils.isBlank(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            throw new BizException("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        PageInfo<MusicGroupQuit> result = musicGroupQuitService.queryPage(queryInfo);
+        if (CollectionUtils.isEmpty(result.getRows())) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"学员编号", "学员姓名", "所属乐团", "申请时间", "退团原因", "状态"};
+            String[] body = {"userId", "user.username", "musicGroup.name", "createTime", "userComment", "status.getMsg()"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "服务指标明细导出")
+    @RequestMapping("export/teacherServeInfo")
+    @PreAuthorize("@pcs.hasPermissions('export/teacherServeInfo')")
+    public void teacherServeInfo(TeacherServeQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeService.get(sysUser.getId());
+        if (StringUtils.isBlank(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            throw new BizException("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                throw new BizException("非法请求");
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        PageInfo<TeacherServeDto> result = studentExtracurricularExercisesSituationService.queryTeacherServeInfo(queryInfo);
+        if (CollectionUtils.isEmpty(result.getRows())) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+
+        for (TeacherServeDto row : result.getRows()) {
+            row.setDateRange(com.ym.mec.util.date.DateUtil.dateToString(row.getMonday(), "yyyy-MM-dd") + '~' + com.ym.mec.util.date.DateUtil.dateToString(row.getSunday(), "yyyy-MM-dd"));
+        }
+
+        try {
+            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)", "是否异常", "提醒时间", "操作人"};
+            String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum", "unDone==0?'否':'是'", "remindDate", "operatorName"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 2 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -80,7 +80,8 @@ public class ImGroupController extends BaseController {
 	@ApiOperation("修改群成员信息")
 	@PostMapping(value = "/updateNickName")
 	public Object updateNickName(Integer userId,String nickName) {
-		return succeed(imGroupService.updateNickName(userId,nickName));
+		imGroupService.updateNickName1(userId,nickName);
+		return succeed();
 	}
 
 	@ApiOperation("查询群成员列表")

+ 16 - 10
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupQuitController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.page.MusicGroupQuitQueryInfo;
 import com.ym.mec.biz.service.EmployeeService;
@@ -55,17 +56,22 @@ public class MusicGroupQuitController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
-			Employee employee = employeeService.get(sysUser.getId());
-			if (StringUtils.isBlank(queryInfo.getOrganId())) {
-				queryInfo.setOrganId(employee.getOrganIdList());
-			}else if(StringUtils.isEmpty(employee.getOrganIdList())){
-				return failed("用户所在分部异常");
-			}else {
-				List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-				if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-					return failed("非法请求");
-				}
+		Employee employee = employeeService.get(sysUser.getId());
+		if (StringUtils.isBlank(queryInfo.getOrganId())) {
+			queryInfo.setOrganId(employee.getOrganIdList());
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+				return failed("非法请求");
 			}
+		}
+		List<Integer> userRole = employeeService.queryUserRole(sysUser.getId());
+		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
+		if (userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			queryInfo.setEducationUserId(sysUser.getId());
+		}
 		return succeed(musicGroupQuitService.queryPage(queryInfo));
 	}
 

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

@@ -45,6 +45,13 @@ public class OrganizationController extends BaseController {
         return succeed(organizationService.queryEmployeeOrgan());
     }
 
+    @ApiOperation(value = "获取员工所在分部列表(管理员查看所有的分部)")
+    @GetMapping("/queryEmployeeOrganByUser")
+    @PreAuthorize("@pcs.hasPermissions('organization/queryEmployeeOrganByUser')")
+    public Object queryEmployeeOrganByUser() throws Exception {
+        return succeed(organizationService.queryEmployeeOrganByUser());
+    }
+
     @ApiOperation(value = "新增分部")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('organization/add')")

+ 100 - 14
mec-web/src/main/java/com/ym/mec/web/controller/StudentRepairController.java

@@ -1,18 +1,27 @@
 package com.ym.mec.web.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.RepairGoodsDto;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.StudentRepair;
+import com.ym.mec.biz.dal.page.CooperationOrganQueryInfo;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
 import com.ym.mec.biz.service.StudentRepairService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -21,10 +30,15 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @RequestMapping("studentRepair")
 @Api(tags = "维修服务")
@@ -46,20 +60,20 @@ public class StudentRepairController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getOrganIdList())) {
-                queryInfo.setOrganIdList(employee.getOrganIdList());
-            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
-                return failed("用户所在分部异常");
-            }else {
-                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
-                    return failed("非法请求");
-                }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+            queryInfo.setOrganIdList(employee.getOrganIdList());
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        } else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if (!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))) {
+                return failed("非法请求");
             }
+        }
         Date endTime = queryInfo.getEndTime();
-        if(endTime != null){
-            queryInfo.setEndTime(DateUtil.addDays(endTime, 1));
+        if (endTime != null) {
+            queryInfo.setEndTime(DateUtil.getLastTimeWithDay(endTime));
         }
         queryInfo.setPayStatus(2);
         return succeed(studentRepairService.queryPage(queryInfo));
@@ -69,8 +83,80 @@ public class StudentRepairController extends BaseController {
     @ApiOperation("维修完成")
     @PostMapping(value = "/repairSuccess")
     @PreAuthorize("@pcs.hasPermissions('studentRepair/repairSuccess')")
-    public HttpResponseResult repairSuccess(Integer id,String description,Integer repairStatus) {
-        studentRepairService.repairSuccess(id,description,repairStatus);
+    public HttpResponseResult repairSuccess(Integer id, String description, Integer repairStatus) {
+        studentRepairService.repairSuccess(id, description, repairStatus);
         return succeed();
     }
+
+    @ApiOperation(value = "维修记录导出")
+    @RequestMapping("/export")
+    @PreAuthorize("@pcs.hasPermissions('studentRepair/export')")
+    public void export(RepairStudentQueryInfo queryInfo, HttpServletResponse response) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+            queryInfo.setOrganIdList(employee.getOrganIdList());
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+            throw new BizException("用户所在分部异常");
+        } else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if (!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))) {
+                throw new BizException("非法请求");
+            }
+        }
+        Date endTime = queryInfo.getEndTime();
+        if (endTime != null) {
+            queryInfo.setEndTime(DateUtil.getLastTimeWithDay(endTime));
+        }
+        queryInfo.setPayStatus(2);
+        queryInfo.setRows(65000);
+
+        PageInfo<StudentRepair> pageList = studentRepairService.queryPage(queryInfo);
+
+        if (pageList.getTotal() <= 0) {
+            throw new BizException("没有可导出的记录");
+        }
+        for (StudentRepair row : pageList.getRows()) {
+            if (row.getGoodsJson() == null || row.getGoodsJson().equals("[]")) {
+                row.setAmount(row.getAmount().subtract(row.getExemptionAmount()));
+                row.setGoodsJson("");
+                continue;
+            }
+            List<RepairGoodsDto> repairGoodsDtos = JSONObject.parseArray(row.getGoodsJson(), RepairGoodsDto.class);
+            BigDecimal repairGoodsAmount = repairGoodsDtos.stream().map(RepairGoodsDto::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal goodsRouteAmount = (row.getAmount().add(repairGoodsAmount).subtract(row.getExemptionAmount())).multiply(repairGoodsAmount).divide(row.getAmount().add(repairGoodsAmount), 2, BigDecimal.ROUND_DOWN);
+            BigDecimal repairRouteAmount = row.getAmount().add(repairGoodsAmount).subtract(row.getExemptionAmount()).subtract(goodsRouteAmount);
+            String goodiesStr = repairGoodsDtos.stream().map(RepairGoodsDto::getName).collect(Collectors.joining(","));
+            row.setGoodsJson(goodiesStr);
+            row.setRepairGoodsAmount(goodsRouteAmount);
+            row.setAmount(repairRouteAmount);
+        }
+
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"维修单号", "分部", "学生姓名", "学生编号", "维修技师", "维修类型", "维修单名称", "送修日期", "完成日期", "状态", "维修服务费", "商品价格", "销售商品"};
+            String[] body = {"transNo", "organName", "studentName", "studentId", "employeeName", "type == 0 ? '线下' : '线上'", "repairName", "createTime", "finishTime", "repairStatus == 0 ? '维修中' : '已完成'", "amount", "repairGoodsAmount", "goodsJson"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, pageList.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=repairList-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 10 - 10
mec-web/src/main/java/com/ym/mec/web/controller/TeacherSalaryComplaintsController.java

@@ -39,17 +39,17 @@ public class TeacherSalaryComplaintsController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
-                queryInfo.setOrganId(employee.getOrganIdList());
-            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
-                return failed("用户所在分部异常");
-            }else {
-                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-                    return failed("非法请求");
-                }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            return failed("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                return failed("非法请求");
             }
+        }
         return succeed(teacherSalaryComplaintsService.queryPage(queryInfo));
     }
 

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/education/EduPracticeGroupController.java

@@ -202,7 +202,7 @@ public class EduPracticeGroupController extends BaseController {
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(studentId, groupId));
+        return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(studentId, groupId, null));
     }
 
     @ApiOperation("查询订单信息")