Sfoglia il codice sorgente

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into feature/0427-school

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
	mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
	mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
	mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
	mec-biz/src/main/java/com/ym/mec/biz/service/SubjectService.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java
	mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
	mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
	mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
zouxuan 2 anni fa
parent
commit
5aa7ae9458
100 ha cambiato i file con 2383 aggiunte e 1296 eliminazioni
  1. 1 0
      .gitignore
  2. 0 1
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  3. 11 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  4. 5 0
      mec-biz/pom.xml
  5. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudCoachPaymentProgramDao.java
  6. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  7. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  10. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCloudCoachPaymentDetailsDao.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  12. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentMemberUpdateLogDao.java
  13. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  14. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
  15. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  16. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  17. 0 11
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportTeacherSalaryDto.java
  18. 14 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderResultDto.java
  19. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentImportDto.java
  20. 2 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OperatingTotalIncomeDto.java
  21. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentStandardDto.java
  22. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubjectDto.java
  23. 67 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TencentData.java
  24. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CloudCoachPaymentProgram.java
  25. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  26. 26 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  27. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SellOrder.java
  28. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseFeeDetail.java
  29. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentMemberUpdateLog.java
  30. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  31. 8 432
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  32. 47 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentTRTCCallbackCommand.java
  33. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java
  34. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/CloudCoachPaymentProgramQueryInfo.java
  35. 25 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupPaymentCalenderQueryInfo.java
  36. 8 56
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SellOrderQueryInfo.java
  37. 3 7
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudCoachPaymentProgramService.java
  38. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  39. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  40. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  41. 16 1
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  42. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentMemberUpdateLogService.java
  43. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  44. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  45. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  46. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  47. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentStatisticsService.java
  48. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SubjectService.java
  49. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  50. 1 3
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupActivityService.java
  51. 18 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  52. 43 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudCoachPaymentProgramServiceImpl.java
  53. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  54. 8 27
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  55. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  56. 40 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  57. 76 368
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  58. 9 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  59. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  60. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LessonExaminationServiceImpl.java
  61. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  62. 347 46
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  63. 31 187
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportNewServiceImpl.java
  64. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  65. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  66. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentLessonTrainingDetailServiceImpl.java
  67. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentMemberUpdateLogServiceImpl.java
  68. 99 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  69. 454 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  70. 84 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  71. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  72. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java
  73. 21 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java
  74. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  75. 42 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupActivityServiceImpl.java
  76. 16 3
      mec-biz/src/main/resources/config/mybatis/CloudCoachPaymentProgramMapper.xml
  77. 24 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  78. 9 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  79. 2 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  80. 20 26
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  81. 26 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  82. 3 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  83. 3 3
      mec-biz/src/main/resources/config/mybatis/OperatingReportNewMapper.xml
  84. 12 5
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  85. 9 0
      mec-biz/src/main/resources/config/mybatis/StudentCloudCoachPaymentDetailsMapper.xml
  86. 26 18
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  87. 9 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  88. 4 0
      mec-biz/src/main/resources/config/mybatis/StudentMemberUpdateLogMapper.xml
  89. 7 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  90. 87 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  91. 13 0
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  92. 8 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  93. 6 0
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  94. 3 1
      mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java
  95. 45 3
      mec-gateway/mec-gateway-web/src/main/java/com/ym/mec/gateway/web/filter/AuthFilter.java
  96. 1 1
      mec-im/src/main/java/com/ym/SealClassConfiguration.java
  97. 1 1
      mec-im/src/main/java/com/ym/config/ResourceServerConfig.java
  98. 61 5
      mec-im/src/main/java/com/ym/controller/RoomController.java
  99. 19 0
      mec-im/src/main/java/com/ym/dao/RoomMemberDao.java
  100. 18 7
      mec-im/src/main/java/com/ym/enums/DeviceTypeEnum.java

+ 1 - 0
.gitignore

@@ -1,4 +1,5 @@
 *.class
+*.log
 .metadata
 /target/
 *.classpath

+ 0 - 1
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -1038,4 +1038,3 @@ public class UserChannelContext {
 	}
 	
 }
-

+ 11 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java

@@ -161,6 +161,9 @@ public class SysUser extends BaseEntity implements Serializable{
 
 	private String subjectId;
 
+	@ApiModelProperty(value = "密码重置标识")
+	private Boolean resetFlag;
+
 	public String getSubjectId() {
 		return subjectId;
 	}
@@ -519,4 +522,12 @@ public class SysUser extends BaseEntity implements Serializable{
 	public void setOrganIdList(String organIdList) {
 		this.organIdList = organIdList;
 	}
+
+	public Boolean getResetFlag() {
+		return resetFlag;
+	}
+
+	public void setResetFlag(Boolean resetFlag) {
+		this.resetFlag = resetFlag;
+	}
 }

+ 5 - 0
mec-biz/pom.xml

@@ -62,6 +62,11 @@
 			<artifactId>microsvc-common-response</artifactId>
 			<version>1.0.0</version>
 		</dependency>
+		<dependency>
+			<groupId>com.microsvc.toolkit.middleware</groupId>
+			<artifactId>microsvc-middleware-rtc</artifactId>
+			<version>1.0.0</version>
+		</dependency>
 
 		<!--修复依赖冲突-->
 		<dependency>

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudCoachPaymentProgramDao.java

@@ -3,8 +3,13 @@ package com.ym.mec.biz.dal.dao;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.CloudCoachPaymentProgram;
 
+import java.util.List;
+import java.util.Map;
+
 public interface CloudCoachPaymentProgramDao extends BaseDAO<Long, CloudCoachPaymentProgram> {
 
 
     CloudCoachPaymentProgram getLock(Long id);
+
+    List<Map<String,String>> queryUser(Map<String, Object> params);
 }

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

@@ -1996,6 +1996,20 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     int countTeacherServeHomeworkDetailV2(@Param("param") Map<String, Object> params, @Param("courseIds") List<Long> courseIds);
 
+    /**
+     * 网络课服务提供方
+     * @param courseScheduleId 课程ID
+     * @param serviceProvider 服务提供方
+     */
+    void updateServiceProvider(@Param("courseScheduleId") Long courseScheduleId, @Param("serviceProvider") String serviceProvider);
+
+    /**
+     * 更新全员静音状态
+     * @param courseScheduleId 课程ID
+     * @param muteAll 全员静音状态
+     */
+    void updateGroupMuteAllStatus(@Param("courseScheduleId") Long courseScheduleId, @Param("muteAll") Boolean muteAll);
+
     void updateTeachingPointByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("teachingPoint") String teachingPoint);
 
     List<DailySummaryOfClassesForTheCurrentSemesterWrapper.SummaryOfCurrentSemesterCoursesDto> getSummaryOfCurrentSemesterCourses(@Param("musicGroupIds") List<String> musicGroupIds,

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

@@ -617,4 +617,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<StudentOrganDto> queryRemainCourseStudent(@Param("organIds") List<Integer> organIds);
+
+    List<Map> statCourseFee(@Param("cutFirstDayOfMonth") String cutFirstDayOfMonth, @Param("cutLastDayOfMonth") String cutLastDayOfMonth);
 }

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

@@ -329,4 +329,6 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
     List<Map<Long, Integer>> findCooperationByIds(@Param("calenderIds") List<Long> calenderIds);
 
     void updatePaymentNum(@Param("calenderId") Long calenderId, @Param("actualNum") Integer actualNum, @Param("expectNum") Integer expectNum);
+
+    List<Map<String,String>> queryUser(Map<String, Object> params);
 }

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

@@ -71,4 +71,6 @@ public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
     List<MusicGroupQuitPageDto> queryPageBySchool(Map<String, Object> params);
 
     Boolean countRedPointBySchool(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    void finish(@Param("musicGroupId") String musicGroupId);
 }

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

@@ -5,6 +5,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 public interface StudentCloudCoachPaymentDetailsDao extends BaseDAO<Long, StudentCloudCoachPaymentDetails> {
 
@@ -25,4 +26,6 @@ public interface StudentCloudCoachPaymentDetailsDao extends BaseDAO<Long, Studen
     void updatePaymentStatus(Long cloudCoachPaymentProgramId);
 
     List<Integer> findUserByProgramId(Long programId);
+
+    List<Map> queryStudentName(@Param("programIds") List<Long> programIds);
 }

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

@@ -372,4 +372,6 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      *
      */
     List<StudentWrapper.StudentHomework> getStudentHomework(@Param("param") StudentWrapper.StudentAttendanceQuery studentAttendanceQuery);
+
+    List<String> queryExistStuByPhone(@Param("phones") List<String> phones);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentMemberUpdateLogDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.StudentMemberUpdateLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 学员云教练时长修改记录(StudentMemberUpdateLog)表数据库访问层
+ *
+ * @author zx
+ * @since 2023-05-17 11:13:43
+ */
+public interface StudentMemberUpdateLogDao extends BaseMapper<StudentMemberUpdateLog> {
+
+   int insertBatch(@Param("entities") List<StudentMemberUpdateLog> entities);
+   
+}
+

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

@@ -759,4 +759,6 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     List<Map<Integer, String>> queryStudentEduMap(Integer userId);
 
     void updateCourseFee(@Param("id") Long id, @Param("musicalFee") BigDecimal musicalFee);
+
+    void batchUpdate(@Param("studentRegistrations") List<StudentRegistration> studentRegistrations);
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ConditionDto;
 import com.ym.mec.biz.dal.dto.StudentAttendanceViewDto;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
 import com.ym.mec.biz.dal.dto.SubjectApplyDetailDto;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.Subject;
@@ -13,6 +14,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface SubjectDao extends BaseDAO<Integer, Subject> {
 
@@ -168,4 +170,7 @@ public interface SubjectDao extends BaseDAO<Integer, Subject> {
     List<Subject> list();
 
     List<Subject> getSubjectListByIdAndCoopId(@Param("musicGroupId") String musicGroupId, @Param("coopId") Integer coopId);
+
+    List<StudentSubjectDto> getSubjectByStudentId(@Param("studentIds") Set<Long> studentIds);
+
 }

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

@@ -535,4 +535,13 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     * @date 2022/7/15 15:43
     */
     List<BaseMapDto<Integer, String>> queryOrganList(@Param("userId") Integer userId);
+
+    /**
+    * @description: 根据手机号获取用户列表
+     * @param phones
+    * @return java.util.List<com.ym.mec.auth.api.entity.SysUser>
+    * @author zx
+    * @date 2023/5/8 11:59
+    */
+    List<BasicUserDto> queryUserByPhones(@Param("phones") List<String> phones);
 }

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

@@ -369,4 +369,11 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
 
     int countStudentUseingActivityNum(@Param("vipGroupActivityId") Integer vipGroupActivityId,
                                     @Param("studentId") Integer studentId);
+
+    /**
+     * 获取课程人数
+     * @param groupId 课程类型ID
+     * @return int
+     */
+    int getCourseStudentNumsByGroupId(@Param("groupId") Long groupId);
 }

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

@@ -116,17 +116,6 @@ public class ExportTeacherSalaryDto{
     @ApiModelProperty(value = "课程收入")
     private BigDecimal courseIncome;
 
-    @ApiModelProperty(value = "云教练转结")
-    private BigDecimal cloudReverse;
-
-    public BigDecimal getCloudReverse() {
-        return cloudReverse;
-    }
-
-    public void setCloudReverse(BigDecimal cloudReverse) {
-        this.cloudReverse = cloudReverse;
-    }
-
     public BigDecimal getCourseIncome() {
         return courseIncome;
     }

+ 14 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderResultDto.java

@@ -21,7 +21,20 @@ public class MusicGroupPaymentCalenderResultDto extends MusicGroupPaymentCalende
 
 	private String operatorName;
 
-	@Override
+
+    @ApiModelProperty(value = "审核人", required = false)
+    private String auditName;
+
+
+    public String getAuditName() {
+        return auditName;
+    }
+
+    public void setAuditName(String auditName) {
+        this.auditName = auditName;
+    }
+
+    @Override
 	public Integer getOrganId() {
 		return organId;
 	}

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

@@ -0,0 +1,42 @@
+package com.ym.mec.biz.dal.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MusicGroupPaymentImportDto {
+
+    @ApiModelProperty(value = "缴费批次")
+    private String batchNo;
+
+    @ApiModelProperty(value = "学员编号")
+    private Integer userId;
+
+    @ApiModelProperty(value = "交易流水号")
+    private String transNo;
+
+    @ApiModelProperty(value = "收款账户")
+    private String merNos;
+
+    @ApiModelProperty(value = "交易时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "学员姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "学员性别")
+    private String gender;
+
+    @ApiModelProperty(value = "学员手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "声部")
+    private String subjectName;
+
+    @ApiModelProperty(value = "年级")
+    private String grade;
+}
+

+ 2 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OperatingTotalIncomeDto.java

@@ -9,12 +9,11 @@ public class OperatingTotalIncomeDto {
     // 城市
     private String organName;
 
+    private Integer organId;
+
     // 学生指导费课耗收入
     private BigDecimal studentGuidanceIncome = BigDecimal.ZERO;
 
-    // 云教练团课耗收入
-//    private BigDecimal cloudCoachGroupClassIncome;
-
     // 学校课程采买课耗收入
     private BigDecimal coursePurchaseIncome = BigDecimal.ZERO;
 

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

@@ -19,6 +19,8 @@ public class StudentStandardDto {
 
     private String subjectName;
 
+    private Integer subjectId;
+
     private Integer qualifiedFlag = 1;
 
     private String classDate;
@@ -28,6 +30,15 @@ public class StudentStandardDto {
     @ApiModelProperty(value = "学员维修标识",required = false)
     private Boolean repairFlag = false;
 
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
     public Boolean getRepairFlag() {
         return repairFlag;
     }

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubjectDto.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentSubjectDto {
+
+
+    private Integer subjectId;
+
+    private String subjectName;
+
+    private Integer studentId;
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+}

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TencentData.java

@@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ym.mec.biz.dal.enums.ETencentGroupType;
 import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
+import com.ym.mec.biz.dal.enums.ETencentTRTCCallbackCommand;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -16,6 +18,7 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 
@@ -25,6 +28,8 @@ import java.util.Locale;
  * @author liujunchi
  * @date 2023-03-06
  */
+@NoArgsConstructor
+@Data
 public class TencentData {
 
     // 群成员离开之后回调对象
@@ -451,4 +456,66 @@ public class TencentData {
         private Integer code;
     }
 
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("腾讯云回调事件")
+    public static class TRTCEventInfo implements Serializable {
+
+        @JsonProperty("EventGroupId")
+        @ApiModelProperty("事件组")
+        private Integer eventGroupId;
+
+        @JsonProperty("EventType")
+        @ApiModelProperty("事件类型")
+        private Integer eventType;
+
+        @JsonProperty("CallbackTs")
+        @ApiModelProperty("事件时间")
+        private Long callbackTs;
+
+        @JsonProperty("EventInfo")
+        @ApiModelProperty("事件消息")
+        private EventInfo eventInfo;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("事件消息")
+    public static class EventInfo implements Serializable {
+
+        @JsonProperty("RoomId")
+        @ApiModelProperty("房间号")
+        private String roomId;
+
+        @JsonProperty("EventTs")
+        @ApiModelProperty("事件发生时间")
+        private Long eventTs;
+
+        @JsonProperty("UserId")
+        @ApiModelProperty("事件发生用户")
+        private String userId;
+
+        @JsonProperty("Role")
+        @ApiModelProperty("用户角色")
+        private String role;
+
+        @JsonProperty("TerminalType")
+        @ApiModelProperty("终端类型")
+        private String terminalType;
+
+        @JsonProperty("UserType")
+        @ApiModelProperty("用户类型")
+        private String userType;
+
+        @JsonProperty("Reason")
+        @ApiModelProperty("原因")
+        private String reason;
+    }
 }

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

@@ -71,6 +71,8 @@ public class CloudCoachPaymentProgram extends BaseEntity {
 
 	private List<Integer> userIds;
 
+	private String userNames;
+
 	@ApiModelProperty(value = "审核备注", required = false)
 	private String memo;
 
@@ -86,6 +88,14 @@ public class CloudCoachPaymentProgram extends BaseEntity {
 	@ApiModelProperty(value = "审核时间", required = false)
 	private Date auditTime;
 
+	public String getUserNames() {
+		return userNames;
+	}
+
+	public void setUserNames(String userNames) {
+		this.userNames = userNames;
+	}
+
 	public Boolean getAutoActivationFlag() {
 		return autoActivationFlag;
 	}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -209,6 +209,11 @@ public class CourseSchedule  extends BaseEntity{
 	//当前课程是否是转换课
 	private Boolean convertFlag = false;
 
+	@ApiModelProperty("服务提供方")
+	private String serviceProvider;
+
+	@ApiModelProperty("全员静音")
+	private Boolean muteAll;
 
     @ApiModelProperty("教学点")
     private String teachingPoint;
@@ -675,6 +680,21 @@ public class CourseSchedule  extends BaseEntity{
 		this.teacher = teacher;
 	}
 
+	public String getServiceProvider() {
+		return serviceProvider;
+	}
+
+	public void setServiceProvider(String serviceProvider) {
+		this.serviceProvider = serviceProvider;
+	}
+
+	public Boolean getMuteAll() {
+		return muteAll;
+	}
+
+	public void setMuteAll(Boolean muteAll) {
+		this.muteAll = muteAll;
+	}
 
 	public static CourseScheduleType getCourseScheduleTypeByCode(String code) {
 		CourseScheduleType type = null;

+ 26 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java

@@ -174,6 +174,14 @@ public class MusicGroupPaymentCalender extends BaseEntity {
 	@ApiModelProperty(value = "课程展现形式",required = false)
 	private CourseViewTypeEnum courseViewType;
 
+
+    @ApiModelProperty(value = "审核人", required = false)
+    private Integer audit;
+
+
+    @ApiModelProperty(value = "审核时间", required = false)
+    private Date auditTime;
+
 	//会员有效期(月)
 	//废弃字段
 	private Integer memberValidDate;
@@ -221,7 +229,24 @@ public class MusicGroupPaymentCalender extends BaseEntity {
 	@ApiModelProperty(value = "缴费项目名称", required = false)
 	private String name;
 
-	public String getName() {
+
+    public Integer getAudit() {
+        return audit;
+    }
+
+    public void setAudit(Integer audit) {
+        this.audit = audit;
+    }
+
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+
+    public String getName() {
 		return name;
 	}
 

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SellOrder.java

@@ -132,5 +132,8 @@ public class SellOrder{
     @ApiModelProperty(value="订单金额")
     private BigDecimal orderAmount = BigDecimal.ZERO;
 
+    @ApiModelProperty(value="发货时间")
+    private String deliveryTime;
+
     private Integer tenantId = TenantContextHolder.getTenantId();
 }

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentCourseFeeDetail.java

@@ -1,8 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
-import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
-
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentMemberUpdateLog.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 学员云教练时长修改记录(StudentMemberUpdateLog)表实体类
+ *
+ * @author zx
+ * @since 2023-05-17 11:13:43
+ */
+@ApiModel(value = "student_member_update_log-学员云教练时长修改记录")
+@Data
+public class StudentMemberUpdateLog implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("student_id_")
+    @ApiModelProperty(value = "学员编号")
+    private Integer studentId;
+
+    @TableField("operator_id_")
+    @ApiModelProperty(value = "操作人")
+    private Integer operatorId;
+
+    @TableField("old_start_time_")
+    @ApiModelProperty(value = "原会员开始时间")
+    private Date oldStartTime;
+
+    @TableField("old_end_time_")
+    @ApiModelProperty(value = "原会员截止时间")
+    private Date oldEndTime;
+
+    @TableField("new_start_time_")
+    @ApiModelProperty(value = "修改后的开始时间")
+    private Date newStartTime;
+
+    @TableField("new_end_time_")
+    @ApiModelProperty(value = "修改后的截止时间")
+    private Date newEndTime;
+
+    @TableField("create_time_")
+    private Date createTime;
+
+    @TableField("memo_")
+    private String memo;
+}
+

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

@@ -112,7 +112,7 @@ public class StudentRegistration extends BaseEntity {
     @ApiModelProperty(value = "是否是插班生0不是,1是", required = true)
     private int transferStudent;
 
-    private BigDecimal surplusCourseFee;
+    private BigDecimal surplusCourseFee = BigDecimal.ZERO;
 
     private BigDecimal expectSurplusCourseFee;
 

+ 8 - 432
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java

@@ -3,7 +3,9 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.common.entity.BaseEntity;
 
+import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -14,7 +16,8 @@ import static com.ym.mec.biz.dal.enums.PeriodEnum.MONTH;
 /**
  * 对应数据库表(vip_group_activity):
  */
-public class VipGroupActivity extends BaseEntity {
+@Data
+public class VipGroupActivity{
 
 	@ApiModelProperty(value = "活动编号")
 	private Integer id;
@@ -49,6 +52,9 @@ public class VipGroupActivity extends BaseEntity {
 	@ApiModelProperty(value = "适用分部")
 	private String organId;
 
+	@ApiModelProperty(value = "适用分部")
+	private String organName;
+
 	@ApiModelProperty(value = "可排课开始时间")
 	private java.util.Date coursesStartTime;
 
@@ -174,435 +180,5 @@ public class VipGroupActivity extends BaseEntity {
 	@ApiModelProperty(value = "单价")
 	private BigDecimal singlePrice;
 
-	public String getActivityTypeEnum() {
-		return activityTypeEnum;
-	}
-
-	public void setActivityTypeEnum(String activityTypeEnum) {
-		this.activityTypeEnum = activityTypeEnum;
-	}
-
-	public BigDecimal getSinglePrice() {
-		return singlePrice;
-	}
-
-	public void setSinglePrice(BigDecimal singlePrice) {
-		this.singlePrice = singlePrice;
-	}
-
-	public Integer getGiveCouponId() {
-		return giveCouponId;
-	}
-
-	public void setGiveCouponId(Integer giveCouponId) {
-		this.giveCouponId = giveCouponId;
-	}
-
-	public Integer getGiveCouponNum() {
-		return giveCouponNum;
-	}
-
-	public void setGiveCouponNum(Integer giveCouponNum) {
-		this.giveCouponNum = giveCouponNum;
-	}
-
-	public BigDecimal getOriginalPrice() {
-		return originalPrice;
-	}
-
-	public void setOriginalPrice(BigDecimal originalPrice) {
-		this.originalPrice = originalPrice;
-	}
-
-	public Integer getActivityChannel() {
-		return activityChannel;
-	}
-
-	public void setActivityChannel(Integer activityChannel) {
-		this.activityChannel = activityChannel;
-	}
-
-	public Integer getCode() {
-		return code;
-	}
-
-	public void setCode(Integer code) {
-		this.code = code;
-	}
-
-	public Integer getGivePrizeNum() {
-		return givePrizeNum;
-	}
-
-	public void setGivePrizeNum(Integer givePrizeNum) {
-		this.givePrizeNum = givePrizeNum;
-	}
-
-	public Integer getGiveAllowOnlineToOffline() {
-		return giveAllowOnlineToOffline;
-	}
-
-	public void setGiveAllowOnlineToOffline(Integer giveAllowOnlineToOffline) {
-		this.giveAllowOnlineToOffline = giveAllowOnlineToOffline;
-	}
-
-	public BigDecimal getMarketPrice() {
-		return marketPrice;
-	}
-
-	public void setMarketPrice(BigDecimal marketPrice) {
-		this.marketPrice = marketPrice;
-	}
-
-	public Integer getGiveCategoryNum() {
-		return giveCategoryNum;
-	}
-
-	public void setGiveCategoryNum(Integer giveCategoryNum) {
-		this.giveCategoryNum = giveCategoryNum;
-	}
-
-	public Integer getVipGroupCategoryNum() {
-		return vipGroupCategoryNum;
-	}
-
-	public void setVipGroupCategoryNum(Integer vipGroupCategoryNum) {
-		this.vipGroupCategoryNum = vipGroupCategoryNum;
-	}
-
-	public String getGiveCategoryName() {
-		return giveCategoryName;
-	}
-
-	public void setGiveCategoryName(String giveCategoryName) {
-		this.giveCategoryName = giveCategoryName;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	public Integer getId() {
-		return id;
-	}
-
-	public void setId(Integer id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public Integer getActivityType() {
-		return activityType;
-	}
-
-	public void setActivityType(Integer activityType) {
-		this.activityType = activityType;
-	}
-
-	public Integer getSingleCourseTime() {
-		return singleCourseTime;
-	}
-
-	public void setSingleCourseTime(Integer singleCourseTime) {
-		this.singleCourseTime = singleCourseTime;
-	}
-
-	public Integer getGiveSingleCourseTime() {
-		return giveSingleCourseTime;
-	}
-
-	public void setGiveSingleCourseTime(Integer giveSingleCourseTime) {
-		this.giveSingleCourseTime = giveSingleCourseTime;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getVipGroupCategoryIdList() {
-		return vipGroupCategoryIdList;
-	}
-
-	public void setVipGroupCategoryIdList(String vipGroupCategoryIdList) {
-		this.vipGroupCategoryIdList = vipGroupCategoryIdList;
-	}
-
-	public Date getStartTime() {
-		return startTime;
-	}
-
-	public void setStartTime(Date startTime) {
-		this.startTime = startTime;
-	}
-
-	public Date getEndTime() {
-		return endTime;
-	}
-
-	public void setEndTime(Date endTime) {
-		this.endTime = endTime;
-	}
-
-	public String getOrganId() {
-		return organId;
-	}
-
-	public void setOrganId(String organId) {
-		this.organId = organId;
-	}
-
-	public Date getCoursesStartTime() {
-		return coursesStartTime;
-	}
-
-	public void setCoursesStartTime(Date coursesStartTime) {
-		this.coursesStartTime = coursesStartTime;
-	}
-
-	public Date getCoursesEndTime() {
-		return coursesEndTime;
-	}
-
-	public void setCoursesEndTime(Date coursesEndTime) {
-		this.coursesEndTime = coursesEndTime;
-	}
-
-	public BigDecimal getDiscount() {
-		return discount;
-	}
-
-	public void setDiscount(BigDecimal discount) {
-		this.discount = discount;
-	}
-
-	public Integer getFullMinusCourseTimes() {
-		return fullMinusCourseTimes;
-	}
-
-	public void setFullMinusCourseTimes(Integer fullMinusCourseTimes) {
-		this.fullMinusCourseTimes = fullMinusCourseTimes;
-	}
-
-	public String getGiveCourseType() {
-		return giveCourseType;
-	}
-
-	public void setGiveCourseType(String giveCourseType) {
-		this.giveCourseType = giveCourseType;
-	}
-
-	public String getCourseType() {
-		return courseType;
-	}
-
-	public void setCourseType(String courseType) {
-		this.courseType = courseType;
-	}
-
-	public String getGiveCategoryId() {
-		return giveCategoryId;
-	}
-
-	public void setGiveCategoryId(String giveCategoryId) {
-		this.giveCategoryId = giveCategoryId;
-	}
-
-	public Integer getGiveCourseNum() {
-		return giveCourseNum;
-	}
-
-	public void setGiveCourseNum(Integer giveCourseNum) {
-		this.giveCourseNum = giveCourseNum;
-	}
-
-	public Integer getMemberRankId() {
-		return memberRankId;
-	}
-
-	public void setMemberRankId(Integer memberRankId) {
-		this.memberRankId = memberRankId;
-	}
-
-	public Integer getMemberTime() {
-		return memberTime;
-	}
-
-	public void setMemberTime(Integer memberTime) {
-		this.memberTime = memberTime;
-	}
-
-	public Integer getGiveMemberRankId() {
-		return giveMemberRankId;
-	}
-
-	public void setGiveMemberRankId(Integer giveMemberRankId) {
-		this.giveMemberRankId = giveMemberRankId;
-	}
-
-	public Integer getGiveMemberTime() {
-		return giveMemberTime;
-	}
-
-	public void setGiveMemberTime(Integer giveMemberTime) {
-		this.giveMemberTime = giveMemberTime;
-	}
-
-	public boolean isPayToBalance() {
-		return isPayToBalance;
-	}
-
-	public void setPayToBalance(boolean payToBalance) {
-		isPayToBalance = payToBalance;
-	}
-
-	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 String getSalarySettlementJson() {
-		return salarySettlementJson;
-	}
-
-	public void setSalarySettlementJson(String salarySettlementJson) {
-		this.salarySettlementJson = salarySettlementJson;
-	}
-
-	public String getVipGroupCategoryNames() {
-		return vipGroupCategoryNames;
-	}
-
-	public void setVipGroupCategoryNames(String vipGroupCategoryNames) {
-		this.vipGroupCategoryNames = vipGroupCategoryNames;
-	}
-
-	public Boolean getDelFlag() {
-		return delFlag;
-	}
-
-	public void setDelFlag(Boolean delFlag) {
-		this.delFlag = delFlag;
-	}
-
-	public Boolean getEnable() {
-		return enable;
-	}
-
-	public void setEnable(Boolean enable) {
-		this.enable = enable;
-	}
-
-	public Integer getOnlineClassJoinGradientRewards() {
-		return onlineClassJoinGradientRewards;
-	}
-
-	public void setOnlineClassJoinGradientRewards(Integer onlineClassJoinGradientRewards) {
-		this.onlineClassJoinGradientRewards = onlineClassJoinGradientRewards;
-	}
-
-	public Integer getOfflineClassJoinGradientRewards() {
-		return offlineClassJoinGradientRewards;
-	}
-
-	public void setOfflineClassJoinGradientRewards(Integer offlineClassJoinGradientRewards) {
-		this.offlineClassJoinGradientRewards = offlineClassJoinGradientRewards;
-	}
-
-	public Integer getMinCourseNum() {
-		return minCourseNum;
-	}
-
-	public void setMinCourseNum(Integer minCourseNum) {
-		this.minCourseNum = minCourseNum;
-	}
-
-	public Integer getMaxCourseNum() {
-		return maxCourseNum;
-	}
-
-	public void setMaxCourseNum(Integer maxCourseNum) {
-		this.maxCourseNum = maxCourseNum;
-	}
-
-	public Integer getStudentMaxUsedTimes() {
-		return studentMaxUsedTimes;
-	}
-
-	public void setStudentMaxUsedTimes(Integer studentMaxUsedTimes) {
-		this.studentMaxUsedTimes = studentMaxUsedTimes;
-	}
-
-	public String getApplyToStudentType() {
-		return applyToStudentType;
-	}
-
-	public void setApplyToStudentType(String applyToStudentType) {
-		this.applyToStudentType = applyToStudentType;
-	}
-
-	public Integer getAllowOnlineToOffline() {
-		return allowOnlineToOffline;
-	}
-
-	public void setAllowOnlineToOffline(Integer allowOnlineToOffline) {
-		this.allowOnlineToOffline = allowOnlineToOffline;
-	}
-
-	public Integer getTeachMode() {
-		return teachMode;
-	}
-
-	public void setTeachMode(Integer teachMode) {
-		this.teachMode = teachMode;
-	}
-
-	public Integer getGiveTeachMode() {
-		return giveTeachMode;
-	}
-
-	public void setGiveTeachMode(Integer giveTeachMode) {
-		this.giveTeachMode = giveTeachMode;
-	}
-
-	public PeriodEnum getPeriodEnum() {
-		return periodEnum;
-	}
-
-	public void setPeriodEnum(PeriodEnum periodEnum) {
-		this.periodEnum = periodEnum;
-	}
-
-	public PeriodEnum getGivePeriodEnum() {
-		return givePeriodEnum;
-	}
-
-	public void setGivePeriodEnum(PeriodEnum givePeriodEnum) {
-		this.givePeriodEnum = givePeriodEnum;
-	}
+	private Integer tenantId = TenantContextHolder.getTenantId();
 }

+ 47 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentTRTCCallbackCommand.java

@@ -0,0 +1,47 @@
+package com.ym.mec.biz.dal.enums;
+
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-02
+ */
+@Getter
+public enum ETencentTRTCCallbackCommand {
+
+    EVENT_TYPE_CREATE_ROOM("101", "创建房间"),
+    EVENT_TYPE_DISMISS_ROOM("102", "解散房间"),
+    EVENT_TYPE_ENTER_ROOM("103", "进入房间"),
+    EVENT_TYPE_EXIT_ROOM("104", "退出房间"),
+    EVENT_DEFAULT("-1", "默认无效事件"),
+    ;
+
+    private final String command;
+    private final String desc;
+
+    private final Integer code;
+
+    ETencentTRTCCallbackCommand(String command, String desc) {
+        this.command = command;
+        this.desc = desc;
+
+        // 枚举转换对象
+        this.code = Integer.parseInt(command);
+    }
+
+    /**
+     * 回调事件对象枚举
+     * @param eventType 事件类型
+     * @return ETencentTRTCCallbackCommand
+     */
+    public static ETencentTRTCCallbackCommand get(Integer eventType) {
+        for (ETencentTRTCCallbackCommand e : ETencentTRTCCallbackCommand.values()) {
+            if (e.getCode().equals(eventType)) {
+                return e;
+            }
+        }
+        return EVENT_DEFAULT;
+    }
+}

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

@@ -13,6 +13,7 @@ public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     LIVE_TEACHER_CARD("LIVE_TEACHER_CARD","直播临时活动上课老师名片导入模板"),
     LIVE_ROOM_PURVIEW_USER("LIVE_ROOM_PURVIEW_USER", "直播间用户观看权限表"),
     ADDITIONAL_IMPORT("ADDITIONAL_IMPORT", "经营报表额外的收支导入"),
+    MUSIC_GROUP_PAYMENT_IMPORT("MUSIC_GROUP_PAYMENT_IMPORT", "缴费项目外部订单导入"),
     ;
 
     private String code;

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

@@ -13,6 +13,16 @@ public class CloudCoachPaymentProgramQueryInfo extends QueryInfo {
 
     private String status;
 
+    private Integer audit;
+
+    public Integer getAudit() {
+        return audit;
+    }
+
+    public void setAudit(Integer audit) {
+        this.audit = audit;
+    }
+
     public String getOrganId() {
         return organId;
     }

+ 25 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupPaymentCalenderQueryInfo.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 public class MusicGroupPaymentCalenderQueryInfo extends QueryInfo {
 	
@@ -19,7 +20,30 @@ public class MusicGroupPaymentCalenderQueryInfo extends QueryInfo {
 	
 	private String batchNo;
 
-	public MusicGroupPaymentCalender.PaymentType getPaymentType() {
+
+    private Integer audit;
+
+
+    @ApiModelProperty(value = "乐团缴费MUSIC, 云教练CLOUD",required = true)
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getAudit() {
+        return audit;
+    }
+
+    public void setAudit(Integer audit) {
+        this.audit = audit;
+    }
+
+    public MusicGroupPaymentCalender.PaymentType getPaymentType() {
 		return paymentType;
 	}
 

+ 8 - 56
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SellOrderQueryInfo.java

@@ -3,9 +3,11 @@ package com.ym.mec.biz.dal.page;
 import com.ym.mec.biz.dal.enums.SellTypeEnum;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.util.Date;
 
+@Data
 public class SellOrderQueryInfo extends QueryInfo {
 
     private String organIdList;
@@ -25,62 +27,12 @@ public class SellOrderQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "结束时间",required = false)
     private Date endTime;
 
-    @ApiModelProperty(value = "用户名称或编号",required = false)
-    private String userName;
-
-    public String getOrganIdList() {
-        return organIdList;
-    }
-
-    public void setOrganIdList(String organIdList) {
-        this.organIdList = organIdList;
-    }
-
-    public String getGoodsName() {
-        return goodsName;
-    }
-
-    public void setGoodsName(String goodsName) {
-        this.goodsName = goodsName;
-    }
-
-    public SellTypeEnum getType() {
-        return type;
-    }
-
-    public void setType(SellTypeEnum type) {
-        this.type = type;
-    }
+    @ApiModelProperty(value = "发货开始时间(年月日)",required = false)
+    private String deliveryStartTime;
 
-    public Date getStartTime() {
-        return startTime;
-    }
+    @ApiModelProperty(value = "发货结束时间",required = false)
+    private String deliveryEndTime;
 
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    public Integer getCooperationOrganId() {
-        return cooperationOrganId;
-    }
-
-    public void setCooperationOrganId(Integer cooperationOrganId) {
-        this.cooperationOrganId = cooperationOrganId;
-    }
-
-	public String getUserName() {
-		return userName;
-	}
-
-	public void setUserName(String userName) {
-		this.userName = userName;
-	}
+    @ApiModelProperty(value = "用户名称或编号",required = false)
+    private String userName;
 }

+ 3 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/CloudCoachPaymentProgramService.java

@@ -1,18 +1,14 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.entity.CloudCoachPaymentProgram;
+import com.ym.mec.biz.dal.page.CloudCoachPaymentProgramQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.springframework.transaction.annotation.Transactional;
 
 public interface CloudCoachPaymentProgramService extends BaseService<Long, CloudCoachPaymentProgram> {
+    PageInfo<CloudCoachPaymentProgram> queryPage(CloudCoachPaymentProgramQueryInfo queryInfo);
 
-    /**
-    * @description: 新增云教练缴费项目
-     * @param cloudCoachPaymentProgram
-    * @return void
-    * @author zx
-    * @date 2022/1/14 15:52
-    */
     void add(CloudCoachPaymentProgram cloudCoachPaymentProgram);
 
     void auditPass(CloudCoachPaymentProgram cloudCoachPaymentProgram);

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
@@ -17,6 +18,8 @@ import java.util.Set;
 
 public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacherOrder> {
 
+    CloudTeacherOrderDao getDao();
+
     /**
      * 查询未激活用户
      */

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

@@ -44,6 +44,12 @@ public interface EmployeeService extends BaseService<Integer, Employee> {
     void updateEmployee(Employee employee);
 
     /**
+     * 修改员工角色
+     * @param employee Employee
+     */
+    void updateEmployeeRole(Employee employee);
+
+    /**
      * 是否有课程组关联的教务老师
      * @param employeeId
      * @return

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

@@ -10,6 +10,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.springframework.ui.ModelMap;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -208,4 +209,6 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	* @date 2022/3/17 11:16
 	*/
 	Map<Long, Integer>  findCooperationByIds(List<Long> calenderIds);
+
+    Object queryUser(MusicGroupPaymentCalenderQueryInfo queryInfo);
 }

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

@@ -10,6 +10,8 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -27,7 +29,9 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @return
 	 */
 	boolean importStudentToMusicGroup(String musicGroupId, Map<String, List<Map<String, Object>>> excelData);
-	
+
+    void importStudentToMusicGroup1(List<MusicGroupPaymentImportDto> importDtos, MusicGroupPaymentCalender calender) throws Exception;
+
     /**
      * 建团申请数据提交
      *
@@ -72,6 +76,8 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
      */
     Map sporadicPay(SporadicPayDto sporadicPayDto) throws Exception;
 
+    void importRenew(List<MusicGroupPaymentImportDto> importDtos) throws Exception;
+
     /**
      * 缴费
      *
@@ -468,4 +474,13 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
      */
     List<Subject> getSubjectListByIdAndCoopId(String musicGroupId, Integer coopId);
 
+
+    /**
+     * @description: 缴费项目外部订单导入
+     * @param file
+     * @return java.util.List<java.lang.String>
+     * @author zx
+     * @date 2023/5/5 14:03
+     */
+    List<String> importMusicGroupPayment(MultipartFile file) throws Exception;
 }

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentMemberUpdateLogService.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.StudentMemberUpdateLogDao;
+import com.ym.mec.biz.dal.entity.StudentMemberUpdateLog;
+
+/**
+ * 学员云教练时长修改记录(StudentMemberUpdateLog)表服务接口
+ *
+ * @author zx
+ * @since 2023-05-17 11:13:44
+ */
+public interface StudentMemberUpdateLogService extends IService<StudentMemberUpdateLog> {
+
+    StudentMemberUpdateLogDao getDao();
+}
+

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

@@ -154,5 +154,8 @@ public interface StudentPaymentOrderDetailService extends BaseService<Long, Stud
      */
     void addOrderDetailTo(StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup, StudentRegistration studentRegistration);
 
+    void addOrderDetailTo1(StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup,
+                           StudentRegistration studentRegistration, List<StudentPaymentOrderDetail> allDetails);
+
     List<StudentPaymentOrderDetail> findByOrderId(Long paymentOrderId);
 }

+ 7 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -5,13 +5,10 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.*;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dto.PageInfoOrder;
-import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -116,6 +113,8 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 
+
+
     /**
      * 获取零星收费订单列表
      *
@@ -253,6 +252,8 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     void mallBuyOrderCallback(StudentPaymentOrder order);
 
+    void mallBuyOrderCallback1(Long orderId);
+
     void mallSaveOrderInfo(MallCreateOrderModel model);
 
     OrderCancelModel cancelOrder(StudentPaymentOrder orderByOrderNo, String reason);
@@ -268,4 +269,6 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     // 查询余额
     BigDecimal balance(Long userId);
+
+    List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params);
 }

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

@@ -8,6 +8,8 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -97,6 +99,14 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
     StudentPaymentOrder addOrder(StudentRegistration studentRegistration,
                                  StudentPaymentOrder studentPaymentOrder, MusicGroupApplyGoodsDto goodsDto, RegisterPayDto registerPayDto, CouponPayParam couponPayParam) throws Exception;
 
+    List<StudentPaymentOrderDetail> addOrder1(StudentPaymentOrder studentPaymentOrder,
+                   MusicGroupPaymentCalender calender,
+                   List<MusicGroupPaymentCalenderCourseSettings> newCourses,
+                   MusicGroupPaymentCalenderMember calenderMember,
+                   MusicGroupPaymentCalenderRepair calenderRepair,
+                   List<MusicGroupPaymentCalenderActivity> calenderActivities
+    ) throws Exception;
+
     /**
      * 查询用户指定乐团的报名信息
      *
@@ -397,4 +407,6 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @date 2021/11/9 10:27
      */
     PageInfo<StudentInstrument> queryMusicStudentInstrument(StudentPreRegistrationQueryInfo queryInfo);
+
+    void batchUpdate(@Param("studentRegistrations") List<StudentRegistration> studentRegistrations);
 }

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

@@ -232,4 +232,14 @@ public interface StudentService extends BaseService<Integer, Student> {
     StudentWrapper.StudentStat userCount(StudentWrapper.StudentQuery queryInfo);
 
     Map<Integer,Student> getMapByIds(List<Integer> studentIds);
+
+    /**
+    * @description: 修改学员云教练时间
+     * @param userId
+     * @param endTime
+    * @return void
+    * @author zx
+    * @date 2023/5/17 11:25
+    */
+    void updateStudentMember(Integer userId, Date endTime,String memo,Integer operatorId);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentStatisticsDao;
 import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumForDateDto;
@@ -13,6 +14,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface StudentStatisticsService extends BaseService<Integer, StudentStatistics> {
+    StudentStatisticsDao getDao();
 
     //定时任务
     void updateStudentStatistics();

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

@@ -2,8 +2,10 @@ package com.ym.mec.biz.service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.ConditionDto;
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
 import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
 import com.ym.mec.biz.dal.dto.SubjectApplyDetailDto;
 import com.ym.mec.biz.dal.entity.Subject;
@@ -109,4 +111,6 @@ public interface SubjectService extends BaseService<Integer, Subject> {
     List<Subject> list();
 
     Map<Integer,Subject> getMapByIds(List<Integer> subjectIds);
+
+    Map<Integer, StudentSubjectDto> getSubjectByStudentId(Set<Long> studentIds);
 }

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

@@ -402,6 +402,12 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     // IM服务方案(rongCloud,tencentCloud
     String IM_SERVICE_PROVIDER = "im_service_provider";
 
+    // 网络教室服务提供方配置
+    String RTC_SERVICE_PROVIDER = "rtc_service_provider";
+
+    // 按分部强制开始为腾讯服务提供
+    String TENCENT_RTC_SERVICE_PROVIDER = "tencent_rtc_service_provider";
+
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){
             return;

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

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
@@ -11,13 +10,12 @@ import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
 
 public interface VipGroupActivityService extends BaseService<Integer, VipGroupActivity> {
+    PageInfo<VipGroupActivity> queryPage(VipGroupActivityQueryInfo queryInfo);
 
     VipGroupActivityDao getDao();
 

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

@@ -1783,10 +1783,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 .collect(Collectors.toList());
         truantStudent.addAll(otherStudent);
         truantStudent.addAll(leaveStudent);
+        Set<Long> collect = truantStudent.stream().map(e -> e.getStudentId()).collect(Collectors.toSet());
         if (!CollectionUtils.isEmpty(truantStudent)) {
             CourseSchedule schedule = courseScheduleDao.get(courseScheduleId);
             if (schedule.getGroupType() == MUSIC) {
-                Set<Long> collect = truantStudent.stream().map(e -> e.getStudentId()).collect(Collectors.toSet());
                 Map<Integer, String> paymentStatusMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryUserCoursePaymentStatus(collect, schedule.getMusicGroupId()));
 
                 Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect, schedule.getMusicGroupId()));
@@ -1808,12 +1808,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 List<Map<Integer, Long>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
                 Map<Integer, Long> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
-                    if (Objects.nonNull(studentAttendanceViewDto.getBeMerged()) && studentAttendanceViewDto.getBeMerged()) {
-                        studentAttendanceViewDto.setSubjectName("被合并学员");
-                    } else {
-                        studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                        studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                    }
+                    studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
                 });
             } else if (schedule.getGroupType() != MUSIC) {
                 ClassGroup classGroup = classGroupDao.get(schedule.getClassGroupId());
@@ -1824,6 +1820,21 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 });
             }
         }
+
+        // 乐团声部为空,取student的声部
+        if (!CollectionUtils.isEmpty(truantStudent)) {
+
+            Map<Integer, StudentSubjectDto> subjectDtoMap = subjectService.getSubjectByStudentId(collect);
+            truantStudent.forEach(studentAttendanceViewDto -> {
+                if (studentAttendanceViewDto.getSubjectId() == null) {
+                    StudentSubjectDto subjectDto = subjectDtoMap.getOrDefault(studentAttendanceViewDto.getStudentId().intValue(), new StudentSubjectDto());
+                    if (subjectDto.getSubjectId() != null) {
+                        studentAttendanceViewDto.setSubjectName(subjectDto.getSubjectName());
+                        studentAttendanceViewDto.setSubjectId(subjectDto.getSubjectId().longValue());
+                    }
+                }
+            });
+        }
         return truantStudent;
     }
 

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

@@ -3,13 +3,16 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.CloudCoachPaymentProgram;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.MemberRankSetting;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.page.CloudCoachPaymentProgramQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
@@ -21,10 +24,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class CloudCoachPaymentProgramServiceImpl extends BaseServiceImpl<Long, CloudCoachPaymentProgram>  implements CloudCoachPaymentProgramService {
@@ -56,6 +57,44 @@ public class CloudCoachPaymentProgramServiceImpl extends BaseServiceImpl<Long, C
 	}
 
 	@Override
+	public PageInfo<CloudCoachPaymentProgram> queryPage(CloudCoachPaymentProgramQueryInfo queryInfo) {
+		PageInfo<CloudCoachPaymentProgram> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<CloudCoachPaymentProgram> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+			Set<Integer> userIds = dataList.stream().map(e -> e.getOperator()).filter(e -> e != null).collect(Collectors.toSet());
+			userIds.addAll(dataList.stream().map(e -> e.getAudit()).filter(e -> e != null).collect(Collectors.toSet()));
+			List<SimpleUserDto> usersSimpleInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(userIds));
+			Map<Integer, SimpleUserDto> userDtoMap = usersSimpleInfo.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+
+			List<Long> programIds = dataList.stream().map(e -> e.getId()).collect(Collectors.toList());
+			Map<Long,String> userNameMap = studentCloudCoachPaymentDetailsDao.queryStudentName(programIds).stream().collect(Collectors.toMap(e -> Long.parseLong(e.get("key").toString()), e -> e.get("value") == null ? "" : e.get("value").toString()));
+			for (CloudCoachPaymentProgram program : dataList) {
+				SimpleUserDto userDto = userDtoMap.get(program.getOperator());
+				if(Objects.nonNull(userDto)){
+					program.setOperatorName(userDto.getUserName());
+				}
+				userDto = userDtoMap.get(program.getAudit());
+				if(Objects.nonNull(userDto)){
+					program.setAuditName(userDto.getUserName());
+				}
+				program.setUserNames(userNameMap.get(program.getId()));
+			}
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void add(CloudCoachPaymentProgram cloudCoachPaymentProgram) {
 		List<Integer> userIds = cloudCoachPaymentProgram.getUserIds();

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

@@ -90,6 +90,11 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     }
 
     @Override
+    public CloudTeacherOrderDao getDao() {
+        return cloudTeacherOrderDao;
+    }
+
+    @Override
     public PageInfo<CloudTeacherStudent> queryInactive(CloudTeacherOrderQueryInfo queryInfo) throws Exception {
         PageInfo<CloudTeacherStudent> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

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

@@ -37,7 +37,9 @@ import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.json.JsonUtil;
 
 import org.apache.commons.collections.CollectionUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.ListUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,6 +69,7 @@ import static com.ym.mec.biz.dal.enums.PracticeGroupType.FREE;
 import static com.ym.mec.biz.dal.enums.PracticeGroupType.TRIAL;
 import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
 
+@Slf4j
 @Service
 public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSchedule> implements CourseScheduleService {
 
@@ -1138,8 +1141,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             } else {
                 courseScheduleDto.setStatus(CourseStatusEnum.UNDERWAY);
             }
-            courseScheduleDto.setSubjectName(subjectNameCourseMap.get(courseScheduleDto.getId().intValue()));
-            courseScheduleDto.setSubjectId(subjectIdCourseMap.get(courseScheduleDto.getId().intValue()));
+            courseScheduleDto.setSubjectName(MapUtils.getString(subjectNameCourseMap, courseScheduleDto.getId()));
+            courseScheduleDto.setSubjectId(MapUtils.getString(subjectIdCourseMap, courseScheduleDto.getId()));
 			courseScheduleDto.setReviewId(reviewIdMap.get(courseScheduleDto.getId().intValue()));
 			courseScheduleDto.setStudentReviewId(StudentReviewIdMap.get(courseScheduleDto.getId()));
 			if(CourseScheduleType.PRACTICE.equals(courseScheduleDto.getType())&&Objects.nonNull(courseScheduleDto.getMusicGroupId())){
@@ -1515,6 +1518,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void courseAdjustOnlyWithClassDate(List<CourseSchedule> courseSchedules, Integer operatorId) {
     	if(CollectionUtils.isEmpty(courseSchedules)){
     		throw new BizException("请指定课程");
@@ -5515,8 +5519,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if(VIP.equals(courseSchedule.getGroupType())||PRACTICE.equals(courseSchedule.getGroupType())){
 				throw new BizException("VIP课、网管课暂不支持课程合并");
 			}
-			if(CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
-				throw new BizException("乐团网管课、线上基础技能课暂不支持课程合并");
+			if(CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())){
+				throw new BizException("乐团网管课暂不支持课程合并");
 			}
 			if(Objects.isNull(courseMergeInfo.getClassGroupId())&&courseMergeInfo.getId().equals(courseSchedule.getId())){
 				courseMergeInfo.setClassGroupId(courseSchedule.getClassGroupId());
@@ -5526,28 +5530,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			courseSchedule.setNote("课程合并");
 		}
 		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(allCourseIds);
-//		Map<Long, Set<Integer>> courseStudentIdsMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getUserId, Collectors.toSet())));
-//		Set<Integer> allStudentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
 
 		Map<Integer, CourseScheduleStudentPayment> mainStudentCourseMap = courseScheduleStudentPayments.stream().filter(c -> courseMergeInfo.getId().equals(c.getCourseScheduleId())).collect(Collectors.toMap(CourseScheduleStudentPayment::getUserId, c -> c, (c1, c2) -> c1));
 
 		Map<Integer, List<CourseScheduleStudentPayment>> otherStudentCourseMap = courseScheduleStudentPayments.stream().filter(c -> !courseMergeInfo.getId().equals(c.getCourseScheduleId())).collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId));
 
 		List<CourseScheduleStudentPayment> newPayments = new ArrayList<>();
-//		List<CourseScheduleStudentPayment> updatePayments = new ArrayList<>();
 
 		for (Map.Entry<Integer, List<CourseScheduleStudentPayment>> otherStudentCourseMapEntry : otherStudentCourseMap.entrySet()) {
 			List<CourseScheduleStudentPayment> studentCoursePayments = otherStudentCourseMapEntry.getValue();
-//			BigDecimal salary = studentCoursePayments.stream().map(CourseScheduleStudentPayment::getExpectPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 			if(mainStudentCourseMap.containsKey(otherStudentCourseMapEntry.getKey())){
-//				CourseScheduleStudentPayment updatePayment = mainStudentCourseMap.get(otherStudentCourseMapEntry.getKey());
-//				updatePayment.setExpectPrice(updatePayment.getExpectPrice().add(salary));
-//				updatePayments.add(updatePayment);
-
-//				for (CourseScheduleStudentPayment studentCoursePayment : studentCoursePayments) {
-//					studentCoursePayment.setExpectPrice(BigDecimal.ZERO);
-//					updatePayments.add(studentCoursePayment);
-//				}
 				continue;
 			}
 			CourseScheduleStudentPayment newPayment = new CourseScheduleStudentPayment();
@@ -5560,10 +5552,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			newPayment.setId(null);
 			newPayment.setBeMerged(true);
 			newPayments.add(newPayment);
-//			for (CourseScheduleStudentPayment studentCoursePayment : studentCoursePayments) {
-//				studentCoursePayment.setExpectPrice(BigDecimal.ZERO);
-//				updatePayments.add(studentCoursePayment);
-//			}
 		}
 
 		List<CourseSchedule> courseSchedules=new ArrayList<>();
@@ -5580,13 +5568,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 			//课程信息变更
 			courseSchedule.setNewCourseId(courseMergeInfo.getId());
-//			courseSchedule.setClassDate(courseMergeInfo.getClassDate());
-//			courseSchedule.setStartClassTime(courseMergeInfo.getStartClassTime());
-//			courseSchedule.setEndClassTime(courseMergeInfo.getEndClassTime());
-//			courseSchedule.setActualTeacherId(courseMergeInfo.getActualTeacherId());
-//			courseSchedule.setClassGroupId(courseMergeInfo.getClassGroupId());
-//			courseSchedule.setSchoolId(courseMergeInfo.getSchoolId());
-
 			courseScheduleModifyLog.setCurrentCourseSchedule(JsonUtil.toJSONString(courseSchedule));
 			courseScheduleModifyLog.setOperatorId(courseMergeInfo.getOperatorId());
 			insertCourseScheduleModifyLogList.add(courseScheduleModifyLog);

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

@@ -1027,11 +1027,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 courseIncomeMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId, Collectors.mapping(CourseScheduleStudentPayment::getActualPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
             }
         }
-        Map<Long,BigDecimal> courseCast = MapUtil.convertIntegerMap(cloudTeacherFreeCourseDao.queryMapByClassDate(month));
+//        Map<Long,BigDecimal> courseCast = MapUtil.convertIntegerMap(cloudTeacherFreeCourseDao.queryMapByClassDate(month));
 
         for (ExportTeacherSalaryDto exportTeacherSalaryDto : exportTeacherSalaryDtos) {
-            BigDecimal castOrDefault = courseCast.getOrDefault(exportTeacherSalaryDto.getCourseScheduleId(), BigDecimal.ZERO);
-            exportTeacherSalaryDto.setCloudReverse(castOrDefault);
+//            BigDecimal castOrDefault = courseCast.getOrDefault(exportTeacherSalaryDto.getCourseScheduleId(), BigDecimal.ZERO);
+//            exportTeacherSalaryDto.setCloudReverse(castOrDefault);
             if(!courseIncomeMap.containsKey(exportTeacherSalaryDto.getCourseScheduleId())){
                 exportTeacherSalaryDto.setCourseIncome(BigDecimal.ZERO);
             }else{

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

@@ -148,10 +148,17 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
                 employee.setUserId(user.getId());
                 employee.setId(user.getId());
                 employeeDao.insert(employee);
-                //新增用户角色
-                employeeDao.batchAddEmployeeRole(user.getId(), employee.getRoleIds(), tenantId);
-                //新增用户职位
-                employeePositionService.batchAddPosition(employee.getId(), employee.getPositionIds(), tenantId);
+
+                if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employee.getRoleIds())) {
+                    //新增用户角色
+                    employeeDao.batchAddEmployeeRole(user.getId(), employee.getRoleIds(), tenantId);
+                }
+
+                if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employee.getPositionIds())) {
+
+                    //新增用户职位
+                    employeePositionService.batchAddPosition(employee.getId(), employee.getPositionIds(), tenantId);
+                }
                 employee.setUserType(user.getUserType() + ",SYSTEM");
                 teacherDao.updateUser(employee);
                 return;
@@ -167,10 +174,16 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         teacherDao.addSysUser(employee);
         employee.setUserId(employee.getId());
         employeeDao.insert(employee);
-        //新增用户角色
-        employeeDao.batchAddEmployeeRole(employee.getId(), employee.getRoleIds(), tenantId);
-        //新增用户职位
-        employeePositionService.batchAddPosition(employee.getId(), employee.getPositionIds(), tenantId);
+
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employee.getRoleIds())) {
+            //新增用户角色
+            employeeDao.batchAddEmployeeRole(employee.getId(), employee.getRoleIds(), tenantId);
+        }
+
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(employee.getPositionIds())) {
+            //新增用户职位
+            employeePositionService.batchAddPosition(employee.getId(), employee.getPositionIds(), tenantId);
+        }
         //添加用户现金账户
         sysUserCashAccountDao.insert(new SysUserCashAccount(employee.getId(), tenantId, "CNY"));
         ImResult imResult = imFeignService.register(new ImUserModel(employee.getId().toString(), employee.getUsername(), null));
@@ -283,6 +296,25 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     }
 
     @Override
+    public void updateEmployeeRole(Employee employee) {
+
+        Employee employee1 = employeeDao.get(employee.getId());
+        if (null == employee1) {
+            throw new BizException("员工信息不存在");
+        }
+
+        //新增用户角色
+        Integer tenantId = TenantContextHolder.getTenantId();
+        if(employee.getRoleIds() != null && employee.getRoleIds().size() > 0){
+
+            //删除当前用户角色
+            employeeDao.delEmployeeRole(employee.getId());
+            // 批量新增角色
+            employeeDao.batchAddEmployeeRole(employee.getId(), employee.getRoleIds(), tenantId);
+        }
+    }
+
+    @Override
     public PageInfo queryEmployByOrganId(EmployeeQueryInfo queryInfo) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null) {

+ 76 - 368
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -50,7 +50,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static com.ym.mec.biz.dal.enums.OrderTypeEnum.OUTORDER;
+import static com.ym.mec.biz.dal.enums.OrderTypeEnum.*;
 import static com.ym.mec.common.controller.BaseController.succeed;
 
 @Service
@@ -113,8 +113,6 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private TenantPaymentOrderService tenantPaymentOrderService;
     @Autowired
-    private CourseScheduleDao courseScheduleDao;
-    @Autowired
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
     private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
@@ -131,8 +129,6 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private CooperationOrganService cooperationOrganService;
     @Autowired
-    private StudentPaymentOrderDao studentPaymentOrderDao;
-    @Autowired
     private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
     @Autowired
     private TeacherService teacherService;
@@ -185,13 +181,9 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private StudentCourseConsumerService studentCourseConsumerService;
     @Autowired
-    private StudentStatisticsDao studentStatisticsDao;
-    @Autowired
     private StudentTeacherMapperDao studentTeacherMapperDao;
     @Autowired
     private TeacherCloudCourseReportService teacherCloudCourseReportService;
-    @Autowired
-    private CloudTeacherOrderDao cloudTeacherOrderDao;
 
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
@@ -412,7 +404,7 @@ public class ExportServiceImpl implements ExportService {
         String month = getParam(info, "month", String.class);
         Map<String, Object> params = new HashMap<>(1);
         params.put("month",month);
-        int count = studentPaymentOrderDao.queryCount1(params);
+        int count = studentPaymentOrderService.getDao().queryCount1(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -661,7 +653,9 @@ public class ExportServiceImpl implements ExportService {
                 }
             }
             for (MusicalListDetailDto musicalListDetail : musicalListDetails) {
-                if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) continue;
+                if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) {
+                    continue;
+                }
                 studentApplyDetailDto.setKitGroupPurchaseTypeEnum(musicalListDetail.getKitGroupPurchaseTypeEnum());
             }
             if (PaymentStatusEnum.YES.equals(studentApplyDetailDto.getPaymentStatus()) && studentApplyDetailDto.getKitGroupPurchaseTypeEnum() == null) {
@@ -784,10 +778,10 @@ public class ExportServiceImpl implements ExportService {
             throw new BizException("没有可导出的记录");
         }
         Set<Integer> studentIds = practiceGroupExports.stream().map(CourseGroupExportDto::getStudentId).collect(Collectors.toSet());
-        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentCourseInfo(studentIds, GroupType.PRACTICE);
+        List<CourseGroupExportDto> studentCourseInfos = courseScheduleService.getDao().getStudentCourseInfo(studentIds, GroupType.PRACTICE);
 
-        List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, null);
-        List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, CourseStatusEnum.NOT_START);
+        List<CourseGroupExportDto> totalClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, null);
+        List<CourseGroupExportDto> noStartClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto practiceGroupExport : practiceGroupExports) {
             for (CourseGroupExportDto studentCourseInfo : studentCourseInfos) {
                 if (studentCourseInfo.getStudentId().equals(practiceGroupExport.getStudentId())) {
@@ -817,7 +811,7 @@ public class ExportServiceImpl implements ExportService {
     //vip管理导出
     @Override
     public List vipGroup() {
-        List<CourseGroupExportDto> vipGroupExports = courseScheduleDao.getVipGroupExport(organizationService.getEmployeeOrgan(""));
+        List<CourseGroupExportDto> vipGroupExports = courseScheduleService.getDao().getVipGroupExport(organizationService.getEmployeeOrgan(""));
         if (vipGroupExports == null || vipGroupExports.size() == 0) {
             throw new BizException("没有可导出的记录");
         }
@@ -827,9 +821,9 @@ public class ExportServiceImpl implements ExportService {
         if (!CollectionUtils.isEmpty(studentLastCourseSchedule)) {
             studentLastCourseMap = MapUtil.convertMybatisMap(studentLastCourseSchedule);
         }
-        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentVipCourseInfo(studentIds);
-        List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
-        List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
+        List<CourseGroupExportDto> studentCourseInfos = courseScheduleService.getDao().getStudentVipCourseInfo(studentIds);
+        List<CourseGroupExportDto> totalClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
+        List<CourseGroupExportDto> noStartClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto vipGroupExport : vipGroupExports) {
 
             String lastClassDateStr = studentLastCourseMap.get(vipGroupExport.getStudentId());
@@ -999,7 +993,7 @@ public class ExportServiceImpl implements ExportService {
         orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_BUY);
         orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_RENEW);
         orderTypeList.add(OrderTypeEnum.SMALL_CLASS_TO_BUY);
-        List<OrderByTypeExportDto> orders = studentPaymentOrderDao.getOrderByMonthAndType(organIds, orderTypeList, startTime, EndTime);
+        List<OrderByTypeExportDto> orders = studentPaymentOrderService.getDao().getOrderByMonthAndType(organIds, orderTypeList, startTime, EndTime);
 
         if (orders.size() <= 0) {
             throw new BizException("没有可导出的记录");
@@ -1411,7 +1405,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setRoutingOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getRoutingOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1441,7 +1435,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setRoutingOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getRoutingOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1550,7 +1544,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<String, Object>();
         queryInfo.setRows(65535);
         MapUtil.populateMap(params, queryInfo);
-        int count = studentStatisticsDao.countCourseConsumerDetail(params);
+        int count = studentStatisticsService.getDao().countCourseConsumerDetail(params);
         checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_COURSE_CONSUMER_DETAIL,user.getId());
         return this.asyncExport(() -> this.initExportInfo(studentCourseConsumerService.findCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_COURSE_CONSUMER_DETAIL),
@@ -1573,7 +1567,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<String, Object>();
         queryInfo.setRows(65535);
         MapUtil.populateMap(params, queryInfo);
-        int count = studentStatisticsDao.countPreCourseConsumerDetail(params);
+        int count = studentStatisticsService.getDao().countPreCourseConsumerDetail(params);
         checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL,user.getId());
         return this.asyncExport(() -> this.initExportInfo(studentCourseConsumerService.findPreCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL),
@@ -1674,7 +1668,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1684,7 +1678,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         params.put("notGroupType","MALL_SELL");
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1702,7 +1696,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1712,7 +1706,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         params.put("paymentType","MALL_BUY");
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1731,7 +1725,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1740,7 +1734,7 @@ public class ExportServiceImpl implements ExportService {
         }
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1782,7 +1776,7 @@ public class ExportServiceImpl implements ExportService {
 
     @Override
     public void mallOrderList(Map<String, Object> params, ManagerDownload managerDownload){
-        List<StudentPaymentOrderMallExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.exportMallQueryPage(params);
+        List<StudentPaymentOrderMallExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.getDao().exportMallQueryPage(params);
         long i = 1;
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
@@ -1889,7 +1883,7 @@ public class ExportServiceImpl implements ExportService {
         long i = 1;
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
         List<Integer> cooperationOrganIds = studentPaymentOrderExportDtos.stream()
-                .filter(e -> OUTORDER == e.getType() || GroupType.OUTORDER == e.getGroupType())
+                .filter(e -> OUTORDER == e.getType() || GroupType.OUTORDER == e.getGroupType() && (e.getType() != RENEW && e.getType() != APPLY))
                 .filter(e -> e.getMusicGroupId() != null)
                 .map(e -> Integer.valueOf(e.getMusicGroupId()))
                 .distinct()
@@ -2185,7 +2179,7 @@ public class ExportServiceImpl implements ExportService {
                     if (row.getGroupType().equals(GroupType.MUSIC)) {
                         if (row.getType() != OrderTypeEnum.APPLY && row.getType() != OrderTypeEnum.ADD_STUDENT) {
                             //判断之前是否有付费订单,如果没有,那么是乐团转化
-                            int orderNum = studentPaymentOrderDao.getStudentMusicOrderNum(row.getMusicGroupId(), row.getUserId(), row.getId());
+                            int orderNum = studentPaymentOrderService.getDao().getStudentMusicOrderNum(row.getMusicGroupId(), row.getUserId(), row.getId());
                             if (orderNum == 0) {
                                 row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.MUSIC_CONVERT.getMsg());
                             }
@@ -2204,55 +2198,57 @@ public class ExportServiceImpl implements ExportService {
                     } else if (row.getGroupType().equals(OrderTypeEnum.REPAIR)) {
                         row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
                     } else if (row.getGroupType() == GroupType.OUTORDER) {
-                        //销售收入
-                        BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
-                        //服务收入
-                        BigDecimal subtract = feeByType.getActualAmount().subtract(add);
-                        //如果是淘器微信那么就是零售
-                        if (Objects.equals("淘器微信", row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0) {
-                            //如果有服务收入那么是课程学校采买
-                            row.setMusicalFee(BigDecimal.ZERO);
-                            row.setTeachingFee(BigDecimal.ZERO);
-                            row.setMaintenanceProductFee(BigDecimal.ZERO);
-                            row.setOtherFee(subtract);
-                            row.setRetailGoodsFee(add);
-                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
-                        } else {
-                            //拆分导入订单
-                            if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
-                                if (row.getType() == OrderTypeEnum.SCHOOL) {
-                                    row.setMusicalFee(BigDecimal.ZERO);
-                                    row.setTeachingFee(BigDecimal.ZERO);
-                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
-                                    row.setOtherFee(BigDecimal.ZERO);
-                                    row.setLargeMusicalFee(add);
-                                }
+                        if (row.getType() != RENEW && row.getType() != APPLY) {
+                            //销售收入
+                            BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
+                            //服务收入
+                            BigDecimal subtract = feeByType.getActualAmount().subtract(add);
+                            //如果是淘器微信那么就是零售
+                            if (Objects.equals("淘器微信", row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0) {
                                 //如果有服务收入那么是课程学校采买
-                                if (subtract.compareTo(BigDecimal.ZERO) == 0) {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL.getMsg());
-                                } else {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_SCHOOL_BUY.getMsg());
-                                }
-                                row.setCourseSchoolBuyAmount(subtract);
-                            } else if (row.getType() == OrderTypeEnum.OTHER) {
-                                row.setOtherFee(row.getOtherFee().add(subtract));
-                            } else {
                                 row.setMusicalFee(BigDecimal.ZERO);
                                 row.setTeachingFee(BigDecimal.ZERO);
                                 row.setMaintenanceProductFee(BigDecimal.ZERO);
-                                row.setOtherFee(BigDecimal.ZERO);
+                                row.setOtherFee(subtract);
                                 row.setRetailGoodsFee(add);
-                                row.setMusicGroupCourseFee(subtract);
-                                //如果有服务收入那么是课程学校采买
-                                if (subtract.compareTo(BigDecimal.ZERO) == 0) {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
+                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
+                            } else {
+                                //拆分导入订单
+                                if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
+                                    if (row.getType() == OrderTypeEnum.SCHOOL) {
+                                        row.setMusicalFee(BigDecimal.ZERO);
+                                        row.setTeachingFee(BigDecimal.ZERO);
+                                        row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                        row.setOtherFee(BigDecimal.ZERO);
+                                        row.setLargeMusicalFee(add);
+                                    }
+                                    //如果有服务收入那么是课程学校采买
+                                    if (subtract.compareTo(BigDecimal.ZERO) == 0) {
+                                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL.getMsg());
+                                    } else {
+                                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_SCHOOL_BUY.getMsg());
+                                    }
+                                    row.setCourseSchoolBuyAmount(subtract);
+                                } else if (row.getType() == OrderTypeEnum.OTHER) {
+                                    row.setOtherFee(row.getOtherFee().add(subtract));
                                 } else {
-                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_STUDENT_BUY.getMsg());
+                                    row.setMusicalFee(BigDecimal.ZERO);
+                                    row.setTeachingFee(BigDecimal.ZERO);
+                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                    row.setOtherFee(BigDecimal.ZERO);
+                                    row.setRetailGoodsFee(add);
+                                    row.setMusicGroupCourseFee(subtract);
+                                    //如果有服务收入那么是课程学校采买
+                                    if (subtract.compareTo(BigDecimal.ZERO) == 0) {
+                                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS.getMsg());
+                                    } else {
+                                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_STUDENT_BUY.getMsg());
+                                    }
                                 }
                             }
+                            row.setTransferFee(BigDecimal.ZERO);
+                            row.setPlatformFee(BigDecimal.ZERO);
                         }
-                        row.setTransferFee(BigDecimal.ZERO);
-                        row.setPlatformFee(BigDecimal.ZERO);
                     }
                 }
                 if (row.getTypeDesc() == null) {
@@ -2272,11 +2268,13 @@ public class ExportServiceImpl implements ExportService {
                 }
             }
             if ((row.getType() == OUTORDER || row.getGroupType() == GroupType.OUTORDER) && StringUtils.isNotEmpty(row.getMusicGroupId())) {
-                if (cooperationOrganMap.containsKey(Integer.valueOf(row.getMusicGroupId()))) {
-                    row.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(row.getMusicGroupId())));
-                    CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(row.getMusicGroupId()));
-                    if (cooperationOrganEduTeacher != null) {
-                        row.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
+                if (row.getType() != RENEW && row.getType() != APPLY) {
+                    if (cooperationOrganMap.containsKey(Integer.valueOf(row.getMusicGroupId()))) {
+                        row.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(row.getMusicGroupId())));
+                        CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(row.getMusicGroupId()));
+                        if (cooperationOrganEduTeacher != null) {
+                            row.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
+                        }
                     }
                 }
             }
@@ -2307,297 +2305,7 @@ public class ExportServiceImpl implements ExportService {
 
     @Override
     public void operatingSummaryIncome(Map<String, Object> params, ManagerDownload managerDownload) {
-        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.ExportQueryPage1(params);
-        long i = 1;
-        //获取机构费率
-        List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
-                && e.getGroupType() != GroupType.REPLACEMENT
-                && e.getGroupType() != GroupType.PRACTICE
-                && e.getGroupType() != GroupType.SPORADIC
-                && e.getGroupType() != GroupType.MEMBER
-                && e.getGroupType() != GroupType.ACTIVITY
-                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
-        Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
-        Map<Long, BigDecimal> childRepairMap = new HashMap<>();
-        if (!CollectionUtils.isEmpty(otherOrderIds)) {
-            List<StudentPaymentOrderExportDto> feeByType = sellOrderDao.queryFeeByType(otherOrderIds);
-            feeByTypeMap = feeByType.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
-            childRepairMap = MapUtil.convertIntegerMap(sellOrderDao.queryChildRepair(otherOrderIds));
-        }
-        List<Integer> organIds = studentPaymentOrderExportDtos.stream().map(e -> e.getOrganId()).distinct().collect(Collectors.toList());
-        Map<Integer, String> userOrganNameMap = organizationService.getMap("organization","id_","name_",organIds,managerDownload.getTenantId(),Integer.class,String.class);
-        //按分部分组
-        Map<Integer, List<StudentPaymentOrderExportDto>> listMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
-        List<OperatingTotalIncomeDto> incomeDtos = new ArrayList<>();
-        //承担课程的云教练收入
-        String month = params.get("month").toString();
-        String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-        String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-        Map<Integer, BigDecimal> groupCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderDao.sumGroupCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
-        //不承担课程的云教练收入
-        Map<Integer, BigDecimal> personalCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderDao.sumPersonalCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
-
-        for (Integer organId : listMap.keySet()) {
-            OperatingTotalIncomeDto incomeDto = new OperatingTotalIncomeDto();
-            incomeDto.setOrganName(userOrganNameMap.get(organId));
-            for (StudentPaymentOrderExportDto row : listMap.get(organId)) {
-                if (row.getActualAmount() == null) {
-                    row.setActualAmount(BigDecimal.ZERO);
-                }
-                if (row.getBalancePaymentAmount() == null) {
-                    row.setBalancePaymentAmount(BigDecimal.ZERO);
-                }
-                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 (row.getGroupType() != GroupType.GOODS_SELL) {
-                                    if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                                        row.setLeaseFee(getActualAmount(orderDetail.getPrice(), row));
-                                    } 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()));
-                                break;
-                            case MAINTENANCE:
-                                row.setMaintenanceFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case CLOUD_TEACHER:
-                            case CLOUD_TEACHER_PLUS:
-                                row.setCloudTeacherFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case DEGREE_REGISTRATION:
-                                row.setDegreeFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case PRACTICE:
-                                row.setPracticeCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case VIP:
-                                row.setVipCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case THEORY_COURSE:
-                                row.setTheoryCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case REPAIR:
-                                row.setRepairFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            default:
-                                break;
-                        }
-                    }
-                }
-                //专业
-                if (row.getGroupType().equals(GroupType.VIP)) {
-                    row.setVipCourseFee(row.getActualAmount());
-                } else if (row.getGroupType() == GroupType.ACTIVITY) {
-                    row.setVipCourseFee(row.getActualAmount());
-                } else if (row.getGroupType() == GroupType.MEMBER) {
-                    row.setCloudTeacherFee(row.getActualAmount());
-                } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
-                    //考级报名
-                    if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                        if(StringUtils.isEmpty(row.getMemo())){
-                            row.setDegreeFee(row.getActualAmount());
-                        }else {
-                            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 if (row.getChargeType() != null && SporadicChargeTypeEnum.MUSIC_UPKEEP.getCode().equals(row.getChargeType())) {
-                            row.setMaintenanceFee(row.getActualAmount());
-                        } else if (row.getChargeType() != null && SporadicChargeTypeEnum.VISITING_FEE.getCode().equals(row.getChargeType())) {
-                            row.setVisitFee(row.getActualAmount());
-                        } else if (row.getChargeType() != null && (SporadicChargeTypeEnum.RECHARGE.getCode().equals(row.getChargeType()) ||
-                                SporadicChargeTypeEnum.HIGH_ONLINE_ACTIVITY.getCode().equals(row.getChargeType()))) {
-                            row.setRechargeFee(row.getActualAmount());
-                        } else if (row.getChargeType() != null && SporadicChargeTypeEnum.CLOUD_TEACHER_BUY.getCode().equals(row.getChargeType())) {
-                            row.setCloudTeacherFee(row.getActualAmount());
-                        } else {
-                            row.setOtherFee(row.getActualAmount());
-                        }
-                    }
-                } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
-                    row.setPracticeCourseFee(row.getActualAmount());
-                } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
-                    row.setMusicalFee(row.getActualAmount());
-                } else if (row.getGroupType().equals(GroupType.GOODS_SELL)) {
-                    row.setRetailGoodsFee(row.getActualAmount());
-                } else {
-                    List<StudentPaymentOrderExportDto> exportDtoList = feeByTypeMap.get(row.getId());
-                    if (!CollectionUtils.isEmpty(exportDtoList)) {
-                        StudentPaymentOrderExportDto feeByType = exportDtoList.get(0);
-                        BigDecimal childRepairFee = childRepairMap.get(row.getId()) == null ? BigDecimal.ZERO : childRepairMap.get(row.getId());
-                        row.setMusicalFee(feeByType.getMusicalFee());
-                        row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
-                        row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
-                        row.setOtherFee(feeByType.getOtherFee());
-                        if (row.getGroupType().equals(GroupType.MUSIC)) {
-                            row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).
-                                    subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).
-                                    subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()).
-                                    subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()));
-                        } else if (row.getGroupType().equals(OrderTypeEnum.REPAIR)) {
-                            row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
-                        } else if (row.getGroupType() == GroupType.OUTORDER) {
-                            //销售收入
-                            BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
-                            //服务收入
-                            BigDecimal subtract = feeByType.getActualAmount().subtract(add);
-                            //如果是淘器微信那么就是零售
-                            if (Objects.equals("淘器微信", row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0) {
-                                //如果有服务收入那么是课程学校采买
-                                row.setMusicalFee(BigDecimal.ZERO);
-                                row.setTeachingFee(BigDecimal.ZERO);
-                                row.setMaintenanceProductFee(BigDecimal.ZERO);
-                                row.setOtherFee(subtract);
-                                row.setRetailGoodsFee(add);
-                            } else {
-                                //拆分导入订单
-                                if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
-                                    if (row.getType() == OrderTypeEnum.SCHOOL) {
-                                        row.setMusicalFee(BigDecimal.ZERO);
-                                        row.setTeachingFee(BigDecimal.ZERO);
-                                        row.setMaintenanceProductFee(BigDecimal.ZERO);
-                                        row.setOtherFee(BigDecimal.ZERO);
-                                        row.setLargeMusicalFee(add);
-                                    }
-                                    row.setCourseSchoolBuyAmount(subtract);
-                                } else if (row.getType() == OrderTypeEnum.OTHER) {
-                                    row.setOtherFee(row.getOtherFee().add(subtract));
-                                } else {
-                                    row.setMusicalFee(BigDecimal.ZERO);
-                                    row.setTeachingFee(BigDecimal.ZERO);
-                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
-                                    row.setOtherFee(BigDecimal.ZERO);
-                                    row.setRetailGoodsFee(add);
-                                    row.setMusicGroupCourseFee(subtract);
-                                }
-                            }
-                            row.setTransferFee(BigDecimal.ZERO);
-                            row.setPlatformFee(BigDecimal.ZERO);
-                        }
-                    }
-                }
-                row.setId(i);
-                row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
-                row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
-                i++;
-                //学员指导课费
-                incomeDto.setStudentGuidanceIncome(incomeDto.getStudentGuidanceIncome()
-                        .add(row.getMusicGroupCourseFee())
-                        .add(row.getVipCourseFee())
-                        .add(row.getPracticeCourseFee())
-                        .add(row.getTheoryCourseFee()));
-                //学校课程采买
-                incomeDto.setCoursePurchaseIncome(incomeDto.getCoursePurchaseIncome()
-                        .add(row.getCourseSchoolBuyAmount()));
-                //考级
-                incomeDto.setExamIncome(incomeDto.getExamIncome()
-                        .add(row.getDegreeFee()));
-                //维修费用
-                incomeDto.setMaintenanceCost(incomeDto.getMaintenanceCost()
-                        .add(row.getRepairFee()));
-                //其他服务收入
-                incomeDto.setOtherServiceIncome(incomeDto.getOtherServiceIncome()
-                        .add(row.getLeaseFee())
-                        .add(row.getVisitFee())
-                        .add(row.getRechargeFee())
-                        .add(row.getOtherFee())
-                );
-                //团购乐器
-                incomeDto.setGroupPurchaseInstruments(incomeDto.getGroupPurchaseInstruments()
-                        .add(row.getMusicalFee()));
-                //零售乐器,计入其他
-                incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                        .add(row.getRetailGoodsFee()));
-                if(row.getGroupType() == GroupType.GOODS_SELL){
-                    //零售教辅,计入其他
-                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                            .add(row.getTeachingFee()));
-                }else {
-                    //团购教辅
-                    incomeDto.setGroupPurchaseTeachingAids(incomeDto.getGroupPurchaseTeachingAids()
-                            .add(row.getTeachingFee()));
-                }
-                //区分零售月保
-                if(row.getGroupType() == GroupType.MAINTENANCE){
-                    //零售月保,计入其他
-                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                            .add(row.getMaintenanceFee()));
-                }else {
-                    //团购月保
-                    incomeDto.setInstrumentInsuranceCost(incomeDto.getInstrumentInsuranceCost()
-                            .add(row.getMaintenanceFee()));
-                }
-
-                //大件乐器
-                incomeDto.setLargeInstruments(incomeDto.getLargeInstruments()
-                        .add(row.getLargeMusicalFee()));
-            }
-            incomeDto.setCloudCoachIncome(incomeDto.getCloudCoachIncome().add(groupCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
-            incomeDto.setSaleCloudCoachIncome(incomeDto.getSaleCloudCoachIncome().add(personalCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
-            //服务收入
-            incomeDto.setServiceIncome(incomeDto.getLargeInstruments()
-                    .add(incomeDto.getStudentGuidanceIncome())
-                    .add(incomeDto.getCoursePurchaseIncome())
-                    .add(incomeDto.getExamIncome())
-                    .add(incomeDto.getMaintenanceCost())
-                    .add(incomeDto.getInstrumentInsuranceCost())
-                    .add(incomeDto.getOtherServiceIncome())
-                    .add(incomeDto.getCloudCoachIncome())
-            );
-            incomeDto.setSalesIncome(incomeDto.getSalesIncome()
-                    .add(incomeDto.getSaleCloudCoachIncome())
-                    .add(incomeDto.getGroupPurchaseInstruments())
-                    .add(incomeDto.getGroupPurchaseTeachingAids())
-                    .add(incomeDto.getLargeInstruments())
-                    .add(incomeDto.getOtherIncome())
-            );
-            incomeDtos.add(incomeDto);
-        }
+        List<OperatingTotalIncomeDto> incomeDtos = studentPaymentOrderService.queryOperatingSummaryIncome(params);
         HSSFWorkbook workbook = getHSSFWorkbook(incomeDtos, ExportEnum.EXPORT_OPERATING_SUMMARY_INCOME);
         exportManagerDownload(workbook, managerDownload);
     }

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

@@ -290,7 +290,7 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                         feeProjectEnum = FeeProjectEnum.valueOfDesc(submitValue.toString());
                     }
                 }
-
+                Boolean continueFlag = false;
                 for (OaInputDto oaInputDto : oaInputDtos) {
                     String submitForm = oaInputDto.getModel();
                     Object submitValue = formData.get(submitForm);
@@ -315,8 +315,10 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                                             String name = inputDto.getName();
                                             Object o = hashMap.get(inputDto.getModel());
                                             if (Objects.isNull(o) || StringUtils.isEmpty(o.toString())) {
+                                                continueFlag = false;
                                                 continue nullAmount;
                                             }
+                                            continueFlag = true;
                                             if (StringUtils.equals(name,"金额")) {
                                                 financialExpenditure.setCurrentAmount(new BigDecimal(Double.parseDouble(o.toString())));
                                             } else if (StringUtils.equals(name,"日期")) {
@@ -341,6 +343,9 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                             }
                         }
                     }else {
+                        if(continueFlag){
+                            continue;
+                        }
                         nullUser:
                         for (HashMap hashMap : hashMaps) {
                             FinancialExpenditure financialExpenditure = new FinancialExpenditure();
@@ -379,7 +384,9 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                                                     financialExpenditure.setOrganId(organization.getId());
                                                     financialExpenditure.setOrganName(organization.getName());
                                                 }
-                                            } else if (StringUtils.contains(name,"金额") || StringUtils.equals(name,"住宿费") || StringUtils.equals(name,"出差补助") || StringUtils.equals(name,"交通费")) {
+                                            } else if (StringUtils.equals(name,"学校")) {
+                                                financialExpenditure.setCooperationOrganId(Integer.parseInt(o.toString()));
+                                            } else if (StringUtils.contains(name,"金额")) {
                                                 financialExpenditure.setAmount(financialExpenditure.getAmount().add(new BigDecimal(Double.parseDouble(o.toString()))));
                                                 financialExpenditure.setCurrentAmount(financialExpenditure.getAmount());
                                             } else if (StringUtils.equals(name,"情况说明") || StringUtils.equals(name,"事由")) {

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

@@ -119,8 +119,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			dataTypes = Arrays.stream(queryInfo.getDataTypes().split(",")).collect(Collectors.toSet());
 		}
 
-		String startDate1 = startDate.toString();
-		String endDate1 = endDate.toString();
+		String startDate1 = startDate.toString() + " 00:00:00";
+		String endDate1 = endDate.toString() + " 23:59:59";;
 		List<Integer> arrayList = null;
 		if(!CollectionUtils.isEmpty(organIds)){
 			arrayList = new ArrayList<>(organIds);
@@ -133,7 +133,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 		Map<Date, Map<IndexDataType, Map<String, Integer>>> vipCategoryCourseListMap = new HashMap<>();
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains("VIP_GROUP_COURSE")||dataTypes.contains("VIP_GROUP_ONLINE_COURSE")||dataTypes.contains("VIP_GROUP_OFFLINE_COURSE")){
-			Set<String> vipDataTypes = new HashSet<>();
+			Set<String> vipDataTypes = new HashSet<>(3);
 			vipDataTypes.add("VIP_GROUP_COURSE");
 			vipDataTypes.add("VIP_GROUP_ONLINE_COURSE");
 			vipDataTypes.add("VIP_GROUP_OFFLINE_COURSE");

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

@@ -66,7 +66,7 @@ public class LessonExaminationServiceImpl extends ServiceImpl<LessonExaminationD
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void publish(LessonExaminationSaveDto param) {
-        log.info("publish param: ",param);
+        log.info("publish param: {}",param);
         if(CollectionUtils.isEmpty(param.getStudentLessonExaminationSaveDtos())){
             throw new BizException("请选择学员");
         }

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

@@ -25,17 +25,24 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.excel.POIUtil;
+import com.ym.mec.util.ini.IniFileUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.ModelMap;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -129,6 +136,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     @Autowired
     private MemberFeeSettingService memberFeeSettingService;
 
+    @Autowired
+    private CloudCoachPaymentProgramDao cloudCoachPaymentProgramDao;
+
     @Override
     public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
         return musicGroupPaymentCalenderDao;
@@ -930,6 +940,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                 }
                 musicGroupPaymentCalender.setAuditMemo(auditMemo);
                 musicGroupPaymentCalender.setUpdateTime(date);
+                musicGroupPaymentCalender.setAudit(sysUserService.getUserId());
+                musicGroupPaymentCalender.setAuditTime(date);
 
                 if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
                     musicGroupPaymentCalender.setExpectNum(1);
@@ -1248,6 +1260,19 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     }
 
     @Override
+    public Object queryUser(MusicGroupPaymentCalenderQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        if ("MUSIC".equals(queryInfo.getType())) {
+            return musicGroupPaymentCalenderDao.queryUser(params);
+        } else if ("CLOUD".equals(queryInfo.getType())) {
+            return cloudCoachPaymentProgramDao.queryUser(params);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
         Date date = new Date();

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

@@ -33,7 +33,9 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 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.http.HttpUtil;
+import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.json.JsonUtil;
 import com.ym.mec.util.string.MessageFormatter;
 import com.ym.mec.util.validator.CommonValidator;
@@ -43,13 +45,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -60,6 +66,7 @@ import java.util.stream.Collectors;
 import static com.ym.mec.biz.dal.entity.ApprovalStatus.APPROVED;
 import static com.ym.mec.biz.dal.entity.ApprovalStatus.PROCESSING;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SCHOOL;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.*;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.ING;
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
@@ -74,10 +81,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private MusicGroupDao musicGroupDao;
     @Autowired
     private TeacherDao teacherDao;
-    
+
     @Autowired
     private MusicGroupDeliveryRecordDao musicGroupDeliveryRecordDao;
-    
+
     @Autowired
     private StudentService studentService;
     @Autowired
@@ -87,6 +94,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Autowired
     private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
     @Autowired
+    private MusicGroupPaymentCalenderMemberDao musicGroupPaymentCalenderMemberDao;
+    @Autowired
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
     private MusicGroupPaymentEntitiesDao musicGroupPaymentEntitiesDao;
@@ -209,6 +218,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private StudentDao studentDao;
     @Autowired
     private MusicGroupPaymentCalenderRepairDao musicGroupPaymentCalenderRepairDao;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityDao musicGroupPaymentCalenderActivityDao;
 
     @Autowired
     private SchoolStaffService schoolStaffService;
@@ -450,6 +461,165 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		return true;
 	}
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+	public void importStudentToMusicGroup1(List<MusicGroupPaymentImportDto> importDtos, MusicGroupPaymentCalender calender) throws Exception {
+		String musicGroupId = calender.getMusicGroupId();
+		//查询导入的声部是否正确
+    	List<String> subjectNameList = importDtos.stream().distinct().map(t->t.getSubjectName()).distinct().collect(Collectors.toList());
+
+    	List<MusicGroupSubjectPlan> musicGroupSubjectPlanList = musicGroupSubjectPlanDao.getMusicSubjectClassPlan(musicGroupId);
+
+    	Map<String,Integer> subjectMap = musicGroupSubjectPlanList.stream().collect(Collectors.toMap(MusicGroupSubjectPlan :: getSubName, MusicGroupSubjectPlan :: getSubjectId));
+
+    	List<String> allSubjectNameList = musicGroupSubjectPlanList.stream().map(t -> t.getSubName()).collect(Collectors.toList());
+
+    	for(String subName : subjectNameList){
+    		if(!allSubjectNameList.contains(subName)){
+    			throw new BizException("当前乐团不支持[{}]声部", subName);
+    		}
+    	}
+		Date now = new Date();
+		Long calenderId = calender.getId();
+		Boolean freeFlag = calender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0;
+		List<String> phones = importDtos.stream().map(e -> e.getPhone()).collect(Collectors.toList());
+        List<BasicUserDto> userList = teacherDao.queryUserByPhones(phones);
+		List<String> existPhones = studentDao.queryExistStuByPhone(phones);
+		Map<String, BasicUserDto> userDtoMap = userList.stream().collect(Collectors.groupingBy(e -> e.getPhone(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+		Organization organization = organizationDao.get(calender.getOrganId());
+		//检查用户是否已入团或在其他机构已注册
+		List<StudentRegistration> allList = new ArrayList<>();
+		StudentRegistration studentRegistration = null;
+		SysUser sysUser = null;
+		Student student = null;
+		Integer applyNum = 0;
+		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+		MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberDao.findByCalenderId(calenderId);
+		MusicGroupPaymentCalenderRepair calenderRepair = musicGroupPaymentCalenderRepairDao.findByCalenderId(calenderId);
+		List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityDao.findByCalenderId(calenderId);
+		List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(calenderId);
+		for(MusicGroupPaymentImportDto si : importDtos){
+			BasicUserDto userDto = userDtoMap.get(si.getPhone());
+			if (Objects.isNull(userDto)) {
+				sysUser = new SysUser();
+				sysUser.setPhone(si.getPhone());
+				int phoneStrLen = sysUser.getPhone().length();
+				sysUser.setPassword(new BCryptPasswordEncoder().encode("gym" + sysUser.getPhone().substring(phoneStrLen - 4, phoneStrLen)));
+				sysUser.setUsername(si.getStudentName());
+				sysUser.setGender(si.getGender().equals("男") ? 1 : 0);
+				sysUser.setUserType("STUDENT");
+				sysUser.setOrganId(calender.getOrganId());
+				sysUser.setCreateTime(now);
+				sysUser.setUpdateTime(now);
+				teacherDao.addSysUser(sysUser);
+				si.setUserId(sysUser.getId());
+            }else {
+				si.setUserId(userDto.getUserId());
+			}
+			Integer userId = si.getUserId();
+			if(!existPhones.contains(si.getPhone())){
+				student = new Student(userId, subjectMap.get(si.getSubjectName()) + "");
+				student.setCurrentGradeNum(SixPlusGradeEnum.get(si.getGrade()).getCode());
+				studentDao.insert(student);
+				// 添加用户现金账户
+				sysUserCashAccountDao.insert(new SysUserCashAccount(userId, "CNY"));
+			}
+			studentRegistration = studentRegistrationService.getStudentRegister(musicGroupId,userId);
+			if(studentRegistration == null){
+				studentRegistration = new StudentRegistration();
+				String studentGrade = studentService.getStudentGrade(organization.getGradeType(), SixPlusGradeEnum.get(si.getGrade()).getCode());
+				studentRegistration.setCurrentGrade(studentGrade);
+				studentRegistration.setActualSubjectId(subjectMap.get(si.getSubjectName()));
+				studentRegistration.setIsAllowAdjust(YesOrNoEnum.YES);
+				studentRegistration.setSubjectId(subjectMap.get(si.getSubjectName()));
+				studentRegistration.setUserId(userId);
+				studentRegistration.setParentsPhone(si.getPhone());
+				studentRegistration.setName(si.getStudentName());
+				studentRegistration.setGender(si.getGender().equals("男") ? 1 : 0);
+				studentRegistration.setPaymentStatus(PaymentStatusEnum.YES);
+				studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+				studentRegistration.setTemporaryCourseFee(BigDecimal.ZERO);
+				studentRegistration.setMusicGroupPaymentCalenderId(calenderId);
+				studentRegistration.setTenantId(calender.getTenantId());
+				studentRegistration.setMusicGroupId(musicGroupId);
+				studentRegistration.setCreateTime(now);
+				studentRegistration.setUpdateTime(now);
+				studentRegistrationDao.insert(studentRegistration);
+				allList.add(studentRegistration);
+				applyNum ++;
+			} else{
+				if (studentRegistration.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY) {
+					throw new BizException("学员{}乐团状态不支持导入",si.getStudentName());
+				}
+				studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+				studentRegistrationDao.update(studentRegistration);
+				allList.add(studentRegistration);
+			}
+			String channelType = "";
+			String orderNo = idGeneratorService.generatorId("payment") + "";
+			//生成订单,校验优惠券的使用情况
+			StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+			studentPaymentOrder.setExpectAmount(calender.getCurrentTotalAmount());
+			studentPaymentOrder.setActualAmount(calender.getCurrentTotalAmount());
+			studentPaymentOrder.setCouponRemitFee(BigDecimal.ZERO);
+			studentPaymentOrder.setUserId(studentRegistration.getUserId());
+			studentPaymentOrder.setGroupType(GroupType.OUTORDER);
+			studentPaymentOrder.setOrderNo(orderNo);
+			studentPaymentOrder.setType(OrderTypeEnum.APPLY);
+			studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+			studentPaymentOrder.setPaymentChannel(channelType);
+			studentPaymentOrder.setMusicGroupId(studentRegistration.getMusicGroupId());
+			studentPaymentOrder.setCalenderId(calenderId);
+			studentPaymentOrder.setOrganId(calender.getOrganId());
+			studentPaymentOrder.setRoutingOrganId(calender.getOrganId());
+			studentPaymentOrder.setMemo("缴费项目外部订单导入");
+			studentPaymentOrder.setMerNos(si.getMerNos());
+			studentPaymentOrder.setTransNo(si.getTransNo());
+			studentPaymentOrder.setPayTime(si.getPayTime());
+			studentPaymentOrder.setRemitFee(BigDecimal.ZERO);
+			studentPaymentOrder.setCourseRemitFee(BigDecimal.ZERO);
+			studentPaymentOrderService.insert(studentPaymentOrder);
+			List<StudentPaymentOrderDetail> orderDetails = studentRegistrationService.addOrder1(studentPaymentOrder, calender, courseSettings, calenderMember, calenderRepair, calenderActivities);
+			studentPaymentRouteOrderService.addRouteOrder(orderNo, calender.getOrganId(), calender.getCurrentTotalAmount());
+			studentPaymentOrderDetailService.addOrderDetailTo1(studentPaymentOrder, musicGroup, studentRegistration,orderDetails);
+		}
+		if (CollectionUtils.isNotEmpty(allList)) {
+			Map<Integer, Long> subjectCountMap = allList.stream().collect(
+					Collectors.groupingBy(StudentRegistration::getActualSubjectId, Collectors.counting()));
+
+			MusicGroupSubjectPlan musicOneSubjectClassPlan = null;
+			for (Entry<Integer, Long> entry : subjectCountMap.entrySet()) {
+				musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, entry.getKey());
+				if (musicOneSubjectClassPlan == null) {
+					throw new BizException("系统数据[乐团声部设置]异常");
+				}
+				int num = musicOneSubjectClassPlan.getApplyStudentNum() == null ? 0 : musicOneSubjectClassPlan.getApplyStudentNum();
+				musicOneSubjectClassPlan.setApplyStudentNum(num + applyNum);
+				musicOneSubjectClassPlan.setPaidStudentNum((musicOneSubjectClassPlan.getPaidStudentNum() == null ? 0 : musicOneSubjectClassPlan
+						.getPaidStudentNum()) + entry.getValue().intValue());
+				if(freeFlag){
+					musicOneSubjectClassPlan.setPaidZeroNum((musicOneSubjectClassPlan.getPaidZeroNum() == null ? 0 : musicOneSubjectClassPlan.getPaidZeroNum())
+							+ entry.getValue().intValue());
+				}
+				musicOneSubjectClassPlan.setUpdateTime(now);
+				musicGroupSubjectPlanDao.update(musicOneSubjectClassPlan);
+			}
+			// 更新实际缴费人数
+			if (calender.getActualNum() == null) {
+				calender.setActualNum(allList.size());
+			} else {
+				calender.setActualNum(calender.getActualNum() + allList.size());
+			}
+			if (calender.getExpectNum() == null) {
+				calender.setExpectNum(allList.size());
+			} else {
+				calender.setExpectNum(calender.getExpectNum() + allList.size());
+			}
+			calender.setUpdateTime(now);
+			musicGroupPaymentCalenderDao.update(calender);
+		}
+	}
+
 	@Override
     @Transactional(rollbackFor = Exception.class)
     public String createGroup(SubFeeSettingDto subFeeSettingDto) {
@@ -656,7 +826,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         //记录操作日志
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "预报名完成(预报名 -> 报名缴费中)", sysUser.getId(), ""));
-        
+
         studentRegistrationDao.musicGroupOpenPay(musicGroupId, PaymentStatusEnum.OPEN);
         MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
         if (regCalender != null && regCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)) {
@@ -959,6 +1129,78 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return BaseController.succeed(payMap);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importRenew(List<MusicGroupPaymentImportDto> importDtos) throws Exception {
+        Map<String, List<MusicGroupPaymentImportDto>> dtoMap = importDtos.stream().collect(Collectors.groupingBy(e -> e.getBatchNo()));
+        Date now = new Date();
+        for (String batchNo : dtoMap.keySet()) {
+            List<MusicGroupPaymentCalender> byBatchNo = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+            if(CollectionUtils.isEmpty(byBatchNo)){
+                throw new BizException("缴费项目批次{}不存在",batchNo);
+            }
+			MusicGroupPaymentCalender calender = byBatchNo.get(0);
+			if(calender.getPayUserType() == SCHOOL){
+				throw new BizException("不支持学校缴费导入");
+			}
+			if(calender.getPaymentType() != MUSIC_RENEW && calender.getPaymentType() != ADD_COURSE && calender.getPaymentType() != MUSIC_APPLY){
+				throw new BizException("不支持类型 {} 的缴费项目导入",calender.getPaymentType().getDesc());
+			}
+			if(calender.getPaymentType() == MUSIC_APPLY){
+				this.importStudentToMusicGroup1(importDtos,calender);
+			}else {
+				Long calenderId = calender.getId();
+				List<MusicGroupPaymentImportDto> userDtoList = dtoMap.get(batchNo);
+				List<MusicGroupPaymentCalenderDetail> detailList = musicGroupPaymentCalenderDetailDao.getCalenderDetailWithCalender(calenderId);
+				Map<Integer, MusicGroupPaymentCalenderDetail> detailMap = detailList.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+				for (MusicGroupPaymentImportDto userDto : userDtoList) {
+					MusicGroupPaymentCalenderDetail calenderDetail = detailMap.get(userDto.getUserId());
+					if(Objects.isNull(calenderDetail)){
+						throw new BizException("缴费项不存在学员{},请检查导入Excel",userDto.getUserId());
+					}
+					if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
+						throw new BizException("学员{}已缴费,请勿重复录入",userDto.getUserId());
+					}
+				}
+				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+				MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberDao.findByCalenderId(calenderId);
+				MusicGroupPaymentCalenderRepair calenderRepair = musicGroupPaymentCalenderRepairDao.findByCalenderId(calenderId);
+				List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityDao.findByCalenderId(calenderId);
+				List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.queryCalenderCourseSettings(calenderId);
+				for (MusicGroupPaymentImportDto userDto : userDtoList) {
+					String orderNo = idGeneratorService.generatorId("payment") + "";
+					StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+					studentPaymentOrder.setExpectAmount(calender.getCurrentTotalAmount());
+					studentPaymentOrder.setActualAmount(calender.getCurrentTotalAmount());
+					studentPaymentOrder.setCouponRemitFee(BigDecimal.ZERO);
+					studentPaymentOrder.setGroupType(GroupType.OUTORDER);
+					studentPaymentOrder.setUserId(userDto.getUserId());
+					studentPaymentOrder.setOrderNo(orderNo);
+					studentPaymentOrder.setType(OrderTypeEnum.RENEW);
+					studentPaymentOrder.setStatus(SUCCESS);
+					studentPaymentOrder.setMusicGroupId(calender.getMusicGroupId());
+					studentPaymentOrder.setBatchNo(calenderId + "");
+					studentPaymentOrder.setCreateTime(now);
+					studentPaymentOrder.setUpdateTime(now);
+					studentPaymentOrder.setVersion(0);
+					studentPaymentOrder.setCalenderId(calenderId);
+					studentPaymentOrder.setOrganId(calender.getOrganId());
+					studentPaymentOrder.setRoutingOrganId(calender.getOrganId());
+					studentPaymentOrder.setMemo("缴费项目外部订单导入");
+					studentPaymentOrder.setMerNos(userDto.getMerNos());
+					studentPaymentOrder.setTransNo(userDto.getTransNo());
+					studentPaymentOrder.setPayTime(userDto.getPayTime());
+					studentPaymentOrderDao.insert(studentPaymentOrder);
+					StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(studentPaymentOrder.getUserId(), calender.getMusicGroupId());
+					//支付成功后处理课程、云教练、活动等数据
+					List<StudentPaymentOrderDetail> orderDetails = studentRegistrationService.addOrder1(studentPaymentOrder, calender, courseSettings, calenderMember, calenderRepair, calenderActivities);
+					studentPaymentRouteOrderService.addRouteOrder(orderNo, calender.getOrganId(), calender.getCurrentTotalAmount());
+					studentPaymentOrderDetailService.addOrderDetailTo1(studentPaymentOrder, musicGroup, studentRegistration,orderDetails);
+				}
+			}
+        }
+    }
+
     private MusicGroupApplyGoodsDto getCalenderTotalAmount(RegisterPayDto registerPayDto, MusicGroupPaymentCalender calender) {
 
     	String musicGroupId = calender.getMusicGroupId();
@@ -1082,10 +1324,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult pay(RegisterPayDto registerPayDto) throws Exception {
-    	
+
     	Integer userId = registerPayDto.getUserId();
     	String musicGroupId = registerPayDto.getMusicGroupId();
-    	
+
         //判断用户是否已存在订单
         List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.ING);
         if (CollectionUtils.isNotEmpty(applyOrderList)) {
@@ -1107,7 +1349,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup == null) {
             throw new BizException("查询乐团信息失败");
         }
-        
+
         SubjectChange subjectChange = subjectChangeDao.getStudentLastChange(userId, musicGroupId);
         if(subjectChange != null){
         	throw new BizException("您已做过声部更换操作,不能继续缴费");
@@ -1250,6 +1492,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return BaseController.succeed(payMap);
     }
 
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateSubjectInfo(SubFeeSettingDto subFeeSettingDto) throws Exception {
@@ -1315,19 +1558,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         		throw new BizException("分部信息查询失败");
         	}
         	BigDecimal maxProfits = organ.getMaxMusicalInstrumentsProfits();
-        	
+
             for (MusicGroupSubjectGoodsGroup musicGroupSubjectGoodsGroup : subFeeSettingDto.getMusicGroupSubjectGoodsGroups()) {
                 if (musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT) && (musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson() == null
                         || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().isEmpty()
                         || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
                     throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                 }
-                
+
                 //判断分润是否超过最大值
                 if(musicGroupSubjectGoodsGroup.getOrganShareProfit() != null && maxProfits.compareTo(musicGroupSubjectGoodsGroup.getOrganShareProfit()) < 0){
                 	throw new BizException("超过了分润最大金额[{}],请重新设置分润金额", maxProfits.doubleValue());
                 }
-                
+
                 if (musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee() == null) {
                     musicGroupSubjectGoodsGroup.setGroupRemissionCourseFee(0);
                 }
@@ -1438,12 +1681,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("用户信息获取失败");
         }
         Date date = new Date();
-        
+
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团信息不存在");
         }
-        
+
         if (musicGroup.getStatus() != MusicGroupStatusEnum.DRAFT && musicGroup.getStatus() != MusicGroupStatusEnum.AUDIT_FAILED) {
             throw new BizException("当前乐团状态不支持此操作");
         }
@@ -1457,23 +1700,23 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroup.setStatus(MusicGroupStatusEnum.AUDIT);
         musicGroup.setUpdateTime(date);
         musicGroupDao.update(musicGroup);
-        
+
         List<PaymentCalenderStatusEnum> statusList = new ArrayList<MusicGroupPaymentCalender.PaymentCalenderStatusEnum>();
         statusList.add(PaymentCalenderStatusEnum.DRAFT);
         //修改乐团报名缴费项目状态
         List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(musicGroupId, statusList, null);
-        
+
         if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0) {
         	throw new BizException("请先创建缴费项目");
         }
-        
+
         musicGroupPaymentCalenderList.forEach(t -> {
         	t.setStatus(PaymentCalenderStatusEnum.AUDITING);
         	t.setUpdateTime(date);
         });
-        
+
         musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
-        
+
         sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
                 null, null, MessageTypeEnum.BACKSTAGE_CREATE_MUSIC_GROUP_APPLY, sysUser.getRealName(), musicGroup.getName());
     }
@@ -1495,9 +1738,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getStatus() != MusicGroupStatusEnum.AUDIT) {
             throw new BizException("当前乐团状态不支持此操作");
         }
-        
+
         Date date = new Date();
-        
+
         //记录操作日志
         if (musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT){
         	musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "乐团审核失败(审核中 -> 审核失败)", sysUser.getId(), memo));
@@ -1505,40 +1748,40 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroup.setMemo(memo);
             musicGroup.setUpdateTime(date);
             musicGroupDao.update(musicGroup);
-            
+
             List<PaymentCalenderStatusEnum> statusList = new ArrayList<MusicGroupPaymentCalender.PaymentCalenderStatusEnum>();
             statusList.add(PaymentCalenderStatusEnum.AUDITING);
             //修改乐团报名缴费项目状态
             List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(musicGroupId, statusList, null);
-            
+
             musicGroupPaymentCalenderList.forEach(t -> {
             	t.setStatus(PaymentCalenderStatusEnum.DRAFT);
             	t.setUpdateTime(date);
             });
-            
+
             musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
-            
+
         }else if(musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT){
         	musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "乐团审核失败(费用审核中 -> 费用审核失败)", sysUser.getId(), memo));
         	List<PaymentCalenderStatusEnum> statusList = new ArrayList<MusicGroupPaymentCalender.PaymentCalenderStatusEnum>();
             statusList.add(PaymentCalenderStatusEnum.AUDITING);
             //修改乐团报名缴费项目状态
             List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(musicGroupId, statusList, null);
-            
+
             musicGroupPaymentCalenderList.forEach(t -> {
             	t.setStatus(PaymentCalenderStatusEnum.REJECT);
             	t.setUpdateTime(date);
             	t.setMemo(memo);
             });
-            
+
             musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
-            
+
             //修改乐团状态
             musicGroup.setStatus(MusicGroupStatusEnum.FEE_AUDIT_FAILED);
             musicGroup.setUpdateTime(date);
             musicGroupDao.update(musicGroup);
         }
-        
+
     }
 
     @Override
@@ -1558,9 +1801,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup.getStatus() != MusicGroupStatusEnum.AUDIT) {
             throw new BizException("当前乐团状态不支持此操作");
         }
-        
+
         Date date = new Date();
-        
+
         if(musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT){
             //记录操作日志
             musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "审核通过(审核中 -> 费用审核中)", sysUser.getId(), ""));
@@ -1568,17 +1811,17 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }else if(musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT){
             musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "审核通过(费用审核中 -> 预报名)", sysUser.getId(), ""));
             musicGroup.setStatus(MusicGroupStatusEnum.PRE_APPLY);
-            
+
 
             List<PaymentCalenderStatusEnum> statusList = new ArrayList<MusicGroupPaymentCalender.PaymentCalenderStatusEnum>();
             statusList.add(PaymentCalenderStatusEnum.AUDITING);
             //修改乐团报名缴费项目状态
             List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(musicGroupId, statusList, null);
-            
+
             if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0){
             	throw new BizException("没有审核中的缴费项目");
             }
-            
+
             musicGroupPaymentCalenderList.forEach(t -> {
                 if (t.getPayUserType() == SCHOOL) {
                     if (t.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) > 0) {
@@ -1595,7 +1838,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 }
             	t.setUpdateTime(date);
             });
-            
+
             musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenderList);
         }
         musicGroup.setUpdateTime(date);
@@ -1931,7 +2174,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderService.findByMusicGroupRegCalender(musicGroup.getId());
         if (regCalender != null && regCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)) {
             regCalender.setDeadlinePaymentDate(expireDate);
-            
+
             //regCalender.setStatus(MusicGroupPaymentCalender.PaymentCalenderStatusEnum.OPEN);
             regCalender.setUpdateTime(date);
             musicGroupPaymentCalenderService.update(regCalender);
@@ -2210,7 +2453,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         Date date = new Date();
-        
+
         Boolean hasRole = employeePositionService.getDao().hasRole("一键退团",reqMusicGroupQuit.getOperatorId(),reqMusicGroupQuit.getTenantId());
 
         //如果发起退团申请的是乐团主管
@@ -2220,7 +2463,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 	            if (!StringUtils.equals(musicGroupQuit.getCurrentApproveRole(), SysUserRoleEnum.EDUCATION.ordinal() + 1 + "")) {
 	                throw new BizException("只有分部经理才能审核");
 	            }
-	
+
 	            if (status == ApprovalStatus.APPROVED) {
 	                throw new BizException("只能分部经理操作退团");
 	            }
@@ -3107,6 +3350,18 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         return false;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public boolean importRenewForCallback(StudentPaymentOrder studentPaymentOrder) throws IOException {
+        Integer userId = studentPaymentOrder.getUserId();
+        String musicGroupId = studentPaymentOrder.getMusicGroupId();
+
+        StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        //支付成功后处理课程、云教练、活动等数据
+        studentPaymentOrderDetailService.addOrderDetailTo(studentPaymentOrder, musicGroup, studentRegistration);
+        return false;
+    }
+
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean updateTeacherCoursesSalary(Long courseScheduleId, Integer teacherId, BigDecimal salary, BigDecimal subsidy, String scope) {
@@ -3735,7 +3990,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("用户信息获取失败");
         }
         String musicGroupId = closeMusicGroupDto.getMusicGroupId();
-        
+
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
@@ -3794,7 +4049,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registrations.size() > 0 && studentRegistrationService.quitAllStudent(musicGroup.getId(), "退团(乐团关闭)") <= 0) {
             throw new BizException("处理学生退团失败,请重试");
         }*/
-        
+		//完结所有未处理的退团审批
+		musicGroupQuitDao.finish(musicGroup.getId());
+
         //清除剩余未排课时长
         musicGroupPaymentStudentCourseDetailService.clearRemainCourseMinutesByMusicGroupId(musicGroupId);
 
@@ -3872,7 +4129,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean confirmDelivery(Integer userId, MusicGroupDeliveryVo musicGroupDeliveryVo) {
-    	
+
     	String musicGroupId = musicGroupDeliveryVo.getMusicGroupId();
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -3881,24 +4138,24 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         Date date = new Date();
-        
+
         String deliveryBatchNo = idGeneratorService.generatorId("delivery") + "";
-        
+
         //更新订单的发货状态(包括声部更换)
         List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = studentPaymentOrderDetailDao.querySubjectChangeByMusicGroupId(musicGroupId);
         if(studentPaymentOrderDetailList == null){
         	studentPaymentOrderDetailList = new ArrayList<StudentPaymentOrderDetail>();
         }
-        
+
         List<StudentPaymentOrderDetail> studentPaymentOrderDetailList1 = studentPaymentOrderDetailDao.findApplyOrderSuccess(musicGroupId, DealStatusEnum.SUCCESS, 0);
         if(studentPaymentOrderDetailList1 != null && studentPaymentOrderDetailList1.size() > 0){
         	studentPaymentOrderDetailList.addAll(studentPaymentOrderDetailList1);
         }
-        
+
         if(studentPaymentOrderDetailList == null || studentPaymentOrderDetailList.size() == 0){
         	throw new BizException("没有商品信息,不能发货");
         }
-        
+
         studentPaymentOrderDetailList.forEach(t -> {
         	t.setDeliveryBatchNo(deliveryBatchNo);
         	t.setUpdateTime(date);
@@ -3906,7 +4163,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if(studentPaymentOrderDetailList.size() > 0){
         	studentPaymentOrderDetailDao.batchUpdate(studentPaymentOrderDetailList);
         }
-        
+
         List<SubjectChange> subjectChangeList = subjectChangeDao.queryWaitDeliveryList(musicGroupId);
         subjectChangeList.forEach(t -> {
         	t.setDeliveryBatchNo(deliveryBatchNo);
@@ -3923,7 +4180,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         	List<Long> instrumentIdList = maintenanceList.stream().map(t -> t.getStudentInstrumentId()).collect(Collectors.toList());
 
             List<StudentInstrument> studentInstrumentList = studentInstrumentDao.queryById(instrumentIdList);
-            
+
             MusicGroupPaymentCalenderRepair musicGroupPaymentCalenderRepair = musicGroupPaymentCalenderRepairDao.findByCalenderId(maintenanceList.get(0).getMusicGroupPaymentCalenderId());
 
             List<StudentInstrument> updateList = new ArrayList<StudentInstrument>();
@@ -3957,7 +4214,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         dr.setMusicGroupShippingAddressId(musicGroupDeliveryVo.getAddressId());
         dr.setOperatorUserId(userId);
         dr.setUpdateTime(date);
-        
+
         musicGroupDeliveryRecordDao.insert(dr);
 
         return true;
@@ -3990,4 +4247,48 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     public List<Subject> getSubjectListByIdAndCoopId(String musicGroupId, Integer coopId) {
         return subjectDao.getSubjectListByIdAndCoopId(musicGroupId,coopId);
     }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public List<String> importMusicGroupPayment(MultipartFile file) throws Exception{
+        Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+        InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+        Map<String, String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.MUSIC_GROUP_PAYMENT_IMPORT.getMsg());
+        List<MusicGroupPaymentImportDto> importDtos = new ArrayList<>();
+        List<String> errMsg = new ArrayList();
+        for (String sheetName : sheetsListMap.keySet()) {
+            List<Map<String, Object>> sheet = sheetsListMap.get(sheetName);
+            for (int i = 0; i < sheet.size(); i++) {
+                Map<String, Object> row = sheet.get(i);
+                if (row.size() == 0) {
+                    continue;
+                }
+                JSONObject objectMap = new JSONObject();
+                valueIsNull: for (String s : row.keySet()) {
+                    String columnValue = columns.get(s);
+                    if (StringUtils.isEmpty(columnValue)) {
+                        continue;
+                    }
+                    if (null == row.get(s)) {
+                        continue;
+                    }
+                    objectMap.put(columnValue, row.get(s));
+                }
+                try {
+                    MusicGroupPaymentImportDto cost = JSONObject.parseObject(objectMap.toJSONString(), MusicGroupPaymentImportDto.class);
+                    importDtos.add(cost);
+                } catch (Exception ex) {
+                    throw new BizException("导入数据出错", ex);
+                }
+            }
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(errMsg)) {
+            return errMsg;
+        }
+        if(!org.springframework.util.CollectionUtils.isEmpty(importDtos)){
+            this.importRenew(importDtos);
+        }
+        return null;
+    }
+
 }

+ 31 - 187
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportNewServiceImpl.java

@@ -6,10 +6,12 @@ import com.ym.mec.biz.dal.dao.OperatingReportNewDao;
 import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
 import com.ym.mec.biz.dal.dto.HumanTypeDto;
 import com.ym.mec.biz.dal.dto.OASummaryExpensesDto;
+import com.ym.mec.biz.dal.dto.OperatingTotalIncomeDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.OperatingReportNew;
 import com.ym.mec.biz.dal.entity.VipGroupCategory;
 import com.ym.mec.biz.service.OperatingReportNewService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
@@ -34,6 +36,8 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 	private OperatingReportCloudDao operatingReportCloudDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Override
 	public BaseDAO<Integer, OperatingReportNew> getDAO() {
@@ -45,184 +49,13 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
         return operatingReportNewDao;
     }
 
-
-	@Transactional(rollbackFor = Exception.class)
-	public void operatingReportMonth1(Date month) {
-		String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-		String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-		String currentMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_MONTH_FORMAT);
-		String currentYear = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_FORMAT);
-		operatingReportNewDao.deleteByMonth(currentMonth);
-		List<OperatingReportNew> operatingList = operatingReportNewDao.initOperatingReport(currentMonth);
-		//更新团体云教练计费时间()
-		operatingReportNewDao.initCloudStartTime(lastDayOfMonth);
-		//标记缴费项目为已结算(已排课,并且在上个月有关联的课程)
-		operatingReportCloudDao.settlementCalender(currentMonth);
-		//标记当月结算的缴费项目(缴费项目结算后缴费、或者进行中加学员的都算当月结算)
-		operatingReportCloudDao.settlementCurrentCalender(currentMonth);
-		//分部销售收入、销售成本
-		List<OperatingReportNew> sellList = operatingReportNewDao.sumSellAmount(currentMonth);
-		Map<Integer, OperatingReportNew> collect = sellList.stream().collect(Collectors.groupingBy(OperatingReportNew::getOrganId,Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));
-		//服务收入
-		//导入的服务收入  (全部记录为课程收入)
-		Map<Integer, BigDecimal> collect24 = MapUtil.convertIntegerMap(operatingReportNewDao.sumImportServerOrderAmount(currentMonth));
-		//1、调整student_registration表surplus_course_fee_字段,原有逻辑是用于保存学员已缴费,但是未排课的总乐团课程费用。在课程结束后按课程预计金额分摊到课程实际收入。
-		// 现在需要新增逻辑,记录免费团溢出的乐器课费、以及云教练团溢出的课费。用于在课程结束后计算实际课费,涉及到乐团缴费项目、支付回调
-
-		//2、music_group_payment_calender_course_settings表新增字段,用于记录 云教练、乐器溢出的课程费用,在排课时用于计算预计课费、涉及到降费项目创建、报名支付回调
-
-		//3、course_schedule表新增字段 标记课程是否结算经营报表,用于年底确认经营报表收入、或者已结束调整到未开始,涉及到所有的排课、调整、合班、合课逻辑
-
-		//4、课程调整逻辑修改、已结算经营报表的课程不允许调整(需要合业务部门确认)。如果可以调整,需要在course_schedule_student_payment 表新增结算金额,用于记录已结算的金额,在下次结算时去单独计算。
-
-		//5、初始化历史云教练缴费数据,按课程数量和课费总额比例计算,已排课的初始化预计金额、已缴费的初始化实际金额、以及部分排课数据初始化
-
-		//6、云教练按月计算收入,只计算配置金额,溢出的部分分配给课程
-		//云教练赠送课程实际收入
-//		Map<Integer, BigDecimal> collect1 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCourseAmount(firstDayOfMonth,lastDayOfMonth));
-		//亏损的云教练算到当月实际收入
-//		Map<Integer, BigDecimal> collect22 = MapUtil.convertIntegerMap(operatingReportNewDao.sumLossCloudAmount(currentMonth));
-		//付费课程实际收入
-		Map<Integer, BigDecimal> collect2 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCourseAmount(firstDayOfMonth,lastDayOfMonth,currentYear));
-		//获取分部学员管理费(每个在读学员80块,算分部成本,总部收入)
-		Map<Integer, BigDecimal> studentManagementFeeMap = MapUtil.convertIntegerMap(operatingReportNewDao.sumStudentManagementFee());
-
-
-		//个人云教练当月收入
-		Map<Integer, BigDecimal> collect3 = MapUtil.convertIntegerMap(operatingReportNewDao.sumPersonalCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
-		//团体云教练费用
-		Map<Integer, BigDecimal> collect4 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
-		//团体云教练当月一次性结转
-		Map<Integer, BigDecimal> collect5 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupAmount(currentMonth));
-
-		//乐保实收
-		Map<Integer, BigDecimal> collect26 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMaintenanceAmount(currentMonth));
-
-		//业务退费
-		Map<Integer, BigDecimal> collect6 = MapUtil.convertIntegerMap(operatingReportNewDao.sumRefundAmount(currentMonth));
-		//变动费用
-		Map<Integer, BigDecimal> collect7 = MapUtil.convertIntegerMap(operatingReportNewDao.sumVariableCosts(currentMonth));
-		//固定费用
-		Map<Integer, BigDecimal> collect8 = MapUtil.convertIntegerMap(operatingReportNewDao.sumFixedCosts(currentMonth));
-		//内部结算
-		Map<Integer, BigDecimal> collect18 = MapUtil.convertIntegerMap(operatingReportNewDao.sumInternalSettlement(currentMonth));
-
-		//云教练预收款
-		//个人云教练预收款
-		Map<Integer, BigDecimal> collect9 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudPreAmount(currentMonth,lastDayOfMonth));
-		//团体云教练预收款
-		Map<Integer, BigDecimal> collect10 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupCloudPreAmount(currentMonth,lastDayOfMonth));
-		//未生效云教练预收款
-		Map<Integer, BigDecimal> collect25 = MapUtil.convertIntegerMap(operatingReportNewDao.sumWaitCloudPreAmount());
-		//已排课但是课程未开始的云教练预收
-		Map<Integer, BigDecimal> collect27 = MapUtil.convertIntegerMap(operatingReportNewDao.sumNotStartCloudPreAmount());
-
-		//课程预收
-		//云教练赠课预收
-//		Map<Integer, BigDecimal> collect11 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCoursePreAmount(lastDayOfMonth));
-		//云教练赠送,未排课排课资格预收
-		//获取categoryId
-		VipGroupCategory category = vipGroupCategoryDao.getTheory();
-		Map<Integer, BigDecimal> collect20 = MapUtil.convertIntegerMap(operatingReportNewDao.sumActivityUserMapperAmount(category.getId()));
-		//付费课程预收
-		Map<Integer, BigDecimal> collect12 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCoursePreAmount(lastDayOfMonth));
-		//付费团未排乐团课程预收(学员缴费)
-		Map<Integer, BigDecimal> collect21 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMusicCourseAmount());
-		//排课资格预收
-		Map<Integer, BigDecimal> collect23 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSubActivityUserMapperAmount());
-
-		//销售预收
-		Map<Integer, BigDecimal> collect13 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSalePreAmount());
-
-		//其他预收
-		Map<Integer, BigDecimal> collect14 = MapUtil.convertIntegerMap(operatingReportNewDao.sumOtherPreAmount());
-
-		//预付款
-		//房租
-		Map<Integer, BigDecimal> collect19 = MapUtil.convertIntegerMap(operatingReportNewDao.sumPrepayments(currentMonth));
-
-		//应收
-		//欠费学员总金额
-		Map<Integer, BigDecimal> collect15 = MapUtil.convertIntegerMap(operatingReportNewDao.sumArrearsAmount());
-		//学校缴费订单待收款金额
-		Map<Integer, BigDecimal> collect16 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSchoolAmount());
-
-		//应付(乐器押金)
-		List<Map<Integer, BigDecimal>> maps = operatingReportNewDao.sumMusicMargin();
-		Map<Integer, BigDecimal> collect17 = MapUtil.convertIntegerMap(maps);
-
-		for (OperatingReportNew operatingReportNew : operatingList) {
-			Integer organId = operatingReportNew.getOrganId();
-			OperatingReportNew reportNew = collect.get(organId);
-			if(Objects.nonNull(reportNew)){
-				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
-				operatingReportNew.setSaleCost(reportNew.getSaleCost());
-			}
-			operatingReportNew.setStudentManagementFee(studentManagementFeeMap.get(organId));
-			operatingReportNew.setCourseAmount(getAmount(collect2.get(organId)));
-//			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect2.get(organId))));
-			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect24.get(organId))));
-
-			operatingReportNew.setCloudAmount(getAmount(collect3.get(organId)));
-			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect4.get(organId))));
-			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect5.get(organId))));
-//			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect22.get(organId))));
-
-			operatingReportNew.setMaintenanceAmount(getAmount(collect26.get(organId)));
-			operatingReportNew.setBusinessRefund(getAmount(collect6.get(organId)));
-
-			operatingReportNew.setServiceAmount(operatingReportNew.getCloudAmount().add(operatingReportNew.getCourseAmount()).add(operatingReportNew.getMaintenanceAmount()));
-			operatingReportNew.setTotalIncome(operatingReportNew.getSaleAmount().add(operatingReportNew.getServiceAmount()).subtract(operatingReportNew.getBusinessRefund()));
-
-			operatingReportNew.setInternalSettlement(getAmount(collect18.get(organId)));
-			operatingReportNew.setVariableCosts(getAmount(collect7.get(organId)));
-			//固定费用
-			operatingReportNew.setFixedCosts(getAmount(collect8.get(organId)));
-			//成本合计
-			operatingReportNew.setTotalCost(operatingReportNew.getInternalSettlement().
-					add(operatingReportNew.getFixedCosts()).
-					add(operatingReportNew.getVariableCosts()).
-					add(operatingReportNew.getStudentManagementFee()));
-
-			operatingReportNew.setCloudPrepaidFee(getAmount(collect9.get(organId)).
-					add(getAmount(collect10.get(organId))).
-					add(getAmount(collect27.get(organId))).
-					add(getAmount(collect25.get(organId))));
-			operatingReportNew.setCoursePrepaidFee(getAmount(collect12.get(organId)).
-					add(getAmount(collect20.get(organId))).add(getAmount(collect21.get(organId))).add(getAmount(collect23.get(organId))));
-			operatingReportNew.setSalePrepaidFee(getAmount(collect13.get(organId)));
-			operatingReportNew.setOtherPrepaidFee(getAmount(collect14.get(organId)));
-			operatingReportNew.setPrepaidFee(operatingReportNew.getCloudPrepaidFee().
-					add(operatingReportNew.getSalePrepaidFee()).
-					add(operatingReportNew.getOtherPrepaidFee()).
-					add(operatingReportNew.getCoursePrepaidFee()));
-
-			operatingReportNew.setReceivables(getAmount(collect15.get(organId)).add(getAmount(collect16.get(organId))));
-			operatingReportNew.setPayable(getAmount(collect17.get(organId)));
-
-			operatingReportNew.setPrepayments(getAmount(collect19.get(organId)));
-
-			operatingReportNew.setQuasiDiscretionaryProfit(operatingReportNew.getTotalIncome().subtract(operatingReportNew.getTotalCost()));
-		}
-		//计算总部经营报表
-		OperatingReportNew operatingReportNew = new OperatingReportNew();
-		operatingReportNew.setOrganName("总部");
-		operatingReportNew.setStudentManagementFee(operatingList.stream().map(e->e.getStudentManagementFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		OperatingReportNew totalSellAmount = operatingReportNewDao.sumTotalSellAmount(currentMonth);
-		operatingReportNew.setSaleAmount(totalSellAmount.getSaleAmount());
-		operatingReportNew.setSaleCost(totalSellAmount.getSaleCost());
-		operatingReportNewDao.batchInsert(operatingList);
-		//将本月乐团课标记为已结算
-		courseScheduleDao.makeSettlementReport(currentMonth);
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void operatingReportMonth(Date month) {
-		String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+//		String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
 		String currentMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_MONTH_FORMAT);
-		String currentYear = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_FORMAT);
+//		String currentYear = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_FORMAT);
 		operatingReportNewDao.deleteByMonth(currentMonth);
 		List<OperatingReportNew> operatingList = operatingReportNewDao.initOperatingReport(currentMonth);
 		//更新团体云教练计费时间()
@@ -231,11 +64,16 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		operatingReportCloudDao.settlementCalender(currentMonth);
 		//标记当月结算的缴费项目(缴费项目结算后缴费、或者进行中加学员的都算当月结算)
 		operatingReportCloudDao.settlementCurrentCalender(currentMonth);
-		//分部销售收入、销售成本
+		//分部销售成本
 		List<OperatingReportNew> sellList = operatingReportNewDao.sumSellAmount(currentMonth);
 		Map<Integer, OperatingReportNew> collect = sellList.stream().collect(Collectors.groupingBy(OperatingReportNew::getOrganId,Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));
+		//分部销售收入
+		Map<String, Object> paramMap = new HashMap<>(1);
+		paramMap.put("month",currentMonth);
+		List<OperatingTotalIncomeDto> incomeDtos = studentPaymentOrderService.queryOperatingSummaryIncome(paramMap);
+		Map<Integer, OperatingTotalIncomeDto> incomeDtoMap = incomeDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
 		//服务收入
-		//导入的服务收入  (全部记录为课程收入)
+/*		//导入的服务收入  (全部记录为课程收入)
 		Map<Integer, BigDecimal> collect24 = MapUtil.convertIntegerMap(operatingReportNewDao.sumImportServerOrderAmount(currentMonth));
 		//付费课程实际收入
 		Map<Integer, BigDecimal> collect2 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCourseAmount(firstDayOfMonth,lastDayOfMonth,currentYear));
@@ -245,9 +83,9 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		Map<Integer, BigDecimal> collect4 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
 		//团体云教练当月一次性结转
 		Map<Integer, BigDecimal> collect5 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupAmount(currentMonth));
-
 		//乐保实收
-		Map<Integer, BigDecimal> collect26 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMaintenanceAmount(currentMonth));
+		Map<Integer, BigDecimal> collect26 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMaintenanceAmount(currentMonth));*/
+
 		//业务退费
 		Map<Integer, BigDecimal> collect6 = MapUtil.convertIntegerMap(operatingReportNewDao.sumRefundAmount(currentMonth));
 		//变动费用
@@ -255,7 +93,6 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		//固定费用
 		Map<Integer, BigDecimal> collect8 = MapUtil.convertIntegerMap(operatingReportNewDao.sumFixedCosts(currentMonth));
 
-
 		//云教练预收款
 		//个人云教练预收款
 		Map<Integer, BigDecimal> collect9 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudPreAmount(currentMonth,lastDayOfMonth));
@@ -303,9 +140,16 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 
 		for (OperatingReportNew operatingReportNew : operatingList) {
 			Integer organId = operatingReportNew.getOrganId();
+			OperatingTotalIncomeDto incomeDto = incomeDtoMap.get(organId);
+			if(Objects.nonNull(incomeDto)){
+				//销售收入
+				operatingReportNew.setSaleAmount(incomeDto.getSalesIncome());
+				//服务收入
+				operatingReportNew.setServiceAmount(incomeDto.getServiceIncome());
+			}
 			OperatingReportNew reportNew = collect.get(organId);
 			if(Objects.nonNull(reportNew)){
-				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
+//				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
 				operatingReportNew.setSaleCost(reportNew.getSaleCost());
 			}
 			HumanTypeDto humanTypeDto = humanMap.get(organId);
@@ -315,14 +159,14 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 			//业务退费
 			operatingReportNew.setBusinessRefund(getAmount(collect6.get(organId)));
 			//服务收入
-			operatingReportNew.setServiceAmount(
-					getAmount(collect3.get(organId))
-					.add(getAmount(collect2.get(organId)))
-					.add(getAmount(collect4.get(organId)))
-					.add(getAmount(collect5.get(organId)))
-					.add(getAmount(collect24.get(organId)))
-					.add(getAmount(collect26.get(organId)))
-					.add(operatingReportNew.getCourseAmount()));
+//			operatingReportNew.setServiceAmount(
+//					getAmount(collect3.get(organId))
+//					.add(getAmount(collect2.get(organId)))
+//					.add(getAmount(collect4.get(organId)))
+//					.add(getAmount(collect5.get(organId)))
+//					.add(getAmount(collect24.get(organId)))
+//					.add(getAmount(collect26.get(organId)))
+//					.add(operatingReportNew.getCourseAmount()));
 			//收入合计
 			operatingReportNew.setTotalIncome(operatingReportNew.getSaleAmount().add(operatingReportNew.getServiceAmount()).subtract(operatingReportNew.getBusinessRefund()));
 			//内部结算

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

@@ -71,8 +71,6 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
     @Autowired
     private SporadicChargeInfoDao sporadicChargeInfoDao;
     @Autowired
-    private StudentRepairDao studentRepairDao;
-    @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
 
     @Override

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

@@ -132,7 +132,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
         CourseHomework courseHomework = new CourseHomework();
         courseHomework.setId(bean.getCourseHomeworkId());
         courseHomework.setGroupType(courseSchedule.getGroupType());
-        courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
+//        courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
 
         courseHomeworkService.update(courseHomework);
         return insert;
@@ -170,7 +170,7 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 
         CourseHomework courseHomework = courseHomeworkDao.get(bean.getCourseHomeworkId());
         courseHomework.setGroupType(courseSchedule.getGroupType());
-        courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
+//        courseHomework.setCompletedNum(studentCourseHomeworkDao.countCompletedStudentNum(bean.getCourseHomeworkId()));
         courseHomeworkService.update(courseHomework);
         studentServeService.updateExercisesSituation(courseSchedule.getMusicGroupId(), courseSchedule.getClassDate(), new ArrayList<>(Arrays.asList(bean.getUserId())), courseSchedule.getTeacherId());
 

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

@@ -79,6 +79,7 @@ public class StudentLessonTrainingDetailServiceImpl extends ServiceImpl<StudentL
      */
     @Override
     public List<StudentLessonTrainingDetail> homeWorkDetail(List<StudentLessonTrainingDetailWrapper.AddStudentLessonTrainingDetail> detailList, List<Integer> userIdList,Long homeworkId,ELessonTrainingType type) {
+        log.info("将作业标准 转换为 需要的作业详情 {},{}", detailList, userIdList);
         // 保存作业标准
         if (CollectionUtils.isEmpty(detailList) || CollectionUtils.isEmpty(userIdList)) {
             return new ArrayList<>();

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentMemberUpdateLogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.StudentMemberUpdateLogDao;
+import com.ym.mec.biz.dal.entity.StudentMemberUpdateLog;
+import com.ym.mec.biz.service.StudentMemberUpdateLogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 学员云教练时长修改记录(StudentMemberUpdateLog)表服务实现类
+ *
+ * @author zx
+ * @since 2023-05-17 11:13:44
+ */
+@Service("studentMemberUpdateLogService")
+public class StudentMemberUpdateLogServiceImpl extends ServiceImpl<StudentMemberUpdateLogDao, StudentMemberUpdateLog> implements StudentMemberUpdateLogService {
+
+    private final static Logger log = LoggerFactory.getLogger(StudentMemberUpdateLogServiceImpl.class);
+
+    @Override
+    public StudentMemberUpdateLogDao getDao(){
+            return this.baseMapper;
+    }
+
+}
+

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

@@ -754,6 +754,105 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addOrderDetailTo1(StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup,
+                                  StudentRegistration studentRegistration,List<StudentPaymentOrderDetail> allDetails) {
+        //SurplusCourseFee
+        Integer userId = studentPaymentOrder.getUserId();
+        Integer tenantId = studentPaymentOrder.getTenantId();
+        BigDecimal courseFee = allDetails.stream().filter(o -> !(o.getType() == MUSICAL)
+                        && !(o.getType() == VIP)
+                        && !(o.getType() == PRACTICE)
+                        && !(o.getType() == MAINTENANCE)
+                        && !(o.getType() == CLOUD_TEACHER)
+                        && !(o.getType() == CLOUD_TEACHER_PLUS)
+                        && !(o.getType() == ORGAN_SHARE_PROFIT)
+                        && !(o.getType() == ACCESSORIES))
+                .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        if (studentRegistration.getTemporaryCourseFee() != null) {
+            studentRegistration.setTemporaryCourseFee(BigDecimal.ZERO);
+        }
+        studentRegistration.setPaymentStatus(YES);
+        studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+        if (studentPaymentOrder.getClassGroupId() == null || !studentPaymentOrder.getClassGroupId().equals(206)) {
+            studentRegistration.setPayingStatus(0);
+        }
+        if (courseFee.compareTo(BigDecimal.ZERO) > 0) {
+            //累加充值金额
+            studentRegistration.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(courseFee));
+            //添加日志
+            StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+            studentCourseFeeDetail.setTenantId(tenantId);
+            studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
+            studentCourseFeeDetail.setAmount(courseFee);
+            studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee());
+            studentCourseFeeDetail.setMemo("乐团缴费充值");
+            studentCourseFeeDetail.setOperator(userId);
+            studentCourseFeeDetailDao.insert(studentCourseFeeDetail);
+        }
+        List<OrderDetailTypeEnum> detailTypeEnums = allDetails.stream().map(StudentPaymentOrderDetail::getType).collect(Collectors.toList());
+        //学生云教练处理
+        if (detailTypeEnums.contains(CLOUD_TEACHER) && studentPaymentOrder.getType() == OrderTypeEnum.APPLY) {
+            studentRegistration.setHasCloudTeacher(1);
+        }
+        studentRegistrationDao.update(studentRegistration);
+
+        //缴费项目详情
+        MusicGroupPaymentCalenderDetail paymentCalenderDetail = musicGroupPaymentCalenderDetailService.addCalenderDetail(studentPaymentOrder);
+
+        //活动小课包处理
+        List<StudentPaymentOrderDetail> activity = allDetails.stream().filter(o -> o.getType() == PRACTICE || o.getType() == VIP).collect(Collectors.toList());
+        if (activity != null && activity.size() > 0) {
+            activityUserMapperService.addOrderDetail2Activity(studentPaymentOrder, activity);
+        }
+
+        //学生乐器与月保处理
+        if (detailTypeEnums.contains(MUSICAL)) {
+            StudentPaymentOrderDetail musical = allDetails.stream().filter(o -> o.getType() == MUSICAL).findFirst().get();
+            Long studentInstrumentId = studentInstrumentService.addOrderDetail2Instrument(studentPaymentOrder, Integer.valueOf(musical.getGoodsIdList()));
+            if (detailTypeEnums.contains(MAINTENANCE)) {
+                StudentPaymentOrderDetail repair = allDetails.stream().filter(o -> o.getType() == MAINTENANCE).findFirst().get();
+                repair.setStudentInstrumentId(studentInstrumentId);
+                studentPaymentOrderDetailDao.update(repair);
+            }
+        }
+
+        //学生云教练处理
+        if (detailTypeEnums.contains(CLOUD_TEACHER)) {
+            if(studentPaymentOrder.getType() == OrderTypeEnum.APPLY){
+                studentRegistration.setHasCloudTeacher(1);
+                //如果是报名订单,要处理云教练费用、以及溢出课费
+            }
+            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+                //获取云教练溢出费用
+                MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberDao.findByCalenderId(paymentCalenderDetail.getMusicGroupPaymentCalenderId());
+                BigDecimal courseIncome = memberFeeSettingService.getAmount(musicGroup.getOrganId(), 1, calenderMember.getPeriod(),
+                        calenderMember.getNum(), MemberFeeSettingServiceImpl::getIncome);
+                if(calenderMember.getActualAmount().compareTo(courseIncome) > 0){
+                    BigDecimal subtract = calenderMember.getActualAmount().subtract(courseIncome);
+                    //累加充值金额
+                    studentRegistrationDao.updateCourseFee(studentRegistration.getId(),subtract);
+                    //添加日志
+                    StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+                    studentCourseFeeDetail.setTenantId(tenantId);
+                    studentCourseFeeDetail.setStudentRegistrationId(studentRegistration.getId());
+                    studentCourseFeeDetail.setAmount(subtract);
+                    studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().add(subtract));
+                    studentCourseFeeDetail.setMemo("会员团,购买云教练赠送课费");
+                    studentCourseFeeDetail.setOperator(userId);
+                    studentCourseFeeDetailDao.insert(studentCourseFeeDetail);
+                }
+            }
+            BigDecimal cloudTeacherFee = allDetails.stream().filter(o -> o.getType() == CLOUD_TEACHER)
+                    .map(o -> o.getPrice().subtract(o.getRemitFee() == null ? BigDecimal.ZERO : o.getRemitFee()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            cloudTeacherOrderService.addOrderDetail2CloudTeacher(studentPaymentOrder, cloudTeacherFee);
+        }
+    }
+
+    @Override
     public List<StudentPaymentOrderDetail> findByOrderId(Long paymentOrderId) {
         List<StudentPaymentOrderDetail> paymentOrderDetails = studentPaymentOrderDetailDao.findByOrderId(paymentOrderId);
         for (StudentPaymentOrderDetail paymentOrderDetail : paymentOrderDetails) {

+ 454 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -124,7 +124,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private SysPaymentConfigService sysPaymentConfigService;
     @Autowired
     private SellOrderDao sellOrderDao;
-
     @Lazy
     @Autowired
     private ContractService contractService;
@@ -133,11 +132,10 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private StudentDao studentDao;
     @Autowired
-    private StudentPaymentOrderService studentPaymentOrderService;
-
-
-    @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -400,6 +398,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         sysCouponCodeService.quit(order.getCouponCodeId());
     }
 
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateOrder(Map<String, String> rpMap) throws Exception {
         DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
@@ -545,6 +544,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     //        }
 
     //调用相应业务回调接口
+    @Override
     public void callOrderCallBack(StudentPaymentOrder order) throws Exception {
         if(order.getGroupType() == GroupType.ACTIVITY){
             vipGroupActivityService.orderCallback(order);
@@ -584,7 +584,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 memberRankSettingService.liveBuyOrderCallback(order);
             } else if (order.getType().equals(OrderTypeEnum.MALL_BUY)) {
                 // 商城购买订单回调
-                studentPaymentOrderService.mallBuyOrderCallback(order);
+                this.mallBuyOrderCallback(order);
             }
         }
     }
@@ -751,11 +751,15 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     studentRegister.getPayingStatus().equals(2)) {
                 order.setPayingStatus(2);
             }
-            if (order.getOrderDetailList() == null) continue;
+            if (order.getOrderDetailList() == null) {
+                continue;
+            }
             
             BigDecimal organShareProfit = BigDecimal.ZERO;
             for (StudentPaymentOrderDetail studentPaymentOrderDetail : order.getOrderDetailList()) {
-                if (studentPaymentOrderDetail.getGoodsList() == null) continue;
+                if (studentPaymentOrderDetail.getGoodsList() == null) {
+                    continue;
+                }
 
                 String childGoodIds = "";
                 for (Goods goods : studentPaymentOrderDetail.getGoodsList()) {
@@ -1068,6 +1072,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
      *
      * @param param
      */
+    @Override
     public PageInfo<StudentPaymentOrderVo> queryOrder(Map<String, Object> param) throws Exception {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (Objects.isNull(user)) {
@@ -1089,6 +1094,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
      *
      * @param orderNo 订单编号
      */
+    @Override
     public StudentPaymentOrderVo queryOrderDetail(String orderNo) {
         Optional.ofNullable(orderNo)
                 .map(this::findOrderByOrderNo)
@@ -1189,7 +1195,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         BigDecimal balance = BigDecimal.ZERO;
 
         if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
-            StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(model.getOldOrderNo());
+            StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(model.getOldOrderNo());
             if (orderByOrderNo == null) {
                 throw new BizException("未找到原订单");
             }
@@ -1198,7 +1204,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             // 已有订单,先关单
             orderByOrderNo.setStatus(CLOSE);
             orderByOrderNo.setMemo("关闭订单");
-            studentPaymentOrderService.update(orderByOrderNo);
+            this.update(orderByOrderNo);
             //退优惠券
             sysCouponCodeService.quit(orderByOrderNo.getCouponCodeId());
         }
@@ -1226,7 +1232,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrder.setTenantId(student.getTenantId());
-        studentPaymentOrderService.insert(studentPaymentOrder);
+        this.insert(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion());
 
         // 余额支付
@@ -1250,7 +1256,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 }
             }
         }
-        studentPaymentOrderService.update(studentPaymentOrder);
+        this.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
         studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
@@ -1273,7 +1279,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             notifyMap.put("tradeState", "1");
             notifyMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?"0":studentPaymentOrder.getBalancePaymentAmount().toString());
             notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
-            studentPaymentOrderService.updateOrder(notifyMap);
+            this.updateOrder(notifyMap);
             notifyMap.put("orderNo", model.getOrderNo());
             return notifyMap;
         }
@@ -1295,7 +1301,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         payMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?BigDecimal.ZERO:studentPaymentOrder.getBalancePaymentAmount());
         studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
-        studentPaymentOrderService.update(studentPaymentOrder);
+        this.update(studentPaymentOrder);
         payMap.put("mallCouponAmount",studentPaymentOrder.getCouponRemitFee() == null?BigDecimal.ZERO:studentPaymentOrder.getCouponRemitFee());
         payMap.put("mallStatus",1);
         return payMap;
@@ -1307,7 +1313,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         Date nowDate = new Date();
         //更新订单信息
         studentPaymentOrder.setUpdateTime(nowDate);
-        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        int updateCount = this.update(studentPaymentOrder);
         if (updateCount <= 0) {
             throw new BizException("订单更新失败");
         }
@@ -1429,7 +1435,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 }
             }
             // 完全余额支付 不生成下面的记录
-            if (BigDecimal.ZERO.compareTo(studentPaymentOrder.getActualAmount()) == 0) return;
+            if (BigDecimal.ZERO.compareTo(studentPaymentOrder.getActualAmount()) == 0) {
+                return;
+            }
 
             //插入交易明细
             BigDecimal amount = studentPaymentOrder.getActualAmount();
@@ -1470,6 +1478,128 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Override
     @Transactional
+    public void mallBuyOrderCallback1(Long orderId) {
+        StudentPaymentOrder studentPaymentOrder = this.get(orderId);
+
+        Integer userId = studentPaymentOrder.getUserId();
+
+        Map<Integer, String> map = new HashMap<>();
+        map.put(userId, userId.toString());
+
+            try {
+                contractService.transferProduceContract(userId, null, studentPaymentOrder.getType());
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+            Long paymentOrderId = studentPaymentOrder.getId();
+            Integer organId = studentPaymentOrder.getOrganId();
+            String transNo = studentPaymentOrder.getTransNo();
+            String orderNo = studentPaymentOrder.getOrderNo();
+            BigDecimal balancePaymentAmount = studentPaymentOrder.getBalancePaymentAmount();
+            //解析student_goods_sell字段goodsJson,生成订单详情和sellOrder
+            StudentGoodsSellDto studentGoodsSellDto = studentGoodsSellDao.getStudentGoodsSellDto(studentPaymentOrder.getOrderNo());
+            if(Objects.nonNull(studentGoodsSellDto)){
+                if(StringUtils.isNotEmpty(studentGoodsSellDto.getGoodsJson())){
+                    JSONObject jsonObject = JSON.parseObject(studentGoodsSellDto.getGoodsJson());
+                    String orderItemList = jsonObject.getString("orderItemList");
+                    if(StringUtils.isNotEmpty(orderItemList)){
+                        List<GoodsOrderItemVO> goodsOrderItemVOS = JSON.parseArray(orderItemList, GoodsOrderItemVO.class);
+                        long count = goodsOrderItemVOS.stream().filter(e -> StringUtils.isEmpty(e.getOrderSn())).count();
+                        //如果有空的商品货号,不处理
+                        if(count == 0l){
+                            List<String> productSns = goodsOrderItemVOS.stream().map(e -> e.getProductSn()).distinct().collect(Collectors.toList());
+                            List<Goods> goodsList = goodsDao.findBySns(productSns);
+                            //如果有不匹配的商品货号,不处理
+                            if(CollectionUtils.isEmpty(goodsList) || goodsList.size() < productSns.size()){
+                                return;
+                            }
+                            Map<String, Goods> goodsSnMap = goodsList.stream().collect(Collectors.groupingBy(e -> e.getSn(),
+                                    Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+                            List<StudentPaymentOrderDetail> orderDetails = new ArrayList<>();
+                            List<SellOrder> sellOrders = new ArrayList<>();
+                            BigDecimal subjectBalance = balancePaymentAmount;
+                            for (int i = 0; i < goodsOrderItemVOS.size(); i++) {
+                                GoodsOrderItemVO goodsVo = goodsOrderItemVOS.get(i);
+                                Goods goods = goodsSnMap.get(goodsVo.getProductSn());
+                                for (int j = 0; j < goodsVo.getProductQuantity(); j++) {
+                                    StudentPaymentOrderDetail detail = new StudentPaymentOrderDetail();
+                                    detail.setType(OrderDetailTypeEnum.valueOf(goods.getType() == GoodsType.INSTRUMENT?"MUSICAL":goods.getType().getCode()));
+                                    detail.setGoodsIdList(goods.getId().toString());
+                                    detail.setPrice(goodsVo.getRealAmount());
+                                    detail.setRemitFee(BigDecimal.ZERO);
+                                    detail.setPaymentOrderId(paymentOrderId);
+                                    orderDetails.add(detail);
+                                }
+
+                                BigDecimal totalAmount = goodsVo.getRealAmount().multiply(new BigDecimal(goodsVo.getProductQuantity()));
+                                SellOrder sellOrder = new SellOrder();
+                                sellOrder.setOrganId(organId);
+                                sellOrder.setTransNo(transNo);
+                                sellOrder.setOrderId(paymentOrderId);
+                                sellOrder.setOrderNo(orderNo);
+                                sellOrder.setExpectAmount(totalAmount);
+                                if(goodsOrderItemVOS.size() - 1 == i){
+                                    sellOrder.setBalanceAmount(subjectBalance);
+                                }else {
+                                    //获取比例
+                                    BigDecimal ratioAmount = totalAmount.divide(studentGoodsSellDto.getExpectAmount(), 6, BigDecimal.ROUND_HALF_UP);
+                                    BigDecimal multiply = balancePaymentAmount.multiply(ratioAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                    subjectBalance = subjectBalance.subtract(multiply);
+                                    sellOrder.setBalanceAmount(multiply);
+                                }
+                                sellOrder.setActualAmount(totalAmount.subtract(sellOrder.getBalanceAmount()));
+
+                                AccountType accountType = sysPaymentConfigService.checkAccountType(PaymentChannelEnum.valueOf(studentPaymentOrder.getPaymentChannel()), studentPaymentOrder.getMerNos(), studentPaymentOrder.getTenantId());
+                                GoodsProcurement goodsProcurement = null;
+                                if(StockType.INTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.INTERNAL.equals(accountType))){
+                                    goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
+                                    if(Objects.nonNull(goodsProcurement)){
+                                        goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
+                                    }
+                                }else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
+                                    goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(goods.getId());
+                                    if(Objects.nonNull(goodsProcurement)){
+                                        goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
+                                    }
+                                }
+
+                                //如果有采购清单,初始化总部成本价
+                                if(Objects.nonNull(goodsProcurement)){
+                                    goodsProcurementDao.update(goodsProcurement);
+                                    sellOrder.setBatchNo(goodsProcurement.getBatchNo());
+                                    sellOrder.setSellCost(goodsProcurement.getDiscountPrice());
+                                    Map<String, BigDecimal> CostMap = new HashMap<>();
+                                    CostMap.put("sellCost", goodsProcurement.getDiscountPrice());
+                                    if (Objects.nonNull(goodsProcurement.getAgreeCostPrice())) {
+                                        CostMap.put("SellCost2", goodsProcurement.getAgreeCostPrice());
+                                    }
+                                    sellOrder.setSellCost2(JSON.toJSONString(CostMap));
+                                    sellOrder.setBatchNo(goodsProcurement.getBatchNo());
+                                    sellOrder.setOrganSellCost(goods.getOrganCostPrice());
+                                }
+                                sellOrder.setNum(goodsVo.getProductQuantity());
+                                sellOrder.setUserId(userId);
+                                sellOrder.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
+                                sellOrder.setMerNo(studentPaymentOrder.getMerNos());
+                                sellOrder.setStockType(goods.getStockType());
+                                sellOrder.setAccountType(accountType);
+                                sellOrder.setStatus(SellStatus.NORMAL);
+                                sellOrder.setSellTime(studentPaymentOrder.getPayTime());
+                                sellOrder.setGoodsId(goods.getId());
+                                sellOrder.setGoodsName(goods.getName());
+                                sellOrder.setType(SellTypeEnum.valueOf(goods.getType().getCode()));
+                                sellOrders.add(sellOrder);
+                            }
+                            sellOrderDao.batchInsert(sellOrders);
+                            studentPaymentOrderDetailService.batchAdd(orderDetails);
+                        }
+                    }
+                }
+            }
+    }
+
+    @Override
+    @Transactional
     public void mallSaveOrderInfo(MallCreateOrderModel model) {
 
         StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOrderNo());
@@ -1518,7 +1648,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional
     public BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo) {
 
-        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(orderNo);
         if (orderByOrderNo == null) {
             throw new BizException("为找到订单");
         }
@@ -1547,7 +1677,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional
     public void receive(String orderNo, boolean autoReceive) {
 
-        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(orderNo);
         if (orderByOrderNo == null) {
             return;
         }
@@ -1568,4 +1698,310 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return userCashAccount.getBalance() == null?BigDecimal.ZERO:userCashAccount.getBalance();
     }
+
+    @Override
+    public List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params) {
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.ExportQueryPage1(params);
+        long i = 1;
+        //获取机构费率
+        List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
+                && e.getGroupType() != GroupType.REPLACEMENT
+                && e.getGroupType() != GroupType.PRACTICE
+                && e.getGroupType() != GroupType.SPORADIC
+                && e.getGroupType() != GroupType.MEMBER
+                && e.getGroupType() != GroupType.ACTIVITY
+                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+        Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
+        Map<Long, BigDecimal> childRepairMap = new HashMap<>();
+        if (!org.springframework.util.CollectionUtils.isEmpty(otherOrderIds)) {
+            List<StudentPaymentOrderExportDto> feeByType = sellOrderDao.queryFeeByType(otherOrderIds);
+            feeByTypeMap = feeByType.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
+            childRepairMap = MapUtil.convertIntegerMap(sellOrderDao.queryChildRepair(otherOrderIds));
+        }
+        //阳光、善学、坚韧、做更好的自己
+        List<Integer> organIds = studentPaymentOrderExportDtos.stream().map(e -> e.getOrganId()).distinct().collect(Collectors.toList());
+        Map<Integer, String> userOrganNameMap = this.getMap("organization","id_","name_",organIds,1,Integer.class,String.class);
+        //按分部分组
+        Map<Integer, List<StudentPaymentOrderExportDto>> listMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
+        List<OperatingTotalIncomeDto> incomeDtos = new ArrayList<>();
+        //承担课程的云教练收入
+        String month = params.get("month").toString();
+        String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+
+        String cutMonth = DateUtil.dateToString(DateUtil.addMonths(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT),-1),DateUtil.ISO_YEAR_MONTH_FORMAT);
+        String cutFirstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        String cutLastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        Map<Integer, BigDecimal> groupCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderService.getDao().sumGroupCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
+        //不承担课程的云教练收入
+        Map<Integer, BigDecimal> personalCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderService.getDao().sumPersonalCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
+        List<Map> courseFeeStat = courseScheduleStudentPaymentDao.statCourseFee(cutFirstDayOfMonth,cutLastDayOfMonth);
+        Map<Integer, BigDecimal> courseIncome = courseFeeStat.stream().collect(Collectors.toMap(s -> Integer.parseInt(s.get("key").toString()), s -> BigDecimal.valueOf(Double.parseDouble(s.get("value").toString()))));
+        for (Integer organId : listMap.keySet()) {
+            OperatingTotalIncomeDto incomeDto = new OperatingTotalIncomeDto();
+            incomeDto.setOrganId(organId);
+            incomeDto.setOrganName(userOrganNameMap.get(organId));
+            for (StudentPaymentOrderExportDto row : listMap.get(organId)) {
+                if (row.getActualAmount() == null) {
+                    row.setActualAmount(BigDecimal.ZERO);
+                }
+                if (row.getBalancePaymentAmount() == null) {
+                    row.setBalancePaymentAmount(BigDecimal.ZERO);
+                }
+                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 (row.getGroupType() != GroupType.GOODS_SELL) {
+                                    if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                                        row.setLeaseFee(getActualAmount(orderDetail.getPrice(), row));
+                                    } 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()));
+                                break;
+                            case MAINTENANCE:
+                                row.setMaintenanceFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case CLOUD_TEACHER:
+                            case CLOUD_TEACHER_PLUS:
+                                row.setCloudTeacherFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case DEGREE_REGISTRATION:
+                                row.setDegreeFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case PRACTICE:
+                                row.setPracticeCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case VIP:
+                                row.setVipCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case THEORY_COURSE:
+                                row.setTheoryCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case REPAIR:
+                                row.setRepairFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                }
+                //专业
+                if (row.getGroupType().equals(GroupType.VIP)) {
+                    row.setVipCourseFee(row.getActualAmount());
+                } else if (row.getGroupType() == GroupType.ACTIVITY) {
+                    row.setVipCourseFee(row.getActualAmount());
+                } else if (row.getGroupType() == GroupType.MEMBER) {
+                    row.setCloudTeacherFee(row.getActualAmount());
+                } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
+                    //考级报名
+                    if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+                        if(StringUtils.isEmpty(row.getMemo())){
+                            row.setDegreeFee(row.getActualAmount());
+                        }else {
+                            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 if (row.getChargeType() != null && SporadicChargeTypeEnum.MUSIC_UPKEEP.getCode().equals(row.getChargeType())) {
+                            row.setMaintenanceFee(row.getActualAmount());
+                        } else if (row.getChargeType() != null && SporadicChargeTypeEnum.VISITING_FEE.getCode().equals(row.getChargeType())) {
+                            row.setVisitFee(row.getActualAmount());
+                        } else if (row.getChargeType() != null && (SporadicChargeTypeEnum.RECHARGE.getCode().equals(row.getChargeType()) ||
+                                SporadicChargeTypeEnum.HIGH_ONLINE_ACTIVITY.getCode().equals(row.getChargeType()))) {
+                            row.setRechargeFee(row.getActualAmount());
+                        } else if (row.getChargeType() != null && SporadicChargeTypeEnum.CLOUD_TEACHER_BUY.getCode().equals(row.getChargeType())) {
+                            row.setCloudTeacherFee(row.getActualAmount());
+                        } else {
+                            row.setOtherFee(row.getActualAmount());
+                        }
+                    }
+                } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
+                    row.setPracticeCourseFee(row.getActualAmount());
+                } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
+                    row.setMusicalFee(row.getActualAmount());
+                } else if (row.getGroupType().equals(GroupType.GOODS_SELL)) {
+                    row.setRetailGoodsFee(row.getActualAmount());
+                } else {
+                    List<StudentPaymentOrderExportDto> exportDtoList = feeByTypeMap.get(row.getId());
+                    if (!org.springframework.util.CollectionUtils.isEmpty(exportDtoList)) {
+                        StudentPaymentOrderExportDto feeByType = exportDtoList.get(0);
+                        BigDecimal childRepairFee = childRepairMap.get(row.getId()) == null ? BigDecimal.ZERO : childRepairMap.get(row.getId());
+                        row.setMusicalFee(feeByType.getMusicalFee());
+                        row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
+                        row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
+                        row.setOtherFee(feeByType.getOtherFee());
+                        if (row.getGroupType().equals(GroupType.MUSIC)) {
+                            row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).
+                                    subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).
+                                    subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()).
+                                    subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()));
+                        } else if (row.getGroupType().equals(OrderTypeEnum.REPAIR)) {
+                            row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
+                        } else if (row.getGroupType() == GroupType.OUTORDER) {
+                            //销售收入
+                            BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
+                            //服务收入
+                            BigDecimal subtract = feeByType.getActualAmount().subtract(add);
+                            //如果是淘器微信那么就是零售
+                            if (Objects.equals("淘器微信", row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0) {
+                                //如果有服务收入那么是课程学校采买
+                                row.setMusicalFee(BigDecimal.ZERO);
+                                row.setTeachingFee(BigDecimal.ZERO);
+                                row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                row.setOtherFee(subtract);
+                                row.setRetailGoodsFee(add);
+                            } else {
+                                //拆分导入订单
+                                if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
+                                    if (row.getType() == OrderTypeEnum.SCHOOL) {
+                                        row.setMusicalFee(BigDecimal.ZERO);
+                                        row.setTeachingFee(BigDecimal.ZERO);
+                                        row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                        row.setOtherFee(BigDecimal.ZERO);
+                                        row.setLargeMusicalFee(add);
+                                    }
+                                    row.setCourseSchoolBuyAmount(subtract);
+                                } else if (row.getType() == OrderTypeEnum.OTHER) {
+                                    row.setOtherFee(row.getOtherFee().add(subtract));
+                                } else {
+                                    row.setMusicalFee(BigDecimal.ZERO);
+                                    row.setTeachingFee(BigDecimal.ZERO);
+                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                    row.setOtherFee(BigDecimal.ZERO);
+                                    row.setRetailGoodsFee(add);
+                                    row.setMusicGroupCourseFee(subtract);
+                                }
+                            }
+                            row.setTransferFee(BigDecimal.ZERO);
+                            row.setPlatformFee(BigDecimal.ZERO);
+                        }
+                    }
+                }
+                row.setId(i);
+                row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
+                row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
+                i++;
+                //学校课程采买
+                incomeDto.setCoursePurchaseIncome(incomeDto.getCoursePurchaseIncome()
+                        .add(row.getCourseSchoolBuyAmount()));
+                //考级
+                incomeDto.setExamIncome(incomeDto.getExamIncome()
+                        .add(row.getDegreeFee()));
+                //维修费用
+                incomeDto.setMaintenanceCost(incomeDto.getMaintenanceCost()
+                        .add(row.getRepairFee()));
+                //其他服务收入
+                incomeDto.setOtherServiceIncome(incomeDto.getOtherServiceIncome()
+                        .add(row.getLeaseFee())
+                        .add(row.getVisitFee())
+                        .add(row.getRechargeFee())
+                        .add(row.getOtherFee())
+                );
+                //团购乐器
+                incomeDto.setGroupPurchaseInstruments(incomeDto.getGroupPurchaseInstruments()
+                        .add(row.getMusicalFee()));
+                //零售乐器,计入其他
+                incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                        .add(row.getRetailGoodsFee()));
+                if(row.getGroupType() == GroupType.GOODS_SELL){
+                    //零售教辅,计入其他
+                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                            .add(row.getTeachingFee()));
+                }else {
+                    //团购教辅
+                    incomeDto.setGroupPurchaseTeachingAids(incomeDto.getGroupPurchaseTeachingAids()
+                            .add(row.getTeachingFee()));
+                }
+                //区分零售月保
+                if(row.getGroupType() == GroupType.MAINTENANCE){
+                    //零售月保,计入其他
+                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                            .add(row.getMaintenanceFee()));
+                }else {
+                    //团购月保
+                    incomeDto.setInstrumentInsuranceCost(incomeDto.getInstrumentInsuranceCost()
+                            .add(row.getMaintenanceFee()));
+                }
+
+                //大件乐器
+                incomeDto.setLargeInstruments(incomeDto.getLargeInstruments()
+                        .add(row.getLargeMusicalFee()));
+            }
+            //学员指导课费
+            incomeDto.setStudentGuidanceIncome(incomeDto.getStudentGuidanceIncome().add(courseIncome.getOrDefault(organId,BigDecimal.ZERO)));
+            incomeDto.setCloudCoachIncome(incomeDto.getCloudCoachIncome().add(groupCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
+            incomeDto.setSaleCloudCoachIncome(incomeDto.getSaleCloudCoachIncome().add(personalCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
+            //服务收入
+            incomeDto.setServiceIncome(incomeDto.getLargeInstruments()
+                    .add(incomeDto.getStudentGuidanceIncome())
+                    .add(incomeDto.getCoursePurchaseIncome())
+                    .add(incomeDto.getExamIncome())
+                    .add(incomeDto.getMaintenanceCost())
+                    .add(incomeDto.getInstrumentInsuranceCost())
+                    .add(incomeDto.getOtherServiceIncome())
+                    .add(incomeDto.getCloudCoachIncome())
+            );
+            incomeDto.setSalesIncome(incomeDto.getSalesIncome()
+                    .add(incomeDto.getSaleCloudCoachIncome())
+                    .add(incomeDto.getGroupPurchaseInstruments())
+                    .add(incomeDto.getGroupPurchaseTeachingAids())
+                    .add(incomeDto.getLargeInstruments())
+                    .add(incomeDto.getOtherIncome())
+            );
+            incomeDtos.add(incomeDto);
+        }
+        return incomeDtos;
+    }
+
+    public BigDecimal getActualAmount(BigDecimal price, StudentPaymentOrderExportDto row) {
+        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+            return price.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+        }
+        return BigDecimal.ZERO;
+    }
 }

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

@@ -383,7 +383,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     public List<StudentPaymentOrderDetail> queryFeeDetail(Integer studentId, String musicGroupId) {
 
-        List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderService.queryByCondition(GroupType.MUSIC, musicGroupId, studentId,
+        List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderService.queryByCondition(null, musicGroupId, studentId,
                 DealStatusEnum.SUCCESS, OrderTypeEnum.APPLY);
 
         List<Long> orderIdList = studentPaymentOrderList.stream().map(t -> t.getId()).collect(Collectors.toList());
@@ -927,6 +927,84 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         return studentPaymentOrder;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<StudentPaymentOrderDetail> addOrder1(StudentPaymentOrder studentPaymentOrder,
+                          MusicGroupPaymentCalender calender,
+                          List<MusicGroupPaymentCalenderCourseSettings> newCourses,
+                          MusicGroupPaymentCalenderMember calenderMember,
+                          MusicGroupPaymentCalenderRepair calenderRepair,
+                          List<MusicGroupPaymentCalenderActivity> calenderActivities
+                          ){
+        Date date = new Date();
+        List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
+        //新的课程形态  todo  合奏课  单技课
+        if (CollectionUtils.isNotEmpty(newCourses)) {
+            for (MusicGroupPaymentCalenderCourseSettings newCourse : newCourses) {
+                StudentPaymentOrderDetail studentPaymentOrderDetailCourse = new StudentPaymentOrderDetail();
+                studentPaymentOrderDetailCourse.setType(OrderDetailTypeEnum.valueOf(newCourse.getCourseType().getCode()));
+                studentPaymentOrderDetailCourse.setPrice(newCourse.getCourseCurrentPrice());
+                studentPaymentOrderDetailCourse.setRemitFee(BigDecimal.ZERO);
+                studentPaymentOrderDetailCourse.setCreateTime(date);
+                studentPaymentOrderDetailCourse.setUpdateTime(date);
+                studentPaymentOrderDetailCourse.setPaymentOrderId(studentPaymentOrder.getId());
+                studentPaymentOrderDetailList.add(studentPaymentOrderDetailCourse);
+            }
+        }
+
+        //乐保 todo  乐保
+        if (Objects.nonNull(calenderRepair)) {
+            StudentPaymentOrderDetail maintenanceOrderDetail = new StudentPaymentOrderDetail();
+            maintenanceOrderDetail.setType(MAINTENANCE);
+            maintenanceOrderDetail.setPrice(calenderRepair.getActualAmount());
+            maintenanceOrderDetail.setRemitFee(BigDecimal.ZERO);
+            maintenanceOrderDetail.setCreateTime(date);
+            maintenanceOrderDetail.setUpdateTime(date);
+            maintenanceOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            maintenanceOrderDetail.setIsRenew(0);
+            studentPaymentOrderDetailList.add(maintenanceOrderDetail);
+        }
+
+        //活动 todo  VIP 或 网管课
+        if(CollectionUtils.isNotEmpty(calenderActivities)){
+            for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
+                StudentPaymentOrderDetail maintenanceOrderDetail = new StudentPaymentOrderDetail();
+                maintenanceOrderDetail.setType("网管课".equals(calenderActivity.getCategoryName()) ? PRACTICE : VIP);
+                maintenanceOrderDetail.setPrice(calenderActivity.getActualAmount());
+                if(calender.getPayUserType() == MusicGroupPaymentCalender.PayUserType.SCHOOL){
+                    maintenanceOrderDetail.setPrice(BigDecimal.ZERO);
+                }
+                maintenanceOrderDetail.setRemitFee(BigDecimal.ZERO);
+                maintenanceOrderDetail.setCreateTime(date);
+                maintenanceOrderDetail.setUpdateTime(date);
+                maintenanceOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+                maintenanceOrderDetail.setIsRenew(0);
+                //保存的是活动编号
+                maintenanceOrderDetail.setStudentInstrumentId(calenderActivity.getActivityId().longValue());
+                studentPaymentOrderDetailList.add(maintenanceOrderDetail);
+            }
+        }
+
+        //云教练/云教练+  todo  团练宝
+        if(Objects.nonNull(calenderMember)){
+            StudentPaymentOrderDetail cloudTeacherOrderDetail = new StudentPaymentOrderDetail();
+            cloudTeacherOrderDetail.setType(OrderDetailTypeEnum.CLOUD_TEACHER);
+            cloudTeacherOrderDetail.setPrice(calenderMember.getActualAmount());
+            if(calender.getPayUserType() == MusicGroupPaymentCalender.PayUserType.SCHOOL){
+                cloudTeacherOrderDetail.setPrice(BigDecimal.ZERO);
+            }
+            cloudTeacherOrderDetail.setRemitFee(BigDecimal.ZERO);
+            cloudTeacherOrderDetail.setCreateTime(date);
+            cloudTeacherOrderDetail.setUpdateTime(date);
+            cloudTeacherOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            cloudTeacherOrderDetail.setIsRenew(0);
+            studentPaymentOrderDetailList.add(cloudTeacherOrderDetail);
+        }
+        //添加订单明细
+        studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
+        return studentPaymentOrderDetailList;
+    }
+
     /**
      * 计算使用优惠券后的每个明细均摊的金额
      *
@@ -2101,6 +2179,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    public void batchUpdate(List<StudentRegistration> studentRegistrations) {
+        studentRegistrationDao.batchUpdate(studentRegistrations);
+    }
+
+    @Override
     public PageInfo<StudentRegisterInstrumentsDetailDto> queryStudentRegisterInstrumentsDetailList(MusicGroupRecordStudentQueryInfo queryInfo) {
         PageInfo<StudentRegisterInstrumentsDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -90,6 +90,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private ImFeignService imFeignService;
     @Autowired
     private StudentOperatingVisitDao studentOperatingVisitDao;
+    @Autowired
+    private StudentMemberUpdateLogDao studentMemberUpdateLogDao;
 
     @Autowired
     private CooperationOrganService cooperationOrganService;
@@ -1601,6 +1603,36 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         return students.stream().collect(Collectors.toMap(Student::getUserId, Function.identity()));
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStudentMember(Integer userId, Date endTime,String memo,Integer operatorId) {
+        Student student = studentDao.get(userId);
+        if(Objects.isNull(student)){
+            throw new BizException("学员信息不存在");
+        }
+        StudentMemberUpdateLog studentMemberUpdateLog = new StudentMemberUpdateLog();
+        studentMemberUpdateLog.setStudentId(userId);
+        studentMemberUpdateLog.setOldStartTime(student.getMembershipStartTime());
+        studentMemberUpdateLog.setOldEndTime(student.getMembershipEndTime());
+        studentMemberUpdateLog.setMemo(memo);
+        studentMemberUpdateLog.setOperatorId(operatorId);
+        Date now = new Date();
+        if (endTime == null || endTime.compareTo(now) < 0){
+            studentDao.cleanMember(userId);
+        }else {
+            if(student.getMembershipStartTime() == null){
+                student.setMembershipStartTime(now);
+            }
+            student.setMemberRankSettingId(1);
+            student.setMembershipEndTime(endTime);
+            studentDao.updateStudentMember(student);
+            studentMemberUpdateLog.setNewStartTime(student.getMembershipStartTime());
+            studentMemberUpdateLog.setNewEndTime(student.getMembershipEndTime());
+        }
+        //添加修改日志
+        studentMemberUpdateLogDao.insert(studentMemberUpdateLog);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public  <T extends BaseStudentDto> void insertStudent(T baseStudent){
         Student student = new Student();

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

@@ -41,7 +41,12 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 		return studentStatisticsDao;
 	}
 
-	@Override
+    @Override
+    public StudentStatisticsDao getDao() {
+        return studentStatisticsDao;
+    }
+
+    @Override
 	public void updateStudentStatistics() {
 		//更新学员基本信息
 		studentBasicInfoDao.updateStudentBasicInfo();

+ 21 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectServiceImpl.java

@@ -1,15 +1,11 @@
 package com.ym.mec.biz.service.impl;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dto.StudentSubjectDto;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -73,11 +69,11 @@ public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implem
 
         Map<Long,BigDecimal> maps = MapUtil.convertIntegerMap(studentRegistrationDao.querySubjectAmount(musicGroupId));
         subApplyDetail.forEach(detail -> {
-        	SubjectApplyDetailDto dto = new SubjectApplyDetailDto();
-        	if(map.containsKey(detail.getSubjectId())){
-        		dto = map.get(detail.getSubjectId());
-        	}
-        	detail.setTotalAmount(maps.get(detail.getSubjectId().longValue()));
+            SubjectApplyDetailDto dto = new SubjectApplyDetailDto();
+            if(map.containsKey(detail.getSubjectId())){
+                dto = map.get(detail.getSubjectId());
+            }
+            detail.setTotalAmount(maps.get(detail.getSubjectId().longValue()));
             detail.setPayNum(dto.getPayNum());
             detail.setApplyStudentNum(dto.getApplyStudentNum());
             detail.setPayingNum(dto.getPayingNum());
@@ -242,4 +238,18 @@ public class SubjectServiceImpl extends BaseServiceImpl<Integer, Subject> implem
 
         return subjectList.stream().collect(Collectors.toMap(Subject::getId, Function.identity()));
     }
+
+    @Override
+    public Map<Integer, StudentSubjectDto> getSubjectByStudentId(Set<Long> studentIds) {
+
+        if (CollectionUtils.isEmpty(studentIds)) {
+            return new HashMap<>();
+        }
+        List<StudentSubjectDto> subjects = subjectDao.getSubjectByStudentId(studentIds);
+        Map<Integer, StudentSubjectDto> map = new HashMap<>();
+        if (!CollectionUtils.isEmpty(subjects)) {
+            map = subjects.stream().collect(Collectors.toMap(StudentSubjectDto::getStudentId, Function.identity()));
+        }
+        return map;
+    }
 }

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

@@ -519,6 +519,10 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			//布置课后评测
 			LessonExaminationSaveDto examinationSaveDto = teacherSignOutDto.getCourseHomeworkInfo().getLessonExaminationSaveDto();
 			if(Objects.nonNull(examinationSaveDto)){
+                examinationSaveDto.setTeacherId(teacherAttendance.getTeacherId());
+                examinationSaveDto.setClassGroupId(teacherAttendance.getClassGroupId());
+                examinationSaveDto.setCourseScheduleId(teacherAttendance.getCourseScheduleId());
+                examinationSaveDto.setMusicGroupId(teacherAttendance.getMusicGroupId());
 				lessonExaminationService.publish(examinationSaveDto);
 			}
 

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

@@ -23,7 +23,6 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.string.MessageFormatter;
-
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -124,6 +123,47 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
         return vipGroupActivityDao;
     }
 
+	@Override
+	public PageInfo<VipGroupActivity> queryPage(VipGroupActivityQueryInfo queryInfo){
+		PageInfo<VipGroupActivity> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<VipGroupActivity> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+			String organIds = dataList.stream().map(e -> e.getOrganId()).filter(e -> StringUtils.isNotEmpty(e)).collect(Collectors.joining(","));
+			Set<Integer> organIdList = Arrays.stream(organIds.split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toSet());
+			Map<Integer, String> organNameMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(organIdList)){
+				organNameMap = this.getMap("organization", "id_", "name_", organIdList, queryInfo.getTenantId(), Integer.class, String.class);
+			}
+			for (VipGroupActivity activity : dataList) {
+				if(StringUtils.isNotEmpty(activity.getOrganId())){
+					StringBuffer sb = new StringBuffer();
+					for (String organId : activity.getOrganId().split(",")) {
+						String s = organNameMap.get(Integer.parseInt(organId));
+						if(StringUtils.isNotEmpty(s)){
+							if(sb.length() > 0){
+								sb.append(",");
+							}
+							sb.append(s);
+						}
+					}
+					activity.setOrganName(sb.toString());
+				}
+			}
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
     @Override
 	public VipGroupActivityAddDto addVipGroupActivity(VipGroupActivityAddDto vipGroupActivityAddDto) {
 
@@ -183,6 +223,7 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
 			throw new BizException("活动不存在!");
 		}
 		if("PROGRESS".equals(oldVipGroupActivity.getStatus())){
+			oldVipGroupActivity.setOrganId(vipGroupActivityAddDto.getOrganId());
 			oldVipGroupActivity.setCoursesStartTime(vipGroupActivityAddDto.getCoursesStartTime());
 			oldVipGroupActivity.setCoursesEndTime(vipGroupActivityAddDto.getCoursesEndTime());
 			oldVipGroupActivity.setStartTime(vipGroupActivityAddDto.getStartTime());

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

@@ -124,6 +124,9 @@
 			<if test="tenantId != null">
 				AND ccpp.tenant_id_ = #{tenantId}
 			</if>
+            <if test="audit != null">
+                AND ccpp.audit_ = #{audit}
+            </if>
 			<if test="period != null and period != ''">
 				AND ccpp.period_ = #{period}
 			</if>
@@ -141,11 +144,9 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="CloudCoachPaymentProgram" parameterType="map">
-		SELECT ccpp.*,su.real_name_ operator_name_,su1.real_name_ audit_name_,o.name_ organ_name_
+		SELECT ccpp.*,o.name_ organ_name_
 		FROM cloud_coach_payment_program ccpp
 		LEFT JOIN organization o ON o.id_ = ccpp.organ_id_
-		LEFT JOIN sys_user su ON su.id_ = ccpp.operator_
-		LEFT JOIN sys_user su1 ON su1.id_ = ccpp.audit_
 		<include refid="queryPageSql"/>
 		ORDER BY ccpp.id_ DESC
 		<include refid="global.limit"/>
@@ -160,4 +161,16 @@
 	<select id="getLock" resultMap="CloudCoachPaymentProgram">
 		SELECT * FROM cloud_coach_payment_program WHERE id_ = #{id} FOR UPDATE
 	</select>
+
+	<select id="queryUser" resultType="java.util.Map">
+        SELECT distinct mgpc.audit_ as audit,su.real_name_ as auditName
+        FROM cloud_coach_payment_program mgpc
+        left join sys_user su on mgpc.audit_ = su.id_
+        <where>
+            mgpc.audit_ is not null
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(mgpc.organ_id_,#{organId})
+            </if>
+        </where>
+    </select>
 </mapper>

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

@@ -44,6 +44,8 @@
         <result column="evaluate_flag_" property="evaluateFlag"/>
         <result column="convert_flag_" property="convertFlag"/>
         <result column="settlement_report_flag_" property="settlementReportFlag"/>
+        <result column="service_provider_" property="serviceProvider"/>
+        <result column="mute_all_" property="muteAll"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -174,7 +176,9 @@
         cs.valid_start_time_,
         cs.pre_course_flag_,
         cs.tenant_id_,
-        cs.evaluate_flag_
+        cs.evaluate_flag_,
+        cs.service_provider_,
+        cs.mute_all_
     </sql>
 
     <sql id="courseIgnore">
@@ -4033,6 +4037,7 @@
         <result property="userId" column="user_id_"/>
         <result property="avatar" column="avatar_"/>
         <result property="subjectName" column="subject_name_"/>
+        <result property="subjectId" column="subjectId"/>
         <result property="username" column="username_"/>
         <result property="phone" column="phone_"/>
         <result property="courseScheduleReviewId" column="course_schedule_review_id_"/>
@@ -4041,7 +4046,7 @@
         <result property="repairFlag" column="repair_flag_"/>
     </resultMap>
     <select id="queryStudyStandard" resultMap="StudentStandardDto">
-        SELECT su.avatar_,su.username_,sa.user_id_,sb.name_ subject_name_,sa.qualified_flag_,s.repair_flag_
+        SELECT su.avatar_,su.username_,sa.user_id_,sb.name_ subject_name_,sa.qualified_flag_,s.repair_flag_,sb.id_ subjectId
         FROM student_attendance sa
         LEFT JOIN student s ON s.user_id_ = sa.user_id_
         left join student_registration sr on sr.user_id_ = sa.user_id_ and sr.music_group_id_ = sa.music_group_id_
@@ -4131,6 +4136,23 @@
         SELECT COUNT(*) FROM course_schedule where settlement_report_flag_ = 1 and id_ = #{courseScheduleId}
     </select>
 
+    <update id="updateServiceProvider">
+        UPDATE course_schedule
+        SET service_provider_ = #{serviceProvider},
+            update_time_ = NOW()
+        WHERE id_ = #{courseScheduleId}
+    </update>
+
+    <!--更新全员静音状态-->
+    <update id="updateGroupMuteAllStatus">
+        UPDATE course_schedule
+        SET mute_all_ = #{muteAll},
+            update_time_ = NOW()
+        WHERE id_ = #{courseScheduleId}
+    </update>
+    <!--更新全员静音状态-->
+
+
     <sql id="selectPage">
         <if test="param.teacherId != null">
                 and ( cs.actual_teacher_id_ = #{param.teacherId})

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

@@ -1109,4 +1109,13 @@
         </foreach>
         group by cssp.user_id_ , u.organ_id_
 	</select>
+    <select id="statCourseFee" resultType="java.util.Map">
+		select cs.organ_id_ 'key',SUM(cssp.actual_price_) 'value' from course_schedule cs
+		left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+		left join course_schedule_teacher_salary csts ON csts.course_schedule_id_ = cs.id_
+		LEFT JOIN teacher t ON t.id_ = csts.user_id_
+		where cs.class_date_ BETWEEN #{cutFirstDayOfMonth} AND #{cutLastDayOfMonth} AND cssp.actual_price_ > 0
+		AND cs.del_flag_ = 0 AND cs.is_lock_ = 0 and cs.pre_course_flag_ = 0 AND t.is_settlement_salary_ = 1 AND csts.settlement_time_ IS NOT NULL AND cs.tenant_id_ = 1
+		group by cs.organ_id_
+	</select>
 </mapper>

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

@@ -841,8 +841,8 @@
 		left join vip_group_category vgc on vgc.id_ = vg.vip_group_category_id_
 		left join teacher t on t.id_ = csts.user_id_ 
 		WHERE cs.`group_type_` = 'VIP'
-		  AND csts.settlement_time_ IS NULL
-		  and cs.class_date_ between #{startDate} and #{endDate} and csts.tenant_id_ = #{tenantId}
+		AND csts.settlement_time_ IS NULL
+		and cs.class_date_ between #{startDate} and #{endDate} and csts.tenant_id_ = #{tenantId}
 	</select>
 
     <select id="isTeacher" resultType="java.lang.Boolean">

+ 20 - 26
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -145,10 +145,7 @@
 				</foreach>
 			</if>
 			<if test="startMonth!=null and startMonth!=''">
-				AND month_&gt;=#{startMonth}
-			</if>
-			<if test="endMonth!=null and endMonth!=''">
-				AND month_&lt;=#{endMonth}
+				AND month_ BETWEEN #{startMonth} AND #{endMonth}
 			</if>
 		</where>
 		GROUP BY month_,data_type_
@@ -204,10 +201,7 @@
 					</foreach>
 				</if>
 				<if test="startMonth!=null and startMonth!=''">
-					AND month_&gt;=#{startMonth}
-				</if>
-				<if test="endMonth!=null and endMonth!=''">
-					AND month_&lt;=#{endMonth}
+					AND month_ BETWEEN #{startMonth} AND #{endMonth}
 				</if>
 				AND extend_info_ IS NOT NULL
 			</where>
@@ -1405,7 +1399,7 @@
 			   SUM(CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) activate_num_,
 			   SUM(CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) percent_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -1420,7 +1414,7 @@
 		o.id_ organ_id_,o.name_ organ_name_
 		FROM organization o
 		LEFT JOIN student_payment_order spo ON o.id_ = spo.organ_id_ AND o.tenant_id_ = spo.tenant_id_
-		AND spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		AND spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		WHERE o.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size() > 0">
 			AND o.id_ IN
@@ -1436,7 +1430,7 @@
 			   SUM(spo.actual_amount_) activate_num_,
 			   SUM(spo.actual_amount_) percent_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -1450,7 +1444,7 @@
 		SELECT SUM(spo.actual_amount_) percent_,o.id_ organ_id_,o.name_ organ_name_
 		FROM organization o
 		LEFT JOIN student_payment_order spo ON o.id_ = spo.organ_id_ AND o.tenant_id_ = spo.tenant_id_
-		AND spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		AND spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		WHERE o.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size()>0">
 			AND o.id_ IN
@@ -1469,7 +1463,7 @@
 			   SUM(CASE WHEN spo.actual_amount_ IS NULL THEN 0 ELSE spo.actual_amount_ END +
 		CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) percent_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
 			<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -1485,7 +1479,7 @@
 		    			   o.id_ organ_id_,o.name_ organ_name_
 		FROM organization o
 		LEFT JOIN student_payment_order spo ON o.id_ = spo.organ_id_ AND o.tenant_id_ = spo.tenant_id_
-		AND spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		AND spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		WHERE o.tenant_id_ = #{tenantId}
 		<if test="organIds!=null and organIds.size()>0">
 			AND o.id_ IN
@@ -1504,7 +1498,7 @@
 			   SUM(CASE WHEN spo.actual_amount_ IS NULL THEN 0 ELSE spo.actual_amount_ END +
 		CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) percent_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		<if test="orderType != null">
 			AND FIND_IN_SET(spo.type_,#{orderType})
 		</if>
@@ -1529,7 +1523,7 @@
 		    			   o.id_ organ_id_,o.name_ organ_name_
 		FROM organization o
 		LEFT JOIN student_payment_order spo ON o.id_ = spo.organ_id_ AND o.tenant_id_ = spo.tenant_id_
-		AND spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		AND spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		<if test="orderType != null">
 			AND FIND_IN_SET(spo.type_,#{orderType})
 		</if>
@@ -1560,7 +1554,7 @@
 		SELECT spo.organ_id_,SUM(CASE WHEN spod.price_ IS NULL THEN 0 ELSE spod.price_ END) total_num_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
 		LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		AND spo.type_ = 'DEGREE' AND spod.type_ IN ('THEORY_COURSE','VIP')
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1574,7 +1568,7 @@
 		CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) total_num_
 		,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		AND spo.type_ = 'SMALL_CLASS_TO_BUY'
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1591,7 +1585,7 @@
 		LEFT JOIN (SELECT spo.organ_id_,SUM(CASE WHEN spod.price_ IS NULL THEN 0 ELSE spod.price_ END) total_num_
 		FROM student_payment_order spo
 		LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		AND spo.type_ = 'DEGREE' AND spod.type_ IN ('THEORY_COURSE','VIP')
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1604,7 +1598,7 @@
 		SELECT spo.organ_id_,SUM(CASE WHEN spo.actual_amount_ IS NULL THEN 0 ELSE spo.actual_amount_ END +
 		CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) total_num_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		AND spo.type_ = 'SMALL_CLASS_TO_BUY'
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1630,7 +1624,7 @@
 							   CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) total_num_
 		   ,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_,spo.type_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		AND spo.type_ NOT IN ('APPLY','RENEW','PRACTICE_GROUP_BUY','PRACTICE_GROUP_RENEW','SMALL_CLASS_TO_BUY','DEGREE')
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1643,7 +1637,7 @@
 		SELECT spo.organ_id_,SUM(CASE WHEN spod.price_ IS NULL THEN 0 ELSE spod.price_ END) total_num_,DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') month_,spo.type_
 		FROM student_payment_order spo
 			   LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		AND spo.type_ = 'DEGREE' AND spod.type_ = 'DEGREE_REGISTRATION'
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1659,9 +1653,9 @@
 		SELECT o.id_ organ_id_,o.name_ organ_name_,SUM(c.total_num_) percent_ FROM organization o
 		LEFT JOIN (
 		SELECT spo.organ_id_,SUM(CASE WHEN spo.actual_amount_ IS NULL THEN 0 ELSE spo.actual_amount_ END +
-							   CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) total_num_,spo.type_
+		CASE WHEN spo.balance_payment_amount_ IS NULL THEN 0 ELSE spo.balance_payment_amount_ END) total_num_,spo.type_
 		FROM student_payment_order spo
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate} and spo.tenant_id_ = #{tenantId}
 		AND spo.type_ NOT IN ('APPLY','ADD_STUDENT','RENEW','PRACTICE_GROUP_BUY','PRACTICE_GROUP_RENEW','SMALL_CLASS_TO_BUY','DEGREE')
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN
@@ -1673,8 +1667,8 @@
 		UNION ALL
 		SELECT spo.organ_id_,SUM(CASE WHEN spod.price_ IS NULL THEN 0 ELSE spod.price_ END) total_num_,spo.type_
 		FROM student_payment_order spo
-			   LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
-		WHERE spo.status_ = 'SUCCESS' AND DATE_FORMAT(spo.pay_time_,'%Y-%m-%d') BETWEEN #{startDate} AND #{endDate}
+		LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
+		WHERE spo.status_ = 'SUCCESS' AND spo.pay_time_ BETWEEN #{startDate} AND #{endDate}
 		AND spo.type_ = 'DEGREE' AND spod.type_ = 'DEGREE_REGISTRATION'
 		<if test="organIds!=null and organIds.size()>0">
 			AND spo.organ_id_ IN

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

@@ -45,6 +45,8 @@
         <result column="calender_fee_type_" property="calenderFeeType"/>
         <result column="calender_fee_json_" property="calenderFeeJson"/>
         <result column="contract_url_" property="contractUrl"/>
+        <result column="auditTime" property="auditTime"/>
+        <result column="audit" property="audit"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -265,6 +267,12 @@
 	            <if test="item.isShowSalePrice != null">
 	                is_show_sale_price_ = #{item.isShowSalePrice},
 	            </if>
+                <if test="item.audit != null">
+                    audit = #{item.audit},
+                </if>
+                <if test="item.auditTime != null">
+                    audit_time = #{item.auditTime},
+                </if>
 	        </set>
 	        WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
 		</foreach>
@@ -675,6 +683,9 @@
             <if test="tenantId != null">
                 AND mgpc.tenant_id_ = #{tenantId}
             </if>
+            <if test="audit != null">
+                AND mgpc.audit = #{audit}
+            </if>
         </where>
     </sql>
     <select id="countCalender" resultType="java.lang.Integer">
@@ -687,15 +698,17 @@
                extends="MusicGroupPaymentCalender">
         <result column="music_group_name_" property="musicGroupName"/>
         <result column="operator_name_" property="operatorName"/>
+        <result column="auditName" property="auditName"/>
     </resultMap>
     <select id="queryCalenderPage" resultMap="MusicGroupPaymentCalenderResultDto">
         SELECT mgpc.id_,mgpc.music_group_id_,mgpc.music_group_organization_course_settings_id_,mgpc.pay_user_type_,mgpc.reject_reason_,
         mgpc.start_payment_date_,mgpc.deadline_payment_date_,mgpc.status_,mgpc.expect_num_,
         mgpc.actual_num_,mgpc.memo_,mgpc.create_time_,mgpc.update_time_,
         mgpc.payment_pattern_,mgpc.payment_type_,mgpc.batch_no_,mgpc.audit_memo_,mgpc.operator_,mgpc.attribute1_,
-        mgpc.attribute2_,mgpc.student_ids_,mgpc.current_total_amount_,mgpc.original_total_amount_,mg.name_ music_group_name_,mgpc.organ_id_
+        mgpc.attribute2_,mgpc.student_ids_,mgpc.current_total_amount_,mgpc.original_total_amount_,mg.name_ music_group_name_,mgpc.organ_id_,mgpc.audit,mgpc.audit_time auditTime,su.real_name_  auditName
         FROM music_group_payment_calender mgpc
         LEFT JOIN music_group mg ON mg.id_ = mgpc.music_group_id_
+        left join sys_user su on su.id_ = mgpc.audit
         <include refid="queryCalenderPageSql"/>
         ORDER BY mgpc.id_ DESC
         <include refid="global.limit"/>
@@ -716,4 +729,16 @@
             #{id}
         </foreach>
     </select>
+
+    <select id="queryUser" resultType="java.util.Map">
+        SELECT distinct mgpc.audit as audit,su.real_name_ as auditName
+        FROM music_group_payment_calender mgpc
+        left join sys_user su on mgpc.audit = su.id_
+        <where>
+            mgpc.audit is not null
+            <if test="organId != null and organId != ''">
+                AND FIND_IN_SET(mgpc.organ_id_,#{organId})
+            </if>
+        </where>
+    </select>
 </mapper>

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

@@ -252,4 +252,7 @@
             #{musicGroupId}
         </foreach>
     </select>
+    <select id="finish">
+        update music_group_quit set status_ = 'CANCELED',reason_ = '乐团关闭,批量关闭退团审批' where status_ = 'PROCESSING' AND music_group_id_ = #{musicGroupId}
+    </select>
 </mapper>

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

@@ -378,7 +378,7 @@
 			SUM(CASE WHEN hc.human_cost_type_ = 'STUDENT_MANAGEMENT_FEE_ADJUSTMENT' THEN hc.amount_ ELSE 0 END) AS studentManagementFeeAdjustment
 		FROM
 			organization o
-				left join financial_expenditure fe ON o.id_ = fe.organ_id_ AND fe.process_id_ = 28 AND DATE_FORMAT(fe.aproval_time_, '%Y-%m') = #{month} AND fe.del_flag_ = 0
+				left join financial_expenditure fe ON o.id_ = fe.organ_id_ AND fe.process_id_ IN (19,22,23,28,51) AND fe.fee_project_ NOT IN (1,2,13,14) AND effective_time_= #{month} AND fe.del_flag_ = 0
 				left join human_cost hc ON hc.organ_id_ = o.id_  AND hc.month_ = #{month}
 		WHERE
 			o.tenant_id_ = 1 AND o.del_flag_ = 0
@@ -388,7 +388,7 @@
 	<resultMap type="com.ym.mec.biz.dal.entity.FinancialExpenditure" id="FinancialExpenditure">
 		<result column="name_" property="organName"/>
 		<result column="batch_no_" property="batchNo"/>
-		<result column="cooperation_organ_name_" property="cooperationOrganName"/>
+		<result column="cooperationName" property="cooperationOrganName"/>
 		<result column="apply_user_" property="applyUser"/>
 		<result column="student_id_" property="studentId"/>
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -404,7 +404,7 @@
 		from financial_expenditure fe
 				 left join organization o ON o.id_ = fe.organ_id_
 				 left join cooperation_organ co ON co.id_ = fe.cooperation_organ_id_
-		where fe.process_id_ IN (19,22,28,51) AND fee_project_ NOT IN (1,2,13,14) AND fe.del_flag_ = 0 AND DATE_FORMAT(fe.aproval_time_, '%Y-%m') = #{month}
+		where fe.process_id_ IN (19,22,23,28,51) AND fee_project_ NOT IN (1,2,13,14) AND fe.del_flag_ = 0 AND fe.effective_time_ = #{month}
 		order by fe.id_ DESC
 	</select>
 	<select id="sumHumanCost" resultType="com.ym.mec.biz.dal.dto.HumanTypeDto">

+ 12 - 5
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -36,6 +36,7 @@
         <result column="batch_no_" property="batchNo"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="refund_time_" property="refundTime"/>
+        <result column="delivery_time_" property="deliveryTime"/>
         <result column="sell_time_" property="sellTime"/>
         <result column="create_ime_" property="createIme"/>
         <result column="update_time_" property="updateTime"/>
@@ -50,7 +51,7 @@
         actual_amount_,balance_amount_, sell_cost_, sell_cost2_, type_,parent_goods_id_, goods_id_,goods_name_, num_,
         user_id_,
         payment_channel_,mer_no_,batch_no_,stock_type_,account_type_,status_, refund_time_,sell_time_, create_ime_,
-        update_time_,coupon_remit_amount_,organ_sell_cost_
+        update_time_,coupon_remit_amount_,organ_sell_cost_,delivery_time_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="SellOrder">
         <!--@mbg.generated-->
@@ -71,18 +72,21 @@
         expect_amount_,actual_amount_,balance_amount_, type_,parent_goods_id_, goods_id_,goods_name_, sell_cost_,
         sell_cost2_, num_, user_id_, payment_channel_,
         mer_no_,batch_no_,stock_type_,account_type_, refund_time_,sell_time_,
-        create_ime_, update_time_,coupon_remit_amount_,tenant_id_,organ_sell_cost_)
+        create_ime_, update_time_,coupon_remit_amount_,tenant_id_,organ_sell_cost_,delivery_time_)
         values (#{eduTeacherId},#{organId}, #{cooperationOrganId}, #{transNo}, #{orderNo},#{orderId}, #{expectAmount},
         #{actualAmount}, #{balanceAmount}, #{type},#{parentGoodsId}, #{goodsId}, #{goodsName}, #{sellCost},
         #{sellCost2}, #{num}, #{userId},
         #{paymentChannel}, #{merNo},#{batchNo},
         #{stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{accountType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{refundTime},#{sellTime}, #{createIme}, #{updateTime}, #{couponRemitAmount},#{tenantId},#{organSellCost})
+        #{refundTime},#{sellTime}, #{createIme}, #{updateTime}, #{couponRemitAmount},#{tenantId},#{organSellCost},#{deliveryTime})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.SellOrder">
         <!--@mbg.generated-->
         update sell_order
         <set>
+            <if test="deliveryTime != null and deliveryTime != ''">
+                delivery_time_ = #{deliveryTime},
+            </if>
             <if test="couponRemitAmount != null">
                 coupon_remit_amount_ = #{couponRemitAmount},
             </if>
@@ -269,7 +273,7 @@
         insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
         actual_amount_,balance_amount_, type_, parent_goods_id_, goods_id_,goods_name_, sell_cost_, sell_cost2_, num_,
         user_id_, payment_channel_,
-        mer_no_,batch_no_,stock_type_,account_type_, sell_time_,edu_teacher_id_, create_ime_, update_time_,coupon_remit_amount_,tenant_id_,organ_sell_cost_)
+        mer_no_,batch_no_,stock_type_,account_type_, sell_time_,edu_teacher_id_, create_ime_, update_time_,coupon_remit_amount_,tenant_id_,organ_sell_cost_,delivery_time_)
         VALUE
         <foreach collection="sellOrders" separator="," item="sellOrder">
             (#{sellOrder.organId},#{sellOrder.cooperationOrganId},#{sellOrder.transNo},#{sellOrder.orderId},#{sellOrder.orderNo},
@@ -277,7 +281,7 @@
             #{sellOrder.goodsName},#{sellOrder.sellCost},#{sellOrder.sellCost2},#{sellOrder.num},#{sellOrder.userId},
             #{sellOrder.paymentChannel},#{sellOrder.merNo},#{sellOrder.batchNo},
             #{sellOrder.stockType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{sellOrder.accountType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{sellOrder.sellTime},#{sellOrder.eduTeacherId},NOW(),NOW(),#{sellOrder.couponRemitAmount},#{sellOrder.tenantId},#{sellOrder.organSellCost})
+            #{sellOrder.sellTime},#{sellOrder.eduTeacherId},NOW(),NOW(),#{sellOrder.couponRemitAmount},#{sellOrder.tenantId},#{sellOrder.organSellCost},#{sellOrder.deliveryTime})
         </foreach>
     </insert>
 
@@ -338,6 +342,9 @@
             <if test="endTime != null">
                 AND so.sell_time_ &lt;= #{endTime}
             </if>
+            <if test="deliveryStartTime != null and deliveryStartTime != ''">
+                AND so.delivery_time_ BETWEEN #{deliveryStartTime} AND #{deliveryEndTime}
+            </if>
         </where>
     </sql>
 

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

@@ -107,4 +107,13 @@
 	<select id="findUserByProgramId" resultType="java.lang.Integer">
 		SELECT user_id_ FROM student_cloud_coach_payment_details WHERE cloud_coach_payment_program_id_ = #{programId}
 	</select>
+    <select id="queryStudentName" resultType="java.util.Map">
+		select sccpd.cloud_coach_payment_program_id_ 'key',GROUP_CONCAT(su.username_) 'value' from student_cloud_coach_payment_details sccpd
+		left join sys_user su ON su.id_ = sccpd.user_id_
+		where sccpd.cloud_coach_payment_program_id_ IN
+		<foreach collection="programIds" open="(" close=")" separator="," item="id">
+			#{id}
+		</foreach>
+		group by sccpd.cloud_coach_payment_program_id_
+	</select>
 </mapper>

+ 26 - 18
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -855,24 +855,32 @@
     <select id="countWaitCreateHomeworkNum1" resultType="java.lang.Integer">
         SELECT SUM(t.num_)
         FROM (
-                 SELECT COUNT(se.id_) num_
-                 FROM student_extracurricular_exercises_situation_ se
-                          LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_, se.course_ids_)
-                 WHERE se.teacher_id_ = #{teacherId}
-                   AND se.expect_exercises_num_ > se.actual_exercises_num_
-                   AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
-                   AND se.serve_type_ = 'HOMEWORK'
-                   AND cs.group_type_ = 'MUSIC'
-                   AND cs.class_date_ = DATE_FORMAT(NOW(), '%Y-%m-%d')
-                 UNION ALL
-                 SELECT COUNT(se.id_) num_
-                 FROM student_extracurricular_exercises_situation_ se
-                          LEFT JOIN course_schedule cs ON FIND_IN_SET(cs.id_, se.course_ids_)
-                 WHERE se.teacher_id_ = #{teacherId}
-                   AND se.expect_exercises_num_ > se.actual_exercises_num_
-                   AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
-                   AND se.serve_type_ = 'HOMEWORK'
-                   AND cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d')) t
+        SELECT COUNT(se.id_) num_
+        FROM student_extracurricular_exercises_situation_ se
+        LEFT JOIN (
+        SELECT DISTINCT cs.id_
+        FROM course_schedule cs
+        WHERE cs.group_type_ = 'MUSIC' AND cs.class_date_ = DATE_FORMAT(NOW(), '%Y-%m-%d')
+        ) music_cs ON FIND_IN_SET(music_cs.id_, se.course_ids_)
+        WHERE se.teacher_id_ = #{teacherId}
+        AND se.expect_exercises_num_ > se.actual_exercises_num_
+        AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+        AND se.serve_type_ = 'HOMEWORK'
+        AND music_cs.id_ IS NOT NULL
+        UNION ALL
+        SELECT COUNT(se.id_) num_
+        FROM student_extracurricular_exercises_situation_ se
+        LEFT JOIN (
+        SELECT DISTINCT cs.id_
+        FROM course_schedule cs
+        WHERE cs.group_type_ != 'MUSIC' AND cs.class_date_ &lt;= DATE_FORMAT(NOW(), '%Y-%m-%d')
+        ) non_music_cs ON FIND_IN_SET(non_music_cs.id_, se.course_ids_)
+        WHERE se.teacher_id_ = #{teacherId}
+        AND se.expect_exercises_num_ > se.actual_exercises_num_
+        AND DATE_FORMAT(NOW(), '%Y-%m-%d') BETWEEN se.monday_ AND se.sunday_
+        AND se.serve_type_ = 'HOMEWORK'
+        AND non_music_cs.id_ IS NOT NULL
+        ) t
     </select>
 
     <select id="queryTeacherPerformanceIndicator" resultMap="TeacherServeDto">

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

@@ -1309,6 +1309,15 @@
         </foreach>
         and ucamp.train_time_ &gt;= camp.sign_standard_ * 60
     </select>
+    <select id="queryExistStuByPhone" resultType="java.lang.String">
+        select su.phone_ from student s
+        left join sys_user su ON su.id_ = s.user_id_
+        where su.del_flag_ = 0 AND su.tenant_id_ = 1 AND su.phone_ IN
+        <foreach collection="phones" item="phone" separator="," open="(" close=")">
+            #{phone}
+        </foreach>
+        AND su.id_ = s.user_id_
+    </select>
     <sql id="queryStudentBasicInfoSql">
         <where>
             AND su.lock_flag_ = 0 AND su.del_flag_ = 0

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

@@ -0,0 +1,4 @@
+<?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.StudentMemberUpdateLogDao">
+</mapper>

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

@@ -495,7 +495,9 @@
               AND spo.music_group_id_ = #{musicGroupId}
           </if>
           AND spo.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-          AND spo.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          <if test="groupType != null">
+              AND spo.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          </if>
           and spo.type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
     </select>
     <select id="findByStudentVipGroup" resultMap="StudentPaymentOrder">
@@ -765,7 +767,10 @@
         FROM student_payment_order spo
         LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_
         LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
-        WHERE spo.tenant_id_ = 1 AND DATE_FORMAT(spo.create_time_,'%Y-%m') = #{month} AND spo.status_ = 'SUCCESS'
+        left join music_group mg ON mg.id_ = spo.music_group_id_ AND spo.group_type_ = 'MUSIC' AND spo.type_ = 'APPLY'
+        where ((mg.musical_instruments_provide_status_ = 1 AND mg.musical_instruments_provide_time_ = #{month}) OR
+               (DATE_FORMAT(spo.pay_time_,'%Y-%m') = #{month} AND (mg.musical_instruments_provide_status_ IS NULL OR mg.musical_instruments_provide_status_ = 1)))
+        AND spo.tenant_id_ = 1 AND spo.status_ = 'SUCCESS'
         ORDER BY spo.id_ ASC
     </select>
     <resultMap id="SporadicChargeInfoDtoMap" type="com.ym.mec.biz.dal.dto.SporadicChargeInfoDto">

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

@@ -1365,6 +1365,93 @@
     <update id="updateCourseFee">
         UPDATE student_registration SET surplus_course_fee_ = surplus_course_fee_ + #{musicalFee} WHERE id_ = #{id}
     </update>
+    <update id="batchUpdate">
+        <foreach collection="studentRegistrations" item="bean" index="index" open="" close="" separator=";">
+            UPDATE student_registration
+            <set>
+                <if test="bean.expectSurplusCourseFee != null">
+                    expect_surplus_course_fee_ = #{bean.expectSurplusCourseFee},
+                </if>
+                <if test="bean.parentsPhone != null">
+                    parents_phone_ = #{bean.parentsPhone},
+                </if>
+                <if test="bean.subjectId != null">
+                    subject_id_ = #{bean.subjectId},
+                </if>
+                <if test="bean.currentGrade != null">
+                    current_grade_ = #{bean.currentGrade},
+                </if>
+                <if test="bean.currentGradeNum != null">
+                    current_grade_num_ = #{bean.currentGradeNum},
+                </if>
+                <if test="bean.currentGradeDate != null">
+                    current_grade_date_ = #{bean.currentGradeDate},
+                </if>
+                <if test="bean.currentClass != null">
+                    current_class_ = #{bean.currentClass},
+                </if>
+                <if test="bean.isAllowAdjust != null">
+                    is_allow_adjust_ = #{bean.isAllowAdjust,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="bean.kitPurchaseMethod != null">
+                    kit_purchase_method_ = #{bean.kitPurchaseMethod,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="bean.musicGroupStatus != null">
+                    music_group_status_ = #{bean.musicGroupStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="bean.userId != null">
+                    user_id_ = #{bean.userId},
+                </if>
+                <if test="bean.name != null">
+                    name_ = #{bean.name},
+                </if>
+                <if test="bean.remark != null">
+                    remark_ = #{bean.remark},
+                </if>
+                <if test="bean.paymentStatus != null">
+                    payment_status_ = #{bean.paymentStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                </if>
+                <if test="bean.parentsName != null">
+                    parents_name_ = #{bean.parentsName},
+                </if>
+                <if test="bean.updateTime != null">
+                    update_time_ = NOW(),
+                </if>
+                <if test="bean.parentsCompany != null">
+                    parents_company_ = #{bean.parentsCompany},
+                </if>
+                <if test="bean.musicGroupId != null">
+                    music_group_id_ = #{bean.musicGroupId},
+                </if>
+                <if test="bean.actualSubjectId != null">
+                    actual_subject_id_ = #{bean.actualSubjectId},
+                </if>
+                <if test="bean.classGroupId != null">
+                    class_group_id_ = #{bean.classGroupId},
+                </if>
+                <if test="bean.temporaryCourseFee != null">
+                    temporary_course_fee_ =#{bean.temporaryCourseFee},
+                </if>
+                <if test="bean.surplusCourseFee != null">
+                    surplus_course_fee_ =#{bean.surplusCourseFee},
+                </if>
+                <if test="bean.payingStatus != null">
+                    paying_status_ =#{bean.payingStatus},
+                </if>
+                <if test="bean.hasCloudTeacher != null">
+                    has_cloud_teacher_ =#{bean.hasCloudTeacher},
+                </if>
+                <if test="bean.noneNeedCloudTeacher != null">
+                    none_need_cloud_teacher_ =#{bean.noneNeedCloudTeacher},
+                </if>
+                <if test="bean.membershipEndTime != null">
+                    membership_end_time_ =#{bean.membershipEndTime},
+                </if>
+                music_group_payment_calender_id_ =#{bean.musicGroupPaymentCalenderId}
+            </set>
+            WHERE id_ = #{bean.id}
+        </foreach>
+    </update>
 
     <select id="countPayingNum" resultType="map">
         SELECT COUNT(DISTINCT user_id_) `value`, actual_subject_id_ `key`

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

@@ -289,4 +289,17 @@
                 AND mg.cooperation_organ_id_ = #{coopId}
             </if>
     </select>
+    <select id="getSubjectByStudentId" resultType="com.ym.mec.biz.dal.dto.StudentSubjectDto">
+        SELECT
+            sr.user_id_ AS studentId,
+            s.id_ AS subjectId,
+            s.name_ AS subjectName
+        FROM
+            student sr
+            LEFT JOIN `subject` s ON sr.subject_id_list_=s.id_
+        WHERE  sr.user_id_ IN
+        <foreach collection="studentIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -1561,5 +1561,13 @@
         where t.id_ = #{userId} group by t.id_)c ON 1 = 1
         where FIND_IN_SET(o.id_,c.organ_id_)
     </select>
+    <select id="queryUserByPhones" resultType="com.ym.mec.biz.dal.dto.BasicUserDto">
+        select id_ as userId,organ_id_ as organId,
+        username_ as name,avatar_ as headUrl,phone_ as phone,
+        user_type_ as userType from sys_user where tenant_id_ = 1 AND phone_ IN
+        <foreach collection="phones" item="phone" separator="," open="(" close=")">
+            #{phone}
+        </foreach>
+    </select>
 
 </mapper>

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

@@ -1060,4 +1060,10 @@
             AND cg.del_flag_!=1
             AND cgsm.user_id_=#{studentId}
     </select>
+
+    <!--获取课程人数-->
+    <select id="getCourseStudentNumsByGroupId" resultType="java.lang.Integer">
+        SELECT t2.student_num_ FROM vip_group t1 JOIN vip_group_category t2 ON (t1.vip_group_category_id_ = t2.id_) WHERE t1.id_ = #{groupId}
+    </select>
+    <!--获取课程人数-->
 </mapper>

+ 3 - 1
mec-common/audit-log/src/main/java/com/yonge/log/interceptor/AuditLogInterceptor.java

@@ -16,6 +16,7 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.net.InetAddress;
 import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -96,7 +97,8 @@ public class AuditLogInterceptor extends HandlerInterceptorAdapter {
         auditLog.setInterfaceUrl(servletPath);
         auditLog.setToken(request.getHeader("Authorization"));
         auditLog.setService(clientName);
-        auditLog.setUserIp(WebUtil.getRemoteIp(request));
+        String remoteAddr = request.getHeader("HTTP_X_FORWARDED_FOR");
+        auditLog.setUserIp(remoteAddr);
 
         Map<String, Object> params = WebUtil.getParameterMap(request);
         if (params == null || params.size() == 0) {

+ 45 - 3
mec-gateway/mec-gateway-web/src/main/java/com/ym/mec/gateway/web/filter/AuthFilter.java

@@ -2,24 +2,66 @@ package com.ym.mec.gateway.web.filter;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.bouncycastle.util.IPAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import com.netflix.zuul.ZuulFilter;
 import com.netflix.zuul.context.RequestContext;
 import com.netflix.zuul.exception.ZuulException;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
 @Component
 public class AuthFilter extends ZuulFilter {
+	private static final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
 
 	@Override
 	public Object run() throws ZuulException {//过滤器核心业务方法
-		RequestContext requestContext = RequestContext.getCurrentContext();
-		HttpServletRequest request = requestContext.getRequest();
-
 
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		requestContext.getZuulRequestHeaders().put("HTTP_X_FORWARDED_FOR", getRealIp(requestContext.getRequest()));
 		return null;
 	}
 
+	public static String getRealIp(HttpServletRequest request) {
+		String ipAddress = request.getHeader("X-Forwarded-For");
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("Proxy-Client-IP");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("HTTP_CLIENT_IP");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getRemoteAddr();
+			if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
+				// 根据网卡取本机配置的IP
+				InetAddress inet = null;
+				try {
+					inet = InetAddress.getLocalHost();
+				} catch (UnknownHostException e) {
+					e.printStackTrace();
+				}
+				ipAddress = inet.getHostAddress();
+			}
+		}
+		if (ipAddress != null && ipAddress.length() > 15) {
+			if (ipAddress.indexOf(",") > 0) {
+				ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+			}
+		}
+		return ipAddress;
+	}
+
+
 	@Override
 	public boolean shouldFilter() {// 返回true,必须执行过滤器;false,不执行过滤器
 		return true;

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

@@ -61,7 +61,7 @@ public class SealClassConfiguration {
                 supportedMediaTypes.add(MediaType.MULTIPART_FORM_DATA);
                 converter.setSupportedMediaTypes(supportedMediaTypes);
                 FastJsonConfig fastJsonConfig = new FastJsonConfig();
-                fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat);
+                fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.DisableCircularReferenceDetect);
                 converter.setFastJsonConfig(fastJsonConfig);
                 converters.add(converter);
             }

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

@@ -26,7 +26,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/room/statusImMsg", "/group/batchDismiss", "/private/send", "/group/send", "/user/tencentImCallback",
                         "/group/dismiss", "/room/statusImMsg", "/history/get", "/user/statusImUser", "/liveRoom/recordSync",
                         "/liveRoom/publishRoomMsg", "/liveRoom/destroy", "/liveRoom/create", "/liveRoom/startRecord",
-                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline",
+                        "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline","/room/statusSyncTencent",
                         "/user/tencentStreamEventCallback", "/user/tencentStreamRecordCallback", "/user/tencentStreamExceptionCallback",
                         "/liveRoom/addUserUnableSpeak","/liveRoom/removeUserUnableSpeak","/liveRoom/syncChatRoomStatus","/liveRoom/tencentImCallback")
                 .permitAll().anyRequest().authenticated().and().csrf().disable();

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

@@ -2,15 +2,21 @@ package com.ym.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.ym.common.BaseResponse;
+import com.ym.mec.biz.dal.dto.TencentData;
+import com.ym.mec.biz.dal.enums.ETencentTRTCCallbackCommand;
 import com.ym.pojo.*;
 import com.ym.service.MessageService;
 import com.ym.service.RoomService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/room")
@@ -23,7 +29,16 @@ public class RoomController{
 
     @RequestMapping(value = "/join", method = RequestMethod.POST)
     public BaseResponse joinRoom(@RequestBody ReqUserData data) throws Exception {
-        return roomService.joinRoom(data.getRoomId());
+        return roomService.joinRoom(data.getRoomId(), true);
+    }
+
+    @ApiOperation("查询网络教室信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomId", value = "房间id", required = true, dataType = "String", paramType = "query")
+    })
+    @GetMapping(value = "/info")
+    public BaseResponse getRoomInfo(@RequestParam String roomId) throws Exception {
+        return roomService.joinRoom(roomId.substring(1), false);
     }
 
     @RequestMapping(value = "/signIn", method = RequestMethod.POST)
@@ -39,7 +54,7 @@ public class RoomController{
     @RequestMapping(value = "/leave", method = RequestMethod.POST)
     public Object leaveRoom(@RequestBody RoomStatusNotify roomStatusNotify) throws Exception {
         //成员退出
-        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId(),roomStatusNotify.getDeviceNum());
+        roomService.leaveRoomSuccess(roomStatusNotify.getRoomId(), roomStatusNotify.getUserId(), roomStatusNotify.getDeviceNum());
         return new BaseResponse<>();
     }
 
@@ -96,7 +111,7 @@ public class RoomController{
                     break;
                 case 12:
                     //成员退出
-                    roomService.leaveRoomSuccess(roomId, userId,null);
+                    roomService.leaveRoomSuccess(roomId, userId,null, notify.getTimestamp());
                     break;
             }
         }catch (Exception e){
@@ -104,6 +119,43 @@ public class RoomController{
         }
     }
 
+
+    @PostMapping(value = "/statusSyncTencent")
+    public void statusSyncTencent(@RequestBody TencentData.TRTCEventInfo eventInfo) {
+        try {
+            if (Objects.isNull(eventInfo.getEventInfo())) {
+                log.warn("statusSyncTencent eventInfo is null, time={}", DateTime.now().toString("yyy-MM-dd HH:mm:ss"));
+                return;
+            }
+            log.info("statusSyncTencent: {}", eventInfo.jsonString());
+            String roomId = eventInfo.getEventInfo().getRoomId();
+
+            // 网络教室回调整消息
+            if (roomId.startsWith("S") || roomId.startsWith("I")) {
+                // 进出用户信息
+                String userId = eventInfo.getEventInfo().getUserId();
+                switch (ETencentTRTCCallbackCommand.get(eventInfo.getEventType())){
+                    case EVENT_TYPE_ENTER_ROOM:
+                        //成员加入
+                        roomService.joinRoomSuccess(roomId, userId,null);
+                        break;
+                    case EVENT_TYPE_EXIT_ROOM:
+                        //成员退出
+                        roomService.leaveRoomSuccess(roomId, userId,null, eventInfo.getCallbackTs());
+                        break;
+                    default:
+                        // 默认事件,直接忽略
+                        break;
+                }
+            }
+
+            // 直播回调整消息, roomId.startsWith("LIVE")
+
+        }catch (Exception e){
+            log.error("statusSyncTencent event={}", eventInfo.jsonString(), e);
+        }
+    }
+
     @RequestMapping(value = "/downgrade", method = RequestMethod.POST)
     public Object downRole(@RequestBody ReqChangeUserRoleData data)
             throws Exception {
@@ -209,10 +261,14 @@ public class RoomController{
         return new BaseResponse<>(result);
     }
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomId", value = "房间id", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "userId", value = "用户Id", dataType = "String"),
+    })
     @RequestMapping(value = "/members", method = RequestMethod.GET)
-    public Object getMembers(@RequestParam String roomId)
+    public Object getMembers(@RequestParam String roomId, @RequestParam String userId)
             throws Exception {
-        List<RoomResult.MemberResult> whiteboards = roomService.getMembers(roomId);
+        List<RoomResult.MemberResult> whiteboards = roomService.getMembers(roomId, userId);
         return new BaseResponse<>(whiteboards);
     }
 

+ 19 - 0
mec-im/src/main/java/com/ym/dao/RoomMemberDao.java

@@ -58,4 +58,23 @@ public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
     int updateMusicByRidAndUid(String rid, String uid, boolean musicMode);
 
     boolean existsByRidAndUid(String rid, String uid);
+
+    @Modifying
+    @Query(value = "update rongyun_room_member set camera=?3 where rid=?1 and role=?2", nativeQuery = true)
+    void updateCameraByRidAndRole(String roomId, int role, boolean enable);
+
+
+    @Modifying
+    @Query(value = "update rongyun_room_member set mic=?3 where rid=?1 and role=?2", nativeQuery = true)
+    void updateMicByRidAndRole(String roomId, int role, boolean enable);
+
+
+    @Modifying
+    @Query(value = "update rongyun_room_member set music_mode=?3 where rid=?1 and role=?2", nativeQuery = true)
+    void updateMusicByRidAndRole(String roomId, int role, boolean enable);
+
+
+    @Modifying
+    @Query(value = "update rongyun_room_member set hand=?3 where rid=?1 and role=?2", nativeQuery = true)
+    void updateHandByRidAndRole(String roomId, int role, boolean enable);
 }

+ 18 - 7
mec-im/src/main/java/com/ym/enums/DeviceTypeEnum.java

@@ -1,11 +1,22 @@
 package com.ym.enums;
 
 public enum DeviceTypeEnum {
-    Microphone,
-    Camera,
-    MusicMode,
-    HandUp,
-    ExamSong,
-    MusicScore,
-    MusicScoreAccompaniment,
+    Microphone(1),
+    Camera(2),
+    MusicMode(3),
+    HandUp(4),
+    ExamSong(5),
+    MusicScore(6),
+    MusicScoreAccompaniment(7),;
+
+
+    private int value;
+
+    DeviceTypeEnum(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
 }

Some files were not shown because too many files changed in this diff