瀏覽代碼

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

yonge 4 年之前
父節點
當前提交
783a1de23b
共有 23 個文件被更改,包括 381 次插入167 次删除
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  2. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentClassAdjustDao.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ClassGroup4MixDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroup.java
  6. 0 13
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentClassAdjust.java
  7. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  8. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  10. 82 25
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  11. 67 54
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  12. 58 29
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  13. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  14. 44 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  15. 8 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  16. 9 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  17. 1 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  18. 7 9
      mec-biz/src/main/resources/config/mybatis/MusicGroupStudentClassAdjustMapper.xml
  19. 11 4
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  20. 36 5
      mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java
  21. 6 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  22. 2 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  23. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

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

@@ -741,4 +741,13 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @return
      */
     List<ClassGroup> queryClassGroups(@Param("practiceGroupId") String practiceGroupId, @Param("groupType") String groupType);
+
+    /**
+     * 根据班级编号冻结所选班级
+     * @author zouxuan
+     * @param classGroupIds
+     * @param lockFlag
+     * @return
+     */
+    int batchUpdateLockByClassGroupIds(@Param("classGroupIds") List<Integer> classGroupIds, @Param("lockFlag") int lockFlag);
 }

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

@@ -61,6 +61,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      */
     int batchDeleteCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
+    int batchDeleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
     int batchDeleteCourseSchedulesWithoutCheck(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
     int batchDeleteCourseSchedulesWithLogic(@Param("courseScheduleIds") List<Long> courseScheduleIds);
@@ -1408,7 +1410,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @describe 通过班级编号更改课程的冻结状态
      * @author zouxuan
      */
-    int batchUpdateLockByClassGroupIds(@Param("courseId") List<Long> courseId,
+    int batchUpdateLockByCourseIds(@Param("courseId") List<Long> courseId,
                               @Param("isLock") Integer isLock);
 
 

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

@@ -6,5 +6,6 @@ import com.ym.mec.common.dal.BaseDAO;
 
 public interface MusicGroupStudentClassAdjustDao extends BaseDAO<Integer, MusicGroupStudentClassAdjust> {
 
-	
+
+    MusicGroupStudentClassAdjust findByBatchNo(String batchNo);
 }

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

@@ -54,6 +54,17 @@ public class ClassGroup4MixDto {
     @ApiModelProperty(value = "声部id", required = true)
     private Integer subjectId;
 
+    @ApiModelProperty(value = "班级剩余时长,用于自动排课", required = true)
+    private String classCourseMinute;
+
+    public String getClassCourseMinute() {
+        return classCourseMinute;
+    }
+
+    public void setClassCourseMinute(String classCourseMinute) {
+        this.classCourseMinute = classCourseMinute;
+    }
+
     public String getMusicGroupId() {
         return musicGroupId;
     }

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

@@ -77,6 +77,9 @@ public class ClassGroup {
 	@ApiModelProperty(value = "是否删除,1是 0否", required = false)
 	private Integer delFlag = 0;
 
+	@ApiModelProperty(value = "是否冻结,1是 0否", required = false)
+	private Integer lockFlag = 0;
+
 	@ApiModelProperty(value = "总统课次",required = false)
 	private Integer totalClassTimes = 0;
 
@@ -141,6 +144,14 @@ public class ClassGroup {
 		this.delFlag = delFlag;
 	}
 
+	public Integer getLockFlag() {
+		return lockFlag;
+	}
+
+	public void setLockFlag(Integer lockFlag) {
+		this.lockFlag = lockFlag;
+	}
+
 	public void setId(Integer id) {
 		this.id = id;
 	}

+ 0 - 13
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentClassAdjust.java

@@ -1,9 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
-import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
 import io.swagger.annotations.ApiModelProperty;
 import java.util.Date;
-import java.util.List;
 
 /**
  * 乐团学员班级调整表
@@ -39,9 +37,6 @@ public class MusicGroupStudentClassAdjust {
 	@ApiModelProperty(value = "是否排课", required = false)
 	private boolean courseFlag;
 
-	@ApiModelProperty(value = "缴费项目审核状态", required = false)
-	private MusicGroupPaymentCalender.PaymentCalenderStatusEnum calenderStatus;
-
 	private Integer operatorId;
 
 	private Date createTime;
@@ -128,14 +123,6 @@ public class MusicGroupStudentClassAdjust {
 		this.newClassGroupJson = newClassGroupJson;
 	}
 
-	public MusicGroupPaymentCalender.PaymentCalenderStatusEnum getCalenderStatus() {
-		return calenderStatus;
-	}
-
-	public void setCalenderStatus(MusicGroupPaymentCalender.PaymentCalenderStatusEnum calenderStatus) {
-		this.calenderStatus = calenderStatus;
-	}
-
 	public Integer getOperatorId() {
 		return operatorId;
 	}

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

@@ -15,6 +15,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Map;
 
@@ -480,7 +481,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param mergeClassSplitClassAffirmDto
      * @return
      */
-    void mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);
+    void mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException;
 
     /**
      * 进行中乐团-修改-班级详情-学员班级调整-合并结果确认-获取新班级的可排课时长

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

@@ -118,6 +118,13 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	void auditPass(String batchNo,String auditMemo);
 
 	/**
+	 * 审核通过后自动排课
+	 * @author zouxuan
+	 * @param batchNo
+	 */
+	public void autoClassGroupAdjust(String batchNo);
+
+	/**
 	 * @describe 审核拒绝
 	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
 	 * @author zouxuan

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

@@ -254,7 +254,7 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @param subjectId
      * @return
      */
-    List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId);
+    List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer subjectId);
 
     /**
      * 获取乐团下所有学员身上的声部列表

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

@@ -6,6 +6,7 @@ import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
 import static com.ym.mec.biz.dal.enums.GroupType.PRACTICE;
 import static com.ym.mec.biz.dal.enums.GroupType.VIP;
 
+import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.Instant;
@@ -31,11 +32,13 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.service.IdGeneratorService;
+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.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
@@ -1659,7 +1662,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ClassGroup classGroupAdjust(List<ClassGroup4MixDto> classGroup4MixDtos) {
+    public ClassGroup classGroupAdjust(List<ClassGroup4MixDto> classGroup4MixDtos){
         Date date = new Date();
         String musicGroupId = classGroup4MixDtos.get(0).getMusicGroupId();
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -1669,6 +1672,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (classGroup4MixDtos.get(0).getCourseTimes().compareTo(0) <= 0) {
             throw new BizException("排课次数必须大于0");
         }
+        List<ClassGroup4MixDto> classGroup4MixDtosBackup = new ArrayList<>();
+        if(StringUtils.isNotEmpty(classGroup4MixDtos.get(0).getClassCourseMinute())){
+            try {
+                BeanUtils.copyProperties(classGroup4MixDtosBackup, classGroup4MixDtos);
+            } catch (Exception e) {
+                throw new BizException("拷贝课程信息异常");
+            }
+        }
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         Integer schoolId = musicGroup.getSchoolId();
 
@@ -1778,26 +1789,34 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<CourseSchedule> courseScheduleList = new ArrayList<>();
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-
+        String classCourseMinute = null;
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            List<CourseSchedule> courseSchedules = new ArrayList<>();
             if(classGroup4MixDto.getCourseTimeDtoList() == null || classGroup4MixDto.getCourseTimeDtoList().size() == 0){
                 break;
             }
             //5、插入班级排课信息
             LocalDateTime now = LocalDate.parse(classGroup4MixDto.getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
-
-            if(!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())){
-                throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+            //是否是合班后的自动排课
+            classCourseMinute = classGroup4MixDto.getClassCourseMinute();
+            if(StringUtils.isNotEmpty(classCourseMinute)){
+                Map<String, Integer> classCourseMinuteMap = JSON.parseObject(classCourseMinute, Map.class);
+                classGroup4MixDto.setCourseTimes(classCourseMinuteMap.get(classGroup4MixDto.getCourseType().getCode()));
+            }else {
+                if(!courseTypeMinutesMap.containsKey(classGroup4MixDto.getCourseType().getCode())){
+                    throw new BizException("{}课程类型暂无剩余课程时长", classGroup4MixDto.getCourseType().getMsg());
+                }
+                Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
+                long courseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getStartClassTime() + ":00", formatter),
+                        LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getEndClassTime() + ":00", formatter))
+                        .toMinutes();
+                classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
+
+                if(classGroup4MixDto.getCourseTimes()<=0){
+                    throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
+                }
             }
-            Integer totalMinutes = courseTypeMinutesMap.get(classGroup4MixDto.getCourseType().getCode());
-            long courseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getStartClassTime() + ":00", formatter),
-                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + classGroup4MixDto.getCourseTimeDtoList().get(0).getEndClassTime() + ":00", formatter))
-                    .toMinutes();
-            classGroup4MixDto.setCourseTimes(totalMinutes/(int)courseDuration);
 
-            if(classGroup4MixDto.getCourseTimes()<=0){
-                throw new BizException("{}课程类型剩余课程时长不足", classGroup4MixDto.getCourseType().getMsg());
-            }
 
             int times = 0;
 
@@ -1856,8 +1875,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     }
                     courseSchedule.setTeacherId(teacherId);
                     courseSchedule.setActualTeacherId(teacherId);
-                    courseScheduleDao.insert(courseSchedule);
+//                    courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
+                    courseSchedules.add(courseSchedule);
 
                     times++;
 
@@ -1960,9 +1980,26 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 }
                 now = now.plusDays(1);
             }
+            //自动排课,校验冲突
+            if(courseSchedules.size() > 0 && StringUtils.isNotEmpty(classCourseMinute)){
+                try {
+                    courseScheduleService.checkNewCourseSchedules(courseSchedules, false);
+                }catch (BizException e){
+                    e.printStackTrace();
+                }finally {
+                    //如果出现冲突
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    //排课开始时间加一周
+                    ClassGroup4MixDto group4MixDto = classGroup4MixDtosBackup.get(0);
+                    Date stringToDate = DateUtil.stringToDate(group4MixDto.getStartDate(), DateUtil.ISO_EXPANDED_DATE_FORMAT);
+                    group4MixDto.setStartDate(DateUtil.format(DateUtil.addDays(stringToDate, 7),DateUtil.ISO_EXPANDED_DATE_FORMAT));
+//                    再次尝试排课
+                    classGroupAdjust(classGroup4MixDtosBackup);
+                }
+            }
         }
 
-        if(courseScheduleList.size() > 0){
+        if(courseScheduleList.size() > 0 && StringUtils.isEmpty(classCourseMinute)){
             //检测新排课冲突
             courseScheduleService.checkNewCourseSchedules(courseScheduleList, false);
         }
@@ -3282,7 +3319,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
     @Override
     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
-    public void mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+    public void mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException {
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         if(classGroupIds == null || classGroupIds.size() == 0){
             throw new BizException("参数校验失败");
@@ -3333,35 +3370,55 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 musicGroupPaymentCalenderService.create(calenderDto);
             }
         }
-        //冻结所选班级的课程
-        List<Long> allLockCourseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds,null);
-        courseScheduleDao.batchUpdateLockByClassGroupIds(allLockCourseIds,1);
 
         //记录申请信息
         MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = new MusicGroupStudentClassAdjust();
         musicGroupStudentClassAdjust.setBatchNo(batchNo);
         musicGroupStudentClassAdjust.setBatchNo(batchNo);
-        musicGroupStudentClassAdjust.setCalenderStatus(status);
         musicGroupStudentClassAdjust.setCourseFlag(false);
         musicGroupStudentClassAdjust.setMusicGroupId(musicGroup.getId());
         musicGroupStudentClassAdjust.setOperatorId(sysUser.getId());
         musicGroupStudentClassAdjust.setNewClassGroupJson(JSON.toJSONString(classGroup4MixDtos));
         musicGroupStudentClassAdjust.setClassGroupIds(JSON.toJSONString(classGroupIds));
         musicGroupStudentClassAdjust.setStudentIds(JSON.toJSONString(studentIds));
+        //获取需要冻结的课程
+        List<Long> allLockCourseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds,null);
         musicGroupStudentClassAdjust.setAllLockCourseIds(JSON.toJSONString(allLockCourseIds));
+        //获取需要删除的课程
         List<Long> courseIds = courseScheduleDao.queryStudentNotStartByClassIdsAndStudentIds(classGroupIds,studentIds);
         musicGroupStudentClassAdjust.setSubLockCourseIds(JSON.toJSONString(courseIds));
         //计算新增班级的可排课时长,总课次*默认时长  (用学员剩余的课程时长加上购买的时长,可能导致同一班级学员时长不一致)
         musicGroupStudentClassAdjust.setClassCourseMinute(JSON.toJSONString(findClassCourseMinuteMap(classGroupIds)));
-        musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
 
-        //如果缴费项目不需要审核,那么生成班级以及课表
-        if(status != null && status != AUDITING){
-//            classGroupService.classGroupAdjust(classGroup4MixDtos);
-        }
+
         //如果需要审核,校验参数配置
         checkMergeClassSplitClassAffirmParam(classGroup4MixDtos);
+        //如果缴费项目不需要审核,那么生成班级以及课表
+        if(status == null || status != AUDITING){
+            ClassGroup4MixDto classGroup4MixDto = classGroup4MixDtos.get(0);
+            classGroup4MixDto.setClassCourseMinute(musicGroupStudentClassAdjust.getClassCourseMinute());
+            List<CourseTimeDto> courseTimeDtoList = classGroup4MixDto.getCourseTimeDtoList();
+            List<CourseTimeDto> courseTimeDtoListBackup = new ArrayList<>();
+            BeanUtils.copyProperties(courseTimeDtoListBackup, courseTimeDtoList);
+            //每种课程类型单独排课
+            for (CourseTimeDto courseTimeDto : courseTimeDtoListBackup) {
+                List<CourseTimeDto> courseTimeDtos = new ArrayList<>();
+                courseTimeDtos.add(courseTimeDto);
+                classGroup4MixDto.setCourseTimeDtoList(courseTimeDtos);
+                classGroupService.classGroupAdjust(classGroup4MixDtos);
+            }
+            musicGroupStudentClassAdjust.setCourseFlag(true);
+            //排课完成后删除所选课程
+            courseScheduleDao.batchDeleteByCourseSchedules(courseIds);
+        }else {
+            //冻结班级
+            classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,1);
+            //冻结所选班级的课程
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds,1);
+        }
+        musicGroupStudentClassAdjustDao.insert(musicGroupStudentClassAdjust);
     }
+    //审核通过后排课,删除指定课程,并解冻当前班级课程
 
     private void checkMergeClassSplitClassAffirmParam(List<ClassGroup4MixDto> classGroup4MixDtos){
         if (classGroup4MixDtos.get(0).getCourseTimes().compareTo(0) <= 0) {

+ 67 - 54
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -71,63 +71,70 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         DegreeRegistration degree = degreeRegistrationDao.getWithUserIdAndActivityTag(degreeRegistration.getUserId(), ACTIVITY_TAG);
 
         Date nowDate = new Date();
-        //获取收费项价格
-        SporadicChargeInfo chargeInfo = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
-        if (chargeInfo == null || chargeInfo.getDelFlag().equals(1) || chargeInfo.getOpenFlag().equals(1)) {
-            throw new BizException("你选的考试级别不存在");
-        }
-
-        if (!chargeInfo.getTitle().equals("一级") && !chargeInfo.getTitle().equals("二级") && StringUtils.equals("免考", degreeRegistration.getTheoryLevel())
-                && StringUtils.isBlank(degreeRegistration.getTheoryCert())) {
-            throw new BizException("报考级别为“" + chargeInfo.getTitle() + "”且乐理级别是“免考”时,必须上传证书");
-        }
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
 
-        degreeRegistration.setActivityTag(ACTIVITY_TAG);
-        degreeRegistration.setLevel(chargeInfo.getTitle());
-        degreeRegistration.setOrderNo(orderNo);
-        BigDecimal theoryMoney = BigDecimal.ZERO;
-        switch (degreeRegistration.getTheoryLevel()) {
-            case "一级":
-                theoryMoney = new BigDecimal(200);
-                break;
-            case "二级":
-                theoryMoney = new BigDecimal(240);
-                break;
-            case "三级":
-                theoryMoney = new BigDecimal(280);
-                break;
-            case "四级":
-                theoryMoney = new BigDecimal(320);
-                break;
-            case "免考":
-                break;
-            default:
-                throw new BizException("您选择的乐理级别不存在,请核对");
-        }
-        degreeRegistration.setTheoryMoney(theoryMoney);
-        if (degree == null) {
-            degreeRegistration.setMoney(chargeInfo.getAmount());
-            degreeRegistration.setStatus(1);
-            degreeRegistration.setCreateTime(nowDate);
-            degreeRegistration.setUpdateTime(nowDate);
-            degreeRegistrationDao.insert(degreeRegistration);
-        } else if (degree.getStatus().equals(2)) {
-            //throw new BizException("您本次已报名,请勿重复报名");
-        } else {
-            degreeRegistration.setId(degree.getId());
-            degreeRegistration.setStatus(1);
-            degreeRegistration.setCreateTime(nowDate);
-            degreeRegistration.setUpdateTime(nowDate);
-            degreeRegistrationDao.update(degreeRegistration);
+        //获取收费项价格
+        SporadicChargeInfo chargeInfo = null;
+        if(Objects.nonNull(degreeRegistration.getSporadicId())&&Objects.nonNull(degreeRegistration.getTheoryLevel())){
+            chargeInfo = sporadicChargeInfoDao.get(degreeRegistration.getSporadicId());
+            if (chargeInfo == null || chargeInfo.getDelFlag().equals(1) || chargeInfo.getOpenFlag().equals(1)) {
+                throw new BizException("你选的考试级别不存在");
+            }
+
+            if (!chargeInfo.getTitle().equals("一级") && !chargeInfo.getTitle().equals("二级") && StringUtils.equals("免考", degreeRegistration.getTheoryLevel())
+                    && StringUtils.isBlank(degreeRegistration.getTheoryCert())) {
+                throw new BizException("报考级别为“" + chargeInfo.getTitle() + "”且乐理级别是“免考”时,必须上传证书");
+            }
+
+            degreeRegistration.setActivityTag(ACTIVITY_TAG);
+            degreeRegistration.setLevel(chargeInfo.getTitle());
+            degreeRegistration.setOrderNo(orderNo);
+            BigDecimal theoryMoney = BigDecimal.ZERO;
+            switch (degreeRegistration.getTheoryLevel()) {
+                case "一级":
+                    theoryMoney = new BigDecimal(200);
+                    break;
+                case "二级":
+                    theoryMoney = new BigDecimal(240);
+                    break;
+                case "三级":
+                    theoryMoney = new BigDecimal(280);
+                    break;
+                case "四级":
+                    theoryMoney = new BigDecimal(320);
+                    break;
+                case "免考":
+                    break;
+                default:
+                    throw new BizException("您选择的乐理级别不存在,请核对");
+            }
+            degreeRegistration.setTheoryMoney(theoryMoney);
+            if (degree == null) {
+                degreeRegistration.setMoney(chargeInfo.getAmount());
+                degreeRegistration.setStatus(1);
+                degreeRegistration.setCreateTime(nowDate);
+                degreeRegistration.setUpdateTime(nowDate);
+                degreeRegistrationDao.insert(degreeRegistration);
+            } else if (degree.getStatus().equals(2)) {
+                //throw new BizException("您本次已报名,请勿重复报名");
+            } else {
+                degreeRegistration.setId(degree.getId());
+                degreeRegistration.setStatus(1);
+                degreeRegistration.setCreateTime(nowDate);
+                degreeRegistration.setUpdateTime(nowDate);
+                degreeRegistrationDao.update(degreeRegistration);
+            }
+        }else{
+            degreeRegistration.setMoney(BigDecimal.ZERO);
+            degreeRegistration.setTheoryMoney(BigDecimal.ZERO);
         }
 
         BigDecimal additionCoursePrice = new BigDecimal("0");
         Map<CourseSchedule.CourseScheduleType, Integer> typeCourseTime = new HashMap<>();
         if(Objects.nonNull(degreeRegistration.getAdditionCourseInfo())){
             Map<CourseSchedule.CourseScheduleType, Integer> additionCourseInfo = degreeRegistration.getAdditionCourseInfo();
-            PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(degreeRegistration.getId());
+            PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(degreeRegistration.getOrganId());
             if(Objects.isNull(practiceGroupSellPrice)){
                 throw new BizException("该分部暂未参与此活动");
             }
@@ -174,7 +181,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         }
 
         BigDecimal amount = degreeRegistration.getMoney();
-        amount = amount.add(theoryMoney);
+        amount = amount.add(degreeRegistration.getTheoryMoney());
         amount = amount.add(additionCoursePrice);
 
         OrderTypeEnum type = OrderTypeEnum.DEGREE_REGISTRATION;
@@ -192,8 +199,8 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
         studentPaymentOrder.setMusicGroupId(degreeRegistration.getSporadicId().toString());
         studentPaymentOrder.setOrganId(degreeRegistration.getOrganId());
         studentPaymentOrder.setRoutingOrganId(degreeRegistration.getOrganId());
-        if (theoryMoney.compareTo(BigDecimal.ZERO) > 0) {
-            studentPaymentOrder.setMemo("乐理" + degreeRegistration.getTheoryLevel() + ",费用:" + theoryMoney);
+        if (degreeRegistration.getTheoryMoney().compareTo(BigDecimal.ZERO) > 0) {
+            studentPaymentOrder.setMemo("乐理" + degreeRegistration.getTheoryLevel() + ",费用:" + degreeRegistration.getTheoryMoney());
         }
         studentPaymentOrderService.insert(studentPaymentOrder);
         studentPaymentOrder.setVersion(0);
@@ -208,7 +215,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             return notifyMap;
         }
 
-        if(BigDecimal.ZERO.compareTo(additionCoursePrice)>0){
+        if(BigDecimal.ZERO.compareTo(additionCoursePrice)<0){
             StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
             studentPaymentOrderDetail.setType(OrderDetailTypeEnum.DEGREE_REGISTRATION);
             studentPaymentOrderDetail.setGoodsIdList(JSON.toJSONString(typeCourseTime));
@@ -229,8 +236,8 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
                 orderNo,
                 baseApiUrl + "/api-student/studentOrder/notify",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
-                chargeInfo.getDetail(),
-                chargeInfo.getDetail(),
+                Objects.nonNull(chargeInfo)?chargeInfo.getDetail():"考级报名活动",
+                Objects.nonNull(chargeInfo)?chargeInfo.getDetail():"考级报名活动",
                 degreeRegistration.getOrganId(),
                 receiver
         );
@@ -246,6 +253,12 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
     @Override
     public Boolean updateStatus(StudentPaymentOrder studentPaymentOrder) {
         DegreeRegistration degree = degreeRegistrationDao.getLock(studentPaymentOrder.getUserId());
+
+        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateCount <= 0) {
+            throw new BizException("订单更新失败");
+        }
+
         if (degree == null || degree.getStatus().equals(2)) {
             return true;
         }

+ 58 - 29
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -7,6 +7,7 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.AD
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW;
 
+import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -21,6 +22,10 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,40 +36,12 @@ import org.springframework.transaction.annotation.Transactional;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dto.CalenderPushDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDetailDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
-import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettingsDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.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.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.OrganizationCourseUnitPriceSettings;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
@@ -116,6 +93,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	
 	@Autowired
 	private MusicGroupDao musicGroupDao;
+
+	@Autowired
+	private ClassGroupDao classGroupDao;
+
+	@Autowired
+	private CourseScheduleDao courseScheduleDao;
 	@Autowired
 	private MusicGroupBuildLogDao musicGroupBuildLogDao;
 	@Autowired
@@ -130,6 +113,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
 	private CourseScheduleStudentPaymentServiceImpl courseScheduleStudentPaymentService;
+	@Autowired
+	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -704,8 +689,10 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			Organization organization = organizationDao.get(musicGroup.getOrganId());
 			sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()),
 					MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, "", organization.getName(), musicGroup.getName());
+		}else {
+			//如果是合班缴费
+			autoClassGroupAdjust(batchNo);
 		}
-
 		return batchNo;
 	}
 
@@ -880,6 +867,46 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		return calenderAuditDetailDto;
 	}
 
+	//审核通过后自动排课
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void autoClassGroupAdjust(String batchNo){
+		MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+		if(musicGroupStudentClassAdjust == null){
+			return;
+		}
+		List<ClassGroup4MixDto> classGroup4MixDtos = JSON.parseArray(musicGroupStudentClassAdjust.getNewClassGroupJson(), ClassGroup4MixDto.class);
+		//开始排课
+		ClassGroup4MixDto classGroup4MixDto = classGroup4MixDtos.get(0);
+		classGroup4MixDto.setClassCourseMinute(musicGroupStudentClassAdjust.getClassCourseMinute());
+		List<CourseTimeDto> courseTimeDtoList = classGroup4MixDto.getCourseTimeDtoList();
+		List<CourseTimeDto> courseTimeDtoListBackup = new ArrayList<>();
+		try {
+			BeanUtils.copyProperties(courseTimeDtoListBackup, courseTimeDtoList);
+		} catch (Exception e) {
+			throw new BizException("拷贝课程信息异常");
+		}
+		//每种课程类型单独排课
+		for (CourseTimeDto courseTimeDto : courseTimeDtoListBackup) {
+			List<CourseTimeDto> courseTimeDtos = new ArrayList<>();
+			courseTimeDtos.add(courseTimeDto);
+			classGroup4MixDto.setCourseTimeDtoList(courseTimeDtos);
+			classGroupService.classGroupAdjust(classGroup4MixDtos);
+		}
+		musicGroupStudentClassAdjust.setCourseFlag(true);
+		//排课完成后删除所选课程
+		List<Long> courseIds = JSON.parseArray(musicGroupStudentClassAdjust.getSubLockCourseIds(), Long.class);
+		courseScheduleDao.batchDeleteByCourseSchedules(courseIds);
+		//解冻课程
+		List<Long> allCourseIds = JSON.parseArray(musicGroupStudentClassAdjust.getAllLockCourseIds(), Long.class);
+		courseScheduleDao.batchUpdateLockByCourseIds(allCourseIds,0);
+		//解冻班级
+		List<Integer> classGroupIds = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupIds(), Integer.class);
+		classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,0);
+		musicGroupStudentClassAdjust.setCourseFlag(true);
+		musicGroupStudentClassAdjustDao.update(musicGroupStudentClassAdjust);
+	}
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void auditPass(String batchNo,String auditMemo) {
@@ -930,6 +957,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			}
 		}
 		musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
+		//如果是合班缴费
+		autoClassGroupAdjust(batchNo);
 	}
 
 	@Override

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

@@ -1196,11 +1196,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         List<StudentRegistration> students = new ArrayList<>();
         if (classGroupTypeSet.contains(ClassGroupTypeEnum.HIGH)) {
-            List<StudentRegistration> noHighClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, ClassGroupTypeEnum.HIGH, null);
+            List<StudentRegistration> noHighClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, null, ClassGroupTypeEnum.HIGH, null);
             students.addAll(noHighClassGroupStudents);
         }
         if (classGroupTypeSet.contains(ClassGroupTypeEnum.HIGH_ONLINE)) {
-            List<StudentRegistration> noHighOnlineClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, ClassGroupTypeEnum.HIGH_ONLINE, null);
+            List<StudentRegistration> noHighOnlineClassGroupStudents = studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, null, ClassGroupTypeEnum.HIGH_ONLINE, null);
             students.addAll(noHighOnlineClassGroupStudents);
         }
 

+ 44 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -16,6 +16,8 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,23 +30,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.GoodsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.StudentCourseFeeDetailDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SubjectChangeDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.StudentAddDto;
 import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
@@ -115,6 +100,7 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.http.HttpUtil;
+import org.springframework.util.CollectionUtils;
 
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
@@ -187,6 +173,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
     @Autowired
     private StudentCourseFeeDetailDao studentCourseFeeDetailDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -1298,14 +1286,52 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer subjectId) {
+    public List<StudentRegistration> findMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer subjectId) {
         List<StudentRegistration> students = studentRegistrationDao.findMusicGroupStudent(musicGroupId, subjectId);
         List<Subject> subjectList = subjectService.findAll(new HashMap<>());
 
+        Map<CourseSchedule.CourseScheduleType, Integer> courseTypeCourseDurationMap = new HashMap<>();
+        Map<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCourseMap = new HashMap<>();
+        if(Objects.nonNull(classGroupId)){
+            List<CourseSchedule> classGroupNotStartCourse = courseScheduleDao.getClassGroupNotStartCourse(classGroupId);
+            typeCourseMap = classGroupNotStartCourse.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+            for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> typeCoursesEntry : typeCourseMap.entrySet()) {
+                int totalCourseDuration = 0;
+                for (CourseSchedule courseSchedule : typeCoursesEntry.getValue()) {
+                    //课程时长
+                    int courseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
+                    totalCourseDuration += courseDuration;
+                }
+                courseTypeCourseDurationMap.put(typeCoursesEntry.getKey(), totalCourseDuration);
+            }
+        }
+
         List<ClassGroupStudentMapper> classGroupStudentMappers = classGroupStudentMapperDao.findMusicGroupClassGroupByType(musicGroupId, type);
         Iterator<StudentRegistration> iterator = students.iterator();
         while (iterator.hasNext()) {
             StudentRegistration student = iterator.next();
+
+            boolean courseMinutesNotEnough = false;
+
+            for (Map.Entry<CourseSchedule.CourseScheduleType, List<CourseSchedule>> courseScheduleTypeListEntry : typeCourseMap.entrySet()) {
+                //当前课程类型总课程时长
+                Integer typeCourseDuration = courseTypeCourseDurationMap.get(courseScheduleTypeListEntry.getKey());
+
+                String batchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, student.getUserId(), courseScheduleTypeListEntry.getKey());
+
+                List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = musicGroupPaymentStudentCourseDetailDao.getUnUseWithStudentAndCourseTypeAndCourseMinutes(batchNo, student.getUserId(), courseScheduleTypeListEntry.getKey());
+                int totalCourseMinutes = musicGroupPaymentStudentCourseDetails.stream().mapToInt(MusicGroupPaymentStudentCourseDetail::getTotalCourseMinutes).reduce(0, Integer::sum);
+                if(CollectionUtils.isEmpty(musicGroupPaymentStudentCourseDetails)||totalCourseMinutes<typeCourseDuration){
+                    iterator.remove();
+                    courseMinutesNotEnough = true;
+                    break;
+                }
+            }
+
+            if(courseMinutesNotEnough){
+                continue;
+            }
+
             for (Subject subject : subjectList) {
                 if (student.getActualSubjectId().equals(subject.getId())) {
                     student.setSubjectName(subject.getName());

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

@@ -1173,6 +1173,14 @@
     <update id="updateGroupName">
         UPDATE class_group SET group_name_ = #{groupName} WHERE id_ = #{groupId}
     </update>
+    <update id="batchUpdateLockByClassGroupIds">
+        UPDATE class_group
+        SET lock_flag_ = #{lockFlag}, update_time_ = NOW()
+        WHERE id_ IN
+        <foreach collection="classGroupIds" open="(" close=")" item="item" separator=",">
+            #{item}
+        </foreach>
+    </update>
 
     <resultMap id="SuperClassGroupInfo" type="com.ym.mec.biz.dal.dto.SuperClassGroupDto" extends="ClassGroup">
 

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

@@ -313,6 +313,13 @@
             #{courseScheduleId}
         </foreach>
     </delete>
+    <delete id="batchDeleteByCourseSchedules">
+        UPDATE course_schedule SET del_flag_ = '1',update_time_ = NOW()
+        WHERE id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </delete>
 
     <delete id="batchDeleteCourseSchedulesWithoutCheck">
         DELETE FROM course_schedule
@@ -3377,7 +3384,8 @@
         GROUP BY c.type_
     </select>
     <select id="queryStudentNotStartByClassIdsAndStudentIds" resultType="Long">
-        SELECT course_schedule_id_ FROM course_schedule_student_payment cssp
+        SELECT cssp.course_schedule_id_ FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
         WHERE cssp.class_group_id_ IN
         <foreach collection="classGroupIds" open="(" close=")" separator="," item="item">
             #{item}

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

@@ -607,6 +607,7 @@
 			LEFT JOIN vip_group_category vgc ON vg.vip_group_category_id_ = vgc.id_
 		WHERE
 			cssp.group_type_ = 'VIP'
+			AND cssp.create_time_ > '2020-11-11 00:00:00'
 			AND cssp.user_id_ IN
 			<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
 				#{userId}

+ 7 - 9
mec-biz/src/main/resources/config/mybatis/MusicGroupStudentClassAdjustMapper.xml

@@ -17,7 +17,6 @@
 		<result column="all_lock_course_ids_" property="allLockCourseIds" />
 		<result column="sub_lock_course_ids_" property="subLockCourseIds" />
 		<result column="course_flag_" property="courseFlag" />
-		<result column="calender_status_" property="calenderStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="operator_id_" property="operatorId" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
@@ -35,12 +34,11 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupStudentClassAdjust" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO music_group_student_class_adjust (id_,music_group_id_,batch_no_,new_class_group_json_,
+		INSERT INTO music_group_student_class_adjust (music_group_id_,batch_no_,new_class_group_json_,
 		class_group_ids_,student_ids_,class_course_minute_,all_lock_course_ids_,sub_lock_course_ids_,
-		course_flag_,calender_status_,operator_id_,create_time_,update_time_)
-		VALUES(#{id},#{musicGroupId},#{batchNo},#{newClassGroupJson},#{classGroupIds},#{studentIds},
-		#{classCourseMinute},#{allLockCourseIds},#{subLockCourseIds},#{courseFlag},
-		#{calenderStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{operatorId},NOW(),NOW())
+		course_flag_,operator_id_,create_time_,update_time_)
+		VALUES(#{musicGroupId},#{batchNo},#{newClassGroupJson},#{classGroupIds},#{studentIds},
+		#{classCourseMinute},#{allLockCourseIds},#{subLockCourseIds},#{courseFlag},#{operatorId},NOW(),NOW())
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -49,9 +47,6 @@
 		<if test="courseFlag != null">
 		course_flag_ = #{courseFlag},
 		</if>
-		<if test="calenderStatus != null">
-		calender_status_ = #{calenderStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-		</if>
 		<if test="allLockCourseIds != null">
 		all_lock_course_ids_ = #{allLockCourseIds},
 		</if>
@@ -94,4 +89,7 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM music_group_student_class_adjust
 	</select>
+    <select id="findByBatchNo" resultMap="MusicGroupStudentClassAdjust">
+		SELECT * FROM music_group_student_class_adjust WHERE batch_no_ = #{batchNo}
+	</select>
 </mapper>

+ 11 - 4
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -16,6 +16,7 @@ import com.ym.job.ScheduleManager;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.RongyunBasicUserDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.SysExamSong;
@@ -761,7 +762,6 @@ public class RoomServiceImpl implements RoomService {
         CheckUtils.checkArgument(roomId != null, "roomId must't be null");
         CheckUtils.checkArgument(userId != null, "userId must't be null");
         CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
-        CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
         SysUser authUser = sysUserFeignService.queryUserInfo();
         log.info("controlDevice: userId={}, typeEnum={}, onOff={}", userId, typeEnum, enable);
 
@@ -798,7 +798,7 @@ public class RoomServiceImpl implements RoomService {
                     msg = JSON.parseObject(examJson, ExamSongDownloadData.class);
                     msg.setEnable(enable);
                 }
-                courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,authUser.getId(),JSON.toJSONString(msg));
+                courseScheduleStudentPaymentDao.adjustExamSong(scheduleId,Integer.parseInt(userId),JSON.toJSONString(msg));
             }else {
                 roomMemberDao.updateMusicByRidAndUid(roomId, userId, false);
             }
@@ -843,8 +843,15 @@ public class RoomServiceImpl implements RoomService {
                 controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.MusicMode, data.getMusicModeOn());
             }
         } else if (data.getExamSongOn() != null) {
-            for (RoomMember e:roomMembers) {
-                controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
+            if(StringUtils.isNotEmpty(data.getUserId())){
+                for (RoomMember e:roomMembers) {
+                    controlDevice(data.getRoomId(), e.getUid(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
+                }
+            }else {
+                List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(Long.parseLong(data.getRoomId().substring(1)));
+                for (BasicUserDto e:students) {
+                    controlDevice(data.getRoomId(), e.getUserId().toString(), DeviceTypeEnum.ExamSong, data.getExamSongOn());
+                }
             }
         } else {
             throw new ApiException(ErrorEnum.ERR_REQUEST_PARA_ERR);

+ 36 - 5
mec-student/src/main/java/com/ym/mec/student/controller/DegreeController.java

@@ -4,12 +4,15 @@ 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.DegreeRegistrationDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dto.DegreeRegistrationActivityDto;
 import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.entity.DegreeRegistration;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
 import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
@@ -29,10 +32,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @RequestMapping("degree")
 @Api(tags = "考级报名服务")
@@ -57,9 +57,15 @@ public class DegreeController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
     @ApiOperation(value = "考级报名支付")
     @PostMapping("/pay")
-    public HttpResponseResult pay(DegreeRegistrationActivityDto degreeRegistration) throws Exception {
+    public HttpResponseResult pay(@RequestBody DegreeRegistrationActivityDto degreeRegistration) throws Exception {
         SysUser user = sysUserFeignService.queryUserInfo();
         if(Objects.isNull(user)){
             return failed(HttpStatus.FORBIDDEN,"请登录");
@@ -111,4 +117,29 @@ public class DegreeController extends BaseController {
         return succeed(sporadicChargeInfoService.queryDetailPage(queryInfo));
     }
 
+    @ApiOperation(value = "获取活动参数")
+    @GetMapping("/getParams")
+    public HttpResponseResult getParams(){
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(user)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+
+        SporadicChargeInfoQueryInfo queryInfo = new SporadicChargeInfoQueryInfo();
+        queryInfo.setOrganId("42");
+        queryInfo.setChargeType(SporadicChargeTypeEnum.LEVEL);
+        queryInfo.setRows(99);
+        queryInfo.setOpenFlag(0);
+        queryInfo.setSort("amount_");
+        queryInfo.setOrder("ASC");
+
+        Map<String, Object> result = new HashMap<>();
+
+        Student student = studentDao.get(user.getId());
+        result.put("userInfo", user);
+        result.put("isNewUser", student.getIsNewUser());
+        result.put("organs", organizationDao.findAllOrgans());
+        result.put("sporadicChargeInfo", sporadicChargeInfoService.queryDetailPage(queryInfo));
+        return succeed(result);
+    }
 }

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

@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -140,6 +141,11 @@ public class StudentOrderController extends BaseController {
             if (orderByOrderNo.getType().equals(OrderTypeEnum.DOUBLE_ELEVEN2020)) {
                 LuckDrawCount luckDrawCount = luckDrawCountService.get(orderByOrderNo.getUserId().longValue());
                 orderDetail.put("drawTimes", luckDrawCount==null? 0: luckDrawCount.getAvailableCount());
+            }else if(OrderTypeEnum.DEGREE_REGISTRATION.equals(orderByOrderNo.getType())){
+                List<StudentPaymentOrderDetail> studentPaymentOrderDetails = studentPaymentOrderDetailService.getOrderDetail(orderByOrderNo.getId());
+                if(!CollectionUtils.isEmpty(studentPaymentOrderDetails)){
+                    orderDetail.put("additionCourseInfo", studentPaymentOrderDetails.get(0).getGoodsIdList());
+                }
             }
         } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)) {
             orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));

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

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.Date;
 import java.util.List;
 
@@ -362,7 +363,7 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "进行中乐团-修改-班级详情-学员班级调整-合并结果确认")
     @PostMapping("/mergeClassSplitClassAffirm")
     @PreAuthorize("@pcs.hasPermissions('classGroup/mergeClassSplitClassAffirm')")
-    public HttpResponseResult mergeClassSplitClassAffirm(@RequestBody MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto){
+    public HttpResponseResult mergeClassSplitClassAffirm(@RequestBody MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException {
         classGroupService.mergeClassSplitClassAffirm(mergeClassSplitClassAffirmDto);
         return succeed();
     }

+ 2 - 2
mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

@@ -136,8 +136,8 @@ public class StudentRegistrationController extends BaseController {
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "type", value = "类型(MIX,HIGH)", required = true, dataType = "ClassGroupTypeEnum"),
             @ApiImplicitParam(name = "actualSubjectId", value = "科目(声部)id,", required = false, dataType = "int")})
-    public HttpResponseResult getMusicGroupStuNoClassType(String musicGroupId, ClassGroupTypeEnum type, Integer actualSubjectId) {
-        return succeed(studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, type, actualSubjectId));
+    public HttpResponseResult getMusicGroupStuNoClassType(String musicGroupId, Long classGroupId, ClassGroupTypeEnum type, Integer actualSubjectId) {
+        return succeed(studentRegistrationService.findMusicGroupStuNoClassType(musicGroupId, classGroupId, type, actualSubjectId));
     }
 
     @ApiOperation(value = "获取学生报名缴费详情")