Преглед изворни кода

Merge branch 'online1' into music_group_feature_03_29

周箭河 пре 4 година
родитељ
комит
4381379544
63 измењених фајлова са 2664 додато и 499 уклоњено
  1. 17 2
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 21 0
      cms/src/main/java/com/ym/mec/cms/controller/queryinfo/NewsInformationQueryInfo.java
  3. 20 0
      cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsInformation.java
  4. 6 4
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
  5. 21 3
      cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  6. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  7. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  8. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ManagerDownloadDao.java
  9. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  10. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  11. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  12. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserContractsDao.java
  13. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentClassInfoDto.java
  14. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherClassCourseSchudeleDto.java
  17. 118 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ManagerDownload.java
  18. 641 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ManagerDownloadExample.java
  19. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentAttendance.java
  20. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  21. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CourseScheduleQueryInfo.java
  22. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ManagerDownloadQueryInfo.java
  23. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentOrderQueryInfo.java
  24. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  25. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  26. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  27. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  28. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  29. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ManagerDownloadService.java
  30. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  31. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  32. 27 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  33. 104 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  34. 23 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  35. 622 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  36. 72 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  37. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  38. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ManagerDownloadServiceImpl.java
  39. 110 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  40. 12 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  41. 39 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  42. 9 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  43. 27 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  44. 17 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  45. 84 0
      mec-biz/src/main/resources/config/mybatis/ManagerDownloadMapper.xml
  46. 12 4
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  47. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  48. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  49. 4 4
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  50. 21 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  51. 5 0
      mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml
  52. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  53. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  54. 1 2
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  55. 50 2
      mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java
  56. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/UpdateStudentTeacherAndSubjectTask.java
  57. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ClassGroupController.java
  58. 44 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  59. 10 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  60. 9 1
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java
  61. 61 403
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  62. 47 0
      mec-web/src/main/java/com/ym/mec/web/controller/ManagerDownloadController.java
  63. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 17 - 2
cms/src/main/java/com/ym/mec/cms/controller/NewsController.java

@@ -47,9 +47,24 @@ public class NewsController extends BaseController {
 	@ApiOperation("资讯列表分页查询")
 	@ApiOperation("资讯列表分页查询")
 	@GetMapping(value = "/list")
 	@GetMapping(value = "/list")
 	public Object getList(NewsInformationQueryInfo queryInfo) {
 	public Object getList(NewsInformationQueryInfo queryInfo) {
-		if(queryInfo.getTenantId() == null){
-			queryInfo.setTenantId(1);
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || user.getId() == null) {
+			queryInfo.setOrganId(43);
+		} else {
+			queryInfo.setOrganId(user.getOrganId());
 		}
 		}
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		int count = sysNewsInformationDao.queryCount(params);
+		if(count == 0){
+			queryInfo.setMemo(null);
+		}
+		return succeed(sysNewsInformationService.queryPage(queryInfo));
+	}
+
+	@ApiOperation("资讯列表分页查询")
+	@GetMapping(value = "/queryPage")
+	public Object queryPage(NewsInformationQueryInfo queryInfo) {
 		
 		
 		Map<String, Object> params = new HashMap<String, Object>();
 		Map<String, Object> params = new HashMap<String, Object>();
 		MapUtil.populateMap(params, queryInfo);
 		MapUtil.populateMap(params, queryInfo);

+ 21 - 0
cms/src/main/java/com/ym/mec/cms/controller/queryinfo/NewsInformationQueryInfo.java

@@ -30,8 +30,13 @@ public class NewsInformationQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "声部编号", required = false)
 	@ApiModelProperty(value = "声部编号", required = false)
 	private Integer subjectId;
 	private Integer subjectId;
 	
 	
+	@ApiModelProperty(value = "分部编号", required = false)
+	private Integer organId;
+	
 	private String clientName;
 	private String clientName;
 	
 	
+	private String organIdList;
+	
 	private Date date;
 	private Date date;
 
 
 	public Integer getType() {
 	public Integer getType() {
@@ -105,4 +110,20 @@ public class NewsInformationQueryInfo extends QueryInfo {
 	public void setSubjectId(Integer subjectId) {
 	public void setSubjectId(Integer subjectId) {
 		this.subjectId = subjectId;
 		this.subjectId = subjectId;
 	}
 	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public String getOrganIdList() {
+		return organIdList;
+	}
+
+	public void setOrganIdList(String organIdList) {
+		this.organIdList = organIdList;
+	}
 }
 }

+ 20 - 0
cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsInformation.java

@@ -75,7 +75,11 @@ public class SysNewsInformation {
 	
 	
 	private String subjectIdList;
 	private String subjectIdList;
 	
 	
+	private String organIdList;
+	
 	private String subjectName;
 	private String subjectName;
+	
+	private String organNameList;
 
 
 	public String getLinkUrl() {
 	public String getLinkUrl() {
 		return linkUrl;
 		return linkUrl;
@@ -245,6 +249,14 @@ public class SysNewsInformation {
 		this.subjectIdList = subjectIdList;
 		this.subjectIdList = subjectIdList;
 	}
 	}
 
 
+	public String getOrganIdList() {
+		return organIdList;
+	}
+
+	public void setOrganIdList(String organIdList) {
+		this.organIdList = organIdList;
+	}
+
 	public String getSubjectName() {
 	public String getSubjectName() {
 		return subjectName;
 		return subjectName;
 	}
 	}
@@ -253,6 +265,14 @@ public class SysNewsInformation {
 		this.subjectName = subjectName;
 		this.subjectName = subjectName;
 	}
 	}
 
 
+	public String getOrganNameList() {
+		return organNameList;
+	}
+
+	public void setOrganNameList(String organNameList) {
+		this.organNameList = organNameList;
+	}
+
 	@Override
 	@Override
 	public String toString() {
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 		return ToStringBuilder.reflectionToString(this);

+ 6 - 4
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -66,8 +66,10 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 		Map<String,PageInfo<SysNewsInformation>> homeList = new HashMap<>();
 		Map<String,PageInfo<SysNewsInformation>> homeList = new HashMap<>();
 		queryInfo.setStatus(NewsStatusEnum.SHOW);
 		queryInfo.setStatus(NewsStatusEnum.SHOW);
 		
 		
-		if(queryInfo.getTenantId() == null){
-			queryInfo.setTenantId(1);
+		if (user == null || user.getId() == null) {
+			queryInfo.setOrganId(43);
+		} else {
+			queryInfo.setOrganId(user.getOrganId());
 		}
 		}
 		
 		
 		String memo = queryInfo.getMemo();
 		String memo = queryInfo.getMemo();
@@ -82,7 +84,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 		}
 		}
 		PageInfo<SysNewsInformation> pageInfos = queryHomePage(queryInfo);
 		PageInfo<SysNewsInformation> pageInfos = queryHomePage(queryInfo);
 
 
-		boolean isNewer = false;
+		/*boolean isNewer = false;
 		Date date = new Date();
 		Date date = new Date();
 		Date startDate = queryInfo.getDate();
 		Date startDate = queryInfo.getDate();
 		Date endDate = null;
 		Date endDate = null;
@@ -111,7 +113,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 				}
 				}
 				pageInfos.getRows().add(info);
 				pageInfos.getRows().add(info);
 			}
 			}
-		}
+		}*/
 		homeList.put("banner",pageInfos);
 		homeList.put("banner",pageInfos);
 		
 		
 		queryInfo.setMemo(memo);
 		queryInfo.setMemo(memo);

+ 21 - 3
cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -28,7 +28,9 @@
 		<result column="attribute1_" property="attribute1" />
 		<result column="attribute1_" property="attribute1" />
 		<result column="attribute2_" property="attribute2" />
 		<result column="attribute2_" property="attribute2" />
 		<result column="subject_id_list_" property="subjectIdList" />
 		<result column="subject_id_list_" property="subjectIdList" />
+		<result column="organ_id_list_" property="organIdList" />
 		<result column="subject_name_" property="subjectName" />
 		<result column="subject_name_" property="subjectName" />
+		<result column="organ_name_list_" property="organNameList" />
 	</resultMap>
 	</resultMap>
 	
 	
 	<resultMap type="com.ym.mec.cms.dto.SysNewsInformationDto" id="SysNewsInformationDto" extends="SysNewsInformation">
 	<resultMap type="com.ym.mec.cms.dto.SysNewsInformationDto" id="SysNewsInformationDto" extends="SysNewsInformation">
@@ -60,6 +62,12 @@
 			<if test="subjectId != null">
 			<if test="subjectId != null">
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 			</if>
 			</if>
+			<if test="organId != null">
+				and (find_in_set(#{organId},sni.organ_id_list_) or sni.organ_id_list_ is null)
+			</if>
+			<if test="organIdList != null">
+				and INTE_ARRAY(#{organIdList},sni.organ_id_list_)
+			</if>
 			<if test="clientName != 'manage'">
 			<if test="clientName != 'manage'">
 				<choose>
 				<choose>
 					<when test="memo != null and memo != ''">
 					<when test="memo != null and memo != ''">
@@ -85,8 +93,8 @@
 	
 	
 	<!-- 向数据库增加一条记录 -->
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.cms.dal.entity.SysNewsInformation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 	<insert id="insert" parameterType="com.ym.mec.cms.dal.entity.SysNewsInformation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_news_information (id_,title_,content_,cover_image_,video_cover_image_,type_,online_time_,offline_time_,sub_type_,status_,create_time_,update_time_,link_url_,href_target_,order_,del_flag_,memo_,tenant_id_,attribute1_,attribute2_,subject_id_list_)
-		VALUES(#{id},#{title},#{content},#{coverImage},#{videoCoverImage},#{type},#{onlineTime},#{offlineTime},#{subType},#{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),#{linkUrl},#{hrefTarget},#{order},0,#{memo},#{tenantId},#{attribute1},#{attribute2},#{subjectIdList})
+		INSERT INTO sys_news_information (id_,title_,content_,cover_image_,video_cover_image_,type_,online_time_,offline_time_,sub_type_,status_,create_time_,update_time_,link_url_,href_target_,order_,del_flag_,memo_,tenant_id_,attribute1_,attribute2_,subject_id_list_,organ_id_list_)
+		VALUES(#{id},#{title},#{content},#{coverImage},#{videoCoverImage},#{type},#{onlineTime},#{offlineTime},#{subType},#{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),#{linkUrl},#{hrefTarget},#{order},0,#{memo},#{tenantId},#{attribute1},#{attribute2},#{subjectIdList},#{organIdList})
 	</insert>
 	</insert>
 	
 	
 	<!-- 根据主键查询一条记录 -->
 	<!-- 根据主键查询一条记录 -->
@@ -150,6 +158,9 @@
 			<if test="subjectIdList != null">
 			<if test="subjectIdList != null">
 				subject_id_list_ = #{subjectIdList},
 				subject_id_list_ = #{subjectIdList},
 			</if>
 			</if>
+			<if test="organIdList != null">
+				organ_id_list_ = #{organIdList},
+			</if>
 		</set>
 		</set>
 		WHERE id_ = #{id}
 		WHERE id_ = #{id}
 	</update>
 	</update>
@@ -161,7 +172,8 @@
 	
 	
 	<!-- 分页查询 -->
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysNewsInformation" parameterType="map">
 	<select id="queryPage" resultMap="SysNewsInformation" parameterType="map">
-		SELECT sni.*,GROUP_CONCAT(s.name_) subject_name_ FROM sys_news_information sni left join subject s on find_in_set(s.id_,sni.subject_id_list_)
+		SELECT sni.*,GROUP_CONCAT(distinct s.name_) subject_name_,GROUP_CONCAT(distinct o.name_) organ_name_list_ FROM sys_news_information sni left join subject s on find_in_set(s.id_,sni.subject_id_list_)
+		left join organization o on find_in_set(o.id_,sni.organ_id_list_)
 		<include refid="queryCondition" />
 		<include refid="queryCondition" />
 		group by sni.id_
 		group by sni.id_
 		order by sni.status_ desc,sni.order_ desc,sni.update_time_ desc
 		order by sni.status_ desc,sni.order_ desc,sni.update_time_ desc
@@ -214,6 +226,9 @@
 			<if test="subjectId != null">
 			<if test="subjectId != null">
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 			</if>
 			</if>
+			<if test="organId != null">
+				and (find_in_set(#{organId},sni.organ_id_list_) or sni.organ_id_list_ is null)
+			</if>
 		<if test="clientName != 'manage'">
 		<if test="clientName != 'manage'">
 			<choose>
 			<choose>
 				<when test="memo != null and memo != ''">
 				<when test="memo != null and memo != ''">
@@ -254,6 +269,9 @@
 			<if test="subjectId != null">
 			<if test="subjectId != null">
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 			</if>
 			</if>
+			<if test="organId != null">
+				and (find_in_set(#{organId},sni.organ_id_list_) or sni.organ_id_list_ is null)
+			</if>
 		<if test="clientName != 'manage'">
 		<if test="clientName != 'manage'">
 			<choose>
 			<choose>
 				<when test="memo != null and memo != ''">
 				<when test="memo != null and memo != ''">

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

@@ -300,7 +300,8 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @params [teacherId]
      * @describe 获取老师乐团班级
      * @describe 获取老师乐团班级
      */
      */
-    List<TeacherClassGroupDto> findTeacherMusicClassGroup(@Param("teacherId") Long teacherId);
+    List<TeacherClassGroupDto> findTeacherMusicClassGroup(@Param("teacherId") Long teacherId,
+                                                          @Param("groupName") String groupName);
 
 
     /**
     /**
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
      * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
@@ -309,7 +310,9 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @params [teacherId]
      * @describe 获取老师陪练课班级
      * @describe 获取老师陪练课班级
      */
      */
-    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
+    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId,
+                                                             @Param("status") String status,
+                                                             @Param("groupName") String groupName);
 
 
     /**
     /**
      * 根据老师编号列表获取小课数量
      * 根据老师编号列表获取小课数量
@@ -326,7 +329,9 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @params [teacherId]
      * @params [teacherId]
      * @describe 获取老师vip课班级
      * @describe 获取老师vip课班级
      */
      */
-    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);
+    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId,
+                                                        @Param("status") String status,
+                                                        @Param("groupName") String groupName);
 
 
     /**
     /**
      * 根据合奏班编号列表,获取单技班名称列表
      * 根据合奏班编号列表,获取单技班名称列表

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

@@ -152,6 +152,9 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	List<CourseScheduleTeacherSalary> findByCourseScheduleIdsAndTeacherRole(@Param("courseScheduleIds") List<Integer> courseScheduleIds,
 	List<CourseScheduleTeacherSalary> findByCourseScheduleIdsAndTeacherRole(@Param("courseScheduleIds") List<Integer> courseScheduleIds,
 																			@Param("teacherRole") String teacherRole);
 																			@Param("teacherRole") String teacherRole);
 
 
+	List<CourseScheduleTeacherSalary> findByCourseIdsAndTeacherRole(@Param("courseScheduleIds") List<Long> courseScheduleIds,
+																			@Param("teacherRole") String teacherRole);
+
 	/**
 	/**
 	 * @param courseScheduleIds: 课程编号列表
 	 * @param courseScheduleIds: 课程编号列表
 	 * @return java.util.List<java.util.Map < java.lang.String, java.lang.String>>
 	 * @return java.util.List<java.util.Map < java.lang.String, java.lang.String>>

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.ManagerDownload;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface ManagerDownloadDao extends BaseDAO<Integer,ManagerDownload> {
+
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -8,6 +8,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
@@ -138,6 +139,19 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
     int countByCourseSchedule(Long courseScheduleId);
     int countByCourseSchedule(Long courseScheduleId);
 
 
     /**
     /**
+     * @describe 统计已发送到课提醒的人数
+     * @author Joburgess
+     * @date 2021/3/31 0031
+     * @param courseId:
+     * @return int
+     */
+    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseId} AND normal_remind_=1")
+    int countNormalRemindNum(Long courseId);
+
+    @Update("UPDATE student_attendance SET normal_remind_=1 WHERE course_schedule_id_=#{courseId}")
+    int updateNormalRemind(@Param("courseId") Long courseId);
+
+    /**
      * @describe 统计每节课上的学生数,排除学员自己请假的记录
      * @describe 统计每节课上的学生数,排除学员自己请假的记录
      * @author Joburgess
      * @author Joburgess
      * @date 2019/12/26
      * @date 2019/12/26

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

@@ -194,4 +194,12 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return
      * @return
      */
      */
     int updateGrade();
     int updateGrade();
+
+    /**
+     * @describe
+     * @author Joburgess
+     * @date 2021/3/29 0029
+     * @return java.util.List<com.ym.mec.biz.dal.entity.Student>
+     */
+    List<Student> getNoTeacherOrNoSubjectStudent();
 }
 }

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

@@ -489,4 +489,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
 
     List<NoClassMusicStudentDto> queryNoClassMusicStudents(Map<String, Object> params);
     List<NoClassMusicStudentDto> queryNoClassMusicStudents(Map<String, Object> params);
     int countNoClassMusicStudents(Map<String, Object> params);
     int countNoClassMusicStudents(Map<String, Object> params);
+
+
+    List<StudentClassInfoDto> getStudentClassInfo(@Param("studentIds") List<Integer> studentIds);
 }
 }

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

@@ -36,4 +36,13 @@ public interface SysUserContractsDao extends BaseDAO<Long, SysUserContracts> {
      * @return
      * @return
      */
      */
     SysUserContracts getLatestUserContract(Integer userId);
     SysUserContracts getLatestUserContract(Integer userId);
+
+    /**
+     * @describe 统计学员有效协议数量
+     * @author Joburgess
+     * @date 2021/4/1 0001
+     * @param userId:
+     * @return int
+     */
+    int countUserValidContact(Integer userId);
 }
 }

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentClassInfoDto.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.dto;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/3/29 0029
+ */
+public class StudentClassInfoDto {
+
+    private Integer studentId;
+
+    private String musicGroupId;
+
+    private Integer subjectId;
+
+    private Long classGroupId;
+
+    private Integer mainTeacherId;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Long getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(Long classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+
+    public Integer getMainTeacherId() {
+        return mainTeacherId;
+    }
+
+    public void setMainTeacherId(Integer mainTeacherId) {
+        this.mainTeacherId = mainTeacherId;
+    }
+}

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -49,6 +49,10 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     private BigDecimal degreeFee = BigDecimal.ZERO;
     private BigDecimal degreeFee = BigDecimal.ZERO;
     //其它费用
     //其它费用
     private BigDecimal otherFee = BigDecimal.ZERO;
     private BigDecimal otherFee = BigDecimal.ZERO;
+    //乐保费用
+    private BigDecimal maintenanceFee = BigDecimal.ZERO;
+    //商品乐保
+    private BigDecimal maintenanceProductFee = BigDecimal.ZERO;
 
 
     private String organName;
     private String organName;
     private String schoolName;
     private String schoolName;
@@ -70,6 +74,12 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //分润余额
     //分润余额
     private BigDecimal routeBalance;
     private BigDecimal routeBalance;
 
 
+    //分润中的销售费用
+    private BigDecimal saleAmount = BigDecimal.ZERO;
+
+    //分润中的服务费用
+    private BigDecimal serviceAmount = BigDecimal.ZERO;
+
     private String feeFlag;
     private String feeFlag;
 
 
     public BigDecimal getSporadicAmount() {
     public BigDecimal getSporadicAmount() {
@@ -287,4 +297,36 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setFeeFlag(String feeFlag) {
     public void setFeeFlag(String feeFlag) {
         this.feeFlag = feeFlag;
         this.feeFlag = feeFlag;
     }
     }
+
+    public BigDecimal getSaleAmount() {
+        return saleAmount;
+    }
+
+    public void setSaleAmount(BigDecimal saleAmount) {
+        this.saleAmount = saleAmount;
+    }
+
+    public BigDecimal getServiceAmount() {
+        return serviceAmount;
+    }
+
+    public void setServiceAmount(BigDecimal serviceAmount) {
+        this.serviceAmount = serviceAmount;
+    }
+
+    public BigDecimal getMaintenanceFee() {
+        return maintenanceFee;
+    }
+
+    public void setMaintenanceFee(BigDecimal maintenanceFee) {
+        this.maintenanceFee = maintenanceFee;
+    }
+
+    public BigDecimal getMaintenanceProductFee() {
+        return maintenanceProductFee;
+    }
+
+    public void setMaintenanceProductFee(BigDecimal maintenanceProductFee) {
+        this.maintenanceProductFee = maintenanceProductFee;
+    }
 }
 }

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

@@ -95,6 +95,9 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "能否布置作业")
     @ApiModelProperty(value = "能否布置作业")
     private int enableAssignHomework;
     private int enableAssignHomework;
 
 
+    @ApiModelProperty(value = "是否已经发送过到课提醒:0否,1已发送")
+    private int normalRemind;
+
     private Integer enableStudentAttendanceTimeRange;
     private Integer enableStudentAttendanceTimeRange;
 
 
     private Integer enableStudentAttendanceTimeRangeVip;
     private Integer enableStudentAttendanceTimeRangeVip;
@@ -331,4 +334,12 @@ public class TeacherAttendanceDto {
     public void setMusicGroupName(String musicGroupName) {
     public void setMusicGroupName(String musicGroupName) {
         this.musicGroupName = musicGroupName;
         this.musicGroupName = musicGroupName;
     }
     }
+
+    public int getNormalRemind() {
+        return normalRemind;
+    }
+
+    public void setNormalRemind(int normalRemind) {
+        this.normalRemind = normalRemind;
+    }
 }
 }

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

@@ -67,6 +67,17 @@ public class TeacherClassCourseSchudeleDto {
 
 
     private String schoolName;
     private String schoolName;
 
 
+    @ApiModelProperty(value = "助教名称")
+    private String teachingNames;
+
+    public String getTeachingNames() {
+        return teachingNames;
+    }
+
+    public void setTeachingNames(String teachingNames) {
+        this.teachingNames = teachingNames;
+    }
+
     public Integer getSchoolId() {
     public Integer getSchoolId() {
         return schoolId;
         return schoolId;
     }
     }

+ 118 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ManagerDownload.java

@@ -0,0 +1,118 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.ExportTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+
+@ApiModel(value = "com-ym-mec-biz-dal-entity-ManagerDownload")
+public class ManagerDownload {
+    @ApiModelProperty(value = "")
+    private Integer id;
+
+    /**
+     * 下载人
+     */
+    @ApiModelProperty(value = "下载人")
+    private Integer userId;
+
+    /**
+     * 文件名
+     */
+    @ApiModelProperty(value = "文件名")
+    private String name;
+
+    /**
+     * 下载链接
+     */
+    @ApiModelProperty(value = "下载链接")
+    private String fileUrl;
+
+    /**
+     * 文件类型
+     */
+    @ApiModelProperty(value = "文件类型")
+    private ExportTypeEnum type;
+
+    /**
+     * 状态
+     */
+    @ApiModelProperty(value = "状态")
+    private Integer status=0;
+
+    /**
+     * 创建时间
+     */
+    @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 getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    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;
+    }
+
+    public ExportTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(ExportTypeEnum type) {
+        this.type = type;
+    }
+}

+ 641 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ManagerDownloadExample.java

@@ -0,0 +1,641 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ManagerDownloadExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public ManagerDownloadExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Integer value) {
+            addCriterion("id_ =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Integer value) {
+            addCriterion("id_ <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Integer value) {
+            addCriterion("id_ >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("id_ >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Integer value) {
+            addCriterion("id_ <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Integer value) {
+            addCriterion("id_ <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Integer> values) {
+            addCriterion("id_ in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Integer> values) {
+            addCriterion("id_ not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Integer value1, Integer value2) {
+            addCriterion("id_ between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("id_ not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNull() {
+            addCriterion("user_id_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNotNull() {
+            addCriterion("user_id_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdEqualTo(Integer value) {
+            addCriterion("user_id_ =", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotEqualTo(Integer value) {
+            addCriterion("user_id_ <>", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThan(Integer value) {
+            addCriterion("user_id_ >", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThanOrEqualTo(Integer value) {
+            addCriterion("user_id_ >=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThan(Integer value) {
+            addCriterion("user_id_ <", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThanOrEqualTo(Integer value) {
+            addCriterion("user_id_ <=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIn(List<Integer> values) {
+            addCriterion("user_id_ in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotIn(List<Integer> values) {
+            addCriterion("user_id_ not in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdBetween(Integer value1, Integer value2) {
+            addCriterion("user_id_ between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotBetween(Integer value1, Integer value2) {
+            addCriterion("user_id_ not between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNull() {
+            addCriterion("name_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIsNotNull() {
+            addCriterion("name_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameEqualTo(String value) {
+            addCriterion("name_ =", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotEqualTo(String value) {
+            addCriterion("name_ <>", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThan(String value) {
+            addCriterion("name_ >", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameGreaterThanOrEqualTo(String value) {
+            addCriterion("name_ >=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThan(String value) {
+            addCriterion("name_ <", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLessThanOrEqualTo(String value) {
+            addCriterion("name_ <=", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameLike(String value) {
+            addCriterion("name_ like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotLike(String value) {
+            addCriterion("name_ not like", value, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameIn(List<String> values) {
+            addCriterion("name_ in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotIn(List<String> values) {
+            addCriterion("name_ not in", values, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameBetween(String value1, String value2) {
+            addCriterion("name_ between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andNameNotBetween(String value1, String value2) {
+            addCriterion("name_ not between", value1, value2, "name");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlIsNull() {
+            addCriterion("file_url_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlIsNotNull() {
+            addCriterion("file_url_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlEqualTo(String value) {
+            addCriterion("file_url_ =", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlNotEqualTo(String value) {
+            addCriterion("file_url_ <>", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlGreaterThan(String value) {
+            addCriterion("file_url_ >", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("file_url_ >=", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlLessThan(String value) {
+            addCriterion("file_url_ <", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlLessThanOrEqualTo(String value) {
+            addCriterion("file_url_ <=", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlLike(String value) {
+            addCriterion("file_url_ like", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlNotLike(String value) {
+            addCriterion("file_url_ not like", value, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlIn(List<String> values) {
+            addCriterion("file_url_ in", values, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlNotIn(List<String> values) {
+            addCriterion("file_url_ not in", values, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlBetween(String value1, String value2) {
+            addCriterion("file_url_ between", value1, value2, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andFileUrlNotBetween(String value1, String value2) {
+            addCriterion("file_url_ not between", value1, value2, "fileUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNull() {
+            addCriterion("status_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIsNotNull() {
+            addCriterion("status_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusEqualTo(Integer value) {
+            addCriterion("status_ =", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotEqualTo(Integer value) {
+            addCriterion("status_ <>", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThan(Integer value) {
+            addCriterion("status_ >", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+            addCriterion("status_ >=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThan(Integer value) {
+            addCriterion("status_ <", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusLessThanOrEqualTo(Integer value) {
+            addCriterion("status_ <=", value, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusIn(List<Integer> values) {
+            addCriterion("status_ in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotIn(List<Integer> values) {
+            addCriterion("status_ not in", values, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusBetween(Integer value1, Integer value2) {
+            addCriterion("status_ between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+            addCriterion("status_ not between", value1, value2, "status");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time_ =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time_ <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time_ >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time_ >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time_ <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time_ <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time_ in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time_ not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time_ between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time_ not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time_ is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time_ is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time_ =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time_ <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time_ >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time_ >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time_ <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time_ <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time_ in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time_ not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time_ between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time_ not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

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

@@ -90,6 +90,16 @@ public class StudentAttendance {
 	@ApiModelProperty(value = "缴费状态")
 	@ApiModelProperty(value = "缴费状态")
 	private String paymentStatus = "PAID_COMPLETED";
 	private String paymentStatus = "PAID_COMPLETED";
 
 
+	private int normalRemind;
+
+	public int getNormalRemind() {
+		return normalRemind;
+	}
+
+	public void setNormalRemind(int normalRemind) {
+		this.normalRemind = normalRemind;
+	}
+
 	public String getTeacherAvatar() {
 	public String getTeacherAvatar() {
 		return teacherAvatar;
 		return teacherAvatar;
 	}
 	}

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
+	ORDER(1, "订单列表"),
+	ROUTE_ORDER(2, "财务管理");
+
+	private Integer code;
+
+	private String desc;
+
+	private ExportTypeEnum(Integer code, String desc) {
+		this.code = code;
+		this.desc = desc;
+	}
+
+	@Override
+	public Integer getCode() {
+		return code;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+}

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 package com.ym.mec.biz.dal.page;
 
 
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
@@ -32,12 +33,45 @@ public class CourseScheduleQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "课程类型")
     @ApiModelProperty(value = "课程类型")
     private String type;
     private String type;
 
 
+    @ApiModelProperty(value = "课程状态")
+    private CourseStatusEnum status;
+
     @ApiModelProperty(value = "课程编号")
     @ApiModelProperty(value = "课程编号")
     private Integer courseScheduleId;
     private Integer courseScheduleId;
 
 
     @ApiModelProperty(value = "是否获取班级所有课程(不限制老师)")
     @ApiModelProperty(value = "是否获取班级所有课程(不限制老师)")
     private boolean findTotal = false;
     private boolean findTotal = false;
 
 
+    @ApiModelProperty(value = "开始上课日期")
+    private String startClassDate;
+
+    @ApiModelProperty(value = "结束上课日期")
+    private String endClassDate;
+
+    public CourseStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(CourseStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getStartClassDate() {
+        return startClassDate;
+    }
+
+    public void setStartClassDate(String startClassDate) {
+        this.startClassDate = startClassDate;
+    }
+
+    public String getEndClassDate() {
+        return endClassDate;
+    }
+
+    public void setEndClassDate(String endClassDate) {
+        this.endClassDate = endClassDate;
+    }
+
     public boolean getFindTotal() {
     public boolean getFindTotal() {
         return findTotal;
         return findTotal;
     }
     }

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ManagerDownloadQueryInfo.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.dal.page;
+
+
+import com.ym.mec.biz.dal.enums.ExportTypeEnum;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ManagerDownloadQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "用户id", required = false)
+    private Integer userId = 0;
+
+    @ApiModelProperty(value = "文件类型", required = false)
+    private ExportTypeEnum type;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public ExportTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(ExportTypeEnum type) {
+        this.type = type;
+    }
+}

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

@@ -67,6 +67,8 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
 
 
     private boolean isExport = false;
     private boolean isExport = false;
 
 
+    private String oldOrganId;
+
     public boolean getIsExport() {
     public boolean getIsExport() {
         return isExport;
         return isExport;
     }
     }
@@ -226,4 +228,12 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     public void setNoneTqType(Integer noneTqType) {
     public void setNoneTqType(Integer noneTqType) {
         this.noneTqType = noneTqType;
         this.noneTqType = noneTqType;
     }
     }
+
+    public String getOldOrganId() {
+        return oldOrganId;
+    }
+
+    public void setOldOrganId(String oldOrganId) {
+        this.oldOrganId = oldOrganId;
+    }
 }
 }

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

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

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

@@ -6,6 +6,7 @@ import java.util.Map;
 
 
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 
 public interface ContractService {
 public interface ContractService {
 
 
@@ -115,6 +116,13 @@ public interface ContractService {
 	boolean transferProduceContract(Integer userId,String musicGroupId);
 	boolean transferProduceContract(Integer userId,String musicGroupId);
 
 
 	/**
 	/**
+	 * 传递产品协议-仅生成课程协议
+	 * @param userId
+	 * @return
+	 */
+	HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId);
+
+	/**
 	 * 查询产品协议
 	 * 查询产品协议
 	 * @param userId
 	 * @param userId
 	 * @return
 	 * @return

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

@@ -575,7 +575,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @param practiceGroupId
 	 * @param practiceGroupId
 	 * @param coursesExpireDate
 	 * @param coursesExpireDate
 	 */
 	 */
-	void updatePracticeGroupInDate(String practiceGroupId, Date courseStartDate, Date coursesExpireDate);
+	void updatePracticeGroupInDate(String practiceGroupId, Date courseStartDate, Date coursesExpireDate, Boolean onlyNormal);
 
 
 	/**
 	/**
 	 * 获取当前班级列表的所有未开始的课程
 	 * 获取当前班级列表的所有未开始的课程

+ 25 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -0,0 +1,25 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.ManagerDownload;
+
+import java.util.Map;
+
+
+public interface ExportService {
+
+    /**
+     * 订单列表导出
+     * @param params
+     * @throws Exception
+     */
+    void orderList(Map<String, Object> params, ManagerDownload managerDownload) throws Exception;
+
+
+    /**
+     * 财务管理下载
+     * @param params
+     * @param managerDownload
+     * @throws Exception
+     */
+    void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload) throws Exception;
+}

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

@@ -20,7 +20,7 @@ public interface ImGroupService extends BaseService<Long, ImGroup> {
 	 * @param type 群类型
 	 * @param type 群类型
 	 * @return
 	 * @return
 	 */
 	 */
-	boolean create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type);
+	ImGroup create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type);
 
 
 	/**
 	/**
 	 * 解散群组
 	 * 解散群组

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

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.ManagerDownload;
+import com.ym.mec.common.service.BaseService;
+
+public interface ManagerDownloadService extends BaseService<Integer, ManagerDownload> {
+
+}

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

@@ -49,4 +49,12 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return
      * @return
      */
      */
     String getStudentGrade(GradeTypeEnum gradeType,Integer gradeNum);
     String getStudentGrade(GradeTypeEnum gradeType,Integer gradeNum);
+
+    /**
+     * @describe 更新学员指导老师和声部信息
+     * @author Joburgess
+     * @date 2021/3/29 0029
+     * @return void
+     */
+    void updateStudentTeacherAndSubject();
 }
 }

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

@@ -1455,7 +1455,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
     }
 
 
     @Override
     @Override
-    public List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status) {
+    public List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status, String groupName) {
         SysUser user = sysUserFeignService.queryUserInfo();
         SysUser user = sysUserFeignService.queryUserInfo();
         if (Objects.isNull(user)) {
         if (Objects.isNull(user)) {
             throw new BizException("请登录");
             throw new BizException("请登录");
@@ -1468,13 +1468,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         List<TeacherClassGroupDto> teacherMusicClassGroup;
         switch (type) {
         switch (type) {
             case "VIP":
             case "VIP":
-                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue(),status);
+                teacherMusicClassGroup = classGroupDao.findTeacherVipClassGroup(user.getId().longValue(),status,groupName);
                 break;
                 break;
             case "MUSIC_GROUP":
             case "MUSIC_GROUP":
-                teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(user.getId().longValue());
+                teacherMusicClassGroup = classGroupDao.findTeacherMusicClassGroup(user.getId().longValue(),groupName);
                 break;
                 break;
             case "PRACTICE":
             case "PRACTICE":
-                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue(),status);
+                teacherMusicClassGroup = classGroupDao.findTeacherPracticeClassGroup(user.getId().longValue(),status, groupName);
                 break;
                 break;
             default:
             default:
                 throw new BizException("课程类型错误");
                 throw new BizException("课程类型错误");

+ 27 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -14,8 +14,6 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Isolation;
@@ -42,13 +40,28 @@ import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
 import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
+import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.service.ClassGroupRelationService;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ClassGroupStudentMapperService;
+import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupMember;
-import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.util.collection.MapUtil;
-import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.http.HttpUtil;
 
 
 @Service
 @Service
@@ -122,11 +135,14 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //1、删除班级学生对应班级关系
         //1、删除班级学生对应班级关系
         classStudentMapper.setStatus(ClassGroupStudentStatusEnum.QUIT);
         classStudentMapper.setStatus(ClassGroupStudentStatusEnum.QUIT);
         update(classStudentMapper);
         update(classStudentMapper);
-        StudentRegistration student = studentRegistrationService.findStudentByClassGroupIdAndUserId(userId, classGroupId);
-        if (student != null) {
-            student.setClassGroupId(0);
-            studentRegistrationService.update(student);
-        }
+        
+		if (classGroup.getGroupType() == GroupType.MUSIC) {
+			StudentRegistration student = studentRegistrationService.queryByUserIdAndMusicGroupId(userId, classGroup.getMusicGroupId());
+			if (student != null) {
+				student.setClassGroupId(0);
+				studentRegistrationService.update(student);
+			}
+		}
 
 
         //2、班级人数调整
         //2、班级人数调整
         classGroupService.updateClassStudentNum(classGroupId);
         classGroupService.updateClassStudentNum(classGroupId);

+ 104 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -12,6 +12,8 @@ import java.util.Map.Entry;
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -20,6 +22,7 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -81,6 +84,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	private SysUserContractsService sysUserContractsService;
 	private SysUserContractsService sysUserContractsService;
 
 
 	@Autowired
 	@Autowired
+	private SysUserContractsDao sysUserContractsDao;
+
+	@Autowired
 	private StudentRegistrationService studentRegistrationService;
 	private StudentRegistrationService studentRegistrationService;
 
 
 	@Autowired
 	@Autowired
@@ -1143,4 +1149,102 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		return result;
 		return result;
 	}
 	}
 
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId) {
+		SysUser user = studentDao.lockUserReturnInfo(userId);
+		if (user == null) {
+			logger.error("用户不存在({})", userId);
+			return BaseController.failed("用户不存在");
+		}
+
+		int validContactNum = sysUserContractsDao.countUserValidContact(userId);
+		if(validContactNum>0){
+			return BaseController.succeed();
+		}
+
+		if(StringUtils.isBlank(user.getRealName())||StringUtils.isBlank(user.getIdCardNo())){
+			return BaseController.failed(HttpStatus.PARTIAL_CONTENT, user, "");
+		}
+
+		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
+		if (sysUserTsign == null && CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType())) {
+			try {
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			} catch (Exception e) {
+				logger.error("用户电子签章注册失败", e);
+				return BaseController.failed("用户电子签章注册失败");
+			}
+		}
+		Date date = new Date();
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + "_" + LocalDateTime.now().getSecond() + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+
+		// 查询参数信息
+		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
+		params.put("studentInfo", studentInfo);
+
+		params.put("isShowVisualSeal", false);
+
+		CourseViewTypeEnum courseViewType = CourseViewTypeEnum.COURSE_lIST;
+		params.put("ownershipType", "OWN");
+
+		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, 2);
+		if(!CollectionUtils.isEmpty(userContracts)){
+			return BaseController.succeed();
+		}
+
+		templateEngine.render(params, "product2.ftl", srcFile);
+
+		// 生成借款协议PDF
+		try {
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
+		} catch (IOException e) {
+			logger.error("生成产品协议失败", e);
+			return BaseController.failed("生成产品协议失败");
+		}
+
+		String organCode = "91440300326364429H";
+
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if (organTsign == null) {
+			logger.error("甲方未创建签章");
+			return BaseController.failed("甲方未创建签章");
+		}
+
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
+		if (sysUserTsign != null) {
+			eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
+		}
+
+		// 上传到oss
+		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = "product/" + dateStrOss + "/" + DateUtil.getHour(date);
+		String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
+
+		SysUserContracts sysUserContracts = new SysUserContracts();
+		sysUserContracts.setCreateTime(date);
+		sysUserContracts.setType(ContractType.PRODUCT);
+		sysUserContracts.setUrl(pdfFilePath);
+		sysUserContracts.setUserId(userId);
+		sysUserContracts.setVersion(2);
+
+		sysUserContractsService.insert(sysUserContracts);
+
+		FileUtils.deleteQuietly(srcFile);
+		return BaseController.succeed();
+	}
 }
 }

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

@@ -276,6 +276,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             currentCourseDetail.setStudentAttendanceIsFirstTime(1);
             currentCourseDetail.setStudentAttendanceIsFirstTime(1);
         }
         }
 
 
+        int normalRemindNum = studentAttendanceDao.countNormalRemindNum(courseID);
+        currentCourseDetail.setNormalRemind(normalRemindNum<=0?0:1);
+
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
 		currentCourseDetail.setAttendanceRange(CourseScheduleType.VIP.equals(currentCourseDetail.getCourseType())?Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE_VIP)):Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
 		currentCourseDetail.setAttendanceRange(CourseScheduleType.VIP.equals(currentCourseDetail.getCourseType())?Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE_VIP)):Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
@@ -3050,7 +3053,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             //课程是否已结算
             //课程是否已结算
             int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(oldCourseSchedule.getId().intValue());
             int settlementNum = courseScheduleTeacherSalaryDao.checkCourseIsSettlement(oldCourseSchedule.getId().intValue());
             if (settlementNum > 0) {
             if (settlementNum > 0) {
-                throw new BizException("{}[{}]{}-{}课程已结算",
+                throw new BizException("{}[{}]{}-{}课程已结算",
                         oldCourseSchedule.getName(),
                         oldCourseSchedule.getName(),
                         oldCourseSchedule.getId(),
                         oldCourseSchedule.getId(),
                         DateUtil.dateToString(oldCourseSchedule.getStartClassTime(),
                         DateUtil.dateToString(oldCourseSchedule.getStartClassTime(),
@@ -4152,7 +4155,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
 			List<Map<Long, Integer>> courseLeaveStudentNumMaps = studentAttendanceDao.countCourseLeaveStudentNumWithFourHoursAgo(allCourseScheduleIds, advanceLeaveHours);
 			Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 			Map<Long,Long> courseLeaveStudentNumMap = MapUtil.convertIntegerMap((courseLeaveStudentNumMaps));
 
 
-			dataList.forEach(e -> {
+			List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseIdsAndTeacherRole(allCourseScheduleIds, null);
+			Map<Long, Map<TeachTypeEnum, Set<String>>> cttnMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+				cttnMap = courseScheduleTeacherSalaries.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId, Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole, Collectors.mapping(CourseScheduleTeacherSalary::getUserName, Collectors.toSet()))));
+			}
+
+			for (TeacherClassCourseSchudeleDto e : dataList) {
 				e.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(e.getClassGroupId().intValue(),new Date()));
 				e.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(e.getClassGroupId().intValue(),new Date()));
 				e.setTotalClassTimes(courseScheduleDao.countCurrentCourseTime(e.getCourseScheduleId()));
 				e.setTotalClassTimes(courseScheduleDao.countCurrentCourseTime(e.getCourseScheduleId()));
 
 
@@ -4161,7 +4170,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				if(Objects.nonNull(leaveStudentNum)&&Objects.nonNull(normalStudentNum)&&leaveStudentNum.intValue()==normalStudentNum.intValue()){
 				if(Objects.nonNull(leaveStudentNum)&&Objects.nonNull(normalStudentNum)&&leaveStudentNum.intValue()==normalStudentNum.intValue()){
 					e.setEnableAdjustInToday(1);
 					e.setEnableAdjustInToday(1);
 				}
 				}
-			});
+
+				if(cttnMap.containsKey(e.getCourseScheduleId())&&cttnMap.get(e.getCourseScheduleId()).containsKey(TeachTypeEnum.TEACHING)){
+					e.setTeachingNames(StringUtils.join(cttnMap.get(e.getCourseScheduleId()).get(TeachTypeEnum.TEACHING), ","));
+				}
+			}
 		}
 		}
 		if (count == 0) {
 		if (count == 0) {
 			dataList = new ArrayList<>();
 			dataList = new ArrayList<>();
@@ -4964,7 +4977,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-	public void updatePracticeGroupInDate(String practiceGroupId, Date courseStartDate, Date coursesExpireDate) {
+	public void updatePracticeGroupInDate(String practiceGroupId, Date courseStartDate, Date coursesExpireDate, Boolean onlyNormal) {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (null == user) {
 		if (null == user) {
 			throw new BizException("获取用户信息失败");
 			throw new BizException("获取用户信息失败");
@@ -4976,6 +4989,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     	if(practiceGroup == null){
     	if(practiceGroup == null){
 			throw new BizException("课程组不存在");
 			throw new BizException("课程组不存在");
 		}
 		}
+		if(onlyNormal&&!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())){
+			throw new BizException("非正常状态课程组不可编辑");
+		}
 		if(!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())&&!GroupStatusEnum.FINISH.equals(practiceGroup.getGroupStatus())){
 		if(!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())&&!GroupStatusEnum.FINISH.equals(practiceGroup.getGroupStatus())){
 			throw new BizException("非正常状态课程组不可编辑");
 			throw new BizException("非正常状态课程组不可编辑");
 		}
 		}
@@ -5318,6 +5334,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 //			throw new BizException("课程合并仅支持同课程类型");
 //			throw new BizException("课程合并仅支持同课程类型");
 //		}
 //		}
 		for (CourseSchedule courseSchedule : allCourses) {
 		for (CourseSchedule courseSchedule : allCourses) {
+			if(Objects.nonNull(courseSchedule.getIsLock())&&courseSchedule.getIsLock()==1){
+				throw new BizException("存在审核中的课程");
+			}
 			if(Objects.nonNull(courseSchedule.getNewCourseId())){
 			if(Objects.nonNull(courseSchedule.getNewCourseId())){
 				throw new BizException("存在已合并课程");
 				throw new BizException("存在已合并课程");
 			}
 			}

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

@@ -0,0 +1,622 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.FeeFlagNumDto;
+import com.ym.mec.biz.dal.dto.PracticeCourseDto;
+import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
+import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
+import com.ym.mec.biz.service.ExportService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.storage.StoragePluginContext;
+import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.upload.UploadUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.system.ApplicationHome;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class ExportServiceImpl implements ExportService {
+
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
+    @Autowired
+    private VipGroupDao vipGroupDao;
+    @Autowired
+    private PracticeGroupDao practiceGroupDao;
+    @Autowired
+    private SellOrderDao sellOrderDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private StoragePluginContext storagePluginContext;
+    @Autowired
+    private ManagerDownloadDao managerDownloadDao;
+
+    @Override
+    @Async
+    public void orderList(Map<String, Object> params, ManagerDownload managerDownload) throws Exception {
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
+        long i = 1;
+        for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
+            if (row.getActualAmount() == null) {
+                row.setActualAmount(BigDecimal.ZERO);
+            }
+            if (row.getBalancePaymentAmount() == null) {
+                row.setBalancePaymentAmount(BigDecimal.ZERO);
+            }
+            if (row.getMemo() == null) {
+                row.setMemo("");
+            }
+            BigDecimal transferFee = BigDecimal.ZERO;
+            if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
+                FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
+                if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum()) {
+                    transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                }
+                if (countFeeFlagNum.getTotalNum().equals(countFeeFlagNum.getYesNum())) {
+                    List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(row.getOrderNo());
+                    for (StudentPaymentRouteOrder routeOrder : routeOrders) {
+                        transferFee = transferFee.add(routeOrder.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP));
+                    }
+                }
+            }
+            row.setTransferFee(transferFee);
+
+            String goodsName = "";
+            if (row.getOrderDetailList() != null) {
+                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
+                    switch (orderDetail.getType()) {
+                        case COURSE:
+                        case CLASSROOM:
+                        case SINGLE:
+                        case MIX:
+                        case COMPREHENSIVE:
+                        case ENLIGHTENMENT:
+                        case TRAINING_SINGLE:
+                        case TRAINING_MIX:
+                        case MUSIC_NETWORK:
+                        case HIGH:
+                        case HIGH_ONLINE:
+                        case HIGH_ONLINE_COURSE:
+                            row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
+                            break;
+                        case MUSICAL:
+                            if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                                BigDecimal leaseFee = BigDecimal.ZERO;
+                                if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                                }
+                                row.setLeaseFee(leaseFee);
+                            } else {
+                                row.setMusicalFee(orderDetail.getPrice());
+                            }
+                            break;
+                        case ACCESSORIES:
+                        case TEACHING:
+                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
+                            break;
+                        case OTHER:
+                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
+                        case MAINTENANCE:
+                            BigDecimal repairFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                repairFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setMaintenanceFee(repairFee);
+                        default:
+                            break;
+                    }
+                }
+            }
+            if (row.getGoodsList() != null) {
+                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
+            }
+            if (StringUtils.isNotBlank(goodsName)) {
+                row.setMemo(goodsName);
+            }
+            //专业
+            if (row.getGroupType().equals(GroupType.VIP)) {
+                row.setVipCourseFee(row.getActualAmount());
+                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
+                if (vipGroupInfo != null) {
+                    row.setSchoolName(vipGroupInfo.getSchoolName());
+                    row.setSubjectName(vipGroupInfo.getSubjectName());
+                }
+            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
+                //考级报名
+                if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+                    String[] feeTypes = row.getMemo().split(";");
+                    List<String> feeTypeList = Arrays.asList(feeTypes);
+                    for (String feeTypeStr : feeTypeList) {
+                        int index = feeTypeStr.lastIndexOf(":");
+                        if (index < 0) {
+                            continue;
+                        }
+                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
+                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                        }
+                        if (feeTypeStr.contains("VIP")) {
+                            row.setVipCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("网管课")) {
+                            row.setPracticeCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("乐理课")) {
+                            row.setTheoryCourseFee(typeFee);
+                        }
+                    }
+                    row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
+                } else {
+                    if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
+                        row.setDegreeFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(row.getChargeType())) {
+                        row.setPracticeCourseFee(row.getActualAmount());
+                    } else {
+                        row.setOtherFee(row.getActualAmount());
+                    }
+                }
+                if (row.getChargeType() != null) {
+                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
+                        if (!chargeType.getCode().equals(row.getChargeType())) continue;
+                        row.setSporadicType(chargeType.getMsg());
+                    }
+                }
+            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
+                row.setPracticeCourseFee(row.getActualAmount());
+                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(row.getMusicGroupId()));
+                if (practiceGroup != null) {
+                    row.setSubjectName(practiceGroup.getSubjectName());
+                }
+            } else {
+                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
+                row.setMusicalFee(feeByType.getMusicalFee());
+                row.setTeachingFee(feeByType.getTeachingFee());
+                row.setMaintenanceProductFee(feeByType.getRepairFee());
+                row.setOtherFee(feeByType.getOtherFee());
+                if (row.getGroupType().equals(GroupType.MUSIC)) {
+                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                    if (studentRegistration != null) {
+                        row.setSubjectName(studentRegistration.getSubjectName());
+                        row.setSchoolName(studentRegistration.getSchoolName());
+                        row.setCooperationOrganName(studentRegistration.getRemark());
+                    }
+                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()));
+                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
+                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
+                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()));
+                    row.setTransferFee(BigDecimal.ZERO);
+                }
+            }
+            //如果合作单位不存在取学员的第一个乐团的合作单位和教学点
+            if (row.getCooperationOrganName() == null) {
+                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
+                if (cooperationOrgan != null) {
+                    row.setCooperationOrganName(cooperationOrgan.getName());
+                }
+            }
+            if (row.getMusicGroupId() != null && row.getMusicGroupId().equals("null")) {
+                row.setMusicGroupId("");
+            }
+            String paymentChannel = "";
+            if (row.getPaymentChannel() == null) {
+            } else if (row.getPaymentChannel().equals("YQPAY")) {
+                paymentChannel = "双乾";
+            } else if (row.getPaymentChannel().equals("ADAPAY")) {
+                paymentChannel = "汇付";
+            } else if (row.getPaymentChannel().equals("BALANCE")) {
+                paymentChannel = "余额";
+            }
+            row.setPaymentChannel(paymentChannel);
+            row.setId(i);
+            row.setRepairFee(row.getRepairFee().add(row.getMaintenanceFee()).add(row.getMaintenanceProductFee()));
+            i++;
+        }
+
+        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
+        File file = new File(basePath + "/" + managerDownload.getName());
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "押金", "乐器", "教辅费用", "其它", "手续费", "到账时间",
+                    "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "备注"};
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "leaseFee", "musicalFee", "teachingFee", "otherFee", "transferFee", "payTime", "musicGroupId",
+                    "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+            workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
+            workbook.write(fileOutputStream);
+            fileOutputStream.getFD().sync();
+            fileOutputStream.close();
+
+            String folder = "download/" + UploadUtil.getFileFloder();
+            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
+            //把记录插入下载表
+            managerDownload.setFileUrl(url);
+            managerDownload.setStatus(1);
+            managerDownloadDao.update(managerDownload);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+                workbook.close();
+                file.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    @Async
+    public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload) throws Exception {
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
+        long i = 1;
+        for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
+            if (row.getActualAmount() == null) {
+                row.setActualAmount(BigDecimal.ZERO);
+            }
+            if (row.getBalancePaymentAmount() == null) {
+                row.setBalancePaymentAmount(BigDecimal.ZERO);
+            }
+            if (row.getRouteAmount() == null) {
+                row.setRouteAmount(BigDecimal.ZERO);
+            }
+            if (row.getMemo() == null) {
+                row.setMemo("");
+            }
+            BigDecimal transferFee = BigDecimal.ZERO;
+            if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
+                FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
+                if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum() && row.getFeeFlag().equals("Y")) {
+                    transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                }
+                if (countFeeFlagNum.getTotalNum().equals(countFeeFlagNum.getYesNum())) {
+                    transferFee = row.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                }
+            }
+            row.setTransferFee(transferFee);
+
+            String goodsName = "";
+            if (row.getOrderDetailList() != null) {
+                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
+                    switch (orderDetail.getType()) {
+                        case COURSE:
+                        case CLASSROOM:
+                        case SINGLE:
+                        case MIX:
+                        case COMPREHENSIVE:
+                        case ENLIGHTENMENT:
+                        case TRAINING_SINGLE:
+                        case TRAINING_MIX:
+                        case MUSIC_NETWORK:
+                        case HIGH:
+                        case HIGH_ONLINE:
+                        case HIGH_ONLINE_COURSE:
+                            row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
+                            break;
+                        case MUSICAL:
+                            if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                                BigDecimal leaseFee = orderDetail.getPrice();
+                                if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                                }
+                                row.setLeaseFee(leaseFee);
+                            } else {
+                                row.setMusicalFee(orderDetail.getPrice());
+                            }
+                            break;
+                        case ACCESSORIES:
+                        case TEACHING:
+                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
+                            break;
+                        case OTHER:
+                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
+                        case MAINTENANCE:
+                            BigDecimal maintenanceFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                maintenanceFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setMaintenanceFee(maintenanceFee);
+                        default:
+                            break;
+                    }
+                }
+            }
+            if (row.getGoodsList() != null) {
+                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
+            }
+            if (StringUtils.isNotBlank(goodsName)) {
+                row.setMemo(goodsName);
+            }
+            //专业
+            if (row.getGroupType().equals(GroupType.VIP)) {
+                row.setVipCourseFee(row.getActualAmount());
+                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
+                if (vipGroupInfo != null) {
+                    row.setSchoolName(vipGroupInfo.getSchoolName());
+                    row.setSubjectName(vipGroupInfo.getSubjectName());
+                }
+            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
+                //考级报名
+                if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+                    String[] feeTypes = row.getMemo().split(";");
+                    List<String> feeTypeList = Arrays.asList(feeTypes);
+                    for (String feeTypeStr : feeTypeList) {
+                        int index = feeTypeStr.lastIndexOf(":");
+                        if (index < 0) {
+                            continue;
+                        }
+                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
+                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                        }
+                        if (feeTypeStr.contains("VIP")) {
+                            row.setVipCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("网管课")) {
+                            row.setPracticeCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("乐理课")) {
+                            row.setTheoryCourseFee(typeFee);
+                        }
+                    }
+                    row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
+                } else {
+                    if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
+                        row.setDegreeFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(row.getChargeType())) {
+                        row.setPracticeCourseFee(row.getActualAmount());
+                    } else {
+                        row.setOtherFee(row.getActualAmount());
+                    }
+                }
+                if (row.getChargeType() != null) {
+                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
+                        if (!chargeType.getCode().equals(row.getChargeType())) continue;
+                        row.setSporadicType(chargeType.getMsg());
+                    }
+                }
+            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
+                row.setPracticeCourseFee(row.getActualAmount());
+                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(row.getMusicGroupId()));
+                if (practiceGroup != null) {
+                    row.setSubjectName(practiceGroup.getSubjectName());
+                }
+            } else {
+                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
+                row.setMusicalFee(feeByType.getMusicalFee());
+                row.setTeachingFee(feeByType.getTeachingFee());
+                row.setMaintenanceProductFee(feeByType.getRepairFee());
+                row.setOtherFee(feeByType.getOtherFee());
+                if (row.getGroupType().equals(GroupType.MUSIC)) {
+                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                    if (studentRegistration != null) {
+                        row.setSubjectName(studentRegistration.getSubjectName());
+                        row.setSchoolName(studentRegistration.getSchoolName());
+                        row.setCooperationOrganName(studentRegistration.getRemark());
+                    }
+                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()));
+                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
+                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
+                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()));
+                    row.setTransferFee(BigDecimal.ZERO);
+                }
+            }
+            //如果合作单位不存在取学员的第一个乐团的合作单位和教学点
+            if (row.getCooperationOrganName() == null) {
+                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
+                if (cooperationOrgan != null) {
+                    row.setCooperationOrganName(cooperationOrgan.getName());
+                }
+            }
+            if (row.getMusicGroupId() != null && row.getMusicGroupId().equals("null")) {
+                row.setMusicGroupId("");
+            }
+            String paymentChannel = "";
+            if (row.getPaymentChannel() == null) {
+            } else if (row.getPaymentChannel().equals("YQPAY")) {
+                paymentChannel = "双乾";
+            } else if (row.getPaymentChannel().equals("ADAPAY")) {
+                paymentChannel = "汇付";
+            } else if (row.getPaymentChannel().equals("BALANCE")) {
+                paymentChannel = "余额";
+            }
+            row.setPaymentChannel(paymentChannel);
+            i++;
+        }
+
+        Map<Long, List<StudentPaymentOrderExportDto>> orderMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
+        orderMap.forEach((orderId, orders) -> {
+            int j = 1;
+            BigDecimal routeMusicGroupCourseFee = BigDecimal.ZERO;
+            BigDecimal routeVipCourseFee = BigDecimal.ZERO;
+            BigDecimal routePracticeCourseFee = BigDecimal.ZERO;
+            BigDecimal routeTheoryCourseFee = BigDecimal.ZERO;
+            BigDecimal routeDegreeFee = BigDecimal.ZERO;
+            BigDecimal routeRepairFee = BigDecimal.ZERO;
+            BigDecimal routeMaintenanceFee = BigDecimal.ZERO;
+            BigDecimal routeMaintenanceProductFee = BigDecimal.ZERO;
+            BigDecimal routeLeaseFee = BigDecimal.ZERO;
+            BigDecimal routeMusicalFee = BigDecimal.ZERO;
+            BigDecimal routeTeachingFee = BigDecimal.ZERO;
+            BigDecimal routeOtherFee = BigDecimal.ZERO;
+            for (StudentPaymentOrderExportDto order : orders) {
+                Date endDate = DateUtil.stringToDate("2021-04-01", "yyyy-MM-dd");
+                if (order.getPayTime() == null || order.getPayTime().compareTo(endDate) < 0) {
+                    break;
+                }
+                if (order.getSaleAmount().compareTo(BigDecimal.ZERO) > 0 && order.getServiceAmount().compareTo(BigDecimal.ZERO) == 0) {
+                    order.setMusicGroupCourseFee(BigDecimal.ZERO);
+                    order.setVipCourseFee(BigDecimal.ZERO);
+                    order.setPracticeCourseFee(BigDecimal.ZERO);
+                    order.setTheoryCourseFee(BigDecimal.ZERO);
+                    order.setDegreeFee(BigDecimal.ZERO);
+                    order.setRepairFee(order.getMaintenanceProductFee());
+                    continue;
+                } else if (order.getSaleAmount().compareTo(BigDecimal.ZERO) == 0 && order.getServiceAmount().compareTo(BigDecimal.ZERO) > 0) {
+                    order.setRepairFee(order.getRepairFee().add(order.getMaintenanceFee()));
+                    order.setMusicalFee(BigDecimal.ZERO);
+                    order.setTeachingFee(BigDecimal.ZERO);
+                    order.setOtherFee(BigDecimal.ZERO);
+                    order.setLeaseFee(BigDecimal.ZERO);
+                    continue;
+                }
+                BigDecimal musicGroupCourseFee = BigDecimal.ZERO;
+                BigDecimal vipCourseFee = BigDecimal.ZERO;
+                BigDecimal practiceCourseFee = BigDecimal.ZERO;
+                BigDecimal theoryCourseFee = BigDecimal.ZERO;
+                BigDecimal degreeFee = BigDecimal.ZERO;
+                BigDecimal repairFee = BigDecimal.ZERO;
+                BigDecimal maintenanceFee = BigDecimal.ZERO;
+                BigDecimal maintenanceProductFee = BigDecimal.ZERO;
+                BigDecimal leaseFee = BigDecimal.ZERO;
+                BigDecimal musicalFee = BigDecimal.ZERO;
+                BigDecimal teachingFee = BigDecimal.ZERO;
+                BigDecimal otherFee = BigDecimal.ZERO;
+
+                if (order.getActualAmount() != null && order.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
+                    musicGroupCourseFee = order.getMusicGroupCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    vipCourseFee = order.getVipCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    practiceCourseFee = order.getPracticeCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    theoryCourseFee = order.getTheoryCourseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    degreeFee = order.getDegreeFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    repairFee = order.getRepairFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    maintenanceFee = order.getMaintenanceFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    maintenanceProductFee = order.getMaintenanceProductFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    leaseFee = order.getLeaseFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    musicalFee = order.getMusicalFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    teachingFee = order.getTeachingFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                    otherFee = order.getOtherFee().multiply(order.getRouteAmount()).divide(order.getActualAmount(), 2, BigDecimal.ROUND_DOWN);
+                }
+
+                if (order.getGroupType().equals(GroupType.VIP)) {
+                    vipCourseFee = order.getRouteAmount();
+                } else if (order.getGroupType().equals(GroupType.SPORADIC)) {
+                    //考级报名
+                    if (order.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+                        degreeFee = order.getRouteAmount().subtract(vipCourseFee).subtract(practiceCourseFee).subtract(theoryCourseFee);
+                    } else {
+                        if (order.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(order.getChargeType())) {
+                            degreeFee = order.getRouteAmount();
+                        } else if (order.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(order.getChargeType())) {
+                            practiceCourseFee = order.getRouteAmount();
+                        } else {
+                            otherFee = order.getRouteAmount();
+                        }
+                    }
+                } else if (order.getGroupType().equals(GroupType.PRACTICE)) {
+                    practiceCourseFee = order.getRouteAmount();
+                } else {
+                    if (order.getGroupType().equals(GroupType.MUSIC)) {
+                        musicGroupCourseFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(maintenanceFee).subtract(maintenanceProductFee).subtract(otherFee).subtract(leaseFee);
+                    } else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
+                        repairFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(otherFee);
+                    } else if (order.getType().equals(OrderTypeEnum.OUTORDER)) {
+                        musicGroupCourseFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(maintenanceProductFee).subtract(otherFee);
+                    }
+                }
+
+                if (j == orders.size()) {
+                    musicGroupCourseFee = order.getMusicGroupCourseFee().subtract(routeMusicGroupCourseFee);
+                    vipCourseFee = order.getVipCourseFee().subtract(routeVipCourseFee);
+                    practiceCourseFee = order.getPracticeCourseFee().subtract(routePracticeCourseFee);
+                    theoryCourseFee = order.getTheoryCourseFee().subtract(routeTheoryCourseFee);
+                    degreeFee = order.getDegreeFee().subtract(routeDegreeFee);
+                    repairFee = order.getRepairFee().subtract(routeRepairFee);
+                    maintenanceFee = order.getMaintenanceFee().subtract(routeMaintenanceFee);
+                    maintenanceProductFee = order.getMaintenanceProductFee().subtract(routeMaintenanceProductFee);
+                    leaseFee = order.getLeaseFee().subtract(routeLeaseFee);
+                    musicalFee = order.getMusicalFee().subtract(routeMusicalFee);
+                    teachingFee = order.getTeachingFee().subtract(routeTeachingFee);
+                    otherFee = order.getOtherFee().subtract(routeOtherFee);
+                }
+                j++;
+
+                routeMusicGroupCourseFee = routeMusicGroupCourseFee.add(musicGroupCourseFee);
+                routeVipCourseFee = routeVipCourseFee.add(vipCourseFee);
+                routePracticeCourseFee = routePracticeCourseFee.add(practiceCourseFee);
+                routeTheoryCourseFee = routeTheoryCourseFee.add(theoryCourseFee);
+                routeDegreeFee = routeDegreeFee.add(degreeFee);
+                routeRepairFee = routeRepairFee.add(repairFee);
+                routeMaintenanceFee = routeMaintenanceFee.add(maintenanceFee);
+                routeMaintenanceProductFee = routeMaintenanceProductFee.add(maintenanceProductFee);
+                routeLeaseFee = routeLeaseFee.add(leaseFee);
+                routeMusicalFee = routeMusicalFee.add(musicalFee);
+                routeTeachingFee = routeTeachingFee.add(teachingFee);
+                routeOtherFee = routeOtherFee.add(otherFee);
+
+                order.setMusicGroupCourseFee(musicGroupCourseFee);
+                order.setVipCourseFee(vipCourseFee);
+                order.setPracticeCourseFee(practiceCourseFee);
+                order.setTheoryCourseFee(theoryCourseFee);
+                order.setDegreeFee(degreeFee);
+                order.setRepairFee(repairFee.add(maintenanceFee).add(maintenanceProductFee).add(repairFee));
+                order.setMaintenanceFee(maintenanceFee);
+                order.setMaintenanceProductFee(maintenanceProductFee);
+                order.setLeaseFee(leaseFee);
+                order.setMusicalFee(musicalFee);
+                order.setTeachingFee(teachingFee);
+                order.setOtherFee(otherFee);
+            }
+        });
+        String[] organIdArr = params.get("oldOrganId").toString().split(",");
+        List<String> organIds = Arrays.asList(organIdArr);
+        studentPaymentOrderExportDtos.removeIf(order -> !organIds.contains(order.getOrganId().toString()));
+
+        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
+        File file = new File(basePath + "/" + managerDownload.getName());
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分润余额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "押金", "乐器", "教辅费用", "其它", "手续费", "到账时间",
+                    "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "备注"};
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance", "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "leaseFee", "musicalFee", "teachingFee", "otherFee", "transferFee", "payTime", "musicGroupId",
+                    "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
+            workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
+            workbook.write(fileOutputStream);
+            fileOutputStream.getFD().sync();
+            fileOutputStream.close();
+
+            String folder = "download/" + UploadUtil.getFileFloder();
+            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
+            //把记录插入下载表
+            managerDownload.setFileUrl(url);
+            managerDownload.setStatus(1);
+            managerDownloadDao.update(managerDownload);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+                workbook.close();
+                file.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 72 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -4,6 +4,10 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
+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 org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -11,11 +15,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ImGroupDao;
-import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
@@ -35,9 +34,30 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	private ImGroupDao imGroupDao;
 	private ImGroupDao imGroupDao;
 
 
 	@Autowired
 	@Autowired
+	private ImGroupService imGroupService;
+
+	@Autowired
 	private TeacherDao teacherDao;
 	private TeacherDao teacherDao;
 
 
 	@Autowired
 	@Autowired
+	private ClassGroupDao classGroupDao;
+
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+
+	@Autowired
+	private PracticeGroupDao practiceGroupDao;
+
+	@Autowired
+	private VipGroupDao vipGroupDao;
+
+	@Autowired
+	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
+
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+
+	@Autowired
 	private ImFeignService imFeignService;
 	private ImFeignService imFeignService;
 	
 	
 	@Autowired
 	@Autowired
@@ -48,12 +68,56 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		return imGroupMemberDao;
 		return imGroupMemberDao;
 	}
 	}
 
 
+	public ImGroup joinGroup(Long imGroupId, Integer userId, String roleType, boolean isAdmin,Map<Integer,String> userRoleMap){
+		ClassGroup classGroup = classGroupDao.get(imGroupId.intValue());
+		String tags = classGroup.getName();
+		//相关用户加入群组
+		//获取班级关联的老师列表
+		Set<Integer> teacherIds = classGroupTeacherMapperDao.queryTeacherIdsByClassGroupId(imGroupId.intValue(),null,null);
+		//获取班级关联的学员列表
+		Set<Integer> studentIds = classGroupStudentMapperDao.queryStudentIdsByClassGroupId(imGroupId.intValue(),null,null);
+		if(studentIds != null && studentIds.size() > 0){
+			for(Integer studentId : studentIds){
+				userRoleMap.put(studentId, null);
+			}
+		}
+		if(teacherIds != null && teacherIds.size() > 0){
+			for(Integer teacherId : teacherIds){
+				userRoleMap.put(teacherId, "指导老师");
+			}
+		}
+		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(), "乐队指导");
+		}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(), "乐团主管");
+		}else if(classGroup.getGroupType() == GroupType.VIP){
+			VipGroup vipGroup = vipGroupDao.get(Long.parseLong(classGroup.getMusicGroupId()));
+			userRoleMap.put(vipGroup.getUserId(), "指导老师");
+			userRoleMap.put(vipGroup.getEducationalTeacherId(), "乐团主管");
+			tags = vipGroup.getName();
+		}
+		ImGroup imGroup = imGroupService.create(imGroupId, null, classGroup.getName(), tags, tags, tags, null, classGroup.getGroupType().getCode());
+		if(userId != null){
+			join(imGroupId,userId,roleType,isAdmin);
+		}
+		join(imGroupId,userRoleMap);
+		return imGroup;
+	}
+
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
 	public boolean join(Long imGroupId, Integer userId, String roleType, boolean isAdmin) {
 	public boolean join(Long imGroupId, Integer userId, String roleType, boolean isAdmin) {
 		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
 		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
 		if (imGroup == null) {
 		if (imGroup == null) {
-			throw new BizException("加入群组失败:群组[{}]不存在", imGroupId);
+			joinGroup(imGroupId,userId,roleType,isAdmin,new HashMap<>());
+			return true;
 		}
 		}
 		//检查用户是否已存在
 		//检查用户是否已存在
 		List<ImGroupMember> imGroupMemberList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userId.toString());
 		List<ImGroupMember> imGroupMemberList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userId.toString());
@@ -97,7 +161,8 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	public boolean join(Long imGroupId, Map<Integer, String> userRoleMap) {
 	public boolean join(Long imGroupId, Map<Integer, String> userRoleMap) {
 		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
 		ImGroup imGroup = imGroupDao.getLocked(imGroupId);
 		if (imGroup == null) {
 		if (imGroup == null) {
-			throw new BizException("加入群组失败:群组[{}]不存在", imGroupId);
+			joinGroup(imGroupId,null,null,false,userRoleMap);
+			return true;
 		}
 		}
 		//检查用户是否已存在
 		//检查用户是否已存在
 		List<Integer> existUserIdList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userRoleMap.keySet().stream().filter(Objects::nonNull).map(Objects::toString)
 		List<Integer> existUserIdList = imGroupMemberDao.queryByImGroupIdAndUserId(imGroupId.toString(), userRoleMap.keySet().stream().filter(Objects::nonNull).map(Objects::toString)

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

@@ -52,10 +52,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 
 
 	@Override
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@Transactional(rollbackFor = Exception.class)
-	public boolean create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type) {
+	public ImGroup create(Long id, Integer userId, String name, String introduce, String memo, String tags, String img, String type) {
 		ImGroup imGroup = imGroupDao.get(id);
 		ImGroup imGroup = imGroupDao.get(id);
 		if (imGroup != null) {
 		if (imGroup != null) {
-			return true;
+			return imGroup;
 		}
 		}
 
 
 		imGroup = new ImGroup();
 		imGroup = new ImGroup();
@@ -91,7 +91,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 			imFeignService.groupCreate(new GroupModel(groupId, null, name));
 			imFeignService.groupCreate(new GroupModel(groupId, null, name));
 		}
 		}
 
 
-		return true;
+		return imGroup;
 	}
 	}
 
 
 	@Override
 	@Override

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ManagerDownloadServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.ManagerDownloadDao;
+import com.ym.mec.biz.dal.entity.ManagerDownload;
+import com.ym.mec.biz.service.ManagerDownloadService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ManagerDownloadServiceImpl extends BaseServiceImpl<Integer, ManagerDownload> implements ManagerDownloadService {
+
+    @Autowired
+    private ManagerDownloadDao managerDownloadDao;
+
+    @Override
+    public BaseDAO<Integer, ManagerDownload> getDAO() {
+        return managerDownloadDao;
+    }
+
+}

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

@@ -1,18 +1,24 @@
 package com.ym.mec.biz.service.impl;
 package com.ym.mec.biz.service.impl;
 
 
-import static com.ym.mec.biz.dal.enums.DealStatusEnum.*;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.ING;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.event.source.GroupEventSource;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -21,15 +27,50 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.biz.dal.dao.ChargeTypeDao;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
+import com.ym.mec.biz.dal.dao.CooperationOrganDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SchoolDao;
+import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentPreRegistrationDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.StudentVisitDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.CloseMusicGroupDto;
 import com.ym.mec.biz.dal.dto.CloseMusicGroupDto;
-import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
 import com.ym.mec.biz.dal.dto.HighClassGroupDto;
 import com.ym.mec.biz.dal.dto.HighClassGroupDto;
 import com.ym.mec.biz.dal.dto.MusicCardDto;
 import com.ym.mec.biz.dal.dto.MusicCardDto;
@@ -44,7 +85,6 @@ import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
 import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
@@ -70,7 +110,47 @@ import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.GradeTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
+import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
+import com.ym.mec.biz.event.source.GroupEventSource;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ClassGroupStudentMapperService;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupMember;
@@ -82,7 +162,6 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.http.HttpUtil;
-import org.springframework.util.Assert;
 
 
 @Service
 @Service
 public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> implements MusicGroupService {
 public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> implements MusicGroupService {
@@ -1869,17 +1948,27 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         }
 
 
         Date date = new Date();
         Date date = new Date();
-
-        MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
-        musicGroupQuit.setCreateTime(date);
-        musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
-        musicGroupQuit.setMusicGroupId(musicGroupId);
-        musicGroupQuit.setUserId(sysUser.getId());
-        musicGroupQuit.setStatus(ApprovalStatus.APPROVED);
-        musicGroupQuit.setReason(reason);
-        musicGroupQuit.setQuitDate(date);
-
-        musicGroupQuitDao.insert(musicGroupQuit);
+        
+        MusicGroupQuit musicGroupQuit = musicGroupQuitDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+		if (musicGroupQuit != null && musicGroupQuit.getStatus() == ApprovalStatus.PROCESSING) {
+			musicGroupQuit.setStatus(ApprovalStatus.APPROVED);
+			musicGroupQuit.setReason(reason);
+			musicGroupQuit.setQuitDate(date);
+
+			musicGroupQuitDao.update(musicGroupQuit);
+		} else {
+
+			musicGroupQuit = new MusicGroupQuit();
+			musicGroupQuit.setCreateTime(date);
+			musicGroupQuit.setJoinDate(studentRegistration.getCreateTime());
+			musicGroupQuit.setMusicGroupId(musicGroupId);
+			musicGroupQuit.setUserId(sysUser.getId());
+			musicGroupQuit.setStatus(ApprovalStatus.APPROVED);
+			musicGroupQuit.setReason(reason);
+			musicGroupQuit.setQuitDate(date);
+
+			musicGroupQuitDao.insert(musicGroupQuit);
+		}
 
 
         List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
         List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
         for (Integer classGroupId : classGroupIdList) {
         for (Integer classGroupId : classGroupIdList) {

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

@@ -160,6 +160,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
             }
             }
         }
         }
 
 
+        int remindNum = studentAttendanceDao.countNormalRemindNum(courseScheduleId);
         studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
         studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
         int classTimes = courseScheduleDao.countClassTimes(courseSchedule.getClassGroupId().longValue(), courseSchedule.getStartClassTime());
         int classTimes = courseScheduleDao.countClassTimes(courseSchedule.getClassGroupId().longValue(), courseSchedule.getStartClassTime());
         studentAttendances.forEach(studentAttendance -> {
         studentAttendances.forEach(studentAttendance -> {
@@ -194,6 +195,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                     studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
                     studentAttendanceInfo.setSignInTime(courseSchedule.getStartClassTime());
                     studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
                     studentAttendanceInfo.setSignOutTime(courseSchedule.getEndClassTime());
                 }
                 }
+                studentAttendanceInfo.setNormalRemind(remindNum>0?1:0);
                 studentAttendanceDao.insert(studentAttendanceInfo);
                 studentAttendanceDao.insert(studentAttendanceInfo);
             } else {
             } else {
                 studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
                 studentFeeDao.updateStudentAbsenteeismTimes(studentAttendanceInfo.getUserId(),
@@ -202,15 +204,16 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
             }
             }
         });
         });
         //获取正常签到的学生信息
         //获取正常签到的学生信息
-        List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
-        if (normal != null && normal.size() > 0) {
-            Map<Integer, String> receivers = new HashMap<>();
-            normal.forEach(e -> {
-                receivers.put(e.getUserId(), e.getUserId().toString());
-            });
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
-                    receivers, null, 0, "2", "STUDENT", DateUtil.format(new Date(), DateUtil.DATE_FORMAT_MIN));
-        }
+//        List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
+//        if (normal != null && normal.size() > 0) {
+//            Map<Integer, String> receivers = new HashMap<>();
+//            normal.forEach(e -> {
+//                receivers.put(e.getUserId(), e.getUserId().toString());
+//            });
+//            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_NAMES_ACHIEVE,
+//                    receivers, null, 0, "2", "STUDENT", DateUtil.format(new Date(), DateUtil.DATE_FORMAT_MIN));
+//        }
+
         Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
         Map<StudentAttendanceStatusEnum, List<StudentAttendance>> studentAttendanceGroupByStatus = studentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getStatus));
         Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
         Integer studentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.NORMAL).size();
         Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();
         Integer leaveStudentNum = studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE) == null ? 0 : studentAttendanceGroupByStatus.get(StudentAttendanceStatusEnum.LEAVE).size();

+ 39 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,18 +1,16 @@
 package com.ym.mec.biz.service.impl;
 package com.ym.mec.biz.service.impl;
 
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.QueryInfo;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -43,6 +41,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
 
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+
     @Override
     @Override
     public BaseDAO<Integer, Student> getDAO() {
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
         return studentDao;
@@ -200,4 +201,36 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
         }
         return grade;
         return grade;
     }
     }
+
+    @Override
+    public void updateStudentTeacherAndSubject() {
+        List<Student> noTeacherOrNoSubjectStudent = studentDao.getNoTeacherOrNoSubjectStudent();
+        if(CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)){
+            return;
+        }
+        List<Integer> studentIds = noTeacherOrNoSubjectStudent.stream().map(Student::getUserId).collect(Collectors.toList());
+        List<StudentClassInfoDto> studentClassInfo = studentRegistrationDao.getStudentClassInfo(studentIds);
+        if(CollectionUtils.isEmpty(studentClassInfo)){
+            return;
+        }
+        List<Student> needUpdateStudents = new ArrayList<>();
+        Map<Integer, List<StudentClassInfoDto>> scm = studentClassInfo.stream().collect(Collectors.groupingBy(StudentClassInfoDto::getStudentId));
+        for (Student student : noTeacherOrNoSubjectStudent) {
+            if(!scm.containsKey(student.getUserId())){
+                continue;
+            }
+            List<StudentClassInfoDto> studentClassInfoDtos = scm.get(student.getUserId());
+            StudentClassInfoDto studentClassInfoDto = studentClassInfoDtos.stream().max(Comparator.comparing(StudentClassInfoDto::getClassGroupId)).get();
+            if(Objects.isNull(student.getTeacherId())){
+                student.setTeacherId(studentClassInfoDto.getMainTeacherId());
+            }
+            if(StringUtils.isBlank(student.getSubjectIdList())){
+                student.setSubjectIdList(studentClassInfoDto.getSubjectId().toString());
+            }
+            needUpdateStudents.add(student);
+        }
+        if(!CollectionUtils.isEmpty(needUpdateStudents)){
+            studentDao.batchUpdate(needUpdateStudents);
+        }
+    }
 }
 }

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

@@ -629,6 +629,9 @@
             AND cg.del_flag_ = 0
             AND cg.del_flag_ = 0
             AND cs.del_flag_ = 0
             AND cs.del_flag_ = 0
             AND mg.status_ = 'PROGRESS'
             AND mg.status_ = 'PROGRESS'
+            <if test="groupName!=null and groupName!=''">
+                AND mg.name_ LIKE CONCAT('%', #{groupName}, '%')
+            </if>
         GROUP BY cg.id_
         GROUP BY cg.id_
     </select>
     </select>
     <select id="findTeacherPracticeClassGroup" resultMap="TeacherClassGroupDto">
     <select id="findTeacherPracticeClassGroup" resultMap="TeacherClassGroupDto">
@@ -662,6 +665,9 @@
             <if test="status == 'FINISH'">
             <if test="status == 'FINISH'">
                 AND pg.group_status_ = 'FINISH'
                 AND pg.group_status_ = 'FINISH'
             </if>
             </if>
+            <if test="groupName!=null and groupName!=''">
+                AND pg.name_ LIKE CONCAT('%', #{groupName}, '%')
+            </if>
     </select>
     </select>
     <select id="findTeacherVipClassGroup" resultMap="TeacherClassGroupDto">
     <select id="findTeacherVipClassGroup" resultMap="TeacherClassGroupDto">
         SELECT
         SELECT
@@ -697,6 +703,9 @@
             <if test="status == 'FINISH'">
             <if test="status == 'FINISH'">
                 AND vg.group_status_ = 4
                 AND vg.group_status_ = 4
             </if>
             </if>
+            <if test="groupName!=null and groupName!=''">
+                AND vg.name_ LIKE CONCAT('%', #{groupName}, '%')
+            </if>
         GROUP BY
         GROUP BY
         vg.id_,cg.id_
         vg.id_,cg.id_
     </select>
     </select>

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

@@ -1384,6 +1384,15 @@
             <if test="onlyHistory!=null and onlyHistory==1">
             <if test="onlyHistory!=null and onlyHistory==1">
                 AND CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;now()
                 AND CONCAT( cs.class_date_, ' ', cs.end_class_time_ )&lt;now()
             </if>
             </if>
+            <if test="status!=null">
+                AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="startClassDate!=null and startClassDate!=''">
+                AND cs.class_date_ &gt;= #{startClassDate}
+            </if>
+            <if test="endClassDate!=null and endClassDate!=''">
+                AND cs.class_date_ &lt;= #{endClassDate}
+            </if>
         </where>
         </where>
     </sql>
     </sql>
 
 
@@ -1484,6 +1493,15 @@
         <if test="userId != null">
         <if test="userId != null">
             AND sa.teacher_id_=#{userId}
             AND sa.teacher_id_=#{userId}
         </if>
         </if>
+        <if test="status!=null">
+            AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+        <if test="startClassDate!=null and startClassDate!=''">
+            AND cs.class_date_ &gt;= #{startClassDate}
+        </if>
+        <if test="endClassDate!=null and endClassDate!=''">
+            AND cs.class_date_ &lt;= #{endClassDate}
+        </if>
         GROUP BY sa.course_schedule_id_
         GROUP BY sa.course_schedule_id_
         ORDER BY cs.id_
         ORDER BY cs.id_
         <include refid="global.limit"/>
         <include refid="global.limit"/>
@@ -1509,6 +1527,15 @@
         <if test="userId != null">
         <if test="userId != null">
             AND sa.teacher_id_=#{userId}
             AND sa.teacher_id_=#{userId}
         </if>
         </if>
+        <if test="status!=null">
+            AND cs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+        <if test="startClassDate!=null and startClassDate!=''">
+            AND cs.class_date_ &gt;= #{startClassDate}
+        </if>
+        <if test="endClassDate!=null and endClassDate!=''">
+            AND cs.class_date_ &lt;= #{endClassDate}
+        </if>
     </select>
     </select>
     <select id="countClassCourseNumByMusicGroup" resultType="java.util.Map">
     <select id="countClassCourseNumByMusicGroup" resultType="java.util.Map">
         SELECT cg.id_        as 'key',
         SELECT cg.id_        as 'key',

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -340,6 +340,23 @@
 		</foreach>
 		</foreach>
 		AND csts.teacher_role_=#{teacherRole}
 		AND csts.teacher_role_=#{teacherRole}
 	</select>
 	</select>
+
+	<select id="findByCourseIdsAndTeacherRole" resultMap="CourseScheduleTeacherSalary">
+		SELECT
+		csts.*,
+		su.real_name_ username_
+		FROM
+		course_schedule_teacher_salary csts
+		LEFT JOIN sys_user su ON csts.user_id_=su.id_
+		WHERE csts.course_schedule_id_ IN
+		<foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+			#{courseScheduleId}
+		</foreach>
+		<if test="teacherRole!=null and teacherRole!=''">
+			AND csts.teacher_role_=#{teacherRole}
+		</if>
+	</select>
+
 	<select id="findMusicGroupSettlementTypeByCourse" resultType="map">
 	<select id="findMusicGroupSettlementTypeByCourse" resultType="map">
 		SELECT
 		SELECT
 			cs.id_ AS 'key',
 			cs.id_ AS 'key',

+ 84 - 0
mec-biz/src/main/resources/config/mybatis/ManagerDownloadMapper.xml

@@ -0,0 +1,84 @@
+<?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.ManagerDownloadDao">
+    <resultMap id="ManagerDownload" type="com.ym.mec.biz.dal.entity.ManagerDownload">
+        <!--@mbg.generated-->
+        <!--@Table manager_download-->
+        <id column="id_" property="id"/>
+        <result column="user_id_" property="userId"/>
+        <result column="name_" property="name"/>
+        <result column="file_url_" property="fileUrl"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="status_" property="status"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time_" property="updateTime"/>
+    </resultMap>
+
+    <select id="get" parameterType="java.lang.Integer" resultMap="ManagerDownload">
+        <!--@mbg.generated-->
+        select * from manager_download
+        where id_ = #{id}
+    </select>
+    <delete id="delete" parameterType="java.lang.Integer">
+        <!--@mbg.generated-->
+        delete from manager_download
+        where id_ = #{id,jdbcType=INTEGER}
+    </delete>
+    <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.ManagerDownload"
+            useGeneratedKeys="true">
+        <!--@mbg.generated-->
+        insert into manager_download (user_id_, name_, file_url_,type_,
+        status_, create_time_, update_time_
+        )
+        values (#{userId}, #{name}, #{fileUrl},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+        #{status}, #{createTime}, #{updateTime}
+        )
+    </insert>
+
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.ManagerDownload">
+        <!--@mbg.generated-->
+        update manager_download
+        <set>
+            <if test="userId != null">
+                user_id_ = #{userId},
+            </if>
+            <if test="name != null">
+                name_ = #{name},
+            </if>
+            <if test="fileUrl != null">
+                file_url_ = #{fileUrl},
+            </if>
+            <if test="status != null">
+                status_ = #{status},
+            </if>
+            create_time_ = NOW(),
+            update_time_ = NOW(),
+        </set>
+        where id_ = #{id}
+    </update>
+
+    <!-- 分页查询 -->
+    <select id="queryPage" resultMap="ManagerDownload" parameterType="map">
+        SELECT * FROM manager_download
+        <include refid="queryPageSql"/>
+        ORDER BY id_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <!-- 查询当前表的总记录数 -->
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*) FROM manager_download
+        <include refid="queryPageSql"/>
+    </select>
+
+    <sql id="queryPageSql">
+        <where>
+            <if test="userId != null">
+                AND user_id_ = #{userId}
+            </if>
+            <if test="type != null">
+                AND type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+        </where>
+    </sql>
+</mapper>

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

@@ -26,6 +26,7 @@
         <result column="create_time_" property="createTime"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="remark_" property="remark"/>
         <result column="remark_" property="remark"/>
+        <result column="normal_remind_" property="normalRemind"/>
         <result column="current_class_times_" property="currentClassTimes"/>
         <result column="current_class_times_" property="currentClassTimes"/>
         <result column="current_class_times_" property="currentClassTimes"/>
         <result column="current_class_times_" property="currentClassTimes"/>
         <result column="current_schedule_id_" property="currentScheduleId"/>
         <result column="current_schedule_id_" property="currentScheduleId"/>
@@ -57,15 +58,15 @@
             keyColumn="id" keyProperty="id">
             keyColumn="id" keyProperty="id">
         INSERT INTO student_attendance
         INSERT INTO student_attendance
         (group_type_,music_group_id_,class_group_id_,course_schedule_id_,user_id_,teacher_id_,status_,create_time_,
         (group_type_,music_group_id_,class_group_id_,course_schedule_id_,user_id_,teacher_id_,status_,create_time_,
-        update_time_,remark_,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_,visit_flag_)
+        update_time_,remark_,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_,visit_flag_,normal_remind_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
         #{courseScheduleId},#{userId},#{teacherId},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),
         #{courseScheduleId},#{userId},#{teacherId},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),
-        #{remark},#{currentClassTimes},#{signInTime},#{signOutTime},#{currentScheduleId},#{visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        #{remark},#{currentClassTimes},#{signInTime},#{signOutTime},#{currentScheduleId},#{visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{normalRemind})
     </insert>
     </insert>
 
 
     <insert id="addStudentAttendances" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
     <insert id="addStudentAttendances" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
       INSERT INTO student_attendance (group_type_, music_group_id_, class_group_id_, course_schedule_id_,
       INSERT INTO student_attendance (group_type_, music_group_id_, class_group_id_, course_schedule_id_,
-      user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_,visit_flag_)
+      user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_,visit_flag_,normal_remind_)
       VALUES
       VALUES
 	  <foreach collection="list" item="studentAttendance" separator=",">
 	  <foreach collection="list" item="studentAttendance" separator=",">
           (#{studentAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
           (#{studentAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -73,7 +74,8 @@
           #{studentAttendance.userId},#{studentAttendance.teacherId},
           #{studentAttendance.userId},#{studentAttendance.teacherId},
           #{studentAttendance.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{studentAttendance.updateTime},
           #{studentAttendance.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{studentAttendance.updateTime},
           #{studentAttendance.remark},#{studentAttendance.currentClassTimes},
           #{studentAttendance.remark},#{studentAttendance.currentClassTimes},
-          #{studentAttendance.signInTime},#{studentAttendance.signOutTime},#{studentAttendance.currentScheduleId},#{studentAttendance.visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+          #{studentAttendance.signInTime},#{studentAttendance.signOutTime},#{studentAttendance.currentScheduleId},#{studentAttendance.visitFlag,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+          #{studentAttendance.normalRemind})
       </foreach>
       </foreach>
     </insert>
     </insert>
 
 
@@ -120,6 +122,9 @@
             <if test="currentClassTimes != null">
             <if test="currentClassTimes != null">
                 current_class_times_ = #{currentClassTimes},
                 current_class_times_ = #{currentClassTimes},
             </if>
             </if>
+            <if test="normalRemind != null">
+                normal_remind_ = #{normalRemind},
+            </if>
             update_time_ = NOW()
             update_time_ = NOW()
         </set>
         </set>
         WHERE id_ = #{id}
         WHERE id_ = #{id}
@@ -165,6 +170,9 @@
 	            <if test="item.currentClassTimes != null">
 	            <if test="item.currentClassTimes != null">
 	                current_class_times_ = #{item.currentClassTimes},
 	                current_class_times_ = #{item.currentClassTimes},
 	            </if>
 	            </if>
+                <if test="item.normalRemind != null">
+                    normal_remind_ = #{item.normalRemind},
+                </if>
                 update_time_=NOW()
                 update_time_=NOW()
         	</set>
         	</set>
 	        where id_ = #{item.id}
 	        where id_ = #{item.id}

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

@@ -671,6 +671,9 @@
             #{studentId}
             #{studentId}
         </foreach>
         </foreach>
     </select>
     </select>
+    <select id="getNoTeacherOrNoSubjectStudent" resultMap="Student">
+        SELECT * FROM student WHERE teacher_id_ IS NULL OR subject_id_list_ IS NULL;
+    </select>
 
 
     <update id="updateGrade"><![CDATA[
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         UPDATE student SET current_grade_num_=current_grade_num_+1

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

@@ -497,6 +497,9 @@
         <result column="routeMerNo" property="routeMerNo"/>
         <result column="routeMerNo" property="routeMerNo"/>
         <result column="routeAmount" property="routeAmount"/>
         <result column="routeAmount" property="routeAmount"/>
         <result column="routeBalance" property="routeBalance"/>
         <result column="routeBalance" property="routeBalance"/>
+        <result column="sale_amount_" property="saleAmount"/>
+        <result column="service_amount_" property="serviceAmount"/>
+        <result column="routeBalance" property="routeBalance"/>
         <result column="feeFlag" property="feeFlag"/>
         <result column="feeFlag" property="feeFlag"/>
         <collection property="orderDetailList" ofType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail">
         <collection property="orderDetailList" ofType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail">
             <result column="detail_id_" property="id"/>
             <result column="detail_id_" property="id"/>

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

@@ -256,7 +256,7 @@
                 AND sci.charge_type_ = #{chargeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
                 AND sci.charge_type_ = #{chargeType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
             </if>
             </if>
             <if test="noneTqType != null">
             <if test="noneTqType != null">
-                AND spo.mer_nos_ != '淘器微信'
+                AND (spo.mer_nos_ IS NULL OR spo.mer_nos_ != '淘器微信')
             </if>
             </if>
         </where>
         </where>
     </sql>
     </sql>
@@ -285,7 +285,7 @@
         SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
         SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
         detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
         detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
         sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name,spro.route_amount_
         sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name,spro.route_amount_
-        routeAmount,spro.route_balance_amount_ routeBalance,
+        routeAmount,spro.route_balance_amount_ routeBalance,spro.sale_amount_,spro.service_amount_,
         spro.mer_no_ routeMerNo,spro.fee_flag_ feeFlag
         spro.mer_no_ routeMerNo,spro.fee_flag_ feeFlag
         FROM student_payment_order spo
         FROM student_payment_order spo
         LEFT JOIN student_payment_route_order spro ON spro.order_no_ = spo.order_no_
         LEFT JOIN student_payment_route_order spro ON spro.order_no_ = spo.order_no_
@@ -352,7 +352,7 @@
                 </if>
                 </if>
             </if>
             </if>
             <if test="noneTqType != null">
             <if test="noneTqType != null">
-                and spro.mer_no_ != '淘器微信'
+                and (spro.mer_no_ IS NULL OR spro.mer_no_ != '淘器微信')
             </if>
             </if>
         </where>
         </where>
 		order by spro.id_ desc
 		order by spro.id_ desc
@@ -383,7 +383,7 @@
         		</if>
         		</if>
         	</if>
         	</if>
             <if test="noneTqType != null">
             <if test="noneTqType != null">
-                and spro.mer_no_ != '淘器微信'
+                and (spro.mer_no_ IS NULL OR spro.mer_no_ != '淘器微信')
             </if>
             </if>
         </where>
         </where>
 		order by spro.id_ desc
 		order by spro.id_ desc

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

@@ -923,4 +923,25 @@
             LEFT JOIN sys_user stu ON stu.id_ = sr.user_id_
             LEFT JOIN sys_user stu ON stu.id_ = sr.user_id_
         <include refid="queryNoClassMusicStudentsCondition" />
         <include refid="queryNoClassMusicStudentsCondition" />
     </select>
     </select>
+
+    <select id="getStudentClassInfo" resultType="com.ym.mec.biz.dal.dto.StudentClassInfoDto">
+        SELECT
+               sr.user_id_ studentId,
+               sr.music_group_id_ musicGroupId,
+               sr.actual_subject_id_ subjectId,
+               cgsm.class_group_id_ classGroupId,
+               cgtm.user_id_ mainTeacherId
+        FROM student_registration sr
+             LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+             LEFT JOIN class_group_student_mapper cgsm ON cgsm.group_type_='MUSIC' AND cgsm.music_group_id_=sr.music_group_id_ AND cgsm.user_id_=sr.user_id_
+             LEFT JOIN class_group cg ON cgsm.class_group_id_=cg.id_
+             LEFT JOIN class_group_teacher_mapper cgtm ON cgsm.class_group_id_=cgtm.class_group_id_ AND cgtm.teacher_role_='BISHOP'
+        WHERE sr.music_group_status_='NORMAL' AND mg.status_='PROGRESS' AND cgsm.status_='NORMAL' AND cg.type_='NORMAL' AND cg.del_flag_=0 AND cg.lock_flag_=0
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND sr.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+    </select>
 </mapper>
 </mapper>

+ 5 - 0
mec-biz/src/main/resources/config/mybatis/SysUserContractsMapper.xml

@@ -107,4 +107,9 @@
 				#{userId}
 				#{userId}
 			</foreach>
 			</foreach>
 	</select>
 	</select>
+	<select id="countUserValidContact" resultType="int">
+		SELECT COUNT(id_) FROM sys_user_contracts WHERE user_id_=#{userId} AND version_ IN (2,3)
+	</select>
+
+
 </mapper>
 </mapper>

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -173,4 +173,8 @@ public interface TaskRemoteService {
 	//乐保历史数据处理
 	//乐保历史数据处理
 	@GetMapping("task/maintenanceOldDateAdd")
 	@GetMapping("task/maintenanceOldDateAdd")
 	void maintenanceOldDateAdd();
 	void maintenanceOldDateAdd();
+
+	//更新学员指导老师和声部信息
+	@GetMapping("task/updateStudentTeacherAndSubject")
+	void updateStudentTeacherAndSubject();
 }
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -215,4 +215,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
     public void maintenanceOldDateAdd() {
     public void maintenanceOldDateAdd() {
 		logger.info("乐保历史数据处理失败");
 		logger.info("乐保历史数据处理失败");
     }
     }
+
+	@Override
+	public void updateStudentTeacherAndSubject() {
+		logger.error("更新学员指导老师和声部信息失败");
+	}
 }
 }

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

@@ -437,8 +437,6 @@ public class RoomServiceImpl implements RoomService {
     @Override
     @Override
     public void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
     public void leaveRoomSuccess(String roomId,String userId,String deviceNum) throws Exception {
         log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={}", roomId,userId,deviceNum);
         log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={}", roomId,userId,deviceNum);
-//        RoomMember roomMember = roomMemberDao.findByRidAndUid(roomId, userId);
-
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
         RoleEnum roleEnum;
         RoleEnum roleEnum;
         int parseInt = Integer.parseInt(userId);
         int parseInt = Integer.parseInt(userId);
@@ -453,6 +451,7 @@ public class RoomServiceImpl implements RoomService {
 
 
         String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
         String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
         Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 2, TimeUnit.SECONDS);
         Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 2, TimeUnit.SECONDS);
+        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={},aBoolean={}", roomId,userId,deviceNum,aBoolean);
         if(!aBoolean){
         if(!aBoolean){
             if (StringUtils.isNotEmpty(deviceNum)){
             if (StringUtils.isNotEmpty(deviceNum)){
                 //如果设备号不为空,更新设备号
                 //如果设备号不为空,更新设备号

+ 50 - 2
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -1,13 +1,18 @@
 package com.ym.mec.student.controller;
 package com.ym.mec.student.controller;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
+import com.ym.mec.biz.dal.entity.SysUserContracts;
+import com.ym.mec.biz.service.SysUserContractsService;
+import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
@@ -29,6 +34,9 @@ public class ContractsController extends BaseController {
 	@Autowired
 	@Autowired
 	private ContractService contractService;
 	private ContractService contractService;
 
 
+	@Autowired
+	private SysUserContractsService sysUserContractsService;
+
 	@ApiOperation("查询注册协议")
 	@ApiOperation("查询注册协议")
 	@GetMapping(value = "queryRegisterContract")
 	@GetMapping(value = "queryRegisterContract")
 	public Object queryRegisterContract() {
 	public Object queryRegisterContract() {
@@ -91,4 +99,44 @@ public class ContractsController extends BaseController {
 		}
 		}
 		return succeed(contractService.queryProductContract(userId,musicGroupId));
 		return succeed(contractService.queryProductContract(userId,musicGroupId));
 	}
 	}
+
+	@ApiOperation(value = "生成学生课程协议")
+	@GetMapping("/transferProduceContractOnlyWithCourseList")
+	public HttpResponseResult transferProduceContractOnlyWithCourseList(Integer userId){
+		if(Objects.isNull(userId)){
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (sysUser == null) {
+				return failed("获取用户信息失败");
+			}
+			userId = sysUser.getId();
+		}
+		return contractService.transferProduceContractOnlyWithCourseList(userId);
+	}
+
+	@ApiOperation(value = "查询学生最新协议")
+	@GetMapping("/getLatest")
+	public HttpResponseResult<List<SysUserContracts>> getLatest(Integer userId) {
+		if(Objects.isNull(userId)){
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (sysUser == null) {
+				return failed("获取用户信息失败");
+			}
+			userId = sysUser.getId();
+		}
+		List<SysUserContracts> sysUserContracts = sysUserContractsService.getUserAllContracts(userId);
+
+		if(CollectionUtils.isEmpty(sysUserContracts)){
+			return succeed(Collections.EMPTY_LIST);
+		}
+
+		Map<Integer, List<SysUserContracts>> versionContractMap = sysUserContracts.stream().collect(Collectors.groupingBy(SysUserContracts::getVersion));
+
+		List<SysUserContracts> result = new ArrayList<>();
+		for (Map.Entry<Integer, List<SysUserContracts>> versionContractMapEntry : versionContractMap.entrySet()) {
+			versionContractMapEntry.getValue().sort(Comparator.comparing(SysUserContracts::getCreateTime).reversed());
+			result.add(versionContractMapEntry.getValue().get(0));
+		}
+
+		return succeed(result);
+	}
 }
 }

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/UpdateStudentTeacherAndSubjectTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UpdateStudentTeacherAndSubjectTask extends BaseTask {
+
+    @Autowired
+    private TaskRemoteService taskRemoteService;
+
+    @Override
+    public void execute() throws TaskException {
+        taskRemoteService.updateStudentTeacherAndSubject();
+    }
+}

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

@@ -45,8 +45,8 @@ public class ClassGroupController extends BaseController {
 
 
     @ApiOperation(value = "教师关联班级获取")
     @ApiOperation(value = "教师关联班级获取")
     @GetMapping("/findTeacherClassGroups")
     @GetMapping("/findTeacherClassGroups")
-    public Object findTeacherClassGroups(String type,String status){
-        return succeed(classGroupService.findTeacherClassGroups(type,status));
+    public Object findTeacherClassGroups(String type,String status, String groupName){
+        return succeed(classGroupService.findTeacherClassGroups(type,status,groupName));
     }
     }
 
 
     @ApiOperation(value = "获取教师班级详情界面头部信息")
     @ApiOperation(value = "获取教师班级详情界面头部信息")

+ 44 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java

@@ -2,22 +2,32 @@ package com.ym.mec.teacher.controller;
 
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 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.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
+import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherAttendanceQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 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.TeacherAttendanceService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.date.DateUtil;
 import com.yonge.log.model.AuditLogAnnotation;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 @RequestMapping("teacherAttendance")
 @RequestMapping("teacherAttendance")
 @Api(tags = "教师签到服务")
 @Api(tags = "教师签到服务")
@@ -31,9 +41,14 @@ public class TeacherAttendanceController extends BaseController {
     private StudentAttendanceService studentAttendanceService;
     private StudentAttendanceService studentAttendanceService;
 
 
     @Autowired
     @Autowired
+    private StudentAttendanceDao studentAttendanceDao;
+
+    @Autowired
     private ClassGroupService classGroupService;
     private ClassGroupService classGroupService;
     @Autowired
     @Autowired
     private SysUserFeignService sysUserFeignService;
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMessageService sysMessageService;
 
 
     @ApiOperation(value = "新增教师签到")
     @ApiOperation(value = "新增教师签到")
     @PostMapping("/add")
     @PostMapping("/add")
@@ -61,6 +76,34 @@ public class TeacherAttendanceController extends BaseController {
         return succeed(studentAttendanceService.addStudentAttendances(studentAttendanceInfo));
         return succeed(studentAttendanceService.addStudentAttendances(studentAttendanceInfo));
     }
     }
 
 
+    @ApiOperation(value = "学员到课提醒")
+    @PostMapping("/studentAttendanceNormalRemind")
+    public HttpResponseResult studentAttendanceNormalRemind(Long courseId){
+        int remindNum = studentAttendanceDao.countNormalRemindNum(courseId);
+        if(remindNum>0){
+            return succeed();
+        }
+        //获取正常签到的学生信息
+        List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseId(courseId);
+        if(CollectionUtils.isEmpty(studentAttendances)){
+            return succeed();
+        }
+
+        List<StudentAttendance> normal = studentAttendances.stream().filter(studentAttendance -> studentAttendance.getStatus() == StudentAttendanceStatusEnum.NORMAL).collect(Collectors.toList());
+        if (normal != null && normal.size() > 0) {
+            Map<Integer, String> receivers = new HashMap<>();
+            normal.forEach(e -> {
+                receivers.put(e.getUserId(), e.getUserId().toString());
+            });
+            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("还未有学生到课");
+        }
+        studentAttendanceDao.updateNormalRemind(courseId);
+        return succeed();
+    }
+
     @ApiOperation(value = "获取签退详情")
     @ApiOperation(value = "获取签退详情")
     @GetMapping("/getTeacherSignDetail")
     @GetMapping("/getTeacherSignDetail")
     public Object getTeacherSignDetail(Integer courseScheduleId){
     public Object getTeacherSignDetail(Integer courseScheduleId){

+ 10 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java

@@ -142,6 +142,11 @@ public class TeacherCourseScheduleController extends BaseController {
     @ApiOperation(value = "获取老师指定班级的排课")
     @ApiOperation(value = "获取老师指定班级的排课")
     @GetMapping("/queryTeacherClassCourseSchedule")
     @GetMapping("/queryTeacherClassCourseSchedule")
     public Object queryTeacherClassCourseSchedule(CourseScheduleQueryInfo queryInfo){
     public Object queryTeacherClassCourseSchedule(CourseScheduleQueryInfo queryInfo){
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(null==user){
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setUserId(user.getId().longValue());
         return succeed(scheduleService.queryTeacherClassCourseSchedule(queryInfo));
         return succeed(scheduleService.queryTeacherClassCourseSchedule(queryInfo));
     }
     }
 
 
@@ -149,6 +154,11 @@ public class TeacherCourseScheduleController extends BaseController {
     @GetMapping("/queryTeacherVipClassCourseSchedule")
     @GetMapping("/queryTeacherVipClassCourseSchedule")
     public Object queryTeacherVipClassCourseSchedule(CourseScheduleQueryInfo queryInfo){
     public Object queryTeacherVipClassCourseSchedule(CourseScheduleQueryInfo queryInfo){
         Map<String,Object> result = new HashMap<>();
         Map<String,Object> result = new HashMap<>();
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(null==user){
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setUserId(user.getId().longValue());
         result.put("rows",scheduleService.queryTeacherVipClassCourseSchedule(queryInfo));
         result.put("rows",scheduleService.queryTeacherVipClassCourseSchedule(queryInfo));
         result.put("appealHoursRange",4);
         result.put("appealHoursRange",4);
         return succeed(result);
         return succeed(result);

+ 9 - 1
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -427,7 +427,15 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/updateCoursesExpireDate")
     @PostMapping("/updateCoursesExpireDate")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/updateCoursesExpireDate')")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/updateCoursesExpireDate')")
     public Object updateCoursesExpireDate(String practiceGroupId, Date coursesStartDate,Date coursesExpireDate){
     public Object updateCoursesExpireDate(String practiceGroupId, Date coursesStartDate,Date coursesExpireDate){
-        courseScheduleService.updatePracticeGroupInDate(practiceGroupId, coursesStartDate,coursesExpireDate);
+        courseScheduleService.updatePracticeGroupInDate(practiceGroupId, coursesStartDate,coursesExpireDate, false);
+        return succeed();
+    }
+
+    @ApiOperation(value = "陪练课课程组有效期调整-仅进行中可调整")
+    @PostMapping("/updateCoursesExpireDateOnlyNormal")
+    @PreAuthorize("@pcs.hasPermissions('courseSchedule/updateCoursesExpireDateOnlyNormal')")
+    public Object updateCoursesExpireDateOnlyNormal(String practiceGroupId, Date coursesStartDate,Date coursesExpireDate){
+        courseScheduleService.updatePracticeGroupInDate(practiceGroupId, coursesStartDate,coursesExpireDate, true);
         return succeed();
         return succeed();
     }
     }
 
 

+ 61 - 403
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -6,6 +6,8 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.service.IdGeneratorService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 
 
@@ -23,13 +25,11 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -129,6 +129,12 @@ public class ExportController extends BaseController {
     private GoodsService goodsService;
     private GoodsService goodsService;
     @Autowired
     @Autowired
     private ClassGroupService classGroupService;
     private ClassGroupService classGroupService;
+    @Autowired
+    private ExportService exportService;
+    @Autowired
+    private ManagerDownloadDao managerDownloadDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
 
 
     @ApiOperation(value = "班级列表导出")
     @ApiOperation(value = "班级列表导出")
     @PostMapping("export/classGroup")
     @PostMapping("export/classGroup")
@@ -463,7 +469,7 @@ public class ExportController extends BaseController {
         List<TeacherSalaryComplaints> rows = teacherSalaryComplaintsService.queryPage(queryInfo).getRows();
         List<TeacherSalaryComplaints> rows = teacherSalaryComplaintsService.queryPage(queryInfo).getRows();
         OutputStream outputStream = response.getOutputStream();
         OutputStream outputStream = response.getOutputStream();
         try {
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "老师ID", "老师姓名", "课酬归属时间", "申提交时间", "状态",
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "老师ID", "老师姓名", "课酬归属时间", "申提交时间", "状态",
                     "申述处理者"}, new String[]{
                     "申述处理者"}, new String[]{
                     "organName", "teacherId", "realName", "salarySettlementMonth", "createTime", "statusEnum.msg",
                     "organName", "teacherId", "realName", "salarySettlementMonth", "createTime", "statusEnum.msg",
                     "operatorRealName"}, rows);
                     "operatorRealName"}, rows);
@@ -971,7 +977,7 @@ public class ExportController extends BaseController {
     @PostMapping("order/musicalListDetailExport")
     @PostMapping("order/musicalListDetailExport")
     @PreAuthorize("@pcs.hasPermissions('order/musicalListDetailExport')")
     @PreAuthorize("@pcs.hasPermissions('order/musicalListDetailExport')")
     public void musicalListDetailExport(HttpServletResponse response, String musicGroupId) throws IOException {
     public void musicalListDetailExport(HttpServletResponse response, String musicGroupId) throws IOException {
-        List<MusicalListDetailDto> musicalList = studentPaymentOrderDetailService.getMusicalListDetail(musicGroupId,null);
+        List<MusicalListDetailDto> musicalList = studentPaymentOrderDetailService.getMusicalListDetail(musicGroupId, null);
         if (musicalList.size() > 50000) {
         if (musicalList.size() > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
         }
@@ -1009,7 +1015,7 @@ public class ExportController extends BaseController {
         if (studentApplyDetail.size() <= 0) {
         if (studentApplyDetail.size() <= 0) {
             throw new BizException("没有可导出的记录");
             throw new BizException("没有可导出的记录");
         }
         }
-        List<MusicalListDetailDto> musicalListDetails = studentPaymentOrderDetailService.getMusicalListDetail(queryInfo.getMusicGroupId(),null);
+        List<MusicalListDetailDto> musicalListDetails = studentPaymentOrderDetailService.getMusicalListDetail(queryInfo.getMusicGroupId(), null);
         for (StudentApplyDetailDto studentApplyDetailDto : studentApplyDetail) {
         for (StudentApplyDetailDto studentApplyDetailDto : studentApplyDetail) {
             for (MusicalListDetailDto musicalListDetail : musicalListDetails) {
             for (MusicalListDetailDto musicalListDetail : musicalListDetails) {
                 if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) continue;
                 if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) continue;
@@ -1076,7 +1082,7 @@ public class ExportController extends BaseController {
     @ApiOperation(value = "订单列表导出")
     @ApiOperation(value = "订单列表导出")
     @RequestMapping("export/orderList")
     @RequestMapping("export/orderList")
     @PreAuthorize("@pcs.hasPermissions('export/orderList')")
     @PreAuthorize("@pcs.hasPermissions('export/orderList')")
-    public void orderList(StudentPaymentOrderQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+    public HttpResponseResult orderList(StudentPaymentOrderQueryInfo queryInfo) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         Employee employee = employeeDao.get(sysUser.getId());
         Employee employee = employeeDao.get(sysUser.getId());
         if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && "3".equals(queryInfo.getOrderType())) {
         if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && "3".equals(queryInfo.getOrderType())) {
@@ -1093,207 +1099,31 @@ public class ExportController extends BaseController {
             queryInfo.setUserIds(userIds);
             queryInfo.setUserIds(userIds);
         }
         }
         queryInfo.setPage(1);
         queryInfo.setPage(1);
-        queryInfo.setRows(49999);
+        queryInfo.setRows(50000);
         queryInfo.setIsExport(true);
         queryInfo.setIsExport(true);
-        Map<String, Object> params = new HashMap<String, Object>();
+        Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         MapUtil.populateMap(params, queryInfo);
-        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
-        if (studentPaymentOrderExportDtos.size() > 50000) {
-            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
-        }
-        OutputStream outputStream = response.getOutputStream();
-        long i = 1;
-        for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
-            if (row.getActualAmount() == null) {
-                row.setActualAmount(BigDecimal.ZERO);
-            }
-            if (row.getBalancePaymentAmount() == null) {
-                row.setBalancePaymentAmount(BigDecimal.ZERO);
-            }
-            if (row.getMemo() == null) {
-                row.setMemo("");
-            }
-            BigDecimal transferFee = BigDecimal.ZERO;
-            if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
-                FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
-                if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum()) {
-                    transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-                }
-                if (countFeeFlagNum.getTotalNum().equals(countFeeFlagNum.getYesNum())) {
-                    List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(row.getOrderNo());
-                    for (StudentPaymentRouteOrder routeOrder : routeOrders) {
-                        transferFee = transferFee.add(routeOrder.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP));
-                    }
-                }
-            }
-            row.setTransferFee(transferFee);
-
-            String goodsName = "";
-            if (row.getOrderDetailList() != null) {
-                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
-                    switch (orderDetail.getType()) {
-                        case COURSE:
-                        case CLASSROOM:
-                        case SINGLE:
-                        case MIX:
-                        case COMPREHENSIVE:
-                        case ENLIGHTENMENT:
-                        case TRAINING_SINGLE:
-                        case TRAINING_MIX:
-                        case MUSIC_NETWORK:
-                        case HIGH:
-                        case HIGH_ONLINE:
-                        case HIGH_ONLINE_COURSE:
-                            row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
-                            break;
-                        case MUSICAL:
-                            if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                                BigDecimal leaseFee = orderDetail.getPrice();
-                                if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
-                                }
-                                row.setLeaseFee(leaseFee);
-                            } else {
-                                row.setMusicalFee(orderDetail.getPrice());
-                            }
-                            break;
-                        case ACCESSORIES:
-                        case TEACHING:
-                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
-                            break;
-                        case OTHER:
-                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
-                        default:
-                            break;
-                    }
-                }
-            }
-            if (row.getGoodsList() != null) {
-                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
-            }
-            if (StringUtils.isNotBlank(goodsName)) {
-                row.setMemo(goodsName);
-            }
-            //专业
-            if (row.getGroupType().equals(GroupType.VIP)) {
-                row.setVipCourseFee(row.getActualAmount());
-                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
-                if (vipGroupInfo != null) {
-                    row.setSchoolName(vipGroupInfo.getSchoolName());
-                    row.setSubjectName(vipGroupInfo.getSubjectName());
-                }
-            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
-                //考级报名
-                if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                    String[] feeTypes = row.getMemo().split(";");
-                    List<String> feeTypeList = Arrays.asList(feeTypes);
-                    for (String feeTypeStr : feeTypeList) {
-                        int index = feeTypeStr.lastIndexOf(":");
-                        if (index < 0) {
-                            continue;
-                        }
-                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
-                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
-                        }
-                        if (feeTypeStr.contains("VIP")) {
-                            row.setVipCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("网管课")) {
-                            row.setPracticeCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("乐理课")) {
-                            row.setTheoryCourseFee(typeFee);
-                        }
-                    }
-                    row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
-                } else {
-                    if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
-                        row.setDegreeFee(row.getActualAmount());
-                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(row.getChargeType())) {
-                        row.setPracticeCourseFee(row.getActualAmount());
-                    } else {
-                        row.setOtherFee(row.getActualAmount());
-                    }
-                }
-                if (row.getChargeType() != null) {
-                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
-                        if (!chargeType.getCode().equals(row.getChargeType())) continue;
-                        row.setSporadicType(chargeType.getMsg());
-                    }
-                }
-            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
-                row.setPracticeCourseFee(row.getActualAmount());
-                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(row.getMusicGroupId()));
-                if (practiceGroup != null) {
-                    row.setSubjectName(practiceGroup.getSubjectName());
-                }
-            } else {
-                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
-                row.setMusicalFee(feeByType.getMusicalFee());
-                row.setTeachingFee(feeByType.getTeachingFee());
-                row.setRepairFee(feeByType.getRepairFee());
-                row.setOtherFee(feeByType.getOtherFee());
-                if (row.getGroupType().equals(GroupType.MUSIC)) {
-                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
-                    if (studentRegistration != null) {
-                        row.setSubjectName(studentRegistration.getSubjectName());
-                        row.setSchoolName(studentRegistration.getSchoolName());
-                        row.setCooperationOrganName(studentRegistration.getRemark());
-                    }
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()));
-                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
-                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
-                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()));
-                    row.setTransferFee(BigDecimal.ZERO);
-                }
-            }
-            //如果合作单位不存在取学员的第一个乐团的合作单位和教学点
-            if (row.getCooperationOrganName() == null) {
-                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
-                if (cooperationOrgan != null) {
-                    row.setCooperationOrganName(cooperationOrgan.getName());
-                }
-            }
-            if (row.getMusicGroupId() != null && row.getMusicGroupId().equals("null")) {
-                row.setMusicGroupId("");
-            }
-            String paymentChannel = "";
-            if (row.getPaymentChannel() == null) {
-            } else if (row.getPaymentChannel().equals("YQPAY")) {
-                paymentChannel = "双乾";
-            } else if (row.getPaymentChannel().equals("ADAPAY")) {
-                paymentChannel = "汇付";
-            } else if (row.getPaymentChannel().equals("BALANCE")) {
-                paymentChannel = "余额";
-            }
-            row.setPaymentChannel(paymentChannel);
-            row.setId(i);
-            i++;
-        }
-
-        try {
-            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "押金", "乐器", "教辅费用", "其它", "手续费", "到账时间",
-                    "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "备注"};
-            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "leaseFee", "musicalFee", "teachingFee", "otherFee", "transferFee", "payTime", "musicGroupId",
-                    "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
-            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            response.setContentType("application/octet-stream");
-            response.setHeader("Content-Disposition", "attachment;filename=lender-" + 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();
-                }
-            }
-        }
+        int count = studentPaymentOrderDao.queryCount(params);
+        if (count <= 0) {
+            return failed("没有可导出的数据");
+        }
+
+        if (count > 50000) {
+            return failed("数据集太大,不能导出.最大数据集不能超过50000");
+        }
+        Date nowDate = new Date();
+        String no = idGeneratorService.generatorId("download") + "";
+        String fileName = "orderList-" + no + "-" + DateUtil.getDate(nowDate) + ".xls";
+        ManagerDownload managerDownload = new ManagerDownload();
+        managerDownload.setType(ExportTypeEnum.ORDER);
+        managerDownload.setUserId(sysUser.getId());
+        managerDownload.setName(fileName);
+        managerDownload.setFileUrl("");
+        managerDownload.setCreateTime(nowDate);
+        managerDownload.setUpdateTime(nowDate);
+        managerDownloadDao.insert(managerDownload);
+        exportService.orderList(params, managerDownload);
+        return succeed(fileName+"导出申请已提交,请到【报表中心-下载列表查看】");
     }
     }
 
 
 
 
@@ -2187,11 +2017,12 @@ public class ExportController extends BaseController {
     @ApiOperation(value = "财务管理导出")
     @ApiOperation(value = "财务管理导出")
     @RequestMapping("export/routeOrderList")
     @RequestMapping("export/routeOrderList")
     @PreAuthorize("@pcs.hasPermissions('export/routeOrderList')")
     @PreAuthorize("@pcs.hasPermissions('export/routeOrderList')")
-    public void routeOrderList(StudentPaymentOrderQueryInfo queryInfo, HttpServletResponse response) throws IOException {
+    public HttpResponseResult routeOrderList(StudentPaymentOrderQueryInfo queryInfo) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         Employee employee = employeeDao.get(sysUser.getId());
         Employee employee = employeeDao.get(sysUser.getId());
         if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && queryInfo.getOrderType().equals("3")) {
         if (StringUtils.isEmpty(queryInfo.getRoutingOrganId()) && queryInfo.getOrderType().equals("3")) {
             queryInfo.setRoutingOrganId(employee.getOrganIdList());
             queryInfo.setRoutingOrganId(employee.getOrganIdList());
+            queryInfo.setOldOrganId(employee.getOrganIdList());
         } else if (StringUtils.isEmpty(queryInfo.getOrganId())) {
         } else if (StringUtils.isEmpty(queryInfo.getOrganId())) {
             queryInfo.setOrganId(employee.getOrganIdList());
             queryInfo.setOrganId(employee.getOrganIdList());
         }
         }
@@ -2204,208 +2035,35 @@ public class ExportController extends BaseController {
             queryInfo.setUserIds(userIds);
             queryInfo.setUserIds(userIds);
         }
         }
         queryInfo.setPage(1);
         queryInfo.setPage(1);
-        queryInfo.setRows(49999);
+        queryInfo.setRows(50000);
         queryInfo.setIsExport(true);
         queryInfo.setIsExport(true);
         queryInfo.setOrderType("3");
         queryInfo.setOrderType("3");
         Map<String, Object> params = new HashMap<String, Object>();
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
         MapUtil.populateMap(params, queryInfo);
-        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
-        if (studentPaymentOrderExportDtos.size() > 50000) {
-            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
-        }
-        OutputStream outputStream = response.getOutputStream();
-        long i = 1;
-        for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
-            if (row.getActualAmount() == null) {
-                row.setActualAmount(BigDecimal.ZERO);
-            }
-            if (row.getBalancePaymentAmount() == null) {
-                row.setBalancePaymentAmount(BigDecimal.ZERO);
-            }
-            if (row.getRouteAmount() == null) {
-                row.setRouteAmount(BigDecimal.ZERO);
-            }
-            if (row.getMemo() == null) {
-                row.setMemo("");
-            }
-            BigDecimal transferFee = BigDecimal.ZERO;
-            if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
-                FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
-                if (countFeeFlagNum.getTotalNum() > countFeeFlagNum.getYesNum() && row.getFeeFlag().equals("Y")) {
-                    transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-                }
-                if (countFeeFlagNum.getTotalNum().equals(countFeeFlagNum.getYesNum())) {
-                    transferFee = row.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-                }
-            }
-            row.setTransferFee(transferFee);
-
-            String goodsName = "";
-            if (row.getOrderDetailList() != null) {
-                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
-                    switch (orderDetail.getType()) {
-                        case COURSE:
-                        case CLASSROOM:
-                        case SINGLE:
-                        case MIX:
-                        case COMPREHENSIVE:
-                        case ENLIGHTENMENT:
-                        case TRAINING_SINGLE:
-                        case TRAINING_MIX:
-                        case MUSIC_NETWORK:
-                        case HIGH:
-                        case HIGH_ONLINE:
-                        case HIGH_ONLINE_COURSE:
-                            row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
-                            break;
-                        case MUSICAL:
-                            if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                                BigDecimal leaseFee = orderDetail.getPrice();
-                                if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
-                                }
-                                row.setLeaseFee(leaseFee);
-                            } else {
-                                row.setMusicalFee(orderDetail.getPrice());
-                            }
-                            break;
-                        case ACCESSORIES:
-                        case TEACHING:
-                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
-                            break;
-                        case OTHER:
-                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
-                        default:
-                            break;
-                    }
-                }
-            }
-            if (row.getGoodsList() != null) {
-                goodsName = row.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
-            }
-            if (StringUtils.isNotBlank(goodsName)) {
-                row.setMemo(goodsName);
-            }
-            //专业
-            if (row.getGroupType().equals(GroupType.VIP)) {
-                row.setVipCourseFee(row.getActualAmount());
-                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
-                if (vipGroupInfo != null) {
-                    row.setSchoolName(vipGroupInfo.getSchoolName());
-                    row.setSubjectName(vipGroupInfo.getSubjectName());
-                }
-            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
-                //考级报名
-                if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                    String[] feeTypes = row.getMemo().split(";");
-                    List<String> feeTypeList = Arrays.asList(feeTypes);
-                    for (String feeTypeStr : feeTypeList) {
-                        int index = feeTypeStr.lastIndexOf(":");
-                        if (index < 0) {
-                            continue;
-                        }
-                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
-                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
-                        }
-                        if (feeTypeStr.contains("VIP")) {
-                            row.setVipCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("网管课")) {
-                            row.setPracticeCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("乐理课")) {
-                            row.setTheoryCourseFee(typeFee);
-                        }
-                    }
-                    row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
-                } else {
-                    if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
-                        row.setDegreeFee(row.getActualAmount());
-                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(row.getChargeType())) {
-                        row.setPracticeCourseFee(row.getActualAmount());
-                    } else {
-                        row.setOtherFee(row.getActualAmount());
-                    }
-                }
-                if (row.getChargeType() != null) {
-                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
-                        if (!chargeType.getCode().equals(row.getChargeType())) continue;
-                        row.setSporadicType(chargeType.getMsg());
-                    }
-                }
-            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
-                row.setPracticeCourseFee(row.getActualAmount());
-                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(row.getMusicGroupId()));
-                if (practiceGroup != null) {
-                    row.setSubjectName(practiceGroup.getSubjectName());
-                }
-            } else {
-                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
-                row.setMusicalFee(feeByType.getMusicalFee());
-                row.setTeachingFee(feeByType.getTeachingFee());
-                row.setRepairFee(feeByType.getRepairFee());
-                row.setOtherFee(feeByType.getOtherFee());
-                if (row.getGroupType().equals(GroupType.MUSIC)) {
-                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
-                    if (studentRegistration != null) {
-                        row.setSubjectName(studentRegistration.getSubjectName());
-                        row.setSchoolName(studentRegistration.getSchoolName());
-                        row.setCooperationOrganName(studentRegistration.getRemark());
-                    }
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()));
-                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
-                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
-                } else if (row.getType().equals(OrderTypeEnum.OUTORDER)) {
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()));
-                    row.setTransferFee(BigDecimal.ZERO);
-                }
-            }
-            //如果合作单位不存在取学员的第一个乐团的合作单位和教学点
-            if (row.getCooperationOrganName() == null) {
-                CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(row.getUserId());
-                if (cooperationOrgan != null) {
-                    row.setCooperationOrganName(cooperationOrgan.getName());
-                }
-            }
-            if (row.getMusicGroupId() != null && row.getMusicGroupId().equals("null")) {
-                row.setMusicGroupId("");
-            }
-            String paymentChannel = "";
-            if (row.getPaymentChannel() == null) {
-            } else if (row.getPaymentChannel().equals("YQPAY")) {
-                paymentChannel = "双乾";
-            } else if (row.getPaymentChannel().equals("ADAPAY")) {
-                paymentChannel = "汇付";
-            } else if (row.getPaymentChannel().equals("BALANCE")) {
-                paymentChannel = "余额";
-            }
-            row.setPaymentChannel(paymentChannel);
-            row.setId(i);
-            i++;
-        }
 
 
-        try {
-            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "应付金额", "现金支付", "余额支付", "分润账户", "分润金额", "分润余额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "押金", "乐器", "教辅费用", "其它", "手续费", "到账时间",
-                    "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "备注"};
-            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance", "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "leaseFee", "musicalFee", "teachingFee", "otherFee", "transferFee", "payTime", "musicGroupId",
-                    "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "memo"};
-            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            response.setContentType("application/octet-stream");
-            response.setHeader("Content-Disposition", "attachment;filename=lender-" + 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();
-                }
-            }
-        }
+        int count = studentPaymentRouteOrderDao.queryCount(params);
+        if (count <= 0) {
+            return failed("没有可导出的数据");
+        }
+
+        if (count > 50000) {
+            return failed("数据集太大,不能导出.最大数据集不能超过50000");
+        }
+        queryInfo.setRoutingOrganId(null);
+
+        Date nowDate = new Date();
+        String no = idGeneratorService.generatorId("download") + "";
+        String fileName = "routeOrderList-" + no + "-" + DateUtil.getDate(nowDate) + ".xls";
+        ManagerDownload managerDownload = new ManagerDownload();
+        managerDownload.setType(ExportTypeEnum.ROUTE_ORDER);
+        managerDownload.setUserId(sysUser.getId());
+        managerDownload.setName(fileName);
+        managerDownload.setFileUrl("");
+        managerDownload.setCreateTime(nowDate);
+        managerDownload.setUpdateTime(nowDate);
+        managerDownloadDao.insert(managerDownload);
+        exportService.routeOrderList(params, managerDownload);
+        return succeed(fileName+"导出申请已提交,请到【报表中心-下载列表查看】");
     }
     }
 
 
 
 

+ 47 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ManagerDownloadController.java

@@ -0,0 +1,47 @@
+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.entity.Organization;
+import com.ym.mec.biz.dal.page.ManagerDownloadQueryInfo;
+import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
+import com.ym.mec.biz.service.ManagerDownloadService;
+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 io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("managerDownload")
+@Api(tags = "下载列表")
+@RestController
+public class ManagerDownloadController extends BaseController {
+
+    @Autowired
+    private ManagerDownloadService managerDownloadService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation(value = "分页查询列表")
+    @GetMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('managerDownload/queryPage')")
+    public Object queryPage(ManagerDownloadQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(managerDownloadService.queryPage(queryInfo));
+    }
+
+    @ApiOperation(value = "删除")
+    @PostMapping("/del/{id}")
+    @PreAuthorize("@pcs.hasPermissions('managerDownload/del')")
+    public Object del(@ApiParam(value = "下载记录id", required = true) @PathVariable("id") Integer id) {
+        return succeed(managerDownloadService.delete(id));
+    }
+
+}

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

@@ -360,4 +360,10 @@ public class TaskController extends BaseController {
 	public void maintenanceOldDateAdd(){
 	public void maintenanceOldDateAdd(){
 		studentInstrumentService.addOldStudentInstrument();
 		studentInstrumentService.addOldStudentInstrument();
 	}
 	}
+
+	//更新学员指导老师和声部信息
+	@GetMapping("/updateStudentTeacherAndSubject")
+	public void updateStudentTeacherAndSubject(){
+		studentService.updateStudentTeacherAndSubject();
+	}
 }
 }