Browse Source

活动排课

zouxuan 3 năm trước cách đây
mục cha
commit
ee953ba8bc
20 tập tin đã thay đổi với 1207 bổ sung113 xóa
  1. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupApplyBaseInfoDto.java
  4. 60 16
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  5. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityUserQueryInfo.java
  6. 42 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  8. 661 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  9. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  10. 5 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  11. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  12. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  13. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  14. 191 33
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  15. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  16. 65 7
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java
  17. 9 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/StudentController.java
  18. 0 8
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java
  19. 0 27
      mec-web/src/main/java/com/ym/mec/web/controller/ActivityUserMapperController.java
  20. 112 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduActivityUserMapperController.java

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java

@@ -119,4 +119,26 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
     List<CourseFormDto> queryWaitCourseCategory(@Param("userId") Integer userId, @Param("organIds") String organIds);
 
     List<ActivityUserDto> queryActivityStudentList(@Param("queryInfo") ActivityUserQueryInfo activityUserQueryInfo);
+
+    /**
+    * @description: 获取活动排课可排课时长列表
+     * @param activityUserQueryInfo
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2022/7/25 10:01
+    */
+    List<Integer> queryActivityCourseTimeList(@Param("queryInfo") ActivityUserQueryInfo activityUserQueryInfo);
+
+    List<ActivityUserMapper> findTotalByStudents(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+    List<ActivityUserMapper> findByStudents(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+
+    List<ActivityUserMapper> findByStudents1(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+
+    void batchUpdate(@Param("useActivityUserMappers") List<ActivityUserMapper> useActivityUserMappers);
 }

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

@@ -424,4 +424,6 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<SysUserDto> queryStudentBasicInfo(Map<String, Object> params);
 
     List<BaseMapDto> queryStuSubjectId(@Param("organIds") String organIds);
+
+    List<BaseMapDto> queryStuSubjectIdByTeacherId(@Param("userId") Integer userId);
 }

+ 0 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupApplyBaseInfoDto.java

@@ -1,13 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import com.ym.mec.biz.dal.enums.ActivityCourseType;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.List;
 
 public class PracticeGroupApplyBaseInfoDto extends PracticeGroup {
 

+ 60 - 16
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java

@@ -13,6 +13,15 @@ public class ActivityUserMapper extends BaseEntity {
 
 	private Integer id;
 	
+	@ApiModelProperty(value = "单节课时长")
+	private Integer singleCourseTime;
+
+	@ApiModelProperty(value = "单节课价值")
+	private BigDecimal singleCoursePrice = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "赠送单节课时长")
+	private Integer giveSingleCourseTime;
+
 	@ApiModelProperty(value = "可排课课程类型")
 	private Integer categoryId;
 
@@ -61,11 +70,11 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "缴费编号")
 	private Long paymentOrderId;
 
-	@ApiModelProperty(value = "已排课的vip课程组编号")
-	private Long vipGroupId;
+	@ApiModelProperty(value = "已排课的vip课程组编号(多个逗号分割)")
+	private String vipGroupId;
 
-	@ApiModelProperty(value = "已排课的赠送的vip课程组编号")
-	private Long giveVipGroupId;
+	@ApiModelProperty(value = "已排课的赠送的vip课程组编号(多个逗号分割)")
+	private String giveVipGroupId;
 
 	@ApiModelProperty(value = "会员订单号")
 	private Long memberOrderId;
@@ -73,11 +82,11 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "赠送的会员订单号")
 	private Long giveMemberOrderId;
 
-	@ApiModelProperty(value = "已排课的陪练课课程组编号")
-	private Long practiceGroupId;
+	@ApiModelProperty(value = "已排课的陪练课课程组编号(多个逗号分割)")
+	private String practiceGroupId;
 
-	@ApiModelProperty(value = "已排课的陪练课课程组编号")
-	private Long givePracticeGroupId;
+	@ApiModelProperty(value = "已排课的陪练课课程组编号(多个逗号分割)")
+	private String givePracticeGroupId;
 
 	@ApiModelProperty(value = "是否退费")
 	private Boolean returnFee = false;
@@ -85,6 +94,9 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "剩余未排课金额")
 	private BigDecimal subNoCoursePrice = BigDecimal.ZERO;
 
+	@ApiModelProperty(value = "本次排课消耗的课程价值")
+	private BigDecimal currentCoursePrice = BigDecimal.ZERO;
+
 	@ApiModelProperty(value = "实际支付金额")
 	private BigDecimal actualPrice = BigDecimal.ZERO;
 
@@ -103,6 +115,38 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "赠送的优惠券编号")
 	private Integer giveCouponId;
 
+	public BigDecimal getCurrentCoursePrice() {
+		return currentCoursePrice;
+	}
+
+	public void setCurrentCoursePrice(BigDecimal currentCoursePrice) {
+		this.currentCoursePrice = currentCoursePrice;
+	}
+
+	public BigDecimal getSingleCoursePrice() {
+		return singleCoursePrice;
+	}
+
+	public void setSingleCoursePrice(BigDecimal singleCoursePrice) {
+		this.singleCoursePrice = singleCoursePrice;
+	}
+
+	public Integer getSingleCourseTime() {
+		return singleCourseTime;
+	}
+
+	public void setSingleCourseTime(Integer singleCourseTime) {
+		this.singleCourseTime = singleCourseTime;
+	}
+
+	public Integer getGiveSingleCourseTime() {
+		return giveSingleCourseTime;
+	}
+
+	public void setGiveSingleCourseTime(Integer giveSingleCourseTime) {
+		this.giveSingleCourseTime = giveSingleCourseTime;
+	}
+
 	public Integer getCategoryId() {
 		return categoryId;
 	}
@@ -159,35 +203,35 @@ public class ActivityUserMapper extends BaseEntity {
 		this.subGiveCourseNum = subGiveCourseNum;
 	}
 
-	public Long getVipGroupId() {
+	public String getVipGroupId() {
 		return vipGroupId;
 	}
 
-	public void setVipGroupId(Long vipGroupId) {
+	public void setVipGroupId(String vipGroupId) {
 		this.vipGroupId = vipGroupId;
 	}
 
-	public Long getGiveVipGroupId() {
+	public String getGiveVipGroupId() {
 		return giveVipGroupId;
 	}
 
-	public void setGiveVipGroupId(Long giveVipGroupId) {
+	public void setGiveVipGroupId(String giveVipGroupId) {
 		this.giveVipGroupId = giveVipGroupId;
 	}
 
-	public Long getPracticeGroupId() {
+	public String getPracticeGroupId() {
 		return practiceGroupId;
 	}
 
-	public void setPracticeGroupId(Long practiceGroupId) {
+	public void setPracticeGroupId(String practiceGroupId) {
 		this.practiceGroupId = practiceGroupId;
 	}
 
-	public Long getGivePracticeGroupId() {
+	public String getGivePracticeGroupId() {
 		return givePracticeGroupId;
 	}
 
-	public void setGivePracticeGroupId(Long givePracticeGroupId) {
+	public void setGivePracticeGroupId(String givePracticeGroupId) {
 		this.givePracticeGroupId = givePracticeGroupId;
 	}
 

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityUserQueryInfo.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
+import io.swagger.annotations.ApiModelProperty;
+
 /**
 * @author zx
 * @date 2021/9/26 15:52
@@ -10,12 +12,26 @@ public class ActivityUserQueryInfo{
 
     private String subjectIds;
 
+    @ApiModelProperty(value = "单节课时长")
     private Integer singleCourseTime;
 
+    @ApiModelProperty(value = "课程分类")
     private Integer categoryId;
 
+    @ApiModelProperty(value = "指导老师编号")
     private Integer teacherId;
 
+    @ApiModelProperty(value = "用于模糊查询")
+    private String search;
+
+    public String getSearch() {
+        return search;
+    }
+
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
     public String getOrganIds() {
         return organIds;
     }

+ 42 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java

@@ -2,10 +2,12 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.apache.ibatis.annotations.Param;
@@ -143,4 +145,44 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     * @date 2022/7/22 18:07
     */
     List<ActivityUserDto> queryActivityStudentList(ActivityUserQueryInfo activityUserQueryInfo);
+
+    /**
+    * @description: 获取活动排课可排课时长列表
+     * @param activityUserQueryInfo
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2022/7/25 10:00
+    */
+    List<Integer> queryActivityCourseTimeList(ActivityUserQueryInfo activityUserQueryInfo);
+
+    /**
+    * @description: 活动排课
+     * @param vipGroupApplyDto
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2022/7/25 11:45
+    */
+    HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroupApplyDto);
+
+    /**
+    * @description: 消耗排课资格
+     * @param activityUserMappers
+     * @param courseNum
+    * @return int
+    * @author zx
+    * @date 2022/7/25 14:50
+    */
+    List<CourseScheduleStudentPayment> use(List<ActivityUserMapper> activityUserMappers,
+                                           List<ActivityUserMapper> freeActivityUserMappers,
+                                           int courseNum,
+                                           Long groupId,List<Integer> studentIdList);
+
+    /**
+    * @description: 网管课活动排课
+     * @param practiceGroupApplyDto
+    * @return com.ym.mec.common.entity.HttpResponseResult
+    * @author zx
+    * @date 2022/7/26 10:42
+    */
+    HttpResponseResult createActivityPracticeGroup(PracticeGroupApplyDto practiceGroupApplyDto);
 }

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

@@ -222,4 +222,5 @@ public interface StudentManageService {
 
     PageInfo<Student> queryStudent(StudentActivityQueryInfo queryInfo);
 
+    List<BaseMapDto> queryStuSubjectId(Integer userId);
 }

+ 661 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java

@@ -1,23 +1,24 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 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.*;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
-import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
-import com.ym.mec.biz.service.ActivityUserMapperService;
-import com.ym.mec.biz.service.SysUserCashAccountLogService;
-import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,10 +26,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.ym.mec.biz.dal.enums.GroupType.*;
+import static com.ym.mec.biz.dal.enums.GroupType.ACTIVITY;
+import static java.math.BigDecimal.ROUND_DOWN;
 
 @Service
 public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, ActivityUserMapper>  implements ActivityUserMapperService {
@@ -51,6 +54,40 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	private SysConfigDao sysConfigDao;
 	@Autowired
 	private SubjectDao subjectDao;
+	@Autowired
+	private CourseScheduleService courseScheduleService;
+	@Autowired
+	private VipGroupCategoryService vipGroupCategoryService;
+	@Autowired
+	private VipGroupDao vipGroupDao;
+	@Autowired
+	private VipGroupService vipGroupService;
+	@Autowired
+	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
+	@Autowired
+	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+	@Autowired
+	private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+	@Autowired
+	private VipGroupDefaultClassesUnitPriceDao vipGroupDefaultClassesUnitPriceDao;
+	@Autowired
+	private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
+	@Autowired
+	private ClassGroupTeacherSalaryDao classGroupTeacherSalaryDao;
+	@Autowired
+	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+	@Autowired
+	private ClassGroupDao classGroupDao;
+	@Autowired
+	private PracticeGroupDao practiceGroupDao;
+	@Autowired
+	private PracticeGroupService practiceGroupService;
+	@Autowired
+	private SysUserService sysUserService;
+	@Autowired
+	private TeacherService teacherService;
+	@Autowired
+	private PracticeGroupSellPriceDao practiceGroupSellPriceDao;
 
 	@Override
 	public BaseDAO<Integer, ActivityUserMapper> getDAO() {
@@ -332,4 +369,622 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	public List<ActivityUserDto> queryActivityStudentList(ActivityUserQueryInfo activityUserQueryInfo) {
 		return activityUserMapperDao.queryActivityStudentList(activityUserQueryInfo);
 	}
+
+	@Override
+	public List<Integer> queryActivityCourseTimeList(ActivityUserQueryInfo activityUserQueryInfo) {
+		return activityUserMapperDao.queryActivityCourseTimeList(activityUserQueryInfo);
+	}
+
+	private void checkCreateActivityVipGroup(VipGroupApplyDto vipGroup,VipGroupApplyBaseInfoDto applyBaseInfo){
+		Map<TeachModeEnum, List<CourseSchedule>> courseScheduleGroup;
+		try {
+			courseScheduleGroup = vipGroup.getCourseSchedules().stream().collect(Collectors.groupingBy(CourseSchedule::getTeachMode));
+		} catch (Exception e) {
+			throw new BizException("教学模式错误");
+		}
+		if (StringUtils.isBlank(applyBaseInfo.getSubjectIdList())) {
+			throw new BizException("请选择声部");
+		}
+		if(Objects.isNull(applyBaseInfo.getVipGroupCategoryId())){
+			throw new BizException("请选择课程类型");
+		}
+		if ((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE)) && applyBaseInfo.getOfflineClassesNum() != 0)
+				|| (!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE)) && (courseScheduleGroup.get(TeachModeEnum.OFFLINE).size() < applyBaseInfo.getOfflineClassesNum()))) {
+			throw new BizException("线下课课时数量安排有误");
+		}
+		if ((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE)) && applyBaseInfo.getOnlineClassesNum() != 0)
+				|| (!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE)) && (courseScheduleGroup.get(TeachModeEnum.ONLINE).size() < applyBaseInfo.getOnlineClassesNum()))) {
+			throw new BizException("线上课课时数量安排有误");
+		}
+		//校验线上课学员上限
+		if (applyBaseInfo.getOnlineClassesNum() > 0) {
+			courseScheduleService.checkOnlineCategory(applyBaseInfo.getStudentNum());
+		}
+		if (applyBaseInfo.getOfflineClassesNum() > 0 && Objects.isNull(applyBaseInfo.getTeacherSchoolId())) {
+			throw new BizException("请设置教学点");
+		}
+		if (Objects.isNull(applyBaseInfo.getOfflineClassesUnitPrice()) && Objects.isNull(applyBaseInfo.getOnlineClassesUnitPrice())) {
+			throw new BizException("请设置课程单价");
+		}
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup) {
+		VipGroupApplyBaseInfoDto applyBaseInfo = vipGroup.getVipGroupApplyBaseInfo();
+		this.checkCreateActivityVipGroup(vipGroup,applyBaseInfo);
+		String studentIds = applyBaseInfo.getStudentIdList();
+		if (StringUtils.isBlank(studentIds)) {
+			throw new BizException("请选择学员");
+		}
+		int courseNum = vipGroup.getCourseSchedules().size();
+		if (courseNum != (applyBaseInfo.getOfflineClassesNum() + applyBaseInfo.getOnlineClassesNum())) {
+			throw new BizException("建课失败,课程数量异常");
+		}
+		Date now = new Date();
+		Integer totalClassTimes = applyBaseInfo.getOnlineClassesNum() + applyBaseInfo.getOfflineClassesNum();
+		//获取第一节课
+		CourseSchedule firstCourseSchedule = vipGroup.getCourseSchedules().stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+		//获取最后一节课
+		CourseSchedule latestCourseSchedule = vipGroup.getCourseSchedules().stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+
+		if (firstCourseSchedule.getStartClassTime().before(now)) {
+			throw new BizException("开课时间不能小于当前时间");
+		}
+		applyBaseInfo.setRegistrationStartTime(now);
+		applyBaseInfo.setPaymentExpireDate(now);
+		if (applyBaseInfo.getRegistrationStartTime().after(applyBaseInfo.getPaymentExpireDate())) {
+			throw new BizException("报名开始时间必须在报名截至时间之前");
+		}
+		VipGroupCategory vipGroupCategory = vipGroupCategoryService.get(applyBaseInfo.getVipGroupCategoryId());
+		if (Objects.isNull(vipGroupCategory)) {
+			throw new BizException("课程形式不存在");
+		}
+		List<Integer> studentIdList = Arrays.stream(studentIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+		if (!vipGroupCategory.getMusicTheory()) {
+			if (studentIdList.size() != vipGroupCategory.getStudentNum()) {
+				throw new BizException("学员数量异常");
+			}
+		} else if (studentIdList.size() > vipGroupCategory.getStudentNum()){
+			throw new BizException("{}课程最多支持{}人", vipGroupCategory.getName(), vipGroupCategory.getStudentNum());
+		}
+
+		List<Integer> canBuyStudentIds = Arrays.stream(applyBaseInfo.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+
+		int repeatVipGroups = vipGroupDao.countUserRepeatVipGroupInCourseStartEndTime(applyBaseInfo.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+		if (repeatVipGroups > 0) {
+			SysUser sysUser = sysUserFeignService.queryUserById(applyBaseInfo.getUserId());
+			throw new BizException("{}课程时间冲突({}-{})", sysUser.getRealName(), DateUtil.dateToString(firstCourseSchedule.getStartClassTime(), "yyyy-MM-dd HH:mm:ss"), DateUtil.dateToString(latestCourseSchedule.getEndClassTime(), "HH:mm:ss"));
+		}
+
+		List<String> studentNames = studentDao.getStudentNames(canBuyStudentIds);
+
+		//生成vip课信息
+		List<String> bySubIds = subjectDao.findBySubIds(applyBaseInfo.getSubjectIdList());
+		StringBuffer className = new StringBuffer();
+		if (Objects.isNull(vipGroupCategory.getMusicTheory()) || !vipGroupCategory.getMusicTheory()) {
+			className.append(StringUtils.join(bySubIds, ","));
+			className.append(vipGroupCategory.getName());
+		} else {
+			className.append("乐理课•");
+		}
+		className.append(StringUtils.join(studentNames, ","));
+		applyBaseInfo.setName(className.toString());
+
+		applyBaseInfo.setAuditStatus(AuditStatusEnum.PASS);
+		applyBaseInfo.setStatus(VipGroupStatusEnum.PROGRESS);
+
+		//开课时间为排课的第一节课的开始时间
+		applyBaseInfo.setCourseStartDate(firstCourseSchedule.getStartClassTime());
+		//课程结束时间为排课的最后一节课的结束时间
+		applyBaseInfo.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
+		applyBaseInfo.setStudentNum(studentIdList.size());
+		applyBaseInfo.setPaymentExpireDate(DateUtil.getLastSecondWithDay(applyBaseInfo.getPaymentExpireDate()));
+
+		vipGroupDao.insert(applyBaseInfo);
+
+		//校验排课资格,消耗排课资格(获取被使用的排课资格)
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments =
+				this.checkScheduleQualification(studentIdList, vipGroupCategory.getId(), applyBaseInfo.getSingleClassMinutes(), courseNum, applyBaseInfo.getId());
+
+		List<VipGroupStudentCoursePrice> vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+		if (org.springframework.util.CollectionUtils.isEmpty(vscps)) {
+			vscps = new ArrayList<>();
+			for (Integer canBuyStudentId : canBuyStudentIds) {
+				vscps.add(new VipGroupStudentCoursePrice(canBuyStudentId, applyBaseInfo.getOnlineClassesUnitPrice(), applyBaseInfo.getOfflineClassesUnitPrice(), applyBaseInfo.getTotalPrice()));
+			}
+		}
+		vscps.forEach(e -> e.setVipGroupId(applyBaseInfo.getId()));
+		vipGroupStudentCoursePriceDao.batchInsert(vscps);
+
+		vipGroup.getVipGroupApplyBaseInfo().setId(applyBaseInfo.getId());
+
+		//创建班级信息
+		ClassGroup classGroup = new ClassGroup();
+		classGroup.setSubjectIdList(applyBaseInfo.getSubjectIdList());
+		classGroup.setExpectStudentNum(vipGroupCategory.getStudentNum());
+		classGroup.setStudentNum(studentIdList.size());
+		classGroup.setName(applyBaseInfo.getName());
+		classGroup.setTotalClassTimes(totalClassTimes);
+		classGroup.setType(ClassGroupTypeEnum.VIP);
+		classGroup.setDelFlag(0);
+		classGroup.setGroupType(GroupType.VIP);
+		classGroup.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroup.setCreateTime(now);
+		classGroup.setUpdateTime(now);
+		classGroupDao.insert(classGroup);
+
+		//班级学员关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMapperList = new ArrayList<>();
+		for (Integer studentId : studentIdList) {
+			ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+			classGroupStudentMapper.setMusicGroupId(applyBaseInfo.getId().toString());
+			classGroupStudentMapper.setClassGroupId(classGroup.getId());
+			classGroupStudentMapper.setUserId(studentId);
+			classGroupStudentMapper.setCreateTime(now);
+			classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+			classGroupStudentMapper.setGroupType(GroupType.VIP);
+			classGroupStudentMapperList.add(classGroupStudentMapper);
+		}
+		classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
+
+		//计算课程相关费用信息
+		Map<String, BigDecimal> costInfo = vipGroupService.countVipGroupPredictFee1(applyBaseInfo, applyBaseInfo.getUserId(), null);
+		applyBaseInfo.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
+		applyBaseInfo.setTotalPrice(costInfo.get("totalPrice"));
+
+		//创建班级老师关联记录
+		ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+		classGroupTeacherMapper.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+		classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherMapper.setUserId(applyBaseInfo.getUserId());
+		classGroupTeacherMapper.setGroupType(GroupType.VIP);
+		classGroupTeacherMapper.setCreateTime(now);
+		classGroupTeacherMapper.setUpdateTime(now);
+		classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+		//创建班级与老师课酬记录
+		ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
+		classGroupTeacherSalary.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+		classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherSalary.setUserId(applyBaseInfo.getUserId());
+		classGroupTeacherSalary.setSalary(applyBaseInfo.getOfflineTeacherSalary());
+		classGroupTeacherSalary.setOnlineClassesSalary(applyBaseInfo.getOfflineTeacherSalary());
+		classGroupTeacherSalary.setGroupType(GroupType.VIP);
+		classGroupTeacherSalary.setCreateTime(now);
+		classGroupTeacherSalary.setUpdateTime(now);
+		classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+		//创建课程
+		List<CourseSchedule> courseSchedules = vipGroup.getCourseSchedules();
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			courseSchedule.setGroupType(GroupType.VIP);
+			courseSchedule.setMusicGroupId(applyBaseInfo.getId().toString());
+			if (courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
+				courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
+			}
+			courseSchedule.setTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setActualTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+			courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+			courseSchedule.setClassGroupId(classGroup.getId());
+			courseSchedule.setName(applyBaseInfo.getName());
+			courseSchedule.setOrganId(applyBaseInfo.getOrganId());
+		}
+		courseScheduleService.batchAddCourseSchedule(courseSchedules);
+
+		//创建老师单节课课酬信息
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+		//课程信息调整
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			courseSchedule.setGroupType(GroupType.VIP);
+			courseSchedule.setMusicGroupId(applyBaseInfo.getId().toString());
+			if (courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
+				courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
+			}
+			courseSchedule.setTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setActualTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+			courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+			courseSchedule.setClassGroupId(classGroup.getId());
+			courseSchedule.setName(applyBaseInfo.getName());
+			courseSchedule.setOrganId(applyBaseInfo.getOrganId());
+
+			//创建教师课程薪水记录
+			CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+			courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+			courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+			courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+			courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+			courseScheduleTeacherSalary.setUserId(courseSchedule.getActualTeacherId().intValue());
+			courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+			courseScheduleTeacherSalary.setExpectSalary(classGroupTeacherSalary.getSalary());
+			courseScheduleTeacherSalary.setActualSalary(null);
+			courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+		}
+		if (courseScheduleTeacherSalaries.size() > 0) {
+			courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaries);
+		}
+
+		applyBaseInfo.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
+		vipGroupDao.update(applyBaseInfo);
+
+		Map<Integer, String> userRoleMap = new HashMap<>();
+		if (Objects.nonNull(applyBaseInfo.getEducationalTeacherId())) {
+			userRoleMap.put(applyBaseInfo.getEducationalTeacherId(), "乐团主管");
+		}
+		userRoleMap.put(applyBaseInfo.getUserId(), "指导老师");
+		VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroup(applyBaseInfo.getId());
+		if (Objects.isNull(vipGroupDefaultClassesUnitPrice)) {
+			throw new BizException("课程单价设置错误");
+		}
+		//生成学生单课缴费信息
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+				courseScheduleStudentPayment.setGroupType(courseSchedule.getGroupType());
+				courseScheduleStudentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+				courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+				courseScheduleStudentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+				courseScheduleStudentPayment.setOriginalPrice(TeachModeEnum.ONLINE.equals(courseSchedule.getTeachMode()) ? vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice() : vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
+				userRoleMap.put(courseScheduleStudentPayment.getUserId(), null);
+			}
+		}
+
+		if (courseScheduleStudentPayments.size() > 0) {
+			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+			studentDao.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
+		}
+//		try {
+//			imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), classGroup.getName(),
+//					applyBaseInfo.getName(), null, null, GroupType.VIP.getCode(), ImGroup.GroupTypeEnum.VIP);
+//			imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
+//			imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(), classGroup.getGroupType());
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//		}
+		return BaseController.succeed(applyBaseInfo.getAuditStatus().getCode());
+    }
+
+	//校验排课资格并消耗
+	private List<CourseScheduleStudentPayment> checkScheduleQualification(List<Integer> studentIdList,Integer categoryId,Integer classMinutes,Integer courseNum,Long groupId) {
+		//获取学员排课资格
+		List<ActivityUserMapper> totalActivityUserMappers = activityUserMapperDao.findTotalByStudents(studentIdList,categoryId,classMinutes);
+		if (CollectionUtils.isEmpty(totalActivityUserMappers)) {
+			throw new BizException("所选学员暂无排课资格");
+		}
+		totalActivityUserMappers.stream().collect(Collectors.groupingBy(ActivityUserMapper::getUserId,Collectors.collectingAndThen(Collectors.toList(), list -> {
+			Integer sum = list.stream().mapToInt(ActivityUserMapper::getSubCourseNum).sum();
+			if (sum < courseNum) {
+				throw new BizException("所选学员排课资格不足");
+			}
+			return sum;
+		})));
+		//获取学员付费排课资格
+		List<ActivityUserMapper> activityUserMappers = activityUserMapperDao.findByStudents(studentIdList,categoryId,classMinutes);
+		//获取学员赠送排课资格
+		List<ActivityUserMapper> freeActivityUserMappers = activityUserMapperDao.findByStudents1(studentIdList,categoryId,classMinutes);
+		//消耗排课资格(获取被使用的排课资格)
+		return this.use(activityUserMappers, freeActivityUserMappers, courseNum,groupId,studentIdList);
+	}
+
+	private void getStudentPayment(Integer userId,BigDecimal totalAmount,Integer courseNum,List<CourseScheduleStudentPayment> courseScheduleStudentPayments){
+		//实际支付金额,去除优惠券
+		BigDecimal singleAmount = totalAmount.divide(new BigDecimal(courseNum), ROUND_DOWN);
+		BigDecimal firstSingleAmount = totalAmount.subtract(singleAmount.multiply(new BigDecimal(courseNum))).add(singleAmount);
+		for (Integer i = 0; i < courseNum; i++) {
+			CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+			courseScheduleStudentPayment.setUserId(userId);
+			if (i == 0) {
+				courseScheduleStudentPayment.setExpectPrice(firstSingleAmount);
+			} else {
+				courseScheduleStudentPayment.setExpectPrice(singleAmount);
+			}
+			courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
+			courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+		}
+	}
+	private void getStudentPayment(Integer userId,Integer courseNum,BigDecimal singlePrice,List<CourseScheduleStudentPayment> courseScheduleStudentPayments){
+		for (Integer i = 0; i < courseNum; i++) {
+			CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+			courseScheduleStudentPayment.setUserId(userId);
+			courseScheduleStudentPayment.setExpectPrice(singlePrice);
+			courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
+			courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+		}
+	}
+
+	@Override
+	public List<CourseScheduleStudentPayment> use(List<ActivityUserMapper> activityUserMappers,
+												  List<ActivityUserMapper> freeActivityUserMappers,
+												  int courseNum,
+												  Long groupId,List<Integer> studentIdList) {
+		Map<Integer, List<ActivityUserMapper>> collect = activityUserMappers.stream().collect(Collectors.groupingBy(ActivityUserMapper::getUserId));
+		Map<Integer,Integer> subCourseMap = new HashMap<>();
+		studentIdList.stream().forEach(e-> subCourseMap.put(e,courseNum));
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+		List<ActivityUserMapper> useActivityUserMappers = new ArrayList<>();
+		one:for (Integer integer : collect.keySet()) {
+			Integer subCourseNum = courseNum;
+			List<ActivityUserMapper> activityUserMapperList = collect.get(integer);
+			for (ActivityUserMapper activityUserMapper : activityUserMapperList) {
+				if(subCourseNum == 0){
+					continue one;
+				}
+				useActivityUserMappers.add(activityUserMapper);
+				//区分vip还是网管
+				this.modifyGroupId(activityUserMapper,groupId);
+				int num = activityUserMapper.getSubCourseNum();
+				//剩余课次不足
+				if(num <= subCourseNum){
+					subCourseNum = subCourseNum - num;
+					subCourseMap.put(integer, subCourseNum);
+					activityUserMapper.setSubCourseNum(0);
+					activityUserMapper.setSubNoCoursePrice(BigDecimal.ZERO);
+					activityUserMapper.setCurrentCoursePrice(activityUserMapper.getSubNoCoursePrice());
+					//生成学员课程支付记录
+					this.getStudentPayment(integer,activityUserMapper.getSubNoCoursePrice(),num,courseScheduleStudentPayments);
+				}else {
+					subCourseMap.put(integer, 0);
+					activityUserMapper.setSubCourseNum(num - subCourseNum);
+					//消耗的课程价值
+					BigDecimal divide = activityUserMapper.getActualPrice().divide(new BigDecimal(activityUserMapper.getTotalCourseNum()), RoundingMode.DOWN).multiply(new BigDecimal(subCourseNum));
+					activityUserMapper.setSubNoCoursePrice(activityUserMapper.getSubNoCoursePrice().subtract(divide));
+					activityUserMapper.setCurrentCoursePrice(divide);
+					this.getStudentPayment(integer,subCourseNum,divide,courseScheduleStudentPayments);
+					//剩余课次充足
+					continue one;
+				}
+			}
+		}
+		Map<Integer, List<ActivityUserMapper>> collect1 = freeActivityUserMappers.stream().collect(Collectors.groupingBy(ActivityUserMapper::getUserId));
+		one:for (Integer integer : subCourseMap.keySet()) {
+			Integer subCourseNum = subCourseMap.get(integer);
+			if(subCourseNum == 0){
+				continue;
+			}
+			List<ActivityUserMapper> activityUserMapperList = collect1.get(integer);
+			for (ActivityUserMapper activityUserMapper : activityUserMapperList) {
+				if(subCourseNum == 0){
+					continue one;
+				}
+				useActivityUserMappers.add(activityUserMapper);
+				//区分vip还是网管
+				this.modifyGiveGroupId(activityUserMapper,groupId);
+				int num = activityUserMapper.getSubGiveCourseNum();
+				//剩余课次不足
+				if(num <= subCourseNum){
+					activityUserMapper.setSubGiveCourseNum(0);
+					subCourseNum = subCourseNum - num;
+					this.getStudentPayment(integer,num,BigDecimal.ZERO,courseScheduleStudentPayments);
+				}else {
+					activityUserMapper.setSubGiveCourseNum(num - subCourseNum);
+					this.getStudentPayment(integer,subCourseNum,BigDecimal.ZERO,courseScheduleStudentPayments);
+					continue one;
+				}
+			}
+			if (subCourseNum > 0){
+				throw new BizException("所选部分学员排课资格不足,请重新选择");
+			}
+		}
+		activityUserMapperDao.batchUpdate(useActivityUserMappers);
+		return courseScheduleStudentPayments;
+	}
+
+	private void modifyGroupId(ActivityUserMapper activityUserMapper,Long groupId){
+		if(activityUserMapper.getVipFlag() != 0 || activityUserMapper.getGiveVipFlag() != 0){
+			if(StringUtils.isEmpty(activityUserMapper.getVipGroupId())){
+				activityUserMapper.setVipGroupId(groupId.toString());
+			}else {
+				activityUserMapper.setVipGroupId(activityUserMapper.getVipGroupId()+","+groupId);
+			}
+			activityUserMapper.setVipFlag(2);
+		}else {
+			if(StringUtils.isEmpty(activityUserMapper.getPracticeGroupId())){
+				activityUserMapper.setPracticeGroupId(groupId.toString());
+			}else {
+				activityUserMapper.setPracticeGroupId(activityUserMapper.getPracticeGroupId()+","+groupId);
+			}
+			//虽然还有剩余价值,但是这里处理为已排课,不再考虑退费问题
+			activityUserMapper.setPracticeFlag(2);
+		}
+	}
+	private void modifyGiveGroupId(ActivityUserMapper activityUserMapper,Long groupId){
+		if(activityUserMapper.getVipFlag() != 0 || activityUserMapper.getGiveVipFlag() != 0){
+			if(StringUtils.isEmpty(activityUserMapper.getGiveVipGroupId())){
+				activityUserMapper.setGiveVipGroupId(groupId.toString());
+			}else {
+				activityUserMapper.setGiveVipGroupId(activityUserMapper.getGiveVipGroupId()+","+groupId);
+			}
+			activityUserMapper.setGiveVipFlag(2);
+		}else {
+			if(StringUtils.isEmpty(activityUserMapper.getPracticeGroupId())){
+				activityUserMapper.setGivePracticeGroupId(groupId.toString());
+			}else {
+				activityUserMapper.setGivePracticeGroupId(activityUserMapper.getGivePracticeGroupId()+","+groupId);
+			}
+			//虽然还有剩余价值,但是这里处理为已排课,不再考虑退费问题
+			activityUserMapper.setGivePracticeFlag(2);
+		}
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult createActivityPracticeGroup(PracticeGroupApplyDto practice) {
+		PracticeGroupApplyBaseInfoDto applyBaseInfo = practice.getPracticeGroupApplyBaseInfoDto();
+		List<CourseSchedule> courseSchedules = practice.getCourseSchedules();
+		Integer allCourseNum = applyBaseInfo.getAllCourseNum();
+		if (courseSchedules.size() != applyBaseInfo.getAllCourseNum()) {
+			throw new BizException("建课失败,课程数量异常");
+		}
+		if (applyBaseInfo.getSubjectId() == null) {
+			throw new BizException("请选择声部");
+		}
+		Integer studentId = applyBaseInfo.getStudentId();
+		Date now = new Date();
+
+		//获取第一节课
+		CourseSchedule firstCourseSchedule = courseSchedules.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
+		//获取最后一节课
+		CourseSchedule latestCourseSchedule = courseSchedules.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
+
+		if (firstCourseSchedule.getStartClassTime().before(now)) {
+			throw new BizException("开课时间不能小于当前时间");
+		}
+
+		applyBaseInfo.setRegistrationStartTime(now);
+		applyBaseInfo.setPaymentExpireDate(now);
+
+		if (applyBaseInfo.getRegistrationStartTime().after(applyBaseInfo.getPaymentExpireDate())) {
+			throw new BizException("报名开始时间必须在报名截至时间之前");
+		}
+
+		int repeatVipGroups = practiceGroupDao.countUserRepeatPracticeGroupInCourseStartEndTime(applyBaseInfo.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+		if (repeatVipGroups > 0) {
+			SysUser sysUser = sysUserService.queryUserById(applyBaseInfo.getUserId());
+			throw new BizException("{}课程时间冲突({}-{})", sysUser.getRealName(), DateUtil.dateToString(firstCourseSchedule.getStartClassTime(), "yyyy-MM-dd HH:mm:ss"), DateUtil.dateToString(latestCourseSchedule.getEndClassTime(), "HH:mm:ss"));
+		}
+
+		//生成网管课信息
+		Subject subject = subjectDao.get(applyBaseInfo.getSubjectId());
+		SysUser user = teacherDao.getUser(studentId);
+		StringBuffer className = new StringBuffer(subject.getName()).append("•").append(user.getUsername());
+		applyBaseInfo.setName(className.toString());
+		applyBaseInfo.setAuditStatus(AuditStatusEnum.PASS);
+		applyBaseInfo.setGroupStatus(GroupStatusEnum.NORMAL);
+
+		Teacher teacher = teacherService.get(applyBaseInfo.getUserId());
+		if (Objects.isNull(teacher)) {
+			throw new BizException("教师不存在");
+		}
+
+		//开课时间为排课的第一节课的开始时间
+		applyBaseInfo.setCoursesStartDate(firstCourseSchedule.getStartClassTime());
+		//课程结束时间为排课的最后一节课的结束时间
+		applyBaseInfo.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
+
+		applyBaseInfo.setPaymentExpireDate(DateUtil.getLastSecondWithDay(applyBaseInfo.getPaymentExpireDate()));
+		applyBaseInfo.setType(PracticeGroupType.CHARGE);
+		practiceGroupDao.insert(applyBaseInfo);
+
+		//消耗排课资格
+		List<Integer> studentIdList = new ArrayList<>();
+		studentIdList.add(studentId);
+		List<CourseScheduleStudentPayment> courseScheduleStudentPayments =
+				this.checkScheduleQualification(studentIdList,null, applyBaseInfo.getSingleClassMinutes(), applyBaseInfo.getAllCourseNum(), applyBaseInfo.getId());
+
+		//创建班级信息
+		ClassGroup classGroup = new ClassGroup();
+		classGroup.setSubjectIdList(applyBaseInfo.getSubjectId().toString());
+		classGroup.setExpectStudentNum(1);
+		classGroup.setStudentNum(1);
+		classGroup.setName(applyBaseInfo.getName());
+		classGroup.setTotalClassTimes(allCourseNum);
+		classGroup.setType(ClassGroupTypeEnum.PRACTICE);
+		classGroup.setDelFlag(0);
+		classGroup.setGroupType(GroupType.PRACTICE);
+		classGroup.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroup.setCreateTime(now);
+		classGroup.setUpdateTime(now);
+		classGroupDao.insert(classGroup);
+
+		//班级学员关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMapperList = new ArrayList<>();
+		ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+		classGroupStudentMapper.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroupStudentMapper.setClassGroupId(classGroup.getId());
+		classGroupStudentMapper.setUserId(studentId);
+		classGroupStudentMapper.setCreateTime(now);
+		classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+		classGroupStudentMapper.setGroupType(GroupType.PRACTICE);
+		classGroupStudentMapperList.add(classGroupStudentMapper);
+		classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMapperList);
+
+		//计算课程相关费用信息
+		Map<String, BigDecimal> costInfo = practiceGroupService.countPracticeGroupPredictFee(applyBaseInfo, applyBaseInfo.getUserId());
+		applyBaseInfo.setOnlineTeacherSalary(costInfo.get("onlineTeacherSalary"));
+
+		//创建班级老师关联记录
+		ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+		classGroupTeacherMapper.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+		classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherMapper.setUserId(applyBaseInfo.getUserId());
+		classGroupTeacherMapper.setGroupType(GroupType.PRACTICE);
+		classGroupTeacherMapper.setCreateTime(now);
+		classGroupTeacherMapper.setUpdateTime(now);
+		classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+		//创建班级与老师课酬记录
+		ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
+		classGroupTeacherSalary.setMusicGroupId(applyBaseInfo.getId().toString());
+		classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+		classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherSalary.setUserId(applyBaseInfo.getUserId());
+		classGroupTeacherSalary.setSalary(BigDecimal.ZERO);
+		classGroupTeacherSalary.setOnlineClassesSalary(applyBaseInfo.getOnlineTeacherSalary());
+		classGroupTeacherSalary.setGroupType(GroupType.PRACTICE);
+		classGroupTeacherSalary.setCreateTime(now);
+		classGroupTeacherSalary.setUpdateTime(now);
+		classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+		//课程信息调整
+		courseSchedules.forEach(courseSchedule -> {
+			courseSchedule.setGroupType(GroupType.PRACTICE);
+			courseSchedule.setMusicGroupId(applyBaseInfo.getId().toString());
+			courseSchedule.setTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setActualTeacherId(applyBaseInfo.getUserId());
+			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+			courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+			courseSchedule.setClassGroupId(classGroup.getId());
+			courseSchedule.setName(applyBaseInfo.getName());
+			courseSchedule.setOrganId(applyBaseInfo.getOrganId());
+		});
+
+		applyBaseInfo.setCourseScheduleJson(JSON.toJSONString(courseSchedules));
+		practiceGroupDao.update(applyBaseInfo);
+
+		//创建课程
+		courseScheduleService.batchAddCourseSchedule(courseSchedules);
+
+		//创建老师单节课课酬信息
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			//创建教师课程薪水记录
+			CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+			courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+			courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+			courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+			courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+			courseScheduleTeacherSalary.setUserId(courseSchedule.getActualTeacherId().intValue());
+			courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+			courseScheduleTeacherSalary.setExpectSalary(classGroupTeacherSalary.getOnlineClassesSalary());
+			courseScheduleTeacherSalary.setActualSalary(null);
+			courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+		}
+		if (courseScheduleTeacherSalaries.size() > 0) {
+			courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaries);
+		}
+
+		//生成学生单课缴费信息
+		PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(applyBaseInfo.getOrganId());
+		BigDecimal singleClassMinutesPrice = practiceGroupSellPrice.getSingleClassMinutesPrice();
+		for (CourseSchedule courseSchedule : courseSchedules) {
+			for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
+				courseScheduleStudentPayment.setGroupType(courseSchedule.getGroupType());
+				courseScheduleStudentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+				courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+				courseScheduleStudentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+				courseScheduleStudentPayment.setOriginalPrice(singleClassMinutesPrice);
+			}
+		}
+
+		if (courseScheduleStudentPayments.size() > 0) {
+			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+			studentDao.updateStudentServiceTag(null, studentIdList, YesOrNoEnum.YES.getCode());
+		}
+		return BaseController.succeed(applyBaseInfo.getAuditStatus().getCode());
+    }
+
 }

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

@@ -356,7 +356,7 @@ public class GroupClassServiceImpl implements GroupClassService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult quitActivityGive(ActivityUserMapper activityUserMapper, boolean confirmReturnActivityGive,Long groupId,GroupType groupType){
-        if(activityUserMapper != null){
+        /*if(activityUserMapper != null){
             if(activityUserMapper.getReturnFee()){
                 return BaseController.succeed();
             }
@@ -528,7 +528,7 @@ public class GroupClassServiceImpl implements GroupClassService {
                 practiceGroupService.update(practiceGroup);
             }
             activityUserMapperDao.update(activityUserMapper);
-        }
+        }*/
         return BaseController.succeed();
     }
 }

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

@@ -4834,8 +4834,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(practiceGroupId, "PRACTICE", studentId);
             if (activityUserMapper != null && !activityUserMapper.getReturnFee()) {
                 if (Objects.nonNull(activityUserMapper.getVipGroupId())) {
-                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
-                    vipGroupCategory = vipGroupCategoryDao.get(group.getVipGroupCategoryId().intValue());
+//                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
+//                    vipGroupCategory = vipGroupCategoryDao.get(group.getVipGroupCategoryId().intValue());
+                    vipGroupCategory = vipGroupCategoryDao.get(activityUserMapper.getCategoryId());
                     userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId().toString(), studentId, null));
                 }
                 if (Objects.nonNull(activityUserMapper.getGiveVipGroupId())) {
@@ -5191,7 +5192,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseScheduleService.checkNewCourseSchedules(practiceCourses, false, false);
         } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            String errMessage = new String();
+            String errMessage;
             if (e.getMessage().indexOf("主教冲突") != -1) {
                 errMessage = "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
             } else {
@@ -5204,7 +5205,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
         activityUserMapper.setGivePracticeFlag(2);
-        activityUserMapper.setPracticeGroupId(practiceGroupBuyParams.getId());
+//        activityUserMapper.setPracticeGroupId(practiceGroupBuyParams.getId());
         activityUserMapperService.update(activityUserMapper);
         return BaseController.succeed();
     }

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

@@ -1078,4 +1078,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
+    @Override
+    public List<BaseMapDto> queryStuSubjectId(Integer userId) {
+        return studentDao.queryStuSubjectIdByTeacherId(userId);
+    }
 }

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

@@ -767,8 +767,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         if (vipGroupActivityId != null) {
             VipGroupActivity activity = vipGroupActivityDao.get(vipGroupActivityId);
             ActivityUserMapper activityUserMapper = new ActivityUserMapper();
-            activityUserMapper.setVipGroupId(vipGroupId);
-            activityUserMapper.setPracticeGroupId(practiceGroupId);
+            activityUserMapper.setVipGroupId(vipGroupId.toString());
+            activityUserMapper.setPracticeGroupId(practiceGroupId.toString());
             activityUserMapper.setPaymentOrderId(studentPaymentOrder.getId());
             activityUserMapper.setUserId(studentPaymentOrder.getUserId());
             activityUserMapper.setActivityId(vipGroupActivityId);

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

@@ -2239,7 +2239,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             if (activityUserMapper != null) {
                 if (vipGroup.getId().equals(activityUserMapper.getGiveVipGroupId())) {
                     giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
-                } else if (vipGroup.getId().equals(activityUserMapper.getVipGroupId())) {
+                } else {
                     vipOfflineSalarySettlement = vipGroupSalarySettlementDto.getOfflineSalarySettlement();
                 }
             }
@@ -3587,19 +3587,19 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
             ActivityUserMapper activityUserMapper = activityUserMapperService.findByStudentId(vipGroupId, studentId);
             if (activityUserMapper != null && !activityUserMapper.getReturnFee()) {
                 if (Objects.nonNull(activityUserMapper.getVipGroupId())) {
-                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
+                    VipGroup group = vipGroupDao.get(vipGroupId);
                     vipGroupCategory = vipGroupCategoryService.get(group.getVipGroupCategoryId().intValue());
-                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId().toString(), studentId, null));
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId(), studentId, null));
                 }
                 if (Objects.nonNull(activityUserMapper.getGiveVipGroupId())) {
-                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getGiveVipGroupId().toString(), studentId, null));
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getGiveVipGroupId(), studentId, null));
                 }
                 if (Objects.nonNull(activityUserMapper.getPracticeGroupId())) {
                     vipGroupCategory = vipGroupCategoryService.get(1);
-                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getPracticeGroupId().toString(), studentId, null));
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getPracticeGroupId(), studentId, null));
                 }
                 if (Objects.nonNull(activityUserMapper.getGivePracticeGroupId())) {
-                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getGivePracticeGroupId().toString(), studentId, null));
+                    userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.PRACTICE, activityUserMapper.getGivePracticeGroupId(), studentId, null));
                 }
                 userCourseInfos.removeAll(Collections.singleton(null));
             } else {

+ 191 - 33
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -8,6 +8,8 @@
 	
 	<resultMap type="com.ym.mec.biz.dal.entity.ActivityUserMapper" id="ActivityUserMapper">
 		<result column="id_" property="id" />
+		<result column="single_course_time_" property="singleCourseTime" />
+		<result column="give_single_course_time_" property="giveSingleCourseTime" />
 		<result column="activity_id_" property="activityId" />
 		<result column="user_id_" property="userId" />
 		<result column="teacher_id_" property="teacherId" />
@@ -55,32 +57,39 @@
 		                                  practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 										  vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,
 		                                  member_order_id_,give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_,
-										  total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_,sub_no_course_price_)
+										  total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_,sub_no_course_price_,single_course_time_,give_single_course_time_)
 		                                  VALUES(#{activityId},#{userId},#{vipFlag},#{giveVipFlag},#{practiceFlag},
 		                                         #{givePracticeFlag},#{memberFlag},#{giveMemberFlag},NOW(),NOW(),#{paymentOrderId},#{vipGroupId},
 		                                         #{giveVipGroupId},#{practiceGroupId},#{givePracticeGroupId},#{returnFee},
 		                                         #{memberOrderId},#{giveMemberOrderId},#{teacherId},#{actualPrice},#{addMemo},#{cutMemo},#{tenantId},#{giveCouponId},
-		                                         #{totalCourseNum},#{totalGiveCourseNum},#{subCourseNum},#{subGiveCourseNum},#{subNoCoursePrice})
+		                                         #{totalCourseNum},#{totalGiveCourseNum},#{subCourseNum},#{subGiveCourseNum},#{subNoCoursePrice},#{singleCourseTime},#{giveSingleCourseTime})
 	</insert>
     <insert id="batchInsert">
 		INSERT INTO activity_user_mapper (activity_id_,user_id_,vip_flag_,give_vip_flag_,
 		practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 		vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,member_order_id_,
 		                                  give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_,
-		total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_,sub_no_course_price_)
+		total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_,sub_no_course_price_,single_course_time_,give_single_course_time_)
 		VALUES
 		<foreach collection="activityUserMappers" item="item" separator=",">
 			(#{item.activityId},#{item.userId},#{item.vipFlag},#{item.giveVipFlag},#{item.practiceFlag},
 			#{item.givePracticeFlag},#{item.memberFlag},#{item.giveMemberFlag},NOW(),NOW(),#{item.paymentOrderId},#{item.vipGroupId},
 			#{item.giveVipGroupId},#{item.practiceGroupId},#{item.givePracticeGroupId},#{item.returnFee},
 			 #{item.memberOrderId},#{item.giveMemberOrderId},#{item.teacherId},#{item.actualPrice},#{item.addMemo},#{item.cutMemo},
-			 #{item.tenantId},#{item.giveCouponId},#{item.totalCourseNum},#{item.totalGiveCourseNum},#{item.subCourseNum},#{item.subGiveCourseNum},#{item.subNoCoursePrice})
+			 #{item.tenantId},#{item.giveCouponId},#{item.totalCourseNum},#{item.totalGiveCourseNum},#{item.subCourseNum},
+			 #{item.subGiveCourseNum},#{item.subNoCoursePrice},#{item.singleCourseTime},#{item.giveSingleCourseTime})
 		</foreach>
 	</insert>
     <!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ActivityUserMapper">
 		UPDATE activity_user_mapper
 		<set>
+			<if test="singleCourseTime != null">
+				single_course_time_ = #{singleCourseTime},
+			</if>
+			<if test="giveSingleCourseTime != null">
+				give_single_course_time_ = #{giveSingleCourseTime},
+			</if>
 			<if test="totalCourseNum != null">
 				total_course_num_ = #{totalCourseNum},
 			</if>
@@ -185,8 +194,49 @@
     <update id="updateTeacherId">
 		UPDATE activity_user_mapper SET teacher_id_ = #{teacherId} WHERE user_id_ = #{userId}
 	</update>
+	<update id="batchUpdate">
+		<foreach collection="useActivityUserMappers" item="entity" separator=";">
+			UPDATE activity_user_mapper
+			<set>
+				<if test="entity.subNoCoursePrice != null">
+					sub_no_course_price_ = #{entity.subNoCoursePrice},
+				</if>
+				<if test="entity.subCourseNum != null">
+					sub_course_num_ = #{entity.subCourseNum},
+				</if>
+				<if test="entity.subGiveCourseNum != null">
+					sub_give_course_num_ = #{entity.subGiveCourseNum},
+				</if>
+				<if test="entity.vipGroupId != null">
+					vip_group_id_ = #{entity.vipGroupId},
+				</if>
+				<if test="entity.giveVipGroupId != null">
+					give_vip_group_id_ = #{entity.giveVipGroupId},
+				</if>
+				<if test="entity.practiceGroupId != null">
+					practice_group_id_ = #{entity.practiceGroupId},
+				</if>
+				<if test="entity.givePracticeGroupId != null">
+					give_practice_group_id_ = #{entity.givePracticeGroupId},
+				</if>
+				<if test="entity.givePracticeFlag != null">
+					give_practice_flag_ = #{entity.givePracticeFlag},
+				</if>
+				<if test="entity.giveVipFlag != null">
+					give_vip_flag_ = #{entity.giveVipFlag},
+				</if>
+				<if test="entity.vipFlag != null">
+					vip_flag_ = #{entity.vipFlag},
+				</if>
+				<if test="entity.practiceFlag != null">
+					practice_flag_ = #{entity.practiceFlag},
+				</if>
+				update_time_ = NOW()
+			</set>WHERE id_ = #{entity.id}
+		</foreach>
+	</update>
 
-    <!-- 根据主键删除一条记录 -->
+	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM activity_user_mapper WHERE id_ = #{id} 
 	</delete>
@@ -216,7 +266,10 @@
 	</select>
     <select id="findByStudentIdList" resultMap="ActivityUserMapper">
 		SELECT * FROM activity_user_mapper
-		WHERE activity_id_ = #{activityId} AND return_fee_ = 0 AND FIND_IN_SET(user_id_,#{studentIds})
+		WHERE return_fee_ = 0 AND FIND_IN_SET(user_id_,#{studentIds})
+		<if test="activityId != null">
+			AND activity_id_ = #{activityId}
+		</if>
 		<if test="type == 'GIVE_VIP'">
 			AND give_vip_flag_ = 1
 		</if>
@@ -336,12 +389,13 @@
 		<result property="num" column="num_"/>
 	</resultMap>
 	<select id="queryWaitCourseCategory" resultMap="CourseFormDto">
-		SELECT vgc.name_,vgc.id_,COUNT(DISTINCT aum.user_id_) num_ FROM vip_group_category vgc
-		LEFT JOIN (select category_id_,user_id_ from activity_user_mapper aum
-		WHERE aum.category_id_ > 0 AND aum.return_fee_ = 0 AND (aum.vip_flag_ = 1 OR aum.practice_flag_ = 1)
+		SELECT CASE WHEN vgc.id_ IS NULL THEN '网管课' ELSE vgc.name_ END name_,
+		CASE WHEN vgc.id_ IS NULL THEN 0 ELSE vgc.id_ END id_,COUNT(DISTINCT aum.user_id_) num_
+		FROM (select category_id_,user_id_ from activity_user_mapper aum WHERE aum.sub_course_num_ > 0 AND aum.return_fee_ = 0
 		UNION ALL
 		select give_category_id_ category_id_,user_id_ from activity_user_mapper aum
-		WHERE aum.give_category_id_ > 0 AND aum.return_fee_ = 0 AND (aum.give_vip_flag_ = 1 OR aum.give_practice_flag_ = 1)) aum ON aum.category_id_ = vgc.id_
+		WHERE aum.sub_give_course_num_ > 0 AND aum.return_fee_ = 0) aum
+		LEFT JOIN vip_group_category vgc ON aum.category_id_ = vgc.id_
 		<if test="userId != null">
 			LEFT JOIN student s ON s.user_id_ = aum.user_id_
 		</if>
@@ -365,38 +419,142 @@
 		<result property="subCourseNum" column="sub_course_num_"/>
 	</resultMap>
 	<select id="queryActivityStudentList" resultMap="ActivityUserDto">
-		SELECT aum.user_id_,su.avatar_,sj.id_ subject_id_,su.username_,sj.name_ subject_name_,
-			   SUM(CASE WHEN aum.category_id_ = #{queryInfo.categoryId}
-				<if test="queryInfo.singleCourseTime != null">
-				 AND aum.single_course_time_ = #{queryInfo.singleCourseTime}
-				</if>
-			   THEN sub_course_num_ ELSE 0 END) +
-			   SUM(CASE WHEN aum.give_category_id_ = #{queryInfo.categoryId}
-				<if test="queryInfo.singleCourseTime != null">
-					AND aum.give_single_course_time_ = #{queryInfo.singleCourseTime}
-				</if>
-			    THEN sub_give_course_num_ ELSE 0 END) sub_course_num_
-		FROM activity_user_mapper aum
+		SELECT aum.user_id_,su.avatar_,sj.id_ subject_id_,su.username_,sj.name_ subject_name_,SUM(aum.sub_course_num_) sub_course_num_
+		FROM (SELECT aum.id_,aum.user_id_,aum.sub_course_num_,aum.single_course_time_ from activity_user_mapper aum
+		WHERE aum.sub_course_num_ > 0
+		<if test="queryInfo.categoryId != null">
+			AND aum.category_id_ = #{queryInfo.categoryId}
+		</if>
+		<if test="queryInfo.categoryId == null">
+			AND aum.category_id_ IS NULL
+		</if>
+		UNION ALL
+		SELECT aum.id_,aum.user_id_,aum.sub_give_course_num_ sub_course_num_,aum.give_single_course_time_ single_course_time_ from activity_user_mapper aum
+		WHERE aum.sub_give_course_num_ > 0
+		<if test="queryInfo.categoryId != null">
+			AND aum.category_id_ = #{queryInfo.categoryId}
+		</if>
+		<if test="queryInfo.categoryId == null">
+			AND aum.category_id_ IS NULL
+		</if>
+		) aum
 		LEFT JOIN sys_user su ON su.id_ = aum.user_id_
 		LEFT JOIN student s ON s.user_id_ = aum.user_id_
 		LEFT JOIN subject sj ON sj.id_ = s.subject_id_list_
-		WHERE ((aum.category_id_ = #{queryInfo.categoryId}
-		    <if test="queryInfo.singleCourseTime != null">
+		<where>
+			<if test="queryInfo.search != null and queryInfo.search != ''">
+				AND (su.id_ = #{queryInfo.search}
+				OR su.username_ LIKE CONCAT('%',#{queryInfo.search},'%')
+				OR su.phone_ LIKE CONCAT('%',#{queryInfo.search},'%'))
+			</if>
+			<if test="queryInfo.singleCourseTime != null">
 				AND aum.single_course_time_ = #{queryInfo.singleCourseTime}
-			</if>)
-		OR (aum.give_category_id_ = #{queryInfo.categoryId}
-		<if test="queryInfo.singleCourseTime != null">
-			AND aum.give_single_course_time_ = #{queryInfo.singleCourseTime}
-		</if>))
+			</if>
+			<if test="queryInfo.organIds != null and queryInfo.organIds != ''">
+				AND FIND_IN_SET(su.organ_id_,#{queryInfo.organIds})
+			</if>
+			<if test="queryInfo.subjectIds != null and queryInfo.subjectIds != ''">
+				AND FIND_IN_SET(sj.id_,#{queryInfo.subjectIds})
+			</if>
+			<if test="queryInfo.teacherId != null">
+				AND aum.teacher_id_ = #{queryInfo.teacherId}
+			</if>
+		</where>
+		GROUP BY aum.user_id_
+	</select>
+	<select id="queryActivityCourseTimeList" resultType="java.lang.Integer">
+		select distinct aum.single_course_time_ from activity_user_mapper aum
+		<if test="queryInfo.categoryId != null and queryInfo.categoryId != ''">
+			left join sys_user su on su.id_ = aum.user_id_
+		</if>
+		where aum.return_fee_ = 0 and aum.total_course_num_ > 0
+		<if test="queryInfo.categoryId != null">
+			AND aum.category_id_ = #{queryInfo.categoryId}
+		</if>
+		<if test="queryInfo.categoryId == null">
+			AND aum.category_id_ IS NULL
+		</if>
+		<if test="queryInfo.teacherId != null">
+			AND aum.teacher_id_ = #{queryInfo.teacherId}
+		</if>
 		<if test="queryInfo.organIds != null and queryInfo.organIds != ''">
 			AND FIND_IN_SET(su.organ_id_,#{queryInfo.organIds})
 		</if>
-		<if test="queryInfo.subjectIds != null and queryInfo.subjectIds != ''">
-		  	AND FIND_IN_SET(sj.id_,#{queryInfo.subjectIds})
+		union
+		select distinct aum.give_single_course_time_ from activity_user_mapper aum
+		<if test="queryInfo.categoryId != null and queryInfo.categoryId != ''">
+			left join sys_user su on su.id_ = aum.user_id_
+		</if>
+		where aum.return_fee_ = 0 and aum.sub_give_course_num_ > 0
+		<if test="queryInfo.categoryId != null">
+			AND aum.give_category_id_ = #{queryInfo.categoryId}
+		</if>
+		<if test="queryInfo.categoryId == null">
+			AND aum.give_category_id_ IS NULL
 		</if>
 		<if test="queryInfo.teacherId != null">
-			AND s.teacher_id_ = #{queryInfo.teacherId}
+			AND aum.teacher_id_ = #{queryInfo.teacherId}
+		</if>
+		<if test="queryInfo.organIds != null and queryInfo.organIds != ''">
+			AND FIND_IN_SET(su.organ_id_,#{queryInfo.organIds})
+		</if>
+	</select>
+	<select id="findTotalByStudents" resultMap="ActivityUserMapper">
+		select aum.id_, category_id_,user_id_,sub_course_num_,vip_group_id_, give_vip_group_id_, practice_group_id_,
+		       give_practice_group_id_,actual_price_,sub_no_course_price_
+		from activity_user_mapper aum
+		WHERE aum.user_id_ IN
+		<foreach collection="studentIdList" item="userId" open="(" separator="," close=")">
+			#{userId}
+		</foreach>
+		and aum.single_course_time_ = #{classMinutes} and return_fee_ = 0 and aum.sub_course_num_ > 0
+		<if test="categoryId != null">
+			AND aum.category_id_ = #{categoryId}
+		</if>
+		<if test="categoryId == null">
+			AND aum.category_id_ IS NULL
+		</if>
+		UNION ALL
+		select aum.id_,give_category_id_ category_id_, user_id_,sub_give_course_num_ sub_course_num_,vip_group_id_, give_vip_group_id_, practice_group_id_, give_practice_group_id_,0 actual_price_,0 sub_no_course_price_
+		from activity_user_mapper aum
+		WHERE aum.user_id_ IN
+		<foreach collection="studentIdList" item="userId" open="(" separator="," close=")">
+			#{userId}
+		</foreach>
+		and aum.give_single_course_time_ = #{classMinutes} and return_fee_ = 0 and aum.sub_give_course_num_ > 0
+		<if test="categoryId != null">
+			AND aum.give_category_id_ = #{categoryId}
+		</if>
+		<if test="categoryId == null">
+			AND aum.give_category_id_ IS NULL
+		</if>
+	</select>
+	<select id="findByStudents" resultMap="ActivityUserMapper">
+		select * from activity_user_mapper aum
+		WHERE aum.user_id_ IN
+		<foreach collection="studentIdList" item="userId" open="(" separator="," close=")">
+			#{userId}
+		</foreach>
+		and aum.single_course_time_ = #{classMinutes} and return_fee_ = 0 and aum.sub_course_num_ > 0
+		<if test="categoryId != null">
+			AND aum.category_id_ = #{categoryId}
+		</if>
+		<if test="categoryId == null">
+			AND aum.category_id_ IS NULL
+		</if>
+	</select>
+	<select id="findByStudents1" resultMap="ActivityUserMapper">
+		select * from activity_user_mapper aum
+		WHERE aum.user_id_ IN
+		<foreach collection="studentIdList" item="userId" open="(" separator="," close=")">
+			#{userId}
+		</foreach>
+		and aum.give_single_course_time_ = #{classMinutes} and return_fee_ = 0 and aum.sub_give_course_num_ > 0
+		<if test="categoryId != null">
+			AND aum.give_category_id_ = #{categoryId}
+		</if>
+		<if test="categoryId == null">
+			AND aum.give_category_id_ IS NULL
 		</if>
-		GROUP BY aum.user_id_ HAVING sum(sub_course_num_) > 0 OR sum(sub_give_course_num_) > 0;
 	</select>
 </mapper>

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

@@ -1459,6 +1459,12 @@
         </where>
         GROUP BY sb.id_
     </select>
+    <select id="queryStuSubjectIdByTeacherId" resultType="com.ym.mec.biz.dal.dto.BaseMapDto">
+        select sb.id_ 'key',sb.name_ 'value' from student s
+        LEFT JOIN subject sb ON sb.id_ = s.subject_id_list_
+        WHERE s.teacher_id_ = #{userId} AND s.subject_id_list_ IS NOT NULL AND s.subject_id_list_ != ''
+        GROUP BY sb.id_
+    </select>
     <sql id="queryStudentBasicInfoSql">
         <where>
             AND su.lock_flag_ = 0 AND su.del_flag_ = 0

+ 65 - 7
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java

@@ -1,20 +1,28 @@
 package com.ym.mec.teacher.controller;
 
-import com.ym.mec.biz.dal.dto.ActivityUserDto;
-import com.ym.mec.biz.dal.dto.CourseFormDto;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
 import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
 import com.ym.mec.biz.service.ActivityUserMapperService;
 import com.ym.mec.biz.service.SysUserService;
 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 io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Objects;
 
 @Api(tags = "活动排课")
 @RequestMapping("activityUserMapper")
@@ -25,6 +33,10 @@ public class ActivityUserMapperController extends BaseController {
     private ActivityUserMapperService activityUserMapperService;
     @Autowired
     private SysUserService sysUserService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private VipGroupDefaultClassesUnitPriceDao vipGroupDefaultClassesUnitPriceDao;
 
     @ApiOperation(value = "获取老师待排课课程类型列表")
     @RequestMapping("/queryWaitCourseCategory")
@@ -34,14 +46,60 @@ public class ActivityUserMapperController extends BaseController {
 
     @ApiOperation(value = "获取活动排课学员列表")
     @PostMapping("/queryActivityStudentList")
-    public HttpResponseResult<List<ActivityUserDto>> queryActivityStudentList(ActivityUserQueryInfo activityUserQueryInfo){
-//        if(activityUserQueryInfo.getSingleCourseTime() == null){
-//            throw new IllegalArgumentException("请选择排课时间");
-//        }
+    public HttpResponseResult<List<ActivityUserDto>> queryActivityStudentList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
         if(activityUserQueryInfo.getCategoryId() == null){
-            throw new IllegalArgumentException("请选择课程类型");
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
         }
         activityUserQueryInfo.setTeacherId(sysUserService.getUserId());
         return succeed(activityUserMapperService.queryActivityStudentList(activityUserQueryInfo));
     }
+
+    @ApiOperation(value = "获取活动排课可排课时长列表")
+    @PostMapping("/queryActivityCourseTimeList")
+    public HttpResponseResult<List<Integer>> queryActivityCourseTimeList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
+        if(activityUserQueryInfo.getCategoryId() == null){
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
+        }
+        activityUserQueryInfo.setTeacherId(sysUserService.getUserId());
+        return succeed(activityUserMapperService.queryActivityCourseTimeList(activityUserQueryInfo));
+    }
+
+
+    @ApiOperation(value = "教师端活动排课")
+    @PostMapping("/createVipGroup")
+    public HttpResponseResult createVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        VipGroupApplyBaseInfoDto applyBaseInfo = vipGroupApplyDto.getVipGroupApplyBaseInfo();
+        applyBaseInfo.setUserId(sysUserService.getUserId());
+        for (CourseSchedule courseSchedule : vipGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), applyBaseInfo.getSingleClassMinutes()));
+        }
+        VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory(applyBaseInfo.getVipGroupCategoryId(), applyBaseInfo.getOrganId());
+        if(Objects.nonNull(vipGroupDefaultClassesUnitPrice)){
+            applyBaseInfo.setOnlineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice());
+            applyBaseInfo.setOfflineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
+        }
+        return activityUserMapperService.createActivityVipGroup(vipGroupApplyDto);
+    }
+
+    @ApiOperation(value = "教师端网管课活动排课")
+    @PostMapping("/createPracticeGroup")
+    public Object createPracticeGroup(@RequestBody PracticeGroupApplyDto practiceGroupApplyDto){
+        PracticeGroupApplyBaseInfoDto applyBaseInfo = practiceGroupApplyDto.getPracticeGroupApplyBaseInfoDto();
+        applyBaseInfo.setUserId(sysUserService.getUserId());
+        SysUser student = teacherDao.getUser(applyBaseInfo.getStudentId());
+        if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+            return failed("学员信息异常");
+        }
+        applyBaseInfo.setOrganId(student.getOrganId());
+        for (CourseSchedule courseSchedule : practiceGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), applyBaseInfo.getSingleClassMinutes()));
+        }
+        return activityUserMapperService.createActivityPracticeGroup(practiceGroupApplyDto);
+    }
 }

+ 9 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/StudentController.java

@@ -1,10 +1,12 @@
 package com.ym.mec.teacher.controller;
 
+import com.ym.mec.biz.dal.dto.BaseMapDto;
 import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
 import com.ym.mec.biz.service.StudentManageService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -13,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.Optional;
 
 @Api(tags = "学生管理")
@@ -49,4 +52,10 @@ public class StudentController extends BaseController {
         return succeed(studentManageService.findStudentMusicGroupsByUserId(userId));
     }
 
+    @ApiOperation(value = "获取老师关联的学员声部列表")
+    @GetMapping("/queryStuSubjectId")
+    public HttpResponseResult<List<BaseMapDto>> queryStuSubjectId(){
+        return succeed(studentManageService.queryStuSubjectId(sysUserService.getUserId()));
+    }
+
 }

+ 0 - 8
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java

@@ -4,7 +4,6 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.ActivityQueryDto;
-import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.SysConfig;
@@ -15,7 +14,6 @@ import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -47,12 +45,6 @@ public class VipGroupActivityController extends BaseController {
     @Autowired
     private StudentDao studentDao;
 
-    @ApiOperation(value = "获取老师待排课课程类型列表")
-    @RequestMapping("/queryWaitCourseCategory")
-    public HttpResponseResult<List<CourseFormDto>> queryWaitCourse(){
-        return succeed(vipGroupActivityService.queryWaitCourseCategory(sysUserService.getUserId()));
-    }
-
     @ApiOperation(value = "获取老师待排课的活动方案列表")
     @RequestMapping("/queryWaitCourseActivity")
     public Object queryWaitCourseActivity(){

+ 0 - 27
mec-web/src/main/java/com/ym/mec/web/controller/ActivityUserMapperController.java

@@ -1,17 +1,11 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.dto.ActivityUserDto;
 import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
-import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
-import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
 import com.ym.mec.biz.service.ActivityUserMapperService;
-import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.SysUserCashAccountLogService;
-import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -34,27 +28,6 @@ public class ActivityUserMapperController extends BaseController {
     private ActivityUserMapperService activityUserMapperService;
     @Autowired
     private SysUserCashAccountLogService sysUserCashAccountLogService;
-    @Autowired
-    private OrganizationService organizationService;
-
-    @ApiOperation(value = "获取老师待排课课程类型列表")
-    @PostMapping("/queryWaitCourseCategory")
-    public HttpResponseResult<List<CourseFormDto>> queryWaitCourseCategory(){
-        return succeed(activityUserMapperService.queryWaitCourseCategory(null,organizationService.getEmployeeOrgan(null)));
-    }
-
-    @ApiOperation(value = "获取活动排课学员列表")
-    @PostMapping("/queryActivityStudentList")
-    public HttpResponseResult<List<ActivityUserDto>> queryActivityStudentList(ActivityUserQueryInfo activityUserQueryInfo){
-        if(activityUserQueryInfo.getSingleCourseTime() == null){
-            throw new IllegalArgumentException("请选择排课时间");
-        }
-        if(activityUserQueryInfo.getCategoryId() == null){
-            throw new IllegalArgumentException("请选择课程类型");
-        }
-        activityUserQueryInfo.setOrganIds(organizationService.getEmployeeOrgan(activityUserQueryInfo.getOrganIds()));
-        return succeed(activityUserMapperService.queryActivityStudentList(activityUserQueryInfo));
-    }
 
     @ApiOperation(value = "添加活动排课资格")
     @PostMapping("/add")

+ 112 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduActivityUserMapperController.java

@@ -0,0 +1,112 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.VipGroupDefaultClassesUnitPrice;
+import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
+import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.SysUserService;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Objects;
+
+@Api(tags = "学员活动排课记录服务")
+@RequestMapping("eduActivityUserMapper")
+@RestController
+public class EduActivityUserMapperController extends BaseController {
+
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private VipGroupDefaultClassesUnitPriceDao vipGroupDefaultClassesUnitPriceDao;
+    @Autowired
+    private OrganizationService organizationService;
+    @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "获取老师待排课课程类型列表")
+    @PostMapping("/queryWaitCourseCategory")
+    public HttpResponseResult<List<CourseFormDto>> queryWaitCourseCategory(){
+        return succeed(activityUserMapperService.queryWaitCourseCategory(null,organizationService.getEmployeeOrgan(null)));
+    }
+
+    @ApiOperation(value = "获取活动排课学员列表")
+    @PostMapping("/queryActivityStudentList")
+    public HttpResponseResult<List<ActivityUserDto>> queryActivityStudentList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
+        if(activityUserQueryInfo.getCategoryId() == null){
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
+        }
+        activityUserQueryInfo.setOrganIds(organizationService.getEmployeeOrgan(activityUserQueryInfo.getOrganIds()));
+        return succeed(activityUserMapperService.queryActivityStudentList(activityUserQueryInfo));
+    }
+
+    @ApiOperation(value = "获取活动排课可排课时长列表")
+    @PostMapping("/queryActivityCourseTimeList")
+    public HttpResponseResult<List<Integer>> queryActivityCourseTimeList(@RequestBody ActivityUserQueryInfo activityUserQueryInfo){
+        if(activityUserQueryInfo.getCategoryId() == null){
+            throw new BizException("请选择课程类型");
+        }
+        if(activityUserQueryInfo.getCategoryId().equals(0)){
+            activityUserQueryInfo.setCategoryId(null);
+        }
+        activityUserQueryInfo.setOrganIds(organizationService.getEmployeeOrgan(activityUserQueryInfo.getOrganIds()));
+        return succeed(activityUserMapperService.queryActivityCourseTimeList(activityUserQueryInfo));
+    }
+
+    @ApiOperation(value = "管理端VIP活动排课")
+    @PostMapping("/createVipGroup")
+    public HttpResponseResult createVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        VipGroupApplyBaseInfoDto applyBaseInfo = vipGroupApplyDto.getVipGroupApplyBaseInfo();
+        if(Objects.isNull(applyBaseInfo.getUserId())){
+            throw new BizException("请选择指导老师");
+        }
+        applyBaseInfo.setEducationalTeacherId(sysUserService.getUserId());
+        for (CourseSchedule courseSchedule : vipGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), applyBaseInfo.getSingleClassMinutes()));
+        }
+        VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroupCategory(applyBaseInfo.getVipGroupCategoryId(), applyBaseInfo.getOrganId());
+        if(Objects.nonNull(vipGroupDefaultClassesUnitPrice)){
+            applyBaseInfo.setOnlineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOnlineClassesUnitPrice());
+            applyBaseInfo.setOfflineClassesUnitPrice(vipGroupDefaultClassesUnitPrice.getOfflineClassesUnitPrice());
+        }
+        return activityUserMapperService.createActivityVipGroup(vipGroupApplyDto);
+    }
+
+    @ApiOperation(value = "教师端网管课活动排课")
+    @PostMapping("/createPracticeGroup")
+    public Object createPracticeGroup(@RequestBody PracticeGroupApplyDto practiceGroupApplyDto){
+        PracticeGroupApplyBaseInfoDto applyBaseInfo = practiceGroupApplyDto.getPracticeGroupApplyBaseInfoDto();
+        if(Objects.isNull(applyBaseInfo.getUserId())){
+            throw new BizException("请选择指导老师");
+        }
+        SysUser student = teacherDao.getUser(applyBaseInfo.getStudentId());
+        if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+            return failed("学员信息异常");
+        }
+        applyBaseInfo.setOrganId(student.getOrganId());
+        for (CourseSchedule courseSchedule : practiceGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), applyBaseInfo.getSingleClassMinutes()));
+        }
+        return activityUserMapperService.createActivityPracticeGroup(practiceGroupApplyDto);
+    }
+}