Browse Source

Merge remote-tracking branch 'origin/master'

zouxuan 4 years ago
parent
commit
60da657329
27 changed files with 633 additions and 67 deletions
  1. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java
  2. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  3. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  5. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  6. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroupSellPrice.java
  7. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  8. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/PracticeGroupType.java
  9. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  10. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EduPracticeGroupService.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ExtracurricularExercisesService.java
  12. 14 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  13. 14 37
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  14. 331 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java
  15. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesServiceImpl.java
  16. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  17. 1 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  18. 7 1
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesMapper.xml
  19. 2 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  20. 1 1
      mec-biz/src/main/resources/config/mybatis/PracticeGroupMapper.xml
  21. 2 0
      mec-biz/src/main/resources/config/mybatis/PracticeGroupSellPriceMapper.xml
  22. 9 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  23. 16 4
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  24. 14 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  25. 4 3
      mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml
  26. 28 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java
  27. 33 3
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduPracticeGroupController.java

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ExtracurricularExercisesDao.java

@@ -36,6 +36,7 @@ public interface ExtracurricularExercisesDao extends BaseDAO<Long, Extracurricul
      */
     List<BasicUserDto> findNoExercisesStudentsInThisWeekWithTeacher(@Param("teacherId") Integer teacherId,
                                                                     @Param("startDate") String startDate,
+                                                                    @Param("musicGroupId") String musicGroupId,
                                                                     @Param("search") String search);
 
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.*;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.Subject;
 
 import org.apache.ibatis.annotations.Param;
@@ -450,4 +451,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @param calenderId
      */
     void updatePaymentStatusByClaenderId(Long calenderId);
+
+    /**
+     * @describe 查询学员在读进行中乐团
+     * @author Joburgess
+     * @date 2021/1/29 0029
+     * @param studentIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroup>
+     */
+    List<MusicGroup> getStudentNormalMusicGroups(@Param("studentIds") Set<Integer> studentIds);
 }

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java

@@ -1,5 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+
 import java.util.Objects;
 
 public class BasicUserDto {
@@ -24,6 +26,28 @@ public class BasicUserDto {
 
     private String phone;
 
+    @ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
+    private Integer carePackage;
+
+    @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
+    private Integer comeOnPackage;
+
+    public Integer getCarePackage() {
+        return carePackage;
+    }
+
+    public void setCarePackage(Integer carePackage) {
+        this.carePackage = carePackage;
+    }
+
+    public Integer getComeOnPackage() {
+        return comeOnPackage;
+    }
+
+    public void setComeOnPackage(Integer comeOnPackage) {
+        this.comeOnPackage = comeOnPackage;
+    }
+
     public String getUserType() {
         return userType;
     }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.enums.TeachTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
@@ -87,6 +88,16 @@ public class CourseScheduleDto extends CourseSchedule {
 
     private int isNew;
 
+    private PracticeGroupType practiceType;
+
+    public PracticeGroupType getPracticeType() {
+        return practiceType;
+    }
+
+    public void setPracticeType(PracticeGroupType practiceType) {
+        this.practiceType = practiceType;
+    }
+
     public String getUrl() {
         return url;
     }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -83,6 +83,28 @@ public class StudentManageListDto {
     
     private boolean isSignedContract;
 
+    @ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
+    private Integer carePackage;
+
+    @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
+    private Integer comeOnPackage;
+
+    public Integer getCarePackage() {
+        return carePackage;
+    }
+
+    public void setCarePackage(Integer carePackage) {
+        this.carePackage = carePackage;
+    }
+
+    public Integer getComeOnPackage() {
+        return comeOnPackage;
+    }
+
+    public void setComeOnPackage(Integer comeOnPackage) {
+        this.comeOnPackage = comeOnPackage;
+    }
+
     public Integer getIsNewUser() {
         return isNewUser;
     }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroupSellPrice.java

@@ -39,6 +39,10 @@ public class PracticeGroupSellPrice {
 
     private BigDecimal highOnlineTenCourseActivityPriceWithOldUser;
 
+    private BigDecimal carePackagePrice;
+
+    private BigDecimal comeOnPackagePrice;
+
     private Date createTime;
 
     private Date updateTime;
@@ -178,4 +182,20 @@ public class PracticeGroupSellPrice {
     public void setHighOnlineTenCourseActivityPriceWithOldUser(BigDecimal highOnlineTenCourseActivityPriceWithOldUser) {
         this.highOnlineTenCourseActivityPriceWithOldUser = highOnlineTenCourseActivityPriceWithOldUser;
     }
+
+    public BigDecimal getCarePackagePrice() {
+        return carePackagePrice;
+    }
+
+    public void setCarePackagePrice(BigDecimal carePackagePrice) {
+        this.carePackagePrice = carePackagePrice;
+    }
+
+    public BigDecimal getComeOnPackagePrice() {
+        return comeOnPackagePrice;
+    }
+
+    public void setComeOnPackagePrice(BigDecimal comeOnPackagePrice) {
+        this.comeOnPackagePrice = comeOnPackagePrice;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.entity;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -41,6 +42,12 @@ public class Student extends SysUser {
 
 	private Boolean isNewUser;
 
+	@ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
+	private Integer carePackage;
+
+	@ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
+	private Integer comeOnPackage;
+
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;
@@ -133,6 +140,23 @@ public class Student extends SysUser {
 	public void setTeacherId(Integer teacherId) {
 		this.teacherId = teacherId;
 	}
+
+	public Integer getCarePackage() {
+		return carePackage;
+	}
+
+	public void setCarePackage(Integer carePackage) {
+		this.carePackage = carePackage;
+	}
+
+	public Integer getComeOnPackage() {
+		return comeOnPackage;
+	}
+
+	public void setComeOnPackage(Integer comeOnPackage) {
+		this.comeOnPackage = comeOnPackage;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/PracticeGroupType.java

@@ -6,7 +6,9 @@ public enum PracticeGroupType implements BaseEnum<String, PracticeGroupType> {
 
 	FREE("FREE","免费"),
 	CHARGE("CHARGE","收费"),
-	TRIAL("TRIAL","试听");
+	TRIAL("TRIAL","试听"),
+	CARE_PACKAGE("CARE_PACKAGE", "关心包"),
+	COME_ON_PACKAGE("COME_ON_PACKAGE", "加油包");
 
 	private String code;
 

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

@@ -40,6 +40,26 @@ public class StudentManageQueryInfo extends QueryInfo {
 
     private Integer isNewUser;
 
+    private Integer carePackage;
+
+    private Integer comeOnPackage;
+
+    public Integer getCarePackage() {
+        return carePackage;
+    }
+
+    public void setCarePackage(Integer carePackage) {
+        this.carePackage = carePackage;
+    }
+
+    public Integer getComeOnPackage() {
+        return comeOnPackage;
+    }
+
+    public void setComeOnPackage(Integer comeOnPackage) {
+        this.comeOnPackage = comeOnPackage;
+    }
+
     public Integer getIsNewUser() {
         return isNewUser;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EduPracticeGroupService.java

@@ -26,6 +26,16 @@ public interface EduPracticeGroupService {
     HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
 
     /**
+     * @describe 创建关心包、加油包课程
+     * @author Joburgess
+     * @date 2021/1/28 0028
+     * @param practiceGroupBuyParams:
+     * @param operatorInfo:
+     * @return com.ym.mec.common.entity.HttpResponseResult
+     */
+    HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
+
+    /**
      * @describe 支付订单回调
      * @author Joburgess
      * @date 2020/2/17

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

@@ -36,7 +36,7 @@ public interface ExtracurricularExercisesService extends BaseService<Long, Extra
      * @param search:
      * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
-    List<BasicUserDto> getDontServeStudents(Integer teacherId, String search);
+    List<BasicUserDto> getDontServeStudents(Integer teacherId, String search, String musicGroupId);
 
     /**
      * @describe 应布置课外训练提醒

+ 14 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -34,6 +34,7 @@ import java.util.stream.Collectors;
 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.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.util.collection.ListUtil;
@@ -50,17 +51,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
-import com.ym.mec.biz.dal.enums.TeachModeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.ClassGroupQueryInfo;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
@@ -828,6 +818,13 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //获取学员购买的陪练课列表
         List<CourseListDto> practiceCourse = classGroupDao.queryStudentPracticeCourses(StringUtils.join(musicGroupIds, ","));
         Set<String> practiceGroupId = practiceCourse.stream().map(e -> e.getPracticeId()).collect(Collectors.toSet());
+
+        Map<Long, PracticeGroupType> practiceGroupTypeMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(practiceGroupId)){
+            List<PracticeCourseDto> practiceGroups = practiceGroupDao.getPracticeGroupByIds(practiceGroupId.stream().map(id->Long.valueOf(id)).collect(Collectors.toList()));
+            practiceGroupTypeMap = practiceGroups.stream().collect(Collectors.toMap(PracticeCourseDto::getId, PracticeCourseDto::getType));
+        }
+
         //获取陪练课学生名字
         Map<String, String> practiceStuNames = MapUtil.convertIntegerMap(classGroupDao.findVipStuNames(StringUtils.join(practiceGroupId, ","), "PRACTICE"));
         //获取有陪练报告的课程组
@@ -905,6 +902,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         e.setStudyReportUrl(baseUrl + "/#/reportDetailNew?id=" + courseScheduleEvaluate.getId() + "&classGroupId=" + e.getClassGroupId());
                     }
                 }
+                if(Objects.nonNull(e.getPracticeId())&&practiceGroupTypeMap.containsKey(Long.valueOf(e.getPracticeId()))){
+                    if(PracticeGroupType.CARE_PACKAGE.equals(practiceGroupTypeMap.get(Long.valueOf(e.getPracticeId()))))
+                        e.setPracticeType(2);
+                    else if(PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroupTypeMap.get(Long.valueOf(e.getPracticeId()))))
+                        e.setPracticeType(3);
+                }
             }
             if (ClassGroupTypeEnum.VIP == e.getType()) {
                 e.setStudentNames(vipStuNames.get(e.getVipId()));

+ 14 - 37
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -30,6 +30,8 @@ import java.util.TreeSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -74,27 +76,6 @@ import com.ym.mec.biz.dal.dao.TeacherDefaultMusicGroupSalaryDao;
 import com.ym.mec.biz.dal.dao.TeacherDefaultPracticeGroupSalaryDao;
 import com.ym.mec.biz.dal.dao.TeacherDefaultVipGroupSalaryDao;
 import com.ym.mec.biz.dal.dao.VipGroupDao;
-import com.ym.mec.biz.dal.dto.BatchInsertCoursesDto;
-import com.ym.mec.biz.dal.dto.ClassDateAdjustDto;
-import com.ym.mec.biz.dal.dto.CourseAttendanceDetailHeadInfoDto;
-import com.ym.mec.biz.dal.dto.CourseMergeDto;
-import com.ym.mec.biz.dal.dto.CoursePostponeDto;
-import com.ym.mec.biz.dal.dto.CourseRepeatCheckDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleEndDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleRateDto;
-import com.ym.mec.biz.dal.dto.CourseScheduleStudentDto;
-import com.ym.mec.biz.dal.dto.CourseTimeDto;
-import com.ym.mec.biz.dal.dto.CreateCourseScheduleDto;
-import com.ym.mec.biz.dal.dto.IntegerAndIntegerListDto;
-import com.ym.mec.biz.dal.dto.Mapper;
-import com.ym.mec.biz.dal.dto.StudentNameAndPhoneDto;
-import com.ym.mec.biz.dal.dto.TeacherAttendanceDto;
-import com.ym.mec.biz.dal.dto.TeacherClassCourseSchudeleDto;
-import com.ym.mec.biz.dal.dto.TeacherRemarkCommitDto;
-import com.ym.mec.biz.dal.dto.VipGroupApplyBaseInfoDto;
-import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
-import com.ym.mec.biz.dal.dto.VipGroupCourseAdjustInfoDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
@@ -125,21 +106,6 @@ import com.ym.mec.biz.dal.entity.TeacherDefaultMusicGroupSalary;
 import com.ym.mec.biz.dal.entity.TeacherDefaultPracticeGroupSalary;
 import com.ym.mec.biz.dal.entity.TeacherDefaultVipGroupSalary;
 import com.ym.mec.biz.dal.entity.VipGroup;
-import com.ym.mec.biz.dal.enums.AuditStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
-import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.enums.CourseStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.ParamEnum;
-import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
-import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
-import com.ym.mec.biz.dal.enums.TeachModeEnum;
-import com.ym.mec.biz.dal.enums.TeachTypeEnum;
-import com.ym.mec.biz.dal.enums.VipGroupStatusEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
@@ -1048,7 +1014,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 .filter(cs -> cs.getType().equals(CourseSchedule.CourseScheduleType.VIP) || cs.getType().equals(CourseSchedule.CourseScheduleType.DEMO) || cs.getType().equals(CourseScheduleType.PRACTICE) || cs.getType().equals(CourseScheduleType.COMM))
                 .map(CourseScheduleDto::getId).collect(Collectors.toList());
 
-        Map<Integer, String> subjectNameCourseMap = new HashMap<>();
+		Map<Integer, String> subjectNameCourseMap = new HashMap<>();
         Map<Integer, String> subjectIdCourseMap = new HashMap<>();
         Map<Integer, Integer> reviewIdMap = new HashMap<>();
         Map<Long, Long> StudentReviewIdMap = new HashMap<>();
@@ -1064,6 +1030,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			StudentReviewIdMap = studentReviews.stream().collect(Collectors.toMap(CourseScheduleComplaints::getCourseScheduleId, CourseScheduleComplaints::getId));
 		}
 
+		Set<Long> practiceGroupIds = studentCourseSchedulesWithDate.stream().filter(cs -> CourseScheduleType.PRACTICE.equals(cs.getType())&&Objects.nonNull(cs.getMusicGroupId())).map(cs->Long.valueOf(cs.getMusicGroupId())).collect(Collectors.toSet());
+
+		Map<Long, PracticeGroupType> practiceGroupTypeMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(practiceGroupIds)){
+			List<PracticeCourseDto> practiceGroups = practiceGroupDao.getPracticeGroupByIds(new ArrayList<>(practiceGroupIds));
+			practiceGroupTypeMap = practiceGroups.stream().collect(Collectors.toMap(PracticeCourseDto::getId, PracticeCourseDto::getType));
+		}
+
         for (CourseScheduleDto courseScheduleDto : studentCourseSchedulesWithDate) {
             if (now.before(courseScheduleDto.getStartClassTime())) {
                 courseScheduleDto.setStatus(CourseStatusEnum.NOT_START);
@@ -1076,6 +1050,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             courseScheduleDto.setSubjectId(subjectIdCourseMap.get(courseScheduleDto.getId().intValue()));
 			courseScheduleDto.setReviewId(reviewIdMap.get(courseScheduleDto.getId().intValue()));
 			courseScheduleDto.setStudentReviewId(StudentReviewIdMap.get(courseScheduleDto.getId()));
+			if(CourseScheduleType.PRACTICE.equals(courseScheduleDto.getType())&&Objects.nonNull(courseScheduleDto.getMusicGroupId())){
+				courseScheduleDto.setPracticeType(practiceGroupTypeMap.get(Long.valueOf(courseScheduleDto.getMusicGroupId())));
+			}
         }
         result.put("list", studentCourseSchedulesWithDate);
         return result;

+ 331 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java

@@ -27,6 +27,7 @@ import com.ym.mec.util.string.MessageFormatter;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
@@ -183,6 +184,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
         Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
         SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+
         SysConfig practiceBuyActivityExpireDateConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_BUY_ACTIVITY_EXPIRE_DATE);
         Date practiceBuyActivityExpireDate= DateUtil.stringToDate(practiceBuyActivityExpireDateConfig.getParanValue(),"yyyy-MM-dd HH:mm:ss");
         SysConfig practicePromotionActivityStartDateConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_PROMOTION_ACTIVITY_START_DATE);
@@ -495,6 +497,335 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         }
     }
 
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo) {
+        if (Objects.isNull(practiceGroupBuyParams.getUserId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择教师");
+        }
+        if (Objects.isNull(practiceGroupBuyParams.getSubjectId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择声部");
+        }
+        if (CollectionUtils.isEmpty(practiceGroupBuyParams.getDrillTimes())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择训练时间");
+        }
+
+        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroupBuyParams.getStudentId());
+
+        Student student = studentDao.get(practiceGroupBuyParams.getStudentId());
+        if(Objects.isNull(student)){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "学员信息异常");
+        }
+
+        int courseTimes = 0;
+
+        if(PracticeGroupType.CARE_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            if(Objects.isNull(student.getCarePackage())||student.getCarePackage().equals(0)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员暂无关心包排课资格");
+            }else if(student.getCarePackage().equals(2)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员已使用关心包排课资格");
+            }
+            student.setCarePackage(2);
+            courseTimes = 4;
+        }else if(PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            if(Objects.isNull(student.getComeOnPackage())||student.getComeOnPackage().equals(0)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员暂无加油包排课资格");
+            }else if(student.getComeOnPackage().equals(2)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员已使用加油包排课资格");
+            }
+            student.setComeOnPackage(2);
+            courseTimes = 8;
+        }
+
+        if(courseTimes<=0){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "课程信息错误");
+        }
+
+        Subject subject = subjectDao.get(practiceGroupBuyParams.getSubjectId());
+        if (Objects.isNull(subject)) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "预约失败,声部选择错误,请重试。");
+        }
+
+        Teacher teacher = teacherService.getDetail(practiceGroupBuyParams.getUserId());
+        if (Objects.isNull(teacher)) {
+            throw new BizException("老师不存在");
+        }
+
+        //网管课课程时长
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        //网管课默认课酬
+        SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+
+        Date now=new Date();
+
+        LocalDate courseStartDay=LocalDate.now();
+
+        practiceGroupBuyParams.setName(subject.getName() + "•" + sysUser.getUsername());
+
+        List<CourseSchedule> practiceCourses = new ArrayList<>();
+
+        while (practiceCourses.size()<courseTimes){
+            courseStartDay=courseStartDay.plusDays(1);
+            int dayOfWeek = courseStartDay.get(DateUtil.weekFields.dayOfWeek());
+            for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+                if(practiceCourses.size()==courseTimes){
+                    break;
+                }
+                if(dayOfWeek==drillTime.getWeekNum()){
+                    CourseSchedule courseSchedule=new CourseSchedule();
+                    String courseStartDayStr = DateUtil.dateFormatter.format(courseStartDay);
+                    String courseStartDateTimeStr = courseStartDayStr+" "+drillTime.getTimeStr();
+                    LocalDateTime courseStartDateTime = LocalDateTime.parse(courseStartDateTimeStr,DateUtil.dateTimeFormatter);
+                    LocalDateTime courseEndDateTime = courseStartDateTime.plusMinutes(practiceCourseMinutes);
+                    courseSchedule.setStartClassTime(Date.from(courseStartDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setEndClassTime(Date.from(courseEndDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setClassDate(courseSchedule.getStartClassTime());
+                    courseSchedule.setName(practiceGroupBuyParams.getName());
+                    courseSchedule.setTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setActualTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+                    courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+                    courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                    practiceCourses.add(courseSchedule);
+
+                    if(practiceCourses.size()==courseTimes){
+                        break;
+                    }
+
+                    CourseSchedule courseSchedule1=new CourseSchedule();
+                    BeanUtils.copyProperties(courseSchedule, courseSchedule1);
+                    courseSchedule1.setStartClassTime(courseSchedule.getEndClassTime());
+                    courseSchedule1.setEndClassTime(Date.from(courseEndDateTime.plusMinutes(practiceCourseMinutes).atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule1.setClassDate(courseSchedule1.getStartClassTime());
+                    practiceCourses.add(courseSchedule1);
+                }
+            }
+        }
+
+        if(CollectionUtils.isEmpty(practiceCourses)){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "课程信息错误");
+        }
+
+        practiceCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.findTeacherFreeTime(practiceGroupBuyParams.getUserId());
+        if (Objects.isNull(teacherFreeTime)) {
+            return BaseController.failed(HttpStatus.MULTIPLE_CHOICES,"抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
+        }
+
+        JSONObject drillTimesObject=new JSONObject();
+        for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+            drillTimesObject.put(String.valueOf(drillTime.getWeekNum()),drillTime.getTimeStr());
+        }
+
+        PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(sysUser.getOrganId());
+        if(Objects.isNull(practiceGroupSellPrice)){
+            throw new BizException("所在城市暂不参与此活动");
+        }
+
+        BigDecimal price = PracticeGroupType.CARE_PACKAGE.equals(practiceGroupBuyParams.getType())?practiceGroupSellPrice.getCarePackagePrice():practiceGroupSellPrice.getComeOnPackagePrice();
+        if(Objects.isNull(price)&&PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            throw new BizException("请设置加油包价格");
+        }
+
+        practiceGroupBuyParams.setCoursesStartDate(practiceCourses.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get().getStartClassTime());
+        practiceGroupBuyParams.setCoursesExpireDate(practiceCourses.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get().getEndClassTime());
+        practiceGroupBuyParams.setDrillTimesJson(drillTimesObject.toJSONString());
+        practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
+        practiceGroupBuyParams.setSingleClassMinutes(practiceCourseMinutes);
+        practiceGroupBuyParams.setGroupStatus(GroupStatusEnum.LOCK);
+        practiceGroupBuyParams.setMemo(operatorInfo+",教务代买");
+        practiceGroupDao.insert(practiceGroupBuyParams);
+
+        //创建班级信息
+        ClassGroup classGroup = new ClassGroup();
+        classGroup.setSubjectIdList(practiceGroupBuyParams.getSubjectId().toString());
+        classGroup.setExpectStudentNum(1);
+        classGroup.setStudentNum(1);
+        classGroup.setName(practiceGroupBuyParams.getName());
+        classGroup.setTotalClassTimes(practiceCourses.size());
+        classGroup.setType(ClassGroupTypeEnum.PRACTICE);
+        classGroup.setDelFlag(0);
+        classGroup.setGroupType(GroupType.PRACTICE);
+        classGroup.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroup.setCreateTime(now);
+        classGroup.setUpdateTime(now);
+        classGroupDao.insert(classGroup);
+
+        //创建班级老师关联记录
+        ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+        classGroupTeacherMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+        classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherMapper.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherMapper.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherMapper.setCreateTime(now);
+        classGroupTeacherMapper.setUpdateTime(now);
+        classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+        //创建班级与老师课酬记录
+        ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
+        classGroupTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+        classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherSalary.setSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setOnlineClassesSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherSalary.setCreateTime(now);
+        classGroupTeacherSalary.setUpdateTime(now);
+        classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+        //班级学生关联表
+        ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+        classGroupStudentMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupStudentMapper.setClassGroupId(classGroup.getId());
+        classGroupStudentMapper.setUserId(practiceGroupBuyParams.getStudentId());
+        classGroupStudentMapper.setCreateTime(now);
+        classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+        classGroupStudentMapper.setGroupType(GroupType.PRACTICE);
+        classGroupStudentMapperDao.insert(classGroupStudentMapper);
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课表
+            courseSchedule.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseSchedule.setClassGroupId(classGroup.getId());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setCreateTime(now);
+            courseSchedule.setUpdateTime(now);
+            courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+            courseSchedule.setGroupType(GroupType.PRACTICE);
+            courseSchedule.setIsLock(1);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
+        }
+        courseScheduleDao.batchAddCourseSchedules(practiceCourses);
+        TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroupBuyParams.getUserId(),practiceCourseMinutes);
+        BigDecimal teacherDefaultSalary=null;
+        if(Objects.nonNull(teacherDefaultPracticeGroupSalary)){
+            teacherDefaultSalary=teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
+        }
+        if(teacherDefaultSalary == null){
+            throw new BizException("请设置老师课酬");
+        }
+        BigDecimal studentSingleCourseCost=price.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+        BigDecimal studentSingleCourseOriginalCost=price.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课程与老师薪水表
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(GroupType.PRACTICE);
+            courseScheduleTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+            courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+            courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+            courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+            //学生缴费记录
+            CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+            courseScheduleStudentPayment.setGroupType(GroupType.PRACTICE);
+            courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
+            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
+            courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+            courseScheduleStudentPayment.setCreateTime(now);
+            courseScheduleStudentPayment.setUpdateTime(now);
+            courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+
+            //教师签到记录
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            teacherAttendance.setTeacherId(practiceGroupBuyParams.getUserId());
+            teacherAttendance.setClassGroupId(classGroup.getId());
+            teacherAttendance.setGroupType(GroupType.PRACTICE);
+            teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+            teacherAttendance.setCreateTime(now);
+            teacherAttendances.add(teacherAttendance);
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+        studentDao.update(student);
+
+        try {
+            courseScheduleService.checkNewCourseSchedules(practiceCourses,false,false);
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String errMessage=new String();
+            if(e.getMessage().indexOf("主教冲突")!=-1){
+                errMessage="抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
+            }else{
+                String courseName=e.getMessage().substring(e.getMessage().indexOf(")-")+2);
+                courseName = courseName.substring(0,courseName.indexOf("("));
+                errMessage="抱歉啦,当前所选时段组合,与您现有课程「";
+                errMessage+=courseName;
+                errMessage+="」时段冲突,请选择其他时段重试。";
+            }
+            return BaseController.failed(HttpStatus.FOUND, errMessage);
+        }
+
+        StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
+        studentPaymentOrder.setGroupType(GroupType.PRACTICE);
+        String orderNo=idGeneratorService.generatorId("payment") + "";
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
+
+        studentPaymentOrder.setExpectAmount(price);
+        studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
+        studentPaymentOrder.setClassGroupId(classGroup.getId());
+        studentPaymentOrder.setMemo(operatorInfo+",教务代买");
+        studentPaymentOrder.setVersion(0);
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        if(practiceGroupBuyParams.isUseBalancePayment() || studentPaymentOrder.getExpectAmount().doubleValue() == 0){
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(practiceGroupBuyParams.getStudentId());
+            if(userCashAccount == null){
+                throw new BizException("用户账户找不到");
+            }
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            if(userCashAccount.getBalance().subtract(studentPaymentOrder.getExpectAmount()).doubleValue() >= 0){
+                studentPaymentRouteOrderService.addRouteOrder(orderNo, practiceGroupBuyParams.getOrganId(), studentPaymentOrder.getExpectAmount());
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setBalancePaymentAmount(studentPaymentOrder.getExpectAmount());
+                studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+                studentPaymentOrder.setUpdateTime(now);
+                studentPaymentOrder.setOrganId(practiceGroupBuyParams.getOrganId());
+                studentPaymentOrder.setRoutingOrganId(practiceGroupBuyParams.getOrganId());
+
+                sysUserCashAccountService.updateBalance(practiceGroupBuyParams.getStudentId(), studentPaymentOrder.getExpectAmount().negate(),PlatformCashAccountDetailTypeEnum.PAY_FEE,operatorInfo+",教务代买");
+
+                studentPaymentOrder.setPayTime(now);
+                this.orderCallback(studentPaymentOrder);
+
+                Map<String,Object> result=new HashMap<>();
+                result.put("orderNo",studentPaymentOrder.getOrderNo());
+
+                return BaseController.succeed(result);
+            }else{
+                throw new BizException("该学员尚未缴纳加油包费用");
+            }
+        }else{
+            throw new BizException("当前购买方式暂时只支持用户余额购买");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     public void orderCallback(StudentPaymentOrder order) {

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

@@ -168,10 +168,10 @@ public class ExtracurricularExercisesServiceImpl extends BaseServiceImpl<Long, E
 	}
 
 	@Override
-	public List<BasicUserDto> getDontServeStudents(Integer teacherId, String search) {
+	public List<BasicUserDto> getDontServeStudents(Integer teacherId, String search, String musicGroupId) {
 		LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
 		LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
-		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), search);
+		return extracurricularExercisesDao.findNoExercisesStudentsInThisWeekWithTeacher(teacherId, monDayDate.toString(), musicGroupId, search);
 	}
 
 	@Override

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

@@ -615,6 +615,15 @@ public class StudentManageServiceImpl implements StudentManageService {
         student.setOperatingTempTag(0);
         student.setServiceTag(student.getServiceTag() == 0 ? 2 : 1);
         student.setTeacherId(student.getTeacherId());
+        if(Objects.nonNull(student.getCarePackage())||Objects.nonNull(student.getComeOnPackage())){
+            Student oldStudent = studentDao.get(userId);
+            if(Objects.nonNull(oldStudent.getCarePackage())&&oldStudent.getCarePackage().equals(2)){
+                student.setCarePackage(oldStudent.getCarePackage());
+            }
+            if(Objects.nonNull(oldStudent.getComeOnPackage())&&oldStudent.getComeOnPackage().equals(2)){
+                student.setComeOnPackage(oldStudent.getComeOnPackage());
+            }
+        }
         studentService.upSet(student);
         if (new Integer(2).equals(student.getServiceTag())) {
             LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();

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

@@ -580,6 +580,7 @@
             cs.class_date_,
             CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
             CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+            cs.music_group_id_,
             cs.status_,
             su.real_name_ teacher_name_,
             IF(sa.status_ IS NULL,'NORMAL',sa.status_) attendance_status_,

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

@@ -169,6 +169,9 @@
 			GROUP_CONCAT(sub.name_) subjectName
 		FROM
 			student_extracurricular_exercises_situation_ sees
+			<if test="musicGroupId!=null and musicGroupId!=''">
+				LEFT JOIN student_registration sr ON sees.student_id_=sr.user_id_
+			</if>
 			LEFT JOIN student stu ON stu.user_id_ = sees.student_id_
 			LEFT JOIN sys_user su ON su.id_ = sees.student_id_
 			LEFT JOIN `subject` sub ON FIND_IN_SET( sub.id_, stu.subject_id_list_ )
@@ -177,7 +180,10 @@
 			AND sees.teacher_id_ = #{teacherId}
 			AND sees.actual_exercises_num_ &lt; sees.expect_exercises_num_
 			AND sees.serve_type_ = 'EXERCISE'
-		<if test="search!=null">
+			<if test="musicGroupId!=null and musicGroupId!=''">
+				AND sr.music_group_id_=#{musicGroupId}
+			</if>
+			<if test="search!=null">
 				AND (su.username_ LIKE CONCAT('%', #{search}, '%') OR su.phone_ LIKE CONCAT(#{search}, '%'))
 			</if>
 		GROUP BY su.id_

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -296,6 +296,8 @@
         <result column="music_group_name_" property="musicGroupName"/>
         <result column="subject_id_" property="subjectId"/>
         <result column="phone_" property="phone"/>
+        <result column="care_package_" property="carePackage"/>
+        <result column="come_on_package_" property="comeOnPackage"/>
     </resultMap>
 
     <select id="queryUserGroups" resultMap="com.ym.mec.biz.dal.dao.ClassGroupDao.imGroupModel">

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

@@ -699,7 +699,7 @@
     </select>
 
     <select id="getPracticeGroupByIds" resultMap="PracticeCourseDto">
-        SELECT pg.id_,t.real_name_,et.real_name_ edu_teacher_name_ FROM practice_group pg
+        SELECT pg.id_,pg.type_,t.real_name_,et.real_name_ edu_teacher_name_ FROM practice_group pg
         LEFT JOIN sys_user t ON pg.user_id_ = t.id_
         LEFT JOIN sys_user et ON et.id_ = pg.educational_teacher_id_
         WHERE pg.id_ IN

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupSellPriceMapper.xml

@@ -19,6 +19,8 @@
 		<result column="high_online_ten_course_activity_price_with_new_user" property="highOnlineTenCourseActivityPriceWithNewUser" />
 		<result column="high_online_ten_course_original_price_with_old_user" property="highOnlineTenCourseOriginalPriceWithOldUser" />
 		<result column="high_online_ten_course_activity_price_with_old_user" property="highOnlineTenCourseActivityPriceWithOldUser" />
+		<result column="care_package_price" property="carePackagePrice" />
+		<result column="come_on_package_price" property="comeOnPackagePrice" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>

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

@@ -64,6 +64,8 @@
         <result property="subjectIdList" column="subject_id_list_"/>
         <result property="isNewUser" column="is_new_user_"/>
         <result property="isSignedContract" column="is_signed_contract_"/>
+        <result column="care_package_" property="carePackage"/>
+        <result column="come_on_package_" property="comeOnPackage"/>
     </resultMap>
 
     <sql id="queryCondition">
@@ -151,7 +153,7 @@
 
     <select id="findStudentsByOrganId" resultMap="studentManageListDto">
         SELECT o.`name_` organ_name_,s.`user_id_` ,su.`username_` ,su.`phone_` parents_phone_,su.`real_name_` ,su.`gender_` , su.organ_id_,
-		tu.`real_name_` teacher_name_,IF(s.service_tag_=2,0,s.service_tag_) service_tag_ ,s.`operating_tag_` , suca.`course_balance_` ,
+		tu.`real_name_` teacher_name_,IF(s.service_tag_=2,0,s.service_tag_) service_tag_ ,s.`operating_tag_` , s.care_package_, s.come_on_package_, suca.`course_balance_` ,
 		sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,
 		case when su.password_ is null then false else true end isActive_,s.is_new_user_,case when count(sut.user_id_) > 0 then 1 else 0 end is_signed_contract_
 		FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
@@ -197,6 +199,12 @@
             <if test="isNewUser != null">
                 AND s.is_new_user_ = #{isNewUser}
             </if>
+            <if test="carePackage != null">
+                AND s.care_package_ = #{carePackage}
+            </if>
+            <if test="comeOnPackage != null">
+                AND s.come_on_package_ = #{comeOnPackage}
+            </if>
         </where>
     </sql>
 

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

@@ -17,6 +17,8 @@
         <result column="is_new_user_" property="isNewUser"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="care_package_" property="carePackage"/>
+        <result column="come_on_package_" property="comeOnPackage"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -61,7 +63,7 @@
         <if test="operatingTag != null">
             operating_tag_,
         </if>
-        teacher_id_,create_time_,update_time_,service_tag_update_time_)
+        teacher_id_,care_package_,come_on_package_,create_time_,update_time_,service_tag_update_time_)
         VALUES
         (#{userId},#{subjectIdList},
         <if test="serviceTag != null">
@@ -70,7 +72,7 @@
         <if test="operatingTag != null">
             #{operatingTag},
         </if>
-        #{teacherId},NOW(),NOW(),NOW())
+        #{teacherId},#{carePackage},#{comeOnPackage},NOW(),NOW(),NOW())
     </insert>
 
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.Student">
@@ -95,6 +97,12 @@
             <if test="isNewUser != null">
                 is_new_user_=#{isNewUser},
             </if>
+            <if test="carePackage != null">
+                care_package_=#{carePackage},
+            </if>
+            <if test="comeOnPackage != null">
+                come_on_package_=#{comeOnPackage},
+            </if>
                 update_time_ = NOW()
         </set>
         WHERE user_id_ = #{userId}
@@ -164,9 +172,13 @@
                 <if test="item.updateTime != null">
                     update_time_ = #{item.updateTime},
                 </if>
-                <if test="item.updateTime == null">
-                    update_time_ = NOW()
+                <if test="item.carePackage != null">
+                    care_package_=#{item.carePackage},
                 </if>
+                <if test="item.comeOnPackage != null">
+                    come_on_package_=#{item.comeOnPackage},
+                </if>
+                update_time_ = NOW()
             </set>
             WHERE user_id_ = #{item.userId}
         </foreach>

+ 14 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -765,6 +765,20 @@
             #{item}
         </foreach>
     </select>
+    <select id="getStudentNormalMusicGroups" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.MusicGroup">
+        SELECT DISTINCT
+            mg.*
+        FROM
+            student_registration sr
+            LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
+        WHERE
+            mg.status_ = 'PROGRESS'
+            AND sr.music_group_status_ = 'NORMAL'
+            AND sr.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+    </select>
     <!-- 批量删除信息 -->
     <delete id="batchDelete">
         DELETE FROM student_registration WHERE id_ IN

+ 4 - 3
mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml

@@ -141,8 +141,9 @@
     </update>
 
     <select id="getStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT username_ ,id_ user_id_,avatar_ head_url_,gender_,phone_
-        FROM sys_user
+        SELECT su.username_ ,su.id_ user_id_,su.avatar_ head_url_,su.gender_,su.phone_,s.care_package_,s.come_on_package_
+        FROM sys_user su
+        LEFT JOIN student s ON su.id_=s.user_id_
         WHERE FIND_IN_SET(organ_id_,#{organIdList})
         AND user_type_ LIKE '%STUDENT%'
         <if test="search">
@@ -314,4 +315,4 @@
         SELECT pg.educational_teacher_id_ FROM practice_group pg
         WHERE pg.student_id_ = #{studentId}) sid
     </select>
-</mapper>
+</mapper>

+ 28 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java

@@ -2,7 +2,10 @@ 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.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.entity.ExtracurricularExercises;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.page.ExtraExercilseQueryInfo;
 import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
 import com.ym.mec.biz.service.ExtracurricularExercisesService;
@@ -12,12 +15,17 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Author Joburgess
@@ -34,6 +42,8 @@ public class ExtracurricularExercisesController extends BaseController {
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
 
     @ApiOperation(value = "创建课外训练")
     @PostMapping("/createExtraExercises")
@@ -69,11 +79,27 @@ public class ExtracurricularExercisesController extends BaseController {
 
     @ApiOperation(value = "获取待布置学员列表")
     @GetMapping("/getDontServeStudents")
-    public HttpResponseResult getDontServeStudents(String search){
+    public HttpResponseResult getDontServeStudents(String search, String musicGroupId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(extracurricularExercisesService.getDontServeStudents(sysUser.getId(), search, musicGroupId));
+    }
+
+    @ApiOperation(value = "获取待布置学员乐团列表")
+    @GetMapping("/getDontServeStudentMusicGroups")
+    public HttpResponseResult getDontServeStudentMusicGroups(String search){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(Objects.isNull(sysUser)){
             return failed(HttpStatus.FORBIDDEN,"请登录");
         }
-        return succeed(extracurricularExercisesService.getDontServeStudents(sysUser.getId(), search));
+        List<BasicUserDto> dontServeStudents = extracurricularExercisesService.getDontServeStudents(sysUser.getId(), search, null);
+        if(CollectionUtils.isEmpty(dontServeStudents)){
+            return succeed(Collections.emptyList());
+        }
+        Set<Integer> studentIds = dontServeStudents.stream().map(BasicUserDto::getUserId).collect(Collectors.toSet());
+        List<MusicGroup> studentNormalMusicGroups = studentRegistrationDao.getStudentNormalMusicGroups(studentIds);
+        return succeed(studentNormalMusicGroups);
     }
 }

+ 33 - 3
mec-web/src/main/java/com/ym/mec/web/controller/education/EduPracticeGroupController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.PracticeGroupBuyDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.EduPracticeGroupService;
 import com.ym.mec.biz.service.PracticeGroupService;
@@ -16,6 +17,7 @@ import com.ym.mec.biz.service.TeacherCourseRewardService;
 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.apache.commons.lang3.StringUtils;
@@ -23,6 +25,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -96,7 +101,7 @@ public class EduPracticeGroupController extends BaseController {
 
     @ApiOperation("获取指定教师的空闲时间——付费")
     @GetMapping(value = "/getPayPracticeTeacherFreeTimes")
-    public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer studentId,Integer buyMonths, boolean renew, Long groupId){
+    public Object getPayPracticeTeacherFreeTimes(Integer teacherId, Integer studentId, Integer buyMonths, boolean renew, Long groupId, PracticeGroupType type){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -104,7 +109,28 @@ public class EduPracticeGroupController extends BaseController {
         if(Objects.isNull(studentId)){
             throw new BizException("请指定学生");
         }
-        return succeed(practiceGroupService.getPayPracticeTeacherFreeTimes(studentId,teacherId, buyMonths,renew,groupId));
+        Map payPracticeTeacherFreeTimes = practiceGroupService.getPayPracticeTeacherFreeTimes(studentId, teacherId, buyMonths, renew, groupId);
+        if(Objects.nonNull(type)&&(PracticeGroupType.CARE_PACKAGE.equals(type)||PracticeGroupType.COME_ON_PACKAGE.equals(type))){
+            Map<Integer, List<String>> weekNumApplyTimesMap = (Map<Integer, List<String>>) payPracticeTeacherFreeTimes.get("teacherFreeDays");
+            for (Map.Entry<Integer, List<String>> weekNumApplyTimesMapEntry : weekNumApplyTimesMap.entrySet()) {
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
+                Iterator<String> iterator = weekNumApplyTimesMapEntry.getValue().iterator();
+                while (iterator.hasNext()){
+                    String timeStr = iterator.next();
+                    if("23:30:00".equals(timeStr)){
+                        iterator.remove();
+                        continue;
+                    }
+                    LocalTime time = LocalTime.parse(timeStr, dtf);
+                    LocalTime nextTime = time.plusMinutes(30);
+                    if(weekNumApplyTimesMapEntry.getValue().contains(nextTime.format(DateUtil.timeFormatter))){
+                        continue;
+                    }
+                    iterator.remove();
+                }
+            }
+        }
+        return succeed(payPracticeTeacherFreeTimes);
     }
 
     @ApiOperation("获取学生上一次的购买信息--付费")
@@ -150,7 +176,11 @@ public class EduPracticeGroupController extends BaseController {
             throw new BizException("请指定学生");
         }
         practiceGroupBuyParams.setEducationalTeacherId(sysUser.getId());
-        return eduPracticeGroupService.buyPracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        if(Objects.isNull(practiceGroupBuyParams.getType())||PracticeGroupType.CHARGE.equals(practiceGroupBuyParams.getType())){
+            return eduPracticeGroupService.buyPracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        }else{
+            return eduPracticeGroupService.createPackagePracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        }
     }
 
     @ApiOperation("获取用户历史购买的陪练课")