Browse Source

Merge branch 'saas_activity_user_mapper' of http://git.dayaedu.com/yonge/mec into master_saas

zouxuan 3 years ago
parent
commit
b9500e9fe5
29 changed files with 1602 additions and 130 deletions
  1. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  2. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 67 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserDto.java
  4. 20 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseFormDto.java
  5. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeGroupApplyBaseInfoDto.java
  6. 97 20
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  7. 74 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ActivityUserQueryInfo.java
  8. 61 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  9. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  10. 689 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  11. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/GroupClassServiceImpl.java
  12. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  13. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  14. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  15. 12 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  16. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  17. 10 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  18. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  19. 237 6
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  20. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  21. 105 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java
  22. 9 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/StudentController.java
  23. 8 30
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherPracticeGroupController.java
  24. 9 32
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java
  25. 1 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yqpay/DateUtils.java
  26. 0 3
      mec-web/src/main/java/com/ym/mec/web/controller/ActivityUserMapperController.java
  27. 112 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduActivityUserMapperController.java
  28. 1 1
      mec-web/src/main/resources/bootstrap-test.properties
  29. 3 3
      mec-web/src/main/resources/logback-spring.xml

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

@@ -1,8 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ActivityStudentDto;
+import com.ym.mec.biz.dal.dto.ActivityUserDto;
+import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.ExportStudentSubCourse;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.page.ActivityUserQueryInfo;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Component;
@@ -112,4 +115,30 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
                                   @Param("activityId") Integer activityId);
 
     List<ExportStudentSubCourse> exportStudentSubCourse(@Param("organId") String organId,@Param("tenantId") Integer tenantId);
+
+    List<CourseFormDto> queryWaitCourseCategory(@Param("userId") Integer userId, @Param("organIds") String organIds);
+
+    List<ActivityUserDto> queryActivityStudentList(@Param("queryInfo") ActivityUserQueryInfo activityUserQueryInfo);
+
+    /**
+    * @description: 获取活动排课可排课时长列表
+     * @param activityUserQueryInfo
+    * @return java.util.List<java.lang.Integer>
+    * @author zx
+    * @date 2022/7/25 10:01
+    */
+    List<Integer> queryActivityCourseTimeList(@Param("queryInfo") ActivityUserQueryInfo activityUserQueryInfo);
+
+    List<ActivityUserMapper> findTotalByStudents(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+    List<ActivityUserMapper> findByStudents(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+
+    List<ActivityUserMapper> findByStudents1(@Param("studentIdList") List<Integer> studentIdList,
+                                            @Param("categoryId") Integer categoryId,
+                                            @Param("classMinutes") Integer classMinutes);
+
+    void batchUpdate(@Param("useActivityUserMappers") List<ActivityUserMapper> useActivityUserMappers);
 }

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

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

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ActivityUserDto.java

@@ -0,0 +1,67 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class ActivityUserDto {
+
+    private Integer userId;
+
+    private String avatar;
+
+    private String username;
+
+    private String subjectId;
+
+    private String subjectName;
+
+    @ApiModelProperty(value = "剩余可排课次数")
+    private String subCourseNum;
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getSubCourseNum() {
+        return subCourseNum;
+    }
+
+    public void setSubCourseNum(String subCourseNum) {
+        this.subCourseNum = subCourseNum;
+    }
+}

+ 20 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseFormDto.java

@@ -1,26 +1,34 @@
 package com.ym.mec.biz.dal.dto;
 
-import java.math.BigDecimal;
-
 public class CourseFormDto {
 
-    private String type;
+    private String name;
+
+    private Integer id;
+
+    private Integer num;
 
-    private BigDecimal price;
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 
-    public String getType() {
-        return type;
+    public Integer getId() {
+        return id;
     }
 
-    public void setType(String type) {
-        this.type = type;
+    public void setId(Integer id) {
+        this.id = id;
     }
 
-    public BigDecimal getPrice() {
-        return price;
+    public Integer getNum() {
+        return num;
     }
 
-    public void setPrice(BigDecimal price) {
-        this.price = price;
+    public void setNum(Integer num) {
+        this.num = num;
     }
 }

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

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

+ 97 - 20
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java

@@ -13,6 +13,21 @@ public class ActivityUserMapper extends BaseEntity {
 
 	private Integer id;
 	
+	@ApiModelProperty(value = "单节课时长")
+	private Integer singleCourseTime;
+
+	@ApiModelProperty(value = "单节课价值")
+	private BigDecimal singleCoursePrice = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "赠送单节课时长")
+	private Integer giveSingleCourseTime;
+
+	@ApiModelProperty(value = "可排课课程类型")
+	private Integer categoryId;
+
+	@ApiModelProperty(value = "赠送可排课课程类型")
+	private Integer giveCategoryId;
+
 	@ApiModelProperty(value = "活动编号")
 	private Integer activityId;
 	
@@ -41,25 +56,25 @@ public class ActivityUserMapper extends BaseEntity {
 	private Integer giveMemberFlag = 0;
 
 	@ApiModelProperty(value = "购买的总课时数")
-	private Integer totalCourseNum;
+	private Integer totalCourseNum = 0;
 
 	@ApiModelProperty(value = "赠送的总课时数")
-	private Integer totalGiveCourseNum;
+	private Integer totalGiveCourseNum = 0;
 
 	@ApiModelProperty(value = "剩余的总课时数")
-	private Integer subCourseNum;
+	private Integer subCourseNum = 0;
 
 	@ApiModelProperty(value = "剩余的赠送课时数")
-	private Integer subGiveCourseNum;
+	private Integer subGiveCourseNum = 0;
 
 	@ApiModelProperty(value = "缴费编号")
 	private Long paymentOrderId;
 
-	@ApiModelProperty(value = "已排课的vip课程组编号")
-	private Long vipGroupId;
+	@ApiModelProperty(value = "已排课的vip课程组编号(多个逗号分割)")
+	private String vipGroupId;
 
-	@ApiModelProperty(value = "已排课的赠送的vip课程组编号")
-	private Long giveVipGroupId;
+	@ApiModelProperty(value = "已排课的赠送的vip课程组编号(多个逗号分割)")
+	private String giveVipGroupId;
 
 	@ApiModelProperty(value = "会员订单号")
 	private Long memberOrderId;
@@ -67,15 +82,21 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "赠送的会员订单号")
 	private Long giveMemberOrderId;
 
-	@ApiModelProperty(value = "已排课的陪练课课程组编号")
-	private Long practiceGroupId;
+	@ApiModelProperty(value = "已排课的陪练课课程组编号(多个逗号分割)")
+	private String practiceGroupId;
 
-	@ApiModelProperty(value = "已排课的陪练课课程组编号")
-	private Long givePracticeGroupId;
+	@ApiModelProperty(value = "已排课的陪练课课程组编号(多个逗号分割)")
+	private String givePracticeGroupId;
 
 	@ApiModelProperty(value = "是否退费")
 	private Boolean returnFee = false;
 
+	@ApiModelProperty(value = "剩余未排课金额")
+	private BigDecimal subNoCoursePrice = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "本次排课消耗的课程价值")
+	private BigDecimal currentCoursePrice = BigDecimal.ZERO;
+
 	@ApiModelProperty(value = "实际支付金额")
 	private BigDecimal actualPrice = BigDecimal.ZERO;
 
@@ -94,6 +115,62 @@ public class ActivityUserMapper extends BaseEntity {
 	@ApiModelProperty(value = "赠送的优惠券编号")
 	private Integer giveCouponId;
 
+	public BigDecimal getCurrentCoursePrice() {
+		return currentCoursePrice;
+	}
+
+	public void setCurrentCoursePrice(BigDecimal currentCoursePrice) {
+		this.currentCoursePrice = currentCoursePrice;
+	}
+
+	public BigDecimal getSingleCoursePrice() {
+		return singleCoursePrice;
+	}
+
+	public void setSingleCoursePrice(BigDecimal singleCoursePrice) {
+		this.singleCoursePrice = singleCoursePrice;
+	}
+
+	public Integer getSingleCourseTime() {
+		return singleCourseTime;
+	}
+
+	public void setSingleCourseTime(Integer singleCourseTime) {
+		this.singleCourseTime = singleCourseTime;
+	}
+
+	public Integer getGiveSingleCourseTime() {
+		return giveSingleCourseTime;
+	}
+
+	public void setGiveSingleCourseTime(Integer giveSingleCourseTime) {
+		this.giveSingleCourseTime = giveSingleCourseTime;
+	}
+
+	public Integer getCategoryId() {
+		return categoryId;
+	}
+
+	public void setCategoryId(Integer categoryId) {
+		this.categoryId = categoryId;
+	}
+
+	public Integer getGiveCategoryId() {
+		return giveCategoryId;
+	}
+
+	public void setGiveCategoryId(Integer giveCategoryId) {
+		this.giveCategoryId = giveCategoryId;
+	}
+
+	public BigDecimal getSubNoCoursePrice() {
+		return subNoCoursePrice;
+	}
+
+	public void setSubNoCoursePrice(BigDecimal subNoCoursePrice) {
+		this.subNoCoursePrice = subNoCoursePrice;
+	}
+
 	public Integer getTotalCourseNum() {
 		return totalCourseNum;
 	}
@@ -126,35 +203,35 @@ public class ActivityUserMapper extends BaseEntity {
 		this.subGiveCourseNum = subGiveCourseNum;
 	}
 
-	public Long getVipGroupId() {
+	public String getVipGroupId() {
 		return vipGroupId;
 	}
 
-	public void setVipGroupId(Long vipGroupId) {
+	public void setVipGroupId(String vipGroupId) {
 		this.vipGroupId = vipGroupId;
 	}
 
-	public Long getGiveVipGroupId() {
+	public String getGiveVipGroupId() {
 		return giveVipGroupId;
 	}
 
-	public void setGiveVipGroupId(Long giveVipGroupId) {
+	public void setGiveVipGroupId(String giveVipGroupId) {
 		this.giveVipGroupId = giveVipGroupId;
 	}
 
-	public Long getPracticeGroupId() {
+	public String getPracticeGroupId() {
 		return practiceGroupId;
 	}
 
-	public void setPracticeGroupId(Long practiceGroupId) {
+	public void setPracticeGroupId(String practiceGroupId) {
 		this.practiceGroupId = practiceGroupId;
 	}
 
-	public Long getGivePracticeGroupId() {
+	public String getGivePracticeGroupId() {
 		return givePracticeGroupId;
 	}
 
-	public void setGivePracticeGroupId(Long givePracticeGroupId) {
+	public void setGivePracticeGroupId(String givePracticeGroupId) {
 		this.givePracticeGroupId = givePracticeGroupId;
 	}
 

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

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

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

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

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

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

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

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

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

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

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

@@ -717,11 +717,17 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             activityUserMapper.setUserId(studentPaymentOrder.getUserId());
             activityUserMapper.setActivityId(activity.getId());
             activityUserMapper.setActualPrice(BigDecimal.ZERO);
+            activityUserMapper.setSubNoCoursePrice(BigDecimal.ZERO);
             activityUserMapper.setReturnFee(false);
+//            activityUserMapper.setTotalCourseNum(activity.getMinCourseNum());
+//            activityUserMapper.setSubCourseNum(activity.getMinCourseNum());
             //如果是买的商品1那么赠送陪练课和训练营
             if(Objects.equals(studentPaymentOrder.getClassGroupId(),1)){
                 //赠送陪练课
+                activityUserMapper.setTotalGiveCourseNum(activity.getGiveCourseNum());
+                activityUserMapper.setSubGiveCourseNum(activity.getGiveCourseNum());
                 activityUserMapper.setGivePracticeFlag(1);
+                activityUserMapper.setGiveCategoryId(Integer.parseInt(activity.getGiveCategoryId()));
                 //赠送训练营
                 TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
                 tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -17,6 +17,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -66,6 +67,8 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
     private StudentPaymentOrderDao studentPaymentOrderDao;
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private VipGroupActivityDao vipGroupActivityDao;
 
     @Override
     public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
@@ -241,6 +244,13 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
 
         List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
+        Map<Integer, VipGroupActivity> collect = new HashMap<>();
+        if(CollectionUtils.isNotEmpty(calenderActivities)){
+            List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.queryByIds(calenderActivities.stream().
+                    map(e -> e.getActivityId().toString()).distinct().collect(Collectors.joining(",")));
+            collect = vipGroupActivities.stream().collect(Collectors.groupingBy(e -> e.getId(),
+                    Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+        }
         MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalenderId);
         for (Integer studentId : userIdList) {
             musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
@@ -278,15 +288,20 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
                     for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
                         ActivityUserMapper activityUserMapper = new ActivityUserMapper();
                         activityUserMapper.setActualPrice(BigDecimal.ZERO);
+                        activityUserMapper.setSubNoCoursePrice(BigDecimal.ZERO);
                         activityUserMapper.setActivityId(calenderActivity.getActivityId());
                         Student student = studentDao.get(studentId);
                         activityUserMapper.setUserId(studentId);
                         activityUserMapper.setTeacherId(student.getTeacherId());
+                        VipGroupActivity activity = collect.get(activityUserMapper.getActivityId());
+                        activityUserMapper.setTotalCourseNum(activity.getMinCourseNum());
+                        activityUserMapper.setSubCourseNum(activity.getMinCourseNum());
                         if ("网管课".equals(calenderActivity.getCategoryName())) {
                             activityUserMapper.setPracticeFlag(1);
                         } else {
                             activityUserMapper.setVipFlag(1);
                         }
+                        activityUserMapper.setCategoryId(Integer.parseInt(activity.getVipGroupCategoryIdList()));
                         activityUserMapperList.add(activityUserMapper);
                     }
                     activityUserMapperService.batchInsert(activityUserMapperList);

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -27,6 +27,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -118,6 +119,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
     private ActivityUserMapperService activityUserMapperService;
     @Autowired
     private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private VipGroupActivityDao vipGroupActivityDao;
 
     @Override
     public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -691,6 +694,13 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 //            MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
 
             List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalender.getId());
+            Map<Integer, VipGroupActivity> collect = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(calenderActivities)){
+                List<VipGroupActivity> vipGroupActivities = vipGroupActivityDao.queryByIds(calenderActivities.stream().
+                        map(e -> e.getActivityId().toString()).distinct().collect(Collectors.joining(",")));
+                collect = vipGroupActivities.stream().collect(Collectors.groupingBy(e -> e.getId(),
+                        Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+            }
             MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalender.getId());
             for (String studentId : studentIdStr.split(",")) {
                 if (termCourseDetail != null) {
@@ -740,15 +750,20 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
                         for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
                             ActivityUserMapper activityUserMapper = new ActivityUserMapper();
                             activityUserMapper.setActualPrice(BigDecimal.ZERO);
+                            activityUserMapper.setSubNoCoursePrice(BigDecimal.ZERO);
                             activityUserMapper.setActivityId(calenderActivity.getActivityId());
                             Student student = studentDao.get(Integer.parseInt(studentId));
                             activityUserMapper.setUserId(Integer.parseInt(studentId));
                             activityUserMapper.setTeacherId(student.getTeacherId());
+                            VipGroupActivity activity = collect.get(activityUserMapper.getActivityId());
+                            activityUserMapper.setTotalCourseNum(activity.getMinCourseNum());
+                            activityUserMapper.setSubCourseNum(activity.getMinCourseNum());
                             if ("网管课".equals(calenderActivity.getCategoryName())) {
                                 activityUserMapper.setPracticeFlag(1);
                             } else {
                                 activityUserMapper.setVipFlag(1);
                             }
+                            activityUserMapper.setCategoryId(Integer.parseInt(activity.getVipGroupCategoryIdList()));
                             activityUserMapperList.add(activityUserMapper);
                         }
                         activityUserMapperService.batchInsert(activityUserMapperList);

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

@@ -4605,7 +4605,11 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             activityUserMapper.setTeacherId(student.getTeacherId());
             activityUserMapper.setVipFlag(1);
             activityUserMapper.setActualPrice(order.getExpectAmount());
+            activityUserMapper.setSubNoCoursePrice(order.getExpectAmount());
             activityUserMapper.setTenantId(order.getTenantId());
+            activityUserMapper.setTotalCourseNum(activity.getMinCourseNum());
+            activityUserMapper.setSubCourseNum(activity.getMinCourseNum());
+            activityUserMapper.setCategoryId(Integer.parseInt(activity.getVipGroupCategoryIdList()));
             if (activity.isPayToBalance()) {
                 boolean appendCourseBalance = sysUserCashAccountService.appendCourseBalance(userId, studentPaymentOrder.getExpectAmount(), PlatformCashAccountDetailTypeEnum.RECHARGE, "通用营销活动购买");
                 if (!appendCourseBalance) {
@@ -4614,6 +4618,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             }
             if (activity.getFullMinusCourseTimes() != -1 && order.getActivityBuyNum() >= activity.getFullMinusCourseTimes()) {
                 activityUserMapper.setGiveVipFlag(1);
+                activityUserMapper.setTotalGiveCourseNum(activity.getGiveCourseNum());
+                activityUserMapper.setSubGiveCourseNum(activity.getGiveCourseNum());
+                activityUserMapper.setGiveCategoryId(Integer.parseInt(activity.getGiveCategoryId()));
             }
             activityUserMapperService.insert(activityUserMapper);
             SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(userId);
@@ -4827,8 +4834,9 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             ActivityUserMapper activityUserMapper = activityUserMapperService.findVipUserMapper(practiceGroupId, "PRACTICE", studentId);
             if (activityUserMapper != null && !activityUserMapper.getReturnFee()) {
                 if (Objects.nonNull(activityUserMapper.getVipGroupId())) {
-                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
-                    vipGroupCategory = vipGroupCategoryDao.get(group.getVipGroupCategoryId().intValue());
+//                    VipGroup group = vipGroupDao.get(activityUserMapper.getVipGroupId());
+//                    vipGroupCategory = vipGroupCategoryDao.get(group.getVipGroupCategoryId().intValue());
+                    vipGroupCategory = vipGroupCategoryDao.get(activityUserMapper.getCategoryId());
                     userCourseInfos.addAll(courseScheduleDao.findUserCourseInfos(GroupType.VIP, activityUserMapper.getVipGroupId().toString(), studentId, null));
                 }
                 if (Objects.nonNull(activityUserMapper.getGiveVipGroupId())) {
@@ -5184,7 +5192,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             courseScheduleService.checkNewCourseSchedules(practiceCourses, false, false);
         } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            String errMessage = new String();
+            String errMessage;
             if (e.getMessage().indexOf("主教冲突") != -1) {
                 errMessage = "抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
             } else {
@@ -5197,7 +5205,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.failed(HttpStatus.FOUND, errMessage);
         }
         activityUserMapper.setGivePracticeFlag(2);
-        activityUserMapper.setPracticeGroupId(practiceGroupBuyParams.getId());
+//        activityUserMapper.setPracticeGroupId(practiceGroupBuyParams.getId());
         activityUserMapperService.update(activityUserMapper);
         return BaseController.succeed();
     }

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

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

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

@@ -765,21 +765,25 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     public Integer activityGive(Integer vipGroupActivityId, StudentPaymentOrder studentPaymentOrder, Long vipGroupId, Long practiceGroupId, Integer teacherId) {
         Integer activityUserMapperId = null;
         if (vipGroupActivityId != null) {
+            VipGroupActivity activity = vipGroupActivityDao.get(vipGroupActivityId);
             ActivityUserMapper activityUserMapper = new ActivityUserMapper();
-            activityUserMapper.setVipGroupId(vipGroupId);
-            activityUserMapper.setPracticeGroupId(practiceGroupId);
+            activityUserMapper.setVipGroupId(vipGroupId.toString());
+            activityUserMapper.setPracticeGroupId(practiceGroupId.toString());
             activityUserMapper.setPaymentOrderId(studentPaymentOrder.getId());
             activityUserMapper.setUserId(studentPaymentOrder.getUserId());
             activityUserMapper.setActivityId(vipGroupActivityId);
             activityUserMapper.setTeacherId(teacherId);
             activityUserMapper.setActualPrice(studentPaymentOrder.getExpectAmount());
+            activityUserMapper.setSubNoCoursePrice(studentPaymentOrder.getExpectAmount());
+            activityUserMapper.setTotalCourseNum(activity.getMinCourseNum());
+            activityUserMapper.setCategoryId(Integer.parseInt(activity.getVipGroupCategoryIdList()));
             if (vipGroupId != null) {
                 activityUserMapper.setVipFlag(2);
             } else {
                 activityUserMapper.setPracticeFlag(2);
             }
+            activityUserMapper.setSubCourseNum(0);
             //是否达到满赠标准
-            VipGroupActivity activity = vipGroupActivityDao.get(vipGroupActivityId);
             if (activity.getFullMinusCourseTimes() == -1 || studentPaymentOrder.getActivityBuyNum() < activity.getFullMinusCourseTimes()) {
                 activityUserMapperDao.insert(activityUserMapper);
                 return activityUserMapper.getId();
@@ -791,6 +795,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 } else {
                     activityUserMapper.setGivePracticeFlag(1);
                 }
+                activityUserMapper.setTotalGiveCourseNum(activity.getGiveCourseNum());
+                activityUserMapper.setSubGiveCourseNum(activity.getGiveCourseNum());
+                activityUserMapper.setGiveCategoryId(Integer.parseInt(activity.getGiveCategoryId()));
             }
             //是否赠送优惠券
             if (activity.getGiveCouponNum() != null && activity.getGiveCouponNum() > 0) {

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

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

+ 237 - 6
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

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

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

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

+ 105 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ActivityUserMapperController.java

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

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

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

+ 8 - 30
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherPracticeGroupController.java

@@ -1,6 +1,5 @@
 package com.ym.mec.teacher.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.PracticeGroupSellPriceDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
@@ -9,13 +8,12 @@ import com.ym.mec.biz.dal.dto.PracticeGroupApplyDto;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.service.PracticeGroupService;
-import com.ym.mec.biz.service.VipGroupService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.common.controller.BaseController;
 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.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Map;
@@ -31,7 +29,7 @@ public class TeacherPracticeGroupController extends BaseController {
 	@Autowired
 	private PracticeGroupService practiceGroupService;
 	@Autowired
-	private SysUserFeignService sysUserFeignService;
+	private SysUserService sysUserService;
 	@Autowired
 	private TeacherDao teacherDao;
 	@Autowired
@@ -40,11 +38,7 @@ public class TeacherPracticeGroupController extends BaseController {
 	@ApiOperation("获取网管课分部价格")
 	@RequestMapping("/queryPracticeGroupSellPrice")
 	public Object queryPracticeGroupSellPrice(){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
-		Teacher teacher = teacherDao.get(sysUser.getId());
+		Teacher teacher = teacherDao.get(sysUserService.getUserId());
 		if(Objects.isNull(teacher)){
 			return failed("请指定指导老师!");
 		}
@@ -54,13 +48,10 @@ public class TeacherPracticeGroupController extends BaseController {
 	@ApiOperation("课酬总费用")
 	@GetMapping("/getPracticeGroupCostCount")
 	public Object getPracticeGroupCostCount(){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
-		Teacher teacher = teacherDao.get(sysUser.getId());
+		Integer userId = sysUserService.getUserId();
+		Teacher teacher = teacherDao.get(userId);
 		PracticeGroupApplyBaseInfoDto practice = new PracticeGroupApplyBaseInfoDto();
-		practice.setUserId(sysUser.getId());
+		practice.setUserId(userId);
 		practice.setOrganId(teacher.getOrganId());
 		Map results = practiceGroupService.countPracticeGroupPredictFee(practice,practice.getUserId());
 		return succeed(results);
@@ -69,17 +60,8 @@ public class TeacherPracticeGroupController extends BaseController {
 	@ApiOperation(value = "教师端网管课活动排课")
 	@PostMapping("/createPracticeGroup")
 	public Object createPracticeGroup(@RequestBody PracticeGroupApplyDto practiceGroupApplyDto){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
 		PracticeGroupApplyBaseInfoDto applyBaseInfo = practiceGroupApplyDto.getPracticeGroupApplyBaseInfoDto();
-		Integer userId = sysUser.getId();
-		applyBaseInfo.setUserId(userId);
-		Teacher teacher = teacherDao.get(userId);
-		if(Objects.isNull(teacher)){
-			return failed("请指定指导老师!");
-		}
+		applyBaseInfo.setUserId(sysUserService.getUserId());
 		SysUser student = teacherDao.getUser(applyBaseInfo.getStudentId());
 		if(Objects.isNull(student)||Objects.isNull(student.getOrganId())){
 			return failed("学员信息异常");
@@ -95,10 +77,6 @@ public class TeacherPracticeGroupController extends BaseController {
 	@ApiOperation(value = "网管课申请")
 	@PostMapping("/practiceGroupApply")
 	public Object practiceGroupApply(@RequestBody PracticeGroupApplyDto practiceGroupApplyDto){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("用户信息获取失败");
-		}
 		PracticeGroupApplyBaseInfoDto applyBaseInfoDto = practiceGroupApplyDto.getPracticeGroupApplyBaseInfoDto();
 		if(Objects.isNull(applyBaseInfoDto.getOrganId())){
 			SysUser student = teacherDao.getUser(applyBaseInfoDto.getStudentId());
@@ -109,7 +87,7 @@ public class TeacherPracticeGroupController extends BaseController {
 		}
 		applyBaseInfoDto.setType(CHARGE);
 		applyBaseInfoDto.setMemo("指导老师老师端申请网管课");
-		applyBaseInfoDto.setUserId(sysUser.getId());
+		applyBaseInfoDto.setUserId(sysUserService.getUserId());
 		return practiceGroupService.createPracticeGroup(practiceGroupApplyDto);
 	}
 

+ 9 - 32
mec-teacher/src/main/java/com/ym/mec/teacher/controller/VipGroupActivityController.java

@@ -1,6 +1,5 @@
 package com.ym.mec.teacher.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
@@ -12,6 +11,7 @@ import com.ym.mec.biz.dal.entity.VipGroupActivity;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
 import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.VipGroupActivityService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
@@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
+
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -36,7 +37,7 @@ public class VipGroupActivityController extends BaseController {
     @Autowired
     private VipGroupActivityService vipGroupActivityService;
     @Autowired
-    private SysUserFeignService sysUserFeignService;
+    private SysUserService sysUserService;
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
@@ -47,31 +48,19 @@ public class VipGroupActivityController extends BaseController {
     @ApiOperation(value = "获取老师待排课的活动方案列表")
     @RequestMapping("/queryWaitCourseActivity")
     public Object queryWaitCourseActivity(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        return succeed(vipGroupActivityService.queryWaitCourseActivity(sysUser.getId(),null));
+        return succeed(vipGroupActivityService.queryWaitCourseActivity(sysUserService.getUserId(),null));
     }
 
     @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));
+        return succeed(vipGroupActivityService.getActivityWaitCourseStudentNum(sysUserService.getUserId(),activityId));
     }
 
     @ApiOperation(value = "获取活动学员课排课次数")
     @RequestMapping("/getActivityStudentCanCourseNum")
     public Object getActivityStudentCanCourseNum(ActivityStudentQueryInfo queryInfo){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        queryInfo.setUserId(sysUser.getId());
+        queryInfo.setUserId(sysUserService.getUserId());
         return succeed(vipGroupActivityService.getActivityStudentCanCourseNum(queryInfo));
     }
 
@@ -90,22 +79,14 @@ public class VipGroupActivityController extends BaseController {
     @ApiOperation(value = "修改活动方案")
     @PostMapping("/update")
     public Object update(@RequestBody VipGroupActivityAddDto vipGroupActivityAddDto){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        vipGroupActivityService.updateVipGroupActivity(vipGroupActivityAddDto, sysUser.getId());
+        vipGroupActivityService.updateVipGroupActivity(vipGroupActivityAddDto, sysUserService.getUserId());
         return succeed();
     }
 
     @ApiOperation(value = "根据课程类型获取对应课程活动方案")
     @GetMapping("/findByVipGroupCategory")
     public Object findByVipGroupCategory(ActivityQueryDto activityQueryDto){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        activityQueryDto.setTeacherId(sysUser.getId());
+        activityQueryDto.setTeacherId(sysUserService.getUserId());
         String studentIds = activityQueryDto.getStudentIds();
         if(StringUtils.isBlank(studentIds)){
             return failed("请选择学员");
@@ -163,11 +144,7 @@ public class VipGroupActivityController extends BaseController {
     @ApiOperation(value = "获取六一活动方案")
     @GetMapping("/getChildrenDayActivitys")
     public Object findByVipGroupCategory1(ActivityQueryDto activityQueryDto){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
-            return failed("用户信息获取失败");
-        }
-        activityQueryDto.setTeacherId(sysUser.getId());
+        activityQueryDto.setTeacherId(sysUserService.getUserId());
         String studentIds = activityQueryDto.getStudentIds();
         if(StringUtils.isBlank(studentIds)){
             return failed("请选择学员");

+ 1 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yqpay/DateUtils.java

@@ -1,5 +1,6 @@
 package com.ym.mec.thirdparty.yqpay;
 
+import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 import java.text.DateFormat;

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

@@ -1,13 +1,10 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.page.ActivityStudentQueryInfo;
 import com.ym.mec.biz.service.ActivityUserMapperService;
 import com.ym.mec.biz.service.SysUserCashAccountLogService;
-import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;

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

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

+ 1 - 1
mec-web/src/main/resources/bootstrap-test.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=47.114.176.40:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=46f06363-b9d6-46f0-9cd7-7b33dcf26bb0
+spring.cloud.nacos.config.namespace=f753d9d9-4bb2-4df6-a483-da9e169617c4
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 3 - 3
mec-web/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-    <property name="LOG_HOME" value="/mdata/logs/web-%d{yyyy-MM-dd_HH}-%i.log"/>
+    <property name="LOG_HOME" value="/Users/chenxiaoyu/Documents/logs/web-%d{yyyy-MM-dd_HH}-%i.log"/>
     <property name="CONSOLE_LOG_PATTERN"
               value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n"/>
 
@@ -30,7 +30,7 @@
     <appender name="messagefile"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <FileNamePattern>/mdata/logs/web-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+            <FileNamePattern>/Users/chenxiaoyu/Documents/logs/web-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
             <MaxHistory>90</MaxHistory>
             <TimeBasedFileNamingAndTriggeringPolicy
                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
@@ -46,7 +46,7 @@
     <appender name="liveFile"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <FileNamePattern>/mdata/logs/web-live-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+            <FileNamePattern>/Users/chenxiaoyu/Documents/logs/web-live-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
             <MaxHistory>90</MaxHistory>
             <TimeBasedFileNamingAndTriggeringPolicy
                     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">