浏览代码

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

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
zouxuan 4 年之前
父节点
当前提交
23ceaa5795
共有 21 个文件被更改,包括 400 次插入81 次删除
  1. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  3. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseHomeworkDao.java
  4. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherPersonalAttendanceDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  6. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentAttendance.java
  7. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  8. 9 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  9. 16 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  10. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  11. 67 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  12. 10 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  13. 46 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  14. 26 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  15. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  16. 7 6
      mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml
  17. 2 1
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  18. 4 1
      mec-im/src/main/java/com/ym/controller/RoomController.java
  19. 43 35
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  20. 20 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java
  21. 49 12
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

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

@@ -1477,6 +1477,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     CourseSchedule findFirstCourseWithGroup(@Param("groupId") String groupId,
                                             @Param("groupType") GroupType groupType);
+    CourseSchedule findLastCourseWithGroup(@Param("groupId") String groupId,
+                                            @Param("groupType") GroupType groupType);
 
     List<CourseSchedule> findClassGroupLastTeacher(@Param("classGroupIds") List<Integer> classGroupIds);
 
@@ -1786,6 +1788,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
 
     /**
      * 获取还有剩余课程的学员
+     *
      * @param userIds
      * @param groupType
      * @return
@@ -1793,5 +1796,22 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<Integer> findHasCourseStudent(@Param("userIds") List<Integer> userIds, @Param("groupType") String groupType);
 
     List<CourseSchedule> queryByCourseScheduleIds(Map<String, Object> params);
+
     int countByCourseScheduleIds(Map<String, Object> params);
+
+    /**
+     * 获取乐团已开始的课程数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    Integer getMusicGroupHasStartCourseNum(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取多乐团已开始的课程数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<CourseSchedule> getMusicGroupsHasStartCourseNum(@Param("ids") List<String> ids);
 }

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

@@ -309,8 +309,32 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
 
     /**
      * 获取
+     *
      * @param calenderIds
      * @return
      */
     List<String> queryMusicGroupIds(@Param("calenderIds") List<Long> calenderIds);
+
+    /**
+     * 获取乐团缴费项的批次数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<MusicGroupPaymentCalender> getMusicGroupCalenderBatchNoTimes(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取多乐团的报名缴费项
+     *
+     * @return
+     */
+    List<MusicGroupPaymentCalender> getMusicGroupRegCalenderByIds(@Param("ids") List<String> ids);
+
+
+    /**
+     * 获取多乐团缴费项的批次数
+     *
+     * @return
+     */
+    List<MusicGroupPaymentCalender> getMusicGroupCalenderBatchNoByIds(@Param("ids") List<String> ids);
 }

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

@@ -21,6 +21,9 @@ public interface StudentCourseHomeworkDao extends BaseDAO<Long, StudentCourseHom
     @Select("SELECT COUNT(*) FROM student_course_homework WHERE course_homework_id_=#{courseHomeworkID} AND attachments_ IS NOT NULL")
     int countCompletedStudentNum(Long courseHomeworkID);
 
+    @Select("SELECT COUNT(user_id_) FROM student_course_homework WHERE course_schedule_id_=#{courseId}")
+    int countHomeworkStudentNumWithCourse(Long courseId);
+
     /**
      * @Author: Joburgess
      * @Date: 2019/9/18

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -27,6 +28,10 @@ public class TeacherPersonalAttendanceDto {
     @ApiModelProperty(value = "课程类型",required = false)
     private CourseSchedule.CourseScheduleType type;
 
+    /** 课程状态 */
+    @ApiModelProperty(value = "课程状态",required = false)
+    private CourseStatusEnum courseStatus;
+
     /** 班级名称 */
     @ApiModelProperty(value = "班级名称",required = false)
     private String name;
@@ -43,6 +48,14 @@ public class TeacherPersonalAttendanceDto {
     @ApiModelProperty(value = "备注",required = false)
     private String remark;
 
+    public CourseStatusEnum getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(CourseStatusEnum courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+
     public Integer getSignInStatus() {
         return signInStatus;
     }

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

@@ -174,6 +174,9 @@ public class MusicGroup {
 
 	private Boolean hasVerifyMusicalList = false;
 
+	@ApiModelProperty(value = "进行中,缴费按钮控制",required = true)
+	private Boolean isRemedy = false;
+
 	public String getRepairUserName() {
 		return repairUserName;
 	}
@@ -580,4 +583,12 @@ public class MusicGroup {
 	public void setCourseViewType(CourseViewTypeEnum courseViewType) {
 		this.courseViewType = courseViewType;
 	}
+
+	public Boolean getIsRemedy() {
+		return isRemedy;
+	}
+
+	public void setIsRemedy(Boolean remedy) {
+		isRemedy = remedy;
+	}
 }

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

@@ -47,8 +47,12 @@ public class StudentAttendance {
 	@ApiModelProperty(value = "学生姓名",required = false)
 	private String username;
 
+	//学员头像
 	private String avatar;
 
+	//老师头像
+	private String teacherAvatar;
+
 	/**  */
 	@ApiModelProperty(value = "声部列表",required = false)
 	private String subjectName;
@@ -86,6 +90,14 @@ public class StudentAttendance {
 	@ApiModelProperty(value = "缴费状态")
 	private String paymentStatus = "PAID_COMPLETED";
 
+	public String getTeacherAvatar() {
+		return teacherAvatar;
+	}
+
+	public void setTeacherAvatar(String teacherAvatar) {
+		this.teacherAvatar = teacherAvatar;
+	}
+
 	public YesOrNoEnum getVisitFlag() {
 		return visitFlag;
 	}

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

@@ -355,4 +355,17 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      */
     List<StudentRegistration> getMusicGroupStuReBack(String musicGroupId);
 
+
+    /**
+     * 检查乐团是否能报名或缴费
+     * @return
+     */
+    String checkRegOrPayStatus(String musicGroupId);
+
+    /**
+     * 检查多乐团是否能报名或缴费
+     * @return
+     */
+    Map<String,Boolean> checkMusicGroupsRegOrPayStatus(List<String> ids);
+
 }

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

@@ -503,6 +503,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if(!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())){
 				throw new BizException("非进行中网管课不支持加课");
 			}
+			groupEndDate = practiceGroup.getCoursesExpireDate();
 			organId=practiceGroup.getOrganId();
 
 			List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao
@@ -639,7 +640,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					}
 					if (groupEndDate != null) {
 						if (calendar.getTime().after(groupEndDate)) {
-							throw new BizException("排课时间超出排课截止日期({})", groupEndDate);
+							throw new BizException("排课时间超出排课截止日期({})", DateUtil.dateToString(groupEndDate, DateUtil.DATE_FORMAT_MIN));
 						}
 					}
 
@@ -4959,8 +4960,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     	if(practiceGroup == null){
 			throw new BizException("课程组不存在");
 		}
-    	if(!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())){
-    		throw new BizException("非进行中课程组不可编辑");
+		if(!GroupStatusEnum.NORMAL.equals(practiceGroup.getGroupStatus())&&!GroupStatusEnum.FINISH.equals(practiceGroup.getGroupStatus())){
+			throw new BizException("非正常状态课程组不可编辑");
 		}
 		if(courseStartDate.after(coursesExpireDate)){
 			throw new BizException("课程组有效结束时间不能早于课程组有效开始时间");
@@ -4981,6 +4982,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 //				throw new BizException("课程结束时间不得早于,{}", DateUtil.dateToString(courseExpiredDateTemp, "yyyy年MM月dd日"));
 //			}
 //		}
+		Date now = new Date();
 		CoursesGroupModifyLog coursesGroupModifyLog = new CoursesGroupModifyLog();
 		coursesGroupModifyLog.setGroupId(practiceGroupId);
 		coursesGroupModifyLog.setGroupType(PRACTICE.getCode());
@@ -4988,7 +4990,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		coursesGroupModifyLog.setPreviousGroup(JSONObject.toJSONString(practiceGroup));
 		practiceGroup.setCoursesStartDate(courseStartDate);
 		practiceGroup.setCoursesExpireDate(DateUtil.addSeconds(DateUtil.addDays(coursesExpireDate, 1),-1));
-		practiceGroup.setUpdateTime(new Date());
+		if(practiceGroup.getCoursesExpireDate().compareTo(now)>=0||DateUtil.isSameDay(practiceGroup.getCoursesExpireDate(), now)){
+			practiceGroup.setGroupStatus(GroupStatusEnum.NORMAL);
+		}
+		practiceGroup.setUpdateTime(now);
 		practiceGroupDao.update(practiceGroup);
 		coursesGroupModifyLog.setCurrentGroup(JSONObject.toJSONString(practiceGroup));
 		coursesGroupModifyLogDao.insert(coursesGroupModifyLog);

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

@@ -1486,13 +1486,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团找不到");
         }
 
-        if (musicGroup.getStatus() != MusicGroupStatusEnum.PAY) {
+        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
             throw new BizException("乐团当前状态是[{}],不能延长缴费", musicGroup.getStatus().getMsg());
         }
 
         Date date = new Date();
 
-        if (expireDate.before(date)) {
+        if (DateUtil.getLastTimeWithDay(expireDate).before(date)) {
             throw new BizException("日期设置错误");
         }
 
@@ -1530,13 +1532,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团找不到");
         }
 
-        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.APPLY || musicGroup.getStatus() == MusicGroupStatusEnum.PAY)) {
+        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.APPLY ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
             throw new BizException("乐团当前状态是[{}],不能延长报名", musicGroup.getStatus().getMsg());
         }
 
         Date date = new Date();
 
-        if (date.after(expireDate)) {
+        if (date.after(DateUtil.getLastTimeWithDay(expireDate))) {
             throw new BizException("日期设置错误");
         }
 
@@ -1564,7 +1569,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Date date = new Date();
 
-        if (date.after(expireDate)) {
+        if (date.after(DateUtil.getLastTimeWithDay(expireDate))) {
             throw new BizException("日期设置错误");
         }
 
@@ -2387,6 +2392,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         List<MusicGroupPurchaseList> musicGroupPurchaseListCount = musicGroupPurchaseListDao.getCount(musicGroupIds);
         Map<String, Integer> purchaseListMap = musicGroupPurchaseListCount.stream().collect(Collectors.toMap(MusicGroupPurchaseList::getMusicGroupId, MusicGroupPurchaseList::getPurchaseNum));
 
+        Map<String, Boolean> viewRegButtonMap = studentRegistrationService.checkMusicGroupsRegOrPayStatus(new ArrayList<>(musicGroupIds));
         //获取分部名称map
         musicGroupList.forEach(e -> {
 //            e.setSchoolName(schoolNameMap.get(e.getSchoolId()));
@@ -2397,6 +2403,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             e.setPayNum(payNumMap.get(e.getId()) == null ? 0 : payNumMap.get(e.getId()));
             e.setChargeTypeName(chargeTypeNameMap.get(e.getChargeTypeId()));
             e.setHasVerifyMusicalList(purchaseListMap.get(e.getId()) != null);
+            if(e.getStatus().equals(MusicGroupStatusEnum.PREPARE) || e.getStatus().equals(MusicGroupStatusEnum.PROGRESS)){
+                if(viewRegButtonMap.containsKey(e.getId())){
+                    e.setIsRemedy(true);
+                }
+            }
         });
         return musicGroupPageInfo;
     }

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

@@ -112,6 +112,8 @@ public class StudentManageServiceImpl implements StudentManageService {
     private SysUserContractsDao sysUserContractsDao;
     @Autowired
     private WebFeignService webFeignService;
+    @Autowired
+    private StudentCourseHomeworkDao studentCourseHomeworkDao;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -612,7 +614,6 @@ public class StudentManageServiceImpl implements StudentManageService {
                 student.setUserType(sysUser.getUserType() + ",STUDENT");
                 student.setUpdateTime(date);
                 sysUserFeignService.updateSysUser(student);
-
             }
         } else {
             student.setUpdateTime(date);
@@ -714,6 +715,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             sum.put("truantNum", 0);
         }
         sum.put("homeworkNum", studentManageDao.countHomeworkNum(courseScheduleId));
+        sum.put("homeworkStudentNum", studentCourseHomeworkDao.countHomeworkStudentNumWithCourse(courseScheduleId.longValue()));
         sum.put("repliedNum", studentManageDao.countRepliedNum(courseScheduleId));
         return sum;
     }

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

@@ -23,6 +23,7 @@ import javax.annotation.Resource;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.event.source.GroupEventSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.im.WebFeignService;
@@ -153,6 +154,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private StudentInstrumentService studentInstrumentService;
     @Autowired
+    private GroupEventSource groupEventSource;
+    @Autowired
     private WebFeignService webFeignService;
 
     @Override
@@ -166,14 +169,14 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
 
-        List<StudentApplyDetailDto> dataList = null;
+        List<StudentApplyDetailDto> dataList =  new ArrayList<>();
         int count = studentRegistrationDao.queryStudentDetailCount(params);
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
         }
-        if (count > 0) {
-            pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        if (queryInfo.getPage() <= pageInfo.getTotalPage()) {
             dataList = studentRegistrationDao.queryStudentDetailPage(params);
             Set<Integer> subjectIds = dataList.stream().map(e -> e.getActualSubjectId()).collect(Collectors.toSet());
             Map<Integer, String> subjectMap = MapUtil.convertIntegerMap(musicGroupSubjectPlanDao.findSubjectMap(subjectIds, queryInfo.getMusicGroupId()));
@@ -188,9 +191,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 }
             });
         }
-        if (count == 0) {
-            dataList = new ArrayList<>();
-        }
         pageInfo.setRows(dataList);
         return pageInfo;
     }
@@ -337,7 +337,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentRegistration.setUserId(sysUser.getId());
         studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
         if (hasReg != null) {
-            studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+            studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
             studentRegistration.setId(hasReg.getId());
             studentRegistrationDao.update(studentRegistration);
         } else {
@@ -1611,4 +1611,63 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         courseScheduleStudentPaymentService.updateCourseActualPrice(Arrays.asList(musicGroupId), null, GroupType.MUSIC);
         return this.findMusicGroupStudent(musicGroupId, null);
     }
+
+    @Override
+    public String checkRegOrPayStatus(String musicGroupId) {
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS) {
+            Date now = new Date();
+            MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroup.getId());
+            if (regCalender != null && regCalender.getDeadlinePaymentDate() != null) {
+                musicGroup.setPaymentExpireDate(regCalender.getDeadlinePaymentDate());
+            }
+
+            if (musicGroup.getPaymentExpireDate() != null && now.compareTo(DateUtil.getLastTimeWithDay(musicGroup.getPaymentExpireDate())) > 0) {
+                return "乐团缴费时间已截止";
+            }
+        }
+        //储备中、进行中,乐团没有报名缴费项、有多批次缴费项不能缴费、有已上的课程不能缴费
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
+                musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS) {
+            MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroup.getId());
+            if (regCalender == null) {
+                return "乐团没有报名缴费项";
+            }
+            List<MusicGroupPaymentCalender> musicGroupCalenderBatchNoTimes = musicGroupPaymentCalenderDao.getMusicGroupCalenderBatchNoTimes(musicGroup.getId());
+            if (musicGroupCalenderBatchNoTimes.size() > 1) {
+                return "乐团已进入续费阶段";
+            }
+
+//            Integer hasStartCourseNum = courseScheduleDao.getMusicGroupHasStartCourseNum(musicGroup.getId());
+//            if (hasStartCourseNum != null && hasStartCourseNum > 0) {
+//                return "乐团已开课";
+//            }
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, Boolean> checkMusicGroupsRegOrPayStatus(List<String> ids) {
+        Map<String, Boolean> viewMap = new HashMap<>();
+        List<MusicGroupPaymentCalender> regCalenders = musicGroupPaymentCalenderDao.getMusicGroupRegCalenderByIds(ids);
+        for (MusicGroupPaymentCalender regCalender : regCalenders) {
+            viewMap.put(regCalender.getMusicGroupId(), true);
+        }
+
+        Map<String, List<MusicGroupPaymentCalender>> musicGroupBatchNoTimes = musicGroupPaymentCalenderDao.getMusicGroupCalenderBatchNoByIds(ids).stream().collect(Collectors.groupingBy(MusicGroupPaymentCalender::getMusicGroupId));
+        musicGroupBatchNoTimes.forEach((musicGroupId, calenders) -> {
+            if (viewMap.containsKey(musicGroupId) && calenders.size() > 1) {
+                viewMap.remove(musicGroupId);
+            }
+        });
+//        List<CourseSchedule> musicGroupsHasStartCourseNums = courseScheduleDao.getMusicGroupsHasStartCourseNum(ids);
+//        for (CourseSchedule musicGroupsHasStartCourseNum : musicGroupsHasStartCourseNums) {
+//            if(viewMap.containsKey(musicGroupsHasStartCourseNum.getMusicGroupId())){
+//                viewMap.remove(musicGroupsHasStartCourseNum.getMusicGroupId());
+//            }
+//        }
+        return viewMap;
+    }
 }

+ 10 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -3196,15 +3196,20 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if (vipGroupList != null && vipGroupList.size() > 0) {
 			Date date = new Date();
 			for (VipGroup vipGroup : vipGroupList) {
+				if(Objects.nonNull(vipGroup.getCoursesExpireDate())&&(vipGroup.getCoursesExpireDate().compareTo(date)>0||DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), date))){
+					continue;
+				}
 				vipGroup.setStatus(VipGroupStatusEnum.FINISHED);
 				vipGroup.setUpdateTime(date);
 			}
 			vipGroupDao.batchUpdate(vipGroupList);
-			Set<Long> collect = vipGroupList.stream().map(e -> e.getId()).collect(Collectors.toSet());
-			Set<Integer> classGroupIds = classGroupDao.queryClassGroupIds(collect);
-			//解散群
-			for (Integer classGroupId : classGroupIds) {
-				imGroupService.cancel(classGroupId.longValue());
+			Set<Long> collect = vipGroupList.stream().filter(v->VipGroupStatusEnum.FINISHED.equals(v.getStatus())).map(e -> e.getId()).collect(Collectors.toSet());
+			if(!CollectionUtils.isEmpty(collect)){
+				Set<Integer> classGroupIds = classGroupDao.queryClassGroupIds(collect);
+				//解散群
+				for (Integer classGroupId : classGroupIds) {
+					imGroupService.cancel(classGroupId.longValue());
+				}
 			}
 		}
 		List<VipGroup> normalVipGroupList = vipGroupDao.queryNormalStatusList();

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

@@ -2954,10 +2954,38 @@
         FROM course_schedule cs
         WHERE cs.group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND cs.music_group_id_ = #{groupId}
+            AND cs.del_flag_ = 0
         ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_)
         LIMIT 1
     </select>
 
+    <select id="findLastCourseWithGroup" resultMap="CourseSchedule">
+        SELECT cs.id_,
+               cs.group_type_,
+               cs.music_group_id_,
+               cs.class_group_id_,
+               cs.status_,
+               cs.subsidy_,
+               cs.class_date_,
+               CONCAT(cs.class_date_, ' ', cs.start_class_time_) start_class_time_,
+               CONCAT(cs.class_date_, ' ', cs.end_class_time_)   end_class_time_,
+               cs.teacher_id_,
+               cs.actual_teacher_id_,
+               cs.create_time_,
+               cs.update_time_,
+               cs.teach_mode_,
+               cs.type_,
+               cs.name_,
+               cs.student_num_,
+               cs.leave_student_num_,
+               cs.schoole_id_
+        FROM course_schedule cs
+        WHERE cs.group_type_ = #{groupType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          AND cs.music_group_id_ = #{groupId}
+        ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) DESC
+        LIMIT 1
+    </select>
+
     <select id="findClassGroupLastTeacher" resultMap="CourseSchedule">
         SELECT *
         FROM course_schedule
@@ -3651,5 +3679,23 @@
         </foreach>
     </select>
 
+    <select id="getMusicGroupHasStartCourseNum" resultType="integer">
+        SELECT COUNT(*) FROM course_schedule
+        WHERE music_group_id_ = #{musicGroupId}
+        AND group_type_='MUSIC'
+        AND status_ IN ('UNDERWAY','OVER')
+    </select>
+
+    <select id="getMusicGroupsHasStartCourseNum" resultMap="CourseSchedule">
+        SELECT music_group_id_, COUNT(*) student_num_ FROM course_schedule
+        WHERE music_group_id_ IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND group_type_='MUSIC'
+        AND status_ IN ('UNDERWAY','OVER')
+        GROUP BY music_group_id_
+    </select>
+
 
 </mapper>

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

@@ -576,4 +576,30 @@
             #{calenderId}
         </foreach>
     </select>
+
+    <select id="getMusicGroupCalenderBatchNoTimes" resultMap="MusicGroupPaymentCalender">
+        SELECT batch_no_, COUNT(*) expect_num_ FROM music_group_payment_calender
+        WHERE music_group_id_ = #{musicGroupId}
+        AND status_ IN ('AUDITING','NO', 'OPEN', 'OVER', 'PAID')
+        GROUP BY batch_no_
+    </select>
+
+    <select id="getMusicGroupRegCalenderByIds" resultMap="MusicGroupPaymentCalender">
+        SELECT * FROM music_group_payment_calender WHERE music_group_id_ IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND payment_type_='MUSIC_APPLY' AND batch_no_ IS NOT NULL
+    </select>
+
+    <select id="getMusicGroupCalenderBatchNoByIds" resultMap="MusicGroupPaymentCalender">
+        SELECT music_group_id_,batch_no_, COUNT(*) expect_num_ FROM music_group_payment_calender
+        WHERE music_group_id_ IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        AND status_ IN ('AUDITING','NO', 'OPEN', 'OVER', 'PAID')
+        AND batch_no_ IS NOT NULL
+        GROUP BY music_group_id_,batch_no_
+    </select>
 </mapper>

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

@@ -15,6 +15,7 @@
         <result column="user_id_" property="userId"/>
         <result column="username_" property="username"/>
         <result column="avatar_" property="avatar"/>
+        <result column="teacher_avatar_" property="teacherAvatar"/>
         <result column="subject_name_" property="subjectName"/>
         <result column="phone_" property="phone"/>
         <result column="teacher_id_" property="teacherId"/>
@@ -494,7 +495,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_,
-        su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,tu.avatar_,
+        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_,
         CASE WHEN sa.visit_flag_ IS NULL THEN 0 ELSE sa.visit_flag_ END visitFlag

+ 7 - 6
mec-biz/src/main/resources/config/mybatis/StudentCourseHomeworkMapper.xml

@@ -289,7 +289,7 @@
     </select>
     <select id="countStudentCourseHomeworks" resultType="java.lang.Integer">
         SELECT COUNT(id_)
-        FROM course_schedule_student_payment
+        FROM student_course_homework
         WHERE course_schedule_id_ = #{search}
     </select>
     <resultMap id="StudentCourseHomeworkDtoMap" type="com.ym.mec.biz.dal.dto.StudentCourseHomeworkDto">
@@ -302,17 +302,18 @@
         <result column="is_replied_" property="isReplied"/>
         <result column="is_view_" property="isView"/>
         <result column="update_time_" property="createTime"/>
+        <result column="submit_time_" property="submitTime"/>
     </resultMap>
     <select id="findStudentCourseHomeworks" resultMap="StudentCourseHomeworkDtoMap">
         SELECT sch.id_ student_course_homework_id_,sch.attachments_,sch.is_replied_,sch.is_view_,
-        sch.update_time_,cssp.user_id_,su.username_,su.phone_,s.name_ subject_name_
-        FROM course_schedule_student_payment cssp
-        LEFT JOIN student_course_homework sch ON sch.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ =
-        sch.user_id_ AND sch.status_ = 1
+        sch.update_time_,cssp.user_id_,su.username_,su.phone_,sch.submit_time_,s.name_ subject_name_
+        FROM student_course_homework sch
+        LEFT JOIN course_schedule_student_payment cssp ON sch.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ =
+        sch.user_id_
         LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
         LEFT JOIN student_registration sr ON cssp.music_group_id_ = sr.music_group_id_ AND cssp.user_id_ = sr.user_id_
         LEFT JOIN `subject` s ON s.id_ = sr.actual_subject_id_
-        WHERE cssp.course_schedule_id_ = #{search}
+        WHERE sch.course_schedule_id_ = #{search}
         ORDER BY sch.id_ DESC
         <include refid="global.limit"/>
     </select>

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

@@ -217,6 +217,7 @@
         <result column="start_class_time_" property="startClassTime"/>
         <result column="class_date_" property="classDate"/>
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="course_status_" property="courseStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="name_" property="name"/>
         <result column="sign_in_status_" property="signInStatus"/>
         <result column="sign_out_status_" property="signOutStatus"/>
@@ -322,7 +323,7 @@
 
     <select id="getTeacherPersonalAttendances" parameterType="map" resultMap="teacherPersonalAttendance">
         SELECT
-            cs.class_date_,cs.start_class_time_,cs.name_,cs.type_,
+            cs.class_date_,cs.start_class_time_,cs.name_,cs.type_,cs.status_ course_status_,
             IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
             IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
             ta.remark_,cs.id_,cs.end_class_time_

+ 4 - 1
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -52,6 +52,7 @@ public class RoomController{
 
     @RequestMapping(value = "/sendImPlayMidiMessage", method = RequestMethod.POST)
     public Object sendImPlayMidiMessage(@RequestBody PlayMidiMessageData playMidiMessageData) throws Exception {
+        log.info("sendImPlayMidiMessage: {}",JSONObject.toJSON(playMidiMessageData));
         roomService.sendImPlayMidiMessage(playMidiMessageData);
         return new BaseResponse<>();
     }
@@ -176,13 +177,14 @@ public class RoomController{
 
     @RequestMapping(value = "adjustExamSong", method = RequestMethod.POST)
     public Object adjustExamSong(@RequestBody ExamSongData examSongData) throws Exception {
+        log.info("adjustExamSong: {}",JSONObject.toJSON(examSongData));
         roomService.adjustExamSong(examSongData.getRoomId(),examSongData.getStatus(),examSongData.getExamSongId());
         return new BaseResponse<>();
     }
 
     @RequestMapping(value = "/device/batchControl", method = RequestMethod.POST)
     public Object batchControlDevice(@RequestBody ReqDeviceControlData data)throws Exception {
-        log.info("batchControl: {}",JSONObject.toJSON(data));
+        log.info("batchControlDevice: {}",JSONObject.toJSON(data));
         boolean result = roomService.batchControlDevice(data);
         return new BaseResponse<>(result);
     }
@@ -190,6 +192,7 @@ public class RoomController{
     @RequestMapping(value = "/device/sync", method = RequestMethod.POST)
     public Object syncDeviceState(@RequestBody ReqDeviceControlData data)
             throws Exception {
+        log.info("syncDeviceState: {}",JSONObject.toJSON(data));
         boolean result;
         if (data.getCameraOn() != null) {
             result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.Camera, data.getCameraOn());

+ 43 - 35
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.student.controller;
 
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -69,26 +70,28 @@ public class MusicGroupController extends BaseController {
     private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
     @Autowired
     private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-    
+
     @Autowired
     private StudentPreRegistrationDao studentPreRegistrationDao;
-    
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
     @ApiOperation("预报名")
     @PostMapping(value = "/preRegister")
-	public Object preRegister(@RequestBody StudentPreRegistration studentPreRegistration) {
-		return musicGroupService.preRegister(studentPreRegistration) ? succeed() : failed();
-	}
-    
+    public Object preRegister(@RequestBody StudentPreRegistration studentPreRegistration) {
+        return musicGroupService.preRegister(studentPreRegistration) ? succeed() : failed();
+    }
+
     @ApiOperation("预报名信息查询")
     @GetMapping(value = "/queryPreRegister")
-	public Object queryPreRegister(String musicGroupId) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
+    public Object queryPreRegister(String musicGroupId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
 
-		return succeed(studentPreRegistrationDao.queryByMusicGroupIdAndUserId(sysUser.getId(), musicGroupId));
-	}
+        return succeed(studentPreRegistrationDao.queryByMusicGroupIdAndUserId(sysUser.getId(), musicGroupId));
+    }
 
     @ApiOperation("获取学生所在乐团列表")
     @GetMapping(value = "/queryUserMusicGroups")
@@ -99,7 +102,7 @@ public class MusicGroupController extends BaseController {
         }
         return succeed(musicGroupService.queryUserMusicGroups(sysUser.getId()));
     }
-    
+
     @ApiOperation("获取学生所在乐团列表")
     @GetMapping(value = "/queryStudentMusicGroupInfo")
     public Object queryStudentMusicGroupInfo() {
@@ -168,31 +171,26 @@ public class MusicGroupController extends BaseController {
             return failed(HttpStatus.CONTINUE, "乐团报名信息不存在");
         }
         if (studentRegistration.getPaymentStatus() != null && studentRegistration.getPaymentStatus() == PaymentStatusEnum.YES) {
-            return failed(HttpStatus.PROCESSING,"您已缴费,请等待乐团开启");
+            return failed(HttpStatus.PROCESSING, "您已缴费,请等待乐团开启");
         }
 
         if (studentRegistration.getPaymentStatus() != PaymentStatusEnum.OPEN) {
             return failed("乐团还未开启缴费,请等待通知");
         }
-        if (studentRegistration.getTemporaryCourseFee() == null) {
-            if (musicGroup.getStatus() != MusicGroupStatusEnum.APPLY && musicGroup.getStatus() != MusicGroupStatusEnum.PAY) {
-                return failed("乐团在" + musicGroup.getStatus().getMsg() + ",不能缴费");
-            }
-
-            if (musicGroup.getStatus() == MusicGroupStatusEnum.PAY) {
-                Date now = new Date();
-                MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
-                if (regCalender != null && regCalender.getDeadlinePaymentDate() != null) {
-                    musicGroup.setPaymentExpireDate(regCalender.getDeadlinePaymentDate());
-                }
-                if (musicGroup.getPaymentExpireDate() != null && DateUtil.daysBetween(musicGroup.getPaymentExpireDate(), now) > 1) {
-                    return failed("乐团缴费时间已截止");
-                }
-            }
+        if (musicGroup.getStatus() != MusicGroupStatusEnum.APPLY &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PAY &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PREPARE &&
+                musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS
+        ) {
+            return failed("乐团在" + musicGroup.getStatus().getMsg() + ",不能缴费");
+        }
+        String err = studentRegistrationService.checkRegOrPayStatus(musicGroupId);
+        if(err != null){
+            return failed(err+"不能缴费");
         }
         studentRegistration.setOwnershipType(musicGroup.getOwnershipType());
         studentRegistration.setChargeTypeId(musicGroup.getChargeTypeId());
-        if(sysUser != null){
+        if (sysUser != null) {
             studentRegistration.setGender(sysUser.getGender());
         }
 
@@ -246,7 +244,7 @@ public class MusicGroupController extends BaseController {
     @ApiOperation(value = "申请退团")
     @PostMapping("/quitMusicGroup")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
-    	@ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String")})
+            @ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String")})
     public HttpResponseResult quitMusicGroup(String musicGroupId, String reason) throws Exception {
         return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId, reason));
     }
@@ -254,11 +252,11 @@ public class MusicGroupController extends BaseController {
     @ApiOperation(value = "取消退团申请")
     @PostMapping("/cancelQuitMusicGroup")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
-    	@ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String")})
+            @ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String")})
     public HttpResponseResult cancelQuitMusicGroup(String musicGroupId, String reason) throws Exception {
-    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
         Integer userId = sysUser.getId();
-        
+
         return succeed(musicGroupService.cancelQuitMusicGroup(userId, musicGroupId, reason));
     }
 
@@ -288,6 +286,11 @@ public class MusicGroupController extends BaseController {
             return failed("报名信息有误,请核查");
         }
 
+        String err = studentRegistrationService.checkRegOrPayStatus(studentRegistration.getMusicGroupId());
+        if(err !=null){
+            return failed(err+"不可缴费,请联系教务老师");
+        }
+
         Integer userId = studentRegistration.getUserId();
 
         StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
@@ -315,6 +318,11 @@ public class MusicGroupController extends BaseController {
         if (studentRegistration == null) {
             return failed("报名信息有误,请核查");
         }
+
+        String err = studentRegistrationService.checkRegOrPayStatus(studentRegistration.getMusicGroupId());
+        if(err !=null){
+            return failed(err+"不可缴费,请联系教务老师");
+        }
         Integer userId = studentRegistration.getUserId();
         StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
         StudentPaymentOrder waitPay = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.WAIT_PAY);

+ 20 - 2
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java

@@ -2,7 +2,10 @@ package com.ym.mec.student.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
@@ -26,6 +29,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.util.Date;
+import java.util.List;
 
 @RequestMapping("register")
 @Api(tags = "乐团注册")
@@ -40,6 +44,10 @@ public class MusicGroupRegisterController extends BaseController {
     private MusicGroupService musicGroupService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
 
 
     @ApiOperation(value = "新增学生报名信息")
@@ -57,7 +65,7 @@ public class MusicGroupRegisterController extends BaseController {
             return failed("乐团信息不存在");
         }
 
-        if (DateUtil.daysBetween(musicGroup.getApplyExpireDate(), date) > 1 && studentRegistration.getId() == null) {
+        if (date.compareTo(DateUtil.getLastTimeWithDay(musicGroup.getApplyExpireDate())) > 0 && studentRegistration.getId() == null) {
             return failed("乐团已截止报名");
         }
 
@@ -69,8 +77,18 @@ public class MusicGroupRegisterController extends BaseController {
         if (hasReg != null && hasReg.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT) {
             return succeed(hasReg);
         }
+        if (hasReg != null && hasReg.getMusicGroupStatus() == StudentMusicGroupStatusEnum.QUIT) {
+            return failed( "无法重复报名,请联系教务老师");
+        }
+        String err = studentRegistrationService.checkRegOrPayStatus(musicGroup.getId());
+        if (err != null) {
+            return failed(err + "不可报名,请联系教务老师");
+        }
 
-        if (musicGroup.getStatus().equals(MusicGroupStatusEnum.PAY)) {
+        if (musicGroup.getStatus().equals(MusicGroupStatusEnum.PAY) ||
+                musicGroup.getStatus().equals(MusicGroupStatusEnum.PREPARE) ||
+                musicGroup.getStatus().equals(MusicGroupStatusEnum.PROGRESS)
+        ) {
             studentRegistration.setPaymentStatus(PaymentStatusEnum.OPEN);
         } else {
             studentRegistration.setPaymentStatus(PaymentStatusEnum.NO);

+ 49 - 12
mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

@@ -2,17 +2,13 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
 import com.ym.mec.biz.dal.dto.VipGroupApplyBaseInfoDto;
 import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
-import com.ym.mec.biz.dal.enums.AuditStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
@@ -21,6 +17,7 @@ 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.date.DateUtil;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -56,6 +53,12 @@ public class VipGroupManageController extends BaseController {
     private EmployeeDao employeeDao;
     @Autowired
     private ClassGroupDao classGroupDao;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
+    private ImGroupService imGroupService;
 
     @Autowired
     private StudentApplyRefundsService studentApplyRefundsService;
@@ -64,6 +67,12 @@ public class VipGroupManageController extends BaseController {
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
 
     @GetMapping("/teacherSalarySettlement")
     public Object teacherSalarySettlement(){
@@ -80,22 +89,50 @@ public class VipGroupManageController extends BaseController {
             if(Objects.isNull(oldVipGroup)){
                 throw new BizException("此课程组不存在");
             }
-            if(!VipGroupStatusEnum.PROGRESS.equals(oldVipGroup.getStatus())&&!VipGroupStatusEnum.PAUSE.equals(oldVipGroup.getStatus())){
+            if(!VipGroupStatusEnum.PROGRESS.equals(oldVipGroup.getStatus())&&!VipGroupStatusEnum.FINISHED.equals(oldVipGroup.getStatus())&&!VipGroupStatusEnum.PAUSE.equals(oldVipGroup.getStatus())){
                 throw new BizException("此课程组状态暂不支持修改");
             }
         }
+        ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(oldVipGroup.getId().toString(), ClassGroupTypeEnum.VIP.getCode());
+        if(Objects.isNull(classGroup)){
+            throw new BizException("课程信息错误");
+        }
         if(Objects.isNull(oldVipGroup.getVipGroupActivityId())){
-            if(VipGroupStatusEnum.PROGRESS.equals(vipGroup.getStatus())&&oldVipGroup.getStatus().getCode()>VipGroupStatusEnum.PROGRESS.getCode()){
+            if(VipGroupStatusEnum.PROGRESS.equals(vipGroup.getStatus())&&!VipGroupStatusEnum.FINISHED.equals(oldVipGroup.getStatus())&&oldVipGroup.getStatus().getCode()>VipGroupStatusEnum.PROGRESS.getCode()){
                 throw new BizException("此课程组状态暂不支持修改");
             }
-            ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(oldVipGroup.getId().toString(), ClassGroupTypeEnum.VIP.getCode());
-            if(Objects.isNull(classGroup)){
-                throw new BizException("课程信息错误");
-            }
             if(classGroup.getStudentNum()<3){
                 throw new BizException("班级人数未达到3人");
             }
         }
+        Date now = new Date();
+        if(VipGroupStatusEnum.FINISHED.equals(oldVipGroup.getStatus())&&(vipGroup.getCoursesExpireDate().compareTo(now)>=0|| DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), now))){
+            vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
+
+            Map<Integer,String> userRoleMap = new HashMap<>();
+            if(Objects.nonNull(vipGroup.getEducationalTeacherId())){
+                userRoleMap.put(vipGroup.getEducationalTeacherId(),"乐团主管");
+            }
+
+            CourseSchedule lastCourse = courseScheduleDao.findLastCourseWithGroup(vipGroup.getId().toString(), GroupType.VIP);
+            if(Objects.isNull(lastCourse)){
+                userRoleMap.put(vipGroup.getUserId(),"指导老师");
+            }else{
+                userRoleMap.put(lastCourse.getActualTeacherId(),"指导老师");
+            }
+
+            List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
+            if(!CollectionUtils.isEmpty(classGroupStudents)){
+                //生成学生单课缴费信息
+                for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
+                    userRoleMap.put(classGroupStudent.getUserId(),null);
+                }
+            }
+
+            imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), vipGroup.getName(), null, null, GroupType.VIP.getCode());
+            imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+            imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(),classGroup.getGroupType());
+        }
         vipGroupService.update(vipGroup);
         return succeed();
     }