瀏覽代碼

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into system_fee

zouxuan 4 年之前
父節點
當前提交
2b49e256bf
共有 39 個文件被更改,包括 1648 次插入319 次删除
  1. 41 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseReviewDto.java
  3. 57 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicPitchDetailDto.java
  4. 64 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoReg.java
  5. 234 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterDto.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentApplyDetailDto.java
  7. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleEvaluate.java
  8. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  9. 14 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java
  10. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  11. 70 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/RegistrationOrPreQueryInfo.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentRegistrationQueryInfo.java
  13. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/VipGroupActivityQueryInfo.java
  14. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SoundService.java
  15. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  16. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayReserveServiceImpl.java
  17. 56 37
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 14 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupOrganizationCourseSettingsServiceImpl.java
  19. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  20. 18 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  21. 151 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java
  22. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  23. 79 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  24. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  25. 5 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleEvaluateMapper.xml
  26. 2 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleReviewMapper.xml
  27. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  28. 450 185
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  29. 9 2
      mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml
  30. 8 0
      mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java
  31. 5 0
      mec-teacher/pom.xml
  32. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java
  33. 21 0
      mec-teacher/src/main/java/com/ym/mec/teacher/config/WebSocketConfig.java
  34. 16 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java
  35. 28 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java
  36. 50 0
      mec-teacher/src/main/java/com/ym/mec/teacher/websocket/SoundWebSocket.java
  37. 63 40
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  38. 2 0
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  39. 91 13
      mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

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

@@ -539,9 +539,50 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取支付中的缴费和审核的人数
+     *
      * @param musicGroupId
      * @param payingStatus
      * @return
      */
     List<Map<Integer, Integer>> countPayingNum(@Param("musicGroupId") String musicGroupId, @Param("payingStatus") Integer payingStatus);
+
+    /**
+     * 获取预报名或者报名的列表
+     *
+     * @param params
+     * @return
+     */
+    List<RegisterDto> getRegisterOrPreList(Map<String, Object> params);
+
+
+    /**
+     * 获取预报名或者报名总数
+     *
+     * @param params
+     * @return
+     */
+    int getRegisterOrPreCount(Map<String, Object> params);
+
+    /**
+     * 获取最小预报名时间和最小支付时间
+     *
+     * @return
+     */
+    RegisterDto getRegisterOrPreMinTime(@Param("musicGroupId") String musicGroupId);
+
+
+    /**
+     * 获取报名总人数
+     *
+     * @param musicGroupId
+     * @return
+     */
+    int getRegisterNum(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取某时间段的缴费人数
+     *
+     * @return
+     */
+    int getFirstPayNum(@Param("musicGroupId") String musicGroupId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -16,6 +17,9 @@ public class CourseReviewDto {
     @ApiModelProperty(value = "课程编号",required = false)
     private Integer id;
 
+    @ApiModelProperty(value = "课程组类型")
+    private GroupType groupType;
+
     @ApiModelProperty(value = "课程上课日期",required = false)
     private Date classDate;
 
@@ -178,6 +182,14 @@ public class CourseReviewDto {
         this.id = id;
     }
 
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
     public String getCourseName() {
         return courseName;
     }

+ 57 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicPitchDetailDto.java

@@ -0,0 +1,57 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/5 0005
+ */
+public class MusicPitchDetailDto {
+
+    @ApiModelProperty("时间戳ms")
+    private int timeStamp;
+
+    @ApiModelProperty("持续时长ms")
+    private int duration;
+
+    @ApiModelProperty("频率Hz")
+    private float frequency;
+
+    public MusicPitchDetailDto() {
+    }
+
+    public MusicPitchDetailDto(int timeStamp, float frequency) {
+        this.timeStamp = timeStamp;
+        this.frequency = frequency;
+    }
+
+    public MusicPitchDetailDto(int timeStamp, int duration, float frequency) {
+        this.timeStamp = timeStamp;
+        this.duration = duration;
+        this.frequency = frequency;
+    }
+
+    public int getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(int timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+    public int getDuration() {
+        return duration;
+    }
+
+    public void setDuration(int duration) {
+        this.duration = duration;
+    }
+
+    public float getFrequency() {
+        return frequency;
+    }
+
+    public void setFrequency(float frequency) {
+        this.frequency = frequency;
+    }
+}

+ 64 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PageInfoReg.java

@@ -0,0 +1,64 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class PageInfoReg<T> extends PageInfo<T> {
+
+    @ApiModelProperty(value = "报名人数")
+    private Integer regNum = 0;
+
+    @ApiModelProperty(value = "第一天缴费人数")
+    private Integer firstDayPayNum = 0;
+
+    @ApiModelProperty(value = "总缴费人数")
+    private Integer payNum = 0;
+
+    @ApiModelProperty(value = "首天缴费人数占比")
+    private BigDecimal payScale = BigDecimal.ZERO;
+
+    public PageInfoReg() {
+    }
+
+    public PageInfoReg(Integer pageNo) {
+        super(pageNo);
+    }
+
+    public PageInfoReg(Integer pageNo, int pageSize) {
+        super(pageNo, pageSize);
+    }
+
+    public Integer getRegNum() {
+        return regNum;
+    }
+
+    public void setRegNum(Integer regNum) {
+        this.regNum = regNum;
+    }
+
+    public Integer getFirstDayPayNum() {
+        return firstDayPayNum;
+    }
+
+    public void setFirstDayPayNum(Integer firstDayPayNum) {
+        this.firstDayPayNum = firstDayPayNum;
+    }
+
+    public Integer getPayNum() {
+        return payNum;
+    }
+
+    public void setPayNum(Integer payNum) {
+        this.payNum = payNum;
+    }
+
+    public BigDecimal getPayScale() {
+        return payScale;
+    }
+
+    public void setPayScale(BigDecimal payScale) {
+        this.payScale = payScale;
+    }
+}

+ 234 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RegisterDto.java

@@ -0,0 +1,234 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.common.enums.UserGenderEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class RegisterDto {
+
+
+    @ApiModelProperty(value = "学生编号",required = false)
+    private Integer userId;
+
+    @ApiModelProperty(value = "学生姓名",required = false)
+    private String studentName;
+
+    @ApiModelProperty(value = "家长姓名",required = false)
+    private String parentsName;
+
+    @ApiModelProperty(value = "联系电话",required = false)
+    private String parentsPhone;
+
+    /** 当前所在年级 */
+    @ApiModelProperty(value = "当前所在年级",required = false)
+    private String currentGrade;
+
+    /** 当前所在班级 */
+    @ApiModelProperty(value = "当前所在班级",required = false)
+    private String currentClass;
+
+    @ApiModelProperty(value = "性别",required = false)
+    private UserGenderEnum gender;
+
+
+    @ApiModelProperty(value = "实际专业名称",required = false)
+    private String actualSubjectName;
+
+    @ApiModelProperty(value = "报名专业名称",required = false)
+    private Integer actualSubjectId;
+
+    /** 是否允许调剂 */
+    @ApiModelProperty(value = "是否允许调剂",required = false)
+    private YesOrNoEnum isAllowAdjust;
+
+
+    @ApiModelProperty(value = "预报名时间",required = false)
+    private Date perRegisterTime;
+
+    @ApiModelProperty(value = "与首位预报名时间差",required = false)
+    private Integer perRegInterval;
+
+    @ApiModelProperty(value = "缴费时间",required = false)
+    private Date payTime;
+
+    @ApiModelProperty(value = "与首位缴费时间差",required = false)
+    private Integer payInterval;
+
+    private String perRegIntervalStr;
+
+    private String payIntervalStr;
+
+    private Date minPerRegisterTime;
+
+    private Date minPayTime;
+
+    private Integer perRegSort;
+
+    private Integer paySort;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getParentsName() {
+        return parentsName;
+    }
+
+    public void setParentsName(String parentsName) {
+        this.parentsName = parentsName;
+    }
+
+    public String getParentsPhone() {
+        return parentsPhone;
+    }
+
+    public void setParentsPhone(String parentsPhone) {
+        this.parentsPhone = parentsPhone;
+    }
+
+    public String getCurrentGrade() {
+        return currentGrade;
+    }
+
+    public void setCurrentGrade(String currentGrade) {
+        this.currentGrade = currentGrade;
+    }
+
+    public String getCurrentClass() {
+        return currentClass;
+    }
+
+    public void setCurrentClass(String currentClass) {
+        this.currentClass = currentClass;
+    }
+
+    public UserGenderEnum getGender() {
+        return gender;
+    }
+
+    public void setGender(UserGenderEnum gender) {
+        this.gender = gender;
+    }
+
+    public String getActualSubjectName() {
+        return actualSubjectName;
+    }
+
+    public void setActualSubjectName(String actualSubjectName) {
+        this.actualSubjectName = actualSubjectName;
+    }
+
+    public Integer getActualSubjectId() {
+        return actualSubjectId;
+    }
+
+    public void setActualSubjectId(Integer actualSubjectId) {
+        this.actualSubjectId = actualSubjectId;
+    }
+
+    public YesOrNoEnum getIsAllowAdjust() {
+        return isAllowAdjust;
+    }
+
+    public void setIsAllowAdjust(YesOrNoEnum isAllowAdjust) {
+        this.isAllowAdjust = isAllowAdjust;
+    }
+
+    public Date getPerRegisterTime() {
+        return perRegisterTime;
+    }
+
+    public void setPerRegisterTime(Date perRegisterTime) {
+        this.perRegisterTime = perRegisterTime;
+    }
+
+    public Integer getPerRegInterval() {
+        return perRegInterval;
+    }
+
+    public void setPerRegInterval(Integer perRegInterval) {
+        this.perRegInterval = perRegInterval;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public Integer getPayInterval() {
+        return payInterval;
+    }
+
+    public void setPayInterval(Integer payInterval) {
+        this.payInterval = payInterval;
+    }
+
+    public String getPerRegIntervalStr() {
+        return perRegIntervalStr;
+    }
+
+    public void setPerRegIntervalStr(String perRegIntervalStr) {
+        this.perRegIntervalStr = perRegIntervalStr;
+    }
+
+    public String getPayIntervalStr() {
+        return payIntervalStr;
+    }
+
+    public void setPayIntervalStr(String payIntervalStr) {
+        this.payIntervalStr = payIntervalStr;
+    }
+
+    public Date getMinPerRegisterTime() {
+        return minPerRegisterTime;
+    }
+
+    public void setMinPerRegisterTime(Date minPerRegisterTime) {
+        this.minPerRegisterTime = minPerRegisterTime;
+    }
+
+    public Date getMinPayTime() {
+        return minPayTime;
+    }
+
+    public void setMinPayTime(Date minPayTime) {
+        this.minPayTime = minPayTime;
+    }
+
+    public Integer getPerRegSort() {
+        return perRegSort;
+    }
+
+    public void setPerRegSort(Integer perRegSort) {
+        this.perRegSort = perRegSort;
+    }
+
+    public Integer getPaySort() {
+        return paySort;
+    }
+
+    public void setPaySort(Integer paySort) {
+        this.paySort = paySort;
+    }
+}

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

@@ -89,6 +89,9 @@ public class StudentApplyDetailDto{
 
     private String payingStatusStr;
 
+    @ApiModelProperty(value = "不需要要购买云教练",required = false)
+    private Integer noneNeedCloudTeacher;
+
     public KitGroupPurchaseTypeEnum getKitGroupPurchaseTypeEnum() {
         return kitGroupPurchaseTypeEnum;
     }
@@ -280,4 +283,12 @@ public class StudentApplyDetailDto{
     public void setPayingStatusStr(String payingStatusStr) {
         this.payingStatusStr = payingStatusStr;
     }
+
+    public Integer getNoneNeedCloudTeacher() {
+        return noneNeedCloudTeacher;
+    }
+
+    public void setNoneNeedCloudTeacher(Integer noneNeedCloudTeacher) {
+        this.noneNeedCloudTeacher = noneNeedCloudTeacher;
+    }
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleEvaluate.java

@@ -74,6 +74,9 @@ public class CourseScheduleEvaluate {
 
     private Integer subjectId;
 
+    @ApiModelProperty(value = "头像")
+    private String studentAvatar;
+
     public String getStudentIdList() {
         return studentIdList;
     }
@@ -82,7 +85,13 @@ public class CourseScheduleEvaluate {
         this.studentIdList = studentIdList;
     }
 
+    public String getStudentAvatar() {
+        return studentAvatar;
+    }
 
+    public void setStudentAvatar(String studentAvatar) {
+        this.studentAvatar = studentAvatar;
+    }
 
     public Integer getIsPushed() {
         return isPushed;

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

@@ -133,6 +133,9 @@ public class StudentRegistration {
     @ApiModelProperty(value = "是否购买云教练 0-没有 1-有",required = true)
     private Integer hasCloudTeacher = 0;
 
+    @ApiModelProperty(value = "是否不需要云教练 0-需要 1-不需要",required = true)
+    private Integer noneNeedCloudTeacher = 0;
+
     public String getCertificateType() {
         return certificateType;
     }
@@ -467,4 +470,12 @@ public class StudentRegistration {
     public void setHasCloudTeacher(Integer hasCloudTeacher) {
         this.hasCloudTeacher = hasCloudTeacher;
     }
+
+    public Integer getNoneNeedCloudTeacher() {
+        return noneNeedCloudTeacher;
+    }
+
+    public void setNoneNeedCloudTeacher(Integer noneNeedCloudTeacher) {
+        this.noneNeedCloudTeacher = noneNeedCloudTeacher;
+    }
 }

+ 14 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupActivity.java

@@ -90,13 +90,24 @@ public class VipGroupActivity {
 	private Integer studentMaxUsedTimes;
 
 	@ApiModelProperty(value = "适用学生类型:-1:所有;0:老用户;1:新用户")
-	private int  applyToStudentType = -1;
+	private Integer  applyToStudentType = -1;
 
-	public int getApplyToStudentType() {
+	@ApiModelProperty(value = "课程可调整方向:0双向可调,1禁止线上到线下,2禁止线下到线上,3双向不可调")
+	private Integer allowOnlineToOffline = 0;
+
+	public Integer getAllowOnlineToOffline() {
+		return allowOnlineToOffline;
+	}
+
+	public void setAllowOnlineToOffline(Integer allowOnlineToOffline) {
+		this.allowOnlineToOffline = allowOnlineToOffline;
+	}
+
+	public Integer getApplyToStudentType() {
 		return applyToStudentType;
 	}
 
-	public void setApplyToStudentType(int applyToStudentType) {
+	public void setApplyToStudentType(Integer applyToStudentType) {
 		this.applyToStudentType = applyToStudentType;
 	}
 

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -172,7 +172,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
     BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
     CHILDREN_DAY_NOTICE_PUSH("CHILDREN_DAY_NOTICE_PUSH", "技能评测考级报名推送"),
-    CHILDREN_DAY_NOTICE_MSG("CHILDREN_DAY_NOTICE_MSG", "技能评测考级报名短信");
+    CHILDREN_DAY_NOTICE_MSG("CHILDREN_DAY_NOTICE_MSG", "技能评测考级报名短信"),
+    NO_BUY_CLOUD_TEACHER_MSG("NO_BUY_CLOUD_TEACHER_MSG", "未购买买云教练短信");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

+ 70 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/RegistrationOrPreQueryInfo.java

@@ -0,0 +1,70 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class RegistrationOrPreQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "乐团编号",required = false)
+    private String musicGroupId;
+
+    private Integer subjectId;
+
+    private List<Integer> userIds;
+
+    private String orderByPerRegister;
+
+    private String orderByPayTime;
+
+    private boolean isExport = false;
+
+    public boolean getIsExport() {
+        return isExport;
+    }
+
+    public void setIsExport(boolean export) {
+        isExport = export;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public List<Integer> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<Integer> userIds) {
+        this.userIds = userIds;
+    }
+
+    public String getOrderByPayTime() {
+        return orderByPayTime;
+    }
+
+    public void setOrderByPayTime(String orderByPayTime) {
+        this.orderByPayTime = orderByPayTime;
+    }
+
+    public String getOrderByPerRegister() {
+        return orderByPerRegister;
+    }
+
+    public void setOrderByPerRegister(String orderByPerRegister) {
+        this.orderByPerRegister = orderByPerRegister;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentRegistrationQueryInfo.java

@@ -42,6 +42,9 @@ public class StudentRegistrationQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "是否购买云教练 0-没有 1-有",required = false)
     private Integer hasCloudTeacher;
 
+    @ApiModelProperty(value = "是否不需要云教练 0-需要 1-不需要",required = false)
+    private Integer noneNeedCloudTeacher;
+
     private boolean isExport = false;
 
     public boolean getIsExport() {
@@ -139,4 +142,12 @@ public class StudentRegistrationQueryInfo extends QueryInfo {
     public void setHasCloudTeacher(Integer hasCloudTeacher) {
         this.hasCloudTeacher = hasCloudTeacher;
     }
+
+    public Integer getNoneNeedCloudTeacher() {
+        return noneNeedCloudTeacher;
+    }
+
+    public void setNoneNeedCloudTeacher(Integer noneNeedCloudTeacher) {
+        this.noneNeedCloudTeacher = noneNeedCloudTeacher;
+    }
 }

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

@@ -16,6 +16,16 @@ public class VipGroupActivityQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "适用学生类型:-1:所有;0:老用户;1:新用户")
     private Integer  applyToStudentType;
 
+    private Integer allowOnlineToOffline;
+
+    public Integer getAllowOnlineToOffline() {
+        return allowOnlineToOffline;
+    }
+
+    public void setAllowOnlineToOffline(Integer allowOnlineToOffline) {
+        this.allowOnlineToOffline = allowOnlineToOffline;
+    }
+
     public Boolean getEnable() {
         return enable;
     }

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

@@ -1,9 +1,12 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.common.entity.HttpResponseResult;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * @Author Joburgess
  * @Date 2021/5/19 0019
@@ -12,4 +15,6 @@ public interface SoundService {
 
     HttpResponseResult compare(MultipartFile record, Integer musicScoreId);
 
+    HttpResponseResult measureCompare(List<MusicPitchDetailDto> musicXmlInfos, MultipartFile record);
+
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
+import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
@@ -395,4 +396,21 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @return
      */
     List<Map<String, Integer>> countNormalNum(List<String> musicGroupIds);
+
+
+    /**
+     * 获取预报名或者报名列表
+     * @param queryInfo
+     * @return
+     */
+    PageInfoReg<RegisterDto> getRegisterOrPreList(RegistrationOrPreQueryInfo queryInfo);
+
+
+    /**
+     * 设置不需要云教练
+     * @param id
+     * @return
+     */
+    Boolean setNoneCloudTeacher(Long id);
+
 }

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

@@ -468,7 +468,7 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
         }
 
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
-        String pushUrl = baseApiUrl + "/#/childrenPayment";
+        String pushUrl = baseApiUrl + "/#/childrenPayment?dHlwZT0x";
 
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.CHILDREN_DAY_NOTICE_PUSH,
                 userMap, null, 0, "5?" + pushUrl, "STUDENT");

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

@@ -18,6 +18,7 @@ import java.util.stream.Stream;
 
 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.controller.BaseController;
@@ -42,36 +43,7 @@ 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.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
-import com.ym.mec.biz.dal.entity.ClassGroupTeacherSalary;
-import com.ym.mec.biz.dal.entity.CourseGenerateDto;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.entity.CourseScheduleAuditDetailDto;
-import com.ym.mec.biz.dal.entity.CourseScheduleComplaints;
-import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
-import com.ym.mec.biz.dal.entity.CourseScheduleModifyLog;
-import com.ym.mec.biz.dal.entity.CourseScheduleReview;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.CoursesGroup;
-import com.ym.mec.biz.dal.entity.CoursesGroupModifyLog;
-import com.ym.mec.biz.dal.entity.Group;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.PracticeGroup;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.StudentAttendance;
-import com.ym.mec.biz.dal.entity.StudentCourseScheduleRecordDto;
-import com.ym.mec.biz.dal.entity.Subject;
-import com.ym.mec.biz.dal.entity.SysConfig;
-import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.entity.TeacherAttendance;
-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.page.CourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.page.StudentCourseScheduleRecordQueryInfo;
@@ -180,6 +152,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	private StudentServeService studentServeService;
     @Autowired
 	private EmployeeDao employeeDao;
+    @Autowired
+	private VipGroupActivityDao vipGroupActivityDao;
 
     private final Logger LOGGER = LoggerFactory
             .getLogger(this.getClass());
@@ -2652,6 +2626,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Date coursesExpireDate = null;
         Date coursesStartDate = null;
         GroupType groupType = vipGroupCourseAdjustInfo.getGroupType();
+
+		VipGroup vipGroup=null;
+		VipGroupActivity vipGroupActivity = null;
+
+		if(groupType == VIP) {
+			vipGroup = vipGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
+			if(Objects.isNull(vipGroup)){
+				throw new BizException("课程组信息不存在");
+			}
+			vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
+		}
+
         switch (vipGroupCourseAdjustInfo.getGroupType()){
             case PRACTICE:
                 PracticeGroup practiceGroup = practiceGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
@@ -2664,7 +2650,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 coursesStartDate = practiceGroup.getCoursesStartDate();
                 break;
             default:
-                VipGroup vipGroup = vipGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
                 if (Objects.isNull(vipGroup)) {
                     throw new BizException("指定课程不存在");
                 }
@@ -2764,10 +2749,19 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                     courseSchedules.get(courseStartDates.size() - 1).setStartClassTime(courseStartTime);
                     courseSchedules.get(courseStartDates.size() - 1).setEndClassTime(courseEndTime);
                     if (Objects.nonNull(vipGroupCourseAdjustInfo.getTeachMode())) {
-                        if(courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.ONLINE)
-                            &&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)){
-                            throw new BizException("VIP课不支持从线上调整到线下");
+                    	boolean onlineToOffline = courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.ONLINE)
+								&&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE);
+						boolean offlineToOnline = courseSchedules.get(courseStartDates.size() - 1).getTeachMode().equals(TeachModeEnum.OFFLINE)
+								&&vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.ONLINE);
+                        if(onlineToOffline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==0||vipGroupActivity.getAllowOnlineToOffline()==3)){
+                            throw new BizException("此VIP课活动不支持线上课调整为线下课");
                         }
+						if(offlineToOnline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==2||vipGroupActivity.getAllowOnlineToOffline()==3)){
+							throw new BizException("此VIP课活动不支持线下课调整为线上课");
+						}
+						if(onlineToOffline&&Objects.isNull(vipGroupCourseAdjustInfo.getSchoolId())){
+							throw new BizException("请选择教学点");
+						}
                         courseSchedules.get(courseStartDates.size() - 1).setTeachMode(vipGroupCourseAdjustInfo.getTeachMode());
                         if (vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)) {
                             if(Objects.nonNull(vipGroupCourseAdjustInfo.getSchoolId())){
@@ -2809,8 +2803,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
         }
 		if(groupType == VIP){
-			VipGroup vipGroup = vipGroupDao.get(vipGroupCourseAdjustInfo.getVipGroupId().longValue());
-
 			CourseSchedule courseSchedule = courseSchedules.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get();
 //
 //			BigDecimal teacherSalary=BigDecimal.ZERO;
@@ -2953,6 +2945,23 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if(!CourseStatusEnum.NOT_START.equals(oldCourses.get(i).getStatus())){
 				throw new BizException("选择的课程中存在进行中或已结束的课程,无法进行调整");
 			}
+
+			if(VIP.equals(oldCourses.get(i).getGroupType())){
+				VipGroup vipGroup = vipGroupDao.get(Long.valueOf(oldCourses.get(i).getMusicGroupId()));
+				if(Objects.isNull(vipGroup)){
+					throw new BizException("课程组信息不存在");
+				}
+				VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
+				boolean onlineToOffline = TeachModeEnum.ONLINE.equals(oldCourses.get(i).getTeachMode())&&TeachModeEnum.OFFLINE.equals(courseAdjustInfo.getTeachMode());
+				boolean offlineToOnline = TeachModeEnum.OFFLINE.equals(oldCourses.get(i).getTeachMode())&&TeachModeEnum.ONLINE.equals(courseAdjustInfo.getTeachMode());
+				if(onlineToOffline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==0||vipGroupActivity.getAllowOnlineToOffline()==3)){
+					throw new BizException("此VIP课活动不支持线上课调整为线下课");
+				}
+				if(offlineToOnline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==2||vipGroupActivity.getAllowOnlineToOffline()==3)){
+					throw new BizException("此VIP课活动不支持线下课调整为线上课");
+				}
+			}
+
 			//上课日期变更
 			if(betweenDays!=0){
 				LocalDate classDate = LocalDateTime.ofInstant(oldCourses.get(i).getClassDate().toInstant(), DateUtil.zoneId).toLocalDate();
@@ -3380,8 +3389,18 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 
 			if (VIP.equals(newCourseSchedule.getGroupType())){
-				if(TeachModeEnum.OFFLINE.equals(newCourseSchedule.getTeachMode())&&TeachModeEnum.ONLINE.equals(oldCourseSchedule.getTeachMode())){
-					throw new BizException("VIP课不支持从线上调整到线下");
+				VipGroup vipGroup = vipGroupDao.get(Long.valueOf(oldCourseSchedule.getMusicGroupId()));
+				if(Objects.isNull(vipGroup)){
+					throw new BizException("课程组信息不存在");
+				}
+				VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
+				boolean onlineToOffline = TeachModeEnum.OFFLINE.equals(newCourseSchedule.getTeachMode())&&TeachModeEnum.ONLINE.equals(oldCourseSchedule.getTeachMode());
+				if(onlineToOffline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==0||vipGroupActivity.getAllowOnlineToOffline()==3)){
+					throw new BizException("此VIP课活动不支持线上课调整为线下课");
+				}
+				boolean offlineToOnline = TeachModeEnum.ONLINE.equals(newCourseSchedule.getTeachMode())&&TeachModeEnum.OFFLINE.equals(oldCourseSchedule.getTeachMode());
+				if(offlineToOnline&&Objects.nonNull(vipGroupActivity)&&(vipGroupActivity.getAllowOnlineToOffline()==2||vipGroupActivity.getAllowOnlineToOffline()==3)){
+					throw new BizException("此VIP课活动不支持线下课调整为线上课");
 				}
 			}
 

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

@@ -34,8 +34,8 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         }
 
 		for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
-			if (detail.getCourseTotalMinuties() <= 0) {
-				throw new BizException(detail.getCourseType().getMsg() + "课程总时长必须大于0");
+			if (detail.getCourseTotalMinuties() < 0) {
+				throw new BizException(detail.getCourseType().getMsg() + "课程总时长不能为负数");
 			}
 			setting.setTotalCurrentPrice(setting.getTotalCurrentPrice().add(detail.getCourseCurrentPrice()));
 			setting.setTotalOriginalPrice(setting.getTotalOriginalPrice().add(detail.getCourseOriginalPrice()));
@@ -43,7 +43,11 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         musicGroupOrganizationCourseSettingsDao.insert(setting);
         for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
             detail.setMusicGroupOrganizationCourseSettingsId(setting.getId());
-            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
+            if(detail.getCourseTotalMinuties() > 0){
+            	detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
+            } else {
+            	detail.setUnitPrice(BigDecimal.ZERO);
+            }
         }
         musicGroupOrganizationCourseSettingsDetailDao.batchInsert(setting.getDetails());
         return setting;
@@ -69,8 +73,8 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         musicGroupOrganizationCourseSettingsDetailDao.deleteBySettingId(setting.getId());
 
 		for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
-			if (detail.getCourseTotalMinuties() <= 0) {
-				throw new BizException(detail.getCourseType().getMsg() + "课程总时长必须大于0");
+			if (detail.getCourseTotalMinuties() < 0) {
+				throw new BizException(detail.getCourseType().getMsg() + "课程总时长不能为负数");
 			}
 			setting.setTotalCurrentPrice(setting.getTotalCurrentPrice().add(detail.getCourseCurrentPrice()));
 			setting.setTotalOriginalPrice(setting.getTotalOriginalPrice().add(detail.getCourseOriginalPrice()));
@@ -79,7 +83,11 @@ public class MusicGroupOrganizationCourseSettingsServiceImpl extends BaseService
         for (MusicGroupOrganizationCourseSettingsDetail detail : setting.getDetails()) {
             detail.setId(null);
             detail.setMusicGroupOrganizationCourseSettingsId(setting.getId());
-            detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
+            if(detail.getCourseTotalMinuties() > 0){
+            	detail.setUnitPrice(detail.getCourseCurrentPrice().divide(new BigDecimal(detail.getCourseTotalMinuties()), 8, BigDecimal.ROUND_HALF_UP));
+            } else {
+            	detail.setUnitPrice(BigDecimal.ZERO);
+            }
         }
         musicGroupOrganizationCourseSettingsDetailDao.batchInsert(setting.getDetails());
         return setting;

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1201,7 +1201,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
 				//如果是报名项目,将乐团改为审核中,缴费项目修改状态,审核状态改为审核通过
 				if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
-					musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+					if(musicGroupPaymentCalender.getPaymentAmount().doubleValue() > 0){
+						musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+					}else{
+						musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.PAID);
+					}
 				}else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
 					musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
 				}else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {

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

@@ -15,6 +15,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -743,6 +744,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentRegistrationService.update(studentRegistration);
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
+            Integer teacherId = musicGroup.getEducationalTeacherId();
+            SysUser endTeacher = sysUserFeignService.queryUserById(teacherId);
+            Map<Integer, String> userPhoneMap = new HashMap<>();
+            userPhoneMap.put(endTeacher.getId(), endTeacher.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
+                    userPhoneMap, null, 0, null, null, musicGroup.getName(), studentRegistration.getName());
+
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("hasPaidZero", "205");
             notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
@@ -799,7 +807,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
         if (ApplyOrder == null) {
-            throw new BizException("没有支付中的订单,请勿非法请求");
+            throw new BizException("没有支付中订单,请在我的订单中查看订单状态");
         }
         //手动关闭订单
         ApplyOrder.setStatus(DealStatusEnum.FAILED);
@@ -924,6 +932,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentRegistrationService.update(studentRegistration);
 
         if ("205".equals(studentPaymentOrder.getPaymentAccountNo())) {
+            Integer teacherId = musicGroup.getEducationalTeacherId();
+            SysUser endTeacher = sysUserFeignService.queryUserById(teacherId);
+            Map<Integer, String> userPhoneMap = new HashMap<>();
+            userPhoneMap.put(endTeacher.getId(), endTeacher.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.NO_BUY_CLOUD_TEACHER_MSG,
+                    userPhoneMap, null, 0, null, null, musicGroup.getName(), studentRegistration.getName());
+
+
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("hasPaidZero", "205");
             notifyMap.put("orderNo", studentPaymentOrder.getOrderNo());
@@ -2668,7 +2684,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             updateTeamTeacher(group, musicGroup);
         }
         //修改了维修技师
-        if(musicGroup.getRepairUserId() != null && !musicGroup.getRepairUserId().equals(group.getRepairUserId())){
+        if (musicGroup.getRepairUserId() != null && !musicGroup.getRepairUserId().equals(group.getRepairUserId())) {
             refresh = true;
         }
         //不是导入的乐团

+ 151 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java

@@ -10,8 +10,11 @@ import be.tarsos.dsp.io.TarsosDSPAudioInputStream;
 import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
 import be.tarsos.dsp.onsets.ComplexOnsetDetector;
 import be.tarsos.dsp.onsets.OnsetHandler;
+import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
 import com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment;
 import com.ym.mec.biz.service.SoundService;
@@ -21,6 +24,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,6 +33,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.UnsupportedAudioFileException;
 import java.io.File;
 import java.io.IOException;
@@ -102,6 +107,29 @@ public class SoundServiceImpl implements SoundService {
         return pitchs;
     }
 
+    /**
+     * @describe 音频时域信息提取
+     * @author Joburgess
+     * @date 2021/5/19 0019
+     * @return java.util.List<java.lang.Double>
+     */
+    public List<MusicPitchDetailDto> pitchExtractor(File audioFile) throws IOException, UnsupportedAudioFileException {
+        List<MusicPitchDetailDto> result = new ArrayList<>();
+        PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+
+        float samplerate = AudioSystem.getAudioFileFormat(audioFile).getFormat().getSampleRate();
+        int size = 256;
+        int overlap = 128;
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromFile(audioFile, size, overlap);
+        dispatcher.addAudioProcessor(new PitchProcessor(algo, samplerate, size, (pitchDetectionResult, audioEvent) -> {
+            int timeStamp = (int) (audioEvent.getTimeStamp()*1000);
+            float pitch = pitchDetectionResult.getPitch();
+            result.add(new MusicPitchDetailDto(timeStamp, pitch));
+        }));
+        dispatcher.run();
+        return result;
+    }
+
     private AudioDispatcher getFromByteArray(byte[] bytes, int size, int overlap) throws UnsupportedAudioFileException {
         AudioFormat audioFormat = new AudioFormat(sampleRate, 16, 1, true, false);
         AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(bytes, audioFormat, size, overlap);
@@ -168,7 +196,7 @@ public class SoundServiceImpl implements SoundService {
                 double pitch1 = Math.abs(pitchs_s.get(i));
                 double pitch2 = Math.abs(pitchs_r.get(i));
                 double pitchGap = Math.abs(pitch1-pitch2);
-                if(pitchGap>pitch1||pitchGap>20){
+                if(pitchGap>pitch1||pitchGap>15){
                     pitchGap = pitch1;
                 }else if(pitchGap<5){
                     pitchGap = 0;
@@ -222,6 +250,128 @@ public class SoundServiceImpl implements SoundService {
             if(f!=null){
                 f.delete();
             }
+//            if(f_r!=null){
+//                f_r.deleteOnExit();
+//            }
+        }
+
+        result.put("score", score);
+        result.put("intonation", intonation);
+        result.put("cadence", cadence);
+        result.put("integrity", integrity);
+        return BaseController.succeed(result);
+    }
+
+    @Override
+    public HttpResponseResult measureCompare(List<MusicPitchDetailDto> musicXmlInfos, MultipartFile record) {
+        Map<String, BigDecimal> result = new HashMap<>();
+
+        String tmpDir = FileUtils.getTempDirectoryPath() + "/";
+        //存储录音文件
+        String filePath_r =  tmpDir + idGeneratorService.generatorId("sound") + "_r.wav";
+
+        LOGGER.info("录音文件大小:{}MB, 保存路径:{}, musicXml信息:{}", record.getSize()/1048576f, filePath_r, JSON.toJSONString(musicXmlInfos));
+
+        BigDecimal oneHundred = new BigDecimal(100);
+        //总分
+        BigDecimal score = BigDecimal.ZERO;
+        //相似度
+        BigDecimal intonation = BigDecimal.ZERO;
+        //节奏
+        BigDecimal cadence = BigDecimal.ZERO;
+        //完整度
+        BigDecimal integrity = BigDecimal.ZERO;
+        File f_r = null;
+        try {
+            f_r = new File(filePath_r);
+            FileUtils.copyToFile(record.getInputStream(), f_r);
+
+            List<MusicPitchDetailDto> recordInfos = pitchExtractor(f_r);
+
+            //最低有效频率
+            float minValidFrequency = 20;
+
+            //有效音频数量
+            float validNum = 0;
+            //音频有效阈值
+            float validDuty = 0.7f;
+
+            //音准匹配数量
+            float intonationNum = 0;
+            //音准匹配误差范围
+            float intonationErrRange = 10;
+            //音准有效阈值
+            float intonationValidDuty = 0.8f;
+
+            //节奏匹配数量
+            float cadenceNum = 0;
+            //节奏匹配误差范围
+            float cadenceErrRange = 100;
+            //节奏有效阈值
+            float cadenceValidDuty = 0.7f;
+
+            for (MusicPitchDetailDto musicXmlInfo : musicXmlInfos) {
+                int startTimeStamp = musicXmlInfo.getTimeStamp();
+                int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration();
+
+                //时间范围内有效音准数量
+                float recordValidIntonationNum = 0;
+                //时间范围内有效节奏数量
+                float cadenceValidNum = 0;
+                //时间范围内有效音频数量
+                float recordValidNum = 0;
+                //时间范围内匹配次数
+                float compareNum = 0;
+                for (MusicPitchDetailDto recordInfo : recordInfos) {
+                    //如果在时间范围之外直接跳过
+                    if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
+                        continue;
+                    }
+                    compareNum++;
+                    //如果在最低有效频率以下则跳过
+                    if(recordInfo.getFrequency()<minValidFrequency){
+                        continue;
+                    }
+                    recordValidNum++;
+                    //如果频率差值在节奏误差范围内
+                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=cadenceErrRange){
+                        cadenceValidNum++;
+                    }
+                    //如果频率差值在音准误差范围内
+                    if(recordInfo.getFrequency()-musicXmlInfo.getFrequency()<=intonationErrRange){
+                        recordValidIntonationNum++;
+                    }
+                }
+                //有效音频占比
+                float recordValidDuty = recordValidNum/compareNum;
+                if(recordValidDuty<validDuty){
+                    continue;
+                }
+                validNum++;
+                //有效音高占比
+                float intonationDuty = recordValidIntonationNum/compareNum;
+                //有效节奏占比
+                float cadenceDuty = cadenceValidNum/compareNum;
+                if(intonationDuty>=intonationValidDuty){
+                    intonationNum++;
+                }
+                if(cadenceDuty>=cadenceValidDuty){
+                    cadenceNum++;
+                }
+            }
+
+            intonation = new BigDecimal(intonationNum).divide(new BigDecimal(musicXmlInfos.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            cadence = new BigDecimal(cadenceNum).divide(new BigDecimal(musicXmlInfos.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            integrity = new BigDecimal(validNum).divide(new BigDecimal(musicXmlInfos.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+
+            score = intonation.multiply(new BigDecimal(0.4)).add(cadence.multiply(new BigDecimal(0.4))).add(integrity.multiply(new BigDecimal(0.2))).setScale(0, BigDecimal.ROUND_HALF_UP);
+        } catch (UnsupportedAudioFileException e) {
+            LOGGER.error("文件类型不支持:{}", FilenameUtils.getExtension(filePath_r));
+        } catch (IOException e) {
+            LOGGER.error("IO异常:{}", e);
+        } catch (ArithmeticException e){
+            LOGGER.info("无musicXml信息");
+        }finally {
             if(f_r!=null){
                 f_r.deleteOnExit();
             }

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

@@ -196,7 +196,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         List<String> orderNoList = new ArrayList<String>();
 
         for (StudentPaymentOrder payingOrder : payingOrders) {
-            if (payingOrder.getTransNo() == null && "205".equals(payingOrder.getPaymentAccountNo()) && DateUtil.isSameDay(payingOrder.getCreateTime(), new Date())) {
+            //if (payingOrder.getTransNo() == null && "205".equals(payingOrder.getPaymentAccountNo()) && DateUtil.isSameDay(payingOrder.getCreateTime(), new Date())) {
+            if (payingOrder.getTransNo() == null && "205".equals(payingOrder.getPaymentAccountNo())) {
                 continue;
             }
             if (payingOrder.getTransNo() == null) {

+ 79 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -6,16 +6,7 @@ import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
@@ -24,6 +15,7 @@ import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
+import com.ym.mec.biz.dal.page.RegistrationOrPreQueryInfo;
 import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -516,7 +508,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 (musicGroup.getCourseViewType().equals(CourseViewTypeEnum.CLOUD_TEACHER_PLUS) && !buyCloudTeacherPlus)
         ) {
             paidZeroFlag = true;
-            if (paidZeroNum <= 0) {
+            if (studentRegistration.getNoneNeedCloudTeacher().equals(1)) {
                 musicOneSubjectClassPlan.setPaidZeroNum(paidZeroNum + 1);
                 musicOneSubjectClassPlan.setPaidStudentNum(paidNum + 1);
                 firstPaidZeroFlag = true;
@@ -533,7 +525,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
         if (paidZeroFlag) {
             studentPaymentOrder.setVersion(0);
-            String code = firstPaidZeroFlag ? "200" : "205";
+            String code = studentRegistration.getNoneNeedCloudTeacher().equals(1) ? "200" : "205";
             studentPaymentOrder.setPaymentAccountNo(code);
             studentPaymentOrderService.update(studentPaymentOrder);
         }
@@ -1831,4 +1823,79 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     public List<Map<String, Integer>> countNormalNum(List<String> musicGroupIds) {
         return studentRegistrationDao.countNormalNum(StringUtils.join(musicGroupIds, ","));
     }
+
+    @Override
+    public PageInfoReg<RegisterDto> getRegisterOrPreList(RegistrationOrPreQueryInfo queryInfo) {
+        PageInfoReg<RegisterDto> pageInfo = new PageInfoReg<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<RegisterDto> dataList = new ArrayList<>();
+        int count = studentRegistrationDao.getRegisterOrPreCount(params);
+        if (queryInfo.getIsExport() && count > 50000) {
+            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+        }
+        int registerNum = studentRegistrationDao.getRegisterNum(queryInfo.getMusicGroupId());
+        pageInfo.setRegNum(registerNum);
+        RegisterDto registerOrPreMinTime = studentRegistrationDao.getRegisterOrPreMinTime(queryInfo.getMusicGroupId());
+        if(registerOrPreMinTime.getMinPayTime() != null){
+            Date startTime = DateUtil.trunc(registerOrPreMinTime.getMinPayTime());
+            Date endTime = DateUtil.getLastTimeWithDay(startTime);
+            int firstPayNum = studentRegistrationDao.getFirstPayNum(queryInfo.getMusicGroupId(), startTime, endTime);
+            int totalPayNum = studentRegistrationDao.getFirstPayNum(queryInfo.getMusicGroupId(), startTime,null);
+            pageInfo.setFirstDayPayNum(firstPayNum);
+            pageInfo.setPayNum(totalPayNum);
+            pageInfo.setPayScale(new BigDecimal(firstPayNum).multiply(new BigDecimal(100)).divide(new BigDecimal(totalPayNum),2,BigDecimal.ROUND_HALF_UP));
+        }
+
+        pageInfo.setTotal(count);
+        params.put("offset", pageInfo.getOffset());
+        if (queryInfo.getPage() <= pageInfo.getTotalPage()) {
+            Date firstPreTime = registerOrPreMinTime.getMinPerRegisterTime();
+            Date firstPayTime = registerOrPreMinTime.getMinPayTime();
+            dataList = studentRegistrationDao.getRegisterOrPreList(params);
+            for (RegisterDto registerDto : dataList) {
+                if (DateUtil.dateToString(registerDto.getPerRegisterTime()).equals("2099-12-31") ||
+                        DateUtil.dateToString(registerDto.getPerRegisterTime()).equals("1990-12-31")
+                ) {
+                    registerDto.setPerRegisterTime(null);
+                }
+
+                if (DateUtil.dateToString(registerDto.getPayTime()).equals("2099-12-31") ||
+                        DateUtil.dateToString(registerDto.getPayTime()).equals("1990-12-31")
+                ) {
+                    registerDto.setPayTime(null);
+                }
+                if (registerDto.getPerRegisterTime() != null) {
+                    int perRegInterval = DateUtil.secondsBetween(firstPreTime, registerDto.getPerRegisterTime());
+                    registerDto.setPerRegInterval(perRegInterval);
+                    registerDto.setPerRegIntervalStr(DateUtil.secondsFormat(perRegInterval));
+                }
+
+                if (registerDto.getPayTime() != null) {
+                    int payTimeInterval = DateUtil.secondsBetween(firstPayTime, registerDto.getPayTime());
+                    registerDto.setPayInterval(payTimeInterval);
+                    registerDto.setPayIntervalStr(DateUtil.secondsFormat(payTimeInterval));
+                }
+            }
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public Boolean setNoneCloudTeacher(Long id) {
+        StudentRegistration studentRegistration = studentRegistrationDao.get(id);
+        if (!studentRegistration.getPayingStatus().equals(2)) {
+            throw new BizException("该学生不在预约中");
+        }
+        if (studentRegistration.getNoneNeedCloudTeacher().equals(1)) {
+            throw new BizException("该学生已设置");
+        }
+        studentRegistration.setNoneNeedCloudTeacher(1);
+        if (studentRegistrationDao.update(studentRegistration) <= 0) {
+            throw new BizException("设置失败,请重试");
+        }
+        return true;
+    }
 }

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

@@ -1519,6 +1519,6 @@
         WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND cg.del_flag_ = 0
     </select>
     <select id="countCourseNum" resultType="int">
-        SELECT COUNT(id_) FROM course_schedule WHERE class_group_id_ = #{teachMode} AND teach_mode_ = #{teachMode}
+        SELECT COUNT(id_) FROM course_schedule WHERE class_group_id_ = #{classGroupId} AND teach_mode_ = #{teachMode}
     </select>
 </mapper>

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

@@ -12,6 +12,7 @@
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
         <result column="student_id_" jdbcType="INTEGER" property="studentId"/>
+        <result column="student_avatar_" property="studentAvatar"/>
         <result column="subject_id_" jdbcType="INTEGER" property="subjectId"/>
         <result column="subject_name_" jdbcType="VARCHAR" property="subjectName"/>
         <result column="is_pushed_" jdbcType="INTEGER" property="isPushed"/>
@@ -218,8 +219,10 @@
 
     <select id="getNeedPostReports" resultMap="CourseScheduleEvaluate">
         SELECT cse.id_,cse.class_group_id_,DATE_FORMAT(cse.create_time_,'%Y年%m月') month_,pg.name_
-        group_name_,cse.teacher_id_ FROM course_schedule_evaluate cse
-        LEFT JOIN practice_group pg on cse.music_group_id_ = pg.id_ WHERE status_= 0
+        group_name_,cse.teacher_id_,pg.student_id_,su.avatar_ student_avatar_ FROM course_schedule_evaluate cse
+        LEFT JOIN practice_group pg on cse.music_group_id_ = pg.id_
+        LEFT JOIN sys_user su ON pg.student_id_=su.id_
+        WHERE status_= 0
         <if test="teacherId != null">
             AND cse.teacher_id_ = #{teacherId}
         </if>

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

@@ -133,6 +133,7 @@
     </update>
     <resultMap id="CourseReviewDto" type="com.ym.mec.biz.dal.dto.CourseReviewDto">
         <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="group_type_" property="groupType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="subject_id_" jdbcType="INTEGER" property="subjectId"/>
         <result column="subject_name_" jdbcType="INTEGER" property="subjectName"/>
         <result column="organ_id_" jdbcType="INTEGER" property="organId"/>
@@ -391,7 +392,7 @@
     </select>
 
     <select id="getOnlineCourseReviewList" resultMap="CourseReviewDto">
-        SELECT cs.id_,cs.class_date_,cs.name_ course_name_,csr.id_ review_id_,
+        SELECT cs.id_,cs.group_type_,cs.class_date_,cs.name_ course_name_,csr.id_ review_id_,
         csr.hand_homework_,csr.course_review_,csr.teaching_material_,csr.pronunciation_,csr.tempo_,
         csr.music_theory_,csr.song_,csr.memo_,csr.create_time_,csr.has_liaison_,csr.update_time_,
         sa.id_ attendance_id_

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

@@ -753,7 +753,7 @@
         SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationOrganId} AND status_ IN ('PROGRESS','PAUSE','PREPARE')
     </select>
     <select id="findByCooperationId" resultMap="MusicGroup">
-        SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationId}
+        SELECT * FROM music_group WHERE cooperation_organ_id_ = #{cooperationId} AND del_flag_ = 0
     </select>
 
     <select id="getStudentLastMusicGroup" resultMap="MusicGroup">

文件差異過大導致無法顯示
+ 450 - 185
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml


+ 9 - 2
mec-biz/src/main/resources/config/mybatis/VipGroupActivityMapper.xml

@@ -35,6 +35,7 @@
 		<result property="maxCourseNum" column="max_course_num_"/>
 		<result property="studentMaxUsedTimes" column="student_max_used_times_"/>
 		<result property="applyToStudentType" column="apply_to_student_type_"/>
+		<result property="allowOnlineToOffline" column="allow_online_to_offline_"/>
 	</resultMap>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -57,10 +58,10 @@
 		INSERT INTO vip_group_activity (id_,name_,description_,vip_group_category_id_list_,start_time_,end_time_,organ_id_,courses_start_time_,courses_end_time_,type_,
 		                                attribute1_,attribute2_,attribute3_,salary_readonly_flag_,give_class_pay_salary_flag_,create_time_,update_time_,salary_settlement_json_,del_flag_,
 		                                payment_readonly_flag_,online_class_join_gradient_rewards_,offline_class_join_gradient_rewards_,min_course_num_,max_course_num_,
-										student_max_used_times_, apply_to_student_type_)
+										student_max_used_times_, apply_to_student_type_,allow_online_to_offline_)
 		VALUES(#{id},#{name},#{description},#{vipGroupCategoryIdList},#{startTime},#{endTime},#{organId},#{coursesStartTime},#{coursesEndTime},#{type},#{attribute1},#{attribute2},#{attribute3},
 		       #{salaryReadonlyFlag},#{giveClassPaySalaryFlag},now(),now(),#{salarySettlementJson},#{delFlag},#{paymentReadonlyFlag},#{onlineClassJoinGradientRewards},
-		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum},#{studentMaxUsedTimes},#{applyToStudentType})
+		       #{offlineClassJoinGradientRewards},#{minCourseNum},#{maxCourseNum},#{studentMaxUsedTimes},#{applyToStudentType},#{allowOnlineToOffline})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -142,6 +143,9 @@
 			<if test="applyToStudentType!=null">
 				apply_to_student_type_=#{applyToStudentType},
 			</if>
+			<if test="allowOnlineToOffline!=null">
+				allow_online_to_offline_=#{allowOnlineToOffline},
+			</if>
 			update_time_ = NOW(),
 		</set>WHERE id_ = #{id}
 	</update>
@@ -169,6 +173,9 @@
 			<if test="applyToStudentType!=null">
 				AND apply_to_student_type_=#{applyToStudentType}
 			</if>
+			<if test="allowOnlineToOffline!=null">
+				AND allow_online_to_offline_=#{allowOnlineToOffline}
+			</if>
 		</where>
 	</sql>
 

+ 8 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ChildrenDayController.java

@@ -48,6 +48,9 @@ public class ChildrenDayController extends BaseController {
         if (Objects.isNull(user)) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if (user.getOrganId().equals(43)) {
+            return failed("您不可参与该活动,请联系乐团主管");
+        }
         return succeed(childrenDayReserveService.addReserve(user, YesOrNoEnum.YES));
     }
 
@@ -79,6 +82,11 @@ public class ChildrenDayController extends BaseController {
         if (sysUser == null) {
             throw new BizException("用户信息获取失败,请重新登陆");
         }
+        if (sysUser.getOrganId().equals(43) &&
+                (degreePayDto.getVip1v1() || degreePayDto.getVip1v2() || degreePayDto.getTheoryCourse())
+        ) {
+            return failed("您不可参与该活动,请联系乐团主管");
+        }
         Date nowTime = new Date();
         String endTimeStr = sysConfigDao.findConfigValue("children_day_end_time");
         Date endTime = DateUtil.stringToDate(endTimeStr);

+ 5 - 0
mec-teacher/pom.xml

@@ -35,6 +35,11 @@
 			<artifactId>spring-cloud-sleuth-zipkin</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-websocket</artifactId>
+		</dependency>
+
 		<!-- swagger-spring-boot -->
 		<dependency>
 			<groupId>com.spring4all</groupId>

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java

@@ -32,7 +32,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 				.and()
 				.authorizeRequests()
 				.antMatchers("/v2/api-docs", "/code/*", "/teacher/queryStudentApply", "/teacher/querySubByMusicGroupId", "/studentRegistration/updateSubject",
-						"/studyReport/createEvaluate", "/teacherOrder/*").permitAll().anyRequest().authenticated().and().httpBasic();
+						"/studyReport/createEvaluate", "/teacherOrder/*","/teacher/getRegisterOrPreList").permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 21 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/config/WebSocketConfig.java

@@ -0,0 +1,21 @@
+package com.ym.mec.teacher.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/8 0008
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig {
+
+    @Bean
+    public ServerEndpointExporter serverEndpoint() {
+        return new ServerEndpointExporter();
+    }
+
+}

+ 16 - 4
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java

@@ -1,19 +1,21 @@
 package com.ym.mec.teacher.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.service.SoundService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * @Author Joburgess
  * @Date 2021/5/19 0019
@@ -32,4 +34,14 @@ public class SoundController extends BaseController {
         return soundService.compare(record, musicScoreId);
     }
 
+    @ApiOperation(value = "小节评分")
+    @PostMapping("measureCompare")
+    public HttpResponseResult measureCompare(@RequestParam("musicXmlInfos") String musicXmlInfos,@RequestParam("record") MultipartFile record){
+        if(StringUtils.isBlank(musicXmlInfos)){
+            return failed();
+        }
+        List<MusicPitchDetailDto> musicXmlInfoList =  JSON.parseArray(musicXmlInfos, MusicPitchDetailDto.class);
+        return soundService.measureCompare(musicXmlInfoList, record);
+    }
+
 }

+ 28 - 4
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherController.java

@@ -1,7 +1,13 @@
 package com.ym.mec.teacher.controller;
 
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.PageInfoReg;
+import com.ym.mec.biz.dal.dto.RegisterDto;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -9,9 +15,13 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,10 +30,6 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherMusicClassQueryInfo;
-import com.ym.mec.biz.dal.page.VipClassQueryInfo;
-import com.ym.mec.biz.dal.page.queryMusicGroupStudentQueryInfo;
 import com.ym.mec.common.controller.BaseController;
 
 @RequestMapping("teacher")
@@ -45,6 +51,10 @@ public class TeacherController extends BaseController {
 	private SubjectDao subjectDao;
 	@Autowired
     private EmployeeService employeeService;
+	@Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+	@Autowired
+    private StudentRegistrationService studentRegistrationService;
 
     @ApiOperation(value = "修改教师个人中心信息")
     @PostMapping("/update")
@@ -195,4 +205,18 @@ public class TeacherController extends BaseController {
         }
         return succeed(employeeService.findByRole("4,5",organIds));
     }
+
+
+    @ApiOperation(value = "获取报名/预报名列表")
+    @GetMapping("/getRegisterOrPreList")
+    public HttpResponseResult<PageInfoReg<RegisterDto>> queryStudentApplyDetail(RegistrationOrPreQueryInfo queryInfo) {
+        if (StringUtils.isNotBlank(queryInfo.getSearch())) {
+            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
+            if (userIds.size() > 0) {
+                queryInfo.setUserIds(userIds);
+            }
+        }
+        return succeed(studentRegistrationService.getRegisterOrPreList(queryInfo));
+    }
 }

+ 50 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/websocket/SoundWebSocket.java

@@ -0,0 +1,50 @@
+package com.ym.mec.teacher.websocket;
+
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/8 0008
+ */
+@ServerEndpoint("/soundPoint")
+@Component
+public class SoundWebSocket {
+
+    /**
+     * 连接成功
+     *
+     * @param session
+     */
+    @OnOpen
+    public void onOpen(Session session) {
+        System.out.println("连接成功");
+    }
+
+    /**
+     * 连接关闭
+     *
+     * @param session
+     */
+    @OnClose
+    public void onClose(Session session) {
+        System.out.println("连接关闭");
+    }
+
+    /**
+     * 接收到消息
+     *
+     * @param text
+     */
+    @OnMessage
+    public String onMsg(String text) throws IOException {
+        return "servet 发送:" + text;
+    }
+
+}

+ 63 - 40
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -197,7 +197,7 @@ public class DateUtil {
 
 	/**
 	 * 设置系统默认的<code>java.util.TimeZone</code>
-	 * 
+	 *
 	 * @param timeZone <code>java.util.TimeZone</code>
 	 */
 	public static void setTimeZone(TimeZone timeZone) {
@@ -256,7 +256,7 @@ public class DateUtil {
 
 	/**
 	 * 将<code>java.util.Date</code>按照给定的模式转换成日期字符串。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param formatter 给定的模式
 	 * @return 转换后的日期字符串
@@ -272,7 +272,7 @@ public class DateUtil {
 
 	/**
 	 * 将<code>java.util.Date</code>按照给定的模式转换成日期字符串。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param formatter 给定的模式
 	 * @return 转换后的日期字符串
@@ -303,10 +303,10 @@ public class DateUtil {
 
 	/**
 	 * 确定给定的年份是否为闰年。
-	 * 
+	 *
 	 * <pre>
 	 * </pre>
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @return True 如果是闰年
 	 */
@@ -342,7 +342,7 @@ public class DateUtil {
 
 	/**
 	 * 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param field 给定的日历字段
 	 * @param amount 数量
@@ -361,7 +361,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的年份。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -372,7 +372,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的月份。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -383,7 +383,7 @@ public class DateUtil {
 
 	/**
 	 * 修改周,时间按周的量增加或减少。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -394,7 +394,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的日数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -405,7 +405,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的小时数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -416,7 +416,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的分钟数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -427,7 +427,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的秒钟数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -438,7 +438,7 @@ public class DateUtil {
 
 	/**
 	 * 增加或减少指定数量的毫秒数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param amount 数量
 	 * @return 运算后的 <code>java.util.Date</code>
@@ -449,7 +449,7 @@ public class DateUtil {
 
 	/**
 	 * 在给定的日历字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param field 给定的日历字段
 	 * @param up 添加或减去(上/下)
@@ -465,7 +465,7 @@ public class DateUtil {
 
 	/**
 	 * 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param field 给定的日历字段
 	 * @param amount 数量
@@ -481,7 +481,7 @@ public class DateUtil {
 
 	/**
 	 * 将毫秒时间戳转换成格里高利历的日数。日数是只从格里高利历第1年1月1日算起的日数。
-	 * 
+	 *
 	 * @param millis 给定的毫秒时间戳
 	 * @return 格里高利历的日数
 	 */
@@ -491,7 +491,7 @@ public class DateUtil {
 
 	/**
 	 * 将<code>java.util.Date</code>转换成格里高利历的日数。 日数是只从格里高利历第1年1月1日算起的日数。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @return 格里高利历的日数
 	 */
@@ -501,7 +501,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的秒钟数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的秒钟数
@@ -512,7 +512,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的分钟数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的分钟数
@@ -528,7 +528,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的小时数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的小时数
@@ -539,7 +539,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的天数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的天数
@@ -554,7 +554,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的月数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的月数
@@ -569,7 +569,7 @@ public class DateUtil {
 
 	/**
 	 * 计算两个日期之间相差的年数。如果第一个日期在第二个日期之前,则返回正,反之返回负。
-	 * 
+	 *
 	 * @param early 第一个日期
 	 * @param late 第二个日期
 	 * @return 两个日期之间相差的年数
@@ -584,7 +584,7 @@ public class DateUtil {
 
 	/**
 	 * 将格里高利历日数转换成 <code>java.sql.Date</code>
-	 * 
+	 *
 	 * @param julian 格里高利历日数
 	 * @return <code>java.sql.Date</code>
 	 */
@@ -594,7 +594,7 @@ public class DateUtil {
 
 	/**
 	 * 将格里高利历日数转换成 <code>java.util.Date</code>
-	 * 
+	 *
 	 * @param julian 格里高利历日数
 	 * @return <code>java.util.Date</code>
 	 */
@@ -604,7 +604,7 @@ public class DateUtil {
 
 	/**
 	 * 将格里高利历日数转换成毫秒时间戳。
-	 * 
+	 *
 	 * @param julian 格里高利历日数
 	 * @return 毫秒时间戳
 	 */
@@ -615,7 +615,7 @@ public class DateUtil {
 	/**
 	 * 将日历转换成儒略历日期。算法参见: <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations
 	 * (Gregorian Calendar)</a>, 由 Bill Jeffrys 提供。
-	 * 
+	 *
 	 * @param c 日历实例
 	 * @return 儒略历日期
 	 */
@@ -636,7 +636,7 @@ public class DateUtil {
 	/**
 	 * 将日期转换成儒略历日期。算法参见: <a href="http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html">Julian Day Calculations
 	 * (Gregorian Calendar)</a>, 由 Bill Jeffrys 提供。
-	 * 
+	 *
 	 * @param date 日期
 	 * @return 儒略历日期
 	 */
@@ -655,7 +655,7 @@ public class DateUtil {
 
 	/**
 	 * 给定此 <code>java.util.Date</code> 的时间值,返回指定日历字段可能拥有的最大值。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param field 日历字段
 	 * @return 对于此 <code>java.util.Date</code> 的时间值而言,给定日历字段的最大值
@@ -670,7 +670,7 @@ public class DateUtil {
 
 	/**
 	 * 给定此 <code>java.util.Date</code> 的时间值,返回指定日历字段可能拥有的最小值。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @param field 日历字段
 	 * @return 对于此 <code>java.util.Date</code> 的时间值而言,给定日历字段的最小值
@@ -685,7 +685,7 @@ public class DateUtil {
 
 	/**
 	 * 截取日期,只保留年、月、日部分。
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @return 截取后的<code>java.util.Date</code>
 	 */
@@ -705,7 +705,7 @@ public class DateUtil {
 
 	/**
 	 * 返回当天的最后一秒
-	 * 
+	 *
 	 * @param date <code>java.util.Date</code>
 	 * @return 截取后的<code>java.util.Date</code>
 	 */
@@ -726,7 +726,7 @@ public class DateUtil {
 
 	/**
 	 * 判断两个日期是否是同一天,精确到天。
-	 * 
+	 *
 	 * @param date1 <code>java.util.Date</code>
 	 * @param date2 <code>java.util.Date</code>
 	 * @return true 如果两个日期是同一天
@@ -744,7 +744,7 @@ public class DateUtil {
 
 	/**
 	 * 判断两个日期是否是同一天,精确到天。
-	 * 
+	 *
 	 * @param cal1 <code>java.util.Calendar</code>
 	 * @param cal2 <code>java.util.Calendar</code>
 	 * @return true 如果两个日期是同一天
@@ -759,7 +759,7 @@ public class DateUtil {
 
 	/**
 	 * 判断两个时间是否完全相等,精确到毫秒。
-	 * 
+	 *
 	 * @param date1 <code>java.util.Date</code>
 	 * @param date2 <code>java.util.Date</code>
 	 * @return true 如果两个时间完全相等
@@ -777,7 +777,7 @@ public class DateUtil {
 
 	/**
 	 * 判断两个时间是否完全相等,精确到毫秒。
-	 * 
+	 *
 	 * @param cal1 <code>java.util.Calendar</code>
 	 * @param cal2 <code>java.util.Calendar</code>
 	 * @return true 如果两个时间完全相等
@@ -848,7 +848,7 @@ public class DateUtil {
 
 	/**
 	 * 解析毫秒时间格式
-	 * 
+	 *
 	 * @param millis
 	 * @return
 	 */
@@ -860,7 +860,7 @@ public class DateUtil {
 
 	/**
 	 * 返回date所在月的第一天
-	 * 
+	 *
 	 * @return
 	 */
 	public static Date getFirstDayOfMonth(Date date) {
@@ -912,7 +912,7 @@ public class DateUtil {
 
 	/**
 	 * 将字符串转换为指定格式的日期
-	 * 
+	 *
 	 * @param dateStr
 	 * @param pattern
 	 * @return
@@ -1239,6 +1239,29 @@ public class DateUtil {
 		return sdf.format(new Date(Long.valueOf(seconds+"000")));
 	}
 
+    public static String secondsFormat(int seconds) {
+        String formatStr = "";
+        if (seconds < 60) {
+            return seconds + "秒";
+        } else if (seconds < 3600) {
+            return seconds / 60 + "分钟";
+        } else if (seconds < 86400) {
+            int hour = seconds / 3600;
+            formatStr += hour + "小时";
+            int second = (seconds - (3600 * hour)) / 60;
+            formatStr += second + "分钟";
+            return formatStr;
+        } else {
+            int days = seconds / 86400;
+            formatStr += days + "天";
+            int hour = (seconds - (86400 * days)) / 3600;
+            formatStr += hour + "小时";
+            int second = (seconds - (86400 * days) - (3600 * hour)) / 60;
+            formatStr += second + "分钟";
+            return formatStr;
+        }
+    }
+
 	public static void main(String[] args) throws ParseException {
 		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

+ 2 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -2969,6 +2969,8 @@ public class ExportController extends BaseController {
                 throw new BizException("非法请求");
             }
         }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
         List<IndexErrorDataExportDto> result = indexErrDataRecordService.queryRecord(queryInfo).getRows();
         if (CollectionUtils.isEmpty(result)) {
             response.setStatus(200);

+ 91 - 13
mec-web/src/main/java/com/ym/mec/web/controller/StudentRegistrationController.java

@@ -2,11 +2,14 @@ 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.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
-import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
+import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.EmployeeService;
 
+import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -14,11 +17,8 @@ import io.swagger.annotations.ApiOperation;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -36,13 +36,7 @@ import org.springframework.web.bind.annotation.RestController;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dto.DelRegisterDto;
-import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
-import com.ym.mec.biz.dal.dto.StudentAddDto;
-import com.ym.mec.biz.dal.dto.StudentPreRegistrationDto;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
-import com.ym.mec.biz.dal.page.StudentPreRegistrationQueryInfo;
-import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
 import com.ym.mec.biz.service.StudentPreRegistrationService;
 import com.ym.mec.biz.service.StudentRegistrationService;
@@ -74,6 +68,8 @@ public class StudentRegistrationController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private EmployeeService employeeService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
 
     @ApiOperation(value = "乐团预报名列表分页查询")
     @GetMapping("/queryPreApplyList")
@@ -271,7 +267,7 @@ public class StudentRegistrationController extends BaseController {
         PageInfo<StudentPreRegistrationDto> studentPreRegistration = studentPreRegistrationService.queryListForPage(queryInfo);
         if (studentPreRegistration.getTotal() <= 0) {
             response.setStatus(200);
-            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.setContentType("Content-Type:application/json;charset=UTF-8");
             response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
             response.flushBuffer();
             return;
@@ -349,4 +345,86 @@ public class StudentRegistrationController extends BaseController {
         }
         return succeed(studentRegistrationService.queryNoClassMusicStudentInfo(queryInfo));
     }
+
+    @ApiOperation(value = "获取报名/预报名列表")
+    @GetMapping("/getRegisterOrPreList")
+    @PreAuthorize("@pcs.hasPermissions('studentRegistration/getRegisterOrPreList')")
+    public HttpResponseResult<PageInfoReg<RegisterDto>> queryStudentApplyDetail(RegistrationOrPreQueryInfo queryInfo) {
+        if (StringUtils.isNotBlank(queryInfo.getSearch())) {
+            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
+            if (userIds.size() > 0) {
+                queryInfo.setUserIds(userIds);
+            }
+        }
+        return succeed(studentRegistrationService.getRegisterOrPreList(queryInfo));
+    }
+
+    @ApiOperation(value = "获取报名/预报名列表导出")
+    @GetMapping("/registerOrPreListExport")
+    @PreAuthorize("@pcs.hasPermissions('studentRegistration/registerOrPreListExport')")
+    public void registerOrPreListExport(RegistrationOrPreQueryInfo queryInfo, HttpServletResponse response) throws Exception {
+        if (StringUtils.isNotBlank(queryInfo.getSearch())) {
+            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
+            if (userIds.size() > 0) {
+                queryInfo.setUserIds(userIds);
+            }
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        PageInfo<RegisterDto> registerOrPreList = studentRegistrationService.getRegisterOrPreList(queryInfo);
+        if (registerOrPreList.getTotal() <= 0) {
+            throw new BizException("没有可导出的记录");
+        }
+
+        List<RegisterDto> hasSoredPreRegs = registerOrPreList.getRows().stream().filter(e -> e.getPerRegisterTime() != null).sorted(Comparator.comparing(RegisterDto::getPerRegisterTime)).collect(Collectors.toList());
+        int i = 1;
+        for (RegisterDto hasSoredPreReg : hasSoredPreRegs) {
+            hasSoredPreReg.setPerRegSort(i);
+            i++;
+        }
+
+        i = 1;
+        List<RegisterDto> pays = registerOrPreList.getRows().stream().filter(e -> e.getPayTime() != null).sorted(Comparator.comparing(RegisterDto::getPayTime)).collect(Collectors.toList());
+        for (RegisterDto pay : pays) {
+            pay.setPaySort(i);
+            i++;
+        }
+
+        OutputStream outputStream = response.getOutputStream();
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"学员编号", "学员姓名", "声部", "预报名时间", "预报名时间差","预报名排名", "缴费时间", "缴费时间差","缴费排名"};
+            String[] body = {"userId", "studentName", "actualSubjectName", "perRegisterTime", "perRegIntervalStr","perRegSort", "payTime", "payIntervalStr","paySort"};
+            workbook = POIUtil.exportExcel(header, body, registerOrPreList.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=registerOrPer-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    workbook.close();
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    @ApiOperation(value = "设置不需要云教练")
+    @GetMapping("/setNoneCloudTeacher")
+    @PreAuthorize("@pcs.hasPermissions('studentRegistration/setNoneCloudTeacher')")
+    public HttpResponseResult<Boolean> setNoneCloudTeacher(Long id) {
+        return succeed(studentRegistrationService.setNoneCloudTeacher(id));
+    }
 }

部分文件因文件數量過多而無法顯示