浏览代码

活动排课

zouxuan 4 年之前
父节点
当前提交
d67ca4989b

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

@@ -2,10 +2,23 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 @Component
 public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapper> {
 
-	
+
+    /**
+    * @description: 获取学员排课资格
+    * @param activityId
+    * @param studentIds
+    * @param type 排课资格类型
+    * @return com.ym.mec.biz.dal.entity.ActivityUserMapper
+    * @author zx
+    * @date 2021/10/11 16:31
+    */
+    List<ActivityUserMapper> findByStudentIdList(@Param("activityId") Integer activityId, @Param("studentIds") String studentIds, @Param("type") String type);
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ActivityQueryDto;
+import com.ym.mec.biz.dal.dto.ActivityWaitCourseStudentNumDto;
 import com.ym.mec.biz.dal.dto.ExportVipGroupActivityDto;
 import com.ym.mec.biz.dal.dto.WaitCourseActivityDto;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
@@ -45,4 +46,25 @@ public interface VipGroupActivityDao extends BaseDAO<Integer, VipGroupActivity>
 	* @date 2021/10/11 11:17
 	*/
     List<WaitCourseActivityDto> queryWaitCourseActivity(Integer teacherId);
+
+    /**
+    * @description: 获取活动待排课学员数量
+     * @param userId
+     * @param activityId
+    * @return com.ym.mec.biz.dal.dto.ActivityWaitCourseStudentNumDto
+    * @author zx
+    * @date 2021/10/11 14:37
+    */
+    ActivityWaitCourseStudentNumDto getActivityWaitCourseStudentNum(@Param("userId") Integer userId, @Param("activityId") Integer activityId);
+
+    /**
+    * @description: 获取活动学员课排课次数
+     * @param userId
+     * @param activityId
+    * @return com.ym.mec.biz.dal.dto.ActivityWaitCourseStudentNumDto
+    * @author zx
+    * @date 2021/10/11 15:02
+    */
+	ActivityWaitCourseStudentNumDto getActivityStudentCanCourseNum(@Param("userId") Integer userId, @Param("activityId") Integer activityId);
+
 }

+ 76 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityWaitCourseStudentNumDto.java

@@ -0,0 +1,76 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+
+public class ActivityWaitCourseStudentNumDto{
+
+    private VipGroupActivity vipGroupActivity;
+
+    private Integer vipNum;
+
+    private Integer practiceNum;
+
+    private Integer giveVipNum;
+
+    private Integer givePracticeNum;
+
+    private String username;
+
+    private String avatar;
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public VipGroupActivity getVipGroupActivity() {
+        return vipGroupActivity;
+    }
+
+    public void setVipGroupActivity(VipGroupActivity vipGroupActivity) {
+        this.vipGroupActivity = vipGroupActivity;
+    }
+
+    public Integer getVipNum() {
+        return vipNum;
+    }
+
+    public void setVipNum(Integer vipNum) {
+        this.vipNum = vipNum;
+    }
+
+    public Integer getPracticeNum() {
+        return practiceNum;
+    }
+
+    public void setPracticeNum(Integer practiceNum) {
+        this.practiceNum = practiceNum;
+    }
+
+    public Integer getGiveVipNum() {
+        return giveVipNum;
+    }
+
+    public void setGiveVipNum(Integer giveVipNum) {
+        this.giveVipNum = giveVipNum;
+    }
+
+    public Integer getGivePracticeNum() {
+        return givePracticeNum;
+    }
+
+    public void setGivePracticeNum(Integer givePracticeNum) {
+        this.givePracticeNum = givePracticeNum;
+    }
+}

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

@@ -11,9 +11,6 @@ import java.util.List;
 
 public class PracticeGroupApplyBaseInfoDto extends PracticeGroup {
 
-    @ApiModelProperty(value = "科目编号列表")
-    private String subjectIdList;
-
     @ApiModelProperty(value = "课时总数")
     private Integer allCourseNum;
 
@@ -71,14 +68,6 @@ public class PracticeGroupApplyBaseInfoDto extends PracticeGroup {
         this.activityCourseType = activityCourseType;
     }
 
-    public String getSubjectIdList() {
-        return subjectIdList;
-    }
-
-    public void setSubjectIdList(String subjectIdList) {
-        this.subjectIdList = subjectIdList;
-    }
-
     public BigDecimal getOnlineTeacherSalary() {
         return onlineTeacherSalary;
     }

+ 11 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyDto.java

@@ -1,8 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
@@ -23,11 +21,22 @@ public class VipGroupApplyDto {
     @ApiModelProperty(value = "课程组只能是正常状态")
     private boolean onlyProgress;
 
+    @ApiModelProperty(value = "是否赠送课程")
+    private Boolean giveFlag;
+
     private BigDecimal singleClassPrice;
 
     @ApiModelProperty(value = "是否允许超出活动允许的学生使用次数")
     private Boolean allowOverstepActivityStudentNum = false;
 
+    public Boolean getGiveFlag() {
+        return giveFlag;
+    }
+
+    public void setGiveFlag(Boolean giveFlag) {
+        this.giveFlag = giveFlag;
+    }
+
     public Boolean getAllowOverstepActivityStudentNum() {
         return allowOverstepActivityStudentNum;
     }

+ 23 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupActivityService.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.ActivityQueryDto;
-import com.ym.mec.biz.dal.dto.ExportVipGroupActivityDto;
-import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
-import com.ym.mec.biz.dal.dto.WaitCourseActivityDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
 import com.ym.mec.common.service.BaseService;
@@ -43,9 +40,30 @@ public interface VipGroupActivityService extends BaseService<Integer, VipGroupAc
     /**
     * @description: 获取老师待排课的活动方案列表
      * @param
-    * @return java.lang.Object
+    * @return List<WaitCourseActivityDto>
     * @author zx
     * @date 2021/10/11 11:12
     */
     List<WaitCourseActivityDto> queryWaitCourseActivity(Integer teacherId);
+
+
+    /**
+    * @description: 获取活动待排课学员数量
+     * @param userId
+ * @param activityId
+    * @return ActivityWaitCourseStudentNumDto
+    * @author zx
+    * @date 2021/10/11 14:36
+    */
+    ActivityWaitCourseStudentNumDto getActivityWaitCourseStudentNum(Integer userId, Integer activityId);
+
+    /**
+    * @description: 获取活动学员课排课次数
+     * @param userId
+     * @param activityId
+    * @return com.ym.mec.biz.dal.dto.ActivityWaitCourseStudentNumDto
+    * @author zx
+    * @date 2021/10/11 15:00
+    */
+    ActivityWaitCourseStudentNumDto getActivityStudentCanCourseNum(Integer userId, Integer activityId);
 }

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

@@ -50,6 +50,15 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
      */
     HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup);
 
+    /**
+     * @describe 创建vip课
+     * @author Joburgess
+     * @date 2019/10/30
+     * @param vipGroup: VIP课申请信息
+     * @return void
+     */
+    HttpResponseResult createActivityVipGroup1(VipGroupApplyDto vipGroup);
+
     HttpResponseResult importActivityVipGroup(String data);
 
     /**

+ 24 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -4282,11 +4282,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
         TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(teacherId,practiceCourseMinutes);
 
-        BigDecimal teacherDefaultSalary=null;
-        if(Objects.nonNull(teacherDefaultPracticeGroupSalary)){
-            teacherDefaultSalary = teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
-        }
-        if(teacherDefaultSalary == null){
+        BigDecimal teacherDefaultSalary = BigDecimal.ZERO;
+        if(Objects.isNull(teacherDefaultPracticeGroupSalary)){
             throw new BizException("请设置老师课酬");
         }
         PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(practice.getOrganId());
@@ -4298,20 +4295,32 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         BigDecimal onlineClassNum = new BigDecimal(practice.getAllCourseNum());
         BigDecimal totalPrice = practiceGroupSellPrice.getSingleClassMinutesPrice().multiply(onlineClassNum);
         //课程购买费用计算
+        VipGroupSalarySettlementTypeDto salarySettlement = null;
         if(practice.getVipGroupActivityId() != null){
             VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(practice.getVipGroupActivityId());
             VipGroupSalarySettlementDto vipGroupSalarySettlementDto = JSON.parseObject(vipGroupActivity.getSalarySettlementJson(), VipGroupSalarySettlementDto.class);
             if(Objects.isNull(vipGroupSalarySettlementDto)){
                 throw new BizException("课酬结算方案错误");
             }
-            VipGroupSalarySettlementTypeDto salarySettlement = vipGroupSalarySettlementDto.getPracticeSalarySettlement();
-            if(salarySettlement.getSalarySettlementType() != null && salarySettlement.getSalarySettlementType() == FIXED_SALARY){
-                teacherDefaultSalary = salarySettlement.getSettlementValue();
-            }
+            salarySettlement = vipGroupSalarySettlementDto.getPracticeSalarySettlement();
             totalPrice = totalPrice.multiply(vipGroupActivity.getDiscount()).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
         }
+        //教师课酬线上单课酬计算
+        teacherDefaultSalary = teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
+        if(Objects.nonNull(salarySettlement)){
+            switch (salarySettlement.getSalarySettlementType()){
+                case TEACHER_DEFAULT:
+                    break;
+                case FIXED_SALARY:
+                    results.put("onlineTeacherSalary",salarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+                    break;
+                default:
+                    throw new BizException("错误的课酬结算标准!");
+            }
+        }
+
         results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
-        results.put("onlineTeacherSalary",teacherDefaultSalary);
+        results.put("onlineTeacherSalary",teacherDefaultSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
         return results;
     }
 
@@ -4393,13 +4402,13 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
 
         //生成网管课信息
-        List<String> bySubIds = subjectDao.findBySubIds(applyBaseInfoDto.getSubjectIdList());
-        StringBuffer className = new StringBuffer(StringUtils.join(bySubIds,","));
+        Subject subject = subjectDao.get(applyBaseInfoDto.getSubjectId());
+        StringBuffer className = new StringBuffer(subject.getName());
         className.append("•").append(userName);
         applyBaseInfoDto.setName(className.toString());
 
         //计算课程相关费用信息
-        Map<String, BigDecimal> costInfo = countPracticeGroupPredictFee(applyBaseInfoDto,studentId, null);
+        Map<String, BigDecimal> costInfo = countPracticeGroupPredictFee(applyBaseInfoDto,applyBaseInfoDto.getUserId(), null);
 
         applyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
 
@@ -4418,7 +4427,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if(Objects.isNull(teacher.getTeacherOrganId())){
             throw new BizException("教师部门异常");
         }
-        applyBaseInfoDto.setOrganId(teacher.getOrganId());
+//        applyBaseInfoDto.setOrganId(teacher.getOrganId());
 //        开课时间为排课的第一节课的开始时间
         applyBaseInfoDto.setCoursesStartDate(firstCourseSchedule.getStartClassTime());
         //课程结束时间为排课的最后一节课的结束时间
@@ -4434,7 +4443,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         //创建班级信息
         ClassGroup classGroup = new ClassGroup();
-        classGroup.setSubjectIdList(applyBaseInfoDto.getSubjectIdList());
+        classGroup.setSubjectIdList(applyBaseInfoDto.getSubjectId().toString());
         classGroup.setExpectStudentNum(1);
         classGroup.setStudentNum(1);
         classGroup.setName(applyBaseInfoDto.getName());

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

@@ -171,4 +171,16 @@ public class VipGroupActivityServiceImpl extends BaseServiceImpl<Integer, VipGro
     public List<WaitCourseActivityDto> queryWaitCourseActivity(Integer teacherId) {
 		return vipGroupActivityDao.queryWaitCourseActivity(teacherId);
     }
+
+    @Override
+    public ActivityWaitCourseStudentNumDto getActivityWaitCourseStudentNum(Integer userId, Integer activityId) {
+		ActivityWaitCourseStudentNumDto activityWaitCourseStudentNum = vipGroupActivityDao.getActivityWaitCourseStudentNum(userId, activityId);
+		activityWaitCourseStudentNum.setVipGroupActivity(vipGroupActivityDao.get(activityId));
+		return activityWaitCourseStudentNum;
+    }
+
+	@Override
+	public ActivityWaitCourseStudentNumDto getActivityStudentCanCourseNum(Integer userId, Integer activityId) {
+		return vipGroupActivityDao.getActivityStudentCanCourseNum(userId,activityId);
+	}
 }

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

@@ -171,6 +171,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private CloudTeacherOrderService cloudTeacherOrderService;
 	@Autowired
 	private StudentService studentService;
+	@Autowired
+	private ActivityUserMapperDao activityUserMapperDao;
 
 	private static final Logger LOGGER = LoggerFactory
 			.getLogger(VipGroup.class);
@@ -887,6 +889,328 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public HttpResponseResult createActivityVipGroup1(VipGroupApplyDto vipGroup) {
+		VipGroupApplyBaseInfoDto applyBaseInfo = vipGroup.getVipGroupApplyBaseInfo();
+		if(applyBaseInfo.getVipGroupActivityId() == null){
+			throw new BizException("请选择活动");
+		}
+		VipGroupActivity activity = vipGroupActivityDao.get(applyBaseInfo.getVipGroupActivityId());
+		if (Objects.isNull(activity)){
+			throw new BizException("活动信息不存在");
+		}
+		if (Objects.isNull(applyBaseInfo.getUserId())){
+			throw new BizException("请选择指导老师");
+		}
+
+		if(vipGroup.getCourseSchedules().size()!=(applyBaseInfo.getOfflineClassesNum() + applyBaseInfo.getOnlineClassesNum())){
+			throw new BizException("建课失败,当前课程存在未排课课程,请调整相关设置");
+		}
+
+		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(vipGroup.getGiveFlag()){
+			applyBaseInfo.setVipGroupCategoryId(Integer.parseInt(activity.getGiveCategoryId()));
+		}else {
+			applyBaseInfo.setVipGroupCategoryId(Integer.parseInt(activity.getVipGroupCategoryIdList()));
+		}
+
+		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.getOfflineClassesNum()>0 && Objects.isNull(applyBaseInfo.getTeacherSchoolId())){
+			throw new BizException("请设置教学点");
+		}
+
+		String studentIds = applyBaseInfo.getStudentIdList();
+		if(StringUtils.isBlank(studentIds)){
+			throw new BizException("请选择学员");
+		}
+		List<Integer> studentIdList = Arrays.stream(studentIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+		//获取学员排课资格
+		List<ActivityUserMapper> activityUserMappers = activityUserMapperDao.findByStudentIdList(activity.getId(),studentIds,"GIVE_VIP");
+		if(studentIdList.size() != activityUserMappers.size()){
+			throw new BizException("所选学员暂无排课资格");
+		}
+
+		Date now=new Date();
+
+		if(Objects.isNull(applyBaseInfo.getOfflineClassesUnitPrice()) && Objects.isNull(applyBaseInfo.getOnlineClassesUnitPrice())){
+			throw new BizException("请设置课程单价");
+		}
+
+		if(StringUtils.isBlank(applyBaseInfo.getStudentIdList())){
+			throw new BizException("请选择学员");
+		}
+
+		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("报名开始时间必须在报名截至时间之前");
+		}
+
+		List<Integer> canBuyStudentIds = Arrays.stream(applyBaseInfo.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+		List<VipGroupStudentCoursePrice> vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+
+		//判断课程安排是否超出范围
+		if((Objects.nonNull(activity.getCoursesEndTime()) || Objects.nonNull(activity.getCoursesStartTime()))){
+			if(latestCourseSchedule.getEndClassTime().after(activity.getCoursesEndTime())
+					||firstCourseSchedule.getStartClassTime().before(activity.getCoursesStartTime())){
+				throw new BizException("课时安排时间超出范围!");
+			}
+		}else{
+			VipGroupDefaultClassesCycle vipGroupDefaultClassesCycle = vipGroupDefaultClassesCycleDao.findByOrganAndClassTimes(totalClassTimes);
+
+			if (vipGroupDefaultClassesCycle != null) {
+				int month = DateUtil.monthsBetween(firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+				if (month > vipGroupDefaultClassesCycle.getMonth()) {
+					throw new BizException("课时安排时间超出范围!");
+				}
+			}
+		}
+
+		if(Objects.nonNull(activity.getMinCourseNum()) && activity.getMinCourseNum() != -1 && Objects.nonNull(activity.getMaxCourseNum())
+				&& activity.getMaxCourseNum()!=-1){
+			Integer requestCourseNum = applyBaseInfo.getOnlineClassesNum() + applyBaseInfo.getOfflineClassesNum();
+			if(requestCourseNum.compareTo(activity.getMinCourseNum())<0 || requestCourseNum.compareTo(activity.getMaxCourseNum())>0){
+				throw new BizException("该活动课时数为{}节~{}节", activity.getMinCourseNum(), activity.getMaxCourseNum());
+			}
+		}
+
+		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"));
+		}
+
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(applyBaseInfo.getVipGroupCategoryId());
+		if(Objects.isNull(vipGroupCategory)){
+			throw new BizException("课程形式不存在");
+		}
+		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);
+
+		if(CollectionUtils.isEmpty(vscps)){
+			vscps = new ArrayList<>();
+			for (Integer canBuyStudentId : canBuyStudentIds) {
+				vscps.add(new VipGroupStudentCoursePrice(canBuyStudentId, applyBaseInfo.getOfflineClassesUnitPrice(), applyBaseInfo.getOfflineClassesUnitPrice(), applyBaseInfo.getTotalPrice()));
+			}
+		}
+		Teacher teacher = teacherService.get(applyBaseInfo.getUserId());
+		if(Objects.isNull(teacher)){
+			throw new BizException("教师不存在");
+		}
+
+		//开课时间为排课的第一节课的开始时间
+		applyBaseInfo.setCourseStartDate(firstCourseSchedule.getStartClassTime());
+		//课程结束时间为排课的最后一节课的结束时间
+		applyBaseInfo.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
+
+		applyBaseInfo.setPaymentExpireDate(DateUtil.getLastSecondWithDay(applyBaseInfo.getPaymentExpireDate()));
+
+		vipGroupDao.insert(applyBaseInfo);
+
+		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 = countVipGroupPredictFee1(applyBaseInfo,applyBaseInfo.getUserId(), null);
+		if(vipGroup.getGiveFlag()){
+			applyBaseInfo.setOnlineTeacherSalary(costInfo.get("giveOnlineTeacherSalary"));
+			applyBaseInfo.setOfflineTeacherSalary(costInfo.get("giveOfflineTeacherSalary"));
+		}else {
+			applyBaseInfo.setOnlineTeacherSalary(costInfo.get("onlineTeacherSalary"));
+			applyBaseInfo.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
+		}
+		applyBaseInfo.setTotalPrice(costInfo.get("totalPrice"));
+		vipGroupDao.update(applyBaseInfo);
+
+		//创建班级老师关联记录
+		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.getOnlineTeacherSalary());
+		classGroupTeacherSalary.setGroupType(GroupType.VIP);
+		classGroupTeacherSalary.setCreateTime(now);
+		classGroupTeacherSalary.setUpdateTime(now);
+		classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+		//课程信息调整
+		vipGroup.getCourseSchedules().forEach(courseSchedule -> {
+			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());
+		});
+
+		applyBaseInfo.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
+		vipGroupDao.update(applyBaseInfo);
+
+		//创建课程
+		List<CourseSchedule> courseSchedules = vipGroup.getCourseSchedules();
+		courseScheduleService.batchAddCourseSchedule(courseSchedules);
+		//创建老师单节课课酬信息
+		courseScheduleTeacherSalaryService.createCourseScheduleTeacherVipSalary(applyBaseInfo,
+				courseSchedules,
+				classGroupTeacherSalary.getOnlineClassesSalary(),
+				classGroupTeacherSalary.getSalary());
+
+		SysUser sysUser = sysUserFeignService.queryUserById(applyBaseInfo.getUserId());
+
+		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
+
+		Map<Integer,String> userRoleMap = new HashMap<>();
+		if(Objects.nonNull(applyBaseInfo.getEducationalTeacherId())){
+			userRoleMap.put(applyBaseInfo.getEducationalTeacherId(),"乐团主管");
+		}
+		userRoleMap.put(applyBaseInfo.getUserId(),"指导老师");
+		//生成学生单课缴费信息
+		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
+			if(vipGroup.getGiveFlag()){
+				List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
+				BigDecimal coursePrice = BigDecimal.ZERO;
+				for (CourseSchedule courseSchedule : courseSchedules) {
+					CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+					courseScheduleStudentPayment.setUserId(classGroupStudent.getUserId());
+					courseScheduleStudentPayment.setGroupType(courseSchedule.getGroupType());
+					courseScheduleStudentPayment.setMusicGroupId(courseSchedule.getMusicGroupId());
+					courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+					courseScheduleStudentPayment.setClassGroupId(courseSchedule.getClassGroupId());
+					if(ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+						courseScheduleStudentPayment.setExpectPrice(coursePrice);
+						courseScheduleStudentPayment.setOriginalPrice(coursePrice);
+					}else{
+						courseScheduleStudentPayment.setExpectPrice(BigDecimal.ZERO);
+						courseScheduleStudentPayment.setOriginalPrice(BigDecimal.ZERO);
+					}
+					courseScheduleStudentPayment.setActualPrice(courseScheduleStudentPayment.getExpectPrice());
+					courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+				}
+				courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+			}else{
+				courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentForVipGroup(applyBaseInfo.getId(),classGroupStudent.getUserId());
+			}
+			userRoleMap.put(classGroupStudent.getUserId(),null);
+			studentDao.updateStudentServiceTag(classGroupStudent.getUserId(), null, YesOrNoEnum.YES.getCode());
+		}
+
+		courseScheduleService.checkNewCourseSchedules(courseSchedules, false,false);
+
+		try {
+			imGroupService.create(classGroup.getId().longValue(), null, classGroup.getName(), classGroup.getName(), applyBaseInfo.getName(), null, null, GroupType.VIP.getCode());
+			imGroupMemberService.join(classGroup.getId().longValue(), userRoleMap);
+			imUserFriendService.refreshGroupImUserFriend(classGroup.getMusicGroupId(),classGroup.getGroupType());
+			//发送推送
+			Map<Integer,String> map = new HashMap<>(1);
+			map.put(applyBaseInfo.getUserId(),sysUser.getPhone());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH,
+					map,null,0,"","TEACHER", StringUtils.join(studentNames, ","),applyBaseInfo.getName());
+
+			Map<Integer,String> studentIdStrMap = new HashMap<>(1);
+			studentIdList.forEach(id->studentIdStrMap.put(id, id.toString()));
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH, studentIdStrMap, null, 0, "","STUDENT",
+					applyBaseInfo.getName());
+		} catch (Exception e) {
+			e.printStackTrace();
+			LOGGER.error("消息发送失败:{}", e);
+		}
+		return BaseController.succeed(applyBaseInfo.getAuditStatus().getCode());
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public HttpResponseResult importActivityVipGroup(String data) {
 		if(StringUtils.isBlank(data)){
@@ -1800,7 +2124,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     public <K extends VipGroup> Map<String,BigDecimal> countVipGroupPredictFee1(K vipGroup,
 																			   Integer teacherId,
 																			   Long courseId){
-
 		if(Objects.isNull(teacherId)){
 			throw new BizException("请指定教师");
 		}
@@ -1825,142 +2148,183 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("请设置教师VIP课课酬");
 		}
 
-		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
-
 		Map<String,BigDecimal> results=new HashMap<>(1);
 
 		int normalStudentNum = 0;
 		if(Objects.nonNull(courseId)){
 			normalStudentNum = courseScheduleStudentPaymentDao.countStudentNum(courseId.intValue());
 		}
-		if(normalStudentNum<=0&&Objects.nonNull(vipGroup.getId())){
+		if(normalStudentNum<=0 && Objects.nonNull(vipGroup.getId())){
 			normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(GroupType.VIP, vipGroup.getId().toString());
 		}
 
-		if(!vipGroupCategory.getMusicTheory()&&Objects.isNull(vipGroupActivity)){
-			throw new BizException("活动设置错误");
-		}
-
-		if(!vipGroupCategory.getMusicTheory()){
+		VipGroupSalarySettlementTypeDto vipOnlineSalarySettlement = null;
+		VipGroupSalarySettlementTypeDto giveVipOnlineSalarySettlement = null;
+		VipGroupSalarySettlementTypeDto vipOfflineSalarySettlement = null;
+		VipGroupSalarySettlementTypeDto giveVipOfflineSalarySettlement = null;
+		BigDecimal discount = new BigDecimal(100);
+		if(vipGroup.getVipGroupActivityId() != null){
+			VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
+			discount = vipGroupActivity.getDiscount();
 			VipGroupSalarySettlementDto vipGroupSalarySettlementDto = JSON.parseObject(vipGroupActivity.getSalarySettlementJson(), VipGroupSalarySettlementDto.class);
-
 			if(Objects.isNull(vipGroupSalarySettlementDto)){
 				throw new BizException("课酬结算方案错误");
 			}
+			vipOnlineSalarySettlement = vipGroupSalarySettlementDto.getVipOnlineSalarySettlement();
+			giveVipOnlineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOnlineSalarySettlement();
+			vipOfflineSalarySettlement = vipGroupSalarySettlementDto.getVipOfflineSalarySettlement();
+			giveVipOfflineSalarySettlement = vipGroupSalarySettlementDto.getGiveVipOfflineSalarySettlement();
+		}
 
-			BigDecimal offlineClassNum=new BigDecimal(vipGroup.getOfflineClassesNum());
-			BigDecimal onlineClassNum=new BigDecimal(vipGroup.getOnlineClassesNum());
-			BigDecimal onlineClassesUnitPrice=vipGroup.getOnlineClassesUnitPrice();
-			if(Objects.isNull(onlineClassesUnitPrice)){
-				throw new BizException("课程单价异常");
-			}
-			BigDecimal onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
+		BigDecimal offlineClassNum=new BigDecimal(vipGroup.getOfflineClassesNum());
+		BigDecimal onlineClassNum=new BigDecimal(vipGroup.getOnlineClassesNum());
+		BigDecimal onlineClassesUnitPrice=vipGroup.getOnlineClassesUnitPrice();
+		if(Objects.isNull(onlineClassesUnitPrice)){
+			throw new BizException("课程单价异常");
+		}
+		BigDecimal onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
 
-			BigDecimal offlineClassesUnitPrice=vipGroup.getOfflineClassesUnitPrice();
-			if(Objects.isNull(offlineClassesUnitPrice)){
-				throw new BizException("课程单价异常");
-			}
-			BigDecimal offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
-			BigDecimal totalClassNum = offlineClassNum.add(onlineClassNum);
-			BigDecimal teacherOnlineSalary=null,teacherOfflineSalary=null;
+		BigDecimal offlineClassesUnitPrice=vipGroup.getOfflineClassesUnitPrice();
+		if(Objects.isNull(offlineClassesUnitPrice)){
+			throw new BizException("课程单价异常");
+		}
+		BigDecimal offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
+		BigDecimal teacherOnlineSalary=null,teacherOfflineSalary=null;
+		BigDecimal giveTeacherOnlineSalary=null,giveTeacherOfflineSalary=null;
 
-			//课程购买费用计算
-			BigDecimal totalPrice = onlineVipGroupCharge.add(offlineVipGroupCharge);
-			totalPrice = totalPrice.multiply(vipGroupActivity.getDiscount()).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+		//课程购买费用计算
+		BigDecimal totalPrice = onlineVipGroupCharge.add(offlineVipGroupCharge);
+		totalPrice = totalPrice.multiply(discount).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
-			results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
-			vipGroup.setTotalPrice(totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
+		results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
+		vipGroup.setTotalPrice(totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
 
-			VipGroupSalarySettlementTypeDto vipOnlineSalarySettlement = vipGroupSalarySettlementDto.getVipOnlineSalarySettlement();
-			//教师课酬线上单课酬计算
-			if(Objects.nonNull(vipOnlineSalarySettlement)){
-				if(Objects.isNull(teacherOnlineSalary)){
-					switch (vipOnlineSalarySettlement.getSalarySettlementType()){
-						case TEACHER_DEFAULT:
-							teacherOnlineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		//教师课酬线上单课酬计算
+		if(Objects.nonNull(vipOnlineSalarySettlement)){
+			if(Objects.isNull(teacherOnlineSalary)){
+				switch (vipOnlineSalarySettlement.getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(vipGroupCategory.getMusicTheory()){
+							teacherOnlineSalary = teacherDefaultVipGroupSalary.getOnlineClassesSalary().multiply(new BigDecimal(normalStudentNum>5?5:normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 							results.put("onlineTeacherSalary",teacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
-							break;
-						case FIXED_SALARY:
-							results.put("onlineTeacherSalary",vipOnlineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
-							break;
-						default:
-							throw new BizException("错误的课酬结算标准!");
-					}
-
-				}
-			}
-
-			//教师线下单课酬计算
-			VipGroupSalarySettlementTypeDto vipOfflineSalarySettlement = vipGroupSalarySettlementDto.getVipOfflineSalarySettlement();
-			if(Objects.nonNull(vipOfflineSalarySettlement)){
-				if(Objects.isNull(teacherOfflineSalary)){
-					switch (vipOfflineSalarySettlement.getSalarySettlementType()){
-						case TEACHER_DEFAULT:
-							teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-							results.put("offlineTeacherSalary",teacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
-							break;
-						case FIXED_SALARY:
-							results.put("offlineTeacherSalary",vipOfflineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
-							break;
-						default:
-							throw new BizException("错误的课酬结算标准!");
-					}
+						}else {
+							teacherOnlineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+							results.put("onlineTeacherSalary",teacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}
+						break;
+					case FIXED_SALARY:
+						results.put("onlineTeacherSalary",vipOnlineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("错误的课酬结算标准!");
 				}
-			}
 
-			BigDecimal ots = results.get("onlineTeacherSalary");
-			if(Objects.isNull(ots)){
-				ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
 			}
-			if(Objects.isNull(ots)){
-				ots = BigDecimal.ZERO;
-			}
-			BigDecimal ofts = results.get("offlineTeacherSalary");
-			if(Objects.isNull(ofts)){
-				ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-			}
-			if(Objects.isNull(ofts)){
-				ofts = BigDecimal.ZERO;
-			}
-			if(Objects.nonNull(vipGroup.getStatus())&&normalStudentNum!=vipGroupCategory.getStudentNum()){
-				ots = ots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-				ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-			}
-
-			results.put("onlineTeacherSalary", ots);
-			results.put("offlineTeacherSalary", ofts);
 		}
+		//教师课酬赠送线上单课酬计算
+		if(Objects.nonNull(giveVipOnlineSalarySettlement)){
+			if(Objects.isNull(giveTeacherOnlineSalary)){
+				switch (giveVipOnlineSalarySettlement.getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(vipGroupCategory.getMusicTheory()){
+							giveTeacherOnlineSalary = teacherDefaultVipGroupSalary.getOnlineClassesSalary().multiply(new BigDecimal(normalStudentNum>5?5:normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+							results.put("giveOnlineTeacherSalary",giveTeacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}else {
+							giveTeacherOnlineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+							results.put("giveOnlineTeacherSalary",giveTeacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}
+						break;
+					case FIXED_SALARY:
+						results.put("giveOnlineTeacherSalary",giveVipOnlineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("错误的课酬结算标准!");
+				}
 
-		if(vipGroupCategory.getMusicTheory()){
-			BigDecimal ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-			BigDecimal ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-			if(Objects.nonNull(vipGroup.getStatus())&&vipGroupCategory.getMusicTheory()){
-				ots = ots.multiply(new BigDecimal(normalStudentNum>5?5:normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-				ofts = ofts.multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 			}
-			results.put("totalPrice",vipGroup.getTotalPrice());
-			results.put("onlineTeacherSalary",ots);
-			results.put("offlineTeacherSalary",ofts);
 		}
 
-		if(vipGroup instanceof VipGroupApplyBaseInfoDto&&!CollectionUtils.isEmpty(((VipGroupApplyBaseInfoDto)vipGroup).getVipGroupStudentCoursePrices())){
-			if(vipGroupCategory.getMusicTheory()){
-				vipGroup.setTotalPrice(new BigDecimal(0));
-			}
-			for (VipGroupStudentCoursePrice vscp : ((VipGroupApplyBaseInfoDto)vipGroup).getVipGroupStudentCoursePrices()) {
-				if(!vipGroupCategory.getMusicTheory()){
-					results.put(vscp.getStudentId().toString(), vipGroup.getTotalPrice());
-					continue;
+		//教师线下单课酬计算
+		if(Objects.nonNull(vipOfflineSalarySettlement)){
+			if(Objects.isNull(teacherOfflineSalary)){
+				switch (vipOfflineSalarySettlement.getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(vipGroupCategory.getMusicTheory()){
+							teacherOfflineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary().multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+							results.put("offlineTeacherSalary",teacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}else {
+							teacherOfflineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+							results.put("offlineTeacherSalary",teacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}
+						break;
+					case FIXED_SALARY:
+						results.put("offlineTeacherSalary",vipOfflineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("错误的课酬结算标准!");
 				}
-				if(Objects.isNull(vscp.getOnlineClassesUnitPrice())||Objects.isNull(vscp.getOfflineClassesUnitPrice())){
-					throw new BizException("请设置课程单价");
+			}
+		}
+		//教师赠送线下单课酬计算
+		if(Objects.nonNull(giveVipOfflineSalarySettlement)){
+			if(Objects.isNull(giveTeacherOfflineSalary)){
+				switch (giveVipOfflineSalarySettlement.getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(vipGroupCategory.getMusicTheory()){
+							giveTeacherOfflineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary().multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+							results.put("giveOfflineTeacherSalary",giveTeacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}else {
+							giveTeacherOfflineSalary = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+							results.put("giveOfflineTeacherSalary",giveTeacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						}
+						break;
+					case FIXED_SALARY:
+						results.put("giveOfflineTeacherSalary",giveVipOfflineSalarySettlement.getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("错误的课酬结算标准!");
 				}
-				vscp.setPaymentPrice(vscp.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroup.getOfflineClassesNum())).add(vscp.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroup.getOnlineClassesNum()))));
-				vipGroup.setTotalPrice(vipGroup.getTotalPrice().add(vscp.getPaymentPrice()));
-				results.put(vscp.getStudentId().toString(), vscp.getPaymentPrice());
 			}
 		}
 
+		BigDecimal ots = results.get("onlineTeacherSalary");
+		if(Objects.isNull(ots)){
+			ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(ots)){
+			ots = BigDecimal.ZERO;
+		}
+		BigDecimal ofts = results.get("offlineTeacherSalary");
+		if(Objects.isNull(ofts)){
+			ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(ofts)){
+			ofts = BigDecimal.ZERO;
+		}
+		BigDecimal gots = results.get("giveOnlineTeacherSalary");
+		if(Objects.isNull(gots)){
+			gots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(gots)){
+			gots = BigDecimal.ZERO;
+		}
+		BigDecimal gofts = results.get("giveOfflineTeacherSalary");
+		if(Objects.isNull(gofts)){
+			gofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(gofts)){
+			gofts = BigDecimal.ZERO;
+		}
+//			if(Objects.nonNull(vipGroup.getStatus()) && normalStudentNum != vipGroupCategory.getStudentNum()){
+//				ots = ots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+//				ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+//				gots = gots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+//				gofts = gofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+//			}
+		results.put("onlineTeacherSalary", ots);
+		results.put("offlineTeacherSalary", ofts);
+		results.put("giveOnlineTeacherSalary", gots);
+		results.put("giveOfflineTeacherSalary", gofts);
         return results;
     }
 

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -75,4 +75,21 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM activity_user_mapper
 	</select>
+    <select id="findByStudentIdList" resultMap="ActivityUserMapper">
+		SELECT * FROM activity_user_mapper
+		WHERE activity_id_ = #{activityId} AND FIND_IN_SET(user_id_,#{studentIds})
+		<if test="type == 'GIVE_VIP'">
+			AND give_vip_flag_ = 1
+		</if>
+		<if test="type == 'GIVE_PRACTICE'">
+			AND give_practice_flag_ = 1
+		</if>
+		<if test="type == 'VIP'">
+			AND vip_flag_ = 1
+		</if>
+		<if test="type == 'PRACTICE'">
+			AND practice_flag_ = 1
+		</if>
+		GROUP BY user_id_
+	</select>
 </mapper>

+ 33 - 0
mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml

@@ -364,4 +364,37 @@
 		WHERE s.teacher_id_ = #{teacherId} AND (aum.vip_flag_ = 1 OR aum.practice_flag_ = 1 OR aum.give_vip_flag_ = 1 OR aum.give_practice_flag_ = 1)
 		GROUP BY aum.activity_id_,aum.user_id_
 	</select>
+	<resultMap id="ActivityWaitCourseStudentNumDto" type="com.ym.mec.biz.dal.dto.ActivityWaitCourseStudentNumDto">
+		<result property="vipNum" column="vip_num_"/>
+		<result property="giveVipNum" column="give_vip_num_"/>
+		<result property="practiceNum" column="practice_num_"/>
+		<result property="givePracticeNum" column="give_practice_num_"/>
+		<result property="username" column="username_"/>
+		<result property="avatar" column="avatar_"/>
+	</resultMap>
+	<select id="getActivityWaitCourseStudentNum" resultMap="ActivityWaitCourseStudentNumDto">
+		SELECT COUNT(CASE WHEN aum.vip_flag_ = 1 THEN 1 ELSE NULL END) vip_num_,
+			   COUNT(CASE WHEN aum.practice_flag_ = 1 THEN 1 ELSE NULL END) practice_num_,
+			   COUNT(CASE WHEN aum.give_vip_flag_ = 1 THEN 1 ELSE NULL END) give_vip_num_,
+			   COUNT(CASE WHEN aum.give_practice_flag_ = 1 THEN 1 ELSE NULL END) give_practice_num_
+		FROM student s
+		LEFT JOIN (SELECT activity_id_,MAX(vip_flag_) vip_flag_,MAX(practice_flag_) practice_flag_,
+		MAX(give_vip_flag_) give_vip_flag_,MAX(give_practice_flag_) give_practice_flag_,user_id_
+		FROM activity_user_mapper
+		WHERE activity_id_ = #{activityId}
+		GROUP BY user_id_) aum ON s.user_id_ = aum.user_id_
+		WHERE aum.activity_id_ = #{activityId} AND s.teacher_id_ = #{userId}
+		GROUP BY s.user_id_;
+	</select>
+	<select id="getActivityStudentCanCourseNum" resultMap="ActivityWaitCourseStudentNumDto">
+		SELECT COUNT(CASE WHEN aum.vip_flag_ = 1 THEN 1 ELSE NULL END) vip_num_,
+			   COUNT(CASE WHEN aum.practice_flag_ = 1 THEN 1 ELSE NULL END) practice_num_,
+			   COUNT(CASE WHEN aum.give_vip_flag_ = 1 THEN 1 ELSE NULL END) give_vip_num_,
+			   COUNT(CASE WHEN aum.give_practice_flag_ = 1 THEN 1 ELSE NULL END) give_practice_num_,su.username_,su.avatar_
+		FROM student s
+				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
+				 LEFT JOIN activity_user_mapper aum ON s.user_id_ = aum.user_id_
+		WHERE aum.activity_id_ = #{activityId} AND s.teacher_id_ = #{userId}
+		GROUP BY s.user_id_
+	</select>
 </mapper>

+ 34 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherVipGroupController.java

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
 import com.ym.mec.biz.dal.dao.VipGroupDefaultClassesUnitPriceDao;
 import com.ym.mec.biz.dal.dto.StudentVipDouble11Dto;
+import com.ym.mec.biz.dal.dto.VipGroupApplyBaseInfoDto;
 import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.dto.VipGroupCostCountParamsDto;
 import com.ym.mec.biz.dal.entity.*;
@@ -236,4 +237,37 @@ public class TeacherVipGroupController extends BaseController {
 		return vipGroupService.createActivityVipGroup(vipGroupApplyDto);
 	}
 
+	@ApiOperation(value = "教师端活动排课")
+	@PostMapping("/createVipGroup")
+	public Object createVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		VipGroupApplyBaseInfoDto applyBaseInfo = vipGroupApplyDto.getVipGroupApplyBaseInfo();
+		Integer userId = sysUser.getId();
+		applyBaseInfo.setUserId(userId);
+		Teacher teacher = teacherDao.get(userId);
+		if(Objects.isNull(teacher)){
+			return failed("请指定指导老师!");
+		}
+		Integer firstStudentId = applyBaseInfo.getFirstStudentId();
+		SysUser student = teacherDao.getUser(firstStudentId);
+		if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+			return failed("学员信息异常");
+		}
+		applyBaseInfo.setOrganId(student.getOrganId());
+		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());
+		}
+
+		applyBaseInfo.setEducationalTeacherId(sysUser.getId());
+		return vipGroupService.createActivityVipGroup1(vipGroupApplyDto);
+	}
+
 }

+ 21 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java

@@ -45,7 +45,7 @@ public class VipGroupActivityController extends BaseController {
     private StudentDao studentDao;
 
     @ApiOperation(value = "获取老师待排课的活动方案列表")
-    @PostMapping("/queryWaitCourseActivity")
+    @RequestMapping("/queryWaitCourseActivity")
     public Object queryWaitCourseActivity(){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null){
@@ -54,6 +54,26 @@ public class VipGroupActivityController extends BaseController {
         return succeed(vipGroupActivityService.queryWaitCourseActivity(sysUser.getId()));
     }
 
+    @ApiOperation(value = "获取活动待排课学员数量")
+    @RequestMapping("/getActivityWaitCourseStudentNum")
+    public Object getActivityWaitCourseStudentNum(Integer activityId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("用户信息获取失败");
+        }
+        return succeed(vipGroupActivityService.getActivityWaitCourseStudentNum(sysUser.getId(),activityId));
+    }
+
+    @ApiOperation(value = "获取活动学员课排课次数")
+    @RequestMapping("/getActivityStudentCanCourseNum")
+    public Object getActivityStudentCanCourseNum(Integer activityId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            return failed("用户信息获取失败");
+        }
+        return succeed(vipGroupActivityService.getActivityStudentCanCourseNum(sysUser.getId(),activityId));
+    }
+
     @ApiOperation(value = "新增vip课活动方案")
     @PostMapping("/addVipGroupActivity")
     public Object addVipGroupActivity(@RequestBody VipGroupActivityAddDto vipGroupActivityAddDto){

+ 4 - 0
mec-web/src/main/java/com/ym/mec/web/controller/PracticeGroupManageController.java

@@ -33,6 +33,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
+import static com.ym.mec.biz.dal.enums.PracticeGroupType.CHARGE;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/21
@@ -203,6 +205,8 @@ public class PracticeGroupManageController extends BaseController {
             }
             applyBaseInfoDto.setOrganId(student.getOrganId());
         }
+        applyBaseInfoDto.setType(CHARGE);
+        applyBaseInfoDto.setMemo("指导老师申请网管课");
         return practiceGroupService.createPracticeGroup(practiceGroupApplyDto);
     }
 }