Browse Source

Merge branch 'children_day_course' into online1

Joburgess 4 năm trước cách đây
mục cha
commit
307b86d4a2
28 tập tin đã thay đổi với 1289 bổ sung20 xóa
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleTeacherSalaryDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupActivityDao.java
  4. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyBaseInfoDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  6. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ActivityCourseType.java
  7. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  8. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherNameQueryInfo.java
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  11. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  12. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java
  13. 0 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  14. 597 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  15. 4 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  16. 1 1
      mec-biz/src/main/resources/config/mybatis/SchoolMapper.xml
  17. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  18. 16 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  19. 5 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  20. 4 0
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  21. 10 10
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java
  22. 52 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduSchoolController.java
  23. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java
  24. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduSubjectController.java
  25. 93 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupActivityController.java
  26. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupCategoryController.java
  27. 72 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupManageController.java
  28. 143 0
      mec-web/src/main/resources/application.yml

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

@@ -27,6 +27,8 @@ public interface CourseScheduleTeacherSalaryDao extends BaseDAO<Long, CourseSche
 	 */
 	int batchInsert(List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries);
 
+	int updateEnableChangeSalaryByClassGroup(@Param("classGroupId") Long classGroupId, @Param("enableChangeSalary") Boolean enableChangeSalary);
+
 	/**
 	 * @param courseScheduleIds: 课程编号列表
 	 * @return int

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

@@ -23,6 +23,8 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     List<Student> findByStudentIds(@Param("studentIds") List<Integer> studentIds);
 
+    List<Student> lockStudents(@Param("studentIds") List<Integer> studentIds);
+
     SysUser lockUserReturnInfo(@Param("userId") Integer userId);
 
     SysUser getUser(@Param("userId") Integer userId);

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

@@ -28,6 +28,8 @@ public interface VipGroupActivityDao extends BaseDAO<Integer, VipGroupActivity>
 
 	List<VipGroupActivity> queryByIds(@Param("activityIds") String activityIds);
 
+	List<VipGroupActivity> findByName(@Param("name") String name);
+
 	/**
 	 * 导出vip活动
 	 * @param params

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyBaseInfoDto.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.VipGroup;
 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;
@@ -40,6 +41,17 @@ public class VipGroupApplyBaseInfoDto extends VipGroup {
     @ApiModelProperty(value = "第一个选择的学员")
     private Integer firstStudentId;
 
+    @ApiModelProperty(value = "活动课程类型")
+    private ActivityCourseType activityCourseType;
+
+    public ActivityCourseType getActivityCourseType() {
+        return activityCourseType;
+    }
+
+    public void setActivityCourseType(ActivityCourseType activityCourseType) {
+        this.activityCourseType = activityCourseType;
+    }
+
     public Integer getFirstStudentId() {
         return firstStudentId;
     }

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

@@ -56,11 +56,22 @@ public class Student extends SysUser {
 
 	private Integer cooperationOrganId;
 
+	@ApiModelProperty(value = "活动排课信息")
+	private String activityCourseDetail;
+
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
 	}
 
+	public String getActivityCourseDetail() {
+		return activityCourseDetail;
+	}
+
+	public void setActivityCourseDetail(String activityCourseDetail) {
+		this.activityCourseDetail = activityCourseDetail;
+	}
+
 	public Boolean getIsNewUser() {
 		return isNewUser;
 	}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ActivityCourseType.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/10 0010
+ **/
+public enum ActivityCourseType implements BaseEnum<String, ComplaintsStatusEnum> {
+    FREE_VIP("free_vip", "考级活动赠送课"),
+    VIP1("vip1", "考级活动1v1VIP课"),
+    VIP2("vip2", "考级活动1v2VIP课"),
+    MUSIC_THEORY("music_theory", "考级活动乐理课");
+
+    private String code;
+
+    private String msg;
+
+    ActivityCourseType(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -169,6 +169,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_APPEAL("BACKSTAGE_STUDENT_APPEAL", "学员申述"),
     BACKSTAGE_STUDENT_APPLY_QUIT_GROUP("BACKSTAGE_STUDENT_APPLY_QUIT_GROUP", "学员申请退团"),
 
+    CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH("CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH", "六一活动课程安排"),
+    CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH("CHILDREN_DAY_VIP_COURSE_STUDENT_PUSH", "六一活动课程安排"),
+
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
     BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
     CHILDREN_DAY_NOTICE_PUSH("CHILDREN_DAY_NOTICE_PUSH", "技能评测考级报名推送"),

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -38,12 +38,42 @@ public class StudentManageQueryInfo extends QueryInfo {
     
     private Integer teacherId;
 
+    private Integer teacherIdForOrgan;
+
     private Integer isNewUser;
 
     private Integer carePackage;
 
     private Integer comeOnPackage;
 
+    private Integer subjectId;
+
+    private String activityCourseType;
+
+    public Integer getTeacherIdForOrgan() {
+        return teacherIdForOrgan;
+    }
+
+    public void setTeacherIdForOrgan(Integer teacherIdForOrgan) {
+        this.teacherIdForOrgan = teacherIdForOrgan;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getActivityCourseType() {
+        return activityCourseType;
+    }
+
+    public void setActivityCourseType(String activityCourseType) {
+        this.activityCourseType = activityCourseType;
+    }
+
     public Integer getCarePackage() {
         return carePackage;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherNameQueryInfo.java

@@ -14,6 +14,16 @@ public class TeacherNameQueryInfo extends QueryInfo {
 
     private String jobNature;
 
+    private Boolean includeFlowOrgan;
+
+    public Boolean getIncludeFlowOrgan() {
+        return includeFlowOrgan;
+    }
+
+    public void setIncludeFlowOrgan(Boolean includeFlowOrgan) {
+        this.includeFlowOrgan = includeFlowOrgan;
+    }
+
     public Integer getTeacherId() {
         return teacherId;
     }

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

@@ -213,6 +213,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     String WARNING_MIN_COURSE_SALARY = "warning_min_course_salary";
 
+    String CHILDREN_DAY_VIP_ACTIVITY_IDS = "children_day_vip_activity_ids";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

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

@@ -28,6 +28,7 @@ import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
 
 public interface VipGroupService extends BaseService<Long, VipGroup> {
 
@@ -41,6 +42,17 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     HttpResponseResult createVipGroup(VipGroupApplyDto vipGroup);
 
     /**
+     * @describe 创建vip课
+     * @author Joburgess
+     * @date 2019/10/30
+     * @param vipGroup: VIP课申请信息
+     * @return void
+     */
+    HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup);
+
+    HttpResponseResult importActivityVipGroup(String data);
+
+    /**
      * @describe 获取教务与教师共有分部
      * @author Joburgess
      * @date 2020.07.08

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayDegreeInfoServiceImpl.java

@@ -1,19 +1,27 @@
 package com.ym.mec.biz.service.impl;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.ChildrenDayDegreeDetailDao;
 import com.ym.mec.biz.dal.dao.ChildrenDayDegreeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.entity.ChildrenDayDegreeDetail;
 import com.ym.mec.biz.dal.entity.ChildrenDayDegreeInfo;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.enums.ActivityCourseType;
 import com.ym.mec.biz.service.ChildrenDayDegreeInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Objects;
 
 @Service
 public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, ChildrenDayDegreeInfo> implements ChildrenDayDegreeInfoService {
@@ -21,6 +29,8 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
     private ChildrenDayDegreeInfoDao childrenDayDegreeInfoDao;
     @Autowired
     private ChildrenDayDegreeDetailDao childrenDayDegreeDetailDao;
+    @Autowired
+    private StudentDao studentDao;
 
     @Override
     public BaseDAO<Integer, ChildrenDayDegreeInfo> getDAO() {
@@ -32,6 +42,14 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
     public ChildrenDayDegreeInfo addInfo(Long orderId) {
         List<ChildrenDayDegreeDetail> details = childrenDayDegreeDetailDao.getByOrderId(orderId);
         ChildrenDayDegreeInfo childrenDayDegreeInfo = new ChildrenDayDegreeInfo();
+        Student student = null;
+        JSONObject courseDetail = new JSONObject();
+        if(!CollectionUtils.isEmpty(details)){
+            student = studentDao.get(details.get(0).getUserId());
+        }
+        if(Objects.nonNull(student)&& StringUtils.isNotBlank(student.getActivityCourseDetail())){
+            courseDetail = JSON.parseObject(student.getActivityCourseDetail());
+        }
         BigDecimal totalAmount = BigDecimal.ZERO;
         for (ChildrenDayDegreeDetail detail : details) {
             switch (detail.getType()) {
@@ -39,6 +57,9 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
                     childrenDayDegreeInfo.setSubjectId(detail.getSubjectId());
                     childrenDayDegreeInfo.setGradeLevel(detail.getLevel());
                     childrenDayDegreeInfo.setGradePrice(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.FREE_VIP.getCode())){
+                        courseDetail.put(ActivityCourseType.FREE_VIP.getCode(), 1);
+                    }
                     break;
                 case 2:
                     childrenDayDegreeInfo.setTheoryLevel(detail.getLevel());
@@ -46,12 +67,22 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
                     break;
                 case 3:
                     childrenDayDegreeInfo.setVip1v1Price(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.VIP1.getCode())){
+                        courseDetail.put(ActivityCourseType.VIP1.getCode(), 1);
+                    }
                     break;
                 case 4:
                     childrenDayDegreeInfo.setVip1v2Price(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.VIP2.getCode())){
+                        courseDetail.put(ActivityCourseType.VIP2.getCode(), 1);
+                    }
                     break;
                 case 5:
                     childrenDayDegreeInfo.setTheoryCoursePrice(detail.getPrice());
+                    if(detail.getPrice().compareTo(BigDecimal.ZERO)>0&&!courseDetail.containsKey(ActivityCourseType.MUSIC_THEORY.getCode())){
+                        courseDetail.put(ActivityCourseType.MUSIC_THEORY.getCode(), 1);
+                        courseDetail.put("music_theory_price", detail.getPrice());
+                    }
                     break;
                 default:
                     break;
@@ -65,6 +96,10 @@ public class ChildrenDayDegreeInfoServiceImpl extends BaseServiceImpl<Integer, C
         if (childrenDayDegreeInfoDao.insert(childrenDayDegreeInfo) <= 0) {
             throw new BizException("汇总信息插入失败");
         }
+        if(Objects.nonNull(student)){
+            student.setActivityCourseDetail(courseDetail.toJSONString());
+            studentDao.update(student);
+        }
         return childrenDayDegreeInfo;
     }
 

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

@@ -109,13 +109,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                                                      List<CourseSchedule> vipCourseSchedules,
                                                      BigDecimal onlineTeacherSalary,
                                                      BigDecimal offlineTeacherSalary) {
-
-        School school = schoolService.get(vipGroup.getTeacherSchoolId());
-        BigDecimal subsidy = new BigDecimal(0);
-        if (Objects.nonNull(school)) {
-            subsidy=school.getSubsidy();
-        }
-
         //获取活动信息
         VipGroupActivity vipGroupActivity = null;
         if(vipGroup.getVipGroupActivityId() != null){

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

@@ -26,6 +26,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateConvertor;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.string.MessageFormatter;
 
@@ -43,18 +44,23 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
+import static com.ym.mec.biz.dal.enums.GroupType.VIP;
+
 @Service
 public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> implements VipGroupService {
 
@@ -157,6 +163,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
 	@Autowired
 	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
+	@Autowired
+	private SysConfigService sysConfigService;
 
 	private static final Logger LOGGER = LoggerFactory
 			.getLogger(VipGroup.class);
@@ -471,6 +479,592 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public HttpResponseResult createActivityVipGroup(VipGroupApplyDto vipGroup) {
+		if (Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getUserId())){
+			throw new BizException("请选择指导老师");
+		}
+
+		if(vipGroup.getCourseSchedules().size()!=(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()+vipGroup.getVipGroupApplyBaseInfo().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(vipGroup.getVipGroupApplyBaseInfo().getSubjectIdList())){
+			throw new BizException("请选择声部");
+		}
+
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			List<VipGroupCategory> vipGroupCategories = vipGroupCategoryDao.findAllByOrgan(vipGroup.getVipGroupApplyBaseInfo().getOrganId().toString());
+			VipGroupCategory vipGroupCategory = vipGroupCategories.stream().filter(v -> v.getName().equals("1v2")).findFirst().get();
+			vipGroup.getVipGroupApplyBaseInfo().setVipGroupCategoryId(vipGroupCategory.getId());
+		}
+
+		if((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE))&&vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()!=0)
+				||(!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.OFFLINE))&&(courseScheduleGroup.get(TeachModeEnum.OFFLINE).size()<vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()))){
+			throw new BizException("线下课课时数量安排有误");
+		}
+
+		if((Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE))&&vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum()!=0)
+				||(!Objects.isNull(courseScheduleGroup.get(TeachModeEnum.ONLINE))&&(courseScheduleGroup.get(TeachModeEnum.ONLINE).size()<vipGroup.getVipGroupApplyBaseInfo().getOnlineClassesNum()))){
+			throw new BizException("线上课课时数量安排有误");
+		}
+
+		if(vipGroup.getVipGroupApplyBaseInfo().getOfflineClassesNum()>0
+				&&Objects.isNull(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId())){
+			throw new BizException("请设置教学点");
+		}
+
+		String studentIds=vipGroup.getVipGroupApplyBaseInfo().getStudentIdList();
+		if(StringUtils.isBlank(studentIds)){
+			throw new BizException("请选择学员");
+		}
+		List<Integer> studentIdList = Arrays.stream(studentIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+
+		List<Student> studentDetail = studentDao.lockStudents(studentIdList);
+		List<SimpleUserDto> studentSimpleInfos = teacherDao.getUsersSimpleInfo(studentIdList);
+		if(studentDetail.size()!=studentSimpleInfos.size()){
+			throw new BizException("学员信息错误");
+		}
+		Map<Integer, SimpleUserDto> idUserInfoMap = studentSimpleInfos.stream().collect(Collectors.toMap(SimpleUserDto::getUserId, s -> s, (s1, s2) -> s1));
+		Map<Integer, BigDecimal> studentTheoryPriceMap = new HashMap<>();
+		for (Student student : studentDetail) {
+			if(StringUtils.isEmpty(student.getActivityCourseDetail())){
+				SimpleUserDto studentInfo = idUserInfoMap.get(student.getUserId());
+				throw new BizException("{}暂无排课资格", studentInfo.getNickName());
+			}
+			JSONObject courseDetail = JSON.parseObject(student.getActivityCourseDetail());
+			Integer surplusTimes = courseDetail.getInteger(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType().getCode());
+			if(surplusTimes<=0){
+				SimpleUserDto studentInfo = idUserInfoMap.get(student.getUserId());
+				throw new BizException("{}暂无排课资格", studentInfo.getNickName());
+			}
+			courseDetail.fluentPut(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType().getCode(), surplusTimes-1);
+			student.setActivityCourseDetail(courseDetail.toJSONString());
+			if(ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+				studentTheoryPriceMap.put(student.getUserId(), courseDetail.getBigDecimal("music_theory_price"));
+			}
+		}
+		studentDao.batchUpdate(studentDetail);
+
+		Date now=new Date();
+
+		VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto=vipGroup.getVipGroupApplyBaseInfo();
+
+		if(Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
+				&&Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())){
+			throw new BizException("请设置课程单价");
+		}
+
+		if(StringUtils.isBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+			throw new BizException("请选择学员");
+		}
+
+		Integer totalClassTimes=vipGroupApplyBaseInfoDto.getOnlineClassesNum()+vipGroupApplyBaseInfoDto.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("开课时间不能小于当前时间");
+		}
+
+		vipGroupApplyBaseInfoDto.setRegistrationStartTime(now);
+		vipGroupApplyBaseInfoDto.setPaymentExpireDate(now);
+
+		if(vipGroupApplyBaseInfoDto.getRegistrationStartTime().after(vipGroupApplyBaseInfoDto.getPaymentExpireDate())){
+			throw new BizException("报名开始时间必须在报名截至时间之前");
+		}
+
+		List<Integer> canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+		List<VipGroupStudentCoursePrice> vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+
+		//获取活动信息
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
+//		if(!vipGroup.getAllowOverstepActivityStudentNum()&&Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
+//			List<String> tempStudentIds = Arrays.asList(vipGroupApplyBaseInfoDto.getStudentIdList().split(","));
+//			List<Integer> errStudentIds = new ArrayList<>();
+//			for (String studentIdStr : tempStudentIds) {
+//				int useNum = vipGroupDao.countStudentUserActivityNum(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId(), Integer.valueOf(studentIdStr));
+//				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
+//					errStudentIds.add(Integer.valueOf(studentIdStr));
+//				}
+//			}
+//			if(errStudentIds.size()>0){
+//				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+//				String studentNames = StringUtils.join(studentSimpleInfos.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), "、");
+//				return BaseController.failed(HttpStatus.PARTIAL_CONTENT,"该活动"+studentNames+"学员创建及成课之和已达上限,是否继续创建该课程?");
+//			}
+//		}
+		//判断课程安排是否超出范围
+		if(Objects.nonNull(vipGroupActivity)&&(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime()))){
+			if(latestCourseSchedule.getEndClassTime().after(vipGroupActivity.getCoursesEndTime())
+					||firstCourseSchedule.getStartClassTime().before(vipGroupActivity.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(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getMinCourseNum())&&vipGroupActivity.getMinCourseNum()!=-1&&Objects.nonNull(vipGroupActivity.getMaxCourseNum())&&vipGroupActivity.getMaxCourseNum()!=-1){
+			Integer requestCourseNum = vipGroupApplyBaseInfoDto.getOnlineClassesNum() + vipGroupApplyBaseInfoDto.getOfflineClassesNum();
+			if(requestCourseNum.compareTo(vipGroupActivity.getMinCourseNum())<0||requestCourseNum.compareTo(vipGroupActivity.getMaxCourseNum())>0){
+				throw new BizException("该活动课时数为{}节~{}节", vipGroupActivity.getMinCourseNum(), vipGroupActivity.getMaxCourseNum());
+			}
+		}
+
+		int repeatVipGroups = vipGroupDao.countUserRepeatVipGroupInCourseStartEndTime(vipGroupApplyBaseInfoDto.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
+		if(repeatVipGroups>0){
+			SysUser sysUser = sysUserFeignService.queryUserById(vipGroupApplyBaseInfoDto.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(vipGroupApplyBaseInfoDto.getVipGroupCategoryId());
+		if(Objects.isNull(vipGroupCategory)){
+			throw new BizException("课程形式不存在");
+		}
+		List<String> studentNames = studentDao.getStudentNames(canBuyStudentIds);
+
+		//生成vip课信息
+		List<String> bySubIds = subjectDao.findBySubIds(vipGroupApplyBaseInfoDto.getSubjectIdList());
+		StringBuffer className=new StringBuffer();
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			className.append("考前辅导课•");
+		}else if(Objects.isNull(vipGroupCategory.getMusicTheory())||!vipGroupCategory.getMusicTheory()){
+			className.append(StringUtils.join(bySubIds,","));
+			className.append(vipGroupCategory.getName());
+		}else{
+			className.append("乐理课•");
+		}
+		className.append(StringUtils.join(studentNames, ","));
+		vipGroupApplyBaseInfoDto.setName(className.toString());
+
+
+		if(!ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			//计算课程相关费用信息
+			Map<String, BigDecimal> costInfo = countVipGroupPredictFee(vipGroupApplyBaseInfoDto,
+					vipGroupApplyBaseInfoDto.getUserId(), null);
+			vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(costInfo.get("onlineTeacherSalary"));
+			vipGroupApplyBaseInfoDto.setOfflineTeacherSalary(costInfo.get("offlineTeacherSalary"));
+			vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.get("totalPrice"));
+		}else{
+			vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(BigDecimal.ZERO);
+			vipGroupApplyBaseInfoDto.setOfflineTeacherSalary(BigDecimal.ZERO);
+			vipGroupApplyBaseInfoDto.setTotalPrice(BigDecimal.ZERO);
+		}
+
+		vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
+		vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.PROGRESS);
+
+		if(CollectionUtils.isEmpty(vscps)){
+			vscps = new ArrayList<>();
+			for (Integer canBuyStudentId : canBuyStudentIds) {
+				vscps.add(new VipGroupStudentCoursePrice(canBuyStudentId, vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice(), vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice(), vipGroupApplyBaseInfoDto.getTotalPrice()));
+			}
+		}
+		Teacher teacher = teacherService.get(vipGroupApplyBaseInfoDto.getUserId());
+		if(Objects.isNull(teacher)){
+			throw new BizException("教师不存在");
+		}
+
+		//开课时间为排课的第一节课的开始时间
+		vipGroupApplyBaseInfoDto.setCourseStartDate(firstCourseSchedule.getStartClassTime());
+		//课程结束时间为排课的最后一节课的结束时间
+		vipGroupApplyBaseInfoDto.setCoursesExpireDate(latestCourseSchedule.getEndClassTime());
+
+		vipGroupApplyBaseInfoDto.setPaymentExpireDate(DateUtil.getLastSecondWithDay(vipGroupApplyBaseInfoDto.getPaymentExpireDate()));
+
+		vipGroupDao.insert(vipGroupApplyBaseInfoDto);
+
+		vscps.forEach(e->e.setVipGroupId(vipGroupApplyBaseInfoDto.getId()));
+		vipGroupStudentCoursePriceDao.batchInsert(vscps);
+
+		vipGroup.getVipGroupApplyBaseInfo().setId(vipGroupApplyBaseInfoDto.getId());
+
+		//创建班级信息
+		ClassGroup classGroup=new ClassGroup();
+		classGroup.setSubjectIdList(vipGroupApplyBaseInfoDto.getSubjectIdList());
+		classGroup.setExpectStudentNum(vipGroupCategory.getStudentNum());
+		classGroup.setStudentNum(studentIdList.size());
+		classGroup.setName(vipGroupApplyBaseInfoDto.getName());
+		classGroup.setTotalClassTimes(totalClassTimes);
+		classGroup.setType(ClassGroupTypeEnum.VIP);
+		classGroup.setDelFlag(0);
+		classGroup.setGroupType(GroupType.VIP);
+		classGroup.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroup.setCreateTime(now);
+		classGroup.setUpdateTime(now);
+		classGroupDao.insert(classGroup);
+
+		//创建班级老师关联记录
+		ClassGroupTeacherMapper classGroupTeacherMapper=new ClassGroupTeacherMapper();
+		classGroupTeacherMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+		classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherMapper.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+		classGroupTeacherMapper.setGroupType(GroupType.VIP);
+		classGroupTeacherMapper.setCreateTime(now);
+		classGroupTeacherMapper.setUpdateTime(now);
+		classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+		//创建班级与老师课酬记录
+		ClassGroupTeacherSalary classGroupTeacherSalary=new ClassGroupTeacherSalary();
+		classGroupTeacherSalary.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+		classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+		classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+		classGroupTeacherSalary.setUserId(vipGroupApplyBaseInfoDto.getUserId());
+		classGroupTeacherSalary.setSalary(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary());
+		classGroupTeacherSalary.setOnlineClassesSalary(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary());
+		classGroupTeacherSalary.setGroupType(GroupType.VIP);
+		classGroupTeacherSalary.setCreateTime(now);
+		classGroupTeacherSalary.setUpdateTime(now);
+		classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+		//班级学员关联记录
+		List<ClassGroupStudentMapper> classGroupStudentMapperList = new ArrayList<>();
+		for (Integer studentId : studentIdList) {
+			ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+			classGroupStudentMapper.setMusicGroupId(vipGroupApplyBaseInfoDto.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);
+
+		//课程信息调整
+		vipGroup.getCourseSchedules().forEach(courseSchedule -> {
+			courseSchedule.setGroupType(GroupType.VIP);
+			courseSchedule.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
+			if(courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)){
+				courseSchedule.setSchoolId(vipGroup.getVipGroupApplyBaseInfo().getTeacherSchoolId());
+			}
+			courseSchedule.setTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+			courseSchedule.setActualTeacherId(vipGroupApplyBaseInfoDto.getUserId());
+			courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+			courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+			courseSchedule.setClassGroupId(classGroup.getId());
+			courseSchedule.setName(vipGroupApplyBaseInfoDto.getName());
+			courseSchedule.setOrganId(vipGroupApplyBaseInfoDto.getOrganId());
+		});
+
+		vipGroupApplyBaseInfoDto.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
+		vipGroupDao.update(vipGroupApplyBaseInfoDto);
+
+		//创建课程
+		List<CourseSchedule> courseSchedules = vipGroup.getCourseSchedules();
+		courseScheduleService.batchAddCourseSchedule(courseSchedules);
+		//创建老师单节课课酬信息
+		if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+			List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+			BigDecimal teacherDefaultSalary = new BigDecimal("16.67");
+			SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+			if(Objects.nonNull(practiceCourseSalaryConfig)&&StringUtils.isNotBlank(practiceCourseSalaryConfig.getParanValue())){
+				teacherDefaultSalary = new BigDecimal(practiceCourseSalaryConfig.getParanValue());
+			}
+			for (CourseSchedule courseSchedule : courseSchedules) {
+				CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+				courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+				courseScheduleTeacherSalary.setGroupType(GroupType.VIP);
+				courseScheduleTeacherSalary.setMusicGroupId(classGroup.getMusicGroupId());
+				courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+				courseScheduleTeacherSalary.setUserId(vipGroupApplyBaseInfoDto.getTeacherId().intValue());
+				courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+				courseScheduleTeacherSalary.setCreateTime(now);
+				courseScheduleTeacherSalary.setUpdateTime(now);
+				courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+				courseScheduleTeacherSalary.setEnableChangeSalary(false);
+				courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+			}
+			List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+			for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+				TeacherAttendance teacherAttendance = new TeacherAttendance();
+				teacherAttendance.setGroupType(courseScheduleTeacherSalary.getGroupType());
+				teacherAttendance.setClassGroupId(courseScheduleTeacherSalary.getClassGroupId());
+				teacherAttendance.setMusicGroupId(courseScheduleTeacherSalary.getMusicGroupId());
+				teacherAttendance.setTeacherId(courseScheduleTeacherSalary.getUserId());
+				teacherAttendance.setCourseScheduleId(courseScheduleTeacherSalary.getCourseScheduleId());
+				teacherAttendances.add(teacherAttendance);
+			}
+			courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+			if (!CollectionUtils.isEmpty(teacherAttendances)) {
+				teacherAttendanceDao.batchInsert(teacherAttendances);
+			}
+		}else{
+			courseScheduleTeacherSalaryService.createCourseScheduleTeacherVipSalary(vipGroupApplyBaseInfoDto,
+					courseSchedules,
+					classGroupTeacherSalary.getOnlineClassesSalary(),
+					classGroupTeacherSalary.getSalary());
+			courseScheduleTeacherSalaryDao.updateEnableChangeSalaryByClassGroup(classGroup.getId().longValue(), false);
+		}
+
+		SysUser sysUser = sysUserFeignService.queryUserById(vipGroupApplyBaseInfoDto.getUserId());
+
+		List<ClassGroupStudentMapper> classGroupStudents = classGroupStudentMapperDao.findByClassGroup(classGroup.getId());
+
+		Map<Integer,String> userRoleMap = new HashMap<>();
+		if(Objects.nonNull(vipGroupApplyBaseInfoDto.getEducationalTeacherId())){
+			userRoleMap.put(vipGroupApplyBaseInfoDto.getEducationalTeacherId(),"乐团主管");
+		}
+		userRoleMap.put(vipGroupApplyBaseInfoDto.getUserId(),"指导老师");
+		//生成学生单课缴费信息
+		for (ClassGroupStudentMapper classGroupStudent : classGroupStudents) {
+			if(ActivityCourseType.FREE_VIP.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())
+				||ActivityCourseType.MUSIC_THEORY.equals(vipGroup.getVipGroupApplyBaseInfo().getActivityCourseType())){
+				List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
+				BigDecimal price = studentTheoryPriceMap.get(classGroupStudent.getUserId());
+				BigDecimal coursePrice = BigDecimal.ZERO;
+				if(Objects.nonNull(price)){
+					coursePrice = price.divide(new BigDecimal(courseSchedules.size()), CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+				}
+				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(vipGroupApplyBaseInfoDto.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(), vipGroupApplyBaseInfoDto.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(vipGroupApplyBaseInfoDto.getUserId(),sysUser.getPhone());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.CHILDREN_DAY_VIP_COURSE_TEACHER_PUSH,
+					map,null,0,"","TEACHER", StringUtils.join(studentNames, ","),vipGroupApplyBaseInfoDto.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",
+					vipGroupApplyBaseInfoDto.getName());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return BaseController.succeed(vipGroupApplyBaseInfoDto.getAuditStatus().getCode());
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public HttpResponseResult importActivityVipGroup(String data) {
+		if(StringUtils.isBlank(data)){
+			return BaseController.succeed();
+		}
+		List<JSONObject> datas = JSON.parseArray(data, JSONObject.class);
+		Date date = new Date();
+		for (JSONObject courseData : datas) {
+			boolean skipHoliday = "是".equals(courseData.getString("skip_holiday"))?true:false;
+			String vipGroupActivityName = courseData.getString("vip_group_activity");
+			String vipGroupCategoryStr = courseData.getString("vip_group_category");
+			boolean freeCourse = "考前辅导课".equals(vipGroupCategoryStr);
+			int courseMinute = freeCourse?25:45;
+			String vipGroupCategoryName = "1v1".equals(vipGroupCategoryStr)?"1v1":"1v2";
+			Integer schoolId = courseData.getInteger("school_id");
+			int onlineCourseNum = StringUtils.isBlank(courseData.getString("online_course_num"))?0:courseData.getIntValue("online_course_num");
+			int onlineWeekNum = 0;
+			if(onlineCourseNum>0){
+				onlineWeekNum = courseData.getIntValue("online_course_week_num");
+			}
+			String onlineCourseStartTime = courseData.getString("online_course_start_time");
+			int offlineCourseNum = StringUtils.isBlank(courseData.getString("offline_course_num"))?0:courseData.getIntValue("offline_course_num");
+			int offlineWeekNum = 0;
+			if(offlineCourseNum>0){
+				offlineWeekNum = courseData.getIntValue("offline_course_week_num");
+			}
+			String offlineCourseStartTime = courseData.getString("offline_course_start_time");
+			int totalCourseNum = onlineCourseNum + offlineCourseNum;
+			Integer teacherId = courseData.getInteger("teacher_id");
+			Integer eduTeacherId = StringUtils.isBlank(courseData.getString("edu_teacher_id"))?null:courseData.getInteger("edu_teacher_id");
+			String studentIdsStr= courseData.getString("student_ids");
+			if(StringUtils.isBlank(studentIdsStr)){
+				throw new BizException("请选择学员");
+			}
+			List<Integer> studentIds = Arrays.stream(studentIdsStr.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+			SysUser student = studentDao.getUser(studentIds.get(0));
+			Student stu = studentDao.get(studentIds.get(0));
+			if(Objects.isNull(student)){
+				throw new BizException("学员信息异常");
+			}
+
+			List<VipGroupCategory> vipGroupCategories = vipGroupCategoryDao.findAllByOrgan(student.getOrganId().toString());
+			VipGroupCategory vipGroupCategory = vipGroupCategories.stream().filter(v -> v.getName().equals(vipGroupCategoryName)).findFirst().get();
+
+			List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.findByName(vipGroupActivityName);
+			VipGroupActivity vipGroupActivity = null;
+			if(!CollectionUtils.isEmpty(vipGroupActivities)){
+				vipGroupActivity = vipGroupActivities.get(0);
+			}
+
+			LocalDate courseStartDay = null;
+			LocalDate onlineCourseStartDay = null;
+			LocalDate offlineCourseStartDay = null;
+
+			if(onlineCourseNum>0){
+				onlineCourseStartDay = LocalDate.parse(courseData.getString("online_course_start_day").replace(" 00:00:00", ""), DateUtil.dateFormatter);
+				courseStartDay = onlineCourseStartDay;
+			}
+
+			if(offlineCourseNum>0){
+				offlineCourseStartDay = LocalDate.parse(courseData.getString("offline_course_start_day").replace(" 00:00:00", ""), DateUtil.dateFormatter);
+				if(Objects.isNull(courseStartDay)||onlineCourseStartDay.compareTo(offlineCourseStartDay)>0){
+					courseStartDay = offlineCourseStartDay;
+				}
+			}
+
+			Set<String> holidayDays = new HashSet<>();
+
+			if (skipHoliday) {
+				SysConfig holidaySetting = sysConfigService.findByParamName(SysConfigService.HOLIDAY_SETTING);
+				if(Objects.nonNull(holidaySetting)&&StringUtils.isNotBlank(holidaySetting.getParanValue())){
+					holidayDays = new HashSet<>(JSON.parseArray(holidaySetting.getParanValue(), String.class));
+				}
+			}
+
+			List<CourseSchedule> courseSchedules = new ArrayList<>();
+			int onlineCourseNumCreated = 0;
+			int offlineCourseNumCreated = 0;
+
+			while (true) {
+				if (skipHoliday && holidayDays.contains(courseStartDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+					courseStartDay = courseStartDay.plusDays(1);
+					continue;
+				}
+				int dayOfWeek = courseStartDay.getDayOfWeek().getValue();//当前星期
+
+				if (onlineCourseNumCreated<onlineCourseNum&&(onlineWeekNum < 1 || onlineWeekNum > 7)) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if(onlineCourseNumCreated<onlineCourseNum&&courseStartDay.compareTo(onlineCourseStartDay)>=0&&dayOfWeek==onlineWeekNum){
+					Date classDate = DateConvertor.toDate(courseStartDay);
+					String startClassTime = DateUtil.getDate(classDate) + " " + onlineCourseStartTime;
+					String endClassTime = DateUtil.dateToString(DateUtil.addMinutes(DateUtil.stringToDate(startClassTime, "yyyy-MM-dd HH:mm:ss"), courseMinute), "yyyy-MM-dd HH:mm:ss");
+
+					CourseSchedule courseSchedule = new CourseSchedule();
+					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					courseSchedule.setClassDate(classDate);
+					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+					courseSchedule.setCreateTime(date);
+					courseSchedule.setUpdateTime(date);
+					courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+					courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+					courseSchedule.setGroupType(VIP);
+					courseSchedule.setOrganId(student.getOrganId());
+					courseSchedule.setTeacherId(teacherId);
+					courseSchedule.setActualTeacherId(teacherId);
+					courseSchedules.add(courseSchedule);
+
+					onlineCourseNumCreated++;
+				}
+
+				if (offlineCourseNumCreated<offlineCourseNum&&(offlineWeekNum < 1 || offlineWeekNum > 7)) {
+					throw new BizException("排课循环周期错误,请核查");
+				}
+				if(offlineCourseNumCreated<offlineCourseNum&&courseStartDay.compareTo(offlineCourseStartDay)>=0&&dayOfWeek==offlineWeekNum){
+					Date classDate = DateConvertor.toDate(courseStartDay);
+					String startClassTime = DateUtil.getDate(classDate) + " " + offlineCourseStartTime;
+					String endClassTime = DateUtil.dateToString(DateUtil.addMinutes(DateUtil.stringToDate(startClassTime, "yyyy-MM-dd HH:mm:ss"), courseMinute), "yyyy-MM-dd HH:mm:ss");
+
+					CourseSchedule courseSchedule = new CourseSchedule();
+					courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+					courseSchedule.setClassDate(classDate);
+					courseSchedule.setStartClassTime(DateUtil.stringToDate(startClassTime));
+					courseSchedule.setEndClassTime(DateUtil.stringToDate(endClassTime));
+					courseSchedule.setCreateTime(date);
+					courseSchedule.setUpdateTime(date);
+					courseSchedule.setSchoolId(schoolId);
+					courseSchedule.setTeachMode(TeachModeEnum.OFFLINE);
+					courseSchedule.setType(CourseSchedule.CourseScheduleType.VIP);
+					courseSchedule.setGroupType(VIP);
+					courseSchedule.setOrganId(student.getOrganId());
+					courseSchedule.setTeacherId(teacherId);
+					courseSchedule.setActualTeacherId(teacherId);
+					courseSchedules.add(courseSchedule);
+
+					offlineCourseNumCreated++;
+				}
+
+				if (courseSchedules.size()>=totalCourseNum) {
+					break;
+				}
+
+				courseStartDay = courseStartDay.plusDays(1);
+			}
+
+			VipGroupApplyDto vipGroupApplyDto = new VipGroupApplyDto();
+			VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto = new VipGroupApplyBaseInfoDto();
+			vipGroupApplyBaseInfoDto.setStudentIdList(studentIdsStr);
+			
+			vipGroupApplyBaseInfoDto.setAllCourseNum(totalCourseNum);
+			vipGroupApplyBaseInfoDto.setTeacherId(teacherId.longValue());
+			vipGroupApplyBaseInfoDto.setEducationalTeacherId(eduTeacherId);
+			vipGroupApplyBaseInfoDto.setSubjectIdList(stu.getSubjectIdList());
+			vipGroupApplyBaseInfoDto.setFirstStudentId(studentIds.get(0));
+			vipGroupApplyBaseInfoDto.setUserId(teacherId);
+			vipGroupApplyBaseInfoDto.setSingleClassMinutes(courseMinute);
+			vipGroupApplyBaseInfoDto.setRegistrationStartTime(date);
+			vipGroupApplyBaseInfoDto.setPaymentExpireDate(date);
+			vipGroupApplyBaseInfoDto.setCourseStartDate(courseSchedules.get(0).getStartClassTime());
+			vipGroupApplyBaseInfoDto.setCoursesExpireDate(courseSchedules.get(courseSchedules.size()-1).getEndClassTime());
+			vipGroupApplyBaseInfoDto.setTeacherSchoolId(schoolId);
+			vipGroupApplyBaseInfoDto.setOnlineClassesNum(onlineCourseNum);
+			vipGroupApplyBaseInfoDto.setOfflineClassesNum(offlineCourseNum);
+			vipGroupApplyBaseInfoDto.setVipGroupCategoryId(vipGroupCategory.getId());
+			if(freeCourse){
+				vipGroupApplyBaseInfoDto.setActivityCourseType(ActivityCourseType.FREE_VIP);
+			}
+			if(Objects.nonNull(vipGroupActivity)){
+				vipGroupApplyBaseInfoDto.setVipGroupActivityId(vipGroupActivity.getId());
+			}
+			vipGroupApplyBaseInfoDto.setOrganId(student.getOrganId());
+			vipGroupApplyBaseInfoDto.setOnlineClassesUnitPrice(vipGroupCategory.getOnlineClassesUnitPrice());
+			vipGroupApplyBaseInfoDto.setOfflineClassesUnitPrice(vipGroupCategory.getOfflineClassesUnitPrice());
+			vipGroupApplyDto.setVipGroupApplyBaseInfo(vipGroupApplyBaseInfoDto);
+
+			vipGroupApplyDto.setCourseSchedules(courseSchedules);
+			createActivityVipGroup(vipGroupApplyDto);
+		}
+
+		return BaseController.succeed();
+	}
+
+	@Override
 	public List<Organization> getPublicOrgans(Integer eduTeacherId, Integer teacherId) {
 		if(Objects.isNull(eduTeacherId)){
 			throw new BizException("教务老师不存在");
@@ -1872,6 +2466,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(vipGroup.getStatus().equals(VipGroupStatusEnum.CANCEL)){
 			throw new BizException("不能对已停止的课程进行此操作");
 		}
+		if(vipGroup.getName().startsWith("考前辅导课")){
+			throw new BizException("当前课程类型不支持退学");
+		}
 
 		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId());
 

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -532,6 +532,10 @@
 		</foreach>
 	</update>
 
+    <update id="updateEnableChangeSalaryByClassGroup">
+		UPDATE course_schedule_teacher_salary SET enable_change_salary_ = #{enableChangeSalary} WHERE class_group_id_=#{classGroupId}
+	</update>
+
     <select id="findCourseScheduleTeacherSalaryByMusicGroupId" resultMap="CourseScheduleTeacherSalary">
 		SELECT * FROM course_schedule_teacher_salary WHERE music_group_id_=#{musicGroupId} AND group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 	</select>

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

@@ -143,7 +143,7 @@
         select * from school where del_flag_ != 1 and user_id_ = #{userId}
     </select>
     <select id="findVipSchoolByUserId" resultMap="School">
-        SELECT * FROM school WHERE del_flag_ != 1
+        SELECT * FROM school WHERE del_flag_ = 0
         <if test="organId != null">
         AND ((FIND_IN_SET(organ_id_,#{organId}) and user_id_ is NULL) or user_id_ = #{userId})
         </if>

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

@@ -216,6 +216,12 @@
             <if test="comeOnPackage != null">
                 AND s.come_on_package_ = #{comeOnPackage}
             </if>
+            <if test="subjectId!=null">
+                AND FIND_IN_SET( #{subjectId}, s.subject_id_list_ )
+            </if>
+            <if test="activityCourseType!=null and activityCourseType!=''">
+                AND JSON_EXTRACT(activity_course_detail_, CONCAT('$.', #{activityCourseType}))>0
+            </if>
         </where>
     </sql>
 

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

@@ -22,6 +22,7 @@
         <result column="current_grade_num_" property="currentGradeNum"/>
         <result column="current_class_" property="currentClass"/>
         <result column="cooperation_organ_id_" property="cooperationOrganId"/>
+        <result column="activity_course_detail_" property="activityCourseDetail"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -120,6 +121,9 @@
             <if test="currentClass != null">
                 current_class_=#{currentClass},
             </if>
+            <if test="activityCourseDetail != null">
+                activity_course_detail_=#{activityCourseDetail},
+            </if>
                 cooperation_organ_id_=#{cooperationOrganId},
                 update_time_ = NOW()
         </set>
@@ -199,6 +203,9 @@
                 <if test="item.cooperationOrganId != null">
                     cooperation_organ_id_=#{item.cooperationOrganId},
                 </if>
+                <if test="item.activityCourseDetail != null">
+                    activity_course_detail_=#{item.activityCourseDetail},
+                </if>
                 update_time_ = NOW()
             </set>
             WHERE user_id_ = #{item.userId}
@@ -642,6 +649,15 @@
             #{studentId}
         </foreach>
     </select>
+
+    <select id="lockStudents" resultMap="Student">
+        SELECT * FROM student WHERE user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+        FOR UPDATE
+    </select>
+
     <select id="queryCloseServiceTagIds" resultType="java.lang.Integer">
         SELECT s.user_id_ FROM student s
         LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = s.user_id_

+ 5 - 2
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -939,9 +939,12 @@
         <include refid="queryPageNameSql"/>
     </select>
     <sql id="queryPageNameSql">
-        <if test="organId != null">
+        <if test="organId != null and includeFlowOrgan==null">
             AND FIND_IN_SET(t.organ_id_,#{organId})
         </if>
+        <if test="organId != null and includeFlowOrgan!=null and includeFlowOrgan">
+            AND (CONCAT(',',t.organ_id_,',',IFNULL(t.flow_organ_range_,''),',') REGEXP CONCAT(',(',replace(#{organId},',','|'),'),'))
+        </if>
         <if test="subjectIds != null">
             AND INTE_ARRAY(t.subject_id_,#{subjectIds})
         </if>
@@ -956,7 +959,7 @@
         </if>
     </sql>
     <select id="queryPageName" resultMap="Teacher">
-        SELECT su.id_,su.real_name_,su.avatar_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
+        SELECT su.id_,su.real_name_,su.avatar_,t.subject_id_,t.organ_id_,GROUP_CONCAT(s.name_) subject_name_ FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         LEFT JOIN subject s ON FIND_IN_SET(s.id_, t.subject_id_)
         WHERE su.del_flag_ != 1 AND su.lock_flag_!=1

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

@@ -269,4 +269,8 @@
 		</where>
 		GROUP BY vga.`id_`
 	</select>
+
+    <select id="findByName" resultMap="VipGroupActivity">
+		SELECT * FROM vip_group_activity vga WHERE vga.name_ = #{name}
+	</select>
 </mapper>

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

@@ -155,17 +155,17 @@ public class TeacherController extends BaseController {
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
-                queryInfo.setOrganId(employee.getOrganIdList());
-            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
-                return failed("用户所在分部异常");
-            }else {
-                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
-                    return failed("非法请求");
-                }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            return failed("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                return failed("非法请求");
             }
+        }
         return succeed(teacherService.queryPageName(queryInfo));
     }
 

+ 52 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduSchoolController.java

@@ -0,0 +1,52 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.School;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.SchoolQueryInfo;
+import com.ym.mec.biz.service.SchoolService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@RequestMapping("eduSchool")
+@Api(tags = "学校(教学点)服务")
+@RestController
+public class EduSchoolController extends BaseController {
+
+    @Autowired
+    private SchoolService schoolService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @ApiOperation(value = "获取教师vip课教学点")
+    @GetMapping("/findVipSchoolByTeacher")
+    public Object findVipSchoolByTeacher(@ApiParam(value = "教师编号", required = true) Integer userId){
+        Teacher teacher = teacherDao.get(userId);
+        if (teacher == null) {
+            return failed("用户信息获取失败");
+        }
+        String organId = new String();
+        if(Objects.nonNull(teacher.getTeacherOrganId())){
+            organId = teacher.getTeacherOrganId().toString();
+        }
+        if(StringUtils.isEmpty(teacher.getFlowOrganRange())){
+            organId += "," + teacher.getFlowOrganRange();
+        }
+        return succeed(schoolService.findVipSchoolByTeacher(userId,organId,null));
+    }
+}

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

@@ -1,11 +1,22 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiOperation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -15,6 +26,12 @@ import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.StudentRegistrationService;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * @Author Joburgess
  * @Date 2020.09.14
@@ -28,6 +45,12 @@ public class EduStudentStudentController extends BaseController {
     private StudentRegistrationService studentRegistrationService;
     @Autowired
     private StudentManageService studentManageService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private TeacherService teacherService;
 
     @ApiOperation(value = "获取某节课学生签到列表")
     @GetMapping("eduStudentAttendance/findStudentAttendance")
@@ -53,4 +76,39 @@ public class EduStudentStudentController extends BaseController {
         return succeed(studentManageService.queryStudentNoStartCourse(queryInfo));
     }
 
+    @ApiOperation(value = "获取学生列表")
+    @GetMapping("eduStudentManage/queryStudentList")
+    public Object queryStudentList(StudentManageQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if(Objects.nonNull(queryInfo.getTeacherIdForOrgan())){
+            Teacher teacher = teacherService.get(queryInfo.getTeacherIdForOrgan());
+            if(Objects.isNull(teacher)){
+                return failed("教师信息不存在");
+            }
+            if(Objects.nonNull(teacher.getTeacherOrganId())){
+                queryInfo.setOrganId(teacher.getTeacherOrganId().toString());
+            }
+            if(StringUtils.isNotBlank(teacher.getFlowOrganRange())){
+                queryInfo.setOrganId(queryInfo.getOrganId()+","+teacher.getFlowOrganRange());
+            }
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())||StringUtils.isBlank(employee.getOrganIdList())) {
+            return failed("用户所在分部异常");
+        }
+        Set<String> employeeOrganList = Arrays.stream(employee.getOrganIdList().split(",")).collect(Collectors.toSet());
+        Set<String> teacherOrganList = Arrays.stream(queryInfo.getOrganId().split(",")).collect(Collectors.toSet());
+        List<String> organIdList = teacherOrganList.stream().filter(id -> employeeOrganList.contains(id)).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(organIdList)){
+            return failed("用户所在分部异常");
+        }
+        queryInfo.setOrganId(StringUtils.join(organIdList, ","));
+
+        queryInfo.setIsExport(false);
+        return succeed(studentManageService.findStudentsByOrganId(queryInfo));
+    }
+
 }

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduSubjectController.java

@@ -3,8 +3,11 @@ package com.ym.mec.web.controller.education;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -24,4 +27,10 @@ public class EduSubjectController extends BaseController {
     public Object findSubSubjects(Integer tenantId){
         return succeed(subjectService.findSubSubjects(tenantId));
     }
+
+    @ApiOperation(value = "根据科目编号查询科目")
+    @GetMapping("/findBySubjectByIdList")
+    public Object get(String subjectIdList){
+        return succeed(subjectService.findBySubjectByIdList(subjectIdList));
+    }
 }

+ 93 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupActivityController.java

@@ -0,0 +1,93 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.VipGroupActivityAddDto;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.VipGroupActivityService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/10/1
+ */
+
+@Api(tags = "vip课活动")
+@RequestMapping("eduVipGroupActivity")
+@RestController
+public class EduVipGroupActivityController extends BaseController {
+
+    @Autowired
+    private VipGroupActivityService vipGroupActivityService;
+	@Autowired
+    private TeacherDao teacherDao;
+	@Autowired
+    private StudentDao studentDao;
+	@Autowired
+    private SysConfigService sysConfigService;
+
+    @ApiOperation(value = "根据课程类型获取对应课程活动方案")
+    @GetMapping("/findByVipGroupCategory")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupActivity/findByVipGroupCategory')")
+    public Object findByVipGroupCategory(Long categoryId, String studentIds, Integer teacherId){
+        if(StringUtils.isBlank(studentIds)){
+            return failed("请选择学员");
+        }
+
+        SysConfig activityIdConfig = sysConfigService.findByParamName(SysConfigService.CHILDREN_DAY_VIP_ACTIVITY_IDS);
+        if(Objects.isNull(activityIdConfig)||StringUtils.isBlank(activityIdConfig.getParanValue())){
+            return succeed();
+        }
+
+        Set<Integer> activityIds = Arrays.stream(activityIdConfig.getParanValue().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toSet());
+
+        List<Integer> userIds = Arrays.stream(studentIds.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
+        List<Student> students = studentDao.findByStudentIds(userIds);
+        if(CollectionUtils.isEmpty(students)||students.size()!=userIds.size()){
+            return failed("学员信息不存在");
+        }
+        long newStudentNum = students.stream().filter(s -> s.getIsNewUser()).count();
+
+        Integer applyToStudentType = -1;
+        if(newStudentNum==0){
+            applyToStudentType = 0;
+        }else if(newStudentNum==userIds.size()){
+            applyToStudentType = 1;
+        }
+
+        SysUser student = teacherDao.getUser(userIds.get(0));
+        if(Objects.isNull(student)){
+            return failed("学员信息不存在");
+        }
+        String organIds = student.getOrganId().toString();
+        List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.findByVipGroupCategory(categoryId, organIds, teacherId, applyToStudentType);
+        Iterator<VipGroupActivity> iterator = vipGroupActivities.iterator();
+        while (iterator.hasNext()){
+            VipGroupActivity vipGroupActivity = iterator.next();
+            if(!activityIds.contains(vipGroupActivity.getId())){
+                iterator.remove();
+            }
+        }
+        return succeed(vipGroupActivities);
+    }
+
+}

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupCategoryController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.VipGroupCategory;
+import com.ym.mec.biz.service.VipGroupCategoryService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Api(tags = "vip课类别")
+@RequestMapping("eduVipGroupCategory")
+@RestController
+public class EduVipGroupCategoryController extends BaseController {
+
+	@Autowired
+	private VipGroupCategoryService vipGroupCategoryService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private EmployeeDao employeeDao;
+
+	@ApiOperation("全查询")
+	@GetMapping(value = "/queryAll")
+	public Object queryAll(String organId) {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		Employee employee = employeeDao.get(sysUser.getId());
+		if (StringUtils.isEmpty(organId)) {
+			organId = employee.getOrganIdList();
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(organId.split(",")))){
+				return failed("非法请求");
+			}
+		}
+		return succeed(vipGroupCategoryService.findAllByOrgan(organId));
+	}
+}

+ 72 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduVipGroupManageController.java

@@ -0,0 +1,72 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+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.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2019/9/21
+ */
+@Api(tags = "vip课")
+@RequestMapping("eduVipGroupManage")
+@RestController
+public class EduVipGroupManageController extends BaseController {
+
+    @Autowired
+    private VipGroupService vipGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @ApiOperation(value = "创建六一活动vip课")
+    @PostMapping("/createActivityVipGroup")
+    public Object createActivityVipGroup(@RequestBody VipGroupApplyDto vipGroupApplyDto){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Integer userId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getUserId();
+        Teacher teacher = teacherDao.get(userId);
+        if(Objects.isNull(teacher)){
+            return failed("请指定指导老师!");
+        }
+        if(Objects.isNull(vipGroupApplyDto.getVipGroupApplyBaseInfo().getOrganId())){
+            Integer firstStudentId = vipGroupApplyDto.getVipGroupApplyBaseInfo().getFirstStudentId();
+            SysUser student = teacherDao.getUser(firstStudentId);
+            if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
+                return failed("学员信息异常");
+            }
+            vipGroupApplyDto.getVipGroupApplyBaseInfo().setOrganId(student.getOrganId());
+        }
+        for (CourseSchedule courseSchedule : vipGroupApplyDto.getCourseSchedules()) {
+            courseSchedule.setEndClassTime(DateUtil.addMinutes(courseSchedule.getStartClassTime(), vipGroupApplyDto.getVipGroupApplyBaseInfo().getSingleClassMinutes()));
+        }
+        vipGroupApplyDto.getVipGroupApplyBaseInfo().setEducationalTeacherId(sysUser.getId());
+        return vipGroupService.createActivityVipGroup(vipGroupApplyDto);
+    }
+
+    @PostMapping("/exportActivityVipGroup")
+    public HttpResponseResult importActivityVipGroup(String data){
+        vipGroupService.importActivityVipGroup(data);
+        return succeed();
+    }
+
+}

+ 143 - 0
mec-web/src/main/resources/application.yml

@@ -0,0 +1,143 @@
+server:
+  port: 8005
+  connection-timeout: 60000
+  tomcat:
+    min-spare-threads: 50
+    max-threads: 500
+    accesslog:
+      enabled: true
+      buffered: true
+      directory: /var/logs
+      file-date-format: -yyyy-MM-dd
+      pattern: common
+      prefix: tomcat-web
+      rename-on-rotate: false
+      request-attributes-enabled: false
+      rotate: true
+      suffix: .log
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123@localhost:8761/eureka/eureka/
+    instance:
+      lease-renewal-interval-in-seconds: 5
+      prefer-ip-address: true
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 150MB
+      max-request-size: 150MB
+  application:
+    name: web-server
+
+  data:
+    mongodb:
+      uri: mongodb://root:dayayuemeng2019@47.114.1.200:27017/mec_dev
+
+  datasource:
+    name: test
+    url: jdbc:mysql://rm-bp13774a2o87ti8c7mo.mysql.rds.aliyuncs.com:3306/mec_pro?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    username: mec_pro
+    password: mec@Pro9
+    # 使用druid数据源
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      connection-init-sqls: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    filters: stat
+    maxActive: 50
+    initialSize: 10
+    maxWait: 60000
+    minIdle: 1
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 300000
+    validationQuery: select 'x'
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    poolPreparedStatements: true
+    maxOpenPreparedStatements: 20
+
+  redis:
+    host: 47.114.1.200
+    port: 6379
+    password: dyym
+    database: 1
+    #连接超时时间(毫秒)
+    timeout: 10000
+    jedis:
+      pool:
+        #连接池最大连接数(使用负值表示没有限制)
+        max-active: 20
+        #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: 10000
+        #连接池中的最大空闲连接
+        max-idle: 10
+        #连接池中的最小空闲连接
+        min-idle: 5
+
+mybatis:
+  mapperLocations: classpath:config/mybatis/*.xml
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+
+swagger:
+  base-package: com.ym.mec.web.controller
+
+##认证
+security:
+  oauth2:
+    client:
+      client-id: app
+      client-secret: app
+    resource:
+      token-info-uri: http://localhost:8001/oauth/check_token
+
+#spring boot admin 相关配置
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: ALWAYS
+
+
+ribbon:
+  ReadTimeout: 600000
+  ConnectTimeout: 60000
+
+logging:
+  level:
+    com.ym.mec.auth.api.client.SysUserFeignService: INFO
+
+message:
+  debugMode: true
+
+##支付流水隐藏
+payment:
+  hiddenMode: false
+  #隐藏的支付方式
+  channel: YQPAY
+
+eseal:
+  tsign:
+    projectid: 4438776254
+    projectSecret: a94cf63d6361084d232f345d71321691
+    apisUrl: http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2
+
+push:
+  jiguang:
+    reqURL: https://api.jpush.cn/v3/push
+    appKey:
+      student: 0e7422e1d6e73637e678716a
+      teacher: 7e0282ca92c12c8c45a93bb3
+      system: 496fc1007dea59b1b4252d2b
+    masterSecret:
+      student: c2361016604eab56ab2db2ac
+      teacher: d47430e2f4755ef5dc050ac5
+      system: a5e51e9cdb25417463afbf7a
+    apns_production: false