浏览代码

Merge branch 'zx_course_convert' of http://git.dayaedu.com/yonge/mec into master_saas

zouxuan 2 年之前
父节点
当前提交
2514253372
共有 82 个文件被更改,包括 1936 次插入364 次删除
  1. 15 4
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
  2. 15 4
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherFreeCourseDao.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java
  6. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  7. 2 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  8. 10 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  10. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  11. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertClassDto.java
  12. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDto.java
  13. 5 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java
  14. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseTimeDto.java
  15. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentBaseCalender.java
  16. 153 15
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java
  17. 177 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java
  18. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  19. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  20. 17 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  21. 32 32
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java
  22. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupQueryInfo.java
  23. 3 10
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  24. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java
  25. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java
  26. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherFreeCourseService.java
  27. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseConvertLogService.java
  28. 14 2
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java
  29. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  30. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  31. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  32. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  33. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  34. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  35. 37 89
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  36. 46 61
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  37. 38 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  38. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherFreeCourseServiceImpl.java
  39. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  40. 86 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java
  41. 190 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java
  42. 202 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  43. 57 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  44. 59 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  45. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  46. 24 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  47. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  48. 13 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  49. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  50. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java
  51. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  52. 2 4
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  53. 7 4
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  54. 8 2
      mec-biz/src/main/resources/config/mybatis/CloudTeacherFreeCourseMapper.xml
  55. 2 3
      mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml
  56. 52 0
      mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml
  57. 3 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleConvert.xml
  58. 10 5
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  59. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  60. 13 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  61. 9 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  62. 6 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  63. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  64. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  65. 4 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  66. 4 0
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  67. 5 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  68. 1 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java
  69. 2 2
      mec-mall/mall-admin/src/main/resources/bootstrap-prod.yml
  70. 69 0
      mec-mall/mall-admin/src/main/resources/logback-spring.xml
  71. 21 4
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  72. 25 15
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  73. 2 2
      mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml
  74. 69 0
      mec-mall/mall-portal/src/main/resources/logback-spring.xml
  75. 5 0
      mec-student/src/main/resources/logback-spring.xml
  76. 10 0
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  77. 7 1
      mec-web/src/main/java/com/ym/mec/web/controller/ChargeTypeController.java
  78. 12 9
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java
  79. 80 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  80. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/StudentInstrumentController.java
  81. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/StudentStatisticsController.java
  82. 5 4
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

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

@@ -11,8 +11,11 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.web.WebFeignService;
+
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -87,16 +90,24 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 		}
 		PageInfo<SysNewsInformation> app = queryHomePage(queryInfo);
 		if(!CollectionUtils.isEmpty(app.getRows()) && user != null && user.getId() != null){
-			for (SysNewsInformation row : app.getRows()) {
-				if(row.getTitle().equals("进阶课堂")){
+			
+			Iterator<SysNewsInformation> iterator = app.getRows().iterator();
+			SysNewsInformation sni = null;
+    		while(iterator.hasNext()){
+    			sni = iterator.next();
+    			if(TenantContextHolder.getTenantId() != 1 && StringUtils.indexOf(sni.getTitle(), "商城") >= 0){
+    				iterator.remove();
+    				app.setTotal(app.getTotal() - 1);
+    			}else if(sni.getTitle().equals("进阶课堂")){
 					try {
 						//当前学员是否有可购买vip课
-						row.setRedDot(webFeignService.queryVipPracticeGroups());
+						sni.setRedDot(webFeignService.queryVipPracticeGroups());
 					}catch (Exception e){
 						e.printStackTrace();
 					}
 				}
-			}
+    		}
+    		
 		}
 		homeList.put("app",app);
 		return homeList;

+ 15 - 4
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java

@@ -8,10 +8,14 @@ import com.ym.mec.cms.dal.entity.SysNewsTypeTree;
 import com.ym.mec.cms.service.SysNewsTypeService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
+
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -56,11 +60,18 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType
 
         all.forEach(e -> {
             List<SysNewsInformation> list = informationDao.queryBySubType(e.getId(), memo);
-            if (CollectionUtils.isNotEmpty(list)) {
-                e.setInformationList(list);
-            } else {
-                e.setInformationList(informationDao.queryBySubType(e.getId(), null));
+            if (CollectionUtils.isEmpty(list)) {
+            	list = informationDao.queryBySubType(e.getId(), null);
             }
+            Iterator<SysNewsInformation> iterator = list.iterator();
+			SysNewsInformation sni = null;
+    		while(iterator.hasNext()){
+    			sni = iterator.next();
+    			if(TenantContextHolder.getTenantId() != 1 && StringUtils.indexOf(sni.getTitle(), "商城") >= 0){
+    				iterator.remove();
+    			}
+    		}
+            e.setInformationList(list);
         });
         List<SysNewsType> treeMenus = all.stream()
                 .filter((e) -> e.getParentId().equals(newsType.getParentId()))

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

@@ -488,4 +488,6 @@ public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStud
                                                      @Param("teacherId") Integer teacherId, @Param("musicGroupId") String musicGroupId);
     
     List<ClassGroupStudentMapperDto> queryByClassGroupType(@Param("musicGroupId") String musicGroupId,@Param("classGroupType") ClassGroupTypeEnum classGroupType,@Param("teacherRole") TeachTypeEnum teacherRole, @Param("studentIdList") List<Integer> studentIdList);
+
+    List<Integer> findByUserIdsAndClassIds(@Param("studentIds") String studentIds, @Param("oldClassIds") String oldClassIds);
 }

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

@@ -9,4 +9,6 @@ import java.util.List;
 public interface CloudTeacherFreeCourseDao extends BaseDAO<Long, CloudTeacherFreeCourse> {
 
     void batchInsert(@Param("scheduleIdList") String scheduleIdList, @Param("calenderId") Long calenderId);
+
+    void deleteByCourseIds(@Param("courseIdList") List<Long> courseIdList);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseConvertLogDao.java

@@ -0,0 +1,10 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface CourseConvertLogDao extends BaseDAO<Integer, CourseConvertLog> {
+
+
+    void updateRevoke(Integer courseConvertId);
+}

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

@@ -1954,4 +1954,11 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     * @date 2022/9/6 14:07
     */
     void markFreeCourse(@Param("courseIds") String courseIds);
+
+    /**
+     * 查询已开课乐团列表
+     * @return
+     */
+    List<String> queryStartedCourseMusicGroupIdList(String groupType);
+
 }

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

@@ -39,10 +39,10 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
      * @Author: Joburgess
      * @Date: 2019/10/15
-     * @params [ids]
+     * @params [courseIdList]
      * @describe 根据课程编号批量获取学生缴费信息
      */
-    List<CourseScheduleStudentPayment> findByCourseScheduleIds(@Param("ids") List<Long> ids);
+    List<CourseScheduleStudentPayment> findByCourseScheduleIds(@Param("courseIdList") List<Long> courseIdList);
 
     /**
      * 删除学生对应的课程
@@ -617,5 +617,4 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @return
      */
     List<StudentOrganDto> queryRemainCourseStudent(@Param("organIds") List<Integer> organIds);
-
 }

+ 10 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -1,18 +1,16 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.StudentSubTotalCourseTimesDto;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.dto.StudentSubTotalCourseTimesDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.common.dal.BaseDAO;
 
-import org.apache.ibatis.annotations.Param;
-
 public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> {
 
     /**
@@ -132,4 +130,10 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
                              @Param("courseTypes") List<CourseSchedule.CourseScheduleType> courseTypes,
                              @Param("studentIds") List<Integer> studentIds);
 
+    /**
+     * 清除指定乐团学生的剩余未排课时长
+     * @param musicGroupId
+     * @return
+     */
+    int clearRemainCourseMinutesByMusicGroupId(String musicGroupId);
 }

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

@@ -488,7 +488,7 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      * @param organId
      * @return
      */
-    List<TeacherBasicDto> findByFlowOrganRangeTeachers(@Param("organId") String organId,@Param("demissionFlag") Boolean demissionFlag);
+    List<TeacherBasicDto> findByFlowOrganRangeTeachers(@Param("organId") String organId,@Param("demissionFlag") Boolean demissionFlag,@Param("isForzenWithQueryCondition") Boolean isForzenWithQueryCondition);
 
     /**
      * 根据教师编号列表获取名称map

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

@@ -77,7 +77,7 @@ public class ClassGroup4MixDto implements Cloneable{
     private Boolean allowZeroSalary = false;
 
     @ApiModelProperty(value = "确认生成课程")
-    private Boolean confirmGenerate;
+    private Boolean confirmGenerate = false;
 
     @ApiModelProperty(value = "预排课学期编号")
     private Integer musicGroupSchoolTermCourseDetailId;

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertClassDto.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class CourseConvertClassDto{
+
+    @ApiModelProperty(value = "是否继续提交")
+    private Boolean checkCourseTimesFlag = false;
+
+    @ApiModelProperty(value = "老师设置", required = true)
+    private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+    @ApiModelProperty(value = "排课次数", required = true)
+    private Integer courseTimes;
+
+    @ApiModelProperty(value = "排课循环方式", required = true)
+    private List<CourseTimeDto> courseTimeDtoList;
+
+    @ApiModelProperty(value = "是否允许0课酬")
+    private Boolean allowZeroSalary = false;
+
+    @ApiModelProperty(value = "确认生成课程")
+    private Boolean confirmGenerate = false;
+
+    public Boolean getCheckCourseTimesFlag() {
+        return checkCourseTimesFlag;
+    }
+
+    public void setCheckCourseTimesFlag(Boolean checkCourseTimesFlag) {
+        this.checkCourseTimesFlag = checkCourseTimesFlag;
+    }
+
+    public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+        return classGroupTeacherMapperList;
+    }
+
+    public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+        this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+    }
+
+    public Integer getCourseTimes() {
+        return courseTimes;
+    }
+
+    public void setCourseTimes(Integer courseTimes) {
+        this.courseTimes = courseTimes;
+    }
+
+    public List<CourseTimeDto> getCourseTimeDtoList() {
+        return courseTimeDtoList;
+    }
+
+    public void setCourseTimeDtoList(List<CourseTimeDto> courseTimeDtoList) {
+        this.courseTimeDtoList = courseTimeDtoList;
+    }
+
+    public Boolean getAllowZeroSalary() {
+        return allowZeroSalary;
+    }
+
+    public void setAllowZeroSalary(Boolean allowZeroSalary) {
+        this.allowZeroSalary = allowZeroSalary;
+    }
+
+    public Boolean getConfirmGenerate() {
+        return confirmGenerate;
+    }
+
+    public void setConfirmGenerate(Boolean confirmGenerate) {
+        this.confirmGenerate = confirmGenerate;
+    }
+}

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

@@ -1,18 +1,18 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
 
 import java.util.List;
 
 public class CourseConvertDto {
 
-    private List<ClassGroup> classGroups;
+    private List<ClassGroupDto> classGroups;
 
-    public List<ClassGroup> getClassGroups() {
+    public List<ClassGroupDto> getClassGroups() {
         return classGroups;
     }
 
-    public void setClassGroups(List<ClassGroup> classGroups) {
+    public void setClassGroups(List<ClassGroupDto> classGroups) {
         this.classGroups = classGroups;
     }
 }

+ 5 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+
 public class CourseConvertSumDto {
     private Integer courseNum;
 
-    private String courseType;
+    private CourseSchedule.CourseScheduleType courseType;
 
     private Integer studentNum;
 
@@ -17,11 +19,11 @@ public class CourseConvertSumDto {
         this.courseNum = courseNum;
     }
 
-    public String getCourseType() {
+    public CourseSchedule.CourseScheduleType getCourseType() {
         return courseType;
     }
 
-    public void setCourseType(String courseType) {
+    public void setCourseType(CourseSchedule.CourseScheduleType courseType) {
         this.courseType = courseType;
     }
 

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

@@ -40,7 +40,7 @@ public class CourseTimeDto {
     @ApiModelProperty(value = "是否跳过节假日 true-跳过 false-不跳过", required = true)
     private Boolean isHoliday = false;
 
-    @ApiModelProperty(value = "老师设置", required = true)
+    @ApiModelProperty(value = "课程老师设置", required = true)
     private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
 
     public int getExpectCourseMinutes() {

+ 13 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentBaseCalender.java

@@ -53,7 +53,10 @@ public class MusicGroupPaymentBaseCalender {
 
 	@ApiModelProperty(value = "进行中加学员拓展信息", required = false)
 	private CalenderAddStudent calenderAddStudent;
-
+	
+	@ApiModelProperty(value = "缴费项目显示状态", required = false)
+	private String paymentItemShowState;
+	
 	public Boolean getConfirmCreate() {
 		return confirmCreate;
 	}
@@ -181,4 +184,13 @@ public class MusicGroupPaymentBaseCalender {
 	public void setBatchNo(String batchNo) {
 		this.batchNo = batchNo;
 	}
+
+	public String getPaymentItemShowState() {
+		return paymentItemShowState;
+	}
+
+	public void setPaymentItemShowState(String paymentItemShowState) {
+		this.paymentItemShowState = paymentItemShowState;
+	}
+
 }

+ 153 - 15
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java

@@ -1,18 +1,41 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.dto.CourseTimeDto;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class ClassGroupDto extends BaseEntity {
 
+	@ApiModelProperty(value = "是否确认生成课程", required = true)
+	private Boolean confirmGenerate = false;
+
+	@ApiModelProperty(value = "是否转换课", required = true)
+	private Boolean convertFlag = true;
+
+	@ApiModelProperty(value = "排课校验方式:0按总时长,1按课次", required = true)
+	private int checkType = 0;
+
+	@ApiModelProperty(value = "选择的需要转换的课程编号", required = true)
+	private String courseIds;
+
+	@ApiModelProperty(value = "班级编号", required = true)
+	private Integer classGroupId;
+
+	@NotNull(message = "课程组类型不能为空")
+	@ApiModelProperty(value = "课程组类型", required = true)
 	private GroupType groupType;
 
+	@ApiModelProperty(value = "确认0元课酬", required = true)
+	private Boolean allowZeroSalary = false;
+
 	/**  */
 	@ApiModelProperty(value = "乐团编号", required = true)
 	private String musicGroupId;
@@ -21,6 +44,7 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "科目编号(多个,号分割)", required = true)
 	private String subjectIdList;
 
+	@NotBlank(message = "学生编号不能为空")
 	@ApiModelProperty(value = "学生编号(多个,号分割)", required = true)
 	private String userIds;
 
@@ -32,11 +56,133 @@ public class ClassGroupDto extends BaseEntity {
 	@ApiModelProperty(value = "预计招生人数", required = true)
 	private Integer expectStudentNum;
 
+	@ApiModelProperty(value = "学生数量", required = false)
+	private Integer studentNum;
+
+	/** 班级类型(普通班级、合奏班级) */
+	@ApiModelProperty(value = "课程类型", required = true)
+	@NotNull(message = "课程类型不能为空")
+	private CourseSchedule.CourseScheduleType courseScheduleType = CourseSchedule.CourseScheduleType.HIGH_ONLINE;
+
 	/** 班级类型(普通班级、合奏班级) */
-	@ApiModelProperty(value = "班级类型(普通班级、合奏班级、提高课班级、VIP班级、试听课)", required = true)
+	@ApiModelProperty(value = "课程类型", required = true)
+	@NotNull(message = "课程类型不能为空")
 	private ClassGroupTypeEnum type;
 
-	private List<ClassGroupTeacherMapper> teacherMapperList = new ArrayList<ClassGroupTeacherMapper>();
+	@ApiModelProperty(value = "班级老师设置", required = true)
+	private List<ClassGroupTeacherMapper> classGroupTeacherMapperList;
+
+	@ApiModelProperty(value = "排课周期", required = true)
+	private List<CourseTimeDto> courseTimeDtoList;
+
+	@ApiModelProperty(value = "获取可转换的课程时长", required = true)
+	Map<String, Integer> courseTypeMinutesMap;
+
+	@ApiModelProperty(value = "老师课酬", required = true)
+	List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+
+	@ApiModelProperty(value = "学员课程关联", required = true)
+	List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+
+	public CourseSchedule.CourseScheduleType getCourseScheduleType() {
+		return courseScheduleType;
+	}
+
+	public void setCourseScheduleType(CourseSchedule.CourseScheduleType courseScheduleType) {
+		this.courseScheduleType = courseScheduleType;
+	}
+
+	public void setType(ClassGroupTypeEnum type) {
+		this.type = type;
+	}
+
+	public Boolean getConfirmGenerate() {
+		return confirmGenerate;
+	}
+
+	public void setConfirmGenerate(Boolean confirmGenerate) {
+		this.confirmGenerate = confirmGenerate;
+	}
+
+	public List<CourseScheduleStudentPayment> getCourseScheduleStudentPayments() {
+		return courseScheduleStudentPayments;
+	}
+
+	public void setCourseScheduleStudentPayments(List<CourseScheduleStudentPayment> courseScheduleStudentPayments) {
+		this.courseScheduleStudentPayments = courseScheduleStudentPayments;
+	}
+
+	public List<CourseScheduleTeacherSalary> getCourseScheduleTeacherSalaryList() {
+		return courseScheduleTeacherSalaryList;
+	}
+
+	public void setCourseScheduleTeacherSalaryList(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList) {
+		this.courseScheduleTeacherSalaryList = courseScheduleTeacherSalaryList;
+	}
+
+	public Boolean getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(Boolean convertFlag) {
+		this.convertFlag = convertFlag;
+	}
+
+	public int getCheckType() {
+		return checkType;
+	}
+
+	public void setCheckType(int checkType) {
+		this.checkType = checkType;
+	}
+
+	public String getCourseIds() {
+		return courseIds;
+	}
+
+	public void setCourseIds(String courseIds) {
+		this.courseIds = courseIds;
+	}
+
+	public Map<String, Integer> getCourseTypeMinutesMap() {
+		return courseTypeMinutesMap;
+	}
+
+	public void setCourseTypeMinutesMap(Map<String, Integer> courseTypeMinutesMap) {
+		this.courseTypeMinutesMap = courseTypeMinutesMap;
+	}
+
+	public Boolean getAllowZeroSalary() {
+		return allowZeroSalary;
+	}
+
+	public void setAllowZeroSalary(Boolean allowZeroSalary) {
+		this.allowZeroSalary = allowZeroSalary;
+	}
+
+	public Integer getStudentNum() {
+		return studentNum;
+	}
+
+	public void setStudentNum(Integer studentNum) {
+		this.studentNum = studentNum;
+	}
+
+	public List<ClassGroupTeacherMapper> getClassGroupTeacherMapperList() {
+		return classGroupTeacherMapperList;
+	}
+
+	public void setClassGroupTeacherMapperList(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
+		this.classGroupTeacherMapperList = classGroupTeacherMapperList;
+	}
+
+	public Integer getClassGroupId() {
+		return classGroupId;
+	}
+
+	public void setClassGroupId(Integer classGroupId) {
+		this.classGroupId = classGroupId;
+	}
 
 	public GroupType getGroupType() {
 		return groupType;
@@ -86,19 +232,11 @@ public class ClassGroupDto extends BaseEntity {
 		this.expectStudentNum = expectStudentNum;
 	}
 
-	public ClassGroupTypeEnum getType() {
-		return type;
-	}
-
-	public void setType(ClassGroupTypeEnum type) {
-		this.type = type;
-	}
-
-	public List<ClassGroupTeacherMapper> getTeacherMapperList() {
-		return teacherMapperList;
+	public List<CourseTimeDto> getCourseTimeDtoList() {
+		return courseTimeDtoList;
 	}
 
-	public void setTeacherMapperList(List<ClassGroupTeacherMapper> teacherMapperList) {
-		this.teacherMapperList = teacherMapperList;
+	public void setCourseTimeDtoList(List<CourseTimeDto> courseTimeDtoList) {
+		this.courseTimeDtoList = courseTimeDtoList;
 	}
 }

+ 177 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseConvertLog.java

@@ -0,0 +1,177 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+/**
+ * 对应数据库表(course_convert_log):
+ */
+public class CourseConvertLog {
+
+	private Integer id;
+	
+	@ApiModelProperty(value = "学员编号列表")
+	private String studentIds;
+
+	/** 转换前课程编号 */
+	@ApiModelProperty(value = "转换前课程编号")
+	private String oldCourseIds;
+	
+	/** 转换前班级编号 */
+	@ApiModelProperty(value = "转换前班级编号")
+	private String oldClassIds;
+	
+	@ApiModelProperty(value = "转换前课表")
+	private String oldCourseJson;
+
+	@ApiModelProperty(value = "转换前老师课酬")
+	private String oldCourseTeacherSalaryJson;
+
+	@ApiModelProperty(value = "转换前课程学员关联")
+	private String oldCourseStudentMapperJson;
+	
+	/** 转换前的老师考勤记录 */
+	@ApiModelProperty(value = "转换前的老师考勤记录")
+	private String oldTeacherAttendanceJson;
+	
+	/** 转换后的课程编号 */
+	@ApiModelProperty(value = "转换后的课程编号")
+	private String newCourseIds;
+	
+	/** 转换后的班级编号 */
+	@ApiModelProperty(value = "转换后的班级编号")
+	private String newClassIds;
+
+	/** 转换后的班级编号 */
+	@ApiModelProperty(value = "操作人")
+	private Integer operator;
+
+	@ApiModelProperty(value = "是否还原")
+	private Boolean revokeFlag = false;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	public String getStudentIds() {
+		return studentIds;
+	}
+
+	public void setStudentIds(String studentIds) {
+		this.studentIds = studentIds;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getOldCourseIds() {
+		return oldCourseIds;
+	}
+
+	public void setOldCourseIds(String oldCourseIds) {
+		this.oldCourseIds = oldCourseIds;
+	}
+
+	public String getOldClassIds() {
+		return oldClassIds;
+	}
+
+	public void setOldClassIds(String oldClassIds) {
+		this.oldClassIds = oldClassIds;
+	}
+
+	public String getOldCourseJson() {
+		return oldCourseJson;
+	}
+
+	public void setOldCourseJson(String oldCourseJson) {
+		this.oldCourseJson = oldCourseJson;
+	}
+
+	public String getOldCourseTeacherSalaryJson() {
+		return oldCourseTeacherSalaryJson;
+	}
+
+	public void setOldCourseTeacherSalaryJson(String oldCourseTeacherSalaryJson) {
+		this.oldCourseTeacherSalaryJson = oldCourseTeacherSalaryJson;
+	}
+
+	public String getOldCourseStudentMapperJson() {
+		return oldCourseStudentMapperJson;
+	}
+
+	public void setOldCourseStudentMapperJson(String oldCourseStudentMapperJson) {
+		this.oldCourseStudentMapperJson = oldCourseStudentMapperJson;
+	}
+
+	public String getOldTeacherAttendanceJson() {
+		return oldTeacherAttendanceJson;
+	}
+
+	public void setOldTeacherAttendanceJson(String oldTeacherAttendanceJson) {
+		this.oldTeacherAttendanceJson = oldTeacherAttendanceJson;
+	}
+
+	public String getNewCourseIds() {
+		return newCourseIds;
+	}
+
+	public void setNewCourseIds(String newCourseIds) {
+		this.newCourseIds = newCourseIds;
+	}
+
+	public String getNewClassIds() {
+		return newClassIds;
+	}
+
+	public void setNewClassIds(String newClassIds) {
+		this.newClassIds = newClassIds;
+	}
+
+	public Integer getOperator() {
+		return operator;
+	}
+
+	public void setOperator(Integer operator) {
+		this.operator = operator;
+	}
+
+	public Boolean getRevokeFlag() {
+		return revokeFlag;
+	}
+
+	public void setRevokeFlag(Boolean revokeFlag) {
+		this.revokeFlag = revokeFlag;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -201,6 +201,17 @@ public class CourseSchedule  extends BaseEntity{
 	//学员学习标准是否评价1是0否
 	private int evaluateFlag = 0;
 
+	//当前课程是否是转换课
+	private Boolean convertFlag = false;
+
+	public Boolean getConvertFlag() {
+		return convertFlag;
+	}
+
+	public void setConvertFlag(Boolean convertFlag) {
+		this.convertFlag = convertFlag;
+	}
+
 	public int getEvaluateFlag() {
 		return evaluateFlag;
 	}

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

@@ -209,6 +209,9 @@ public class MusicGroup extends BaseEntity {
 	private Boolean isGiveAccessories;
 	
 	private ClassGroupTypeEnum extracurricularTeacher;
+	
+	@ApiModelProperty(value = "第一节课实际开始时间",required = false)
+	private Date firstCourseStartTime;
 
 	public String getMusicalInstrumentsProvideTime() {
 		return musicalInstrumentsProvideTime;
@@ -723,4 +726,12 @@ public class MusicGroup extends BaseEntity {
 	public void setExtracurricularTeacher(ClassGroupTypeEnum extracurricularTeacher) {
 		this.extracurricularTeacher = extracurricularTeacher;
 	}
+
+	public Date getFirstCourseStartTime() {
+		return firstCourseStartTime;
+	}
+
+	public void setFirstCourseStartTime(Date firstCourseStartTime) {
+		this.firstCourseStartTime = firstCourseStartTime;
+	}
 }

+ 17 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java

@@ -1,17 +1,18 @@
 package com.ym.mec.biz.dal.entity;
 
-import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.dal.enums.PeriodEnum;
-import com.ym.mec.common.entity.BaseEntity;
-import com.ym.mec.common.enums.BaseEnum;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.common.entity.BaseEntity;
+import com.ym.mec.common.enums.BaseEnum;
+
 /**
  * 对应数据库表(music_group_payment_calender):
  */
@@ -201,6 +202,9 @@ public class MusicGroupPaymentCalender extends BaseEntity {
 
 	@ApiModelProperty(value = "标记是否云教练缴费项目",required = false)
 	private Boolean cloudTeacherPaymentFlag = false;
+	
+	@ApiModelProperty(value = "缴费项目显示状态", required = false)
+	private String paymentItemShowState;
 
 	public Boolean getCloudTeacherPaymentFlag() {
 		return cloudTeacherPaymentFlag;
@@ -490,6 +494,14 @@ public class MusicGroupPaymentCalender extends BaseEntity {
 		this.attribute2 = attribute2;
 	}
 
+	public String getPaymentItemShowState() {
+		return paymentItemShowState;
+	}
+
+	public void setPaymentItemShowState(String paymentItemShowState) {
+		this.paymentItemShowState = paymentItemShowState;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 32 - 32
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentVisit.java

@@ -13,7 +13,7 @@ import java.util.Date;
 public class StudentVisit extends BaseEntity {
 
     public enum VisiterTypeEnum implements BaseEnum<String, TeachModeEnum> {
-        TEACHER("TEACHER", "指导老师"), EDU_TEACHER("EDU_TEACHER", "教务老师");
+        TEACHER("TEACHER", "指导老师"), EDU_TEACHER("EDU_TEACHER", "乐团主管");
 
         private String code;
 
@@ -189,7 +189,7 @@ public class StudentVisit extends BaseEntity {
 
     private Long objectId;
 
-    private Integer probStatus;
+    private Integer probStatus = 0;
 
     private String visitCyCle;
 
@@ -197,30 +197,6 @@ public class StudentVisit extends BaseEntity {
     @ApiModelProperty(value = "回访图片", required = true)
     private String attachments;
 
-    public String getAttachments() {
-        return attachments;
-    }
-
-    public void setAttachments(String attachments) {
-        this.attachments = attachments;
-    }
-
-    public FeedbackTypeDescEnum getFeedbackTypeDesc() {
-        return feedbackTypeDesc;
-    }
-
-    public void setFeedbackTypeDesc(FeedbackTypeDescEnum feedbackTypeDesc) {
-        this.feedbackTypeDesc = feedbackTypeDesc;
-    }
-
-    public FeedbackTypeEnum getFeedbackType() {
-        return feedbackType;
-    }
-
-    public void setFeedbackType(FeedbackTypeEnum feedbackType) {
-        this.feedbackType = feedbackType;
-    }
-
     public Integer getId() {
         return id;
     }
@@ -233,6 +209,10 @@ public class StudentVisit extends BaseEntity {
         return musicGroupId;
     }
 
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
     public Integer getOrganId() {
         return organId;
     }
@@ -241,10 +221,6 @@ public class StudentVisit extends BaseEntity {
         this.organId = organId;
     }
 
-    public void setMusicGroupId(String musicGroupId) {
-        this.musicGroupId = musicGroupId;
-    }
-
     public Integer getStudentId() {
         return studentId;
     }
@@ -293,6 +269,22 @@ public class StudentVisit extends BaseEntity {
         this.overview = overview;
     }
 
+    public FeedbackTypeEnum getFeedbackType() {
+        return feedbackType;
+    }
+
+    public void setFeedbackType(FeedbackTypeEnum feedbackType) {
+        this.feedbackType = feedbackType;
+    }
+
+    public FeedbackTypeDescEnum getFeedbackTypeDesc() {
+        return feedbackTypeDesc;
+    }
+
+    public void setFeedbackTypeDesc(FeedbackTypeDescEnum feedbackTypeDesc) {
+        this.feedbackTypeDesc = feedbackTypeDesc;
+    }
+
     public String getFeedback() {
         return feedback;
     }
@@ -325,11 +317,11 @@ public class StudentVisit extends BaseEntity {
         this.objectId = objectId;
     }
 
-    public int getProbStatus() {
+    public Integer getProbStatus() {
         return probStatus;
     }
 
-    public void setProbStatus(int probStatus) {
+    public void setProbStatus(Integer probStatus) {
         this.probStatus = probStatus;
     }
 
@@ -340,4 +332,12 @@ public class StudentVisit extends BaseEntity {
     public void setVisitCyCle(String visitCyCle) {
         this.visitCyCle = visitCyCle;
     }
+
+    public String getAttachments() {
+        return attachments;
+    }
+
+    public void setAttachments(String attachments) {
+        this.attachments = attachments;
+    }
 }

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

@@ -48,6 +48,9 @@ public class MusicGroupQueryInfo extends QueryInfo {
     private Date billStartDate;
     
     private Date billEndDate;
+    
+    @ApiModelProperty(value = "是否开课")
+    private Boolean isStartedCourse;
 
     @ApiModelProperty(value = "维修技师")
     private Integer repairUserId;
@@ -187,4 +190,12 @@ public class MusicGroupQueryInfo extends QueryInfo {
 	public void setBillEndDate(Date billEndDate) {
 		this.billEndDate = billEndDate;
 	}
+
+	public Boolean getIsStartedCourse() {
+		return isStartedCourse;
+	}
+
+	public void setIsStartedCourse(Boolean isStartedCourse) {
+		this.isStartedCourse = isStartedCourse;
+	}
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -19,6 +20,8 @@ import java.util.List;
 import java.util.Map;
 
 public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
+
+    ClassGroupDao getDao();
 	
 	PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
 
@@ -342,9 +345,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 
 
 
-    List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId);
-
-
     /**
      * 根据乐团跟声部获取提高班列表
      *
@@ -510,13 +510,6 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      */
     Map<String,Long> findClassCourseMinuteMap(List<Integer> classGroupIds,Map<String,Long> classCourseMinuteMap);
 
-    /**
-     * 获取基础技能班/线上基础技能班数量和容许最大数量
-     * @param musicGroupId
-     * @param type
-     * @return
-     */
-    HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type);
 
     /**
      * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupStudentMapperService.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
@@ -15,6 +17,8 @@ import java.util.Set;
 
 public interface ClassGroupStudentMapperService extends BaseService<Long, ClassGroupStudentMapper> {
 
+    ClassGroupStudentMapperDao getDao();
+
     /**
      * 查找班级学生对应关系
      * @param userId
@@ -100,4 +104,13 @@ public interface ClassGroupStudentMapperService extends BaseService<Long, ClassG
      */
     void updateClassGroupStudents1(Long classGroupId, List<Integer> studentIds, List<Long> allLockCourseIds, String batchNo, BigDecimal masterTotalPrice);
 
+    /**
+    * @description: 添加班级学员关联
+     * @param classGroup
+     * @param userIdStrSet
+    * @return void
+    * @author zx
+    * @date 2022/9/23 11:50
+    */
+    void addMapper(ClassGroup classGroup, List<Integer> userIdStrSet);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupTeacherMapperService.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.common.service.BaseService;
@@ -11,6 +13,7 @@ import java.util.Map;
 import java.util.Set;
 
 public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassGroupTeacherMapper> {
+    ClassGroupTeacherMapperDao getDao();
 
     /**
      * 批量插入班级老师
@@ -84,4 +87,22 @@ public interface ClassGroupTeacherMapperService extends BaseService<Long, ClassG
      * @param newTeacherId
      */
     void batchUpdateTeacherByClassId(List<Integer> classGroupIds, Integer oldTeacherId,Integer newTeacherId);
+
+    /**
+    * @description: 添加班级老师关联
+     * @param classGroup
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2022/9/23 11:30
+    */
+    List<Integer> addMapper(ClassGroup classGroup);
+
+    /**
+    * @description: 校验老师是否冲突
+     * @param teacherMappers
+    * @return void
+    * @author zx
+    * @date 2022/9/23 14:45
+    */
+    void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherFreeCourseService.java

@@ -12,4 +12,13 @@ public interface CloudTeacherFreeCourseService extends BaseService<Long, CloudTe
     CloudTeacherFreeCourseDao getDao();
 
     void batchInsert(List<Long> scheduleIdList,Long calenderId);
+
+    /**
+    * @description: 云教练课程转换
+     * @param oldCourseIdList
+    * @return void
+    * @author zx
+    * @date 2022/9/28 09:52
+    */
+    void courseConvert(List<Long> oldCourseIdList,List<Long> courseIdList);
 }

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

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dao.CourseConvertLogDao;
+import com.ym.mec.biz.dal.entity.CourseConvertLog;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
+import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.common.service.BaseService;
+
+import java.util.List;
+
+public interface CourseConvertLogService extends  BaseService<Integer, CourseConvertLog>{
+    CourseConvertLogDao getDao();
+
+    CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+              List<CourseScheduleTeacherSalary> teacherSalaries,
+              List<CourseScheduleStudentPayment> studentPayments);
+
+}

+ 14 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java

@@ -1,8 +1,11 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseConvertDto;
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
+import com.ym.mec.common.entity.HttpResponseResult;
 
 import java.util.HashMap;
+import java.util.List;
 
 public interface CourseScheduleConvertService{
 
@@ -23,10 +26,19 @@ public interface CourseScheduleConvertService{
 
     /**
     * @description: 课程转换
-     * @param convertDto
+     * @param classGroups
     * @return java.lang.Boolean
     * @author zx
     * @date 2022/9/21 18:01
     */
-    Boolean action(CourseConvertDto convertDto);
+    HttpResponseResult action(List<ClassGroupDto> classGroups);
+
+    /**
+    * @description: 课程转换还原
+     * @param courseConvertId
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2022/9/27 10:14
+    */
+    void revoke(Integer courseConvertId);
 }

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

@@ -686,4 +686,13 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	* @date 2022/3/1 18:01
 	*/
 	PageInfo<StudentStandardDto> queryStudyStandardWaitVisit(EvaluateCourseQueryInfo queryInfo);
+
+	/**
+	* @description: 排课
+	 * @param groupDto
+	* @return void
+	* @author zx
+	* @date 2022/9/23 13:57
+	*/
+	HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto);
 }

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

@@ -1,16 +1,21 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.page.CourseScheduleStudentPaymentQueryInfo;
 import com.ym.mec.common.service.BaseService;
+
 import java.util.List;
 import java.util.Map;
 
 public interface CourseScheduleStudentPaymentService extends BaseService<Long, CourseScheduleStudentPayment> {
 
+
+	CourseScheduleStudentPaymentDao getDao();
+
 	/**
 	 * @Author: Joburgess
 	 * @Date: 2019/10/14
@@ -130,4 +135,22 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 */
 	void updateCourseActualPrice(List<Long> courseIds);
 
+	/**
+	* @description: 初始化学员数据
+	 * @param studentIds
+	* @return void
+	* @author zx
+	* @date 2022/9/26 17:03
+	*/
+	List<CourseScheduleStudentPayment> init(List<CourseSchedule> courseSchedules,List<Integer> studentIds);
+
+	/**
+	* @description: 均摊学员课程价值
+	 * @param courseScheduleStudentPayments
+	 * @param studentPayments
+	* @return void
+	* @author zx
+	* @date 2022/9/26 18:08
+	*/
+    void splitStudentPayment(List<CourseScheduleStudentPayment> courseScheduleStudentPayments,List<CourseScheduleStudentPayment> studentPayments);
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
@@ -8,6 +9,7 @@ import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -15,6 +17,9 @@ import java.util.Map;
 
 public interface CourseScheduleTeacherSalaryService extends BaseService<Long, CourseScheduleTeacherSalary> {
 
+
+    CourseScheduleTeacherSalaryDao getDao();
+
     String TASK_KEY = "SETTLEMENT_TYPES";
 
     /**
@@ -190,6 +195,18 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalaries);
 
     /**
+     * @describe 计算乐团课教师课酬
+     * @author Joburgess
+     * @date 2020/12/16 0016
+     * @param musicGroup:
+     * @param courseSchedule:
+     * @param courseScheduleTeacherSalaries:
+     * @return void
+     */
+    void initMusicGroupCourseTeacherSalary(List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList,
+                                           CourseSchedule courseSchedule,MusicGroup musicGroup,List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList);
+
+    /**
      * @describe 获取指定课程上的教师信息
      * @author Joburgess
      * @date 2020/11/17 0017
@@ -303,4 +320,13 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     void todayIncomeRemind();
+
+    /**
+    * @description:均摊老师课酬
+    * @return void
+    * @author zx
+    * @date 2022/9/26 18:04
+    */
+    void splitTeacherSalary(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList, List<CourseScheduleTeacherSalary> teacherSalaries);
+
 }

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

@@ -252,4 +252,7 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     // 撤销支付
     BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo);
+
+    // 查询优惠券优惠券金额
+    Map couponAmount(MallCreateOrderModel model);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
@@ -14,6 +15,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface StudentRegistrationService extends BaseService<Long, StudentRegistration> {
+    StudentRegistrationDao getDao();
 
     /**
      * 获取乐团学员报名详情

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

@@ -101,7 +101,7 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @param organId
      * @return
      */
-    List<TeacherBasicDto> findTeachers(String organId,Boolean demissionFlag);
+    List<TeacherBasicDto> findTeachers(String organId,Boolean demissionFlag, Boolean isForzenWithQueryCondition);
 
     /**
      * @param subjectId: 科目编号

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

@@ -94,8 +94,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private SubjectService subjectService;
     @Autowired
-    private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
-    @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -157,8 +155,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
     @Autowired
     private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
-    @Autowired
-    private CourseScheduleStatisticsService courseScheduleStatisticsService;
 
     @Override
     public BaseDAO<Integer, ClassGroup> getDAO() {
@@ -166,6 +162,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
+    public ClassGroupDao getDao() {
+        return classGroupDao;
+    }
+
+    @Override
     public PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo) {
         PageInfo<ClassGroup> pageInfo = new PageInfo<ClassGroup>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
@@ -185,7 +186,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (ClassGroup cg : dataList) {
                 Long studentNum = classGroupStudentNumMap.get(cg.getId());
                 cg.setStudentNum(Objects.isNull(studentNum) ? 0 : studentNum.intValue());
-                cg.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(cg.getId() + ""));
+                cg.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(cg.getId() + ""));
                 cg.setCourseScheduleList(courseScheduleDao.findCoursesByClassGroupId(cg.getId(), null));
             }
         }
@@ -203,11 +204,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (classGroup.getGroupType() == null) {
             throw new BizException("课程组类型不能为空");
         }
-        List<ClassGroupTeacherMapper> teacherMappers = classGroup.getTeacherMapperList();
-        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-        if (teacherMappers.size() != collect.size()) {
-            throw new BizException("主教与助教存在冲突");
-        }
+//        校验主教助教是否冲突
+        classGroupTeacherMapperService.checkTeachingBishop(classGroup.getTeacherMapperList());
 
         //疫情原因去掉这块限制
         //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
@@ -247,7 +245,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         if (teacherMapperList.size() > 0) {
-            classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(teacherMapperList);
         }
 
         //2、插入班级学生关联关系
@@ -479,7 +477,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 // 删除基础提高班
                 classGroupDao.batchSoftDelete(classGroupIds);
                 // 删除基础提高老师
-                classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+                classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
 
                 List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupIds,
                         MUSIC);
@@ -1554,7 +1552,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Map<Long, Integer>> vipGroupOverCourses = courseScheduleDao.countGroupOverCourse(musicGroupIds, "VIP");
         Map<Long, Integer> vipGroupOverCourseMaps = MapUtil.convertIntegerMap(vipGroupOverCourses);
 
-        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperDao.findByClassGroupIdsAndType(classGroupIds, "BISHOP");
+        List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperService.getDao().findByClassGroupIdsAndType(classGroupIds, "BISHOP");
         Map<Integer, Integer> classGroupTeacherMap = bishopTeachers.stream().collect(Collectors.toMap(ClassGroupTeacherMapper::getClassGroupId, ClassGroupTeacherMapper::getUserId));
 //        Map<Integer, ClassGroup> classGorupIdMap = byClassGroupIds.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
 
@@ -1718,16 +1716,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
-//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
+//        ClassGroupTeacherMapper teachingTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.TEACHING);
 //        if (Objects.nonNull(teachingTeacher)) {
 //            teacherClassHeadInfo.setTeachingTeacherId(teachingTeacher.getId());
 //            teacherClassHeadInfo.setTeachingTeacher(teachingTeacher.getUserName());
@@ -1960,7 +1958,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -2319,7 +2317,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherIds.add(groupTeacherMapper.getUserId());
             }
             //3、将老师加入关联关系
-            classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+            classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
             //创建IM群组
             addImGroup(classGroup, userIds, teacherIds);
         }
@@ -2371,9 +2369,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) {
         Date date = new Date();
-        Integer classGroupId = classGroup4MixDtos.get(0).getClassGroupId();
-        String musicGroupId = classGroup4MixDtos.get(0).getMusicGroupId();
-//        Boolean checkCourseTimesFlag = classGroup4MixDtos.get(0).getCheckCourseTimesFlag();
+        ClassGroup4MixDto classGroup4MixDto1 = classGroup4MixDtos.get(0);
+        Integer classGroupId =classGroup4MixDto1.getClassGroupId();
+        String musicGroupId =classGroup4MixDto1.getMusicGroupId();
+//        Boolean checkCourseTimesFlag =classGroup4MixDto1.getCheckCourseTimesFlag();
         ClassGroup classGroup = classGroupDao.get(classGroupId);
         if (classGroup == null) {
             throw new BizException("班级不存在");
@@ -2381,8 +2380,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Boolean confirmGenerate = false;
-        if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
-            confirmGenerate = classGroup4MixDtos.get(0).getConfirmGenerate();
+        if (Objects.nonNull(classGroup4MixDto1.getConfirmGenerate())) {
+            confirmGenerate =classGroup4MixDto1.getConfirmGenerate();
         }
 
         TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
@@ -2391,9 +2390,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
 
         //1、更新班级关联老师信息
-        if (Objects.nonNull(classGroup4MixDtos.get(0).getCourseAddType()) && classGroup4MixDtos.get(0).getCourseAddType().equals("onlyUpdateTeacher")) {
-            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
-            List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
+        if (Objects.nonNull(classGroup4MixDto1.getCourseAddType()) &&classGroup4MixDto1.getCourseAddType().equals("onlyUpdateTeacher")) {
+            List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperService.getDao().findByClassGroup(classGroupId);
+            List<ClassGroupTeacherMapper> newTeacherMapperList =classGroup4MixDto1.getClassGroupTeacherMapperList();
             Set<Integer> collect = newTeacherMapperList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
             if (newTeacherMapperList.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
@@ -2420,14 +2419,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<Integer> classGroupIds = new ArrayList<>();
             classGroupIds.add(classGroupId);
             // 删除历史记录
-            classGroupTeacherMapperDao.delClassGroupTeacherMapper(classGroupIds);
+            classGroupTeacherMapperService.getDao().delClassGroupTeacherMapper(classGroupIds);
             for (ClassGroupTeacherMapper tm : newTeacherMapperList) {
                 tm.setClassGroupId(classGroupId);
                 tm.setCreateTime(date);
                 tm.setGroupType(GroupType.MUSIC);
                 tm.setMusicGroupId(musicGroupId);
                 tm.setUpdateTime(date);
-                classGroupTeacherMapperDao.insert(tm);
+                classGroupTeacherMapperService.getDao().insert(tm);
             }
             imUserFriendService.refreshClassImUserFriend(classGroupId);
             return BaseController.succeed(classGroup);
@@ -2788,7 +2787,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
         if (classGroups.size() > 0) {
             classGroups.forEach(e -> {
-                e.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(e.getId().toString()));
+                e.setTeacherMapperList(classGroupTeacherMapperService.getDao().findClassGroupTeachers(e.getId().toString()));
             });
         }
         return classGroups;
@@ -3164,7 +3163,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 teacherId = groupTeacherMapper.getUserId();
             }
         }
-        classGroupTeacherMapperDao.classGroupTeachersInsert(classGroupTeacherMapperList);
+        classGroupTeacherMapperService.getDao().classGroupTeachersInsert(classGroupTeacherMapperList);
 
         //单建班级不排课
         if (classGroup4MixDtos.get(0).getOnlyCreateClassGroup()) {
@@ -3517,34 +3516,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId) {
-        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByMixClassGroupId(classGroupId);
-        String classGroupIds = "";
-        for (ClassGroupTeachersDto classGroupTeachersDto : classGroups) {
-            classGroupIds += classGroupTeachersDto.getId() + ",";
-        }
-        classGroupIds = classGroupIds.substring(0, classGroupIds.length() - 1);
-
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
-        for (ClassGroupTeachersDto classGroup : classGroups) {
-            List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
-            for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
-                if (!classGroup.getId().equals(classGroupTeacher.getClassGroupId())) continue;
-                classGroupTeacherMappers.add(classGroupTeacher);
-            }
-            classGroup.setClassGroupTeacherMapperList(classGroupTeacherMappers);
-        }
-        return classGroups;
-    }
-
-    @Override
     public List<HighClassGroupDto> findClassGroupByMusicGroupIdAndSubjectId(String musicGroupId, Integer subjectId) {
         List<HighClassGroupDto> highClassGroupList = classGroupDao.findClassGroupByMusicGroupIdAndSubjectId(musicGroupId, subjectId);
         for (HighClassGroupDto highClassGroup : highClassGroupList) {
             List<String> subjects = subjectService.findBySubIds(highClassGroup.getSubjectIdList());
             highClassGroup.setSubjectName(subjects.stream().collect(Collectors.joining(",")));
 
-            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
+            ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(highClassGroup.getId(), TeachTypeEnum.BISHOP);
             highClassGroup.setTeacherName(bishopTeacher.getUserName());
             highClassGroup.setUserId(bishopTeacher.getUserId());
             CourseSchedule courseSchedule = courseScheduleDao.findOneCourseScheduleByClassGroupId(highClassGroup.getId());
@@ -3590,7 +3568,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         String classGroupIds = classGroups.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
         List<Integer> classGroupSet = classGroups.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+        List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().findClassGroupTeachers(classGroupIds);
         Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
         Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
@@ -3678,7 +3656,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             String classGroupIds = dataList.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
             List<Integer> classGroupSet = dataList.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
 
-            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getDao().findClassGroupTeachers(classGroupIds);
             Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
             Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
@@ -3920,7 +3898,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (SuperClassGroupDto result : results) {
                 classGroupIds.add(result.getId());
             }
-            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperDao.findByClassGroupIds(classGroupIds);
+            List<ClassGroupTeacherMapDto> classGroupTeacherMaps = classGroupTeacherMapperService.getDao().findByClassGroupIds(classGroupIds);
             Map<Integer, Map<TeachTypeEnum, List<ClassGroupTeacherMapDto>>> classTeacherTypeMaps = classGroupTeacherMaps.stream()
                     .collect(Collectors.groupingBy(ClassGroupTeacherMapDto::getClassGroupId, Collectors.groupingBy(ClassGroupTeacherMapDto::getTeacherRole)));
             List<Group> groups = groupDao.findByClassGroupIds(classGroupIds);
@@ -4013,13 +3991,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
-        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperDao.findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
+        ClassGroupTeacherMapper bishopTeacher = classGroupTeacherMapperService.getDao().findByClassGroupAndRole(classGroupId, TeachTypeEnum.BISHOP);
         if (Objects.nonNull(bishopTeacher)) {
             teacherClassHeadInfo.setBishopTeacherId(bishopTeacher.getId());
             teacherClassHeadInfo.setBishopTeacher(bishopTeacher.getUserName());
         }
 
-        String name = classGroupTeacherMapperDao.queryTeachingNames(classGroupId);
+        String name = classGroupTeacherMapperService.getDao().queryTeachingNames(classGroupId);
         teacherClassHeadInfo.setTeachingTeacher(name);
 
         if (classGroup.getType() == ClassGroupTypeEnum.VIP) {
@@ -4333,36 +4311,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId, ClassGroupTypeEnum type) {
-        //基础技能班和线上基础技能班,可分班原则为声部人数/6向上取整
-        List<StudentRegistration> musicGroupStudents = studentRegistrationDao.findMusicGroupStudent(musicGroupId, null);
-        Map<Integer, List<StudentRegistration>> regMap = musicGroupStudents.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId));
-        int maxClassGroupNum = 0;
-        int otherSubjectRegNum = 0;
-        for (Map.Entry<Integer, List<StudentRegistration>> regEntry : regMap.entrySet()) {
-            //上低音号、长号 合并计算
-            if (regEntry.getKey().equals(14) || regEntry.getKey().equals(15)) {
-                otherSubjectRegNum += regEntry.getValue().size();
-                continue;
-            }
-            int classNum = regEntry.getValue().size() / 6;
-            classNum += (regEntry.getValue().size() % 6) > 0 ? 1 : 0;
-            maxClassGroupNum += classNum;
-        }
-        maxClassGroupNum += otherSubjectRegNum / 6;
-        maxClassGroupNum += (otherSubjectRegNum % 6) > 0 ? 1 : 0;
-        maxClassGroupNum += musicGroupStudents.size() / 30;
-        maxClassGroupNum += (musicGroupStudents.size() % 30) > 0 ? 1 : 0;
-
-        HighClassGroupNumDto highClassGroupNumDto = new HighClassGroupNumDto();
-        int nowClassGroupNum = classGroupDao.getMusicGroupHighClassNumBySubject(musicGroupId, type);
-
-        highClassGroupNumDto.setNowHighClassGroupNum(nowClassGroupNum);
-        highClassGroupNumDto.setMaxHighClassGroupNum(maxClassGroupNum);
-        return highClassGroupNumDto;
-    }
-
-    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId, String classGroupStudentMap, List<Integer> studentIds) {
         //获取主班剩余课程时长
@@ -4378,7 +4326,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<Map<Integer, BigDecimal>> surplusCourseFeeMapList = new ArrayList<>();
         List<Map<String, String>> classGroupStudents = (List<Map<String, String>>) JSON.parse(classGroupStudentMap);
         //班级列表
-        List<Integer> classGroupIds = classGroupStudents.stream().map(e -> Integer.parseInt(e.keySet().iterator().next())).collect(Collectors.toList());
+        /*List<Integer> classGroupIds = classGroupStudents.stream().map(e -> Integer.parseInt(e.keySet().iterator().next())).collect(Collectors.toList());
         classGroupIds.add(masterClassGroupId);
         List<ClassGroup> byClassGroupIds = classGroupDao.findByClassGroupIds(classGroupIds, null);
         long count = byClassGroupIds.stream().map(e -> e.getMusicGroupId()).distinct().count();
@@ -4389,7 +4337,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
                 throw new BizException("操作失败:主班乐团不能是系统收费团");
             }
-        }
+        }*/
         //学员剩余课程价值
         Map<Integer, BigDecimal> classGroupTotalPrice = new HashMap<>();
         //主班剩余课程价值

+ 46 - 61
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java

@@ -1,79 +1,35 @@
 package com.ym.mec.biz.service.impl;
 
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupStudentInfoDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupRelation;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.StudentRegistration;
-import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
-import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.service.ClassGroupRelationService;
-import com.ym.mec.biz.service.ClassGroupService;
-import com.ym.mec.biz.service.ClassGroupStudentMapperService;
-import com.ym.mec.biz.service.ClassGroupTeacherMapperService;
-import com.ym.mec.biz.service.CourseScheduleService;
-import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.TeacherDefaultMusicGroupSalaryService;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+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.service.impl.BaseServiceImpl;
 import com.ym.mec.util.http.HttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, ClassGroupStudentMapper> implements ClassGroupStudentMapperService {
 
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-
     @Autowired
     private CourseScheduleService courseScheduleService;
     @Autowired
-    StudentRegistrationService studentRegistrationService;
+    private StudentRegistrationService studentRegistrationService;
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
     @Autowired
@@ -95,8 +51,6 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
-    private OrganizationCourseUnitPriceSettingsDao organizationCourseUnitPriceSettingsDao;
-    @Autowired
     private ClassGroupDao classGroupDao;
     @Autowired
     private MusicGroupDao musicGroupDao;
@@ -115,6 +69,11 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    public ClassGroupStudentMapperDao getDao() {
+        return classGroupStudentMapperDao;
+    }
+
+    @Override
     public ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(Integer userId, Integer classGroupId, String status) {
         return classGroupStudentMapperDao.findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, status);
     }
@@ -693,4 +652,30 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         imGroupMemberService.join(classGroupId.toString(), userRoleMap);
         imUserFriendService.refreshClassImUserFriend(classGroupId.intValue());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addMapper(ClassGroup classGroup, List<Integer> userIdList) {
+        if(CollectionUtils.isEmpty(userIdList)){
+            return;
+        }
+        List<ClassGroupStudentMapper> classGroupStudentList = new ArrayList<>();
+        for (Integer userId : userIdList) {
+            ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+            classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
+            classGroupStudentMapper.setClassGroupId(classGroup.getId());
+            classGroupStudentMapper.setUserId(userId);
+            classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+            classGroupStudentMapper.setGroupType(classGroup.getGroupType());
+            classGroupStudentList.add(classGroupStudentMapper);
+
+            //原有业务逻辑,用于更新学员注册表班级信息
+            StudentRegistration studentRegistration = new StudentRegistration();
+            studentRegistration.setClassGroupId(classGroup.getId());
+            studentRegistration.setUserId(userId);
+            studentRegistration.setMusicGroupId(classGroup.getMusicGroupId());
+            studentRegistrationService.getDao().updateByUserIdAndMusicGroupId(studentRegistration);
+        }
+        classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentList);
+    }
 }

+ 38 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -3,13 +3,14 @@ package com.ym.mec.biz.service.impl;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 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.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,8 +35,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Autowired
     private TeacherDefaultMusicGroupSalaryDao teacherDefaultMusicGroupSalaryDao;
     @Autowired
-    private SysConfigDao sysConfigDao;
-    @Autowired
     private ImGroupMemberService imGroupMemberService;
     @Autowired
     private ClassGroupService classGroupService;
@@ -45,10 +44,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     private TeacherAttendanceDao teacherAttendanceDao;
     @Autowired
     private CourseScheduleDao courseScheduleDao;
-    @Autowired
-    private TeacherDao teacherDao;
-    @Autowired
-    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 
     @Override
     public BaseDAO<Long, ClassGroupTeacherMapper> getDAO() {
@@ -56,6 +51,11 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     }
 
     @Override
+    public ClassGroupTeacherMapperDao getDao() {
+        return classGroupTeacherMapperDao;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public int classGroupTeachersInsert(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
 
@@ -376,4 +376,34 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     public void batchUpdateTeacherByClassId(List<Integer> classGroupIds, Integer oldTeacherId, Integer newTeacherId) {
         classGroupTeacherMapperDao.batchUpdateTeacherByClassId(classGroupIds,oldTeacherId,newTeacherId);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Integer> addMapper(ClassGroup classGroup) {
+        List<ClassGroupTeacherMapper> teacherMapperList = classGroup.getTeacherMapperList();
+        if(CollectionUtils.isEmpty(teacherMapperList)){
+            return new ArrayList<>();
+        }
+        List<Integer> teacherIdList = new ArrayList<>();
+        for (ClassGroupTeacherMapper tm : teacherMapperList) {
+            tm.setClassGroupId(classGroup.getId());
+            tm.setMusicGroupId(classGroup.getMusicGroupId());
+            tm.setGroupType(classGroup.getGroupType());
+            tm.setCreateTime(classGroup.getUpdateTime());
+            tm.setUpdateTime(classGroup.getUpdateTime());
+            teacherIdList.add(tm.getUserId());
+        }
+        classGroupTeacherMapperDao.classGroupTeachersInsert(teacherMapperList);
+        return teacherIdList;
+    }
+
+
+    //校验主教助教是否冲突
+    @Override
+    public void checkTeachingBishop(List<ClassGroupTeacherMapper> teacherMappers){
+        Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        if (teacherMappers.size() != collect.size()) {
+            throw new BizException("主教与助教存在冲突");
+        }
+    }
 }

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

@@ -1,8 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.CloudTeacherFreeCourseDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.OperatingReportCloudDao;
 import com.ym.mec.biz.dal.entity.CloudTeacherFreeCourse;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.service.CloudTeacherFreeCourseService;
+import com.ym.mec.biz.service.OperatingReportCloudService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import org.apache.commons.lang3.StringUtils;
@@ -17,6 +21,8 @@ public class CloudTeacherFreeCourseServiceImpl extends BaseServiceImpl<Long, Clo
 	
 	@Autowired
 	private CloudTeacherFreeCourseDao cloudTeacherFreeCourseDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
 
 	@Override
 	public BaseDAO<Long, CloudTeacherFreeCourse> getDAO() {
@@ -33,4 +39,14 @@ public class CloudTeacherFreeCourseServiceImpl extends BaseServiceImpl<Long, Clo
     public void batchInsert(List<Long> scheduleIdList,Long calenderId) {
 		cloudTeacherFreeCourseDao.batchInsert(StringUtils.join(scheduleIdList,","),calenderId);
     }
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void courseConvert(List<Long> oldCourseIdList,List<Long> courseIdList) {
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(oldCourseIdList);
+		boolean convertFlag = courseSchedules.get(0).getConvertFlag();
+		if(convertFlag){
+			cloudTeacherFreeCourseDao.batchInsert(StringUtils.join(courseIdList,","),null);
+		}
+    }
 }

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

@@ -1011,7 +1011,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
         }
 
-        String organCode = organizationDto.getCorporateCode() == null ? tenantInfo.getTsignCode() : organizationDto.getCorporateCode();
+        String organCode = StringUtils.isEmpty(organizationDto.getCorporateCode()) ? tenantInfo.getTsignCode() : organizationDto.getCorporateCode();
         
 		if (user.getTenantId() == 1) {
 			if (!OwnershipType.OWN.name().equals(params.get("ownershipType"))) {

+ 86 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseConvertLogServiceImpl.java

@@ -0,0 +1,86 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.CourseConvertLogService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class CourseConvertLogServiceImpl extends BaseServiceImpl<Integer, CourseConvertLog> implements CourseConvertLogService {
+
+	@Autowired
+	private CourseConvertLogDao courseConvertLogDao;
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private TeacherAttendanceDao teacherAttendanceDao;
+	@Autowired
+	private SysUserService sysUserService;
+
+	@Override
+	public BaseDAO<Integer, CourseConvertLog> getDAO() {
+		return courseConvertLogDao;
+	}
+
+	@Override
+	public CourseConvertLogDao getDao() {
+		return courseConvertLogDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public CourseConvertLog save(String oldCourseIds, List<Integer> newClassGroupIds, List<Long> courseIdList,
+					 List<CourseScheduleTeacherSalary> teacherSalaries,
+					 List<CourseScheduleStudentPayment> studentPayments) {
+		Integer userId = sysUserService.getUserId();
+		CourseConvertLog courseConvertLog = new CourseConvertLog();
+		courseConvertLog.setOperator(userId);
+		courseConvertLog.setOldCourseIds(oldCourseIds);
+		String userIds = studentPayments.stream().map(e -> e.getUserId().toString()).distinct().collect(Collectors.joining(","));
+		courseConvertLog.setStudentIds(userIds);
+		List<Long> oldCourseIdList = Arrays.stream(oldCourseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+
+		//获取老师课酬json
+		courseConvertLog.setOldCourseTeacherSalaryJson(JSONObject.toJSONString(teacherSalaries));
+		//删除老师课酬
+		courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(oldCourseIdList);
+
+		//获取学员课程价值
+		courseConvertLog.setOldCourseStudentMapperJson(JSONObject.toJSONString(studentPayments));
+		//删除学员课程价值
+		courseScheduleStudentPaymentDao.deleteByCourseSchedule(oldCourseIdList);
+
+		//获取课程列表
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(oldCourseIdList);
+		courseConvertLog.setOldClassIds(courseSchedules.stream().map(e->e.getClassGroupId().toString()).distinct().collect(Collectors.joining(",")));
+		courseConvertLog.setOldCourseJson(JSONObject.toJSONString(courseSchedules));
+		//删除课程
+		courseScheduleDao.batchDeleteCourseSchedulesWithoutCheck(oldCourseIdList);
+
+		//记录老师考勤
+		List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findByCourseSchedules(oldCourseIdList);
+		courseConvertLog.setOldTeacherAttendanceJson(JSONObject.toJSONString(teacherAttendances));
+		//删除考勤
+		teacherAttendanceDao.batchDeleteByCourseSchedules(oldCourseIdList);
+
+		courseConvertLog.setNewCourseIds(StringUtils.join(courseIdList,","));
+		courseConvertLog.setNewClassIds(StringUtils.join(newClassGroupIds,","));
+		courseConvertLogDao.insert(courseConvertLog);
+		return courseConvertLog;
+	}
+}

+ 190 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java

@@ -1,25 +1,35 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.CourseScheduleConvertDao;
 import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.CourseConvertDto;
 import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.service.CourseScheduleConvertService;
-import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.util.collection.MapUtil;
-import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.support.lob.LobCreator;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
+
 @Service
 public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertService {
 
@@ -27,6 +37,26 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
     private CourseScheduleConvertDao courseScheduleConvertDao;
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private ClassGroupTeacherMapperService classGroupTeacherMapperService;
+    @Autowired
+    private CourseScheduleService courseScheduleService;
+    @Autowired
+    private ClassGroupStudentMapperService classGroupStudentMapperService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+    @Autowired
+    private CourseConvertLogService courseConvertLogService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
+    @Autowired
+    private CloudTeacherFreeCourseService cloudTeacherFreeCourseService;
 
     @Override
     public HashMap<String, Object> queryConvertStudent(String courseIds) {
@@ -47,10 +77,159 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
     }
 
     @Override
-    public Boolean action(CourseConvertDto convertDto) {
-        List<ClassGroup> classGroups = convertDto.getClassGroups();
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult action(List<ClassGroupDto> classGroups) {
+        ClassGroupDto classGroupDto = classGroups.get(0);
+        //校验课程是否可以进行转换
+        this.checkConvertCourseIds(classGroupDto.getCourseIds());
+        if(!classGroupDto.getConfirmGenerate()){
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+        //校验主教助教是否冲突
+        classGroups.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+        int classNum = classGroups.size();
+        //老师课酬
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+        //学员课程价值
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<Integer> studentIdList = new ArrayList<>();
+        //获取学员课程总价值
+        List<Long> courseIdList = new ArrayList<>();
+        for (ClassGroupDto groupDto : classGroups) {
+            List<Integer> userIdStrSet = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+            studentIdList.addAll(userIdStrSet);
+            groupDto.setStudentNum(userIdStrSet.size());
+            //创建班级
+            ClassGroup classGroup = new ClassGroup();
+            BeanUtils.copyProperties(groupDto,classGroup);
+            classGroupService.insert(classGroup);
+            groupDto.setClassGroupId(classGroup.getId());
+            //设置班级上的老师
+            classGroupTeacherMapperService.addMapper(classGroup);
+            //2、插入班级学生关联关系
+            classGroupStudentMapperService.addMapper(classGroup,userIdStrSet);
+            //排课
+            groupDto.setCheckType(classNum>1?1:0);
+            HttpResponseResult<List<CourseSchedule>> result = courseScheduleService.createCourse(groupDto);
+            if(result.getCode() != 200){
+                StringBuffer sb = new StringBuffer("班级");
+                result.setMsg(sb.append(classGroup.getName()).append(":").append(result.getMsg()).toString());
+                if(groupDto.getConfirmGenerate()){
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                }
+                return result;
+            }else {
+                if(groupDto.getConfirmGenerate()){
+                    courseIdList.addAll(result.getData().stream().map(e->e.getId()).collect(Collectors.toList()));
+                    courseScheduleTeacherSalaryList.addAll(groupDto.getCourseScheduleTeacherSalaryList());
+                    courseScheduleStudentPayments.addAll(groupDto.getCourseScheduleStudentPayments());
+                }else {
+                    return result;
+                }
+            }
+        }
+        ClassGroupDto groupDto = classGroups.get(0);
+        String courseIds = groupDto.getCourseIds();
+        //获取总课酬
+        List<Long> oldCourseIdList = Arrays.stream(courseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<CourseScheduleTeacherSalary> teacherSalaries = courseScheduleTeacherSalaryService.getDao().findByCourseSchedules(oldCourseIdList);
+        //获取学员课程价值
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(oldCourseIdList);
+        //保存老师课酬
+        courseScheduleTeacherSalaryService.splitTeacherSalary(courseScheduleTeacherSalaryList,teacherSalaries);
+        //保存学员课程关联
+        courseScheduleStudentPaymentService.splitStudentPayment(courseScheduleStudentPayments,studentPayments);
+        List<Integer> newClassGroupIds = classGroups.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
+        //记录云教练课程
+        cloudTeacherFreeCourseService.courseConvert(oldCourseIdList,courseIdList);
+        //记录课程转换相关信息
+        courseConvertLogService.save(courseIds,newClassGroupIds,courseIdList,teacherSalaries,studentPayments);
+        // 刷新群组
+        imUserFriendService.refreshGroupImUserFriend(groupDto.getMusicGroupId(), MUSIC);
+        return BaseController.succeed();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void revoke(Integer courseConvertId) {
+        CourseConvertLog courseConvertLog = courseConvertLogService.get(courseConvertId);
+        //校验是否可以还原
+        this.checkConvertRevoke(courseConvertLog);
+        List<Long> newCourseIdList = Arrays.stream(courseConvertLog.getNewCourseIds().split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<Integer> userIdList = Arrays.stream(courseConvertLog.getStudentIds().split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+        List<CourseSchedule> courseSchedules = JSONArray.parseArray(courseConvertLog.getOldCourseJson(), CourseSchedule.class);
+        courseScheduleService.getDao().batchAddCourseSchedules(courseSchedules);
+
+        String studentMapperJson = courseConvertLog.getOldCourseStudentMapperJson();
+        List<CourseScheduleStudentPayment> studentPayments = JSONArray.parseArray(studentMapperJson, CourseScheduleStudentPayment.class);
+        //获取学员课程价值
+        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(newCourseIdList);
+        //获取现有所有学员列表
+        List<Integer> currentUserIdList = paymentList.stream().map(e -> e.getUserId()).distinct().collect(Collectors.toList());
+        userIdList.removeAll(currentUserIdList);
+        if(!CollectionUtils.isEmpty(userIdList)){
+            studentPayments = studentPayments.stream().filter(e->!userIdList.contains(e.getUserId())).collect(Collectors.toList());
+        }
+        courseScheduleStudentPaymentService.getDao().batchInsert(studentPayments);
 
-        return null;
+        //保存老师课酬
+        String teacherSalaryJson = courseConvertLog.getOldCourseTeacherSalaryJson();
+        courseScheduleTeacherSalaryService.getDao().batchInsert(JSONArray.parseArray(teacherSalaryJson,CourseScheduleTeacherSalary.class));
+        //保存考勤
+        String teacherAttendanceJson = courseConvertLog.getOldTeacherAttendanceJson();
+        teacherAttendanceDao.batchInsert(JSONArray.parseArray(teacherAttendanceJson,TeacherAttendance.class));
+
+        //删除转换后的课程、课酬、学员课程价值
+        this.delByCourse(newCourseIdList);
+        courseConvertLogService.getDao().updateRevoke(courseConvertId);
+    }
+
+    private void delByCourse(List<Long> newCourseIdList){
+        //删除转换后的课程、课酬、学员课程价值
+        courseScheduleService.getDao().batchDeleteCourseSchedulesWithoutCheck(newCourseIdList);
+        //删除老师考勤
+        teacherAttendanceDao.batchDeleteByCourseSchedules(newCourseIdList);
+        //删除老师课酬
+        courseScheduleTeacherSalaryService.getDao().batchDeleteByCourseScheduleIds(newCourseIdList);
+        //删除学员课程价值
+        courseScheduleStudentPaymentService.getDao().deleteByCourseSchedule(newCourseIdList);
+        //删除课程成本
+        cloudTeacherFreeCourseService.getDao().deleteByCourseIds(newCourseIdList);
+    }
+
+    private void checkConvertRevoke(CourseConvertLog courseConvertLog) {
+        Optional.ofNullable(courseConvertLog).orElseThrow(()->new BizException("课程转换记录不存在"));
+        if(courseConvertLog.getRevokeFlag()){
+            throw new BizException("课程转换记录已还原");
+        }
+        //原班级是否改动
+        String oldClassIds = courseConvertLog.getOldClassIds();
+        List<Integer> oldClassIdList = Arrays.stream(oldClassIds.split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+        List<ClassGroup> classGroupList = classGroupService.getDao().findByClassGroupIds(oldClassIdList, null);
+        if(CollectionUtils.isEmpty(classGroupList) || classGroupList.size() < oldClassIdList.size()){
+            throw new BizException("操作失败:原班级信息有改动");
+        }
+        //学员是否还在班级
+        List<Integer> classGroupIds = classGroupStudentMapperService.getDao().findByUserIdsAndClassIds(courseConvertLog.getStudentIds(),oldClassIds);
+        if(CollectionUtils.isEmpty(classGroupIds) || classGroupIds.size() < oldClassIdList.size()){
+            throw new BizException("操作失败:部分学员已退班");
+        }
+        //课程是否有消耗
+        String newCourseIds = courseConvertLog.getNewCourseIds();
+        List<Long> courseIdList = Arrays.stream(newCourseIds.split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toList());
+        List<CourseSchedule> courseSchedules = courseScheduleService.getDao().findByCourseScheduleIds(courseIdList);
+        if(courseSchedules.stream().anyMatch(e->e.getStatus() == CourseStatusEnum.OVER)){
+            throw new BizException("操作失败:有已结束课程");
+        }
+        //学员课表是否变动
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().findByCourseScheduleIds(courseIdList);
+        if(CollectionUtils.isEmpty(studentPayments)){
+            throw new BizException("操作失败:没有可操作的学员");
+        }
+        long count = studentPayments.stream().map(e -> e.getCreateTime()).distinct().count();
+        if(count > 1){
+            throw new BizException("操作失败:课程学员有变更");
+        }
     }
 
     private void checkConvertCourseIds(String courseIds){
@@ -63,7 +242,7 @@ public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertSe
         int num = courseScheduleConvertDao.countLegalCourse(courseIds);
         String[] split = courseIds.split(",");
         if(num < split.length){
-            throw new BizException("操作失败:所选课程不支持课程转换");
+            throw new BizException("操作失败:所选部分课程不支持课程转换");
         }
         //校验学员时长是否一致
         int errorNum = courseScheduleConvertDao.checkStudentCourseNum(courseIds,split.length);

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

@@ -26,8 +26,10 @@ import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.ListUtil;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.json.JsonUtil;
+
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -46,14 +49,20 @@ import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MIX;
+import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
+import static com.ym.mec.biz.dal.enums.ClassGroupTypeEnum.HIGH_ONLINE;
 import static com.ym.mec.biz.dal.enums.GroupType.*;
+import static com.ym.mec.biz.dal.enums.MusicGroupStatusEnum.PROGRESS;
 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;
@@ -163,6 +172,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private TenantConfigService tenantConfigService;
     @Autowired
 	private VipGroupCategoryDao vipGroupCategoryDao;
+    @Autowired
+	private StudentService studentService;
+    @Autowired
+	private CourseScheduleConvertDao courseScheduleConvertDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -438,6 +451,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (type == CourseScheduleType.VIP) {
 			throw new BizException("暂不支持vip课加课");
 		}
+		
+		if(type == CourseSchedule.CourseScheduleType.HIGH){
+        	type = CourseScheduleType.HIGH_ONLINE;
+        }
 
 		if (teachingArrangementList == null || teachingArrangementList.size() == 0) {
 			throw new BizException("请设置课时安排");
@@ -4065,6 +4082,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     public List<Long> updateCourseScheduleToOverStatus() {
 
         Date date = new Date();
+        //查询所有已上课乐团
+        List<String> musicGroupIdList = courseScheduleDao.queryStartedCourseMusicGroupIdList(GroupType.MUSIC.getCode());
+        
         //自动更新课程状态至“已结束”
         List<CourseSchedule> list = courseScheduleDao.queryFinishedWithNoUpdateStatus();
 
@@ -4085,6 +4105,21 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if (courseSchedule.getGroupType() == GroupType.VIP) {
                 courseScheduleIdList.add(courseSchedule.getId());
             }
+            
+            if(courseSchedule.getGroupType() == GroupType.MUSIC){
+            	if(!musicGroupIdList.contains(courseSchedule.getMusicGroupId())){
+            		//乐团第一次上课
+            		MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+            		if(musicGroup != null){
+            			musicGroup.setFirstCourseStartTime(courseSchedule.getClassDate());
+            			musicGroup.setGroupMemberNum(courseScheduleStudentPaymentDao.countStudentNum(courseSchedule.getId().intValue()));
+            			
+            			musicGroupDao.update(musicGroup);
+            		}
+            		
+            		musicGroupIdList.add(courseSchedule.getMusicGroupId());
+            	}
+            }
         }
 
 		if (updateList.size() > 0) {
@@ -5803,4 +5838,171 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult<List<CourseSchedule>> createCourse(ClassGroupDto groupDto) {
+		Date date = new Date();
+		Integer classGroupId = groupDto.getClassGroupId();
+		String musicGroupId = groupDto.getMusicGroupId();
+		CourseScheduleType type = groupDto.getCourseScheduleType();
+		List<CourseTimeDto> courseTimeDtoList = groupDto.getCourseTimeDtoList();
+		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+		TeachModeEnum teachMode = TeachModeEnum.OFFLINE;
+		if (type.equals(CourseScheduleType.HIGH_ONLINE) || type.equals(MUSIC_NETWORK)) {
+			teachMode = TeachModeEnum.ONLINE;
+		}
+		if (CollectionUtils.isEmpty(courseTimeDtoList)) {
+			throw new BizException("排课次数必须大于0");
+		}
+
+		Integer schoolId = teachMode.equals(TeachModeEnum.ONLINE) ? null : musicGroup.getSchoolId();
+
+		List<Subject> subjectList = subjectDao.findBySubjectByIdList(groupDto.getSubjectIdList());
+
+		String subjectNames = subjectList.stream().map(Subject::getName).collect(Collectors.joining("/"));
+
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+		//2、获取班级学生
+		List<Integer> studentIds = Arrays.stream(groupDto.getUserIds().split(",")).map(id -> Integer.valueOf(id)).distinct().collect(Collectors.toList());
+
+		//获取可转换课程时长,学员数量,课程数量
+		CourseConvertSumDto courseConvertSumDto = courseScheduleConvertDao.sumCourseConvert(groupDto.getCourseIds());
+
+		//计算每节课的课酬
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
+		List<CourseSchedule> courseScheduleList = new ArrayList<>();
+		//校验老师是否冲突
+		courseTimeDtoList.stream().forEach(e->classGroupTeacherMapperService.checkTeachingBishop(e.getClassGroupTeacherMapperList()));
+		LocalDateTime now = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
+		//获取排课总时长
+		int totalCourseTimes = 0;
+		long totalCourseDuration = 0;
+		for (CourseTimeDto courseTimeDto : courseTimeDtoList) {
+			//获取排课总次数
+			totalCourseTimes += courseTimeDto.getExpectCourseNum();
+			//获取排课总时长
+			totalCourseDuration += Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
+							LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+					.toMinutes();
+		}
+		//校验排课时长
+		if(groupDto.getCheckType() == 0 && totalCourseDuration > courseConvertSumDto.getCourseMinute()){
+			throw new BizException("操作失败:课排课时长不允许超过{}分钟",courseConvertSumDto.getCourseMinute());
+		}
+		//检验排课次数
+		if(groupDto.getCheckType() == 1){
+			int length = groupDto.getCourseIds().split(",").length;
+			if(totalCourseTimes > length){
+				throw new BizException("操作失败:排课次数不允许超过{}次",length);
+			}
+		}
+		//获取节假日
+		Set<String> holidayDays = new HashSet<>();
+		Integer tenantId = TenantContextHolder.getTenantId();
+		String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+		if (StringUtils.isNotBlank(holidaySetting)) {
+			holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
+		}
+		int generateCourseTimes = 0;
+		WhileNode:
+		while (true) {
+			int dayOfWeek = now.getDayOfWeek().getValue();
+			for (CourseTimeDto courseTimeDto : courseTimeDtoList) {
+				List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
+				Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+				if (Objects.isNull(teacherId)) {
+					throw new BizException("请设置主教");
+				}
+				if (courseTimeDto.getDayOfWeek() < 1 || courseTimeDto.getDayOfWeek() > 7) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if (Objects.isNull(courseTimeDto.getStartDate()) || Objects.isNull(courseTimeDto.getEndDate())) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+
+				//跳过节假日
+				if (courseTimeDto.getHoliday() && holidayDays.contains(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+					continue;
+				}
+
+				if (!courseTimeDto.getDayOfWeek().equals(dayOfWeek)) continue;
+
+				Date classDate = DateConvertor.toDate(now);
+
+				if (courseTimeDto.getStartDate().compareTo(classDate) > 0
+						|| courseTimeDto.getEndDate().compareTo(classDate) < 0
+						|| courseTimeDto.getExpectCourseNum() <= courseTimeDto.getCourseNum()) {
+					if (courseTimeDto.getEndDate().compareTo(classDate) < 0 && courseTimeDto.getExpectCourseNum() > courseTimeDto.getCourseNum()) {
+						throw new BizException("在指定的排课时间段内({}-{})无法完成预计课时数的排课", DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy.MM.dd"), DateUtil.dateToString(courseTimeDto.getEndDate(), "yyyy.MM.dd"));
+					}
+					if (totalCourseTimes <= generateCourseTimes) {
+						break WhileNode;
+					}
+					continue;
+				}
+
+				//课时长度
+				long classCourseDuration = Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
+								LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+						.toMinutes();
+
+				totalCourseDuration += classCourseDuration;
+
+				courseTimeDto.setCourseNum(courseTimeDto.getCourseNum() + 1);
+				generateCourseTimes += 1;
+
+				if (totalCourseTimes < generateCourseTimes) {
+					break WhileNode;
+				}
+
+				String startClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getStartClassTime() + ":00";
+				String endClassTime = DateUtil.getDate(classDate) + " " + courseTimeDto.getEndClassTime() + ":00";
+
+				CourseSchedule courseSchedule = new CourseSchedule();
+				courseSchedule.setSchoolId(schoolId);
+				courseSchedule.setClassGroupId(classGroupId);
+				courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+				courseSchedule.setClassDate(classDate);
+				courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+				if (date.compareTo(courseSchedule.getStartClassTime()) > 0) {
+					throw new BizException("课程开始时间不得早于当前时间");
+				}
+				courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+				courseSchedule.setCreateTime(date);
+				courseSchedule.setUpdateTime(date);
+				courseSchedule.setTeachMode(teachMode);
+				courseSchedule.setMusicGroupId(musicGroupId);
+				courseSchedule.setType(groupDto.getCourseScheduleType());
+				courseSchedule.setName(subjectNames + "-" + courseConvertSumDto.getCourseType().getMsg());
+				courseSchedule.setGroupType(groupDto.getGroupType());
+				courseSchedule.setTeacherId(teacherId);
+				courseSchedule.setActualTeacherId(teacherId);
+				courseSchedule.setOrganId(musicGroup.getOrganId());
+				courseSchedule.setConvertFlag(groupDto.getConvertFlag());
+				courseScheduleDao.insert(courseSchedule);
+				courseScheduleList.add(courseSchedule);
+				courseScheduleTeacherSalaryService.initMusicGroupCourseTeacherSalary(newClassGroupTeacherMapperList,courseSchedule,
+						musicGroup,courseScheduleTeacherSalaryList);
+			}
+			now = now.plusDays(1);
+		}
+		this.checkNewCourseSchedules(courseScheduleList, false, false);
+		if(!groupDto.getConfirmGenerate()){
+			return BaseController.succeed(courseScheduleList);
+		}
+
+		classGroupService.updateTotalClassTimes(classGroupId, courseScheduleList.size());
+
+		//老师结算表
+		if (!groupDto.getAllowZeroSalary() && courseScheduleTeacherSalaryList.stream().anyMatch(e->e.getExpectSalary().compareTo(BigDecimal.ZERO) == 0)) {
+			return BaseController.failed(HttpStatus.MULTI_STATUS, "当前课程课酬预计为0,是否继续");
+		}
+		groupDto.getCourseScheduleTeacherSalaryList().addAll(courseScheduleTeacherSalaryList);
+		//生成学生结算表
+		groupDto.getCourseScheduleStudentPayments().addAll(courseScheduleStudentPaymentService.init(courseScheduleList,studentIds));
+		return BaseController.succeed(courseScheduleList);
+	}
 }

+ 57 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -18,26 +18,22 @@ import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static java.math.BigDecimal.ROUND_DOWN;
-
 @Service
 public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Long, CourseScheduleStudentPayment>  implements CourseScheduleStudentPaymentService {
 
@@ -77,15 +73,18 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 	@Autowired
 	private StudentPaymentOrderDao studentPaymentOrderDaop;
-	@Autowired
-	private CloudTeacherFreeCourseDao cloudTeacherFreeCourseDao;
 
 	@Override
 	public BaseDAO<Long, CourseScheduleStudentPayment> getDAO() {
 		return courseScheduleStudentPaymentDao;
 	}
 
-	@Override
+    @Override
+    public CourseScheduleStudentPaymentDao getDao() {
+        return courseScheduleStudentPaymentDao;
+    }
+
+    @Override
 	public int createCourseScheduleStudentPaymentForVipGroup(Long vipGroupId, Integer userId) {
 		VipGroup vipGroup = vipGroupDao.get(vipGroupId);
 
@@ -715,6 +714,55 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 	}
 
 	@Override
+	public List<CourseScheduleStudentPayment> init(List<CourseSchedule> courseSchedules,List<Integer> studentIds) {
+		List<CourseScheduleStudentPayment> studentPayments = new ArrayList<>();
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			for (Integer studentId : studentIds) {
+				CourseScheduleStudentPayment cssp = new CourseScheduleStudentPayment();
+				cssp.setGroupType(courseSchedule.getGroupType());
+				cssp.setMusicGroupId(courseSchedule.getMusicGroupId());
+				cssp.setCourseScheduleId(courseSchedule.getId());
+				cssp.setClassGroupId(courseSchedule.getClassGroupId());
+				cssp.setUserId(studentId);
+				cssp.setActualPrice(BigDecimal.ZERO);
+				cssp.setBeMerged(false);
+				studentPayments.add(cssp);
+			}
+		}
+		return studentPayments;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void splitStudentPayment(List<CourseScheduleStudentPayment> courseScheduleStudentPayments,List<CourseScheduleStudentPayment> oldStudentPayments) {
+		Map<Integer, BigDecimal> studentExpectPrice = oldStudentPayments.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getExpectPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+		Map<Integer, BigDecimal> studentOriginalPrice = oldStudentPayments.stream().collect(Collectors.groupingBy(e -> e.getUserId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add))));
+		Map<Integer, List<CourseScheduleStudentPayment>> paymentMap = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getUserId));
+		for (Integer userId : paymentMap.keySet()) {
+			List<CourseScheduleStudentPayment> studentPayments = paymentMap.get(userId);
+			BigDecimal totalOriginalPrice = studentOriginalPrice.get(userId);
+			BigDecimal totalExpectPrice = studentExpectPrice.get(userId);
+			Integer salarySize = studentPayments.size();
+			BigDecimal subOriginalPrice = totalOriginalPrice;
+			BigDecimal subExpectPrice = totalExpectPrice;
+			BigDecimal ratioOriginal = totalOriginalPrice.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+			BigDecimal ratioExpect = totalExpectPrice.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+			for (int j = 0; j < studentPayments.size(); j++) {
+				CourseScheduleStudentPayment studentPayment = studentPayments.get(j);
+				studentPayment.setExpectPrice(ratioExpect);
+				subExpectPrice = subExpectPrice.subtract(ratioExpect);
+				studentPayment.setOriginalPrice(ratioOriginal);
+				subOriginalPrice = subOriginalPrice.subtract(ratioExpect);
+				if(j == salarySize - 1){
+					studentPayment.setExpectPrice(studentPayment.getExpectPrice().add(subExpectPrice));
+					studentPayment.setOriginalPrice(studentPayment.getOriginalPrice().add(subOriginalPrice));
+				}
+			}
+		}
+		courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+    }
+
+    @Override
 	@Transactional(rollbackFor = Exception.class)
 	public void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType) {
 		studentDao.lockUser(1);

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

@@ -15,6 +15,7 @@ import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherIncomeQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.filters.TenantIdThreadLocal;
@@ -33,12 +34,15 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -111,6 +115,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     }
 
     @Override
+    public CourseScheduleTeacherSalaryDao getDao() {
+        return courseScheduleTeacherSalaryDao;
+    }
+
+    @Override
     public void createCourseScheduleTeacherVipSalary(VipGroup vipGroup,
                                                      List<CourseSchedule> vipCourseSchedules,
                                                      BigDecimal offlineTeacherSalary) {
@@ -1256,6 +1265,24 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         courseScheduleTeacherSalary.setExpectSalary(teacherSalaries.get(0).getExpectSalary());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void initMusicGroupCourseTeacherSalary(List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList,
+                       CourseSchedule courseSchedule,MusicGroup musicGroup,List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList){
+        for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+            courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+            courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            courseScheduleTeacherSalary.setEnableChangeSalary(false);
+            this.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
+            courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+        }
+    }
+
     /**
      * @describe 创建课程指定教师的课酬记录-乐团课
      * @author Joburgess
@@ -1288,12 +1315,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal salary;
 
             Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-
-            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
+            
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary =
+                    collect.get(courseSchedule.getType()==CourseScheduleType.HIGH?CourseScheduleType.HIGH_ONLINE:courseSchedule.getType());
 
             if (teacherDefaultMusicGroupSalary == null) {
                 Teacher teacher = teacherDao.get(courseScheduleTeacherSalary.getUserId());
-                throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" +
+                        (courseSchedule.getType()==CourseScheduleType.HIGH?CourseScheduleType.HIGH_ONLINE:courseSchedule.getType()).getMsg() + "课酬");
             }
 
             //对应基准课酬
@@ -2382,4 +2411,31 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 userMap, null, 0, "12", "TEACHER","income_remind.mp3","income_remind_channel");
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void splitTeacherSalary(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList,List<CourseScheduleTeacherSalary> oldTeacherSalaries){
+        Map<TeachTypeEnum, BigDecimal> salaryPriceMap = oldTeacherSalaries.stream().
+                collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole,
+                        Collectors.collectingAndThen(Collectors.toList(), v -> v.stream().map(e -> e.getExpectSalary()).
+                                reduce(BigDecimal.ZERO, BigDecimal::add))));
+        Map<TeachTypeEnum, List<CourseScheduleTeacherSalary>> salaryMap = courseScheduleTeacherSalaryList.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getTeacherRole));
+        for (TeachTypeEnum teachTypeEnum : salaryMap.keySet()) {
+            List<CourseScheduleTeacherSalary> teacherSalaries = salaryMap.get(teachTypeEnum);
+            TeachTypeEnum teacherRole = teacherSalaries.get(0).getTeacherRole();
+            BigDecimal totalSalary = salaryPriceMap.get(teacherRole);
+            Integer salarySize = teacherSalaries.size();
+            BigDecimal subSalary = totalSalary;
+            BigDecimal ratioSalary = totalSalary.divide(new BigDecimal(salarySize), 2, RoundingMode.HALF_UP);
+            for (int j = 0; j < teacherSalaries.size(); j++) {
+                CourseScheduleTeacherSalary salary = teacherSalaries.get(j);
+                salary.setExpectSalary(ratioSalary);
+                subSalary = subSalary.subtract(ratioSalary);
+                if(j == salarySize - 1){
+                    salary.setExpectSalary(salary.getExpectSalary().add(subSalary));
+                }
+            }
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaryList);
+    }
+
 }

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

@@ -338,6 +338,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
         musicGroupPaymentCalender.setOriginalTotalAmount(originalTotalAmount);
         musicGroupPaymentCalender.setStatus(status);
         musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
+        musicGroupPaymentCalender.setPaymentItemShowState(musicGroupPaymentBaseCalender.getPaymentItemShowState());
 
         if (musicGroupPaymentCalender.getStatus() != AUDITING) {
             if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {

+ 24 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -27,8 +27,6 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.thirdparty.yqpay.DateUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -85,6 +83,21 @@ import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountLogDao;
 import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CloseMusicGroupDto;
+import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
+import com.ym.mec.biz.dal.dto.HighClassGroupDto;
+import com.ym.mec.biz.dal.dto.MusicCardDto;
+import com.ym.mec.biz.dal.dto.MusicGroupApplyGoodsDto;
+import com.ym.mec.biz.dal.dto.MusicGroupBasicDto;
+import com.ym.mec.biz.dal.dto.MusicGroupQuitDto;
+import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.dto.SporadicPayDto;
+import com.ym.mec.biz.dal.dto.StudentApplyInstrumentDto;
+import com.ym.mec.biz.dal.dto.StudentImportDto;
+import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
+import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
+import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
 import com.ym.mec.biz.dal.entity.ApprovalStatus;
 import com.ym.mec.biz.dal.entity.ChargeType;
 import com.ym.mec.biz.dal.entity.ClassGroup;
@@ -104,13 +117,13 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
 import com.ym.mec.biz.dal.entity.MusicGroupQuit;
 import com.ym.mec.biz.dal.entity.MusicGroupReturnFeeDto;
 import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
 import com.ym.mec.biz.dal.entity.MusicMemberDto;
@@ -183,7 +196,6 @@ import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
@@ -1485,9 +1497,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "确认开团(筹备中 -> 进行中)", sysUser.getId(), ""));
         musicGroup.setStatus(MusicGroupStatusEnum.PROGRESS);
         //获取所有已缴费学员人数
-        List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
+        //List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryStudentByMusicGroupId(musicGroupId);
         studentRegistrationDao.updateOriginalFlag(musicGroupId);
-        musicGroup.setGroupMemberNum(studentRegistrations == null ? 0 : studentRegistrations.size());
+        //musicGroup.setGroupMemberNum(studentRegistrations == null ? 0 : studentRegistrations.size());
         musicGroup.setBillStartDate(new Date());
         musicGroupDao.update(musicGroup);
         //获取乐团班级列表
@@ -2993,15 +3005,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
 
         if (studentPaymentOrder.getStatus() == SUCCESS) {
-            //当前乐团报名是否赠送乐团网管课
-//            MusicGroupStudentFee musicGroupStudentFee = musicGroupPaymentCalenderService.updateCalender(calenderDetail.getId(), studentRegistration.getUserId());
-//            if (musicGroupStudentFee != null) {
-//                musicGroupStudentFee.setUpdateTime(date);
-//                musicGroupStudentFee.setLatestPaidTime(date);
-//                musicGroupStudentFee.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-//                musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
-//                musicGroupStudentFeeDao.update(musicGroupStudentFee);
-//            }
             //如果是进行中加学员
             MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderDao.get(studentPaymentOrder.getCalenderId());
             if (paymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT) {
@@ -3719,7 +3722,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (sysUser == null) {
             throw new BizException("用户信息获取失败");
         }
-        MusicGroup musicGroup = musicGroupDao.get(closeMusicGroupDto.getMusicGroupId());
+        String musicGroupId = closeMusicGroupDto.getMusicGroupId();
+        
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团找不到");
         }
@@ -3777,6 +3782,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registrations.size() > 0 && studentRegistrationService.quitAllStudent(musicGroup.getId(), "退团(乐团关闭)") <= 0) {
             throw new BizException("处理学生退团失败,请重试");
         }*/
+        
+        //清除剩余未排课时长
+        musicGroupPaymentStudentCourseDetailDao.clearRemainCourseMinutesByMusicGroupId(musicGroupId);
 
         //统计变更学员数
         groupEventSource.musicGroupStudentChangeEvent(closeMusicGroupDto.getMusicGroupId(), StudentMusicGroupStatusEnum.QUIT, null);

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

@@ -275,6 +275,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, hfMerchantConfig.getWxAppId(), hfMerchantConfig.getWxAppSecret(), code);
         Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
         if (!weChatRes.containsKey("openid")) {
+        	log.error("获取微信openId失败:[{}]",JsonUtil.toJSONString(weChatRes));
             throw new BizException("授权失败,请重新授权");
         }
         openId = weChatRes.get("openid");

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

@@ -866,6 +866,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         if (payStatus == PayStatus.SUCCESSED) {
             throw new BizException("订单已支付成功,请勿重复支付");
         }
+        if (payStatus == PayStatus.PAYING) {
+            throw new BizException("有一笔支付中的订单,请勿重复支付");
+        }
         if (!repeatPay) {
             return BaseController.failed(HttpStatus.CONTINUE, "您有待支付的订单,是否继续支付");
         }
@@ -1120,7 +1123,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentGoodsSell.setOrganId(student.getOrganId());
         studentGoodsSell.setTotalAmount(studentPaymentOrder.getActualAmount());
         studentGoodsSell.setGoodsType("MALL");
-        // studentGoodsSell.setGoodsJson(JSONObject.toJSONString(goodsSellDtos));
+        studentGoodsSell.setGoodsJson(model.getOrderInfo());
         studentGoodsSell.setOrderNo(model.getOrderNo());
         List<Integer> couponIdList = model.getCouponIdList();
         if (couponIdList != null && couponIdList.size() > 0) {
@@ -1257,4 +1260,13 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         return Payment.reversePayment(orderByOrderNo.getTransNo(),hfMerchantConfig.getAppId(),refundNo,
                                orderByOrderNo.getActualAmount().setScale(2,BigDecimal.ROUND_HALF_UP).toString(),notifyUrl);
     }
+
+    @Override
+    public Map couponAmount(MallCreateOrderModel model) {
+        Map payMap = new HashMap();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
+        payMap.put("mallCouponAmount",studentPaymentOrder.getCouponRemitFee() == null?BigDecimal.ZERO:studentPaymentOrder.getCouponRemitFee());
+        payMap.put("mallStatus",1);
+        return payMap;
+    }
 }

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

@@ -158,6 +158,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    public StudentRegistrationDao getDao() {
+        return studentRegistrationDao;
+    }
+
+    @Override
     public PageInfo<StudentApplyDetailDto> queryStudentDetailPage(StudentRegistrationQueryInfo queryInfo) {
         PageInfo<StudentApplyDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

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

@@ -71,7 +71,8 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 			studentStatisticsDao.updateFirstOrderTime();
 			num = 0;
 		}
-		redisTemplate.opsForValue().set("updateStudentStatisticsNum:",num++);
+		num++;
+		redisTemplate.opsForValue().set("updateStudentStatisticsNum:",num);
 	}
 
 	@Override

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

@@ -459,8 +459,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
     }
 
     @Override
-    public List<TeacherBasicDto> findTeachers(String organId,Boolean demissionFlag) {
-        return teacherDao.findByFlowOrganRangeTeachers(organId,demissionFlag);
+    public List<TeacherBasicDto> findTeachers(String organId,Boolean demissionFlag, Boolean isForzenWithQueryCondition) {
+        return teacherDao.findByFlowOrganRangeTeachers(organId,demissionFlag,isForzenWithQueryCondition);
     }
 
     @Override

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

@@ -58,8 +58,7 @@
             <if test="subjectIdList!=null">subject_id_list_,</if>
             <if test="name!=null">name_,</if>
             <if test="studentNum!=null">student_num_,</if>
-            <if test="createTime!=null">create_time_,</if>
-            <if test="updateTime!=null">update_time_,</if>
+            create_time_,update_time_,
             <if test="type!=null">type_,</if>
             <if test="expectStudentNum!=null">expect_student_num_,</if>
             <if test="totalClassTimes!=null">total_class_times_,</if>
@@ -77,8 +76,7 @@
             <if test="subjectIdList!=null">#{subjectIdList},</if>
             <if test="name!=null">#{name},</if>
             <if test="studentNum!=null">#{studentNum},</if>
-            <if test="createTime!=null">#{createTime},</if>
-            <if test="updateTime!=null">NOW(),</if>
+            NOW(),NOW(),
             <if test="type!=null">#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},</if>
             <if test="expectStudentNum!=null">#{expectStudentNum},</if>
             <if test="totalClassTimes!=null">#{totalClassTimes},</if>

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

@@ -113,10 +113,11 @@
 
     <!-- 班级学生批量插入 -->
     <insert id="classGroupStudentsInsert" parameterType="java.util.List">
-        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,tenant_id_)
+        INSERT INTO class_group_student_mapper (group_type_,music_group_id_,class_group_id_,user_id_,status_,create_time_,update_time_,tenant_id_)
         VALUE
         <foreach collection="classGroupStudentMapperList" item="item" index="index" separator=",">
-            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},#{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{item.tenantId})
+            (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{item.musicGroupId},#{item.classGroupId},
+            #{item.userId},#{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),#{item.tenantId})
         </foreach>
     </insert>
     
@@ -690,7 +691,6 @@
     </select>
     
     <select id="queryByClassGroupType" resultMap="ClassGroupStudentMapperDto">
-    
     	SELECT cgsm.*,cgtm.user_id_ teacher_id_ from class_group_student_mapper cgsm LEFT JOIN class_group cg on cgsm.class_group_id_ = cg.id_
 		LEFT JOIN class_group_teacher_mapper cgtm on cgsm.class_group_id_ = cgtm.class_group_id_
 		WHERE cgtm.music_group_id_ = #{musicGroupId} and cg.type_ = #{classGroupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} 
@@ -700,6 +700,9 @@
                     #{studentId}
                 </foreach>
         group by cgsm.user_id_
-        
+    </select>
+    <select id="findByUserIdsAndClassIds" resultType="java.lang.Integer">
+        select distinct class_group_id_ from class_group_student_mapper cgsm
+        where FIND_IN_SET(cgsm.user_id_,#{studentIds}) AND FIND_IN_SET(cgsm.user_id_,#{oldClassIds})
     </select>
 </mapper>

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

@@ -58,8 +58,14 @@
 	<delete id="delete" >
 		DELETE FROM cloud_teacher_free_course WHERE id_ = #{id} 
 	</delete>
-	
-	<!-- 分页查询 -->
+    <delete id="deleteByCourseIds">
+		DELETE FROM cloud_teacher_free_course WHERE course_id_ IN
+		<foreach collection="courseIdList" separator="," item="id" open="(" close=")">
+			#{id}
+		</foreach>
+	</delete>
+
+    <!-- 分页查询 -->
 	<select id="queryPage" resultMap="CloudTeacherFreeCourse" parameterType="map">
 		SELECT * FROM cloud_teacher_free_course ORDER BY id_ <include refid="global.limit"/>
 	</select>

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

@@ -115,7 +115,7 @@
         LEFT JOIN organization o ON co.organ_id_ = o.id_
         LEFT JOIN sys_user su ON su.id_ = co.education_user_id_
         <include refid="queryPageSql"/>
-        ORDER BY co.update_time_ DESC
+        ORDER BY co.name_ DESC
         <include refid="global.limit"/>
     </select>
 
@@ -123,8 +123,7 @@
         <where>
             co.del_flag_ != 1
             <if test="search != null">
-                AND (co.education_user_id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%')
-                OR co.id_ LIKE CONCAT('%',#{search},'%') OR co.name_ LIKE CONCAT('%',#{search},'%'))
+                AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR co.name_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="organId != null">
                 AND FIND_IN_SET(co.organ_id_,#{organId})

+ 52 - 0
mec-biz/src/main/resources/config/mybatis/CourseConvertLogMapper.xml

@@ -0,0 +1,52 @@
+<?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.CourseConvertLogDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.CourseConvertLog" id="CourseConvertLog">
+		<result column="id_" property="id" />
+		<result column="old_course_ids_" property="oldCourseIds" />
+		<result column="old_class_ids_" property="oldClassIds" />
+		<result column="old_course_json_" property="oldCourseJson" />
+		<result column="old_course_teacher_salary_json_" property="oldCourseTeacherSalaryJson" />
+		<result column="old_course_student_mapper_json_" property="oldCourseStudentMapperJson" />
+		<result column="old_teacher_attendance_json_" property="oldTeacherAttendanceJson" />
+		<result column="new_course_ids_" property="newCourseIds" />
+		<result column="new_class_ids_" property="newClassIds" />
+		<result column="operator_" property="operator" />
+		<result column="revoke_flag_" property="revokeFlag" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	<update id="updateRevoke">
+		update course_convert_log set revoke_flag_ = 1,update_time_ = NOW() where id_ = #{courseConvertId}
+	</update>
+
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="CourseConvertLog">
+		SELECT * FROM course_convert_log
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.CourseConvertLog" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO course_convert_log (old_course_ids_,old_class_ids_,old_course_json_,old_course_teacher_salary_json_,
+		                                old_course_student_mapper_json_,old_teacher_attendance_json_,new_course_ids_,
+		                                new_class_ids_,operator_,revoke_flag_,create_time_,update_time_)
+		VALUES(#{oldCourseIds},#{oldClassIds},#{oldCourseJson},#{oldCourseTeacherSalaryJson},#{oldCourseStudentMapperJson},
+		       #{oldTeacherAttendanceJson},#{newCourseIds},#{newClassIds},#{operator},#{revokeFlag},NOW(),NOW())
+	</insert>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="CourseConvertLog" parameterType="map">
+		SELECT * FROM course_convert_log <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM course_convert_log
+	</select>
+</mapper>

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

@@ -19,13 +19,14 @@
         and FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})
     </select>
     <resultMap id="CourseConvertSumDto" type="com.ym.mec.biz.dal.dto.CourseConvertSumDto">
-        <result property="courseType" column="courseType"/>
+        <result property="courseType" column="courseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="courseNum" column="courseNum"/>
         <result property="studentNum" column="num_"/>
         <result property="courseMinute" column="minute_"/>
     </resultMap>
     <select id="sumCourseConvert" resultMap="CourseConvertSumDto">
-        select COUNT(distinct cs.id_) courseNum,cs.type_ courseType,cssp.num_,SUM(TIMESTAMPDIFF(MINUTE,cs.start_class_time_,cs.end_class_time_)) minute_ from course_schedule cs,
+        select COUNT(distinct cs.id_) courseNum,cs.type_ courseType,cssp.num_,SUM(TIMESTAMPDIFF(MINUTE,cs.start_class_time_,cs.end_class_time_)) minute_
+        from course_schedule cs,
         (select COUNT(distinct cssp.user_id_) num_ from course_schedule_student_payment cssp
         where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})) cssp
         where FIND_IN_SET(cs.id_,#{courseIds})

+ 10 - 5
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -42,6 +42,7 @@
         <result column="valid_start_time_" property="validStartTime"/>
         <result column="tenant_id_" property="tenantId"/>
         <result column="evaluate_flag_" property="evaluateFlag"/>
+        <result column="convert_flag_" property="convertFlag"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -195,13 +196,13 @@
         INSERT INTO course_schedule
         (group_type_,music_group_id_,class_group_id_,status_,subsidy_,class_date_,start_class_time_,end_class_time_,
         teacher_id_,actual_teacher_id_,create_time_,update_time_,type_,name_,teach_mode_,student_num_,leave_student_num_,
-        schoole_id_,is_lock_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_)
+        schoole_id_,is_lock_,note_,teaching_content_,organ_id_,member_flag_,pre_course_flag_,valid_end_time_,valid_start_time_,tenant_id_,convert_flag_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
         #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{subsidy},#{classDate},#{startClassTime},
         #{endClassTime},#{teacherId},#{teacherId},now(),now(),
         #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{name},
         #{teachMode,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{studentNum},#{leaveStudentNum},
-        #{schoolId},#{isLock},#{note},#{teachingContent},#{organId},#{memberFlag},#{preCourseFlag},#{validEndTime},#{validStartTime},#{tenantId})
+        #{schoolId},#{isLock},#{note},#{teachingContent},#{organId},#{memberFlag},#{preCourseFlag},#{validEndTime},#{validStartTime},#{tenantId},#{convertFlag})
     </insert>
 
     <insert id="batchAddCourseSchedules" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
@@ -1679,10 +1680,10 @@
             and status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
         union all
-        select ncs.* from course_schedule cs left join course_schedule ncs on ncs.id_ = cs.new_course_id_
-        where cs.new_course_id_ &gt; 0 and cs.class_group_id_ = #{classGroupId} AND cs.pre_course_flag_ = 0
+        select * from course_schedule
+        where class_group_id_ = #{classGroupId} AND pre_course_flag_ = 0 AND id_ = new_course_id_
         <if test="status != null">
-            and ncs.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            and status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
     </select>
 
@@ -4079,4 +4080,8 @@
             </if>
         </if>
     </select>
+    
+    <select id="queryStartedCourseMusicGroupIdList" resultType="java.lang.String">
+		select distinct cs.music_group_id_ from course_schedule cs where cs.group_type_ = #{groupType} and cs.status_ = 'OVER'
+    </select>
 </mapper>

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

@@ -199,7 +199,7 @@
 
     <select id="findByCourseScheduleIds" resultMap="CourseScheduleStudentPayment">
 		SELECT * FROM course_schedule_student_payment WHERE course_schedule_id_ IN
-		<foreach collection="ids" item="id" open="(" close=")" separator=",">
+		<foreach collection="courseIdList" item="id" open="(" close=")" separator=",">
 			#{id}
 		</foreach>
     </select>

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

@@ -16,6 +16,7 @@
         <result column="course_form_" property="courseForm"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="first_course_start_time_" property="firstCourseStartTime"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="extracurricular_teacher_" property="extracurricularTeacher" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="bill_start_date_" property="billStartDate"/>
@@ -108,7 +109,7 @@
                  settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
                  parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
                  ownership_type_, repair_user_id_, del_flag_, payment_valid_start_date_, payment_valid_end_date_,
-                 payment_pattern_, course_view_type_, transaction_teacher_id_,homework_push_flag_,member_course_show_flag_,tenant_id_,is_give_accessories_,extracurricular_teacher_)
+                 payment_pattern_, course_view_type_, transaction_teacher_id_,homework_push_flag_,member_course_show_flag_,tenant_id_,is_give_accessories_,extracurricular_teacher_,first_course_start_time_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate}, #{preApplyExpireDate}, #{teamTeacherId},
                 #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
@@ -120,7 +121,8 @@
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
                 #{delFlag}, #{paymentValidStartDate}, #{paymentValidEndDate}, #{paymentPattern},
-                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{homeworkPushFlag},#{memberCourseShowFlag},#{tenantId},#{isGiveAccessories},#{extracurricularTeacher,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{homeworkPushFlag},#{memberCourseShowFlag},#{tenantId},#{isGiveAccessories},
+                #{extracurricularTeacher,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{firstCourseStartTime})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -241,6 +243,9 @@
             <if test="extracurricularTeacher != null">
                 extracurricular_teacher_ = #{extracurricularTeacher,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="firstCourseStartTime != null">
+                first_course_start_time_ = #{firstCourseStartTime},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -315,6 +320,12 @@
             <if test="billEndDate!=null">
                 AND date(mg.bill_start_date_) &lt;= #{billEndDate}
             </if>
+            <if test="isStartedCourse != null and isStartedCourse == true">
+                AND first_course_start_time_ is not null
+            </if>
+            <if test="isStartedCourse != null and isStartedCourse == false">
+                AND first_course_start_time_ is null
+            </if>
         </where>
     </sql>
 

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

@@ -39,6 +39,7 @@
         <result column="member_valid_date_" property="memberValidDate"/>
         <result column="current_total_amount_" property="currentTotalAmount"/>
         <result column="original_total_amount_" property="originalTotalAmount"/>
+        <result column="payment_item_show_state_" property="paymentItemShowState"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -59,14 +60,14 @@
         actual_num_,memo_,is_give_music_network_,create_time_,update_time_,payment_valid_start_date_,payment_valid_end_date_,
         payment_pattern_,payment_type_,payment_amount_,batch_no_,audit_memo_,operator_,attribute1_,
          attribute2_,student_ids_,member_payment_amount_,member_rank_setting_id_,member_valid_date_
-         ,original_member_payment_amount_,current_total_amount_,original_total_amount_,tenant_id_,organ_id_,cloud_teacher_payment_flag_)
+         ,original_member_payment_amount_,current_total_amount_,original_total_amount_,tenant_id_,organ_id_,cloud_teacher_payment_flag_,payment_item_show_state_)
         VALUES(#{musicGroupId},#{musicGroupOrganizationCourseSettingId},#{payUserType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{rejectReason},#{startPaymentDate},#{deadlinePaymentDate},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{expectNum},#{actualNum},#{memo},#{isGiveMusicNetwork},now(),now(),
         #{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{paymentType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{paymentAmount},#{batchNo},#{auditMemo},#{operator},#{attribute1},#{attribute2},#{studentIds},
                #{memberPaymentAmount},#{memberRankSettingId},#{memberValidDate},#{originalMemberPaymentAmount},
-               #{currentTotalAmount},#{originalTotalAmount},#{tenantId},#{organId},#{cloudTeacherPaymentFlag})
+               #{currentTotalAmount},#{originalTotalAmount},#{tenantId},#{organId},#{cloudTeacherPaymentFlag},#{paymentItemShowState})
     </insert>
 
 
@@ -156,6 +157,9 @@
             <if test="attribute2 != null">
                 attribute2_ = #{attribute2},
             </if>
+            <if test="paymentItemShowState != null">
+                payment_item_show_state_ = #{paymentItemShowState},
+            </if>
         </set>
         WHERE id_ = #{id} and tenant_id_ = #{tenantId}
     </update>
@@ -239,6 +243,9 @@
 	            <if test="item.attribute2 != null">
 	                attribute2_ = #{item.attribute2},
 	            </if>
+	            <if test="item.paymentItemShowState != null">
+	                payment_item_show_state_ = #{item.paymentItemShowState},
+	            </if>
 	        </set>
 	        WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
 		</foreach>

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

@@ -364,4 +364,10 @@
             #{studentId}
         </foreach>)c
     </select>
+    
+    <update id="clearRemainCourseMinutesByMusicGroupId">
+    	update `music_group_payment_student_course_detail` cd LEFT JOIN `music_group_payment_calender` pc on cd.`music_group_payment_calender_id_` = pc.`id_` 
+		set cd.`used_course_minutes_` = 1
+		WHERE cd.`used_course_minutes_` = 0 and pc.`music_group_id_` = #{musicGroupId}  
+    </update>
 </mapper>

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

@@ -471,7 +471,7 @@
     
     <select id="findStudentAttendance" resultMap="StudentAttendance">
         SELECT cssp.id_,cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,
-               CASE WHEN sa.status_ IS NULL THEN 'TRUANT' ELSE sa.status_ END status_,
+               CASE WHEN sa.status_ IS NULL and cs.status_ = 'OVER' THEN 'TRUANT' ELSE sa.status_ END status_,
         su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,tu.avatar_ teacher_avatar_,
         cs.name_ course_schedule_name_,cs.status_ course_status_,
         cs.actual_teacher_id_ teacher_id_,cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ ,cs.new_course_id_,

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

@@ -329,7 +329,7 @@
 		<include refid="queryStatisticsSql"/>
 	</select>
 	<select id="queryStatistics" resultMap="StudentStatisticsDto">
-		SELECT sbi.*,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee,
+		SELECT *,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee,
 			CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN '在读'
 			WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 THEN '沉睡'
 			WHEN ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0 THEN '流失'

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

@@ -937,11 +937,14 @@
     <select id="findByFlowOrganRangeTeachers" resultMap="TeacherBasicDto">
         SELECT su.id_,su.username_,su.real_name_,t.organ_id_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
-        WHERE su.del_flag_ = 0 AND su.lock_flag_ = 0
+        WHERE su.del_flag_ = 0
             AND (INTE_ARRAY(#{organId},t.flow_organ_range_) OR FIND_IN_SET(t.organ_id_,#{organId}))
         <if test="demissionFlag != null and demissionFlag == false">
             AND t.demission_date_ IS NULL
         </if>
+        <if test="isForzenWithQueryCondition == null or isForzenWithQueryCondition == false">
+        	 AND su.lock_flag_ = 0
+        </if>
     </select>
 
     <select id="findByTeacherIds" resultMap="Teacher">

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -66,4 +66,8 @@ public interface WebFeignService {
 	// 商城获取 退款数据
 	@PostMapping("/api/refund")
 	HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestBody RefundModel refundModel);
+
+	// 商城订单优惠券金额
+	@PostMapping("/api/couponAmount")
+	HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model);
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -92,4 +92,9 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(RefundModel refundModel) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<Map> couponAmount(MallCreateOrderModel model) {
+		return null;
+	}
 }

+ 1 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java

@@ -240,7 +240,7 @@ public class UmsAdminServiceImpl implements UmsAdminService {
         UmsAdmin admin = new UmsAdmin();
         admin.setId(row.getId().longValue());
         admin.setCreateTime(row.getCreateTime());
-        admin.setUsername(row.getUsername());
+        admin.setUsername(row.getRealName());
         admin.setNickName(row.getUsername());
         admin.setPassword(row.getPassword());
         admin.setStatus(1);

+ 2 - 2
mec-mall/mall-admin/src/main/resources/bootstrap-prod.yml

@@ -2,8 +2,8 @@ spring:
   cloud:
     nacos:
       config:
-        server-addr: 121.41.82.151:8848
-        namespace: dba505ee-020c-4c2b-bab2-e91d89cf248e
+        server-addr: 47.96.80.97:8848
+        namespace: f40a7594-4bd0-4bc6-8397-9353c6d2e63a
         group: DEFAULT_GROUP
         prefix: mall-admin
         file-extension: yaml

+ 69 - 0
mec-mall/mall-admin/src/main/resources/logback-spring.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/logs/mall-admin-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+			  class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+					class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.yonge" level="INFO" />
+
+	<!--本地环境:打印控制台 -->
+	<springProfile name="local">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	<!--开发环境:打印控制台 -->
+	<springProfile name="dev">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="test">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="pre">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<!--生产环境:输出到文件 -->
+	<springProfile name="prod">
+		<root level="WARN">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+</configuration>

+ 21 - 4
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -78,8 +79,16 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/generateOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult generateOrder(@RequestBody OrderParam orderParam) {
-        Map<String, Object> result = portalOrderService.generateOrder(orderParam);
-        return CommonResult.success(result, "下单成功");
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
+        return CommonResult.success(result[0], "下单成功");
     }
 
 
@@ -89,8 +98,16 @@ public class OmsPortalOrderController {
     public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
         UmsMember currentMember = memberService.getCurrentMember();
         orderParam.setTeacherId(currentMember.getId());
-        Map<String, Object> result = portalOrderService.generateOrder(orderParam);
-        return CommonResult.success(result, "下单成功");
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
+        return CommonResult.success(result[0], "下单成功");
     }
 
     @ApiOperation("用户支付成功的回调")

+ 25 - 15
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -11,7 +11,6 @@ import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.entity.RefundModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
-import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.web.WebFeignService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
@@ -135,7 +134,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         OmsOrder order = new OmsOrder();
         String orderSn = generateOrderSn();
         if (!StringUtil.isEmpty(orderParam.getOrderNo())) {
-            // 订单号不为空 先删除订单  在重新创建订单
+            // 订单号不为空
             OmsOrderDetail detail = detail(orderParam.getOrderNo());
             if (detail != null && detail.getStatus() == 0) {
                 // 取消原有的订单支付
@@ -152,12 +151,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 userOrderPayment.setId(null);
                 userOrderPaymentService.saveOrUpdate(userOrderPayment);
 
-                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount());
+                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount(),
+                                           JSON.toJSONString(detail));
             } else {
                 throw new BizException("订单信息获取失败");
             }
 
         } else {
+            if (orderParam.getMemberReceiveAddressId() == null) {
+                throw new BizException("请选择收货地址");
+            }
             if (orderParam.getOrderAmount() == null) {
                 throw new BizException("订单金额校验不通过");
             }
@@ -201,9 +204,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
 
         BigDecimal amount = calcTotalAmount(orderItemList);
-
-        Map data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
-                                       orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(), currentMember.getId().intValue(), amount);
+        Map data = feignMecCouponAmount(orderParam.getCouponId(), orderParam.getOrderAmount());
 
         BigDecimal couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
         if (couponAmount == null) {
@@ -273,7 +274,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setFreightAmount(new BigDecimal(0));
         order.setPromotionAmount(calcPromotionAmount(orderItemList));
         order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
-        order.setPlatformType(orderParam.getPlatformType());
+        order.setPlatformType(orderParam.getPlatformType() == null?"STUDENT":orderParam.getPlatformType());
         if (StringUtil.isEmpty(orderParam.getCouponId())) {
             order.setCouponAmount(new BigDecimal(0));
         } else {
@@ -370,23 +371,31 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
         }
         userOrderPaymentService.save(userOrderPayment);
-        result.put("pay",data);
 
+        // 生成订单
         // 保存商品信息到管乐迷
         OmsOrderDetail detail = detail(order.getOrderSn());
+        data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
+                                       orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(),
+                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail));
+        result.put("pay",data);
+
+        return result;
+    }
+
+    private Map feignMecCouponAmount(String couponId,BigDecimal amount) {
 
         MallCreateOrderModel model = new MallCreateOrderModel();
-        model.setOrderNo(order.getOrderSn());
-        model.setOrderInfo(JSON.toJSONString(detail));
-        HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallSaveOrderInfo(model);
+        model.setCouponIdList(StringUtil.toIntegerList(couponId));
+        model.setAmount(amount);
+        HttpResponseResult<Map> mapHttpResponseResult = webFeignService.couponAmount(model);
         if (!mapHttpResponseResult.getStatus()) {
-            throw new BizException(mapHttpResponseResult.getMsg());
+            throw new BizException("管乐迷获取优惠券优惠失败");
         }
-
-        return result;
+        return mapHttpResponseResult.getData();
     }
 
-    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount) {
+    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount, String orderDetail) {
         // 远程调用管乐迷订单记录
         MallCreateOrderModel model = new MallCreateOrderModel();
         model.setAmount(amount);
@@ -397,6 +406,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         model.setUserId(userId);
         model.setCouponIdList(StringUtil.toIntegerList(couponId));
         model.setOldOrderNo(oldOrderNo);
+        model.setOrderInfo(orderDetail);
         HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallCreateOrder(model);
         if (!mapHttpResponseResult.getStatus()) {
             throw new BizException("管乐迷订单生成失败");

+ 2 - 2
mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml

@@ -2,8 +2,8 @@ spring:
   cloud:
     nacos:
       config:
-        server-addr: 121.41.82.151:8848
-        namespace: dba505ee-020c-4c2b-bab2-e91d89cf248e
+        server-addr: 47.96.80.97:8848
+        namespace: f40a7594-4bd0-4bc6-8397-9353c6d2e63a
         group: DEFAULT_GROUP
         prefix: mall-portal
         file-extension: yaml

+ 69 - 0
mec-mall/mall-portal/src/main/resources/logback-spring.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/logs/mall-portal-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+			  value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+			  class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+					class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.yonge" level="info" />
+
+	<!--本地环境:打印控制台 -->
+	<springProfile name="local">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+	<!--开发环境:打印控制台 -->
+	<springProfile name="dev">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="test">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<springProfile name="pre">
+		<root level="INFO">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+	<!--生产环境:输出到文件 -->
+	<springProfile name="prod">
+		<root level="WARN">
+			<appender-ref ref="stdout" />
+			<appender-ref ref="file" />
+		</root>
+	</springProfile>
+
+</configuration>

+ 5 - 0
mec-student/src/main/resources/logback-spring.xml

@@ -50,6 +50,11 @@
 		<appender-ref ref="messagefile" />
 	</logger>
 
+	<logger name="com.ym.mec.student.controller.StudentOrderController" level="INFO"
+			additivity="false">
+		<appender-ref ref="messagefile" />
+	</logger>
+
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">
 		<root level="INFO">

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

@@ -145,6 +145,16 @@ public class APIController extends BaseController {
 		}
 	}
 
+	// 商城订单优惠券金额
+	@PostMapping("/couponAmount")
+	public HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model) {
+		try {
+			return succeed(studentPaymentOrderService.couponAmount(model));
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
 
 	// 商城保存订单详情数据
 	@PostMapping("/mallSaveOrderInfo")

+ 7 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ChargeTypeController.java

@@ -5,16 +5,20 @@ import com.ym.mec.biz.service.ChargeTypeService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.yonge.log.model.AuditLogAnnotation;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RequestMapping("chargeType")
 @Api(tags = "收费类型服务")
@@ -53,7 +57,9 @@ public class ChargeTypeController extends BaseController {
     @GetMapping("/findAll")
     @PreAuthorize("@pcs.hasPermissions('chargeType/findAll')")
     public HttpResponseResult<List<ChargeType>> findAll() {
-        return succeed(chargeTypeService.findAll(new HashMap<>()));
+    	Map<String, Object> params = new HashMap<String, Object>();
+    	params.put("tenantId", TenantContextHolder.getTenantId());
+        return succeed(chargeTypeService.findAll(params));
     }
 
 }

+ 12 - 9
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.CourseConvertDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.ClassGroupDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleConvertService;
@@ -15,10 +16,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
 import java.util.List;
@@ -46,13 +44,18 @@ public class CourseScheduleConvertController extends BaseController {
     }
 
     @ApiOperation(value = "课程转换")
-    @GetMapping("/action")
+    @PostMapping("/action")
     @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/action')")
-    public HttpResponseResult<Boolean> action(@RequestBody CourseConvertDto convertDto){
-        return succeed(courseScheduleConvertService.action(convertDto));
+    public HttpResponseResult<Boolean> action(@RequestBody List<ClassGroupDto> classGroups){
+        return courseScheduleConvertService.action(classGroups);
     }
 
-
-
+    @ApiOperation(value = "课程转换还原")
+    @GetMapping("/revoke")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/revoke')")
+    public HttpResponseResult revoke(Integer courseConvertId){
+        courseScheduleConvertService.revoke(courseConvertId);
+        return succeed();
+    }
 }
 

+ 80 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -139,6 +139,9 @@ public class ExportController extends BaseController {
     private MusicGroupService musicGroupService;
     @Autowired
     private SysTenantConfigService sysTenantConfigService;
+
+    @Autowired
+    private StudentVisitService studentVisitService;
     
     @Autowired
     private ImLiveBroadcastRoomMemberService imLiveBroadcastRoomMemberService;
@@ -2968,4 +2971,81 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "学生课表考勤导出")
+    @PostMapping("export/studentCourseAttendance")
+    @PreAuthorize("@pcs.hasPermissions('export/studentCourseAttendance')")
+    public void exportStudentCourseAttendance(HttpServletResponse response, StudentAttendanceQueryInfo queryInfo) throws IOException {
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
+        //按考勤状态和回访状态排序
+        queryInfo.setOrderFlag(true);
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<StudentAttendance> rows = studentAttendanceService.findStudentAttendance(queryInfo).getRows();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学员姓名", "学员编号", "老师姓名", "老师编号",
+                    "课程组编号", "课程编号", "课程名称", "课程组类型", "课程类型", "上课时间","签到时间", "签退时间", "考勤状态"}, new String[]{
+                    "courseSchedule.organization.name", "username", "userId", "courseSchedule.teacherName", "teacherId", "musicGroupId", "courseScheduleId",
+                    "courseSchedule.name", "groupType.desc", "courseSchedule.type.msg", "courseSchedule.classDate", "signInTime",
+                    "signOutTime", "status.msg"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=courseAttendance-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    
+    @ApiOperation(value = "学生回访记录导出")
+    @PostMapping("export/studentVisitRecord")
+    @PreAuthorize("@pcs.hasPermissions('export/studentVisitRecord')")
+    public void exportStudentVisitRecord(HttpServletResponse response, StudentVisitQueryInfo queryInfo) throws IOException {
+    	queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<StudentVisitDto> rows = studentVisitService.getPageList(queryInfo).getRows();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"老师姓名", "所属分部",
+                    "角色", "学生编号", "学生姓名", "回访类型", "回访目的", "问题状态","回访图片", "回访时间"}, new String[]{
+                    "teacherName", "organName", "visiterType.msg", "studentId", "studentName", "type", "purpose","probStatus == 1 ? '已解决' : '待跟进'",
+                    "attachments", "visitTime"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=visitRecord-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

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

@@ -65,7 +65,7 @@ public class StudentInstrumentController extends BaseController {
 
     @ApiOperation(value = "乐器保养列表")
     @GetMapping("/getList")
-    @PreAuthorize("@pcs.hasPermissions('studentInstrument/getList')")
+    //@PreAuthorize("@pcs.hasPermissions('studentInstrument/getList')")
     public HttpResponseResult<PageInfo<StudentInstrument>> getList(StudentInstrumentQueryInfo queryInfo) {
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         studentInstrumentDao.batchUpdate();

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

@@ -53,7 +53,7 @@ public class StudentStatisticsController extends BaseController {
     @Autowired
     private IdGeneratorService idGeneratorService;
 
-    @ApiOperation(value = "分页查询收费类型列表")
+    @ApiOperation(value = "分页查询")
     @PostMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('studentStatistics/queryPage')")
     public HttpResponseResult<PageInfo<StudentStatisticsDto>> queryPage(StudentStatisticsQueryInfo queryInfo) {

+ 5 - 4
mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

@@ -84,12 +84,13 @@ public class TeacherController extends BaseController {
     @ApiOperation(value = "获取分部所有老师")
     @GetMapping("/findTeachers")
     @PreAuthorize("@pcs.hasPermissions('teacher/findTeachers','system')")
-    public HttpResponseResult findTeachers(String organId,Boolean demissionFlag) {
+    public HttpResponseResult findTeachers(String organId,Boolean demissionFlag, Boolean isForzenWithQueryCondition) {
         organId = organizationService.getEmployeeOrgan(organId);
-        if (demissionFlag == null){
-            demissionFlag = false;
+        demissionFlag = false;
+        if(isForzenWithQueryCondition == null){
+        	isForzenWithQueryCondition = false;
         }
-        return succeed(teacherService.findTeachers(organId,demissionFlag));
+        return succeed(teacherService.findTeachers(organId,demissionFlag,isForzenWithQueryCondition));
     }
 
     @ApiOperation(value = "根据科目获取部门下的教师")