瀏覽代碼

Merge branch 'master' of http://git.dayaedu.com/yonge/mec into online1

zouxuan 4 年之前
父節點
當前提交
1f6391df30
共有 96 個文件被更改,包括 3441 次插入353 次删除
  1. 2 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java
  2. 35 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/CustomAuthenticationKeyGenerator.java
  3. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayDegreeDetailDao.java
  4. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayDegreeInfoDao.java
  5. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayReserveDao.java
  6. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CooperationOrganDao.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  9. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  12. 21 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  13. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  14. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  15. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenDayDetailDto.java
  16. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenDayMsgDto.java
  17. 112 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenStatisticsDetailDto.java
  18. 60 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenStatisticsDto.java
  19. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/DegreePayDto.java
  20. 140 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduHomeworkCardDto.java
  21. 90 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduHomeworkStatDto.java
  22. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java
  23. 232 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChildrenDayDegreeInfo.java
  24. 46 31
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChildrenDayReserve.java
  25. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CooperationOrgan.java
  26. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  27. 62 18
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/OrganizationDegreeCourseFee.java
  28. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EmployeeRoleEnum.java
  29. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java
  30. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  31. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java
  32. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ChildrenReserveQueryInfo.java
  33. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CooperationOrganQueryInfo.java
  34. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleQueryInfo.java
  35. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCourseHomeWorkQueryInfo.java
  36. 21 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ChildrenDayDegreeDetailService.java
  37. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ChildrenDayDegreeInfoService.java
  38. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ChildrenDayReserveService.java
  39. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CooperationOrganService.java
  40. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  41. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesReplyService.java
  42. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  43. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java
  44. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  45. 47 60
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeDetailServiceImpl.java
  46. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java
  47. 173 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayReserveServiceImpl.java
  48. 26 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  49. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  50. 126 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CooperationOrganServiceImpl.java
  51. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  52. 79 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  53. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  54. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  55. 46 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  56. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  57. 85 22
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  58. 37 50
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java
  59. 139 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  60. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  61. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  62. 13 0
      mec-biz/src/main/resources/config/mybatis/ChildrenDayDegreeDetailDao.xml
  63. 116 0
      mec-biz/src/main/resources/config/mybatis/ChildrenDayDegreeInfoDao.xml
  64. 178 10
      mec-biz/src/main/resources/config/mybatis/ChildrenDayReserveMapper.xml
  65. 30 7
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  66. 26 23
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  67. 18 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  68. 3 3
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  69. 93 1
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  70. 6 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  71. 13 1
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  72. 15 6
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  73. 14 3
      mec-biz/src/main/resources/config/mybatis/OrganizationDegreeCourseFeeMapper.xml
  74. 109 2
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  75. 10 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  76. 15 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/dao/OperationLogDao.java
  77. 81 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/model/OperationLog.java
  78. 8 0
      mec-common/audit-log/src/main/java/com/yonge/log/service/OperationLogService.java
  79. 0 1
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/AuditLogServiceImpl.java
  80. 22 0
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/OperationLogServiceImpl.java
  81. 3 3
      mec-common/common-core/pom.xml
  82. 26 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupModel.java
  83. 1 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  84. 13 2
      mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java
  85. 55 0
      mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayDegreeDetailController.java
  86. 4 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  87. 9 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  88. 26 6
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  89. 17 7
      mec-util/src/main/java/com/ym/mec/util/http/HttpUtil.java
  90. 14 5
      mec-web/src/main/java/com/ym/mec/web/controller/ChildrenReserveController.java
  91. 8 1
      mec-web/src/main/java/com/ym/mec/web/controller/CooperationOrganController.java
  92. 12 7
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  93. 58 4
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  94. 37 0
      mec-web/src/main/java/com/ym/mec/web/controller/OperationLogController.java
  95. 82 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/CourseHomeworkController.java
  96. 14 1
      mec-web/src/main/java/com/ym/mec/web/controller/education/EducationCourseScheduleController.java

+ 2 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java

@@ -16,6 +16,7 @@ import org.springframework.security.oauth2.config.annotation.web.configurers.Aut
 import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
 import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
 
+import com.ym.mec.auth.core.service.CustomAuthenticationKeyGenerator;
 import com.ym.mec.auth.core.service.CustomTokenServices;
 import com.ym.mec.common.constant.CommonConstants;
 
@@ -65,6 +66,7 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
 	@Bean
 	public RedisTokenStore redisTokenStore() {
 		RedisTokenStore tokenStore = new RedisTokenStore(connectionFactory);
+		tokenStore.setAuthenticationKeyGenerator(new CustomAuthenticationKeyGenerator());
 		tokenStore.setPrefix(CommonConstants.OAUTH_PREFIX);
 		return tokenStore;
 	}

+ 35 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/service/CustomAuthenticationKeyGenerator.java

@@ -0,0 +1,35 @@
+package com.ym.mec.auth.core.service;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TreeSet;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.oauth2.common.util.OAuth2Utils;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.OAuth2Request;
+import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;
+
+public class CustomAuthenticationKeyGenerator extends DefaultAuthenticationKeyGenerator {
+	
+	private static final String CLIENT_ID = "client_id";
+
+	private static final String SCOPE = "scope";
+
+	private static final String USERNAME = "username";
+
+	@Override
+	public String extractKey(OAuth2Authentication authentication) {
+		Map<String, String> values = new LinkedHashMap<String, String>();
+		OAuth2Request authorizationRequest = authentication.getOAuth2Request();
+		if (!authentication.isClientOnly()) {
+			values.put(USERNAME, StringUtils.substringAfter(authentication.getName(), ":"));
+		}
+		values.put(CLIENT_ID, authorizationRequest.getClientId());
+		if (authorizationRequest.getScope() != null) {
+			values.put(SCOPE, OAuth2Utils.formatParameterList(new TreeSet<String>(authorizationRequest.getScope())));
+		}
+		return generateKey(values);
+	}
+
+}

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayDegreeDetailDao.java

@@ -23,4 +23,21 @@ public interface ChildrenDayDegreeDetailDao extends BaseDAO<Integer, ChildrenDay
      * @return
      */
     int batchAdd(@Param("details") List<ChildrenDayDegreeDetail> details);
+
+    /**
+     * 跟新状态信息
+     *
+     * @param orderId
+     * @param status
+     * @return
+     */
+    int updateStatus(@Param("orderId") Long orderId, @Param("status") Integer status);
+
+
+    /**
+     * 根据订单id获取购买详情
+     * @param orderId
+     * @return
+     */
+    List<ChildrenDayDegreeDetail> getByOrderId(@Param("orderId") Long orderId);
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayDegreeInfoDao.java

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ChildrenDayDegreeInfoDao extends BaseDAO<Integer, ChildrenDayDegreeInfo> {
+
+    /**
+     * 获取已缴费的用户
+     *
+     * @param userIds
+     * @return
+     */
+    List<Integer> getPayedUser(@Param("userIds") List<Integer> userIds);
+}

+ 39 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ChildrenDayReserveDao.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
 
+import com.ym.mec.biz.dal.dto.ChildrenDayMsgDto;
 import com.ym.mec.biz.dal.dto.ChildrenStatisticsDetailDto;
 import com.ym.mec.biz.dal.dto.ChildrenStatisticsDto;
 import com.ym.mec.biz.dal.entity.ChildrenDayReserve;
+import com.ym.mec.biz.dal.page.ChildrenReserveQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,6 +16,7 @@ public interface ChildrenDayReserveDao extends BaseDAO<Integer, ChildrenDayReser
 
     /**
      * 获取后台考级活动列表
+     *
      * @param params
      * @return
      */
@@ -21,6 +24,7 @@ public interface ChildrenDayReserveDao extends BaseDAO<Integer, ChildrenDayReser
 
     /**
      * 获取后台考级活动列表
+     *
      * @param params
      * @return
      */
@@ -28,6 +32,7 @@ public interface ChildrenDayReserveDao extends BaseDAO<Integer, ChildrenDayReser
 
     /**
      * 根据用户id获取用户预约信息
+     *
      * @param userId
      * @return
      */
@@ -35,6 +40,7 @@ public interface ChildrenDayReserveDao extends BaseDAO<Integer, ChildrenDayReser
 
     /**
      * 获取后台考级活动详情列表
+     *
      * @param params
      * @return
      */
@@ -42,8 +48,41 @@ public interface ChildrenDayReserveDao extends BaseDAO<Integer, ChildrenDayReser
 
     /**
      * 获取后台考级活动详情列表
+     *
      * @param params
      * @return
      */
     List<ChildrenStatisticsDetailDto> queryChildrenStatisticsDetail(Map<String, Object> params);
+
+    /**
+     * 统计
+     *
+     * @param params
+     * @return
+     */
+    ChildrenStatisticsDto childrenStatistics(Map<String, Object> params);
+
+    /**
+     * 导出详情
+     *
+     * @param queryInfo
+     * @return
+     */
+    List<ChildrenStatisticsDetailDto> exportStatisticsDetail(ChildrenReserveQueryInfo queryInfo);
+
+    /**
+     * 获取发送的信息的用户
+     *
+     * @param msgDtos
+     * @return
+     */
+    List<ChildrenStatisticsDetailDto> getSendMsgList(@Param("msgDtos") List<ChildrenDayMsgDto> msgDtos);
+
+
+    /**
+     * 修改发送短信的状态
+     *
+     * @param userIds
+     */
+    Integer updateSendMasStatus(@Param("userIds") List<Integer> userIds);
 }

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

@@ -235,6 +235,22 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     List<ImGroupModel> queryTeacherQuitGroups(@Param("userId") Integer userId);
 
     /**
+     * 获取员工关联的预报名的群聊
+     *
+     * @param userId
+     * @return
+     */
+    List<ImGroupModel> queryQuitApplyGroups(@Param("userId") Integer userId);
+
+    /**
+     * 获取员工关联的预报名的群聊
+     *
+     * @param userId
+     * @return
+     */
+    List<ImGroupModel> queryApplyGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);
+
+    /**
      * 获取教务老师关联的群列表
      *
      * @param userId

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CooperationOrganDao.java

@@ -54,4 +54,12 @@ public interface CooperationOrganDao extends BaseDAO<Integer, CooperationOrgan>
      * @return
      */
     List<CooperationOrgan> getCooperationOrganByIds(@Param("ids") List<Integer> ids);
+
+    /**
+     * 修改合作单位乐团主管
+     * @param transferUserId
+     * @param levelUserId
+     * @param organId
+     */
+    void batchUpdateEduId(@Param("transferUserId") Integer transferUserId, @Param("levelUserId") Integer levelUserId, @Param("organId") Integer organId);
 }

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

@@ -428,7 +428,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     List<Date> getCourseScheduleDateWithOrgan(@Param("organIds") List<Integer> organIds,
                                               @Param("month") Date month,
-                                              @Param("type") String type);
+                                              @Param("type") String type,
+                                              @Param("transactionTeacherId") Integer transactionTeacherId);
 
     /**
      * @Author: Joburgess

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesReplyDao.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.dto.StudentServiceDetailDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
@@ -7,6 +8,7 @@ import com.ym.mec.biz.dal.dto.StudentServiceHomeworkDto;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -122,4 +124,24 @@ public interface ExtracurricularExercisesReplyDao extends BaseDAO<Long, Extracur
     Set<Integer> checkStudentHaveExercisesInDateRange(@Param("startDate") String startDate,
                                                      @Param("endDate") String endDate,
                                                      @Param("studentIds") List<Integer> studentIds);
+
+
+
+    /**
+     * @describe 获取课外训练列表-教务端
+     * @author Joburgess
+     * @date 2021/5/24 0024
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.EduHomeworkCardDto>
+     */
+    List<EduHomeworkCardDto> getEduHomeworkList(Map<String, Object> params);
+    int countEduHomeworkList(Map<String, Object> params);
+
+    List<EduHomeworkCardDto> countEduHomeworkStudentNumWithMusicGroup(@Param("groupIds") List<String> groupIds,
+                                                                      @Param("startTime") Date startTime,
+                                                                      @Param("endTime") Date endTime);
+
+    List<EduHomeworkCardDto> countEduHomeworkSubjectStudentNumWithMusicGroup(@Param("groupId") String groupId,
+                                                                             @Param("startTime") Date startTime,
+                                                                             @Param("endTime") Date endTime);
 }

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

@@ -32,4 +32,6 @@ public interface ImGroupDao extends BaseDAO<Long, ImGroup> {
     int updateNickname(@Param("userId") Integer userId, @Param("nickName") String nickName);
 
 	int updateUserFriendNickname(@Param("userId") Integer userId, @Param("nickName") String nickName);
+
+    void updateMemberNum();
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.dao;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +20,11 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
 	int batchUpdate(List<ImGroupMember> imGroupMemberList);
 	
 	int batchInsert(List<ImGroupMember> imGroupMemberList);
+
+	void batchDeleteByGroupIdAndUserId(List<ImGroupMember> imGroupMemberList);
+
+	boolean isExit(@Param("groupId") String groupId, @Param("userId") String userId);
+
+	void delRepeat();
+
 }

+ 21 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -399,6 +399,27 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
     List<Map<Long, String>> queryEduNameMapByCourseId(@Param("courseIds") List<Long> courseIds);
 
     /**
+     * 根据合作单位获取乐团列表
+     * @param cooperationOrganId
+     * @return
+     */
+    List<MusicGroup> findByCooperationIdAndStatus(Integer cooperationOrganId);
+
+    /**
+     * 根据合作单位获取乐团列表
+     * @param cooperationOrganId
+     * @return
+     */
+    List<MusicGroup> findByCooperationId(@Param("cooperationId") Integer cooperationOrganId);
+
+    /**
+     * 批量修改乐团主管
+     * @param cooperationOrganId
+     * @param educationUserId
+     */
+    void batchUpdateEdu(@Param("cooperationOrganId") Integer cooperationOrganId, @Param("educationUserId") Integer educationUserId);
+
+    /**
      * 获取学生最新的乐团
      *
      * @param userId
@@ -406,5 +427,4 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      */
     MusicGroup getStudentLastMusicGroup(@Param("userId") Integer userId);
 
-    List<MusicGroup> findByCooperationId(@Param("cooperationId") Integer cooperationOrganId, @Param("musicStatus") String musicStatus);
 }

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

@@ -7,6 +7,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -63,6 +64,7 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
      * @date 2019/10/20
      */
     List<StudentCourseHomework> findByCourseSchedule(@Param("courseScheduleId") Long courseScheduleId,
+                                                     @Param("homeworkId") Long homeworkId,
                                                      @Param("userName") String userName);
 
     /**
@@ -165,4 +167,28 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
      * @return
      */
     int getStudentCourseHomeWorksCount(Map<String, Object> params);
+
+    /**
+     * @describe 获取作业列表-教务端
+     * @author Joburgess
+     * @date 2021/5/24 0024
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.EduHomeworkCardDto>
+     */
+    List<EduHomeworkCardDto> getEduCourseHomeworkList(Map<String, Object> params);
+    int countEduCourseHomeworkList(Map<String, Object> params);
+
+    /**
+     * @describe 统计指定乐团作业人次信息
+     * @author Joburgess
+     * @date 2021/5/25 0025
+     * @param groupIds:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.EduHomeworkCardDto>
+     */
+    List<EduHomeworkCardDto> countHomeworkStudentInfoWithMusicGroup(@Param("groupIds") List<String> groupIds,
+                                                                    @Param("startTime") Date startTime,
+                                                                    @Param("endTime") Date endTime);
+    List<EduHomeworkCardDto> countHomeworkSubjectStudentInfoWithMusicGroup(@Param("groupId") String groupId,
+                                                                           @Param("startTime") Date startTime,
+                                                                           @Param("endTime") Date endTime);
 }

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

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.Subject;
 
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -525,4 +526,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     int quitAllStudent(@Param("musicGroupId") String musicGroupId, @Param("remark") String remark);
+
+    /**
+     * @describe 获取指定乐团中的注册学员
+     * @author Joburgess
+     * @date 2021/5/24 0024
+     * @param groupIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentRegistration>
+     */
+    List<StudentRegistration> findByMusicGroupIds(@Param("groupIds") List<String> groupIds,
+                                                  @Param("musicGroupStatus") StudentMusicGroupStatusEnum musicGroupStatus);
 }

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenDayDetailDto.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class ChildrenDayDetailDto {
+
+    @ApiModelProperty(value = "用户信息", required = false)
+    private SysUser user;
+
+    @ApiModelProperty(value = "声部id", required = false)
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "购买信息详情", required = false)
+    private List<ChildrenDayDegreeDetail> childrenDayDegreeDetails;
+
+    public SysUser getUser() {
+        return user;
+    }
+
+    public void setUser(SysUser user) {
+        this.user = user;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public List<ChildrenDayDegreeDetail> getChildrenDayDegreeDetails() {
+        return childrenDayDegreeDetails;
+    }
+
+    public void setChildrenDayDegreeDetails(List<ChildrenDayDegreeDetail> childrenDayDegreeDetails) {
+        this.childrenDayDegreeDetails = childrenDayDegreeDetails;
+    }
+}

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenDayMsgDto.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+
+public class ChildrenDayMsgDto {
+
+    @ApiModelProperty(value = "分部id", required = false)
+    private Integer organId;
+
+    @ApiModelProperty(value = "乐团id", required = false)
+    private String musicGroupId;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+}

+ 112 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenStatisticsDetailDto.java

@@ -1,6 +1,18 @@
 package com.ym.mec.biz.dal.dto;
 
+import java.math.BigDecimal;
+
 public class ChildrenStatisticsDetailDto {
+    private String organName;
+
+    private String cooperationOrganName;
+
+    private String musicGroupName;
+
+    private String currentClass;
+
+    private String realName;
+
     private String username;
 
     private String phone;
@@ -9,6 +21,106 @@ public class ChildrenStatisticsDetailDto {
 
     private boolean isReserve = false;
 
+    private String subjectName;
+
+    private String theoryLevel;
+
+    private String gradeLeave;
+
+    private boolean buyVipFlag = false;
+
+    private boolean buyTheoryCourseFlag = false;
+
+    private BigDecimal totalAmount = BigDecimal.ZERO;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getCooperationOrganName() {
+        return cooperationOrganName;
+    }
+
+    public void setCooperationOrganName(String cooperationOrganName) {
+        this.cooperationOrganName = cooperationOrganName;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getCurrentClass() {
+        return currentClass;
+    }
+
+    public void setCurrentClass(String currentClass) {
+        this.currentClass = currentClass;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getTheoryLevel() {
+        return theoryLevel;
+    }
+
+    public void setTheoryLevel(String theoryLevel) {
+        this.theoryLevel = theoryLevel;
+    }
+
+    public String getGradeLeave() {
+        return gradeLeave;
+    }
+
+    public void setGradeLeave(String gradeLeave) {
+        this.gradeLeave = gradeLeave;
+    }
+
+    public boolean isBuyVipFlag() {
+        return buyVipFlag;
+    }
+
+    public void setBuyVipFlag(boolean buyVipFlag) {
+        this.buyVipFlag = buyVipFlag;
+    }
+
+    public boolean isBuyTheoryCourseFlag() {
+        return buyTheoryCourseFlag;
+    }
+
+    public void setBuyTheoryCourseFlag(boolean buyTheoryCourseFlag) {
+        this.buyTheoryCourseFlag = buyTheoryCourseFlag;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
     public String getPhone() {
         return phone;
     }

+ 60 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ChildrenStatisticsDto.java

@@ -26,14 +26,40 @@ public class ChildrenStatisticsDto {
 
     private Integer musicTheoryNum = 0;
 
-    private Integer buyVipNum = 0;
+    private Integer buyVip1Num = 0;
 
-    private BigDecimal buyVipAmount = BigDecimal.ZERO;
+    private BigDecimal buyVip1Amount = BigDecimal.ZERO;
+
+    private Integer buyVip2Num = 0;
+
+    private BigDecimal buyVip2Amount = BigDecimal.ZERO;
 
     private Integer buyMusicTheoryNum = 0;
 
     private BigDecimal buyMusicTheoryAmount = BigDecimal.ZERO;
 
+    private BigDecimal theoryPrice = BigDecimal.ZERO;
+
+    private BigDecimal gradePrice = BigDecimal.ZERO;
+
+    private BigDecimal totalAmount = BigDecimal.ZERO;
+
+    public BigDecimal getTheoryPrice() {
+        return theoryPrice;
+    }
+
+    public void setTheoryPrice(BigDecimal theoryPrice) {
+        this.theoryPrice = theoryPrice;
+    }
+
+    public BigDecimal getGradePrice() {
+        return gradePrice;
+    }
+
+    public void setGradePrice(BigDecimal gradePrice) {
+        this.gradePrice = gradePrice;
+    }
+
     public Integer getOrganId() {
         return organId;
     }
@@ -122,20 +148,44 @@ public class ChildrenStatisticsDto {
         this.musicTheoryNum = musicTheoryNum;
     }
 
-    public Integer getBuyVipNum() {
-        return buyVipNum;
+    public Integer getBuyVip1Num() {
+        return buyVip1Num;
+    }
+
+    public void setBuyVip1Num(Integer buyVip1Num) {
+        this.buyVip1Num = buyVip1Num;
+    }
+
+    public BigDecimal getBuyVip1Amount() {
+        return buyVip1Amount;
+    }
+
+    public void setBuyVip1Amount(BigDecimal buyVip1Amount) {
+        this.buyVip1Amount = buyVip1Amount;
+    }
+
+    public Integer getBuyVip2Num() {
+        return buyVip2Num;
+    }
+
+    public void setBuyVip2Num(Integer buyVip2Num) {
+        this.buyVip2Num = buyVip2Num;
+    }
+
+    public BigDecimal getBuyVip2Amount() {
+        return buyVip2Amount;
     }
 
-    public void setBuyVipNum(Integer buyVipNum) {
-        this.buyVipNum = buyVipNum;
+    public void setBuyVip2Amount(BigDecimal buyVip2Amount) {
+        this.buyVip2Amount = buyVip2Amount;
     }
 
-    public BigDecimal getBuyVipAmount() {
-        return buyVipAmount;
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
     }
 
-    public void setBuyVipAmount(BigDecimal buyVipAmount) {
-        this.buyVipAmount = buyVipAmount;
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
     }
 
     public Integer getBuyMusicTheoryNum() {

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

@@ -16,6 +16,9 @@ public class DegreePayDto {
     @ApiModelProperty(value = "器乐考级等级")
     private Integer musicGradeLevel;
 
+    @ApiModelProperty(value = "报考器乐等级必须购Vip课")
+    private Boolean needVipCourse = false;
+
     @ApiModelProperty(value = "乐理等级")
     private Integer theoryLevel;
 
@@ -154,4 +157,12 @@ public class DegreePayDto {
     public void setReserveId(Integer reserveId) {
         this.reserveId = reserveId;
     }
+
+    public Boolean getNeedVipCourse() {
+        return needVipCourse;
+    }
+
+    public void setNeedVipCourse(Boolean needVipCourse) {
+        this.needVipCourse = needVipCourse;
+    }
 }

+ 140 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduHomeworkCardDto.java

@@ -0,0 +1,140 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/24 0024
+ */
+public class EduHomeworkCardDto {
+
+    private String groupId;
+
+    private Integer subjectId;
+
+    private Long courseId;
+
+    private Long homeworkId;
+
+    private String content;
+
+    private String courseName;
+
+    private Date courseStartTime;
+
+    private Integer teacherId;
+
+    private String teacherName;
+
+    private Integer exceptStudentNum;
+
+    private Integer submitStudentNum;
+
+    private Integer repliedStudentNum;
+
+    private Date createTime;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getHomeworkId() {
+        return homeworkId;
+    }
+
+    public void setHomeworkId(Long homeworkId) {
+        this.homeworkId = homeworkId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Date getCourseStartTime() {
+        return courseStartTime;
+    }
+
+    public void setCourseStartTime(Date courseStartTime) {
+        this.courseStartTime = courseStartTime;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Integer getExceptStudentNum() {
+        return exceptStudentNum;
+    }
+
+    public void setExceptStudentNum(Integer exceptStudentNum) {
+        this.exceptStudentNum = exceptStudentNum;
+    }
+
+    public Integer getSubmitStudentNum() {
+        return submitStudentNum;
+    }
+
+    public void setSubmitStudentNum(Integer submitStudentNum) {
+        this.submitStudentNum = submitStudentNum;
+    }
+
+    public Integer getRepliedStudentNum() {
+        return repliedStudentNum;
+    }
+
+    public void setRepliedStudentNum(Integer repliedStudentNum) {
+        this.repliedStudentNum = repliedStudentNum;
+    }
+}

+ 90 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduHomeworkStatDto.java

@@ -0,0 +1,90 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/24 0024
+ */
+public class EduHomeworkStatDto {
+
+    @ApiModelProperty(value = "课程组编号")
+    private String groupId;
+
+    @ApiModelProperty(value = "课程组名称")
+    private String groupName;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectName;
+
+    @ApiModelProperty(value = "乐团人数")
+    private int groupStudentNum;
+
+    @ApiModelProperty(value = "作业人次")
+    private int exceptStudentNum;
+
+    @ApiModelProperty(value = "提交人次")
+    private int submitStudentNum;
+
+    @ApiModelProperty(value = "提交率")
+    private BigDecimal submitRate = BigDecimal.ZERO;
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public int getExceptStudentNum() {
+        return exceptStudentNum;
+    }
+
+    public void setExceptStudentNum(int exceptStudentNum) {
+        this.exceptStudentNum = exceptStudentNum;
+    }
+
+    public int getSubmitStudentNum() {
+        return submitStudentNum;
+    }
+
+    public void setSubmitStudentNum(int submitStudentNum) {
+        this.submitStudentNum = submitStudentNum;
+    }
+
+    public int getGroupStudentNum() {
+        return groupStudentNum;
+    }
+
+    public void setGroupStudentNum(int groupStudentNum) {
+        this.groupStudentNum = groupStudentNum;
+    }
+
+    public BigDecimal getSubmitRate() {
+        return submitRate;
+    }
+
+    public void setSubmitRate(BigDecimal submitRate) {
+        this.submitRate = submitRate;
+    }
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExtraExerciseStudentsDto.java

@@ -23,6 +23,8 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
 
     private String content;
 
+    private String phone;
+
     private java.util.Date expireDate;
 
     private String statusStr;
@@ -43,6 +45,14 @@ public class ExtraExerciseStudentsDto extends ExtracurricularExercisesReply {
         this.headUrl = headUrl;
     }
 
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
     public String getIsRepliedTimelyStr() {
         return isRepliedTimelyStr;
     }

+ 232 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChildrenDayDegreeInfo.java

@@ -0,0 +1,232 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@ApiModel(value = "com-domain-ChildrenDayDegreeInfo")
+public class ChildrenDayDegreeInfo {
+    @ApiModelProperty(value = "")
+    private Integer id;
+
+    /**
+     * 预约id
+     */
+    @ApiModelProperty(value = "预约id")
+    private Integer reserveId;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    /**
+     * 声部id
+     */
+    @ApiModelProperty(value = "声部id")
+    private Integer subjectId;
+
+    /**
+     * 器乐等级
+     */
+    @ApiModelProperty(value = "器乐等级")
+    private Integer gradeLevel;
+
+    /**
+     * 器乐支付金额
+     */
+    @ApiModelProperty(value = "器乐支付金额")
+    private BigDecimal gradePrice = BigDecimal.ZERO;
+
+    /**
+     * 乐理等级
+     */
+    @ApiModelProperty(value = "乐理等级")
+    private Integer theoryLevel;
+
+    /**
+     * 乐理支付金额
+     */
+    @ApiModelProperty(value = "乐理支付金额")
+    private BigDecimal theoryPrice = BigDecimal.ZERO;
+
+    /**
+     * vip 1v1支付价格
+     */
+    @ApiModelProperty(value = "vip 1v1支付价格")
+    private BigDecimal vip1v1Price = BigDecimal.ZERO;
+
+    /**
+     * vip 1v2支付价格
+     */
+    @ApiModelProperty(value = "vip 1v2支付价格")
+    private BigDecimal vip1v2Price = BigDecimal.ZERO;
+
+    /**
+     * 乐理课支付价格
+     */
+    @ApiModelProperty(value = "乐理课支付价格")
+    private BigDecimal theoryCoursePrice = BigDecimal.ZERO;
+
+    /**
+     * 支付总金额
+     */
+    @ApiModelProperty(value = "支付总金额")
+    private BigDecimal totalAmount = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "订单编号")
+    private Long orderId;
+
+    @ApiModelProperty(value = "")
+    private Date createTime;
+
+    @ApiModelProperty(value = "")
+    private Date updateTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getReserveId() {
+        return reserveId;
+    }
+
+    public void setReserveId(Integer reserveId) {
+        this.reserveId = reserveId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getGradeLevel() {
+        return gradeLevel;
+    }
+
+    public void setGradeLevel(Integer gradeLevel) {
+        this.gradeLevel = gradeLevel;
+    }
+
+    public BigDecimal getGradePrice() {
+        return gradePrice;
+    }
+
+    public void setGradePrice(BigDecimal gradePrice) {
+        this.gradePrice = gradePrice;
+    }
+
+    public Integer getTheoryLevel() {
+        return theoryLevel;
+    }
+
+    public void setTheoryLevel(Integer theoryLevel) {
+        this.theoryLevel = theoryLevel;
+    }
+
+    public BigDecimal getTheoryPrice() {
+        return theoryPrice;
+    }
+
+    public void setTheoryPrice(BigDecimal theoryPrice) {
+        this.theoryPrice = theoryPrice;
+    }
+
+    public BigDecimal getVip1v1Price() {
+        return vip1v1Price;
+    }
+
+    public void setVip1v1Price(BigDecimal vip1v1Price) {
+        this.vip1v1Price = vip1v1Price;
+    }
+
+    public BigDecimal getVip1v2Price() {
+        return vip1v2Price;
+    }
+
+    public void setVip1v2Price(BigDecimal vip1v2Price) {
+        this.vip1v2Price = vip1v2Price;
+    }
+
+    public BigDecimal getTheoryCoursePrice() {
+        return theoryCoursePrice;
+    }
+
+    public void setTheoryCoursePrice(BigDecimal theoryCoursePrice) {
+        this.theoryCoursePrice = theoryCoursePrice;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", reserveId=").append(reserveId);
+        sb.append(", userId=").append(userId);
+        sb.append(", subjectId=").append(subjectId);
+        sb.append(", gradeLevel=").append(gradeLevel);
+        sb.append(", gradePrice=").append(gradePrice);
+        sb.append(", theoryLevel=").append(theoryLevel);
+        sb.append(", theoryPrice=").append(theoryPrice);
+        sb.append(", vip1v1Price=").append(vip1v1Price);
+        sb.append(", vip1v2Price=").append(vip1v2Price);
+        sb.append(", theoryCoursePrice=").append(theoryCoursePrice);
+        sb.append(", totalAmount=").append(totalAmount);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 46 - 31
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ChildrenDayReserve.java

@@ -3,53 +3,60 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
 import java.util.Date;
 
-@ApiModel(value="com-domain-ChildrenDayReserve")
+@ApiModel(value = "com-domain-ChildrenDayReserve")
 public class ChildrenDayReserve {
-    @ApiModelProperty(value="")
+    @ApiModelProperty(value = "")
     private Integer id;
 
     /**
-    * 用户id
-    */
-    @ApiModelProperty(value="用户id")
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
     private Integer userId;
 
     /**
-    * 分部id
-    */
-    @ApiModelProperty(value="分部id")
+     * 分部id
+     */
+    @ApiModelProperty(value = "分部id")
     private Integer organId;
 
     /**
-    * 合作单位id
-    */
-    @ApiModelProperty(value="合作单位id")
+     * 合作单位id
+     */
+    @ApiModelProperty(value = "合作单位id")
     private Integer cooperationOrganId;
 
     /**
-    * 乐团id
-    */
-    @ApiModelProperty(value="乐团id")
+     * 乐团id
+     */
+    @ApiModelProperty(value = "乐团id")
     private String musicGroupId;
 
     /**
-    * 是否预约 0-否 1-是
-    */
-    @ApiModelProperty(value="是否预约 0-否 1-是")
+     * 是否预约 0-否 1-是
+     */
+    @ApiModelProperty(value = "是否预约 0-否 1-是")
     private YesOrNoEnum isReserve;
 
     /**
-    * 创建时间
-    */
-    @ApiModelProperty(value="创建时间")
+     * 是否已发短信 0-否 1-是
+     */
+    @ApiModelProperty(value = "是否已发短信 0-否 1-是")
+    private YesOrNoEnum isSendMsg = YesOrNoEnum.NO;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
     /**
-    * 更新时间
-    */
-    @ApiModelProperty(value="更新时间")
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
     private Date updateTime;
 
     @ApiModelProperty(value = "当前的缴费状态 0-正常 1-缴费中")
@@ -103,6 +110,22 @@ public class ChildrenDayReserve {
         this.isReserve = isReserve;
     }
 
+    public Integer getPayStatus() {
+        return payStatus;
+    }
+
+    public void setPayStatus(Integer payStatus) {
+        this.payStatus = payStatus;
+    }
+
+    public YesOrNoEnum getIsSendMsg() {
+        return isSendMsg;
+    }
+
+    public void setIsSendMsg(YesOrNoEnum isSendMsg) {
+        this.isSendMsg = isSendMsg;
+    }
+
     public Date getCreateTime() {
         return createTime;
     }
@@ -136,12 +159,4 @@ public class ChildrenDayReserve {
         sb.append("]");
         return sb.toString();
     }
-
-    public Integer getPayStatus() {
-        return payStatus;
-    }
-
-    public void setPayStatus(Integer payStatus) {
-        this.payStatus = payStatus;
-    }
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CooperationOrgan.java

@@ -34,6 +34,12 @@ public class CooperationOrgan {
 	/**  */
 	private Integer id;
 
+	/**  */
+	private Integer educationUserId;
+
+	/**  */
+	private String realName;
+
 	/** 单位名称 */
 	@ApiModelProperty(value = "班级编号", required = false)
 	private String name;
@@ -75,6 +81,22 @@ public class CooperationOrgan {
 	@ApiModelProperty(value = "是否全职资源",required = false)
 	private Integer fullJobResource;
 
+	public String getRealName() {
+		return realName;
+	}
+
+	public void setRealName(String realName) {
+		this.realName = realName;
+	}
+
+	public Integer getEducationUserId() {
+		return educationUserId;
+	}
+
+	public void setEducationUserId(Integer educationUserId) {
+		this.educationUserId = educationUserId;
+	}
+
 	public Integer getFullJobResource() {
 		return fullJobResource;
 	}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java

@@ -64,6 +64,12 @@ public class MusicGroup {
 	/** 教务老师 */
 	@ApiModelProperty(value = "教务老师编号",required = false)
 	private Integer educationalTeacherId;
+
+	@ApiModelProperty(value = "衔接老师名字",required = false)
+	private String transactionTeacherName;
+
+	@ApiModelProperty(value = "衔接老师编号",required = false)
+	private Integer transactionTeacherId;
 	
 	/** 收费类型 */
 	@ApiModelProperty(value = "收费类型",required = false)
@@ -177,6 +183,22 @@ public class MusicGroup {
 	@ApiModelProperty(value = "进行中,缴费按钮控制",required = true)
 	private Boolean isRemedy = false;
 
+	public String getTransactionTeacherName() {
+		return transactionTeacherName;
+	}
+
+	public void setTransactionTeacherName(String transactionTeacherName) {
+		this.transactionTeacherName = transactionTeacherName;
+	}
+
+	public Integer getTransactionTeacherId() {
+		return transactionTeacherId;
+	}
+
+	public void setTransactionTeacherId(Integer transactionTeacherId) {
+		this.transactionTeacherId = transactionTeacherId;
+	}
+
 	public String getRepairUserName() {
 		return repairUserName;
 	}

+ 62 - 18
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/OrganizationDegreeCourseFee.java

@@ -2,48 +2,67 @@ package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
-@ApiModel(value="com-domain-OrganizationDegreeCourseFee")
+@ApiModel(value = "com-domain-OrganizationDegreeCourseFee")
 public class OrganizationDegreeCourseFee {
-    @ApiModelProperty(value="")
+    @ApiModelProperty(value = "")
     private Integer id;
 
     /**
-    * 分部id
-    */
-    @ApiModelProperty(value="分部id")
+     * 分部id
+     */
+    @ApiModelProperty(value = "分部id")
     private Integer organId;
 
     /**
-    * vip 1v1课价格
-    */
-    @ApiModelProperty(value="vip 1v1课价格")
+     * vip 1v1课原价格
+     */
+    @ApiModelProperty(value = "vip 1v1课原价格")
+    private BigDecimal originalVip1v1;
+
+    /**
+     * vip 1v2课原价格
+     */
+    @ApiModelProperty(value = "vip 1v2课原价格")
+    private BigDecimal originalVip1v2;
+
+    /**
+     * vip 1v1课价格
+     */
+    @ApiModelProperty(value = "vip 1v1课价格")
     private BigDecimal vip1v1;
 
     /**
      * vip 1v2课价格
      */
-    @ApiModelProperty(value="vip 1v2课价格")
+    @ApiModelProperty(value = "vip 1v2课价格")
     private BigDecimal vip1v2;
 
     /**
-    * 乐理课价格
-    */
-    @ApiModelProperty(value="乐理课价格")
+     * 乐理课原价格
+     */
+    @ApiModelProperty(value = "乐理课价格")
+    private BigDecimal originalTheory;
+
+    /**
+     * 乐理课价格
+     */
+    @ApiModelProperty(value = "乐理课价格")
     private BigDecimal theory;
 
     /**
-    * 创建时间
-    */
-    @ApiModelProperty(value="创建时间")
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
     /**
-    * 修改时间
-    */
-    @ApiModelProperty(value="修改时间")
+     * 修改时间
+     */
+    @ApiModelProperty(value = "修改时间")
     private Date updateTime;
 
     public Integer getId() {
@@ -86,6 +105,31 @@ public class OrganizationDegreeCourseFee {
         this.theory = theory;
     }
 
+
+    public BigDecimal getOriginalVip1v1() {
+        return originalVip1v1;
+    }
+
+    public void setOriginalVip1v1(BigDecimal originalVip1v1) {
+        this.originalVip1v1 = originalVip1v1;
+    }
+
+    public BigDecimal getOriginalVip1v2() {
+        return originalVip1v2;
+    }
+
+    public void setOriginalVip1v2(BigDecimal originalVip1v2) {
+        this.originalVip1v2 = originalVip1v2;
+    }
+
+    public BigDecimal getOriginalTheory() {
+        return originalTheory;
+    }
+
+    public void setOriginalTheory(BigDecimal originalTheory) {
+        this.originalTheory = originalTheory;
+    }
+
     public Date getCreateTime() {
         return createTime;
     }

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EmployeeRoleEnum.java

@@ -6,7 +6,9 @@ import com.ym.mec.common.enums.BaseEnum;
  * 员工角色枚举
  */
 public enum EmployeeRoleEnum implements BaseEnum<String, EmployeeRoleEnum> {
-	TEAM_TEACHER("TEAM_TEACHER", "运营主管"), EDUCATION("EDUCATION", "乐团主管");
+	TEAM_TEACHER("TEAM_TEACHER", "运营主管"),
+	TRANSACTION("TRANSACTION", "衔接老师"),
+	EDUCATION("EDUCATION", "乐团主管");
 
 	private String code;
 

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java

@@ -16,6 +16,7 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
     //运营数据类型
     SCHOOL("SCHOOL","合作单位", false, false),
     PROGRESS_MUSIC_GROUP_NUM("PROGRESS_MUSIC_GROUP_NUM","进行中乐团", false, false),
+    TRANSACTION_TEACHER_NUM("TRANSACTION_TEACHER_NUM", "衔接老师人数", false, false),
 
     //人事数据
     TEACHER_NUM("TEACHER_NUM","老师总数", false, false),

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -23,6 +23,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_PUSH_HAVE_COURSE_MESSAGE("STUDENT_PUSH_HAVE_COURSE_MESSAGE", "有课提醒"),
     STUDENT_PUSH_ONLINE_COURSE_ACTION("STUDENT_PUSH_ONLINE_COURSE_ACTION", "线上课开始"),
     STUDENT_PUSH_NAMES_ACHIEVE("STUDENT_PUSH_NAMES_ACHIEVE", "点名完成"),
+    SYSTEM_PUSH_NAMES_ACHIEVE("SYSTEM_PUSH_NAMES_ACHIEVE", "点名完成"),
 //    SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),
 //    STUDENT_SMS_TEACHING_SCHOOL_CHANGE("STUDENT_SMS_TEACHING_SCHOOL_CHANGE", "教学点变动"),
     STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "作业提醒"),
@@ -169,7 +170,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_APPLY_QUIT_GROUP("BACKSTAGE_STUDENT_APPLY_QUIT_GROUP", "学员申请退团"),
 
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
-    BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现");
+    BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
+    CHILDREN_DAY_NOTICE_PUSH("CHILDREN_DAY_NOTICE_PUSH", "技能评测考级报名推送"),
+    CHILDREN_DAY_NOTICE_MSG("CHILDREN_DAY_NOTICE_MSG", "技能评测考级报名短信");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java

@@ -27,7 +27,8 @@ public enum OrderDetailTypeEnum implements BaseEnum<String, OrderDetailTypeEnum>
 	DEGREE_REGISTRATION("DEGREE_REGISTRATION", "考级报名"),
     MAINTENANCE("MAINTENANCE","乐保服务"),
     CLOUD_TEACHER("CLOUD_TEACHER","云教练"),
-    CLOUD_TEACHER_PLUS("CLOUD_TEACHER_PLUS","云教练+");
+    CLOUD_TEACHER_PLUS("CLOUD_TEACHER_PLUS","云教练+"),
+    THEORY_COURSE("THEORY_COURSE", "乐理课");
 
     private String code;
 

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ChildrenReserveQueryInfo.java

@@ -14,6 +14,50 @@ public class ChildrenReserveQueryInfo extends QueryInfo {
 
     private Integer subjectId;
 
+    //是否参加器乐
+    private Integer gradeFlag;
+
+    //是否参加乐理
+    private Integer theoryFlag;
+
+    //是否购买VIP
+    private Integer vipFlag;
+
+    //是否购买乐理课
+    private Integer theoryPriceFlag;
+
+    public Integer getGradeFlag() {
+        return gradeFlag;
+    }
+
+    public void setGradeFlag(Integer gradeFlag) {
+        this.gradeFlag = gradeFlag;
+    }
+
+    public Integer getTheoryFlag() {
+        return theoryFlag;
+    }
+
+    public void setTheoryFlag(Integer theoryFlag) {
+        this.theoryFlag = theoryFlag;
+    }
+
+    public Integer getVipFlag() {
+        return vipFlag;
+    }
+
+    public void setVipFlag(Integer vipFlag) {
+        this.vipFlag = vipFlag;
+    }
+
+    public Integer getTheoryPriceFlag() {
+        return theoryPriceFlag;
+    }
+
+    public void setTheoryPriceFlag(Integer theoryPriceFlag) {
+        this.theoryPriceFlag = theoryPriceFlag;
+    }
+
     public Integer getIsReserve() {
         return isReserve;
     }

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

@@ -10,6 +10,16 @@ public class CooperationOrganQueryInfo extends QueryInfo {
 
     private Integer fullJobResource;
 
+    private Integer educationUserId;
+
+	public Integer getEducationUserId() {
+		return educationUserId;
+	}
+
+	public void setEducationUserId(Integer educationUserId) {
+		this.educationUserId = educationUserId;
+	}
+
 	public Integer getFullJobResource() {
 		return fullJobResource;
 	}

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

@@ -48,6 +48,17 @@ public class CourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "结束上课日期")
     private String endClassDate;
 
+    @ApiModelProperty(value = "衔接老师编号")
+    private Integer transactionTeacherId;
+
+    public Integer getTransactionTeacherId() {
+        return transactionTeacherId;
+    }
+
+    public void setTransactionTeacherId(Integer transactionTeacherId) {
+        this.transactionTeacherId = transactionTeacherId;
+    }
+
     public CourseStatusEnum getStatus() {
         return status;
     }

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCourseHomeWorkQueryInfo.java

@@ -11,6 +11,15 @@ public class StudentCourseHomeWorkQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "学生id")
     private Long userId;
 
+    @ApiModelProperty(value = "课程组编号")
+    private String groupId;
+
+    @ApiModelProperty(value = "教师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty(value = "衔接老师编号")
+    private Integer transactionTeacherId;
+
     @ApiModelProperty(value = "开始时间")
     private Date startTime;
 
@@ -23,6 +32,8 @@ public class StudentCourseHomeWorkQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否回复")
     private YesOrNoEnum isReplied;
 
+    private Boolean extra = false;
+
     public Long getUserId() {
         return userId;
     }
@@ -31,6 +42,22 @@ public class StudentCourseHomeWorkQueryInfo extends QueryInfo {
         this.userId = userId;
     }
 
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public Date getStartTime() {
         return startTime;
     }
@@ -62,4 +89,20 @@ public class StudentCourseHomeWorkQueryInfo extends QueryInfo {
     public void setIsReplied(YesOrNoEnum isReplied) {
         this.isReplied = isReplied;
     }
+
+    public Boolean getExtra() {
+        return extra;
+    }
+
+    public void setExtra(Boolean extra) {
+        this.extra = extra;
+    }
+
+    public Integer getTransactionTeacherId() {
+        return transactionTeacherId;
+    }
+
+    public void setTransactionTeacherId(Integer transactionTeacherId) {
+        this.transactionTeacherId = transactionTeacherId;
+    }
 }

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

@@ -21,6 +21,7 @@ public interface ChildrenDayDegreeDetailService extends BaseService<Integer, Chi
 
     /**
      * 增加考级支付详情
+     *
      * @param degreePayDto
      * @param gradeFee
      * @param theoryLevelFee
@@ -29,10 +30,11 @@ public interface ChildrenDayDegreeDetailService extends BaseService<Integer, Chi
      * @param theoryCourseFee
      * @return
      */
-    List<ChildrenDayDegreeDetail> addDegreeDetails(DegreePayDto degreePayDto, BigDecimal gradeFee,BigDecimal theoryLevelFee,BigDecimal vip1v1Fee,BigDecimal vip1v2Fee,BigDecimal theoryCourseFee);
+    List<ChildrenDayDegreeDetail> addDegreeDetails(DegreePayDto degreePayDto, BigDecimal gradeFee, BigDecimal theoryLevelFee, BigDecimal vip1v1Fee, BigDecimal vip1v2Fee, BigDecimal theoryCourseFee);
 
     /**
      * 增加考级订单详情
+     *
      * @param degreePayDto
      * @param gradeFee
      * @param theoryLevelFee
@@ -43,4 +45,22 @@ public interface ChildrenDayDegreeDetailService extends BaseService<Integer, Chi
      */
     List<StudentPaymentOrderDetail> addOrderDetails(DegreePayDto degreePayDto, BigDecimal gradeFee, BigDecimal theoryLevelFee, BigDecimal vip1v1Fee, BigDecimal vip1v2Fee, BigDecimal theoryCourseFee);
 
+    /**
+     * 获取用户6.1考级报名详情
+     *
+     * @param userId
+     * @return
+     */
+    List<ChildrenDayDegreeDetail> getUserDegreeInfo(Integer userId);
+
+
+    /**
+     * 更新状态信息
+     *
+     * @param orderId
+     * @param status
+     * @return
+     */
+    Integer updateStatus(Long orderId, Integer status);
+
 }

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ChildrenDayDegreeInfoService.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.service;
+
+
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo;
+
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+
+public interface ChildrenDayDegreeInfoService extends BaseService<Integer, ChildrenDayDegreeInfo> {
+
+    /**
+     * 增加购买信息汇总
+     * @param orderId
+     * @return
+     */
+    ChildrenDayDegreeInfo addInfo(Long orderId);
+
+    /**
+     * 获取已付费的用户
+     * @param userIds
+     * @return
+     */
+    List<Integer> getPayedUser(List<Integer> userIds);
+
+}

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ChildrenDayReserveService.java

@@ -4,11 +4,13 @@ package com.ym.mec.biz.service;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ChildrenDayReserve;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ChildrenReserveQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
 import java.util.Map;
 
 public interface ChildrenDayReserveService extends BaseService<Integer, ChildrenDayReserve> {
@@ -35,6 +37,7 @@ public interface ChildrenDayReserveService extends BaseService<Integer, Children
 
     /**
      * 获取活动的费用信息
+     *
      * @param organId
      * @return
      */
@@ -42,6 +45,7 @@ public interface ChildrenDayReserveService extends BaseService<Integer, Children
 
     /**
      * 获取后台考级活动详情列表
+     *
      * @param queryInfo
      * @return
      */
@@ -54,4 +58,27 @@ public interface ChildrenDayReserveService extends BaseService<Integer, Children
      * @throws Exception
      */
     Map pay(DegreePayDto degreePayDto) throws Exception;
+
+    /**
+     * 支付回调处理
+     *
+     * @param studentPaymentOrder
+     * @return
+     */
+    Boolean orderCallback(StudentPaymentOrder studentPaymentOrder);
+
+    /**
+     * 导出详情
+     * @param queryInfo
+     * @return
+     */
+    List<ChildrenStatisticsDetailDto> exportStatisticsDetail(ChildrenReserveQueryInfo queryInfo);
+
+    /**
+     * 发送短信和推送
+     *
+     * @param msgDtos
+     * @return
+     */
+    Boolean sendMsg(List<ChildrenDayMsgDto> msgDtos);
 }

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

@@ -24,4 +24,9 @@ public interface CooperationOrganService extends BaseService<Integer, Cooperatio
      * @return
      */
     List<MusicGroupPaymentCalender> getCooperationOrganCalender4School(Integer id);
+
+    void updateCooperation(CooperationOrgan cooperationOrgan);
+
+    void updateCooperationEdu(List<Integer> organIds);
+
 }

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

@@ -209,7 +209,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @return java.util.List<java.util.Date>
 	 * @describe 获取
 	 */
-	List<Date> getCourseScheduleDates(Date month, String organIdList, String type);
+	List<Date> getCourseScheduleDates(Date month, String organIdList, String type, Integer transactionTeacherId);
 
 	/**
 	 * @describe 课程调整

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

@@ -1,15 +1,18 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
+import com.ym.mec.biz.dal.dto.EduHomeworkCardDto;
 import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercisesReply;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
+import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ExtracurricularExercisesReplyService extends BaseService<Long, ExtracurricularExercisesReply> {
 
@@ -67,4 +70,6 @@ public interface ExtracurricularExercisesReplyService extends BaseService<Long,
      */
     void exercisesSituationStatistics();
     void exercisesSituationStatistics2(String monday);
+
+    PageInfo<EduHomeworkCardDto> getEduHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo);
 }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.common.service.BaseService;
@@ -59,4 +60,27 @@ public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
 	 */
 	boolean updateRoleType(Long imGroupId, Integer userId, String roleType);
 
+	void batchInsert(List<ImGroupMember> imGroupMemberList);
+
+	/**
+	 * 批量删除
+	 * @param imGroupMemberList
+	 */
+	void batchDelete(List<ImGroupMember> imGroupMemberList);
+
+	/**
+	 * 根据群编号和用户编号批量删除
+	 * @param imGroupMemberList
+	 */
+	void batchDeleteByGroupIdAndUserId(List<ImGroupMember> imGroupMemberList);
+
+	/**
+	 * 是否在群里
+	 * @param groupId
+	 * @param userId
+	 * @return
+	 */
+	boolean isExit(String groupId, String userId);
+
+	void delRepeat();
 }

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseHomeworkService.java

@@ -1,8 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.CourseHomeworkStudentDetailDto;
-import com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto;
-import com.ym.mec.biz.dal.dto.StudentVisitCourseHomeWorkDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseHomework;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
@@ -40,7 +38,7 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      * @param userName: 用户名
      * @return java.util.List<com.ym.mec.biz.dal.entity.StudentCourseHomework>
      */
-    List<StudentCourseHomework> findStudentCourseHomeworkByCourse(Long courseSchedule,String userName);
+    List<StudentCourseHomework> findStudentCourseHomeworkByCourse(Long courseSchedule, Long homeworkId,String userName);
 
     /**
      * @describe 跟新学生作业回复状态
@@ -96,4 +94,17 @@ public interface StudentCourseHomeworkService extends BaseService<Long, StudentC
      * @return
      */
     PageInfo<StudentVisitCourseHomeWorkDto> getStudentHomeWorks(StudentCourseHomeWorkQueryInfo queryInfo);
+
+    /**
+     * @describe 教务端课后作业列表
+     * @author Joburgess
+     * @date 2021/5/24 0024
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.EduHomeworkCardDto>
+     */
+    PageInfo<EduHomeworkCardDto> getEduCourseHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo);
+
+    PageInfo<EduHomeworkStatDto> queryEduHomeworkStatList(StudentCourseHomeWorkQueryInfo queryInfo);
+
+    List<EduHomeworkStatDto> queryEduHomeworkStatDetail(StudentCourseHomeWorkQueryInfo queryInfo);
 }

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

@@ -389,4 +389,10 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      */
     Integer quitAllStudent(String musicGroupId, String remark);
 
+    /**
+     * 获取乐团在读学员数
+     * @param musicGroupIds
+     * @return
+     */
+    List<Map<String, Integer>> countNormalNum(List<String> musicGroupIds);
 }

+ 47 - 60
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeDetailServiceImpl.java

@@ -21,6 +21,8 @@ import java.util.List;
 public class ChildrenDayDegreeDetailServiceImpl extends BaseServiceImpl<Integer, ChildrenDayDegreeDetail> implements ChildrenDayDegreeDetailService {
     @Autowired
     private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
 
     @Override
     public BaseDAO<Integer, ChildrenDayDegreeDetail> getDAO() {
@@ -96,67 +98,52 @@ public class ChildrenDayDegreeDetailServiceImpl extends BaseServiceImpl<Integer,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public List<StudentPaymentOrderDetail> addOrderDetails(DegreePayDto degreePayDto, BigDecimal gradeFee, BigDecimal theoryLevelFee, BigDecimal vip1v1Fee, BigDecimal vip1v2Fee, BigDecimal theoryCourseFee) {
+        Date nowDate = new Date();
+        List<StudentPaymentOrderDetail> orderDetails = new ArrayList<>();
+        if (degreePayDto.getMusicGradeLevel() != null || degreePayDto.getTheoryLevel() != null) {
+            StudentPaymentOrderDetail detail = new StudentPaymentOrderDetail();
+            detail.setType(OrderDetailTypeEnum.DEGREE_REGISTRATION);
+            detail.setPrice(gradeFee.add(theoryLevelFee));
+            detail.setRemitFee(BigDecimal.ZERO);
+            detail.setCreateTime(nowDate);
+            detail.setUpdateTime(nowDate);
+            detail.setPaymentOrderId(degreePayDto.getOrderId());
+            detail.setIsRenew(0);
+            orderDetails.add(detail);
+        }
+        if (degreePayDto.getVip1v1() || degreePayDto.getVip1v2()) {
+            StudentPaymentOrderDetail detail = new StudentPaymentOrderDetail();
+            detail.setType(OrderDetailTypeEnum.VIP);
+            detail.setPrice(vip1v1Fee.add(vip1v2Fee));
+            detail.setRemitFee(BigDecimal.ZERO);
+            detail.setCreateTime(nowDate);
+            detail.setUpdateTime(nowDate);
+            detail.setPaymentOrderId(degreePayDto.getOrderId());
+            detail.setIsRenew(0);
+            orderDetails.add(detail);
+        }
+        if (degreePayDto.getTheoryCourse()) {
+            StudentPaymentOrderDetail detail = new StudentPaymentOrderDetail();
+            detail.setType(OrderDetailTypeEnum.THEORY_COURSE);
+            detail.setPrice(theoryCourseFee);
+            detail.setRemitFee(BigDecimal.ZERO);
+            detail.setCreateTime(nowDate);
+            detail.setUpdateTime(nowDate);
+            detail.setPaymentOrderId(degreePayDto.getOrderId());
+            detail.setIsRenew(0);
+            orderDetails.add(detail);
+        }
+        studentPaymentOrderDetailDao.batchAdd(orderDetails);
+        return orderDetails;
+    }
 
-//        Date nowDate = new Date();
-//        List<StudentPaymentOrderDetail> orderDetails = new ArrayList<>();
-//        if (degreePayDto.getMusicGradeLevel() != null) {
-//            StudentPaymentOrderDetail detail = new StudentPaymentOrderDetail();
-//            detail.setType(OrderDetailTypeEnum.CLOUD_TEACHER);
-//            detail.setPrice(cloudTeacherPrice);
-//            detail.setRemitFee(BigDecimal.ZERO);
-//            detail.setCreateTime(nowDate);
-//            detail.setUpdateTime(nowDate);
-//            detail.setPaymentOrderId(degreePayDto.getOrderId());
-//            detail.setIsRenew(0);
-//            orderDetails.add(detail);
-//        }
-//        if (degreePayDto.getTheoryLevel() != null) {
-//            ChildrenDayDegreeDetail childrenDayDegreeDetail = new ChildrenDayDegreeDetail();
-//            childrenDayDegreeDetail.setReserveId(degreePayDto.getReserveId());
-//            childrenDayDegreeDetail.setUserId(degreePayDto.getUserId());
-//            childrenDayDegreeDetail.setType(2);
-//            childrenDayDegreeDetail.setLevel(degreePayDto.getTheoryLevel());
-//            childrenDayDegreeDetail.setPrice(theoryLevelFee);
-//            childrenDayDegreeDetail.setStatus(1);
-//            childrenDayDegreeDetail.setOrderId(degreePayDto.getOrderId());
-//            childrenDayDegreeDetails.add(childrenDayDegreeDetail);
-//        }
-//        if (degreePayDto.getVip1v1()) {
-//            ChildrenDayDegreeDetail childrenDayDegreeDetail = new ChildrenDayDegreeDetail();
-//            childrenDayDegreeDetail.setReserveId(degreePayDto.getReserveId());
-//            childrenDayDegreeDetail.setUserId(degreePayDto.getUserId());
-//            childrenDayDegreeDetail.setType(3);
-//            childrenDayDegreeDetail.setPrice(vip1v1Fee);
-//            childrenDayDegreeDetail.setStatus(1);
-//            childrenDayDegreeDetail.setOrderId(degreePayDto.getOrderId());
-//            childrenDayDegreeDetails.add(childrenDayDegreeDetail);
-//        }
-//        if (degreePayDto.getVip1v2()) {
-//            ChildrenDayDegreeDetail childrenDayDegreeDetail = new ChildrenDayDegreeDetail();
-//            childrenDayDegreeDetail.setReserveId(degreePayDto.getReserveId());
-//            childrenDayDegreeDetail.setUserId(degreePayDto.getUserId());
-//            childrenDayDegreeDetail.setType(4);
-//            childrenDayDegreeDetail.setPrice(vip1v2Fee);
-//            childrenDayDegreeDetail.setStatus(1);
-//            childrenDayDegreeDetail.setOrderId(degreePayDto.getOrderId());
-//            childrenDayDegreeDetails.add(childrenDayDegreeDetail);
-//        }
-//        if (degreePayDto.getTheoryCourse()) {
-//            ChildrenDayDegreeDetail childrenDayDegreeDetail = new ChildrenDayDegreeDetail();
-//            childrenDayDegreeDetail.setReserveId(degreePayDto.getReserveId());
-//            childrenDayDegreeDetail.setUserId(degreePayDto.getUserId());
-//            childrenDayDegreeDetail.setType(5);
-//            childrenDayDegreeDetail.setPrice(theoryCourseFee);
-//            childrenDayDegreeDetail.setStatus(1);
-//            childrenDayDegreeDetail.setOrderId(degreePayDto.getOrderId());
-//            childrenDayDegreeDetails.add(childrenDayDegreeDetail);
-//        }
-//        childrenDayDegreeDetailDao.batchAdd(childrenDayDegreeDetails);
-//        return childrenDayDegreeDetails;
-//
-//
-//        StudentPaymentOrderDetail cloudTeacherOrderDetail = new StudentPaymentOrderDetail();
-        return null;
+    @Override
+    public List<ChildrenDayDegreeDetail> getUserDegreeInfo(Integer userId) {
+        return childrenDayDegreeDetailDao.getByUserIdAndStatus(userId, 2);
+    }
 
+    @Override
+    public Integer updateStatus(Long orderId, Integer status) {
+        return childrenDayDegreeDetailDao.updateStatus(orderId, status);
     }
 }

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.service.impl;
+
+
+import com.ym.mec.biz.dal.dao.ChildrenDayDegreeDetailDao;
+import com.ym.mec.biz.dal.dao.ChildrenDayDegreeInfoDao;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo;
+import com.ym.mec.biz.service.ChildrenDayDegreeInfoService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, ChildrenDayDegreeInfo> implements ChildrenDayDegreeInfoService {
+    @Autowired
+    private ChildrenDayDegreeInfoDao childrenDayDegreeInfoDao;
+    @Autowired
+    private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
+
+    @Override
+    public BaseDAO<Integer, ChildrenDayDegreeInfo> getDAO() {
+        return childrenDayDegreeInfoDao;
+    }
+
+
+    @Override
+    public ChildrenDayDegreeInfo addInfo(Long orderId) {
+        List<ChildrenDayDegreeDetail> details = childrenDayDegreeDetailDao.getByOrderId(orderId);
+        ChildrenDayDegreeInfo childrenDayDegreeInfo = new ChildrenDayDegreeInfo();
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (ChildrenDayDegreeDetail detail : details) {
+            switch (detail.getType()) {
+                case 1:
+                    childrenDayDegreeInfo.setSubjectId(detail.getSubjectId());
+                    childrenDayDegreeInfo.setGradeLevel(detail.getLevel());
+                    childrenDayDegreeInfo.setGradePrice(detail.getPrice());
+                    break;
+                case 2:
+                    childrenDayDegreeInfo.setTheoryLevel(detail.getLevel());
+                    childrenDayDegreeInfo.setTheoryPrice(detail.getPrice());
+                    break;
+                case 3:
+                    childrenDayDegreeInfo.setVip1v1Price(detail.getPrice());
+                    break;
+                case 4:
+                    childrenDayDegreeInfo.setVip1v2Price(detail.getPrice());
+                    break;
+                case 5:
+                    childrenDayDegreeInfo.setTheoryCoursePrice(detail.getPrice());
+                    break;
+                default:
+                    break;
+            }
+            childrenDayDegreeInfo.setReserveId(detail.getReserveId());
+            childrenDayDegreeInfo.setUserId(detail.getUserId());
+            childrenDayDegreeInfo.setOrderId(detail.getOrderId());
+            totalAmount = totalAmount.add(detail.getPrice());
+        }
+        childrenDayDegreeInfo.setTotalAmount(totalAmount);
+        if (childrenDayDegreeInfoDao.insert(childrenDayDegreeInfo) <= 0) {
+            throw new BizException("汇总信息插入失败");
+        }
+        return childrenDayDegreeInfo;
+    }
+
+    @Override
+    public List<Integer> getPayedUser(List<Integer> userIds) {
+       return childrenDayDegreeInfoDao.getPayedUser(userIds);
+    }
+}

+ 173 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayReserveServiceImpl.java

@@ -12,8 +12,12 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.http.HttpUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,6 +53,20 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
     @Autowired
     private PayService payService;
+    @Autowired
+    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private ChildrenDayDegreeInfoService childrenDayDegreeInfoService;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
     @Override
     public BaseDAO<Integer, ChildrenDayReserve> getDAO() {
@@ -104,6 +122,14 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = childrenDayReserveDao.queryChildrenStatistics(params);
+            //统计
+            pageInfo.setStatInfo(childrenDayReserveDao.childrenStatistics(params));
+            //获取乐团在读人数
+            List<String> musicGroupIds = dataList.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toList());
+            Map<String, Long> normalNum = MapUtil.convertIntegerMap(studentRegistrationService.countNormalNum(musicGroupIds));
+            dataList.forEach(e -> {
+                e.setNormalNum(normalNum.get(e.getMusicGroupId()) == null ? 0 : normalNum.get(e.getMusicGroupId()).intValue());
+            });
         }
         if (count == 0) {
             dataList = new ArrayList<>();
@@ -147,10 +173,6 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
     public Map pay(DegreePayDto degreePayDto) throws Exception {
         studentDao.lockUser(degreePayDto.getUserId());
 
-        if (degreePayDto.getTheoryLevel() != null && !degreePayDto.getTheoryCourse()) {
-            throw new BizException("参加乐理考试,请选乐理考级专项训练课");
-        }
-
         //检查进行中的订单
         List<ChildrenDayDegreeDetail> details = childrenDayDegreeDetailService.getByUserIdAndStatus(degreePayDto.getUserId(), 1);
 
@@ -165,9 +187,18 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
             }
         }
 
+        //获取课程的价格
+        OrganizationDegreeCourseFee courseFee = organizationDegreeCourseFeeDao.getByOrganId(degreePayDto.getOrganId());
+
         //检查已经购买的课程(不能重复)
         details = childrenDayDegreeDetailService.getByUserIdAndStatus(degreePayDto.getUserId(), 2);
         Set<Integer> detailTypes = details.stream().map(ChildrenDayDegreeDetail::getType).collect(Collectors.toSet());
+
+        if (degreePayDto.getTheoryLevel() != null && degreePayDto.getTheoryLevel() > 0 &&
+                courseFee != null && !degreePayDto.getTheoryCourse() && !detailTypes.contains(5)) {
+            throw new BizException("参加乐理考试,请选乐理考级专项训练课");
+        }
+
         if (degreePayDto.getVip1v1() && detailTypes.contains(3)) {
             throw new BizException("您已购买过VIP 1V1课程,请勿重复选择");
         }
@@ -180,23 +211,27 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
             throw new BizException("您已购买过乐理考级专项训练课,请勿重复选择");
         }
         //检查器乐考级等级是否重复
-        if (degreePayDto.getMusicGradeLevel() != null) {
+        if (degreePayDto.getMusicGradeLevel() != null && degreePayDto.getMusicGradeLevel() > 0) {
             if (degreePayDto.getSubject() == null) {
                 throw new BizException("请选择考级声部");
             }
             List<ChildrenDayDegreeDetail> hasList = details.stream().filter(e -> e.getType().equals(1)).filter(e -> e.getSubjectId().equals(degreePayDto.getSubject()))
                     .filter(e -> e.getLevel().equals(degreePayDto.getMusicGradeLevel())).collect(Collectors.toList());
             if (hasList.size() > 0) {
-                throw new BizException("您已报考同声部同等级,请勿重复报考");
+                throw new BizException("您已报考同声部同等级,请勿重复报考");
+            }
+
+            if (degreePayDto.getNeedVipCourse() && !detailTypes.contains(3) && !detailTypes.contains(4)) {
+                throw new BizException("请选择VIP课程");
             }
         }
 
         //检查乐理考级等级是否重复
-        if (degreePayDto.getTheoryLevel() != null) {
+        if (degreePayDto.getTheoryLevel() != null && degreePayDto.getTheoryLevel() > 0) {
             List<ChildrenDayDegreeDetail> hasList = details.stream().filter(e -> e.getType().equals(2))
-                    .filter(e -> e.getLevel().equals(degreePayDto.getMusicGradeLevel())).collect(Collectors.toList());
+                    .filter(e -> e.getLevel().equals(degreePayDto.getTheoryLevel())).collect(Collectors.toList());
             if (hasList.size() > 0) {
-                throw new BizException("您已报考同等级乐理,请勿重复报考");
+                throw new BizException("您已报考同等级乐理请勿重复报考");
             }
         }
 
@@ -207,13 +242,6 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
         }
         degreePayDto.setReserveId(userReserve.getId());
 
-        //获取课程的价格
-        OrganizationDegreeCourseFee courseFee = organizationDegreeCourseFeeDao.getByOrganId(degreePayDto.getOrganId());
-
-        if (courseFee == null) {
-            throw new BizException("刚前分部不参与,谢谢关注");
-        }
-
         List<DegreeLevelFee> degreeLevelFees = degreeLevelFeeDao.getAll();
 
         //订单总金额
@@ -221,14 +249,14 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
 
         //器乐考级费用
         BigDecimal gradeFee = BigDecimal.ZERO;
-        if (degreePayDto.getMusicGradeLevel() != null) {
+        if (degreePayDto.getMusicGradeLevel() != null && degreePayDto.getMusicGradeLevel() > 0) {
             gradeFee = degreeLevelFees.stream().filter(e -> e.getLevel().equals(degreePayDto.getMusicGradeLevel())).map(DegreeLevelFee::getGrade).reduce(BigDecimal.ZERO, BigDecimal::add);
             orderAmount = orderAmount.add(gradeFee);
         }
 
         //乐理考级费用
         BigDecimal theoryLevelFee = BigDecimal.ZERO;
-        if (degreePayDto.getTheoryLevel() != null) {
+        if (degreePayDto.getTheoryLevel() != null && degreePayDto.getTheoryLevel() > 0) {
             theoryLevelFee = degreeLevelFees.stream().filter(e -> e.getLevel().equals(degreePayDto.getTheoryLevel())).map(DegreeLevelFee::getTheory).reduce(BigDecimal.ZERO, BigDecimal::add);
             orderAmount = orderAmount.add(theoryLevelFee);
         }
@@ -286,6 +314,7 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
 
         //添加购买详情
         degreePayDto.setOrderId(studentPaymentOrder.getId());
+        childrenDayDegreeDetailService.addOrderDetails(degreePayDto, gradeFee, theoryLevelFee, vip1v1Fee, vip1v2Fee, theoryCourseFee);
         childrenDayDegreeDetailService.addDegreeDetails(degreePayDto, gradeFee, theoryLevelFee, vip1v1Fee, vip1v2Fee, theoryCourseFee);
 
         studentPaymentOrder.setVersion(0);
@@ -324,4 +353,130 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
         studentPaymentOrderService.update(studentPaymentOrder);
         return payMap;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
+        Date nowDate = new Date();
+        //更新订单信息
+        studentPaymentOrder.setUpdateTime(nowDate);
+        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateCount <= 0) {
+            throw new BizException("订单更新失败");
+        }
+
+        Integer userId = studentPaymentOrder.getUserId();
+
+        Map<Integer, String> map = new HashMap<>();
+        map.put(userId, userId.toString());
+
+        //支付成功
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            if (childrenDayDegreeDetailService.updateStatus(studentPaymentOrder.getId(), 2) <= 0) {
+                throw new BizException("购买详情,更新失败");
+            }
+            childrenDayDegreeInfoService.addInfo(studentPaymentOrder.getId());
+
+            //插入交易明细
+            BigDecimal amount = studentPaymentOrder.getActualAmount();
+            if (amount.compareTo(BigDecimal.ZERO) > 0) {
+                SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
+                //充值
+                SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
+                rechargeDetail.setAmount(amount);
+                rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
+                rechargeDetail.setComment("缴费前充值");
+                rechargeDetail.setCreateTime(nowDate);
+                rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
+                rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
+                rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
+                rechargeDetail.setUpdateTime(nowDate);
+                rechargeDetail.setUserId(userId);
+                rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
+                sysUserCashAccountDetailService.insert(rechargeDetail);
+
+                //缴费
+                SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
+                paymentDetail.setAmount(amount.negate());
+                paymentDetail.setBalance(cashAccount.getBalance());
+                paymentDetail.setComment("6.1考级活动");
+                paymentDetail.setCreateTime(nowDate);
+                paymentDetail.setStatus(DealStatusEnum.SUCCESS);
+                paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
+                paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
+                paymentDetail.setUpdateTime(nowDate);
+                paymentDetail.setUserId(userId);
+                rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+                sysUserCashAccountDetailService.insert(paymentDetail);
+            }
+
+            try {
+                contractService.transferProduceContract(userId, null);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+            return true;
+        }
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
+            if (childrenDayDegreeDetailService.updateStatus(studentPaymentOrder.getId(), 3) <= 0) {
+                throw new BizException("购买详情,更新失败");
+            }
+
+            if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "6.1考级支付失败");
+            }
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_PUSH_SPORADIC_PAYMENT_FAILED, map, null, 0, null, "STUDENT",
+                    studentPaymentOrder.getActualAmount(), "6.1考级活动");
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public List<ChildrenStatisticsDetailDto> exportStatisticsDetail(ChildrenReserveQueryInfo queryInfo) {
+        return childrenDayReserveDao.exportStatisticsDetail(queryInfo);
+    }
+
+    @Override
+    public Boolean sendMsg(List<ChildrenDayMsgDto> msgDtos) {
+        List<ChildrenStatisticsDetailDto> reserves = childrenDayReserveDao.getSendMsgList(msgDtos);
+        if (reserves.size() <= 0) {
+            return true;
+        }
+
+        Map<Integer, String> userMap = new HashMap<>();
+        Map<Integer, String> userPhoneMap = new HashMap<>();
+
+        List<Integer> userList = reserves.stream().map(ChildrenStatisticsDetailDto::getUserId).collect(Collectors.toList());
+        List<Integer> payedUserIds = childrenDayDegreeInfoService.getPayedUser(userList);
+
+        for (ChildrenStatisticsDetailDto reserve : reserves) {
+            if (payedUserIds.contains(reserve.getUserId())) {
+                userList.remove(reserve.getUserId());
+                continue;
+            }
+            userMap.put(reserve.getUserId(), reserve.getUserId().toString());
+            userPhoneMap.put(reserve.getUserId(), reserve.getPhone());
+        }
+
+        if (userMap.size() <= 0) {
+            return true;
+        }
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        String pushUrl = baseApiUrl + "/#/childrenPayment";
+
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.CHILDREN_DAY_NOTICE_PUSH,
+                userMap, null, 0, "5?" + pushUrl, "STUDENT");
+
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.CHILDREN_DAY_NOTICE_MSG,
+                userPhoneMap, null, 0, null, null, HttpUtil.getSortUrl(pushUrl));
+
+        childrenDayReserveDao.updateSendMasStatus(userList);
+        return true;
+    }
 }

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

@@ -280,9 +280,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         } else {
             MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
             Map<Integer, String> userRoleMap = new HashMap<>();
-            userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
-            userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
-            userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+            if(musicGroup.getEducationalTeacherId() != null){
+                userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
+            }
+            if(musicGroup.getTeamTeacherId() != null){
+                userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
+            }
+            if(musicGroup.getDirectorUserId() != null){
+                userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+            }
+            if(musicGroup.getTransactionTeacherId() != null){
+                userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
+            }
             if (teacherIdList != null && teacherIdList.size() > 0) {
                 for (Integer teacherId : teacherIdList) {
                     userRoleMap.put(teacherId, "指导老师");
@@ -1015,6 +1024,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         e.setTitle("乐团主管");
                     } else if (musicGroup.getDirectorUserId() != null && Integer.parseInt(e.getId()) == musicGroup.getDirectorUserId()) {
                         e.setTitle("乐队指导");
+                    } else if (musicGroup.getTransactionTeacherId() != null && Integer.parseInt(e.getId()) == musicGroup.getTransactionTeacherId()) {
+                        e.setTitle("衔接老师");
                     } else if (courseScheduleTeacherSalaryDao.isTeacher(groupId, Integer.parseInt(e.getId()))) {
                         e.setTitle("指导老师");
                     }
@@ -3139,9 +3150,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
-        userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
-        userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
-        userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+        if(musicGroup.getEducationalTeacherId() != null){
+            userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
+        }
+        if(musicGroup.getTeamTeacherId() != null){
+            userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
+        }
+        if(musicGroup.getDirectorUserId() != null){
+            userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+        }
+        if(musicGroup.getTransactionTeacherId() != null){
+            userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
+        }
         for (Integer userId : userIds) {
             if (userId == null) continue;
 

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

@@ -653,6 +653,9 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
         //获取冻结的课程列表
         List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.findCoursesByClassGroupIdAndCourseIds(classGroupId,allLockCourseIds);
+        if(classGroupNotStartCourse.size() == 0){
+            throw new BizException("操作失败:主班没有未开始的课程");
+        }
 
         Date now = new Date();
         List<ClassGroupStudentMapper> classGroupStudentMappers = new ArrayList<>();

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

@@ -1,22 +1,40 @@
 package com.ym.mec.biz.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImGroupService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class CooperationOrganServiceImpl extends BaseServiceImpl<Integer, CooperationOrgan>  implements CooperationOrganService {
 	
 	@Autowired
 	private CooperationOrganDao cooperationOrganDao;
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+	@Autowired
+	private ClassGroupDao classGroupDao;
+	@Autowired
+	private ImGroupMemberService imGroupMemberService;
+	@Autowired
+	private ImGroupService imGroupService;
+	@Autowired
+	private EmployeeDao employeeDao;
 
 	@Override
 	public BaseDAO<Integer, CooperationOrgan> getDAO() {
@@ -32,4 +50,110 @@ public class CooperationOrganServiceImpl extends BaseServiceImpl<Integer, Cooper
     public List<MusicGroupPaymentCalender> getCooperationOrganCalender4School(Integer id) {
 		return cooperationOrganDao.getCooperationOrganCalender4School(id);
     }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateCooperation(CooperationOrgan cooperationOrgan) {
+		CooperationOrgan cooperationOrgan1 = cooperationOrganDao.get(cooperationOrgan.getId());
+		//修改了乐团主管后,修改关联乐团的乐团主管
+		if(!cooperationOrgan.getEducationUserId().equals(cooperationOrgan1.getEducationUserId())){
+			//获取进行中、暂停、筹备中的乐团列表
+			List<MusicGroup> musicGroups = musicGroupDao.findByCooperationIdAndStatus(cooperationOrgan.getId());
+			if(musicGroups.size() > 0){
+				for (MusicGroup musicGroup : musicGroups) {
+					//获取当前乐团所有班级
+					List<ClassGroup> classGroups = classGroupDao.findClassGroups(musicGroup.getId());
+					if (classGroups == null || classGroups.size() == 0) {
+						continue;
+					}
+					Integer educationalTeacherId = musicGroup.getEducationalTeacherId();
+					List<Integer> quitUserIdList = new ArrayList<Integer>();
+					if(educationalTeacherId != null){
+						quitUserIdList.add(educationalTeacherId);
+					}
+					Map<Integer, String> userRoleMap = new HashMap<Integer, String>(1);
+					userRoleMap.put(cooperationOrgan.getEducationUserId(), "乐团主管");
+					classGroups.forEach(e -> {
+						if(educationalTeacherId != null){
+							imGroupMemberService.quit(e.getId().longValue(), quitUserIdList);
+						}
+						imGroupMemberService.join(e.getId().longValue(), userRoleMap);
+					});
+				}
+			}
+			//更新预报名群信息
+			List<MusicGroup> musicGroupList = musicGroupDao.findByCooperationId(cooperationOrgan.getId());
+			if(musicGroupList.size() > 0){
+				for (MusicGroup musicGroup : musicGroupList) {
+					//不是导入的乐团
+					if(musicGroup.getId().length() > 10){
+						//是否有预报名的群聊
+						ImGroup imGroup = imGroupService.get(Long.parseLong(musicGroup.getId()));
+						if(imGroup != null){
+							imGroupMemberService.quit(Long.parseLong(musicGroup.getId()),musicGroup.getEducationalTeacherId());
+							imGroupMemberService.join(Long.parseLong(musicGroup.getId()),cooperationOrgan.getEducationUserId(),"乐团主管",false);
+						}
+					}
+				}
+			}
+			//修改乐团主管
+			musicGroupDao.batchUpdateEdu(cooperationOrgan.getId(),cooperationOrgan.getEducationUserId());
+		}
+		cooperationOrganDao.update(cooperationOrgan);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateCooperationEdu(List<Integer> organIds) {
+		List<CooperationOrgan> organList = cooperationOrganDao.getCooperationOrganByIds(organIds);
+		for (CooperationOrgan cooperationOrgan : organList) {
+			if(cooperationOrgan.getEducationUserId() != null){
+				Employee employee = employeeDao.get(cooperationOrgan.getEducationUserId());
+				if(employee != null){
+					//获取进行中、暂停、筹备中的乐团列表
+					List<MusicGroup> musicGroups = musicGroupDao.findByCooperationIdAndStatus(cooperationOrgan.getId());
+					if(musicGroups.size() > 0){
+						for (MusicGroup musicGroup : musicGroups) {
+							//获取当前乐团所有班级
+							List<ClassGroup> classGroups = classGroupDao.findClassGroups(musicGroup.getId());
+							if (classGroups == null || classGroups.size() == 0) {
+								continue;
+							}
+							Integer educationalTeacherId = musicGroup.getEducationalTeacherId();
+							List<Integer> quitUserIdList = new ArrayList<Integer>();
+							if(educationalTeacherId != null){
+								quitUserIdList.add(educationalTeacherId);
+							}
+							Map<Integer, String> userRoleMap = new HashMap<Integer, String>(1);
+							userRoleMap.put(cooperationOrgan.getEducationUserId(), "乐团主管");
+							classGroups.forEach(e -> {
+								if(educationalTeacherId != null){
+									imGroupMemberService.quit(e.getId().longValue(), quitUserIdList);
+								}
+								imGroupMemberService.join(e.getId().longValue(), userRoleMap);
+							});
+						}
+					}
+					//更新预报名群信息
+					List<MusicGroup> musicGroupList = musicGroupDao.findByCooperationId(cooperationOrgan.getId());
+					if(musicGroupList.size() > 0){
+						for (MusicGroup musicGroup : musicGroupList) {
+							//不是导入的乐团
+							if(musicGroup.getId().length() > 10){
+								//是否有预报名的群聊
+								ImGroup imGroup = imGroupService.get(Long.parseLong(musicGroup.getId()));
+								if(imGroup != null){
+									imGroupMemberService.quit(Long.parseLong(musicGroup.getId()),musicGroup.getEducationalTeacherId());
+									imGroupMemberService.join(Long.parseLong(musicGroup.getId()),cooperationOrgan.getEducationUserId(),"乐团主管",false);
+								}
+							}
+						}
+					}
+					//修改乐团主管
+					musicGroupDao.batchUpdateEdu(cooperationOrgan.getId(),cooperationOrgan.getEducationUserId());
+					System.out.println(cooperationOrgan.getName() + "  OK");
+				}
+			}
+		}
+	}
 }

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

@@ -988,7 +988,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     }
 
     @Override
-    public List<Date> getCourseScheduleDates(Date month, String organIdList, String type) {
+    public List<Date> getCourseScheduleDates(Date month, String organIdList, String type, Integer transactionTeacherId) {
 //		Map<String, Object> params = new HashMap<>();
 //		params.put("organIdList", organIdList);
 //
@@ -1015,7 +1015,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(StringUtils.isNotBlank(organIdList)){
 			organIds = Arrays.stream(organIdList.split(",")).map(s->Integer.valueOf(s)).collect(Collectors.toList());
 		}
-		return courseScheduleDao.getCourseScheduleDateWithOrgan(organIds, month, type);
+		return courseScheduleDao.getCourseScheduleDateWithOrgan(organIds, month, type, transactionTeacherId);
     }
 
     @Override

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

@@ -3,11 +3,14 @@ package com.ym.mec.biz.service.impl;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.service.ImGroupService;
 import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.im.entity.GroupMember;
+import com.ym.mec.im.entity.GroupModel;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -41,7 +44,7 @@ import org.springframework.util.CollectionUtils;
 
 @Service
 public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  implements EmployeeService {
-	
+
 	@Autowired
 	private EmployeeDao employeeDao;
 	@Autowired
@@ -62,6 +65,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	private OrganizationDao organizationDao;
 	@Autowired
 	private ImGroupDao imGroupDao;
+	@Autowired
+	private CooperationOrganDao cooperationOrganDao;
 
 	@Override
 	public BaseDAO<Integer, Employee> getDAO() {
@@ -117,6 +122,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 			if(sysUser != null && !sysUser.getId().equals(employee.getUserId())){
 				throw new BizException("手机号已存在");
 			}
+			if(sysUser == null){
+				sysUser = sysUserFeignService.queryUserInfo();
+			}
 		}
 		employeeDao.update(employee);
 		//删除当前用户角色
@@ -256,8 +264,10 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	public void level(List<EmployeeLevelDto> employeeLevelDtos) {
 		Integer levelUserId = employeeLevelDtos.get(0).getLevelUserId();
 		List<ImGroupModel> educationGroupModels = new ArrayList<>();
-		List<ImGroupModel> teamGroupModels = new ArrayList<>();
-		List<ImGroupModel> directorGroupModels = new ArrayList<>();
+//		List<ImGroupModel> teamGroupModels = new ArrayList<>();
+//		List<ImGroupModel> directorGroupModels = new ArrayList<>();
+		//获取用户需要加入的预报名群聊
+//		List<ImGroupModel> applyGroupModels = new ArrayList<>();
 		//获取用户担任教务老师的所有乐团列表
 		List<String> musicGroupIds = employeeDao.queryMusicGroupIdByUserId(levelUserId);
 		//获取用户担任教务老师的所有网管课列表
@@ -267,6 +277,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 		//获取用户需要加入的群组列表
 		Map<String, List<EmployeeLevelDto>> collect = employeeLevelDtos.stream().collect(Collectors.groupingBy(e -> e.getRoleName()));
 		Set<String> roleNames = collect.keySet();
+		Set<Integer> userIds = new HashSet<>();
 		for (String roleName : roleNames) {
 			List<EmployeeLevelDto> levelDtos = collect.get(roleName);
 			Map<Integer, List<EmployeeLevelDto>> organIdMap = levelDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
@@ -277,28 +288,60 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 					if(employeeLevelDto.getLevelUserId() == employeeLevelDto.getTransferUserId()){
 						throw new BizException("交接人校验失败,请重新填写");
 					}
+					userIds.add(employeeLevelDto.getTransferUserId());
+					//获取关联的预报名的群聊
+					educationGroupModels.addAll(classGroupDao.queryApplyGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 					switch (roleName){
 						case "education":
+							//替换当前分部合作单位关联的乐团主管
+							cooperationOrganDao.batchUpdateEduId(employeeLevelDto.getTransferUserId(),levelUserId,organId);
 							//教务老师所需加入的群组
 							educationGroupModels.addAll(classGroupDao.queryEducationGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "teamTeacher":
 							//运营主管所需加入的群组
-							teamGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
+							educationGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "director":
 							//乐队指导所需加入的群组
-							directorGroupModels.addAll(classGroupDao.queryDirectorGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
+							educationGroupModels.addAll(classGroupDao.queryDirectorGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 					}
 				}
 			}
 		}
+		Date date = new Date();
+//		educationGroupModels.addAll(applyGroupModels);
+//		educationGroupModels.addAll(educationGroupModels);
+//		educationGroupModels.addAll(teamGroupModels);
 		if(educationGroupModels.size() > 0){
+			Map<Integer, String> realNameMap = MapUtil.convertIntegerMap(teacherDao.queryNameByIdList(new ArrayList<>(userIds)));
 			//❤️用户加群
+			List<com.ym.mec.biz.dal.entity.ImGroupMember> imGroupMemberList = new ArrayList<>();
+			List<GroupModel> groupModelList = new ArrayList<>();
 			for (ImGroupModel imGroupModel : educationGroupModels) {
-				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
-				
+				String userId = imGroupModel.getMemberList().get(0).getId();
+				com.ym.mec.biz.dal.entity.ImGroupMember imGroupMember = new com.ym.mec.biz.dal.entity.ImGroupMember();
+				imGroupMember.setCreateTime(date);
+				imGroupMember.setImGroupId(Long.parseLong(imGroupModel.getId()));
+				imGroupMember.setIsAdmin(false);
+				imGroupMember.setRoleType(imGroupModel.getUserRole());
+				imGroupMember.setUpdateTime(date);
+				imGroupMember.setUserId(Integer.parseInt(userId));
+				imGroupMember.setNickname(realNameMap.get(imGroupMember.getUserId()));
+				imGroupMemberList.add(imGroupMember);
+				GroupMember groupMember = new GroupMember(userId, imGroupModel.getId());
+				GroupModel groupModel = new GroupModel(imGroupModel.getId(), new GroupMember[] { groupMember }, imGroupModel.getName());
+				groupModelList.add(groupModel);
+			}
+			imGroupMemberService.batchInsert(imGroupMemberList);
+			imFeignService.groupBatchJoin(groupModelList);
+		}
+		/*if(educationGroupModels.size() > 0){
+			//❤️用户加群
+			for (ImGroupModel imGroupModel : educationGroupModels) {
+				Map<Integer,String> userRoleMap = new HashMap<>();
+
 				List<ImGroupMember> memberList = imGroupModel.getMemberList();
 				for(ImGroupMember member : memberList){
 					userRoleMap.put(Integer.parseInt(member.getId()), "乐团主管");
@@ -310,7 +353,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 			//❤️用户加群
 			for (ImGroupModel imGroupModel : teamGroupModels) {
 				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
-				
+
 				List<ImGroupMember> memberList = imGroupModel.getMemberList();
 				for(ImGroupMember member : memberList){
 					userRoleMap.put(Integer.parseInt(member.getId()), "运营主管");
@@ -322,22 +365,42 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 			//❤️用户加群
 			for (ImGroupModel imGroupModel : directorGroupModels) {
 				Map<Integer,String> userRoleMap = new HashMap<Integer, String>();
-				
+
 				List<ImGroupMember> memberList = imGroupModel.getMemberList();
 				for(ImGroupMember member : memberList){
 					userRoleMap.put(Integer.parseInt(member.getId()), "乐队指导");
 				}
 				imGroupMemberService.join(Long.parseLong(imGroupModel.getId()), userRoleMap);
 			}
-		}
+		}*/
 		//原有员工退群
 		List<ImGroupModel> groupModels = classGroupDao.queryTeacherQuitGroups(levelUserId);
-		if(groupModels.size() > 0){
+		/*if(groupModels.size() > 0){
+
 			List<Long> imGroupIdList = new ArrayList<Long>();
 			for (ImGroupModel imGroupModel : groupModels) {
 				imGroupIdList.add(Long.parseLong(imGroupModel.getId()));
 			}
 			imGroupMemberService.quit(imGroupIdList, levelUserId);
+		}*/
+		//原有员工退预报名群
+		groupModels.addAll(classGroupDao.queryQuitApplyGroups(levelUserId));
+//		groupModels.addAll(imGroupModels);
+		if(groupModels.size() > 0){
+			List<com.ym.mec.biz.dal.entity.ImGroupMember> imGroupMemberList = new ArrayList<>();
+			List<GroupModel> groupModelList = new ArrayList<>();
+			for (ImGroupModel imGroupModel : groupModels) {
+				com.ym.mec.biz.dal.entity.ImGroupMember imGroupMember = new com.ym.mec.biz.dal.entity.ImGroupMember();
+				imGroupMember.setImGroupId(Long.parseLong(imGroupModel.getId()));
+				imGroupMember.setUserId(Integer.parseInt(imGroupModel.getMemberList().get(0).getId()));
+				imGroupMemberList.add(imGroupMember);
+
+				GroupMember groupMember = new GroupMember(imGroupMember.getUserId().toString(), imGroupModel.getId());
+				GroupModel groupModel = new GroupModel(imGroupModel.getId(), new GroupMember[] { groupMember }, imGroupModel.getName());
+				groupModelList.add(groupModel);
+			}
+			imGroupMemberService.batchDeleteByGroupIdAndUserId(imGroupMemberList);
+			imFeignService.groupBatchQuit(groupModelList);
 		}
 		//更换教务老师等数据
 		employeeDao.employeeLevel(employeeLevelDtos);
@@ -360,6 +423,10 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 				imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.VIP);
 			}
 		}
+		//更新群成员数量
+		imGroupDao.updateMemberNum();
+		//删除重复的群成员
+		imGroupMemberService.delRepeat();
 	}
 
 	@Override

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -154,6 +154,27 @@ public class ExportServiceImpl implements ExportService {
                             }
                             row.setCloudTeacherFee(cloudTeacherFee);
                             break;
+                        case DEGREE_REGISTRATION:
+                            BigDecimal degreeFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                degreeFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setDegreeFee(degreeFee);
+                            break;
+                        case VIP:
+                            BigDecimal vipCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                vipCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setVipCourseFee(vipCourseFee);
+                            break;
+                        case THEORY_COURSE:
+                            BigDecimal theoryCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                theoryCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setTheoryCourseFee(theoryCourseFee);
+                            break;
                         default:
                             break;
                     }
@@ -424,6 +445,27 @@ public class ExportServiceImpl implements ExportService {
                             }
                             row.setCloudTeacherFee(cloudTeacherFee);
                             break;
+                        case DEGREE_REGISTRATION:
+                            BigDecimal degreeFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                degreeFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setDegreeFee(degreeFee);
+                            break;
+                        case VIP:
+                            BigDecimal vipCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                vipCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setVipCourseFee(vipCourseFee);
+                            break;
+                        case THEORY_COURSE:
+                            BigDecimal theoryCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                theoryCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setTheoryCourseFee(theoryCourseFee);
+                            break;
                         default:
                             break;
                     }

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

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
+import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
@@ -364,4 +365,19 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
             currentPage=currentPage.add(BigDecimal.ONE);
         }
 	}
+
+	@Override
+	public PageInfo<EduHomeworkCardDto> getEduHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo) {
+		PageInfo<EduHomeworkCardDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		int count = extracurricularExercisesReplyDao.countEduHomeworkList(params);
+		pageInfo.setTotal(count);
+		params.put("offset", pageInfo.getOffset());
+		List<EduHomeworkCardDto> dataList = extracurricularExercisesReplyDao.getEduHomeworkList(params);
+
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 46 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -4,10 +4,13 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.common.entity.ImGroupModel;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -89,18 +92,31 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		if(classGroup.getGroupType() == GroupType.MUSIC){
 			MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 			tags = musicGroup.getName();
-			userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
-			userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
-			userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+			if(musicGroup.getEducationalTeacherId() != null){
+				userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
+			}
+			if(musicGroup.getTeamTeacherId() != null){
+				userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
+			}
+			if(musicGroup.getDirectorUserId() != null){
+				userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+			}
+			if(musicGroup.getTransactionTeacherId() != null){
+				userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
+			}
 		}else if(classGroup.getGroupType() == GroupType.PRACTICE){
 			PracticeGroup practiceGroup = practiceGroupDao.get(Long.parseLong(classGroup.getMusicGroupId()));
 			tags = practiceGroup.getName();
 			userRoleMap.put(practiceGroup.getUserId(), "指导老师");
-			userRoleMap.put(practiceGroup.getEducationalTeacherId(), "乐团主管");
+			if(practiceGroup.getEducationalTeacherId() != null){
+				userRoleMap.put(practiceGroup.getEducationalTeacherId(), "乐团主管");
+			}
 		}else if(classGroup.getGroupType() == GroupType.VIP){
 			VipGroup vipGroup = vipGroupDao.get(Long.parseLong(classGroup.getMusicGroupId()));
 			userRoleMap.put(vipGroup.getUserId(), "指导老师");
-			userRoleMap.put(vipGroup.getEducationalTeacherId(), "乐团主管");
+			if(vipGroup.getEducationalTeacherId() != null){
+				userRoleMap.put(vipGroup.getEducationalTeacherId(), "乐团主管");
+			}
 			tags = vipGroup.getName();
 		}
 		ImGroup imGroup = imGroupService.create(imGroupId, null, classGroup.getName(), tags, tags, tags, null, classGroup.getGroupType().getCode());
@@ -298,4 +314,29 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		return true;
 	}
 
+	@Override
+	public void batchInsert(List<ImGroupMember> imGroupMemberList) {
+		imGroupMemberDao.batchInsert(imGroupMemberList);
+	}
+
+	@Override
+	public void batchDelete(List<ImGroupMember> imGroupMemberList) {
+		imGroupMemberDao.batchDelete(imGroupMemberList);
+	}
+
+	@Override
+	public void batchDeleteByGroupIdAndUserId(List<ImGroupMember> imGroupMemberList) {
+		imGroupMemberDao.batchDeleteByGroupIdAndUserId(imGroupMemberList);
+	}
+
+	@Override
+	public boolean isExit(String groupId, String userId) {
+		return imGroupMemberDao.isExit(groupId,userId);
+	}
+
+	@Override
+	public void delRepeat() {
+		imGroupMemberDao.delRepeat();
+	}
+
 }

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -8,10 +8,12 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.IndexBaseDto;
 import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
 import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.IndexDataQueryInfo;
+import com.ym.mec.biz.service.EmployeeService;
 import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
@@ -60,6 +62,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
 	@Autowired
 	private ClassGroupDao classGroupDao;
+	@Autowired
+	private EmployeeService employeeService;
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
 		@Override
@@ -258,6 +262,33 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PROGRESS_MUSIC_GROUP_NUM)) {
 			saveData(indexBaseMonthDataDao.getMusicData(dayStr), dayStr, IndexDataType.PROGRESS_MUSIC_GROUP_NUM);
 		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(TRANSACTION_TEACHER_NUM)) {
+			List<SimpleUserDto> transactionTeachers = employeeService.findByRole("58", null);
+			Map<Integer, Integer> organTeacherNumMap = new HashMap<>();
+			for (SimpleUserDto transactionTeacher : transactionTeachers) {
+				Set<Integer> organIds = Arrays.stream(transactionTeacher.getOrganIds().split(",")).map(s -> Integer.valueOf(s)).collect(Collectors.toSet());
+				for (Integer organId : organIds) {
+					if(organTeacherNumMap.containsKey(organId)){
+						organTeacherNumMap.put(organId, organTeacherNumMap.get(organId)+1);
+					}else{
+						organTeacherNumMap.put(organId, 1);
+					}
+				}
+			}
+			List<IndexBaseMonthData> datas = new ArrayList<>();
+			Date month = DateUtil.stringToDate(dayStr, "yyyy-MM-dd");
+			for (Map.Entry<Integer, Integer> organTeacherNumMapEntry : organTeacherNumMap.entrySet()) {
+				IndexBaseMonthData data = new IndexBaseMonthData();
+				data.setOrganId(organTeacherNumMapEntry.getKey());
+				data.setMonth(month);
+				BigDecimal num = new BigDecimal(organTeacherNumMapEntry.getValue());
+				data.setTotalNum(num);
+				data.setActivateNum(num);
+				data.setPercent(num);
+				datas.add(data);
+			}
+			saveData(datas, dayStr, IndexDataType.TRANSACTION_TEACHER_NUM);
+		}
 
 		//人事数据
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.TEACHER_NUM)) {

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

@@ -238,6 +238,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团初始状态错误");
         }
         musicGroup.setDelFlag(false);
+        CooperationOrgan cooperationOrgan = cooperationOrganDao.get(musicGroup.getCooperationOrganId());
+        if(cooperationOrgan.getEducationUserId() == null){
+            throw new BizException("操作失败:请先配置合作单位: {} 关联的乐团主管",cooperationOrgan.getName());
+        }
+        musicGroup.setEducationalTeacherId(cooperationOrgan.getEducationUserId());
         // 保存乐团基本信息
         musicGroupDao.insert(musicGroup);
 
@@ -716,6 +721,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setUpdateTime(date);
+
+        if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
+            studentPaymentOrder.setPaymentChannel("ADAPAY");
+        }
         studentPaymentOrderService.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
@@ -887,6 +896,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setRoutingOrganId(musicGroup.getOrganId());
         studentPaymentOrder.setUpdateTime(date);
+
+        if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
+            studentPaymentOrder.setPaymentChannel("ADAPAY");
+        }
         studentPaymentOrderService.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
@@ -1164,6 +1177,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getDirectorUserId() != null) {
             userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
         }
+        if (musicGroup.getTransactionTeacherId() != null) {
+            userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
+        }
         // 添加成员
         imGroupMemberService.join(Long.parseLong(musicGroupId), userRoleMap);
         Set<Integer> roleIds = new HashSet<>(1);
@@ -2559,28 +2575,32 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (classGroups == null || classGroups.size() == 0) {
             return;
         }
-        Integer teamTeacherId = newMusicGroup.getTeamTeacherId();
-        Integer educationalTeacherId = newMusicGroup.getEducationalTeacherId();
-
-        Integer oldDirectorUserId = oldMusicGroup.getDirectorUserId();
-        if (oldDirectorUserId == null) {
-            oldDirectorUserId = teamTeacherId;
+        List<Integer> quitUserIdList = new ArrayList<>();
+        if(oldMusicGroup.getTeamTeacherId() != null){
+            quitUserIdList.add(oldMusicGroup.getTeamTeacherId());
         }
-        Integer directorUserId = newMusicGroup.getDirectorUserId();
-        if (directorUserId == null) {
-            directorUserId = teamTeacherId;
+        if(oldMusicGroup.getEducationalTeacherId() != null){
+            quitUserIdList.add(oldMusicGroup.getEducationalTeacherId());
+        }
+        if(oldMusicGroup.getDirectorUserId() != null){
+            quitUserIdList.add(oldMusicGroup.getDirectorUserId());
+        }
+        if(oldMusicGroup.getTransactionTeacherId() != null){
+            quitUserIdList.add(oldMusicGroup.getTransactionTeacherId());
+        }
+        Map<Integer, String> userRoleMap = new HashMap<>(4);
+        if(newMusicGroup.getTeamTeacherId() != null){
+            userRoleMap.put(newMusicGroup.getTeamTeacherId(), "运营主管");
+        }
+        if(newMusicGroup.getEducationalTeacherId() != null){
+            userRoleMap.put(newMusicGroup.getEducationalTeacherId(), "乐团主管");
+        }
+        if(newMusicGroup.getDirectorUserId() != null){
+            userRoleMap.put(newMusicGroup.getDirectorUserId(), "乐队指导");
+        }
+        if(newMusicGroup.getTransactionTeacherId() != null){
+            userRoleMap.put(newMusicGroup.getTransactionTeacherId(), "衔接老师");
         }
-
-        List<Integer> quitUserIdList = new ArrayList<Integer>();
-        quitUserIdList.add(oldMusicGroup.getTeamTeacherId());
-        quitUserIdList.add(oldMusicGroup.getEducationalTeacherId());
-        quitUserIdList.add(oldDirectorUserId);
-
-        Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
-        userRoleMap.put(directorUserId, "乐队指导");
-        userRoleMap.put(educationalTeacherId, "乐团主管");
-        userRoleMap.put(teamTeacherId, "运营主管");
-
         classGroups.forEach(e -> {
             imGroupMemberService.quit(e.getId().longValue(), quitUserIdList);
             imGroupMemberService.join(e.getId().longValue(), userRoleMap);
@@ -2611,9 +2631,52 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             //如果已生成课表,那么修改未上课时教学点
             courseScheduleDao.updateCourseScheduleSchool("MUSIC", musicGroupId, musicGroup.getSchoolId());
         }
+        CooperationOrgan cooperationOrgan = cooperationOrganDao.get(musicGroup.getCooperationOrganId());
+        if(cooperationOrgan.getEducationUserId() == null){
+            throw new BizException("操作失败:请先配置合作单位: {} 关联的乐团主管",cooperationOrgan.getName());
+        }
+        boolean refresh = false;
+        musicGroup.setEducationalTeacherId(cooperationOrgan.getEducationUserId());
         if (group.getStatus() == MusicGroupStatusEnum.PROGRESS) {
+            refresh = true;
             updateTeamTeacher(group, musicGroup);
         }
+        //不是导入的乐团
+        if(musicGroupId.length() > 10){
+            //是否有预报名的群聊
+            ImGroup imGroup = imGroupService.get(Long.parseLong(musicGroupId));
+            if(imGroup != null){
+                refresh = true;
+                List<Integer> quitUserIdList = new ArrayList<>();
+                if(group.getTeamTeacherId() != null){
+                    quitUserIdList.add(group.getTeamTeacherId());
+                }
+                if(group.getEducationalTeacherId() != null){
+                    quitUserIdList.add(group.getEducationalTeacherId());
+                }
+                if(group.getDirectorUserId() != null){
+                    quitUserIdList.add(group.getDirectorUserId());
+                }
+                if(group.getTransactionTeacherId() != null){
+                    quitUserIdList.add(group.getTransactionTeacherId());
+                }
+                Map<Integer, String> userRoleMap = new HashMap<>(4);
+                if(musicGroup.getTeamTeacherId() != null){
+                    userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
+                }
+                if(musicGroup.getEducationalTeacherId() != null){
+                    userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
+                }
+                if(musicGroup.getDirectorUserId() != null){
+                    userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
+                }
+                if(musicGroup.getTransactionTeacherId() != null){
+                    userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
+                }
+                imGroupMemberService.quit(Long.parseLong(musicGroupId),quitUserIdList);
+                imGroupMemberService.join(Long.parseLong(musicGroupId),userRoleMap);
+            }
+        }
 
         Date date = new Date();
         //缴费方式不同
@@ -2639,7 +2702,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (subFeeSettingDto.getMusicGroupPaymentEntities() != null && subFeeSettingDto.getMusicGroupPaymentEntities().size() > 0) {
             musicGroupPaymentEntitiesDao.batchAdd(subFeeSettingDto.getMusicGroupPaymentEntities(), musicGroupId);
         }
-        if (group.getStatus() == MusicGroupStatusEnum.PROGRESS) {
+        if (refresh) {
             imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
         }
         //记录操作日志
@@ -3012,7 +3075,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     public List<MusicGroup> findByCooperationId(Integer cooperationId) {
-        return musicGroupDao.findByCooperationId(cooperationId,"PROGRESS");
+        return musicGroupDao.findByCooperationId(cooperationId);
     }
 
 }

+ 37 - 50
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java

@@ -50,8 +50,6 @@ public class SoundServiceImpl implements SoundService {
     @Autowired
     private SysMusicScoreDao sysMusicScoreDao;
     @Autowired
-    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
-    @Autowired
     private IdGeneratorService idGeneratorService;
 
     /**
@@ -62,23 +60,15 @@ public class SoundServiceImpl implements SoundService {
      */
     private List<Double> beatExtractor(byte[] bytes, String url) throws UnsupportedAudioFileException {
         List<Double> times = new ArrayList<>();
-        int size = 256;
-        int overlap = 128;
+        int size = 512;
+        int overlap = 256;
         AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromFile(url, size, overlap);
 
-        ComplexOnsetDetector detector = new ComplexOnsetDetector(size);
-        BeatRootOnsetEventHandler handler = new BeatRootOnsetEventHandler();
-        detector.setHandler(handler);
-
+        ComplexOnsetDetector detector = new ComplexOnsetDetector(size,0.7,0.1);
+        detector.setHandler((double time, double salience) -> times.add(time));
         dispatcher.addAudioProcessor(detector);
-        dispatcher.run();
 
-        handler.trackBeats(new OnsetHandler() {
-            @Override
-            public void handleOnset(double time, double salience) {
-                times.add(time);
-            }
-        });
+        dispatcher.run();
         return times;
     }
 
@@ -93,7 +83,6 @@ public class SoundServiceImpl implements SoundService {
         List<Double> pitchs = new ArrayList<>();
         int size = 2048;
         int overlap = 0;
-        Double[] t = new Double[1];
         final SilenceDetector silenceDetecor = new SilenceDetector();
         AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromFile(url, size, overlap);
         dispatcher.addAudioProcessor(silenceDetecor);
@@ -105,13 +94,11 @@ public class SoundServiceImpl implements SoundService {
 
             @Override
             public boolean process(AudioEvent audioEvent) {
-                t[0] = audioEvent.getEndTimeStamp();
                 pitchs.add(Double.isInfinite(silenceDetecor.currentSPL())?0:silenceDetecor.currentSPL());
                 return true;
             }
         });
         dispatcher.run();
-        pitchs.add(t[0]);
         return pitchs;
     }
 
@@ -131,35 +118,41 @@ public class SoundServiceImpl implements SoundService {
 
     @Override
     public HttpResponseResult compare(MultipartFile record, Integer musicScoreId) {
+        if(record.getSize()<1024){
+            throw new BizException("录音时间太短");
+        }
         SysMusicScore sysMusicScore = sysMusicScoreDao.get(musicScoreId);
         if(Objects.isNull(sysMusicScore)|| StringUtils.isBlank(sysMusicScore.getUrl())){
             throw new BizException("伴奏信息错误");
         }
         Map<String, BigDecimal> result = new HashMap<>();
 
+        LOGGER.info("录音文件大小:{}MB,伴奏编号:{},源文件:{}", record.getSize()/1048576f, musicScoreId, sysMusicScore.getUrl());
+        String tmpDir = FileUtils.getTempDirectoryPath() + "/";
+
+        BigDecimal oneHandred = new BigDecimal(100);
+        //总分
         BigDecimal score = BigDecimal.ZERO;
+        //相似度
         BigDecimal intonation = BigDecimal.ZERO;
+        //节奏
         BigDecimal cadence = BigDecimal.ZERO;
+        //完整度
         BigDecimal integrity = BigDecimal.ZERO;
         File f = null;
         File f_r = null;
         try {
+            //存储录音文件
+            String filePath_r =  tmpDir + idGeneratorService.generatorId("sound") + "_r.wav";
+            f_r = new File(filePath_r);
+            FileUtils.copyToFile(record.getInputStream(), f_r);
+
+            //下载原音文件
             URL url = new URL(sysMusicScore.getUrl());
-            String filePath = FileUtils.getTempDirectoryPath()+ idGeneratorService.generatorId("sound") + ".mp3";
+            String filePath = tmpDir + idGeneratorService.generatorId("sound") + "_s.mp3";
             f = new File(filePath);
             FileUtils.copyURLToFile(url, f);
 
-            LOGGER.info("文件名:{},伴奏编号:{},源文件:{}", record.getOriginalFilename(), musicScoreId, filePath);
-
-            BigDecimal oneHandred = new BigDecimal(100);
-
-            BigDecimal l_s = new BigDecimal(0);
-            BigDecimal l_r = new BigDecimal(0);
-
-            String filePath_r = FileUtils.getTempDirectoryPath()+ idGeneratorService.generatorId("sound") + ".mp3";
-            f_r = new File(filePath_r);
-            FileUtils.copyToFile(record.getInputStream(), f_r);
-
             //相似度
             List<Double> pitchs_s = soundPressureLevelExtractor(null, filePath);
             List<Double> pitchs_r = soundPressureLevelExtractor(null, filePath_r);
@@ -169,22 +162,16 @@ public class SoundServiceImpl implements SoundService {
                 maxLength = pitchs_r.size();
             }
 
-            if(maxLength>0){
-                l_s = new BigDecimal(pitchs_s.get(pitchs_s.size() - 1));
-                pitchs_s.remove(pitchs_s.size() - 1);
-                l_r = new BigDecimal(pitchs_r.get(pitchs_r.size() - 1));
-                pitchs_r.remove(pitchs_r.size() - 1);
-                maxLength = maxLength-1;
-            }
-
             double pitchSize = 0;
             double allPitchGap = 0;
             for(int i=0;i<maxLength;i++){
                 double pitch1 = Math.abs(pitchs_s.get(i));
                 double pitch2 = Math.abs(pitchs_r.get(i));
                 double pitchGap = Math.abs(pitch1-pitch2);
-                if(pitchGap>pitch1){
+                if(pitchGap>pitch1||pitchGap>20){
                     pitchGap = pitch1;
+                }else if(pitchGap<5){
+                    pitchGap = 0;
                 }
                 allPitchGap+=pitchGap;
                 pitchSize+=pitch1;
@@ -202,7 +189,7 @@ public class SoundServiceImpl implements SoundService {
             float sameTimes = 0;
             for (Double time1 : times_s) {
                 for (Double time2 : times_r) {
-                    if(Math.abs(time2-time1)<1.5){
+                    if(Math.abs(time2-time1)<1.3){
                         sameTimes++;
                         break;
                     }
@@ -210,21 +197,21 @@ public class SoundServiceImpl implements SoundService {
             }
             double cadence_d = 0;
             sameTimes = sameTimes>times_r.size()?times_r.size():sameTimes;
+            int allTimes = times_s.size();
             if (times_r.size()>0){
-                cadence_d = sameTimes/times_r.size();
+                cadence_d = sameTimes/allTimes;
             }
             cadence = new BigDecimal(cadence_d).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
 
-            integrity = new BigDecimal(0);
-            if(l_r.compareTo(BigDecimal.ZERO)<=0||l_s.compareTo(BigDecimal.ZERO)<=0){
-
-            }else if(l_r.compareTo(l_s)<0){
-                integrity = l_r.divide(l_s, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
-            }else{
-                integrity = new BigDecimal(100);
+            //完整度
+            BigDecimal time_s = new BigDecimal(times_s.size());
+            BigDecimal time_r = new BigDecimal(times_r.size());
+            if(time_s.compareTo(time_r)<0){
+                time_r = time_s;
             }
+            integrity = time_r.divide(time_s, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHandred).setScale(0, BigDecimal.ROUND_HALF_UP);
 
-            score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), 0, BigDecimal.ROUND_HALF_UP);
+            score = intonation.multiply(new BigDecimal(0.4)).add(cadence.multiply(new BigDecimal(0.4))).add(integrity.multiply(new BigDecimal(0.2))).setScale(0, BigDecimal.ROUND_HALF_UP);
 
 
         } catch (UnsupportedAudioFileException e) {
@@ -236,7 +223,7 @@ public class SoundServiceImpl implements SoundService {
                 f.delete();
             }
             if(f_r!=null){
-                f_r.delete();
+                f_r.deleteOnExit();
             }
         }
 

+ 139 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -5,15 +5,15 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.biz.service.StudentServeService;
 import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -37,8 +38,6 @@ import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-
 @Service
 public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, StudentCourseHomework> implements StudentCourseHomeworkService {
 
@@ -71,9 +70,13 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
     private VipGroupDao vipGroupDao;
     @Autowired
     private PracticeGroupDao practiceGroupDao;
+    @Autowired
+    private ExtracurricularExercisesReplyDao extracurricularExercisesReplyDao;
 
     @Override
     public BaseDAO<Long, StudentCourseHomework> getDAO() {
@@ -277,11 +280,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
     }
 
     @Override
-    public List<StudentCourseHomework> findStudentCourseHomeworkByCourse(Long courseSchedule, String userName) {
-        if (Objects.isNull(courseSchedule)) {
-            throw new BizException("请指定课程");
-        }
-        return studentCourseHomeworkDao.findByCourseSchedule(courseSchedule, userName);
+    public List<StudentCourseHomework> findStudentCourseHomeworkByCourse(Long courseSchedule, Long homeworkId, String userName) {
+        return studentCourseHomeworkDao.findByCourseSchedule(courseSchedule, homeworkId, userName);
     }
 
     @Override
@@ -479,4 +479,133 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public PageInfo<EduHomeworkCardDto> getEduCourseHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo) {
+        PageInfo<EduHomeworkCardDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        int count = studentCourseHomeworkDao.countEduCourseHomeworkList(params);
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        List<EduHomeworkCardDto> dataList = studentCourseHomeworkDao.getEduCourseHomeworkList(params);
+
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<EduHomeworkStatDto> queryEduHomeworkStatList(StudentCourseHomeWorkQueryInfo queryInfo) {
+        PageInfo<EduHomeworkStatDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("musicGroupStatus", MusicGroupStatusEnum.PROGRESS.getCode());
+
+        int count = musicGroupDao.queryCount(params);
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        List<MusicGroup> musicGroups = musicGroupDao.queryPage(params);
+
+        List<EduHomeworkStatDto> dataList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(musicGroups)){
+            List<String> groupIds = musicGroups.stream().map(MusicGroup::getId).collect(Collectors.toList());
+            List<StudentRegistration> studentRegistrations = studentRegistrationDao.findByMusicGroupIds(groupIds, StudentMusicGroupStatusEnum.NORMAL);
+            Map<String, Long> groupStudentNumMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getMusicGroupId, Collectors.counting()));
+
+            BigDecimal oneHundred = new BigDecimal(100);
+            BigDecimal zero = new BigDecimal("0.00");
+
+            List<EduHomeworkCardDto> courseHomeworkStudentNumList = studentCourseHomeworkDao.countHomeworkStudentInfoWithMusicGroup(groupIds, queryInfo.getStartTime(), queryInfo.getEndTime());
+            List<EduHomeworkCardDto> homeworkStudentNumList = extracurricularExercisesReplyDao.countEduHomeworkStudentNumWithMusicGroup(groupIds, queryInfo.getStartTime(), queryInfo.getEndTime());
+            homeworkStudentNumList.addAll(courseHomeworkStudentNumList);
+            Map<String, List<EduHomeworkCardDto>> groupStudentListMap = homeworkStudentNumList.stream().collect(Collectors.groupingBy(EduHomeworkCardDto::getGroupId));
+            for (MusicGroup mg : musicGroups) {
+                EduHomeworkStatDto ehs = new EduHomeworkStatDto();
+                ehs.setGroupId(mg.getId());
+                ehs.setGroupName(mg.getName());
+                if(groupStudentNumMap.containsKey(mg.getId())){
+                    ehs.setGroupStudentNum(Math.toIntExact(groupStudentNumMap.get(mg.getId())));
+                }else{
+                    ehs.setGroupStudentNum(0);
+                }
+                int exceptStudentNum = 0;
+                int submitStudentNum = 0;
+                if(groupStudentListMap.containsKey(mg.getId())){
+                    List<EduHomeworkCardDto> eduHomeworkCardDtos = groupStudentListMap.get(mg.getId());
+                    for (EduHomeworkCardDto eduHomeworkCardDto : eduHomeworkCardDtos) {
+                        exceptStudentNum += eduHomeworkCardDto.getExceptStudentNum();
+                        submitStudentNum += eduHomeworkCardDto.getSubmitStudentNum();
+                    }
+                }
+                ehs.setExceptStudentNum(exceptStudentNum);
+                ehs.setSubmitStudentNum(submitStudentNum);
+                if(exceptStudentNum<=0){
+                    ehs.setSubmitRate(zero);
+                }else{
+                    ehs.setSubmitRate(new BigDecimal(submitStudentNum).divide(new BigDecimal(exceptStudentNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHundred));
+                }
+                dataList.add(ehs);
+            }
+        }
+
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<EduHomeworkStatDto> queryEduHomeworkStatDetail(StudentCourseHomeWorkQueryInfo queryInfo) {
+        List<EduHomeworkStatDto> dataList = new ArrayList<>();
+        MusicGroup musicGroup = musicGroupDao.get(queryInfo.getGroupId());
+        if(Objects.isNull(musicGroup)){
+            return dataList;
+        }
+        List<StudentRegistration> studentRegistrations = studentRegistrationDao.findByMusicGroupIds(Arrays.asList(queryInfo.getGroupId()), StudentMusicGroupStatusEnum.NORMAL);
+        Map<Integer, Long> subjectStudentNumMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId, Collectors.counting()));
+
+        Map<Integer, Subject> idSubjectMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(subjectStudentNumMap)){
+            List<Subject> subjects = subjectDao.findBySubjectIds(new ArrayList<>(subjectStudentNumMap.keySet()));
+            idSubjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, s -> s, (s1, s2) -> s1));
+        }
+
+        BigDecimal oneHundred = new BigDecimal(100);
+        BigDecimal zero = new BigDecimal("0.00");
+
+        List<EduHomeworkCardDto> courseHomeworkStudentNumList = studentCourseHomeworkDao.countHomeworkSubjectStudentInfoWithMusicGroup(queryInfo.getGroupId(), queryInfo.getStartTime(), queryInfo.getEndTime());
+        List<EduHomeworkCardDto> homeworkStudentNumList = extracurricularExercisesReplyDao.countEduHomeworkSubjectStudentNumWithMusicGroup(queryInfo.getGroupId(), queryInfo.getStartTime(), queryInfo.getEndTime());
+        homeworkStudentNumList.addAll(courseHomeworkStudentNumList);
+        Map<Integer, List<EduHomeworkCardDto>> subjectStudentListMap = homeworkStudentNumList.stream().collect(Collectors.groupingBy(EduHomeworkCardDto::getSubjectId));
+        for (Map.Entry<Integer, Long> subjectStudentNumEntry : subjectStudentNumMap.entrySet()) {
+            EduHomeworkStatDto ehs = new EduHomeworkStatDto();
+            if(idSubjectMap.containsKey(subjectStudentNumEntry.getKey())){
+                ehs.setSubjectName(idSubjectMap.get(subjectStudentNumEntry.getKey()).getName());
+            }
+            ehs.setGroupId(queryInfo.getGroupId());
+            ehs.setGroupName(musicGroup.getName());
+            if(subjectStudentNumMap.containsKey(subjectStudentNumEntry.getKey())){
+                ehs.setGroupStudentNum(Math.toIntExact(subjectStudentNumMap.get(subjectStudentNumEntry.getKey())));
+            }else{
+                ehs.setGroupStudentNum(0);
+            }
+            int exceptStudentNum = 0;
+            int submitStudentNum = 0;
+            if(subjectStudentListMap.containsKey(subjectStudentNumEntry.getKey())){
+                List<EduHomeworkCardDto> eduHomeworkCardDtos = subjectStudentListMap.get(subjectStudentNumEntry.getKey());
+                for (EduHomeworkCardDto eduHomeworkCardDto : eduHomeworkCardDtos) {
+                    exceptStudentNum += eduHomeworkCardDto.getExceptStudentNum();
+                    submitStudentNum += eduHomeworkCardDto.getSubmitStudentNum();
+                }
+            }
+            ehs.setExceptStudentNum(exceptStudentNum);
+            ehs.setSubmitStudentNum(submitStudentNum);
+            if(exceptStudentNum<=0){
+                ehs.setSubmitRate(zero);
+            }else{
+                ehs.setSubmitRate(new BigDecimal(submitStudentNum).divide(new BigDecimal(exceptStudentNum), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP).multiply(oneHundred));
+            }
+            dataList.add(ehs);
+        }
+        return dataList;
+    }
 }

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

@@ -90,6 +90,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentInstrumentService studentInstrumentService;
     @Autowired
     private ReplacementInstrumentActivityService replacementInstrumentActivityService;
+    @Autowired
+    private ChildrenDayReserveService childrenDayReserveService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -374,6 +376,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             studentInstrumentService.orderCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.REPLACEMENT)) {
             replacementInstrumentActivityService.orderCallback(order);
+        }else if (order.getType().equals(OrderTypeEnum.DEGREE)) {
+            childrenDayReserveService.orderCallback(order);
         }
     }
 

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

@@ -1810,4 +1810,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     public Integer quitAllStudent(String musicGroupId, String remark) {
         return studentRegistrationDao.quitAllStudent(musicGroupId, remark);
     }
+
+    @Override
+    public List<Map<String, Integer>> countNormalNum(List<String> musicGroupIds) {
+        return studentRegistrationDao.countNormalNum(StringUtils.join(musicGroupIds,","));
+    }
 }

+ 13 - 0
mec-biz/src/main/resources/config/mybatis/ChildrenDayDegreeDetailDao.xml

@@ -90,4 +90,17 @@
             now(),now())
         </foreach>
     </insert>
+
+    <update id="updateStatus">
+        UPDATE children_day_degree_detail
+        SET status_=#{status},
+            update_time = NOW()
+        WHERE order_id_ = #{orderId}
+    </update>
+
+    <select id="getByOrderId" resultMap="ChildrenDayDegreeDetail">
+        SELECT *
+        FROM children_day_degree_detail
+        WHERE order_id_ = #{orderId}
+    </select>
 </mapper>

+ 116 - 0
mec-biz/src/main/resources/config/mybatis/ChildrenDayDegreeInfoDao.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.ChildrenDayDegreeInfoDao">
+    <resultMap id="ChildrenDayDegreeInfo" type="com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo">
+        <!--@mbg.generated-->
+        <!--@Table children_day_degree_info-->
+        <id column="id_" property="id"/>
+        <result column="reserve_id_" property="reserveId"/>
+        <result column="user_id_" property="userId"/>
+        <result column="subject_id_" property="subjectId"/>
+        <result column="grade_level_" property="gradeLevel"/>
+        <result column="grade_price_" property="gradePrice"/>
+        <result column="theory_level_" property="theoryLevel"/>
+        <result column="theory_price_" property="theoryPrice"/>
+        <result column="vip_1v1_price_" property="vip1v1Price"/>
+        <result column="vip_1v2_price_" property="vip1v2Price"/>
+        <result column="theory_course_price_" property="theoryCoursePrice"/>
+        <result column="total_amount_" property="totalAmount"/>
+        <result column="order_id_" property="orderId"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+    </resultMap>
+
+    <select id="get" parameterType="java.lang.Integer" resultMap="ChildrenDayDegreeInfo">
+        <!--@mbg.generated-->
+        select *
+        from children_day_degree_info
+        where id_ = #{id}
+    </select>
+
+    <delete id="delete" parameterType="java.lang.Integer">
+        <!--@mbg.generated-->
+        delete from children_day_degree_info
+        where id_ = #{id}
+    </delete>
+
+    <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo"
+            useGeneratedKeys="true">
+        <!--@mbg.generated-->
+        insert into children_day_degree_info (reserve_id_, user_id_, subject_id_, grade_level_, grade_price_,
+        theory_level_,theory_price_, vip_1v1_price_, vip_1v2_price_, theory_course_price_, total_amount_,order_id_,
+        create_time_, update_time_)
+        values (#{reserveId}, #{userId}, #{subjectId}, #{gradeLevel}, #{gradePrice}, #{theoryLevel},
+        #{theoryPrice}, #{vip1v1Price}, #{vip1v2Price}, #{theoryCoursePrice}, #{totalAmount},#{orderId},
+        NOW(), NOW())
+    </insert>
+
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo">
+        <!--@mbg.generated-->
+        update children_day_degree_info
+        <set>
+            <if test="reserveId != null">
+                reserve_id_ = #{reserveId},
+            </if>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
+            <if test="subjectId != null">
+                subject_id_ = #{subjectId},
+            </if>
+            <if test="gradeLevel != null">
+                grade_level_ = #{gradeLevel},
+            </if>
+            <if test="gradePrice != null">
+                grade_price_ = #{gradePrice},
+            </if>
+            <if test="theoryLevel != null">
+                theory_level_ = #{theoryLevel},
+            </if>
+            <if test="theoryPrice != null">
+                theory_price_ = #{theoryPrice},
+            </if>
+            <if test="vip1v1Price != null">
+                vip_1v1_price_ = #{vip1v1Price},
+            </if>
+            <if test="vip1v2Price != null">
+                vip_1v2_price_ = #{vip1v2Price},
+            </if>
+            <if test="theoryCoursePrice != null">
+                theory_course_price_ = #{theoryCoursePrice},
+            </if>
+            <if test="totalAmount != null">
+                total_amount_ = #{totalAmount},
+            </if>
+            <if test="orderId != null">
+                order_id_ = #{orderId},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+            <if test="updateTime != null">
+                update_time_ = NOW(),
+            </if>
+        </set>
+        where id_ = #{id}
+    </update>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="ChildrenDayDegreeInfo" parameterType="map">
+        SELECT * FROM children_day_degree_info
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*)
+        FROM children_day_degree_info
+    </select>
+
+    <select id="getPayedUser" resultType="java.lang.Integer">
+        SELECT * FROM children_day_degree_info WHERE user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </select>
+</mapper>

+ 178 - 10
mec-biz/src/main/resources/config/mybatis/ChildrenDayReserveMapper.xml

@@ -9,6 +9,7 @@
         <result column="cooperation_organ_id_" property="cooperationOrganId"/>
         <result column="music_group_id_" property="musicGroupId"/>
         <result column="is_reserve_" property="isReserve" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="is_send_msg_" property="isSendMsg" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
     </resultMap>
@@ -51,6 +52,9 @@
             <if test="isReserve != null">
                 is_reserve_ = #{isReserve,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="isSendMsg != null">
+                is_send_msg_ = #{isSendMsg,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
             <if test="createTime != null">
                 create_time_ = #{createTime},
             </if>
@@ -75,8 +79,13 @@
     <resultMap id="ChildrenStatisticsDtoMap" type="com.ym.mec.biz.dal.dto.ChildrenStatisticsDto">
         <result property="buyMusicTheoryAmount" column="buy_music_theory_amount_"/>
         <result property="buyMusicTheoryNum" column="buy_music_theory_num_"/>
-        <result property="buyVipAmount" column="buy_vip_amount_"/>
-        <result property="buyVipNum" column="buy_vip_num_"/>
+        <result property="buyVip1Amount" column="buy_vip1_amount_"/>
+        <result property="buyVip1Num" column="buy_vip1_num_"/>
+        <result property="buyVip2Amount" column="buy_vip2_amount_"/>
+        <result property="buyVip2Num" column="buy_vip2_num_"/>
+        <result property="gradePrice" column="grade_price_"/>
+        <result property="theoryPrice" column="theory_price_"/>
+        <result property="totalAmount" column="total_amount_"/>
         <result property="cooperationOrganName" column="cooperation_organ_name_"/>
         <result property="instrumentalMusicNum" column="instrumental_music_num_"/>
         <result property="musicGroupName" column="music_group_name_"/>
@@ -90,17 +99,32 @@
         <result property="musicGroupId" column="music_group_id_"/>
     </resultMap>
     <select id="queryChildrenStatistics" resultMap="ChildrenStatisticsDtoMap">
-        SELECT o.name_ organ_name_,co.name_ cooperation_organ_name_,mg.name_ music_group_name_,COUNT(sr.user_id_) normal_num_,cdr.organ_id_,
+        SELECT o.name_ organ_name_,co.name_ cooperation_organ_name_,mg.name_ music_group_name_,cdr.organ_id_,
         cdr.cooperation_organ_id_,cdr.music_group_id_,
-        COUNT(DISTINCT CASE WHEN cdr.is_reserve_ = 1 THEN 1 ELSE NULL END) 'reserve_num_',
-        COUNT(DISTINCT CASE WHEN cdr.is_reserve_ = 0 THEN 1 ELSE NULL END) 'no_reserve_num_'
+        COUNT(DISTINCT cdrr.user_id_) 'reserve_num_',
+        COUNT(DISTINCT cdrn.user_id_) 'no_reserve_num_',
+        COUNT(CASE WHEN cdd.grade_price_ > 0 THEN 1 ELSE NULL END) 'instrumental_music_num_',
+        COUNT(CASE WHEN cdd.theory_price_ > 0 THEN 1 ELSE NULL END) 'music_theory_num_',
+        COUNT(CASE WHEN cdd.vip_1v1_price_ > 0 THEN 1 ELSE NULL END) 'buy_vip1_num_',
+        SUM(cdd.vip_1v1_price_) 'buy_vip1_amount_',
+        COUNT(CASE WHEN cdd.vip_1v2_price_ > 0 THEN 1 ELSE NULL END) 'buy_vip2_num_',
+        SUM(cdd.vip_1v2_price_) 'buy_vip2_amount_',
+        COUNT(CASE WHEN cdd.theory_course_price_ > 0 THEN 1 ELSE NULL END) 'buy_music_theory_num_',
+        SUM(cdd.theory_course_price_) 'buy_music_theory_amount_',
+        SUM(cdd.grade_price_) 'grade_price_',
+        SUM(cdd.theory_price_) 'theory_price_',
+        SUM(cdd.total_amount_) 'total_amount_'
         FROM children_day_reserve cdr
+        LEFT JOIN children_day_degree_info cdd ON cdr.id_ = cdd.reserve_id_
         LEFT JOIN music_group mg ON mg.id_ = cdr.music_group_id_
-        LEFT JOIN student_registration sr ON sr.music_group_id_ = cdr.music_group_id_ AND sr.music_group_status_ = 'NORMAL' AND cdr.user_id_ = sr.user_id_
         LEFT JOIN cooperation_organ co ON co.id_ = cdr.cooperation_organ_id_
         LEFT JOIN organization o ON o.id_ = cdr.organ_id_
+        LEFT JOIN (SELECT * FROM children_day_reserve cdr WHERE cdr.is_reserve_ = 1
+            <include refid="queryChildrenStatisticsSql1"/>) cdrr ON cdrr.id_ = cdr.id_
+        LEFT JOIN (SELECT * FROM children_day_reserve cdr WHERE cdr.is_reserve_ = 0
+        <include refid="queryChildrenStatisticsSql1"/>) cdrn ON cdrn.id_ = cdr.id_
         <include refid="queryChildrenStatisticsSql"/>
-        GROUP BY cdr.music_group_id_
+        GROUP BY cdr.music_group_id_,cdr.cooperation_organ_id_,cdr.organ_id_
         ORDER BY cdr.id_ DESC
         <include refid="global.limit"/>
     </select>
@@ -108,7 +132,27 @@
         SELECT COUNT(c.id_) FROM (SELECT COUNT(cdr.id_) id_
         FROM children_day_reserve cdr
         <include refid="queryChildrenStatisticsSql"/>
-        GROUP BY cdr.music_group_id_) c
+        GROUP BY cdr.music_group_id_,cdr.cooperation_organ_id_,cdr.organ_id_) c
+    </select>
+
+    <select id="childrenStatistics" resultMap="ChildrenStatisticsDtoMap">
+        SELECT SUM(CASE WHEN cdd.grade_price_ > 0 THEN 1 ELSE NULL END) 'instrumental_music_num_',
+        SUM(CASE WHEN cdd.theory_price_ > 0 THEN 1 ELSE NULL END) 'music_theory_num_',
+        SUM(CASE WHEN cdd.vip_1v1_price_ > 0 THEN 1 ELSE NULL END) 'buy_vip1_num_',
+        SUM(cdd.vip_1v1_price_) 'buy_vip1_amount_',
+        SUM(CASE WHEN cdd.vip_1v2_price_ > 0 THEN 1 ELSE NULL END) 'buy_vip2_num_',
+        SUM(cdd.vip_1v2_price_) 'buy_vip2_amount_',
+        SUM(CASE WHEN cdd.theory_course_price_ > 0 THEN 1 ELSE NULL END) 'buy_music_theory_num_',
+        SUM(cdd.theory_course_price_) 'buy_music_theory_amount_',
+        SUM(cdd.grade_price_) 'grade_price_',
+        SUM(cdd.theory_price_) 'theory_price_',
+        SUM(cdd.total_amount_) 'total_amount_'
+        FROM children_day_reserve cdr
+        LEFT JOIN children_day_degree_info cdd ON cdr.id_ = cdd.reserve_id_
+        LEFT JOIN music_group mg ON mg.id_ = cdr.music_group_id_
+        LEFT JOIN cooperation_organ co ON co.id_ = cdr.cooperation_organ_id_
+        LEFT JOIN organization o ON o.id_ = cdr.organ_id_
+        <include refid="queryChildrenStatisticsSql"/>
     </select>
     <sql id="queryChildrenStatisticsSql">
         <where>
@@ -123,6 +167,17 @@
             </if>
         </where>
     </sql>
+    <sql id="queryChildrenStatisticsSql1">
+        <if test="cooperationId != null">
+            AND cdr.cooperation_organ_id_ = #{cooperationId}
+        </if>
+        <if test="musicGroupId != null and musicGroupId != ''">
+            AND cdr.music_group_id_ = #{musicGroupId}
+        </if>
+        <if test="organId != null">
+            AND FIND_IN_SET(cdr.organ_id_,#{organId})
+        </if>
+    </sql>
 
     <select id="getByUserId" resultMap="ChildrenDayReserve">
         SELECT *
@@ -131,38 +186,151 @@
     </select>
 
     <resultMap id="ChildrenStatisticsDetailDtoMap" type="com.ym.mec.biz.dal.dto.ChildrenStatisticsDetailDto">
+        <result property="organName" column="organ_name_"/>
+        <result property="cooperationOrganName" column="cooperation_organ_name_"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="currentClass" column="current_class_"/>
+        <result property="realName" column="real_name_"/>
         <result property="username" column="username_"/>
         <result property="userId" column="user_id_"/>
         <result property="isReserve" column="is_reserve_"/>
         <result property="phone" column="phone_"/>
+        <result property="subjectName" column="subject_name_"/>
+        <result property="gradeLeave" column="grade_level_"/>
+        <result property="theoryLevel" column="theory_level_"/>
+        <result property="buyVipFlag" column="buy_vip_flag_"/>
+        <result property="buyTheoryCourseFlag" column="buy_theory_course_flag_"/>
+        <result property="totalAmount" column="total_amount_"/>
     </resultMap>
     <select id="countChildrenStatisticsDetail" resultType="int">
         SELECT COUNT(cdr.id_) FROM children_day_reserve cdr
         LEFT JOIN sys_user su ON su.id_ = cdr.user_id_
+        LEFT JOIN children_day_degree_info cdd ON cdr.id_ = cdd.reserve_id_
         <include refid="queryChildrenStatisticsDetailSql"/>
     </select>
     <select id="queryChildrenStatisticsDetail" resultMap="ChildrenStatisticsDetailDtoMap">
-        SELECT su.username_,su.phone_,cdr.user_id_,cdr.is_reserve_
+        SELECT su.username_,su.phone_,cdr.user_id_,cdr.is_reserve_,s.name_
+        subject_name_,cdd.grade_level_,cdd.theory_level_,
+        CASE WHEN cdd.vip_1v1_price_ > 0 OR cdd.vip_1v2_price_ > 0 THEN 1 ELSE 0 END buy_vip_flag_,
+        CASE WHEN cdd.theory_course_price_ > 0 THEN 1 ELSE 0 END buy_theory_course_flag_,cdd.total_amount_
         FROM children_day_reserve cdr
+        LEFT JOIN children_day_degree_info cdd ON cdr.id_ = cdd.reserve_id_
         LEFT JOIN sys_user su ON su.id_ = cdr.user_id_
+        LEFT JOIN `subject` s ON s.id_ = cdd.subject_id_
         <include refid="queryChildrenStatisticsDetailSql"/>
         ORDER BY cdr.create_time_ DESC
         <include refid="global.limit"/>
     </select>
+    <select id="exportStatisticsDetail" resultMap="ChildrenStatisticsDetailDtoMap">
+        SELECT o.name_ organ_name_,co.name_ cooperation_organ_name_,mg.name_ music_group_name_,cdr.user_id_,
+        su.username_,su.phone_,s.name_
+        subject_name_,st.current_class_,sut.real_name_,cdr.is_reserve_,cdd.grade_level_,cdd.theory_level_,
+        CASE WHEN cdd.vip_1v1_price_ > 0 OR cdd.vip_1v2_price_ > 0 THEN 1 ELSE 0 END buy_vip_flag_,
+        CASE WHEN cdd.theory_course_price_ > 0 THEN 1 ELSE 0 END buy_theory_course_flag_,cdd.total_amount_
+        FROM children_day_reserve cdr
+        LEFT JOIN children_day_degree_info cdd ON cdr.id_ = cdd.reserve_id_
+        LEFT JOIN organization o ON o.id_ = cdr.organ_id_
+        LEFT JOIN cooperation_organ co ON co.id_ = cdr.cooperation_organ_id_
+        LEFT JOIN music_group mg ON mg.id_ = cdr.music_group_id_
+        LEFT JOIN student st ON st.user_id_ = cdr.user_id_
+        LEFT JOIN sys_user sut ON sut.id_ = st.teacher_id_
+        LEFT JOIN sys_user su ON su.id_ = cdr.user_id_
+        LEFT JOIN `subject` s ON s.id_ = cdd.subject_id_
+        <where>
+            <if test="cooperationId != null">
+                AND cdr.cooperation_organ_id_ = #{cooperationId}
+            </if>
+            <if test="musicGroupId != null and musicGroupId != ''">
+                AND cdr.music_group_id_ = #{musicGroupId}
+            </if>
+            <if test="organId != null">
+                AND FIND_IN_SET(cdr.organ_id_,#{organId})
+            </if>
+        </where>
+        ORDER BY cdr.organ_id_,cdr.create_time_ DESC
+    </select>
     <sql id="queryChildrenStatisticsDetailSql">
         <where>
             <if test="search != null and search != ''">
-                AND (cdr.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+                AND (cdr.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE
+                CONCAT('%',#{search},'%'))
             </if>
             <if test="isReserve != null">
                 AND cdr.is_reserve_ = #{isReserve}
             </if>
+            <if test="organId != null and organId != ''">
+                AND cdr.organ_id_ = #{organId}
+            </if>
+            <if test="cooperationId != null">
+                AND cdr.cooperation_organ_id_ = #{cooperationId}
+            </if>
+            <if test="cooperationId == null">
+                AND cdr.cooperation_organ_id_ IS NULL
+            </if>
             <if test="musicGroupId != null and musicGroupId != ''">
                 AND cdr.music_group_id_ = #{musicGroupId}
             </if>
             <if test="musicGroupId == null">
                 AND cdr.music_group_id_ IS NULL
             </if>
+            <if test="subjectId != null">
+                AND cdd.subject_id_ = #{subjectId}
+            </if>
+            <if test="gradeFlag != null">
+                <if test="gradeFlag == 1">
+                    AND cdd.grade_level_ IS NOT NULL
+                </if>
+                <if test="gradeFlag == 0">
+                    AND cdd.grade_level_ IS NULL
+                </if>
+            </if>
+            <if test="theoryFlag != null">
+                <if test="theoryFlag == 1">
+                    AND cdd.theory_level_ IS NOT NULL
+                </if>
+                <if test="theoryFlag == 0">
+                    AND cdd.theory_level_ IS NULL
+                </if>
+            </if>
+            <if test="vipFlag != null">
+                <if test="vipFlag == 1">
+                    AND (cdd.vip_1v1_price_ > 0 OR cdd.vip_1v2_price_ > 0)
+                </if>
+                <if test="vipFlag == 0">
+                    AND cdd.vip_1v1_price_ &lt;= 0 AND cdd.vip_1v2_price_ &lt;= 0
+                </if>
+            </if>
+            <if test="theoryPriceFlag != null">
+                <if test="theoryPriceFlag == 1">
+                    AND cdd.theory_course_price_ > 0
+                </if>
+                <if test="theoryPriceFlag == 0">
+                    AND cdd.theory_course_price_ &lt;= 0
+                </if>
+            </if>
         </where>
     </sql>
+
+    <select id="getSendMsgList" resultMap="ChildrenStatisticsDetailDtoMap">
+        SELECT cdr.*,su.phone_ FROM children_day_reserve cdr
+        LEFT JOIN sys_user su ON su.id_ = cdr.user_id_
+        <where>
+            (cdr.is_reserve_ = 1 AND is_send_msg_ = 0) AND
+            <foreach collection="msgDtos" item="msgDto" open="(" close=")" separator="OR">
+                <if test="msgDto.musicGroupId != null">
+                    (cdr.organ_id_=#{msgDto.organId} AND cdr.music_group_id_ = #{msgDto.musicGroupId})
+                </if>
+                <if test="msgDto.musicGroupId == null">
+                    (cdr.organ_id_=#{msgDto.organId} AND cdr.music_group_id_ IS NULL)
+                </if>
+            </foreach>
+        </where>
+    </select>
+
+    <update id="updateSendMasStatus">
+        UPDATE children_day_reserve SET is_send_msg_ = 1 WHERE user_id_ IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </update>
 </mapper>

+ 30 - 7
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -316,6 +316,7 @@
         <result column="img_" property="img"/>
         <result column="teacher_ids_" property="teacherIds"/>
         <result column="group_name_" property="groupName"/>
+        <result column="user_role_" property="userRole"/>
         <collection property="memberList" ofType="com.ym.mec.common.entity.ImGroupMember">
             <result property="id" column="user_id_"/>
         </collection>
@@ -513,13 +514,35 @@
         LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
         WHERE cgtm.user_id_ != #{userId} AND cg.del_flag_ = 0
         AND ((vg.educational_teacher_id_ =  #{userId} AND vg.group_status_ IN (2,6) AND cg.group_type_ = 'VIP')
-        OR (mg.status_ IN ('PROGRESS','PAUSE') AND cg.group_type_ = 'MUSIC' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
+        OR (mg.status_ IN ('PROGRESS','PAUSE','PREPARE') AND cg.group_type_ = 'MUSIC' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
         OR (csg.educational_teacher_id_ =  #{userId} AND csg.status_ = 'NORMAL' AND cg.group_type_ = 'COMM'))
         GROUP BY cg.id_
     </select>
 
+    <select id="queryQuitApplyGroups" resultMap="imGroupModel">
+        SELECT mg.id_,ig.name_,#{userId} user_id_
+        FROM music_group mg
+        LEFT JOIN im_group ig ON ig.id_ = mg.id_
+        LEFT JOIN im_group_member igm ON igm.im_group_id_ = ig.id_
+        WHERE LENGTH(mg.id_) > 10 AND (mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId} OR mg.team_teacher_id_ = #{userId})
+        AND ig.id_ IS NOT NULL AND mg.del_flag_ = 0 AND igm.user_id_ = #{userId}
+    </select>
+    <select id="queryApplyGroups" resultMap="imGroupModel">
+        SELECT mg.id_,ig.name_,#{transferUserId} user_id_,
+        CASE WHEN mg.educational_teacher_id_ = #{userId} THEN '乐团主管' WHEN mg.team_teacher_id_ = #{userId} THEN '运营主管' ELSE '乐队指导' END user_role_
+        FROM music_group mg
+        LEFT JOIN im_group ig ON ig.id_ = mg.id_
+        LEFT JOIN im_group_member igm ON igm.im_group_id_ = ig.id_ AND igm.user_id_ = #{transferUserId}
+        WHERE LENGTH(mg.id_) > 10 AND (mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId} OR mg.team_teacher_id_ = #{userId})
+        AND ig.id_ IS NOT NULL AND igm.id_ IS NULL AND mg.del_flag_ = 0
+        <if test="organId != null">
+            AND mg.organ_id_ = #{organId}
+        </if>
+    </select>
+
     <select id="queryEducationGroups" resultMap="imGroupModel">
-        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_
+        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_,
+        '乐团主管' user_role_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
@@ -527,27 +550,27 @@
         LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
         WHERE cg.del_flag_ = 0 AND
         ((vg.group_status_ IN (2,6) AND cg.group_type_ = 'VIP' AND vg.educational_teacher_id_ =  #{userId} AND vg.organ_id_ = #{organId})
-        OR (mg.status_ IN ('PROGRESS','PAUSE') AND cg.group_type_ = 'MUSIC' AND mg.educational_teacher_id_ =  #{userId} AND mg.organ_id_ = #{organId})
+        OR (mg.status_ IN ('PROGRESS','PAUSE','PREPARE') AND cg.group_type_ = 'MUSIC' AND mg.educational_teacher_id_ =  #{userId} AND mg.organ_id_ = #{organId})
         OR (csg.status_ = 'NORMAL' AND cg.group_type_ = 'COMM' AND csg.educational_teacher_id_ =  #{userId} AND csg.organ_id_ = #{organId}))
         GROUP BY cg.id_
     </select>
 
     <select id="queryTeamTeacherGroups" resultMap="imGroupModel">
         SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,
-               #{transferUserId} user_id_
+               #{transferUserId} user_id_,'运营主管' user_role_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
-        WHERE mg.team_teacher_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE')  AND cg.group_type_ = 'MUSIC'
+        WHERE mg.team_teacher_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE','PREPARE')  AND cg.group_type_ = 'MUSIC'
         GROUP BY cg.id_
     </select>
 
     <select id="queryDirectorGroups" resultMap="imGroupModel">
-        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_
+        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_,'乐队指导' user_role_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND cg.group_type_ = 'MUSIC'
-        WHERE mg.director_user_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE')
+        WHERE mg.director_user_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE','PREPARE')
         GROUP BY cg.id_
     </select>
 

+ 26 - 23
mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml

@@ -6,6 +6,8 @@
     <resultMap type="com.ym.mec.biz.dal.entity.CooperationOrgan"
                id="CooperationOrgan">
         <result column="id_" property="id"/>
+        <result column="education_user_id_" property="educationUserId"/>
+        <result column="real_name_" property="realName"/>
         <result column="name_" property="name"/>
         <result column="linkman_" property="linkman"/>
         <result column="organ_id_" property="organId"/>
@@ -45,16 +47,19 @@
             useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         INSERT INTO cooperation_organ
         (id_, name_, linkman_, job_, mobile_no_, address_, organ_id_, create_time_, update_time_, ownership_type_,
-         is_enable_, full_job_resource_)
+         is_enable_, full_job_resource_,education_user_id_)
         VALUES (#{id}, #{name}, #{linkman}, #{job}, #{mobileNo}, #{address}, #{organId}, now(), now(),
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{isEnable},
-                #{fullJobResource})
+                #{fullJobResource},#{educationUserId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CooperationOrgan">
         UPDATE cooperation_organ
         <set>
+            <if test="educationUserId != null">
+                education_user_id_ = #{educationUserId},
+            </if>
             <if test="fullJobResource != null">
                 full_job_resource_ = #{fullJobResource},
             </if>
@@ -96,14 +101,27 @@
         WHERE id_ = #{id}
     </update>
 
+    <update id="batchUpdateEduId">
+        UPDATE cooperation_organ SET education_user_id_ = #{transferUserId} WHERE organ_id_ = #{organId} AND education_user_id_ = #{levelUserId}
+    </update>
+
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="ExtCooperationOrgan"
             parameterType="map">
-        SELECT co.*,o.name_ organ_name_ FROM cooperation_organ co left join organization o on co.organ_id_ = o.id_
+        SELECT co.*,o.name_ organ_name_,su.real_name_ FROM cooperation_organ co
+        LEFT JOIN organization o ON co.organ_id_ = o.id_
+        LEFT JOIN sys_user su ON su.id_ = co.education_user_id_
+        <include refid="queryPageSql"/>
+        ORDER BY co.update_time_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <sql id="queryPageSql">
         <where>
             co.del_flag_ != 1
             <if test="search != null">
-                AND (co.id_ LIKE CONCAT('%',#{search},'%') OR co.name_ LIKE CONCAT('%',#{search},'%'))
+                AND (co.education_user_id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%')
+                OR co.id_ LIKE CONCAT('%',#{search},'%') OR co.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="organId != null">
                 AND FIND_IN_SET(co.organ_id_,#{organId})
@@ -115,28 +133,13 @@
                 AND co.full_job_resource_ = #{fullJobResource}
             </if>
         </where>
-        ORDER BY co.update_time_ DESC
-        <include refid="global.limit"/>
-    </select>
+    </sql>
 
     <!-- 查询当前表的总记录数 -->
     <select id="queryCount" resultType="int">
-        SELECT COUNT(*) FROM cooperation_organ
-        <where>
-            del_flag_ != 1
-            <if test="search != null">
-                AND (id_ LIKE CONCAT('%',#{search},'%') OR name_ LIKE CONCAT('%',#{search},'%'))
-            </if>
-            <if test="organId != null">
-                AND FIND_IN_SET(organ_id_,#{organId})
-            </if>
-            <if test="isEnable != null">
-                AND is_enable_ = #{isEnable}
-            </if>
-            <if test="fullJobResource != null">
-                AND full_job_resource_ = #{fullJobResource}
-            </if>
-        </where>
+        SELECT COUNT(co.id_) FROM cooperation_organ co
+        LEFT JOIN sys_user su ON su.id_ = co.education_user_id_
+        <include refid="queryPageSql"/>
     </select>
 
     <select id="queryByOrganId" resultMap="CooperationOrgan">

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -531,6 +531,9 @@
             LEFT JOIN sys_user su ON cs.actual_teacher_id_=su.id_
             LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_ AND ta.teacher_id_=cs.actual_teacher_id_
             LEFT JOIN school s ON cs.schoole_id_=s.id_
+            <if test="transactionTeacherId!=null">
+                LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_
+            </if>
         WHERE
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             <if test="organIds!=null and organIds.size()>0">
@@ -552,6 +555,9 @@
             <if test="musicGroupId!=null">
                 AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
             </if>
+            <if test="transactionTeacherId!=null">
+                AND mg.transaction_teacher_id_=#{transactionTeacherId}
+            </if>
             AND cs.class_date_ = DATE_FORMAT(#{date},'%Y-%m-%d')
             ORDER BY CONCAT(cs.class_date_,' ',cs.start_class_time_)
             <include refid="global.limit"/>
@@ -565,6 +571,9 @@
             <if test="classGroupIds != null and organIdList!=null">
                 LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
             </if>
+            <if test="transactionTeacherId!=null">
+                LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_
+            </if>
         WHERE
         (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
         AND cs.id_ IS NOT NULL
@@ -586,6 +595,9 @@
         <if test="musicGroupId!=null">
             AND cs.music_group_id_=#{musicGroupId} AND cs.group_type_='MUSIC'
         </if>
+        <if test="transactionTeacherId!=null">
+            AND mg.transaction_teacher_id_=#{transactionTeacherId}
+        </if>
         AND cs.class_date_ = DATE_FORMAT(#{date},'%Y-%m-%d')
     </select>
 
@@ -996,6 +1008,9 @@
             cs.class_date_
         FROM
             course_schedule cs
+            <if test="transactionTeacherId!=null">
+                LEFT JOIN music_group mg ON cs.music_group_id_=mg.id_
+            </if>
         WHERE
             (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
             <if test="organIds!=null and organIds.size()>0">
@@ -1013,6 +1028,9 @@
             <if test="type!=null and type!=''">
                 AND cs.group_type_=#{type}
             </if>
+            <if test="transactionTeacherId!=null">
+                AND mg.transaction_teacher_id_=#{transactionTeacherId}
+            </if>
         GROUP BY cs.class_date_
     </select>
 

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

@@ -261,8 +261,8 @@
 
     <select id="findByRole" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
         SELECT DISTINCT su.id_ userId,
-          su.real_name_ userName,
-          su.avatar_ avatar,
+            su.real_name_ userName,
+            su.avatar_ avatar,
             e.organ_id_list_ organIds
         FROM
             sys_user su
@@ -359,7 +359,7 @@
     <select id="queryMusicGroupIdByUserId" resultType="java.lang.String">
         SELECT DISTINCT id_ FROM music_group
         WHERE (director_user_id_ = #{levelUserId} OR educational_teacher_id_ = #{levelUserId} OR team_teacher_id_ = #{levelUserId})
-        AND status_ IN ('PROGRESS','PAUSE')
+        AND status_ IN ('PROGRESS','PAUSE','PREPARE')
     </select>
 
     <select id="queryPracticeGroupIdByUserId" resultType="java.lang.String">

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

@@ -30,6 +30,7 @@
 		<result column="teacher_id_" property="teacherId"/>
 		<result column="teacher_name_" property="teacherName"/>
 		<result column="avatar_" property="headUrl"/>
+		<result column="phone_" property="phone"/>
 		<result column="title_" property="title"/>
 		<result column="content_" property="content"/>
 		<result column="expire_date_" property="expireDate"/>
@@ -171,7 +172,8 @@
 		SELECT
 			eer.*,
 			su.username_ student_name_,
-		    su.avatar_
+		    su.avatar_,
+		    su.phone_
 		FROM
 			extracurricular_exercises_reply eer
 			LEFT JOIN sys_user su ON su.id_ = eer.user_id_
@@ -511,4 +513,94 @@
 			</foreach>
 	</select>
 
+	<sql id="getEduHomeworkListCondition">
+		<where>
+			EXISTS (SELECT user_id_ FROM student_registration sr LEFT JOIN music_group mg ON mg.id_=sr.music_group_id_ WHERE sr.user_id_ = eer.user_id_ AND sr.music_group_status_='NORMAL' AND mg.status_ = 'PROGRESS' AND mg.transaction_teacher_id_=#{transactionTeacherId})
+			<if test="startTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
+			</if>
+			<if test="endTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &lt;= DATE_FORMAT(#{endTime}, "%Y-%m-%d")
+			</if>
+		</where>
+	</sql>
+
+    <select id="getEduHomeworkList" resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+		SELECT
+			ee.id_ homeworkId,
+			su.real_name_ teacherName,
+			ee.create_time_ createTime,
+			COUNT( eer.user_id_ ) exceptStudentNum,
+			SUM( eer.status_ ) submitStudentNum,
+			SUM( eer.is_replied_ ) repliedStudentNum
+		FROM
+			extracurricular_exercises ee
+			LEFT JOIN sys_user su ON ee.teacher_id_ = su.id_
+			LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
+		<include refid="getEduHomeworkListCondition" />
+		GROUP BY ee.id_
+		ORDER BY ee.create_time_ DESC
+		<include refid="global.limit"></include>
+	</select>
+
+	<select id="countEduHomeworkList" resultType="int">
+		SELECT
+			COUNT(DISTINCT ee.id_)
+		FROM
+		extracurricular_exercises ee
+		LEFT JOIN sys_user su ON ee.teacher_id_ = su.id_
+		LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
+		<include refid="getEduHomeworkListCondition" />
+	</select>
+	<select id="countEduHomeworkStudentNumWithMusicGroup"
+			resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+		SELECT
+			sr.music_group_id_ groupId,
+			COUNT( eer.user_id_ ) exceptStudentNum,
+			SUM( eer.status_ ) submitStudentNum,
+			SUM( eer.is_replied_ ) repliedStudentNum
+		FROM
+			extracurricular_exercises ee
+			LEFT JOIN sys_user su ON ee.teacher_id_ = su.id_
+			LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
+			LEFT JOIN student_registration sr ON eer.user_id_ = sr.user_id_
+		WHERE sr.music_group_status_='NORMAL'
+			<if test="groupIds!=null and groupIds.size()>0">
+				AND sr.music_group_id_ IN
+				<foreach collection="groupIds" item="groupId" open="(" close=")" separator=",">
+					#{groupId}
+				</foreach>
+			</if>
+			<if test="startTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
+			</if>
+			<if test="endTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &lt;= DATE_FORMAT(#{endTime}, "%Y-%m-%d")
+			</if>
+		GROUP BY sr.music_group_id_
+	</select>
+
+	<select id="countEduHomeworkSubjectStudentNumWithMusicGroup"
+			resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+		SELECT
+		sr.actual_subject_id_ subjectId,
+		COUNT( eer.user_id_ ) exceptStudentNum,
+		SUM( eer.status_ ) submitStudentNum,
+		SUM( eer.is_replied_ ) repliedStudentNum
+		FROM
+		extracurricular_exercises ee
+		LEFT JOIN sys_user su ON ee.teacher_id_ = su.id_
+		LEFT JOIN extracurricular_exercises_reply eer ON ee.id_ = eer.extracurricular_exercises_id_
+		LEFT JOIN student_registration sr ON eer.user_id_ = sr.user_id_
+		WHERE sr.music_group_status_='NORMAL'
+			AND sr.music_group_id_ = #{groupId}
+			<if test="startTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
+			</if>
+			<if test="endTime!=null">
+				AND DATE_FORMAT(ee.create_time_, "%Y-%m-%d") &lt;= DATE_FORMAT(#{endTime}, "%Y-%m-%d")
+			</if>
+		GROUP BY sr.actual_subject_id_
+	</select>
+
 </mapper>

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

@@ -98,6 +98,12 @@
 	<update id="updateUserFriendNickname">
 		UPDATE im_user_friend SET friend_nickname_ = #{nickName} WHERE friend_id_ = #{userId};
 	</update>
+	<update id="updateMemberNum">
+		UPDATE im_group ig
+		LEFT JOIN (SELECT COUNT(id_) num_,im_group_id_ FROM im_group_member GROUP BY im_group_id_) igm ON ig.id_ = igm.im_group_id_
+		SET member_num_ = igm.num_
+		WHERE ig.id_ = igm.im_group_id_
+	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >

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

@@ -112,8 +112,20 @@
             #{item.id}
         </foreach>
 	</delete>
-	
+	<delete id="batchDeleteByGroupIdAndUserId">
+		<foreach collection="list" item="item" separator=";">
+			DELETE FROM im_group_member WHERE im_group_id_ = #{item.imGroupId} AND user_id_ = #{item.userId}
+		</foreach>
+	</delete>
+	<delete id="delRepeat">
+		DELETE FROM im_group_member
+				WHERE id_ IN (SELECT a.id_ FROM (SELECT id_ FROM im_group_member GROUP BY im_group_id_,user_id_ HAVING COUNT(user_id_) > 1) a)
+	</delete>
+
 	<select id="queryByImGroupIdAndUserId" resultMap="ImGroupMember" parameterType="map">
 		SELECT * FROM im_group_member where find_in_set(im_group_id_,#{imGroupIdList}) and find_in_set(user_id_,#{userIdList})
 	</select>
+	<select id="isExit" resultType="java.lang.Boolean">
+		SELECT COUNT(DISTINCT userId) FROM im_group_member WHERE im_group_id_ = #{groupId} AND user_id_ = #{userId}
+	</select>
 </mapper>

+ 15 - 6
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -12,6 +12,7 @@
         <result column="pre_apply_expire_date_" property="preApplyExpireDate"/>
         <result column="team_teacher_id_" property="teamTeacherId"/>
         <result column="educational_teacher_id_" property="educationalTeacherId"/>
+        <result column="transaction_teacher_id_" property="transactionTeacherId"/>
         <result column="charge_type_id_" property="chargeTypeId"/>
         <result column="course_form_" property="courseForm"/>
         <result column="create_time_" property="createTime"/>
@@ -73,7 +74,7 @@
          bill_start_date_, improvent_classes_num_, enroll_classes_, payment_expire_date_, is_extra_class_,
          settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
          parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
-         ownership_type_, repair_user_id_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_,course_view_type_)
+         ownership_type_, repair_user_id_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_,course_view_type_,transaction_teacher_id_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate},#{preApplyExpireDate}, #{teamTeacherId}, #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
                 #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{billStartDate},
@@ -83,7 +84,8 @@
                 #{cooperationOrganId}, #{enlightenmentCourseTime}, #{parentMeetingTime}, #{img}, #{directorUserId},
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
-                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+                #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},
+                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{transactionTeacherId})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -104,6 +106,7 @@
                 status_ = #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
             repair_user_id_ = #{repairUserId},
+            transaction_teacher_id_ = #{transactionTeacherId},
             <if test="organId != null">
                 organ_id_ = #{organId},
             </if>
@@ -185,6 +188,9 @@
         </set>
         WHERE id_ = #{id}
     </update>
+    <update id="batchUpdateEdu">
+        UPDATE music_group SET educational_teacher_id_ = #{educationUserId} WHERE cooperation_organ_id_ = #{cooperationOrganId}
+    </update>
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
@@ -196,7 +202,7 @@
     <select id="queryPage" resultMap="MusicGroup" parameterType="map">
         SELECT * FROM music_group
         <include refid="musicGroupQueryPageSql"/>
-        ORDER BY create_time_ DESC
+        ORDER BY create_time_ DESC,id_
         <include refid="global.limit"/>
     </select>
 
@@ -218,6 +224,9 @@
             <if test="musicGroupId != null">
                 AND FIND_IN_SET(id_,#{musicGroupId})
             </if>
+            <if test="transactionTeacherId!=null">
+                AND transaction_teacher_id_ = #{transactionTeacherId}
+            </if>
             <if test="musicGroupIds!=null and musicGroupIds.size()>0">
                 AND id_ IN
                 <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
@@ -739,11 +748,11 @@
         </foreach>
         AND mg.educational_teacher_id_ IS NOT NULL
     </select>
+    <select id="findByCooperationIdAndStatus" resultMap="MusicGroup">
+        SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationOrganId} AND status_ IN ('PROGRESS','PAUSE','PREPARE')
+    </select>
     <select id="findByCooperationId" resultMap="MusicGroup">
         SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationId}
-        <if test="musicStatus != null">
-            AND status_ = #{musicStatus}
-        </if>
     </select>
 
     <select id="getStudentLastMusicGroup" resultMap="MusicGroup">

+ 14 - 3
mec-biz/src/main/resources/config/mybatis/OrganizationDegreeCourseFeeMapper.xml

@@ -6,8 +6,11 @@
         <!--@Table organization_degree_course_fee-->
         <id column="id_" property="id"/>
         <result column="organ_id_" property="organId"/>
+        <result column="original_vip_1v1_" property="originalVip1v1"/>
+        <result column="original_vip_1v2_" property="originalVip1v2"/>
         <result column="vip_1v1_" property="vip1v1"/>
         <result column="vip_1v2_" property="vip1v2"/>
+        <result column="original_theory_" property="originalTheory"/>
         <result column="theory_" property="theory"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
@@ -26,8 +29,10 @@
     <insert id="insert" keyColumn="id_" keyProperty="id"
             parameterType="com.ym.mec.biz.dal.entity.OrganizationDegreeCourseFee" useGeneratedKeys="true">
         <!--@mbg.generated-->
-        insert into organization_degree_course_fee (organ_id_, vip_1v1_, vip_1v2_,theory_, create_time_, update_time_)
-        values (#{organId}, #{vip1v1},#{vip1v2}, #{theory}, #{createTime}, #{updateTime})
+        insert into organization_degree_course_fee (organ_id_,original_vip_1v1_,original_vip_1v2_, vip_1v1_,
+        vip_1v2_,theory_, create_time_, update_time_)
+        values (#{organId},#{originalVip1v1},#{originalVip1v2}, #{vip1v1},#{vip1v2}, #{theory}, #{createTime},
+        #{updateTime})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.OrganizationDegreeCourseFee">
         <!--@mbg.generated-->
@@ -36,11 +41,17 @@
             <if test="organId != null">
                 organ_id_ = #{organId},
             </if>
+            <if test="originalVip1v1 != null">
+                original_vip_1v1_ = #{originalVip1v1},
+            </if>
+            <if test="originalVip1v2 != null">
+                original_vip_1v2_ = #{originalVip1v2},
+            </if>
             <if test="vip1v1 != null">
                 vip_1v1_ = #{vip1v1},
             </if>
             <if test="vip1v2 != null">
-                vip_1v12 = #{vip1v2},
+                vip_1v2_ = #{vip1v2},
             </if>
             <if test="theory != null">
                 theory_ = #{theory},

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

@@ -258,12 +258,18 @@
         SELECT
         sch.*,
         su.username_,
-        su.avatar_
+        su.avatar_,
+        su.phone_
         FROM
         student_course_homework sch
         LEFT JOIN sys_user su ON sch.user_id_=su.id_
         <where>
-            sch.course_schedule_id_=#{courseScheduleId}
+            <if test="courseScheduleId!=null">
+                AND sch.course_schedule_id_=#{courseScheduleId}
+            </if>
+            <if test="homeworkId!=null">
+                AND sch.course_homework_id_=#{homeworkId}
+            </if>
             <if test="userName!=null and userName!=''">
                 AND su.username_ LIKE CONCAT('%',#{userName},'%')
             </if>
@@ -480,6 +486,107 @@
         <include refid="homeWorkCondition"/>
     </select>
 
+    <sql id="getEduCourseHomeworkListCondition">
+        <where>
+            mg.transaction_teacher_id_ = #{transactionTeacherId}
+            AND mg.status_ = "PROGRESS"
+            AND sr.music_group_status_='NORMAL'
+            <if test="startTime!=null">
+                AND cs.class_date_ &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
+            </if>
+            <if test="endTime!=null">
+                AND cs.class_date_ &lt;= DATE_FORMAT(#{endTime}, "%Y-%m-%d")
+            </if>
+        </where>
+    </sql>
+
+    <select id="getEduCourseHomeworkList" resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+        SELECT
+            ch.id_ homeworkId,
+            cs.id_ courseId,
+            cs.name_ courseName,
+            CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) courseStartTime,
+            cs.actual_teacher_id_ teacherId,
+            su.real_name_ teacherName,
+            COUNT( sch.user_id_ ) exceptStudentNum,
+            SUM( sch.status_ ) submitStudentNum,
+            SUM( sch.is_replied_ ) repliedStudentNum
+        FROM
+            course_homework ch
+            LEFT JOIN music_group mg ON mg.id_ = ch.music_group_id_
+            LEFT JOIN course_schedule cs ON ch.course_schedule_id_ = cs.id_
+            LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
+            LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
+            LEFT JOIN student_registration sr ON sch.user_id_=sr.user_id_ AND ch.music_group_id_=sr.music_group_id_
+        <include refid="getEduCourseHomeworkListCondition" />
+        GROUP BY ch.id_
+        ORDER BY courseStartTime DESC
+        <include refid="global.limit"></include>
+    </select>
+
+    <select id="countEduCourseHomeworkList" resultType="int">
+        SELECT
+            COUNT(DISTINCT cs.id_)
+        FROM
+            course_homework ch
+            LEFT JOIN music_group mg ON mg.id_ = ch.music_group_id_
+            LEFT JOIN course_schedule cs ON ch.course_schedule_id_ = cs.id_
+            LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
+            LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
+            LEFT JOIN student_registration sr ON sch.user_id_=sr.user_id_ AND ch.music_group_id_=sr.music_group_id_
+        <include refid="getEduCourseHomeworkListCondition" />
+    </select>
+
+    <select id="countHomeworkStudentInfoWithMusicGroup" resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+        SELECT
+            ch.music_group_id_ groupId,
+            COUNT( sch.user_id_ ) exceptStudentNum,
+            SUM( sch.status_ ) submitStudentNum,
+            SUM( sch.is_replied_ ) repliedStudentNum
+        FROM
+            course_homework ch
+                LEFT JOIN course_schedule cs ON ch.course_schedule_id_ = cs.id_
+                LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
+                LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
+                LEFT JOIN student_registration sr ON sch.user_id_=sr.user_id_ AND ch.music_group_id_=sr.music_group_id_
+        WHERE sr.music_group_status_='NORMAL'
+            <if test="groupIds!=null and groupIds.size()>0">
+                AND ch.music_group_id_ IN
+                <foreach collection="groupIds" item="groupId" open="(" close=")" separator=",">
+                    #{groupId}
+                </foreach>
+            </if>
+            <if test="startTime!=null">
+                AND cs.class_date_ &gt;= DATE_FORMAT(#{startTime}, "%Y-%m-%d")
+            </if>
+            <if test="endTime!=null">
+                AND cs.class_date_ &lt;= DATE_FORMAT(#{endTime}, "%Y-%m-%d")
+            </if>
+        GROUP BY ch.music_group_id_
+    </select>
+
+    <select id="countHomeworkSubjectStudentInfoWithMusicGroup" resultType="com.ym.mec.biz.dal.dto.EduHomeworkCardDto">
+        SELECT
+            sr.actual_subject_id_ subjectId,
+            COUNT( sch.user_id_ ) exceptStudentNum,
+            SUM( sch.status_ ) submitStudentNum,
+            SUM( sch.is_replied_ ) repliedStudentNum
+        FROM course_homework ch
+            LEFT JOIN course_schedule cs ON ch.course_schedule_id_ = cs.id_
+            LEFT JOIN sys_user su ON cs.actual_teacher_id_ = su.id_
+            LEFT JOIN student_course_homework sch ON ch.id_ = sch.course_homework_id_
+            LEFT JOIN student_registration sr ON sch.user_id_=sr.user_id_ AND ch.music_group_id_=sr.music_group_id_
+        WHERE sr.music_group_status_='NORMAL'
+            AND ch.music_group_id_ = #{groupId}
+            <if test="startTime!=null">
+                AND cs.class_date_ &gt;= #{startTime}
+            </if>
+            <if test="endTime!=null">
+                AND cs.class_date_ &lt;= #{endTime}
+            </if>
+        GROUP BY sr.actual_subject_id_
+    </select>
+
     <sql id="homeWorkCondition">
         <where>
             <if test="userId!=null">

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

@@ -986,6 +986,16 @@
         </foreach>
         LIMIT 1
     </select>
+    <select id="findByMusicGroupIds" resultMap="StudentRegistration">
+        SELECT * FROM student_registration
+        WHERE music_group_id_ IN
+        <foreach collection="groupIds" item="groupId" open="(" close=")" separator=",">
+            #{groupId}
+        </foreach>
+        <if test="musicGroupStatus!=null">
+            AND music_group_status_=#{musicGroupStatus, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+    </select>
 
     <update id="quitAllStudent">
         UPDATE student_registration SET music_group_status_ = 'QUIT',remark_=#{remark} WHERE music_group_id_ = #{musicGroupId}

+ 15 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/dao/OperationLogDao.java

@@ -0,0 +1,15 @@
+package com.yonge.log.dal.dao;
+
+import com.yonge.log.dal.model.OperationLog;
+import com.yonge.mongodb.dao.BaseDaoWithMongo;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OperationLogDao extends BaseDaoWithMongo<String, OperationLog> {
+
+	@Override
+	public Class<OperationLog> getClassEntity() {
+		return OperationLog.class;
+	}
+
+}

+ 81 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/model/OperationLog.java

@@ -0,0 +1,81 @@
+package com.yonge.log.dal.model;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+
+@Document(collection = "sys_operation_log")
+public class OperationLog implements Serializable {
+
+	@Id
+	private String id;
+
+	private String username;
+
+	private Integer userId;
+
+	private String operateName;
+
+	private String interfaceUrl;
+
+	private String operateTime;
+
+	private String token;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getOperateName() {
+		return operateName;
+	}
+
+	public void setOperateName(String operateName) {
+		this.operateName = operateName;
+	}
+
+	public String getInterfaceUrl() {
+		return interfaceUrl;
+	}
+
+	public void setInterfaceUrl(String interfaceUrl) {
+		this.interfaceUrl = interfaceUrl;
+	}
+
+	public String getOperateTime() {
+		return operateTime;
+	}
+
+	public void setOperateTime(String operateTime) {
+		this.operateTime = operateTime;
+	}
+}

+ 8 - 0
mec-common/audit-log/src/main/java/com/yonge/log/service/OperationLogService.java

@@ -0,0 +1,8 @@
+package com.yonge.log.service;
+
+import com.yonge.log.dal.model.OperationLog;
+import com.yonge.mongodb.service.BaseServiceWithMongo;
+
+public interface OperationLogService extends BaseServiceWithMongo<String, OperationLog> {
+
+}

+ 0 - 1
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/AuditLogServiceImpl.java

@@ -2,7 +2,6 @@ package com.yonge.log.service.impl;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
 import com.yonge.log.dal.dao.AuditLogDao;
 import com.yonge.log.dal.model.AuditLog;
 import com.yonge.log.service.AuditLogService;

+ 22 - 0
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/OperationLogServiceImpl.java

@@ -0,0 +1,22 @@
+package com.yonge.log.service.impl;
+
+import com.yonge.log.dal.dao.OperationLogDao;
+import com.yonge.log.dal.model.OperationLog;
+import com.yonge.log.service.OperationLogService;
+import com.yonge.mongodb.dao.BaseDaoWithMongo;
+import com.yonge.mongodb.service.impl.BaseServiceImplWithMongo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class OperationLogServiceImpl extends BaseServiceImplWithMongo<String, OperationLog> implements OperationLogService {
+
+	@Autowired
+	private OperationLogDao operationLogDao;
+
+	@Override
+	public BaseDaoWithMongo<String, OperationLog> getDAO() {
+		return operationLogDao;
+	}
+
+}

+ 3 - 3
mec-common/common-core/pom.xml

@@ -68,9 +68,9 @@
 
 
 		<dependency>
-			<groupId>com.github.dragoon000320</groupId>
-			<artifactId>tarsosdsp</artifactId>
-			<version>1.0</version>
+			<groupId>com.github.st-h</groupId>
+			<artifactId>TarsosDSP</artifactId>
+			<version>2.4.1</version>
 		</dependency>
 	</dependencies>
 </project>

+ 26 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupModel.java

@@ -1,6 +1,8 @@
 package com.ym.mec.common.entity;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 public class ImGroupModel{
     //群组编号
@@ -17,6 +19,7 @@ public class ImGroupModel{
     private Integer minute;
     private Integer count;
     private Integer status;
+    private String userRole;
 
     public ImGroupModel() {
     }
@@ -36,6 +39,14 @@ public class ImGroupModel{
         this.name = name;
     }
 
+    public String getUserRole() {
+        return userRole;
+    }
+
+    public void setUserRole(String userRole) {
+        this.userRole = userRole;
+    }
+
     public List<ImGroupMember> getMemberList() {
         return memberList;
     }
@@ -134,4 +145,19 @@ public class ImGroupModel{
         this.status = status;
         return this;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ImGroupModel that = (ImGroupModel) o;
+        return id.equals(that.id) && Arrays.equals(members, that.members) && memberList.equals(that.memberList);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(id, memberList);
+        result = 31 * result + Arrays.hashCode(members);
+        return result;
+    }
 }

+ 1 - 1
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -11,7 +11,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     @Override
     public void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests().antMatchers("/v2/api-docs","/user/register",
-                "/group/join","/group/create","/room/leave","/room/statusSync",
+                "/group/join","/group/create","/group/quit","/room/leave","/room/statusSync",
                 "/room/statusImMsg","/group/batchDismiss","/private/send","/group/send","/group/dismiss","/room/statusImMsg").permitAll().anyRequest().authenticated().and().csrf().disable();
     }
 }

+ 13 - 2
mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java

@@ -3,6 +3,7 @@ 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.StudentDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.DegreeFeeDto;
 import com.ym.mec.biz.dal.dto.DegreePayDto;
 import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
@@ -13,12 +14,14 @@ import com.ym.mec.biz.service.ChildrenDayReserveService;
 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.util.date.DateUtil;
 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.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -35,6 +38,8 @@ public class ChildrenDayController extends BaseController {
     private StudentDao studentDao;
     @Autowired
     private ChildrenDayDegreeDetailService childrenDayDegreeDetailService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
     @ApiOperation(value = "占位")
     @PostMapping("/reserve")
@@ -74,13 +79,19 @@ public class ChildrenDayController extends BaseController {
         if (sysUser == null) {
             throw new BizException("用户信息获取失败,请重新登陆");
         }
-        studentDao.lockUser(degreePayDto.getUserId());
+        Date nowTime = new Date();
+        String endTimeStr = sysConfigDao.findConfigValue("children_day_end_time");
+        Date endTime = DateUtil.stringToDate(endTimeStr);
+        if (endTime.compareTo(nowTime) <= 0) {
+            throw new BizException("活动已结束,谢谢关注");
+        }
+        studentDao.lockUser(sysUser.getId());
 
         degreePayDto.setUserId(sysUser.getId());
         degreePayDto.setOrganId(sysUser.getOrganId());
         degreePayDto.setUser(sysUser);
         List<ChildrenDayDegreeDetail> ingDetails = childrenDayDegreeDetailService.getByUserIdAndStatus(sysUser.getId(), 1);
-        if (ingDetails.size() > 0) {
+        if (!degreePayDto.getRePay() && ingDetails.size() > 0) {
             return failed(HttpStatus.CONTINUE, "您有待支付的订单");
         }
 

+ 55 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayDegreeDetailController.java

@@ -0,0 +1,55 @@
+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.StudentDao;
+import com.ym.mec.biz.dal.dto.ChildrenDayDetailDto;
+import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.service.ChildrenDayDegreeDetailService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+@RequestMapping("childrenDayDegreeDetail")
+@Api(tags = "6.1儿童节活动报名详情")
+@RestController
+public class ChildrenDayDegreeDetailController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ChildrenDayDegreeDetailService childrenDayDegreeDetailService;
+    @Autowired
+    private StudentDao studentDao;
+
+    @ApiOperation(value = "获取用户已报名的详情,类型 1-乐器考级 2-乐理考级 3-vip1v1,4-vip1v2 5-乐理课")
+    @GetMapping("/getUserDegreeInfo")
+    public HttpResponseResult<ChildrenDayDetailDto> getFeeInfo() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user)) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        List<ChildrenDayDegreeDetail> userDegreeInfo = childrenDayDegreeDetailService.getUserDegreeInfo(user.getId());
+        ChildrenDayDetailDto childrenDayDetailDto = new ChildrenDayDetailDto();
+        childrenDayDetailDto.setUser(user);
+        childrenDayDetailDto.setChildrenDayDegreeDetails(userDegreeInfo);
+        Student student = studentDao.get(user.getId());
+        if (student != null && StringUtils.isNotBlank(student.getSubjectIdList())) {
+            List<String> subjectIds = Arrays.asList(student.getSubjectIdList().split(","));
+            childrenDayDetailDto.setSubjectId(Integer.parseInt(subjectIds.get(0)));
+        }
+        return succeed(childrenDayDetailDto);
+    }
+
+}

+ 4 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -89,6 +89,8 @@ public class StudentOrderController extends BaseController {
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
     @Autowired
     private ReplacementInstrumentActivityDao replacementInstrumentActivityDao;
+    @Autowired
+    private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
 
 
     @Value("${spring.profiles.active:dev}")
@@ -182,6 +184,8 @@ public class StudentOrderController extends BaseController {
             orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
         } else if (orderByOrderNo.getGroupType().equals(GroupType.REPLACEMENT)) {
             orderDetail.put("detail", replacementInstrumentActivityDao.getInfo(Integer.parseInt(orderByOrderNo.getMusicGroupId())));
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.DEGREE)) {
+            orderDetail.put("detail", childrenDayDegreeDetailDao.getByOrderId(orderByOrderNo.getId()));
         }
         return succeed(orderDetail);
     }

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

@@ -13,6 +13,7 @@ import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -64,14 +65,20 @@ public class CourseHomeworkController extends BaseController {
     @ApiOperation(value = "根据课程计划获取需要交作业的学生")
     @GetMapping("/findCourseStudents")
     public Object findCourseStudents(Long courseScheduleId,String userName){
-        return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId,userName));
+        if (Objects.isNull(courseScheduleId)) {
+            throw new BizException("请指定课程");
+        }
+        return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId, null,userName));
     }
 
     @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
     @GetMapping("/findCourseStudentsPublic")
     public Object findCourseStudentsPublic(Long courseScheduleId,String userName, boolean extra){
         if(!extra){
-            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId,userName));
+            if (Objects.isNull(courseScheduleId)) {
+                throw new BizException("请指定课程");
+            }
+            return succeed(studentCourseHomeworkService.findStudentCourseHomeworkByCourse(courseScheduleId, null,userName));
         }else{
             return succeed(extracurricularExercisesReplyService.findExtraExerciseStudents(courseScheduleId,userName));
         }

+ 26 - 6
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java

@@ -5,15 +5,15 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.StudentAttendanceDao;
 import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.UpdateAttendanceEnum;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.StudentAttendanceService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.TeacherAttendanceService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -50,6 +50,10 @@ public class TeacherAttendanceController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private SysMessageService sysMessageService;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private MusicGroupService musicGroupService;
 
     @ApiOperation(value = "新增教师签到")
     @PostMapping("/add")
@@ -82,8 +86,9 @@ public class TeacherAttendanceController extends BaseController {
     public HttpResponseResult studentAttendanceNormalRemind(Long courseId){
         int remindNum = studentAttendanceDao.countNormalRemindNum(courseId);
         if(remindNum>0){
-            return succeed();
+            return failed("您已发送过到课提醒");
         }
+        CourseSchedule courseSchedule = courseScheduleService.get(courseId);
         //获取正常签到的学生信息
         List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseId(courseId);
         if(CollectionUtils.isEmpty(studentAttendances)){
@@ -91,6 +96,21 @@ public class TeacherAttendanceController extends BaseController {
         }
 
         List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
+        //教务推送
+        if(Objects.nonNull(courseSchedule)&& GroupType.MUSIC.equals(courseSchedule.getGroupType())){
+            MusicGroup musicGroup = musicGroupService.get(courseSchedule.getMusicGroupId());
+            if(Objects.isNull(musicGroup)||Objects.isNull(musicGroup.getTransactionTeacherId())){
+                return succeed();
+            }
+            int normalStudentNum = normal.size();
+            long leaveStudentNum = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.LEAVE).count();
+            long truantStudentNum = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.TRUANT).count();
+            Map<Integer, String> receivers = new HashMap<>();
+            receivers.put(musicGroup.getTransactionTeacherId(), musicGroup.getTransactionTeacherId().toString());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_PUSH_NAMES_ACHIEVE,
+                    receivers, null, 0, null, "SYSTEM", courseSchedule.getName(), normalStudentNum, leaveStudentNum, truantStudentNum);
+        }
+
         if (normal != null && normal.size() > 0) {
             Map<Integer, String> receivers = new HashMap<>();
             normal.forEach(e -> {
@@ -99,7 +119,7 @@ public class TeacherAttendanceController extends BaseController {
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
                     receivers, null, 0, "2", "STUDENT", DateUtil.format(new Date(), DateUtil.DATE_FORMAT_MIN));
         }else{
-            return failed("还未有学生到课");
+            return succeed();
         }
         studentAttendanceDao.updateNormalRemind(courseId);
         return succeed();

+ 17 - 7
mec-util/src/main/java/com/ym/mec/util/http/HttpUtil.java

@@ -1,5 +1,6 @@
 package com.ym.mec.util.http;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.util.compress.ZipUtil;
 import org.apache.commons.beanutils.ConvertUtils;
@@ -39,15 +40,24 @@ public class HttpUtil {
 
 	public static String getSortUrl(String url){
 		try {
-			Map<String,Object> paramMap = new HashMap<>();
-			paramMap.put("format","json");
-			paramMap.put("url",URLDecoder.decode(url,"UTF-8"));
-			paramMap.put("key","5dc941c5d3c3816ac84898d7@3d0e03b46a30f4fea51f038e5cd411c5");
-			String s = get("http://mrw.so/api.htm", paramMap);
-			String shortUrl=JSONObject.parseObject(s).getString("url");
-			if(StringUtils.isNotBlank(shortUrl)){
+			JSONArray jsonArray = new JSONArray();
+			JSONObject jsonObject = new JSONObject();
+			jsonObject.put("LongUrl",url);
+			jsonObject.put("TermOfValidity","long-term");
+			jsonArray.add(jsonObject);
+			Map<String,String> HeadMap = new HashMap<>();
+			HeadMap.put("Dwz-Token","0a9d3b34eae990d4355653d2ba6c8974");
+			HeadMap.put("Content-Type","application/json; charset=UTF-8");
+			HeadMap.put("Content-Language","zh");
+			String s = postForHttps("https://dwz.cn/api/v3/short-urls", jsonArray.toJSONString(),HeadMap);
+			JSONObject result = JSONObject.parseObject(s);
+			String code=result.getString("Code");
+			if(code.equals("0")){
+				String shortUrl = JSONArray.parseArray(result.getString("ShortUrls")).getJSONObject(0).getString("ShortUrl");
 				return shortUrl;
 			}else{
+				String errorMsg = JSONArray.parseArray(result.getString("ShortUrls")).getJSONObject(0).getString("ErrMsg");
+				System.out.println("短网址生成失败:" + errorMsg);
 				return url;
 			}
 		}catch (Exception e){

+ 14 - 5
mec-web/src/main/java/com/ym/mec/web/controller/ChildrenReserveController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 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.ChildrenDayMsgDto;
 import com.ym.mec.biz.dal.dto.ChildrenStatisticsDetailDto;
 import com.ym.mec.biz.dal.dto.ChildrenStatisticsDto;
 import com.ym.mec.biz.dal.entity.Employee;
@@ -33,7 +34,7 @@ public class ChildrenReserveController extends BaseController {
     @Autowired
     private EmployeeDao employeeDao;
 
-    @ApiOperation(value = "21年暑期考级活动统计页面")
+    @ApiOperation(value = "21年暑期考级活动统计列表页面")
     @GetMapping("/queryStatisticsPage")
     @PreAuthorize("@pcs.hasPermissions('childrenReserve/queryStatisticsPage')")
     public HttpResponseResult<PageInfo<ChildrenStatisticsDto>> queryStatisticsPage(ChildrenReserveQueryInfo queryInfo) {
@@ -44,21 +45,29 @@ public class ChildrenReserveController extends BaseController {
         Employee employee = employeeDao.get(sysUser.getId());
         if (StringUtils.isEmpty(queryInfo.getOrganId())) {
             queryInfo.setOrganId(employee.getOrganIdList());
-        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+        } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
             return failed("用户所在分部异常");
-        }else {
+        } else {
             List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+            if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
                 return failed("非法请求");
             }
         }
         return succeed(childrenDayReserveService.queryStatisticsPage(queryInfo));
     }
 
-    @ApiOperation(value = "21年暑期考级活动统计详情页面")
+    @ApiOperation(value = "21年暑期考级活动统计详情列表页面")
     @GetMapping("/queryStatisticsDetailPage")
     @PreAuthorize("@pcs.hasPermissions('childrenReserve/queryStatisticsDetailPage')")
     public HttpResponseResult<PageInfo<ChildrenStatisticsDetailDto>> queryStatisticsDetailPage(ChildrenReserveQueryInfo queryInfo) {
         return succeed(childrenDayReserveService.queryStatisticsDetailPage(queryInfo));
     }
+
+
+    @ApiOperation(value = "发送短信和推送")
+    @PostMapping("/sendMsg")
+    @PreAuthorize("@pcs.hasPermissions('childrenReserve/sendMsg')")
+    public HttpResponseResult sendMsg(@RequestBody List<ChildrenDayMsgDto> msgDto) {
+        return succeed(childrenDayReserveService.sendMsg(msgDto));
+    }
 }

+ 8 - 1
mec-web/src/main/java/com/ym/mec/web/controller/CooperationOrganController.java

@@ -55,7 +55,14 @@ public class CooperationOrganController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('cooperationOrgan/update')")
     public Object update(CooperationOrgan cooperationOrgan) {
         cooperationOrgan.setUpdateTime(new Date());
-        cooperationOrganService.update(cooperationOrgan);
+        cooperationOrganService.updateCooperation(cooperationOrgan);
+        return succeed();
+    }
+
+    @ApiOperation(value = "更新合作单位乐团主管")
+    @PostMapping("/cooperationEdu")
+    public Object cooperationEdu(@RequestBody List<Integer> organIds) {
+        cooperationOrganService.updateCooperationEdu(organIds);
         return succeed();
     }
 

+ 12 - 7
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -21,10 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * @Author Joburgess
@@ -189,11 +186,19 @@ public class EmployeeController extends BaseController {
         }else{
             organIds = organId.toString();
         }
-        if(employeeRole == EmployeeRoleEnum.TEAM_TEACHER){
-            return succeed(employeeService.findByRole("5",organIds));
+        HashMap<String, Object> map = new HashMap<>();
+        if(employeeRole == null){
+            map.put("TEAM_TEACHER",employeeService.findByRole("5",organIds));
+            map.put("TRANSACTION",employeeService.findByRole("58",organIds));
+            map.put("EDUCATION",employeeService.findByRole("4",organIds));
+        }else if(employeeRole == EmployeeRoleEnum.TEAM_TEACHER){
+            map.put("TEAM_TEACHER",employeeService.findByRole("5",organIds));
+        }else if(employeeRole == EmployeeRoleEnum.TRANSACTION){
+            map.put("TRANSACTION",employeeService.findByRole("58",organIds));
         }else {
-            return succeed(employeeService.findByRole("4",organIds));
+            map.put("EDUCATION",employeeService.findByRole("4",organIds));
         }
+        return succeed(map);
     }
 
     @ApiOperation(value = "获取教务老师")

+ 58 - 4
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.math.BigDecimal;
-import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -143,6 +142,58 @@ public class ExportController extends BaseController {
     private ChildrenDayReserveService childrenDayReserveService;
 
     @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
+    @PostMapping("export/statisticsDetail")
+    @PreAuthorize("@pcs.hasPermissions('export/statisticsDetail')")
+    public void statisticsDetail(HttpServletResponse response, ChildrenReserveQueryInfo 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<ChildrenStatisticsDetailDto> rows = childrenDayReserveService.exportStatisticsDetail(queryInfo);
+        if(rows.size() < 1){
+           throw new BizException("没有可导出数据");
+       }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "合作单位", "乐团","学员编号", "学员姓名", "手机号","声部","所在班级","指导老师", "是否预约", "器乐等级", "乐理等级", "是否购买VIP","是否购买乐理课"}, new String[]{
+                    "organName", "cooperationOrganName", "musicGroupName","userId", "username", "phone","subjectName",
+                    "currentClass", "realName", "isReserve == true ?'是':'否'","gradeLeave"
+                    ,"theoryLevel","buyVipFlag == true ?'是':'否'","buyTheoryCourseFlag == true ?'是':'否'"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=classGroup-" + 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 = "21年暑期考级活动统计页面详情导出")
     @PostMapping("export/statisticsDetailPage")
     @PreAuthorize("@pcs.hasPermissions('export/statisticsDetailPage')")
     public void statisticsDetailPage(HttpServletResponse response, ChildrenReserveQueryInfo queryInfo) throws IOException {
@@ -169,8 +220,10 @@ public class ExportController extends BaseController {
        }
         OutputStream outputStream = response.getOutputStream();
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员姓名", "学员编号", "手机号", "是否预约"}, new String[]{
-                    "username", "userId", "phone", "isReserve == true ?'是':'否'"}, rows);
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学员姓名", "学员编号", "手机号", "是否预约","报考器乐", "器乐报考等级", "乐理报考等级", "是否购买VIP",
+                    "是否购买乐理课", "支付金额"}, new String[]{
+                    "username", "userId", "phone", "isReserve == true ?'是':'否'","subjectName"
+                    ,"theoryLevel","gradeLeave","buyVipFlag","buyTheoryCourseFlag","totalAmount"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
@@ -221,7 +274,7 @@ public class ExportController extends BaseController {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部名称", "合作单位", "乐团名称", "在读人数",
                     "预约人数", "未预约人数", "器乐考级人数", "乐理考级人数", "VIP课购买人数", "VIP课成交金额", "乐理课购买人数", "乐理课成交金额"}, new String[]{
                     "organName", "cooperationOrganName", "musicGroupName", "normalNum",
-                    "reserveNum", "noReserveNum", "instrumentalMusicNum", "musicTheoryNum","buyVipNum","buyVipAmount","buyMusicTheoryNum","buyMusicTheoryAmount"}, rows);
+                    "reserveNum", "noReserveNum", "instrumentalMusicNum", "musicTheoryNum","buyVip1Num","buyVip1Amount","buyVip2Num","buyVip2Amount","buyMusicTheoryNum","buyMusicTheoryAmount"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=classGroup-" + DateUtil.getDate(new Date()) + ".xls");
@@ -241,6 +294,7 @@ public class ExportController extends BaseController {
             }
         }
     }
+*/
 
     @ApiOperation(value = "学生个人账户余额导出")
     @PostMapping("export/userCashAccountDetail")

+ 37 - 0
mec-web/src/main/java/com/ym/mec/web/controller/OperationLogController.java

@@ -0,0 +1,37 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.util.date.DateUtil;
+import com.yonge.log.dal.model.OperationLog;
+import com.yonge.log.service.OperationLogService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+@RequestMapping("operationLog")
+@Api(tags = "操作手册日志")
+@RestController
+public class OperationLogController extends BaseController {
+
+	@Autowired
+	private OperationLogService operationLogService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@GetMapping("/save")
+	public Object save(OperationLog operationLog) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		operationLog.setUserId(sysUser.getId());
+		operationLog.setUsername(sysUser.getRealName());
+		operationLog.setOperateTime(DateUtil.format(new Date(),DateUtil.EXPANDED_DATE_TIME_FORMAT));
+		operationLogService.insert(operationLog);
+		return succeed();
+	}
+
+}

+ 82 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/CourseHomeworkController.java

@@ -1,5 +1,14 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.CourseHomework;
+import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
+import com.ym.mec.biz.dal.page.StudentCourseHomeWorkQueryInfo;
+import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.ExtracurricularExercisesService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -14,6 +23,10 @@ import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
 import com.ym.mec.biz.service.CourseHomeworkService;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/18
@@ -25,6 +38,14 @@ public class CourseHomeworkController extends BaseController {
 
     @Autowired
     private CourseHomeworkService courseHomeworkService;
+    @Autowired
+    private StudentCourseHomeworkService studentCourseHomeworkService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ExtracurricularExercisesService extracurricularExercisesService;
+    @Autowired
+    private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
 
     @ApiOperation(value = "分页查询作业列表")
     @GetMapping(value = "/queryPage")
@@ -32,4 +53,65 @@ public class CourseHomeworkController extends BaseController {
         return succeed(courseHomeworkService.queryPage(queryInfo));
     }
 
+    @ApiOperation(value = "作业列表")
+    @GetMapping(value = "getEduCourseHomeworkList")
+    public HttpResponseResult getEduCourseHomeworkList(StudentCourseHomeWorkQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        queryInfo.setTransactionTeacherId(sysUser.getId());
+        if(!queryInfo.getExtra()){
+            return succeed(studentCourseHomeworkService.getEduCourseHomeworkList(queryInfo));
+        }else{
+            return succeed(extracurricularExercisesReplyService.getEduHomeworkList(queryInfo));
+        }
+    }
+
+    @ApiOperation(value = "根据课程计划获取需要交作业的学生-公用")
+    @GetMapping("/findHomeworkStudents")
+    public HttpResponseResult findHomeworkStudents(Long homeworkId,String userName, boolean extra){
+        if(Objects.isNull(extra)){
+            extra = false;
+        }
+        Map<String, Object> result = new HashMap<>();
+        result.put("content", "");
+        if(!extra){
+            CourseHomework courseHomework = courseHomeworkService.get(homeworkId);
+            if(Objects.nonNull(courseHomework)){
+                result.put("content", courseHomework.getContent());
+            }
+            result.put("data", studentCourseHomeworkService.findStudentCourseHomeworkByCourse(null, homeworkId,userName));
+        }else{
+            ExtracurricularExercises extracurricularExercises = extracurricularExercisesService.get(homeworkId);
+            if(Objects.nonNull(extracurricularExercises)){
+                result.put("content", extracurricularExercises.getContent());
+            }
+            result.put("data", extracurricularExercisesReplyService.findExtraExerciseStudents(homeworkId,userName));
+        }
+        return succeed(result);
+    }
+
+    @ApiOperation(value = "作业统计")
+    @GetMapping("/queryEduHomeworkStatList")
+    public HttpResponseResult queryEduHomeworkStatList(StudentCourseHomeWorkQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTransactionTeacherId(sysUser.getId());
+        return succeed(studentCourseHomeworkService.queryEduHomeworkStatList(queryInfo));
+    }
+
+    @ApiOperation(value = "作业统计详情")
+    @GetMapping("/queryEduHomeworkStatDetail")
+    public HttpResponseResult queryEduHomeworkStatDetail(StudentCourseHomeWorkQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setTransactionTeacherId(sysUser.getId());
+        return succeed(studentCourseHomeworkService.queryEduHomeworkStatDetail(queryInfo));
+    }
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.web.controller.education;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
@@ -16,6 +17,7 @@ import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -46,7 +48,13 @@ public class EducationCourseScheduleController extends BaseController {
         if(Objects.isNull(employee)){
             throw new BizException("员工信息不存在");
         }
-        return succeed(scheduleService.getCourseScheduleDates(month,employee.getOrganIdList(),type));
+        Integer transactionTeacherId = null;
+        List<Integer> userRole = employeeDao.queryUserRole(user.getId());
+        //如果只是衔接老师
+        if (!user.getIsSuperAdmin() && userRole.size() == 1 && userRole.get(0)==58) {
+            transactionTeacherId = user.getId();
+        }
+        return succeed(scheduleService.getCourseScheduleDates(month,employee.getOrganIdList(),type, transactionTeacherId));
     }
 
     @ApiOperation(value = "根据日期获取当日排课")
@@ -60,6 +68,11 @@ public class EducationCourseScheduleController extends BaseController {
         if(Objects.nonNull(employee)){
             queryInfo.setOrganIdList(employee.getOrganIdList());
         }
+        List<Integer> userRole = employeeDao.queryUserRole(user.getId());
+        //如果只是衔接老师
+        if (!user.getIsSuperAdmin() && userRole.size() == 1 && userRole.get(0)==58) {
+            queryInfo.setTransactionTeacherId(user.getId());
+        }
         return succeed(scheduleService.getCourseSchedulesWithDateByEdu(queryInfo));
     }