瀏覽代碼

Merge remote-tracking branch 'origin/master'

周箭河 4 年之前
父節點
當前提交
c89113199d
共有 42 個文件被更改,包括 556 次插入128 次删除
  1. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  2. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java
  3. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  4. 15 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicCardDto.java
  5. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentMusicGroupDto.java
  6. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherCourseSalaryDetail4WebDto.java
  7. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ApprovalStatus.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupQuit.java
  9. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupStudentQueryInfo.java
  11. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageCourseQueryInfo.java
  12. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  13. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  14. 0 2
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  15. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  16. 10 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java
  17. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  19. 80 22
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  20. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  21. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  22. 45 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  23. 30 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  24. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  25. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  26. 2 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  27. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  28. 2 0
      mec-biz/src/main/resources/config/mybatis/ExtracurricularExercisesReplyMapper.xml
  29. 3 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  30. 3 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  31. 24 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml
  32. 10 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml
  33. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  34. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  35. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  36. 15 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  37. 35 26
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  38. 32 8
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  39. 45 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentAttendanceController.java
  40. 23 12
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  41. 8 3
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  42. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -109,4 +109,20 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      * @return
      */
     List<Map<Integer, Integer>> queryStudentSubTotalCourseTimes(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取有可用时长的学员列表
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<Integer> queryHasSubTotalCourseTimeStudentIds(@Param("musicGroupId") String musicGroupId, @Param("hasSubCourseTime") Boolean hasSubCourseTime);
+
+    /**
+     * 获取没有可用时长的学员列表
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<Integer> queryNoSubTotalCourseTimeStudentIds(@Param("musicGroupId") String musicGroupId, @Param("hasSubCourseTime") Boolean hasSubCourseTime);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupQuitDao.java

@@ -32,4 +32,12 @@ public interface MusicGroupQuitDao extends BaseDAO<Long, MusicGroupQuit> {
      * @return
      */
     List<MusicGroupQuit> getQuits(@Param("musicGroupId") String musicGroupId, @Param("userIds") List<Integer> userIds);
+    
+    /**
+     * 获取学生乐团最后一次退团记录
+     * @param userId
+     * @param musicGroupId
+     * @return
+     */
+    MusicGroupQuit queryByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);
 }

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

@@ -6,6 +6,7 @@ import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Subject;
+
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -392,4 +393,11 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     Integer getMusicGroupSubjectStudentNum(@Param("musicGroupId") String musicGroupId, @Param("subjectIds") String subjectIds);
+    
+    /**
+     * 查询用户所在乐团信息
+     * @param userId
+     * @return
+     */
+    List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId);
 }

+ 15 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicCardDto.java

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import io.swagger.annotations.ApiModelProperty;
+
 import org.apache.commons.lang3.StringUtils;
 
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
+
 public class MusicCardDto {
     @ApiModelProperty(value = "报名id",required = true)
     private String registerId;
@@ -13,6 +15,9 @@ public class MusicCardDto {
 
     @ApiModelProperty(value = "乐团编号",required = true)
     private String musicGroupId;
+    
+    @ApiModelProperty(value = "乐团状态(报名中、缴费中、筹备中、进行中、取消)",required = false)
+    private MusicGroupStatusEnum musicGroupStatus;
 
     @ApiModelProperty(value = "科目编号",required = true)
     private String subjectId;
@@ -57,7 +62,15 @@ public class MusicCardDto {
         this.musicGroupId = musicGroupId;
     }
 
-    public Integer getMusicGroupNum() {
+    public MusicGroupStatusEnum getMusicGroupStatus() {
+		return musicGroupStatus;
+	}
+
+	public void setMusicGroupStatus(MusicGroupStatusEnum musicGroupStatus) {
+		this.musicGroupStatus = musicGroupStatus;
+	}
+
+	public Integer getMusicGroupNum() {
         return musicGroupNum;
     }
 

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentMusicGroupDto.java

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+
+public class StudentMusicGroupDto extends StudentRegistration {
+
+	private MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
+	
+	private MusicGroup musicGroup = new MusicGroup();
+
+	public MusicGroupQuit getMusicGroupQuit() {
+		return musicGroupQuit;
+	}
+
+	public void setMusicGroupQuit(MusicGroupQuit musicGroupQuit) {
+		this.musicGroupQuit = musicGroupQuit;
+	}
+
+	public MusicGroup getMusicGroup() {
+		return musicGroup;
+	}
+
+	public void setMusicGroup(MusicGroup musicGroup) {
+		this.musicGroup = musicGroup;
+	}
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherCourseSalaryDetail4WebDto.java

@@ -65,6 +65,16 @@ public class TeacherCourseSalaryDetail4WebDto {
 
     private Integer belongDaya;
 
+    private String salaryType;
+
+    public String getSalaryType() {
+        return salaryType;
+    }
+
+    public void setSalaryType(String salaryType) {
+        this.salaryType = salaryType;
+    }
+
     public Integer getBelongDaya() {
         return belongDaya;
     }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ApprovalStatus.java

@@ -3,7 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum ApprovalStatus implements BaseEnum<String, ApprovalStatus> {
-	APPROVED, DENIED, PROCESSING;
+	APPROVED, DENIED, PROCESSING, CANCELED;
 
 	@Override
 	public String getCode() {

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupQuit.java

@@ -26,6 +26,8 @@ public class MusicGroupQuit {
 
 	/**  */
 	private java.util.Date createTime;
+	
+	private String userComment;
 
 	/** 原因 */
 	private String reason;
@@ -92,6 +94,14 @@ public class MusicGroupQuit {
 		return this.reason;
 	}
 
+	public String getUserComment() {
+		return userComment;
+	}
+
+	public void setUserComment(String userComment) {
+		this.userComment = userComment;
+	}
+
 	public ApprovalStatus getStatus() {
 		return status;
 	}

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

@@ -146,6 +146,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     BACKSTAGE_STUDENT_OK_QUIT_COURSE("BACKSTAGE_STUDENT_OK_QUIT_COURSE", "学员确认退课"),
     BACKSTAGE_STUDENT_APPEAL("BACKSTAGE_STUDENT_APPEAL", "学员申述"),
     BACKSTAGE_STUDENT_APPLY_QUIT_GROUP("BACKSTAGE_STUDENT_APPLY_QUIT_GROUP", "学员申请退团"),
+    PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY("PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY", "学员申请退团"),
+    PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY("PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY", "撤销退团申请"),
     BACKSTAGE_STUDENT_APPLY_QUIT_COURSE("BACKSTAGE_STUDENT_APPLY_QUIT_COURSE", "学员申请退课"),
     BACKSTAGE_STUDENT_APPLY_WITHDRAW("BACKSTAGE_STUDENT_APPLY_WITHDRAW", "学员申请提现"),
     PUSH_STUDY_REPORT("PUSH_STUDY_REPORT", "陪练报告"),

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

@@ -31,6 +31,17 @@ public class MusicGroupStudentQueryInfo extends QueryInfo {
 
   private boolean isExport = false;
 
+  @ApiModelProperty(value = "是否有剩余课时")
+  private Boolean hasSubCourseTime;
+
+  public Boolean getHasSubCourseTime() {
+    return hasSubCourseTime;
+  }
+
+  public void setHasSubCourseTime(Boolean hasSubCourseTime) {
+    this.hasSubCourseTime = hasSubCourseTime;
+  }
+
   public boolean getIsExport() {
     return isExport;
   }

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageCourseQueryInfo.java

@@ -13,7 +13,7 @@ import com.ym.mec.common.page.QueryInfo;
 public class StudentManageCourseQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "学生id",required = true)
-    private Long studentId;
+    private Integer studentId;
 
     @ApiModelProperty(value = "vip课程ID",required = false)
     private Long vipGroupId;
@@ -41,11 +41,11 @@ public class StudentManageCourseQueryInfo extends QueryInfo {
         this.vipGroupId = vipGroupId;
     }
 
-    public Long getStudentId() {
+    public Integer getStudentId() {
         return studentId;
     }
 
-    public void setStudentId(Long studentId) {
+    public void setStudentId(Integer studentId) {
         this.studentId = studentId;
     }
 

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

@@ -17,6 +17,8 @@ import java.util.Map;
 
 public interface CourseScheduleTeacherSalaryService extends BaseService<Long, CourseScheduleTeacherSalary> {
 
+    String TASK_KEY = "SETTLEMENT_TYPES";
+
     /**
      * @Author: Joburgess
      * @Date: 2019/10/14

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

@@ -115,9 +115,19 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	/**
 	 * 申请退团
 	 * @param musicGroupId 乐团编号
+	 * @param reason
+	 * @return
+	 */
+	boolean applyQuitMusicGroup(String musicGroupId, String reason);
+	
+	/**
+	 * 取消退团
+	 * @param userId
+	 * @param musicGroupId
+	 * @param reason
 	 * @return
 	 */
-	boolean applyQuitMusicGroup(String musicGroupId);
+	boolean cancelQuitMusicGroup(Integer userId, String musicGroupId, String reason);
 
 	/**
 	 * 审批退团

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

@@ -8,8 +8,6 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
-
 /**
  * @Author Joburgess
  * @Date 2019/9/19

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

@@ -310,5 +310,12 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @return boolean
      */
     BigDecimal updateUserSurplusCourseFee(Integer userId, String musicGroupId, BigDecimal amount, String memo, Integer operatorId);
+    
+    /**
+     * 查询指定学生的乐团信息
+     * @param userId
+     * @return
+     */
+    List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId);
 
 }

+ 10 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseReviewServiceImpl.java

@@ -1,12 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-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 com.ym.mec.biz.dal.dao.*;
@@ -558,6 +552,15 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
         CourseHomework courseHomework = new CourseHomework();
         List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseSchedule(courseSchedule.getId());
 
+        Set<Integer> serveStudentIds = studentServeService.getStudentWithCourse(courseSchedule.getId());
+        Iterator<CourseScheduleStudentPayment> iterator = courseScheduleStudentPayments.iterator();
+        while (iterator.hasNext()){
+            CourseScheduleStudentPayment courseScheduleStudentPayment = iterator.next();
+            if(!serveStudentIds.contains(courseScheduleStudentPayment.getUserId())){
+                iterator.remove();
+            }
+        }
+
         if (Objects.nonNull(existHomework)) {
             courseHomework.setId(existHomework.getId());
             courseHomework.setContent(content);
@@ -577,11 +580,7 @@ public class CourseReviewServiceImpl extends BaseServiceImpl<Integer, CourseSche
         if (!CollectionUtils.isEmpty(courseScheduleStudentPayments)) {
             Teacher teacher = teacherDao.get(courseSchedule.getActualTeacherId());
             String dateStr = DateUtil.dateToString(DateUtil.addDays(date, 3), "MM月dd日");
-            Set<Integer> serveStudentIds = studentServeService.getStudentWithCourse(courseSchedule.getId());
             for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
-                if(!serveStudentIds.contains(courseScheduleStudentPayment.getUserId())){
-                    continue;
-                }
                 StudentCourseHomework studentCourseHomework = new StudentCourseHomework();
                 if (Objects.isNull(existHomework)) {
                     studentCourseHomework.setCourseHomeworkId(courseHomework.getId());

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

@@ -3276,6 +3276,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				
 				//删除评论
 				courseScheduleReviewDao.delByCourseScheduleId(courseScheduleId);
+
+				List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseSchedule(courseScheduleId);
+				if(!CollectionUtils.isEmpty(courseScheduleStudentPayments)){
+					List<Integer> studentIds = courseScheduleStudentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+					studentServeService.updateExercisesSituation(oldCourseSchedule.getClassDate(), studentIds, oldCourseSchedule.getActualTeacherId());
+				}
 			}
 
 			// 计算课程时长

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

@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -83,6 +84,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private SchoolDao schoolDao;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private RedisTemplate redisTemplate;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
@@ -208,6 +211,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
         List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(startDate,endDate);
 
+        if(CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)){
+            return;
+        }
+
         Set<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toSet());
 
         Set<Integer> teacherIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toSet());
@@ -1361,10 +1368,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
         String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
 
-        int isSalaryGroupTypes = courseScheduleDao.countIsSalaryGroupTypes(startDate, endDate);
+        int isSalaryGroupTypes = redisTemplate.opsForSet().size(CourseScheduleTeacherSalaryService.TASK_KEY).intValue();
         if(isSalaryGroupTypes<3){
             return;
         }
+        redisTemplate.delete(CourseScheduleTeacherSalaryService.TASK_KEY);
         List<CourseScheduleTeacherSalary> salaries = courseScheduleTeacherSalaryDao.getIsSalaryWithDate(startDate, endDate);
         if(CollectionUtils.isEmpty(salaries)){
             return;

+ 80 - 22
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -6,10 +6,18 @@ import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -22,6 +30,38 @@ import com.alibaba.fastjson.TypeReference;
 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.dao.ChargeTypeDao;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
+import com.ym.mec.biz.dal.dao.CooperationOrganDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
+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.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
+import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SchoolDao;
+import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.StudentVisitDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
@@ -1512,7 +1552,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean applyQuitMusicGroup(String musicGroupId) {
+    public boolean applyQuitMusicGroup(String musicGroupId, String reason) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             throw new BizException("用户信息获取失败");
@@ -1527,6 +1567,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroupQuit.setJoinDate(sysUser.getCreateTime());
         musicGroupQuit.setMusicGroupId(musicGroupId);
         musicGroupQuit.setUserId(sysUser.getId());
+        musicGroupQuit.setUserComment(reason);
         musicGroupQuit.setStatus(ApprovalStatus.PROCESSING);
 
         musicGroupQuitDao.insert(musicGroupQuit);
@@ -1536,11 +1577,42 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         memo.put("Id", musicGroupQuit.getId());
         memo.put("type", "MUSICGROUP");
 
-        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
+        sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()),
+                MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
+        Map<Integer, String> receivers = new HashMap<>(1);
+        receivers.put(musicGroup.getEducationalTeacherId(),musicGroup.getEducationalTeacherId().toString());
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
+                receivers,null,0,null,"SYSTEM",musicGroup.getName(),sysUser.getUsername());
         return true;
     }
 
     @Override
+	public boolean cancelQuitMusicGroup(Integer userId, String musicGroupId, String reason) {
+    	MusicGroupQuit musicGroupQuit = musicGroupQuitDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+    	if(musicGroupQuit == null){
+    		throw new BizException("操作失败,没有查询到退团记录");
+    	}
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团不存在");
+        }
+    	musicGroupQuit.setStatus(ApprovalStatus.CANCELED);
+        musicGroupQuit.setReason(reason);
+        musicGroupQuit.setQuitDate(new Date());
+        musicGroupQuitDao.update(musicGroupQuit);
+
+        Map<Integer, String> receivers = new HashMap<>(1);
+        receivers.put(musicGroup.getEducationalTeacherId(),musicGroup.getEducationalTeacherId().toString());
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY,
+                receivers,null,0,null,"SYSTEM",musicGroup.getName(),sysUser.getUsername());
+    	return true;
+	}
+
+	@Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
                                          boolean isRefundTeachingAssistantsFee) {
@@ -1639,10 +1711,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.findApplyOrderGoods(studentPaymentOrder.getId());
 
-            Set<String> courseTypeSet = new HashSet<>();
             if (isRefundCourseFee) {
-                List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(studentRegistration.getMusicGroupId());
-                courseTypeSet = courseSettings.stream().map(e -> e.getCourseType().getCode()).collect(Collectors.toSet());
+                // 退课程费用
+            	amount = amount.add(studentRegistration.getSurplusCourseFee());
             }
 
             SubjectChange studentLastChange = null;
@@ -1660,12 +1731,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     remitFee = BigDecimal.ZERO;
                 }
 
-                if (isRefundCourseFee) {
-                    // 退课程费用
-                    if (courseTypeSet.contains(detail.getType().getCode())) {
-                        amount = amount.add(detail.getPrice());
-                    }
-                }
                 if (isRefundInstrumentFee && studentLastChange == null) {
                     // 退乐器费用
                     if (detail.getType() == OrderDetailTypeEnum.MUSICAL) {
@@ -1794,10 +1859,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         List<StudentPaymentOrderDetail> orderDetailList = studentPaymentOrderDetailDao.findApplyOrderGoods(studentPaymentOrder.getId());
 
-        Set<String> courseTypeSet = new HashSet<>();
         if (isRefundCourseFee) {
-            List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(studentRegistration.getMusicGroupId());
-            courseTypeSet = courseSettings.stream().map(e -> e.getCourseType().getCode()).collect(Collectors.toSet());
+            // 退课程费用
+        	amount = amount.add(studentRegistration.getSurplusCourseFee());
         }
 
         SubjectChange studentLastChange = null;
@@ -1815,12 +1879,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 detail.setPrice(detail.getPrice().subtract(remitFee));
                 remitFee = BigDecimal.ZERO;
             }
-            if (isRefundCourseFee) {
-                // 退课程费用
-                if (courseTypeSet.contains(detail.getType().getCode())) {
-                    amount = amount.add(detail.getPrice());
-                }
-            }
             if (isRefundInstrumentFee && studentLastChange == null) {
                 // 退乐器费用
                 if (detail.getType() == OrderDetailTypeEnum.MUSICAL) {

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -171,6 +171,9 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			dataList = extracurricularExercisesReplyDao.findStudentHomeworkDetailsInTimeZone(params);
 			Map<String, List<StudentServiceDetailDto>> weekHomeworks=new HashMap<>();
 			for (StudentServiceDetailDto studentServiceDetailDto : dataList) {
+				if(Objects.isNull(studentServiceDetailDto.getCourseStartTime())){
+					continue;
+				}
 				LocalDate homeworkCreateTime = LocalDateTime.ofInstant(studentServiceDetailDto.getCourseStartTime().toInstant(), DateUtil.zoneId).toLocalDate();
 				String mondayStr = homeworkCreateTime.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString();
 				if(!weekHomeworks.containsKey(mondayStr)){

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

@@ -417,6 +417,19 @@ public class StudentManageServiceImpl implements StudentManageService {
         MapUtil.populateMap(params, queryInfo);
         List<MusicGroupStudentsDto> dataList = null;
         String musicGroupId = queryInfo.getMusicGroupId();
+        //是否有剩余课时
+        if(queryInfo.getHasSubCourseTime() != null){
+            List<Integer> students = new ArrayList<>();
+            if(queryInfo.getHasSubCourseTime()){
+                students = musicGroupPaymentStudentCourseDetailDao.queryHasSubTotalCourseTimeStudentIds(musicGroupId,queryInfo.getHasSubCourseTime());
+            }else {
+                students = musicGroupPaymentStudentCourseDetailDao.queryNoSubTotalCourseTimeStudentIds(musicGroupId,queryInfo.getHasSubCourseTime());
+            }
+            if (students.size() == 0){
+                return pageInfo;
+            }
+            params.put("studentIds", students);
+        }
         int count = studentManageDao.countMusicGroupStudent(params);
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");

+ 45 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -16,10 +16,6 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,11 +23,37 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 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.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.GoodsDao;
+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.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
+import com.ym.mec.biz.dal.dao.StudentCourseFeeDetailDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SubjectChangeDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.CourseFormDto;
+import com.ym.mec.biz.dal.dto.StudentAddDto;
+import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
+import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
+import com.ym.mec.biz.dal.dto.StudentInfo;
+import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
+import com.ym.mec.biz.dal.dto.StudentMusicGroupDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
@@ -55,6 +77,19 @@ import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+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.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GoodsType;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.ClassGroupStudentMapperService;
@@ -83,8 +118,8 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
-import org.springframework.util.CollectionUtils;
 
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
@@ -1470,4 +1505,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         studentRegistrationDao.update(studentRegistration);
         return amount;
     }
+
+	@Override
+	public List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId) {
+		return studentRegistrationDao.queryStudentMusicGroupInfo(userId);
+	}
 }

+ 30 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -308,6 +308,9 @@ public class StudentServeServiceImpl implements StudentServeService {
 //        }
 
         List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), studentIds);
+        if(CollectionUtils.isEmpty(studentFutureCourseInfo)){
+            return;
+        }
         Map<Integer, List<StudentServeCourseDto>> studentCourseMap = studentFutureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getStudentId));
 
         List<StudentExtracurricularExercisesSituation> results=new ArrayList<>();
@@ -319,11 +322,15 @@ public class StudentServeServiceImpl implements StudentServeService {
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.SINGLE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
-                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
-                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
-                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
-                            "EXERCISE", null);
-                    results.add(studentExtracurricularExercisesSituation);
+                    Map<String, List<StudentServeCourseDto>> groupCourseInfo = futureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
+                    for (Map.Entry<String, List<StudentServeCourseDto>> groupCourseInfoEntry : groupCourseInfo.entrySet()) {
+                        StudentServeCourseDto courseInfo = groupCourseInfoEntry.getValue().stream().min(Comparator.comparing(StudentServeCourseDto::getCourseStartTime)).get();
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                courseInfo.getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "EXERCISE", null);
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
                 }else{
                     Map<String, List<StudentServeCourseDto>> groupCourseInfo = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getMusicGroupId));
                     Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
@@ -347,11 +354,14 @@ public class StudentServeServiceImpl implements StudentServeService {
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.VIP).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
-                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
-                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
-                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
-                            "EXERCISE", null);
-                    results.add(studentExtracurricularExercisesSituation);
+                    Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = futureCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
+                    for (Integer teacherId : teacherCourseMap.keySet()) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherId,nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "EXERCISE", null);
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
                 }else{
                     Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
                     for (Map.Entry<Integer, List<StudentServeCourseDto>> teacherCourseMapEntry : teacherCourseMap.entrySet()) {
@@ -386,11 +396,14 @@ public class StudentServeServiceImpl implements StudentServeService {
                 List<StudentServeCourseDto> futureCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE);
                 List<StudentServeCourseDto> weekCourseInfo = typeCourseMap.get(CourseSchedule.CourseScheduleType.PRACTICE).stream().filter(c -> c.getCourseStartTime().compareTo(nextMonday) < 0).collect(Collectors.toList());
                 if(CollectionUtils.isEmpty(weekCourseInfo)){
-                    StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
-                            futureCourseInfo.get(0).getActualTeacherId(),nowDate.get(DateUtil.weekFields.weekOfYear()),
-                            DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
-                            "EXERCISE", null);
-                    results.add(studentExtracurricularExercisesSituation);
+                    Set<Integer> teacherIds = futureCourseInfo.stream().map(StudentServeCourseDto::getActualTeacherId).collect(Collectors.toSet());
+                    for (Integer teacherId : teacherIds) {
+                        StudentExtracurricularExercisesSituation studentExtracurricularExercisesSituation=new StudentExtracurricularExercisesSituation(studentCourseMapEntry.getKey(),
+                                teacherId,nowDate.get(DateUtil.weekFields.weekOfYear()),
+                                DateUtil.stringToDate(monDayDate.toString(), "yyyy-MM-dd"), DateUtil.stringToDate(sunDayDate.toString(), "yyyy-MM-dd"),
+                                "EXERCISE", null);
+                        results.add(studentExtracurricularExercisesSituation);
+                    }
                 }else{
                     Map<Integer, List<StudentServeCourseDto>> teacherCourseMap = weekCourseInfo.stream().collect(Collectors.groupingBy(StudentServeCourseDto::getActualTeacherId));
                     Map<Integer, Set<Long>> teacherServiceCourseIdMap = new HashMap<>();
@@ -414,7 +427,7 @@ public class StudentServeServiceImpl implements StudentServeService {
         }
 
         if(!CollectionUtils.isEmpty(results)){
-            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
+//            studentExtracurricularExercisesSituationDao.deleteByMonday(monDayDate.toString());
             BigDecimal currentPage1=BigDecimal.ONE,
                     pageSize1=new BigDecimal(10000),
                     total1=new BigDecimal(results.size()),
@@ -528,6 +541,7 @@ public class StudentServeServiceImpl implements StudentServeService {
 
         for (StudentExtracurricularExercisesSituation weekServiceWithStudent : weekServiceWithStudents) {
             List<StudentServeCourseHomeworkDto> studentHomeworks = studentHomeworkMap.get(weekServiceWithStudent.getStudentId());
+            weekServiceWithStudent.setActualExercisesNum(0);
             if(!CollectionUtils.isEmpty(studentHomeworks)&&weekServiceWithStudent.getServeType().equals("HOMEWORK")){
                 weekServiceWithStudent.setActualExercisesNum(1);
                 long replyNum = studentHomeworks.stream().filter(e -> YesOrNoEnum.YES.equals(e.getStatus())).count();

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

@@ -277,8 +277,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 					courseHomework.setGroupType(teacherAttendance.getGroupType());
 					courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue());
 					courseHomework.setExpiryDate(DateUtil.addDays(date,7));
-					courseHomework.setExpectNum(courseScheduleDao.countCourseStudentNum(teacherAttendance.getCourseScheduleId()));
+
 					courseHomeworkService.insert(courseHomework);
+
 					List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao
 							.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
 									courseHomework.getId());
@@ -293,6 +294,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 							iterator.remove();
 						}
 					}
+					courseHomework.setExpectNum(studentCourseHomeworks.size());
+					courseHomeworkService.update(courseHomework);
+
 					studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
 					List<Integer> studentIds = studentCourseHomeworks.stream().map(StudentCourseHomework::getUserId).collect(Collectors.toList());
 					studentServeService.updateExercisesSituation(courseSchedule.getClassDate(), studentIds, teacherAttendance.getTeacherId());
@@ -420,6 +424,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 							null,0,"6?sealClassId=" + courseScheduleId + "&subjectName=" + name ,"STUDENT",courseSchedule.getName());
 				}
 			}
+		}else if(StringUtils.isNotEmpty(teacherAttendance.getSignInDeviceNo())){
+			teacherAttendance.setSignInDeviceNo(deviceNum);
+			teacherAttendanceDao.update(teacherAttendance);
 		}
 	}
 

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

@@ -597,7 +597,7 @@
             practice_group pg
             LEFT JOIN class_group cg ON pg.id_=cg.music_group_id_ AND cg.group_type_='PRACTICE'
         WHERE
-            pg.user_id_ = #{teacherId} AND cg.del_flag_ = 0 AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
+            pg.user_id_ = #{teacherId} AND cg.del_flag_ = 0
             <if test="status == null or status == ''">
                 AND pg.group_status_!='CANCEL' AND pg.group_status_!='LOCK'
             </if>

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

@@ -681,6 +681,7 @@
 		WHERE cssp.user_id_=#{studentId}
 		  AND cs.class_date_&lt;#{monday}
 		  AND cs.type_=#{courseType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-		ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) LIMIT 1
+		  AND (cs.del_flag_ != 1 OR cs.del_flag_ IS NULL)
+		ORDER BY CONCAT(cs.class_date_, ' ', cs.start_class_time_) DESC LIMIT 1
 	</select>
 </mapper>

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

@@ -848,7 +848,7 @@
 				AND (csts.course_schedule_id_=#{search} OR cs.name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
 			<if test="belongDaya!=null">
-				AND csts.is_belong_to_daya_ = #{belongDaya}
+				AND csts.belong_to_daya_ = #{belongDaya}
 			</if>
 		</where>
 	</sql>

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

@@ -408,6 +408,7 @@
 			ee.id_ homework_id_,
 			eer.id_ student_homework_id_,
 			ee.title_,
+		 	NULL course_schedule_id_,
 			ee.teacher_id_,
 			tea.real_name_ teacher_name_,
 			NULL group_id_,
@@ -433,6 +434,7 @@
 			ch.id_ homework_id_,
 			sch.id_ student_homework_id_,
 			NULL title_,
+		    cs.id_ course_schedule_id_,
 			cs.actual_teacher_id_,
 			tea.real_name_ teacher_name_,
 			cs.music_group_id_ group_id_,

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

@@ -230,7 +230,7 @@
         <result column="music_group_id_" property="musicGroupId"/>
         <result column="vip_class_num_" property="vipClassNum"/>
         <result column="music_group_num_" property="musicGroupNum"/>
-        <!--<result column="payment_status_" property="paymentStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>-->
+        <result column="music_group_status_" property="musicGroupStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <select id="queryUserMusicGroups" resultMap="queryUserMusicGroupsMap">
@@ -241,7 +241,8 @@
              , mg.name_     music_group_name_
              , s.name_      subject_name_
              , s.id_        subject_id_
-             , mg.id_       music_group_id_
+             , mg.id_       music_group_id_,
+    		 mg.status_ music_group_status_
         FROM student_registration sr
                  LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_
                  LEFT JOIN `subject` s ON sr.actual_subject_id_ = s.id_

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml

@@ -173,6 +173,9 @@
 	            <if test="item.memo != null">
 	                memo_ = #{item.memo},
 	            </if>
+	            <if test="item.auditMemo != null">
+	                audit_memo_ = #{item.auditMemo},
+	            </if>
 	            <if test="item.startPaymentDate != null">
 	                start_payment_date_ = #{item.startPaymentDate},
 	            </if>

+ 24 - 4
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentStudentCourseDetailMapper.xml

@@ -230,10 +230,13 @@
         SELECT mgpscd.user_id_ 'key',SUM(CASE WHEN mgpscd.used_course_minutes_ = 0 THEN mgpscd.total_course_minutes_ ELSE 0 END) 'value'
         FROM music_group_payment_student_course_detail mgpscd
         LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
-        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ IN
-        <foreach collection="studentIds" open="(" close=")" item="item" separator=",">
-            #{item}
-        </foreach>
+        WHERE mgpc.music_group_id_ = #{musicGroupId}
+        <if test="studentIds != null">
+            AND mgpscd.user_id_ IN
+            <foreach collection="studentIds" open="(" close=")" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
         GROUP BY mgpscd.user_id_
     </select>
 
@@ -244,4 +247,21 @@
         WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ = #{userId}
         GROUP BY mgpscd.course_type_
     </select>
+
+    <select id="queryHasSubTotalCourseTimeStudentIds" resultType="java.lang.Integer">
+        SELECT DISTINCT mgpscd.user_id_
+        FROM music_group_payment_student_course_detail mgpscd
+        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.used_course_minutes_ = 0
+    </select>
+
+    <select id="queryNoSubTotalCourseTimeStudentIds" resultType="java.lang.Integer">
+        SELECT DISTINCT mgpscd.user_id_ FROM music_group_payment_student_course_detail mgpscd
+        LEFT JOIN music_group_payment_calender mgpc ON mgpc.id_ = mgpscd.music_group_payment_calender_id_
+        WHERE mgpc.music_group_id_ = #{musicGroupId} AND mgpscd.user_id_ NOT IN (
+                SELECT DISTINCT mgpscd1.user_id_
+                FROM music_group_payment_student_course_detail mgpscd1
+                LEFT JOIN music_group_payment_calender mgpc1 ON mgpc1.id_ = mgpscd1.music_group_payment_calender_id_
+                WHERE mgpc1.music_group_id_ = #{musicGroupId} AND mgpscd1.used_course_minutes_ = 0)
+    </select>
 </mapper>

+ 10 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupQuitMapper.xml

@@ -12,6 +12,7 @@
         <result column="quit_date_" property="quitDate"/>
         <result column="create_time_" property="createTime"/>
         <result column="reason_" property="reason"/>
+        <result column="user_comment_" property="userComment"/>
         <result column="status_" property="status"
                 typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
@@ -36,8 +37,8 @@
         <!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval
             AS ID FROM DUAL </selectKey> -->
         INSERT INTO music_group_quit
-        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,status_)
-        VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},
+        (id_,user_id_,music_group_id_,join_date_,quit_date_,create_time_,reason_,user_comment_,status_)
+        VALUES(#{id},#{userId},#{musicGroupId},#{joinDate},#{quitDate},#{createTime},#{reason},#{userComment},
         #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
 
@@ -57,6 +58,9 @@
             <if test="reason != null">
                 reason_ = #{reason},
             </if>
+            <if test="userComment != null">
+                user_comment_ = #{userComment},
+            </if>
             <if test="quitDate != null">
                 quit_date_ = #{quitDate},
             </if>
@@ -116,4 +120,8 @@
         GROUP BY user_id_
         )
     </select>
+
+    <select id="queryByUserIdAndMusicGroupId" resultMap="MusicGroupQuit">
+        select * from music_group_quit where id_ in (select max(id_) from music_group_quit where music_group_id_ = #{musicGroupId} AND user_id_ = #{userId})
+    </select>
 </mapper>

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

@@ -37,6 +37,7 @@
         <result column="class_date_" property="courseSchedule.classDate"/>
         <result column="start_class_time_" property="courseSchedule.startClassTime"/>
         <result column="end_class_time_" property="courseSchedule.endClassTime"/>
+        <result column="new_course_id_" property="courseSchedule.newCourseId"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -486,7 +487,7 @@
     <select id="findStudentAttendance" resultMap="StudentAttendance">
         SELECT cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,sa.status_,
         su.username_,su.phone_,su.avatar_,cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,tu.real_name_ teacher_name_,cs.name_ course_schedule_name_,cs.status_ course_status_,
-        cs.actual_teacher_id_ teacher_id_,cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ 
+        cs.actual_teacher_id_ teacher_id_,cs.class_date_ ,cs.start_class_time_,cs.end_class_time_ ,cs.new_course_id_
         FROM course_schedule_student_payment cssp left join course_schedule cs on cs.id_ = cssp.course_schedule_id_
         left join student_attendance sa on cssp.course_schedule_id_ = sa.course_schedule_id_ and cssp.user_id_ = sa.user_id_
         LEFT JOIN sys_user su ON cssp.user_id_ = su.id_

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

@@ -163,7 +163,7 @@
 				<if test="situation.serveType!=null">
 					serve_type_=#{situation.serveType},
 				</if>
-				<if test="situation.courseIds!=null and situation.courseIds!=''">
+				<if test="situation.courseIds!=null">
 					course_ids_=#{situation.courseIds},
 				</if>
 				update_time_ = NOW()
@@ -458,7 +458,7 @@
 	</select>
 
 	<select id="findServiceWithCourse"
-			resultType="com.ym.mec.biz.dal.entity.StudentExtracurricularExercisesSituation">
+			resultMap="StudentExtracurricularExercisesSituation">
 		SELECT * FROM student_extracurricular_exercises_situation_ WHERE monday_=#{monday} AND FIND_IN_SET(#{courseId}, course_ids_)
 	</select>
 </mapper>

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

@@ -418,6 +418,12 @@
 
     <sql id="queryMusicGroupStudentSql">
         <where>
+            <if test="studentIds != null">
+                AND su.id_ IN
+                <foreach collection="studentIds" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
             <if test="search != null and search != ''">
                 AND (su.id_ = #{search} OR su.username_ LIKE CONCAT("%",#{search},"%") OR su.phone_ LIKE CONCAT("%",#{search},"%"))
             </if>

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

@@ -42,6 +42,12 @@
         <result column="deposit_fee_" property="depositFee" />
         <result column="surplus_course_fee_" property="surplusCourseFee"/>
     </resultMap>
+    
+    <resultMap type="com.ym.mec.biz.dal.dto.StudentMusicGroupDto" id="StudentMusicGroupDto" extends="StudentRegistration">
+    	<result column="music_group_quit_status_" property="musicGroupQuit.status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="music_group_status_" property="musicGroup.status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="music_group_name_" property="musicGroup.name"/>
+    </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.StudentInfo" id="StudentInfo">
         <result column="id_" property="id"/>
@@ -708,4 +714,13 @@
         SELECT COUNT(*) FROM student_registration WHERE music_group_id_=#{musicGroupId}
         AND INTE_ARRAY(actual_subject_id_,#{subjectIds}) AND music_group_status_ = 'NORMAL'
     </select>
+    
+    <select id="queryStudentMusicGroupInfo" resultMap="StudentMusicGroupDto">
+    	select sr.*,s.name_ subject_name_,mg.status_ music_group_status_,mg.name_ music_group_name_,mgq.status_ music_group_quit_status_ 
+    	from student_registration sr left join subject s on s.id_ = sr.actual_subject_id_
+    	left join music_group mg on sr.music_group_id_ = mg.id_
+    	left join (select * from music_group_quit where id_ in (select max(id_) from music_group_quit group by music_group_id_)) mgq  on mgq.music_group_id_ = mg.id_
+    	where sr.user_id_ = #{userId}
+    	order by sr.id_ 
+    </select>
 </mapper>

+ 35 - 26
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -276,18 +276,22 @@ public class RoomServiceImpl implements RoomService {
         if(roomMember == null){
             return ;
         }
-//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-//        if(redisTemplate.hasKey(joinSuccessKey)){
-//            //兼容旧版本,防止重复调用
-//            redisTemplate.delete(joinSuccessKey);
-//            return;
-//        }
-//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-//        if(redisTemplate.hasKey(leaveSuccessKey)){
-//            redisTemplate.delete(leaveSuccessKey);
-//        }
-//        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
-//        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
+        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+        if(redisTemplate.hasKey(joinSuccessKey)){
+            //兼容旧版本,防止重复调用
+            redisTemplate.delete(joinSuccessKey);
+            RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
+            if(roleEnum == RoleTeacher && StringUtils.isNotEmpty(deviceNum)){
+                signInSuccess(roomMember,deviceNum);
+            }
+            return;
+        }
+        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
+        if(redisTemplate.hasKey(leaveSuccessKey)){
+            redisTemplate.delete(leaveSuccessKey);
+        }
+        redisTemplate.opsForValue().setIfAbsent(joinSuccessKey,roomId,2l,TimeUnit.SECONDS);
+        log.info("joinRoomSuccess : roomId={}, userId={}", roomId, userId);
 
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
@@ -410,21 +414,26 @@ public class RoomServiceImpl implements RoomService {
         if(roomMember == null){
             return ;
         }
-//        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
-//        if(redisTemplate.hasKey(leaveSuccessKey)){
-//            redisTemplate.delete(leaveSuccessKey);
-//            //如果设备号不为空,更新设备号
-//            return;
-//        }
-//        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
-//        if(redisTemplate.hasKey(joinSuccessKey)){
-//            redisTemplate.delete(joinSuccessKey);
-//        }
-//        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
-//        //记录
-//        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
-        RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
+        String leaveSuccessKey = "leaveRoomSuccess"+ roomId + userId;
         Integer firstCourseId = Integer.parseInt(roomId.substring(1));
+        if(redisTemplate.hasKey(leaveSuccessKey)){
+            redisTemplate.delete(leaveSuccessKey);
+            //如果设备号不为空,更新设备号
+            RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
+            if(roleEnum == RoleTeacher && StringUtils.isNotEmpty(deviceNum)){
+                signInSuccess(roomMember,deviceNum);
+                teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),Integer.parseInt(userId),deviceNum);
+            }
+            return;
+        }
+        String joinSuccessKey = "joinRoomSuccess"+ roomId + userId;
+        if(redisTemplate.hasKey(joinSuccessKey)){
+            redisTemplate.delete(joinSuccessKey);
+        }
+        redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey,roomId,2,TimeUnit.SECONDS);
+        //记录
+        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId,userId);
+        RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
 
         if(roleEnum == RoleTeacher){
             courseScheduleStudentPaymentDao.adjustPlayMidi(firstCourseId,null,null);

+ 32 - 8
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -1,12 +1,10 @@
 package com.ym.mec.student.controller;
 
-import com.ym.mec.biz.dal.entity.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 
-import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -18,7 +16,6 @@ import javax.annotation.Resource;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,10 +26,15 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
@@ -79,6 +81,16 @@ public class MusicGroupController extends BaseController {
         }
         return succeed(musicGroupService.queryUserMusicGroups(sysUser.getId()));
     }
+    
+    @ApiOperation("获取学生所在乐团列表")
+    @GetMapping(value = "/queryStudentMusicGroupInfo")
+    public Object queryStudentMusicGroupInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(studentRegistrationService.queryStudentMusicGroupInfo(sysUser.getId()));
+    }
 
     @ApiOperation("获取学生个人中心乐团信息")
     @GetMapping(value = "/queryPersonalMusicGroups")
@@ -210,11 +222,23 @@ public class MusicGroupController extends BaseController {
         return succeed(renew);
     }
 
-    @ApiOperation(value = "退团")
+    @ApiOperation(value = "申请退团")
     @PostMapping("/quitMusicGroup")
-    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String")})
-    public HttpResponseResult quitMusicGroup(String musicGroupId) throws Exception {
-        return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId));
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+    	@ApiImplicitParam(name = "reason", value = "原因", required = true, dataType = "String")})
+    public HttpResponseResult quitMusicGroup(String musicGroupId, String reason) throws Exception {
+        return succeed(musicGroupService.applyQuitMusicGroup(musicGroupId, reason));
+    }
+
+    @ApiOperation(value = "取消退团申请")
+    @PostMapping("/cancelQuitMusicGroup")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String"),
+    	@ApiImplicitParam(name = "reason", value = "取消原因", required = true, dataType = "String")})
+    public HttpResponseResult cancelQuitMusicGroup(String musicGroupId, String reason) throws Exception {
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Integer userId = sysUser.getId();
+        
+        return succeed(musicGroupService.cancelQuitMusicGroup(userId, musicGroupId, reason));
     }
 
     @ApiOperation(value = "查询是否有待支付的报名订单")

+ 45 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentAttendanceController.java

@@ -0,0 +1,45 @@
+package com.ym.mec.student.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.common.controller.BaseController;
+
+@RequestMapping("studentAttendance")
+@Api(tags = "学生考勤服务")
+@RestController
+public class StudentAttendanceController extends BaseController {
+
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+
+
+    @ApiOperation(value = "获取某节课学生签到列表")
+    @GetMapping("/findStudentAttendance")
+    public Object findStudentAttendance(StudentAttendanceQueryInfo queryInfo){
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        queryInfo.setStudentID(sysUser.getId());
+        return succeed(studentAttendanceService.findStudentAttendance(queryInfo));
+    }
+
+}

+ 23 - 12
mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -1,19 +1,11 @@
 package com.ym.mec.student.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.CashAccountDetail;
-import com.ym.mec.biz.dal.entity.SysSuggestion;
-import com.ym.mec.biz.dal.entity.SysUserBankCard;
-import com.ym.mec.biz.service.*;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.UploadReturnBean;
-import com.ym.mec.common.filters.TenantIdThreadLocal;
-import com.ym.mec.common.page.QueryInfo;
-import com.ym.mec.util.upload.UploadUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+
+import java.util.Date;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,7 +17,25 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Date;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.biz.dal.entity.SysSuggestion;
+import com.ym.mec.biz.dal.entity.SysUserBankCard;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysSuggestionService;
+import com.ym.mec.biz.service.SysUserBankCardService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.ym.mec.common.filters.TenantIdThreadLocal;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.util.upload.UploadUtil;
 
 @Api(tags = "学生管理")
 @RestController
@@ -199,4 +209,5 @@ public class StudentManageController extends BaseController {
         }
         return succeed(subjectService.findSubSubjects(tenantId));
     }
+
 }

+ 8 - 3
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -1686,15 +1686,20 @@ public class ExportController extends BaseController {
                     row.setSignOutStatusStr(signOutTimeStr + "(异常签退)");
                 }
             }
+            if(row.getBelongDaya()==1){
+                row.setSalaryType("基本课酬");
+            }else{
+                row.setSalaryType("其它课酬");
+            }
         }
         OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(
                     new String[]{"分部", "课程组类型", "课程编号", "时间", "课程名称", "老师编号", "老师姓名", "签到时间", "签退时间",
-                            "学员缴费", "应发课酬", "课酬扣款", "结算课酬", "状态", "备注", "扣款原因"},
+                            "学员缴费", "课酬类型", "应发课酬", "课酬扣款", "结算课酬", "状态", "备注", "扣款原因"},
                     new String[]{"organName", "groupType.desc", "courseScheduleId", "startClassTime", "courseName", "teacherId", "teacherName",
-                            "signInStatusStr", "signOutStatusStr", "actualReceipts", "actualSalary", "reduceSalary", "finalSalary", "confirmStatus.desc",
-                            "memo", "deductionReason"}, rows);
+                            "signInStatusStr", "signOutStatusStr", "actualReceipts", "salaryType", "actualSalary", "reduceSalary", "finalSalary",
+                            "confirmStatus.desc", "memo", "deductionReason"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             ouputStream = response.getOutputStream();

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.event.source.CourseEventSource;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.redis.service.RedisCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -85,6 +86,8 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private CourseEventSource courseEventSource;
+	@Autowired
+	private RedisCache<String, Object> redisCache;
 
 	@GetMapping(value = "/autoAffirmReceiveTask")
 	// 自动确认收货
@@ -126,6 +129,7 @@ public class TaskController extends BaseController {
 	// vip课课酬结算
 	public void vipGroupTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.teacherSalarySettlement();
+		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "VIP");
 		courseScheduleTeacherSalaryService.salaryMark();
 	}
 
@@ -133,6 +137,7 @@ public class TaskController extends BaseController {
 	// 陪练课课酬结算
 	public void practiceTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.practiceTeacherSalarySettlement();
+		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "PRACTICE");
 		courseScheduleTeacherSalaryService.salaryMark();
 	}
 
@@ -140,6 +145,7 @@ public class TaskController extends BaseController {
 	@GetMapping("/musicGroupTeacherSalarySettlement")
 	public void musicGroupTeacherSalarySettlement() {
 		courseScheduleTeacherSalaryService.musicGroupTeacherSalarySettlement();
+		redisCache.getRedisTemplate().opsForSet().add(CourseScheduleTeacherSalaryService.TASK_KEY, "MUSIC");
 		courseScheduleTeacherSalaryService.salaryMark();
 	}