Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/mec

周箭河 5 years ago
parent
commit
d894e24221
18 changed files with 645 additions and 227 deletions
  1. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  2. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  3. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceDto.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  6. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  9. 27 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  10. 40 30
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  11. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  12. 102 57
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  13. 199 47
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  14. 49 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  15. 66 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 1 0
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  17. 22 7
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  18. 59 52
      mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -93,6 +93,28 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
                                                        @Param("groupType") String groupType);
 
     /**
+     * @describe 获取教师在指定时间的前一节课程
+     * @author Joburgess
+     * @date 2020.10.21
+     * @param startClassTime:
+     * @param teacherId:
+     * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     */
+    CourseSchedule getTeacherPrevCourseWithStartTime(@Param("startClassTime") Date startClassTime,
+                                                     @Param("teacherId") Integer teacherId);
+
+    /**
+     * @describe 获取教师在指定时间前有签到的课程
+     * @author Joburgess
+     * @date 2020.10.21
+     * @param startClassTime:
+     * @param teacherId:
+     * @return com.ym.mec.biz.dal.entity.CourseSchedule
+     */
+    CourseSchedule getTeacherAttendanceCourseBeforeStartTime(@Param("startClassTime") Date startClassTime,
+                                                             @Param("teacherId") Integer teacherId);
+
+    /**
      * @param musicGroupId: 乐团编号
      * @param status:       状态
      * @param userId:       用户编号

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

@@ -137,11 +137,11 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto
      * @describe 根据课程统计点名记录
      */
-    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId}")
+    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId} AND remark_ IS NULL")
     int countByCourseSchedule(Long courseScheduleId);
 
     /**
-     * @describe 统计每节课上的学生数
+     * @describe 统计每节课上的学生数,排除学员自己请假的记录
      * @author Joburgess
      * @date 2019/12/26
      * @param courseScheduleIds:

+ 10 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -113,6 +113,15 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
      * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
      */
     List<TeacherAttendance> findTeacherIdByCourseSchedule(@Param("courseScheduleIds") List<Long> courseScheduleIds);
+
+    /**
+     * @describe 获取指定课程的教师签到记录
+     * @author Joburgess
+     * @date 2020.10.19
+     * @param courseScheduleIds:
+     * @return java.util.List<com.ym.mec.biz.dal.entity.TeacherAttendance>
+     */
+    List<TeacherAttendance> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);
     
 	/**
 	 * 更新vip课的签退状态
@@ -167,7 +176,7 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 */
 	int batchCleanCourseTeacherSignInfo(@Param("courseScheduleIds") List<Long> courseScheduleIds);
 
-    TeacherAttendance getTeacherPersonalAttendance(Integer courseScheduleId);
+    TeacherAttendance getMainTeacherAttendance(Integer courseScheduleId);
 
 	/**
 	 * 连堂课签到,签退

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

@@ -62,6 +62,8 @@ public class TeacherAttendanceDto {
     @ApiModelProperty(value = "教师正常签到提前时间(分钟)",required = false)
     private Integer advanceSignInMinutes;
 
+    private Integer advanceSignOutMinutes;
+
     @ApiModelProperty(value = "老师可打卡范围,单位米")
     private Integer attendanceRange;
 
@@ -162,6 +164,14 @@ public class TeacherAttendanceDto {
         this.teacherName = teacherName;
     }
 
+    public Integer getAdvanceSignOutMinutes() {
+        return advanceSignOutMinutes;
+    }
+
+    public void setAdvanceSignOutMinutes(Integer advanceSignOutMinutes) {
+        this.advanceSignOutMinutes = advanceSignOutMinutes;
+    }
+
     public String getCourseScheduleName() {
         return courseScheduleName;
     }

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

@@ -92,6 +92,9 @@ public class TeacherAttendance {
 	@ApiModelProperty(value = "签退附件")
 	private String signOutAttachments;
 
+	@ApiModelProperty(value = "签退备注")
+	private String signOutRemark;
+
 	public Long getCurrentScheduleId() {
 		return currentScheduleId;
 	}
@@ -100,6 +103,14 @@ public class TeacherAttendance {
 		this.currentScheduleId = currentScheduleId;
 	}
 
+	public String getSignOutRemark() {
+		return signOutRemark;
+	}
+
+	public void setSignOutRemark(String signOutRemark) {
+		this.signOutRemark = signOutRemark;
+	}
+
 	public Date getComplaintsTime() {
 		return complaintsTime;
 	}

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

@@ -23,6 +23,13 @@ import java.util.List;
 import java.util.Map;
 
 public interface CourseScheduleService extends BaseService<Long, CourseSchedule> {
+	
+	/**
+	 * 查询课程信息
+	 * @param courseScheduleId
+	 * @return
+	 */
+	CourseSchedule queryById(Long courseScheduleId);
 
 	/**
 	 * @Author: Joburgess
@@ -76,6 +83,17 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * @return com.ym.mec.biz.dal.enums.YesOrNoEnum
 	 */
 	YesOrNoEnum enableOnlyNormalAttendance(Date startClassTime,Long userId,boolean checkSchool,Integer schoolId);
+
+	/**
+	 * @describe 检测是否可以忽略正常签到时间限制
+	 * @author Joburgess
+	 * @date 2020.10.21
+	 * @param startClassTime: 当前课程开始时间
+	 * @param teacherId: 当前课程上课教师编号
+	 * @param schoolId:当前课程教学点编号
+	 * @return boolean
+	 */
+	boolean enableIgnoreAttendanceTime(Date startClassTime, Integer teacherId, Integer schoolId);
 	
 	/**
 	 * 给班级加课

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

@@ -156,4 +156,5 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     void closeSalaryConfirm(String month);
+
 }

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

@@ -27,6 +27,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
      */
     public static final String ADVANCE_SIGN_IN_MINUTES = "advance_sign_in_minutes";
 
+    String ADVANCE_SIGN_OUT_MINUTES = "advance_sign_out_minutes";
+
     /**
      * 老师可以打卡范围,为教学定位方圆{}米
      */

+ 27 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1642,13 +1642,19 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -1953,6 +1959,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
 //                    for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
@@ -1965,9 +1977,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 //                    }
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -2252,12 +2264,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                     }
 
+                    //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                        baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                        classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                    }
+
                     salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     //课堂课课酬
-                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                    }
+//                    if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                    }
                     //基础技能提高课
                     if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                         salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();

+ 40 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -232,12 +232,18 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
 
+                //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                }
+
                 salary = baseSalary.multiply(classTimeDuty).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
 
                 //课堂课课酬
-                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
+//                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                     salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -344,6 +350,13 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                     classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
                     baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
                 }
+
+                //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+                if (musicGroup.isClassroomLessons() || classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+                }
+
                 salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                 for (CourseScheduleTeacherSalary teacherSalary : allTeacherSalarys) {
@@ -356,9 +369,9 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 }
 
                 //课堂课课酬
-                if (musicGroup.isClassroomLessons()) {
-                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
+//                if (musicGroup.isClassroomLessons()) {
+//                    salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//                }
                 //基础技能提高课
                 if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
                     salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
@@ -567,39 +580,36 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 
         BigDecimal teacherDefaultSalary = BigDecimal.ZERO;
+        BigDecimal baseTime = BigDecimal.ZERO;
 
         //如果结算方式是教师默认课酬
         if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
-            BigDecimal baseTime = new BigDecimal(30);
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                baseTime = new BigDecimal(45);
-            }
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                baseTime = new BigDecimal(40);
-            }
-            //课程时长与结算单位时长占比
-            BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+             baseTime = new BigDecimal(30);
             teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-            teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
         } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
             teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-            BigDecimal baseTime = new BigDecimal(90);
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                baseTime = new BigDecimal(45);
-            }
-            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                baseTime = new BigDecimal(40);
-                teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-            }
-            //课程时长与结算单位时长占比
-            BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-            teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+            baseTime = new BigDecimal(90);
         }
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+            baseTime = new BigDecimal(45);
+        }else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+            baseTime = new BigDecimal(40);
+            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+        }
+        //课程时长与结算单位时长占比
+        BigDecimal classTimeDuty = new BigDecimal(duration).divide(baseTime, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
 
-        //课堂课课酬
-        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+        //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+            teacherDefaultSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+            classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
         }
+        teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+        //课堂课课酬
+//        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+//            teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+//        }
         //基础技能提高课
         if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
             teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();

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

@@ -5,10 +5,7 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 
 import org.apache.commons.io.FileUtils;
@@ -1085,6 +1082,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		Map<String, Object> params = new HashMap<String, Object>();
 
 		StudentInfo studentInfo = studentRegistrationService.queryStudentInfo(userId);
+		if(Objects.isNull(studentInfo)){
+			studentInfo = new StudentInfo();
+		}
 		params.put("studentInfo", studentInfo);
 		params.put("isShowVisualSeal", true);
 

+ 102 - 57
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -254,6 +254,20 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     }
 
     @Override
+	public CourseSchedule queryById(Long courseScheduleId) {
+    	CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+    	if(courseSchedule != null){
+    		//查询助教列表
+    		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList =  courseScheduleTeacherSalaryDao.findByCourseSchedule(courseScheduleId);
+    		if(courseScheduleTeacherSalaryList != null){
+    			List<Integer> teacherIdList = courseScheduleTeacherSalaryList.stream().filter(t -> TeachTypeEnum.TEACHING.equals(t.getTeacherRole())).map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
+    			courseSchedule.setTeachingTeacherIdList(teacherIdList);
+    		}
+    	}
+		return courseSchedule;
+	}
+
+	@Override
     public TeacherAttendanceDto getCurrentCourseDetail(Long courseID) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (null == user) {
@@ -267,11 +281,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             throw new BizException("课程不存在");
         }
         if(Objects.nonNull(currentCourseDetail.getSchoolId())){
-            YesOrNoEnum yesOrNoEnum = enableOnlyNormalAttendance(currentCourseDetail.getStartClassTime(),
-                    user.getId().longValue(),
-                    true,
+            boolean enableIgnoreAttendanceTime = enableIgnoreAttendanceTime(currentCourseDetail.getStartClassTime(),
+                    user.getId(),
                     currentCourseDetail.getSchoolId().intValue());
-            currentCourseDetail.setOnlyNormal(yesOrNoEnum);
+            currentCourseDetail.setOnlyNormal(enableIgnoreAttendanceTime?YesOrNoEnum.YES:YesOrNoEnum.NO);
         }else{
             currentCourseDetail.setOnlyNormal(YesOrNoEnum.NO);
         }
@@ -280,7 +293,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
         SysConfig sysConfigVip = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
         currentCourseDetail.setEnableStudentAttendanceTimeRange(sysConfig.getParanValue(Integer.class));
-        currentCourseDetail.setEnableStudentAttendanceTimeRange(sysConfigVip.getParanValue(Integer.class));
+        currentCourseDetail.setEnableStudentAttendanceTimeRangeVip(sysConfigVip.getParanValue(Integer.class));
         int studentNum = studentAttendanceDao.countByCourseSchedule(courseID);
         if (Objects.nonNull(studentNum)) {
             currentCourseDetail.setStudentAttendanceIsFirstTime(studentNum > 0 ? 0 : 1);
@@ -291,6 +304,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
         currentCourseDetail.setAttendanceRange(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
+        currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
         return currentCourseDetail;
     }
 
@@ -418,7 +432,24 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
     }
 
-    @Override
+	@Override
+	public boolean enableIgnoreAttendanceTime(Date startClassTime, Integer teacherId, Integer schoolId) {
+		CourseSchedule prevCourse = courseScheduleDao.getTeacherAttendanceCourseBeforeStartTime(startClassTime, teacherId);
+		if(Objects.isNull(prevCourse)){
+			return false;
+		}
+		if(!schoolId.equals(prevCourse.getSchoolId())){
+			return true;
+		}
+		int minutesBetween = DateUtil.minutesBetween(prevCourse.getEndClassTime(), startClassTime);
+		if(minutesBetween>60){
+			return false;
+		}else{
+			return true;
+		}
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean batchAddCourseSchedule(Integer classGroupId, int coursesTimes, Date startDate, Date groupEndDate, Date groupStartDate, List<CourseTimeDto> teachingArrangementList,
 			TeachModeEnum teachMode, CourseScheduleType type, Integer schoolId, boolean isJumpHoliday) {
@@ -2912,7 +2943,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void courseAdjust(List<CourseSchedule> newCourseSchedules) {
-        Date now = new Date();
+        Date date = new Date();
 		// 课程信息处理
 		List<Long> courseScheduleIds = newCourseSchedules.stream().map(CourseSchedule::getId).distinct().collect(Collectors.toList());
 
@@ -2936,8 +2967,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
                 newCourseSchedule.setGroupType(oldCourseSchedule.getGroupType());
             }
 
-            if(CourseStatusEnum.OVER.equals(oldCourseSchedule.getStatus())&&newCourseSchedule.getStartClassTime().compareTo(now)<0){
-            	throw new BizException("调整无效");
+            if(CourseStatusEnum.OVER.equals(oldCourseSchedule.getStatus())&&newCourseSchedule.getStartClassTime().compareTo(date)<0){
+            	throw new BizException("调整无效,已结束不能调整至已结束");
 			}
             
             //课程是否已结算
@@ -2959,7 +2990,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				for (StudentAttendance studentAttendance : studentAttendanceList) {
 					if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.LEAVE
 						|| (studentAttendance.getStatus() == StudentAttendanceStatusEnum.LEAVE
-							&&DateUtil.addHours(studentAttendance.getCreateTime(),4).compareTo(oldCourseSchedule.getStartClassTime())>=0)) {
+							&&StringUtils.isBlank(studentAttendance.getRemark()))) {
 						throw new BizException("{}[{}] {}-{}课程已点名", oldCourseSchedule.getName(), oldCourseSchedule.getId(), DateUtil.dateToString(
 								oldCourseSchedule.getStartClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT), DateUtil.dateToString(
 								oldCourseSchedule.getEndClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
@@ -3030,16 +3061,31 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             if(Objects.isNull(newCourseSchedule.getClassDate())){
                 newCourseSchedule.setClassDate(oldCourseSchedule.getClassDate());
             }
-            if (newCourseSchedule.getStartClassTime().after(now)) {
+            if (newCourseSchedule.getStartClassTime().after(date)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
             }
-            if (newCourseSchedule.getStartClassTime().before(now) && newCourseSchedule.getEndClassTime().after(now)) {
+            if (newCourseSchedule.getStartClassTime().before(date) && newCourseSchedule.getEndClassTime().after(date)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.UNDERWAY);
             }
-            if (newCourseSchedule.getEndClassTime().before(now)) {
+            if (newCourseSchedule.getEndClassTime().before(date)) {
                 newCourseSchedule.setStatus(CourseStatusEnum.OVER);
             }
-
+            
+			if (newCourseSchedule.getType() == CourseScheduleType.PRACTICE) {
+				PracticeGroup practiceGroup = practiceGroupDao.get(Long.parseLong(newCourseSchedule.getMusicGroupId()));
+				if (practiceGroup.getType() != TRIAL) {
+					if (DateUtil.minutesBetween(newCourseSchedule.getStartClassTime(), practiceGroup.getCoursesStartDate()) > 0) {
+						throw new BizException("调整失败: 调整时间不得早于开课时间");
+					}
+					if (DateUtil.minutesBetween(practiceGroup.getCoursesExpireDate(), newCourseSchedule.getEndClassTime()) > 0) {
+						throw new BizException("调整失败: 截止时间超过课程有效期");
+					}
+					practiceGroup.setCoursesStartDate(courseScheduleDao.getFirstTime(practiceGroup.getId(),PRACTICE.getCode()));
+					practiceGroup.setCoursesExpireDate(courseScheduleDao.getLastTime(practiceGroup.getId(),PRACTICE.getCode()));
+					practiceGroup.setUpdateTime(date);
+					practiceGroupDao.update(practiceGroup);
+				}
+			}
         }
 
         //课程冲突检测
@@ -3058,7 +3104,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			teacherAttendanceMap.put(ta.getCourseScheduleId(), tas);
 		}
 
-		Date date = new Date();
 		Long courseScheduleId = null;
 		List<TeacherAttendance> insertTeacherAttendanceList = new ArrayList<TeacherAttendance>();
 		List<CourseScheduleTeacherSalary> insertCourseScheduleTeacherSalaryList = new ArrayList<CourseScheduleTeacherSalary>();
@@ -3120,8 +3165,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					insertTeacherAttendanceList.add(ta);
 				}
 				
-				//清理学生考勤
-				studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
 			}
 
 			if(newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START && newCourseSchedule.getGroupType() == GroupType.MUSIC){
@@ -3145,29 +3188,35 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 			}
 
-			if(newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START){
-                //如果已结束修改成了未开始,需要更新学生考勤记录
-                studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
-            }
-
-            if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
-
-				if(newCourseSchedule.getGroupType() == GroupType.MUSIC){
-					//清理课程作业
-					courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleId);
-				}
-			}
-
 			VipGroup vipGroup = vipGroupDao.findByCourseSchedule(courseScheduleId);
 
 			if(Objects.nonNull(vipGroup)
 					&&!VipGroupStatusEnum.PROGRESS.equals(vipGroup.getStatus())
 					&&!VipGroupStatusEnum.FINISHED.equals(vipGroup.getStatus())){
-				throw new BizException("非进行中课程组不允许进行此操作");
+				throw new BizException("非进行中或完成的课程组不允许进行此操作");
 			}
 
-			if(Objects.nonNull(vipGroup)&&newCourseSchedule.getStartClassTime().after(now)){
+			if(Objects.nonNull(vipGroup) && newCourseSchedule.getStartClassTime().after(date)){
 				vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
+				vipGroup.setUpdateTime(date);
+				vipGroupDao.update(vipGroup);
+			}
+
+			if (newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START) {
+				//如果已结束修改成了未开始,需要更新学生考勤记录
+				studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
+			}
+
+			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
+                
+				// 清理课程作业
+				courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleId);
+
+				//删除申述
+				courseScheduleComplaintsDao.delByCourseScheduleId(courseScheduleId);
+				
+				//删除评论
+				courseScheduleReviewDao.delByCourseScheduleId(courseScheduleId);
 			}
 
 			// 计算课程时长
@@ -3175,11 +3224,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			int newMinutes = DateUtil.minutesBetween(newCourseSchedule.getStartClassTime(), newCourseSchedule.getEndClassTime());
 
 			// 如果修改了老师、课程类型、课程时长、教学模式,需要修改课酬
-			if (VIP.equals(newCourseSchedule.getGroupType())||!ListUtil.isEquals(oldTeacherIdList, newTeacherIdList) || newCourseSchedule.getType() != oldCourseSchedule.getType()
+			if (!ListUtil.isEquals(oldTeacherIdList, newTeacherIdList) || newCourseSchedule.getType() != oldCourseSchedule.getType()
 					|| newCourseSchedule.getTeachMode() != oldCourseSchedule.getTeachMode() || oldMinutes != newMinutes) {
 
 				Map<Integer, Teacher> teacherMap = null;
 				Map<Integer, Map<CourseScheduleType, TeacherDefaultMusicGroupSalary>> musicGroupSalaryMap = new HashMap<Integer, Map<CourseScheduleType, TeacherDefaultMusicGroupSalary>>();
+				Map<Integer, Map<Integer, TeacherDefaultVipGroupSalary>> vipGroupSalaryMap = new HashMap<Integer, Map<Integer, TeacherDefaultVipGroupSalary>>();
 
 				if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
 					// 所有教师列表
@@ -3197,20 +3247,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						musicGroupSalaryMap.put(tdms.getUserId(), map);
 					}
 				} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
-					//查询这节课每位老师对应的课酬
-					courseScheduleTeacherSalaryDao.queryTeacherSalary(courseScheduleId);
-				}
-
-				// 所有老师默认vip课酬
-				List<TeacherDefaultVipGroupSalary> teacherDefaultVipGroupSalaries = teacherDefaultVipGroupSalaryDao.queryByUserIdList(newTeacherIdList);
-				Map<Integer, Map<Integer, TeacherDefaultVipGroupSalary>> vipGroupSalaryMap = new HashMap<Integer, Map<Integer, TeacherDefaultVipGroupSalary>>();
-				for (TeacherDefaultVipGroupSalary tdvs : teacherDefaultVipGroupSalaries) {
-					Map<Integer, TeacherDefaultVipGroupSalary> map = vipGroupSalaryMap.get(tdvs.getUserId());
-					if (map == null) {
-						map = new HashMap<Integer, TeacherDefaultVipGroupSalary>();
+					// 所有老师默认vip课酬
+					List<TeacherDefaultVipGroupSalary> teacherDefaultVipGroupSalaries = teacherDefaultVipGroupSalaryDao.queryByUserIdList(newTeacherIdList);
+					for (TeacherDefaultVipGroupSalary tdvs : teacherDefaultVipGroupSalaries) {
+						Map<Integer, TeacherDefaultVipGroupSalary> map = vipGroupSalaryMap.get(tdvs.getUserId());
+						if (map == null) {
+							map = new HashMap<Integer, TeacherDefaultVipGroupSalary>();
+						}
+						map.put(tdvs.getVipGroupCategoryId(), tdvs);
+						vipGroupSalaryMap.put(tdvs.getUserId(), map);
 					}
-					map.put(tdvs.getVipGroupCategoryId(), tdvs);
-					vipGroupSalaryMap.put(tdvs.getUserId(), map);
 				}
 
 				// 删除课酬
@@ -3238,12 +3284,14 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						Map<CourseScheduleType, TeacherDefaultMusicGroupSalary> map = musicGroupSalaryMap.get(teacherId);
 
 						if (map == null) {
-							throw new BizException("老师{}没有设置默认课酬,请先设置", teacherId);
+							SysUser user = sysUserFeignService.queryUserById(teacherId);
+							throw new BizException("老师{}[{}]没有设置默认课酬,请先设置", user.getRealName(), teacherId);
 						}
 
 						TeacherDefaultMusicGroupSalary tdms = map.get(newCourseSchedule.getType());
 						if (tdms == null) {
-							throw new BizException("老师{}没有设置默认课酬,请先设置", teacherId);
+							SysUser user = sysUserFeignService.queryUserById(teacherId);
+							throw new BizException("老师{}[{}]没有设置默认课酬,请先设置", user.getRealName(), teacherId);
 						}
 
 						// 乐团结算方式
@@ -3289,13 +3337,13 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							ts.setExpectSalary(salary);
 						}
 						//基础技能提高课
-						if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
+						/*if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
 							BigDecimal salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
 							if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
 								salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher90MinSalary() : tdms.getAssistantTeacher90MinSalary();
 							}
 							ts.setExpectSalary(salary);
-						}
+						}*/
 
 						if((newCourseSchedule.getType() == CourseScheduleType.HIGH_ONLINE ||
 								newCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
@@ -3305,8 +3353,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 						}
 
 						//线上小班课
-						if(newCourseSchedule.getType() == CourseScheduleType.HIGH_ONLINE || newCourseSchedule.getType() == CourseScheduleType.MUSIC_NETWORK){
+						if(newCourseSchedule.getType() == CourseScheduleType.HIGH_ONLINE || newCourseSchedule.getType() == CourseScheduleType.MUSIC_NETWORK || newCourseSchedule.getType() == CourseScheduleType.HIGH){
 							Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(ts.getClassGroupId());
+							if (studentNum > 5) {
+								studentNum = 5;
+							}
 							BigDecimal salary = JSON.parseObject(tdms.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
 							if(Objects.isNull(salary)){
 								throw new BizException("请设置老师默认课酬");
@@ -3338,9 +3389,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 			}
 
-			//删除申述
-			courseScheduleComplaintsDao.delByCourseScheduleIds(courseScheduleIds);
-
 			// 调整日志
 			CourseScheduleModifyLog courseScheduleModifyLog = new CourseScheduleModifyLog();
 			courseScheduleModifyLog.setCourseScheduleId(courseScheduleId);
@@ -3357,9 +3405,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 			insertCourseScheduleModifyLogList.add(courseScheduleModifyLog);
 
-			if(Objects.nonNull(vipGroup)){
-				vipGroupDao.update(vipGroup);
-			}
 		}
 
 		if (insertTeacherAttendanceList.size() > 0) {

+ 199 - 47
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -18,10 +19,8 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
-import org.apache.poi.util.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -86,12 +85,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private SysMessageService sysMessageService;
     @Autowired
     private TeacherCourseRewardDao teacherCourseRewardDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
 
     //按节数计算课酬的课程类型
-    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.CLASSROOM, CourseSchedule.CourseScheduleType.HIGH, CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
+    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
 
     @Override
     public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
@@ -532,9 +533,19 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
+        //教师签到记录
+        List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
+        Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
+
+        //学员点名记录
+        List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
+        Map<Long, List<StudentAttendance>> courseStudentAttendanceMap = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
+
         //需要根据实际上课学员结算课酬的课程编号
         List<Long> needStudentAttendanceCourseScheduleIds = yesterdayCourseSchedules.stream()
-                .filter(c -> CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(c.getType()) || CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(c.getType()))
+                .filter(c -> CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(c.getType())
+                        || CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(c.getType())
+                        || CourseSchedule.CourseScheduleType.HIGH.equals(c.getType()))
                 .map(CourseSchedule::getId).collect(Collectors.toList());
 
         List<StudentAttendance> studentAttendances = studentAttendanceDao.findByCourseIds(needStudentAttendanceCourseScheduleIds);
@@ -640,10 +651,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
             }
 
+            if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
+                courseSchedule.setType(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
+            }
+
             //教师课酬
             BigDecimal teacherSalary = new BigDecimal(0);
 
-            if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
+            if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
                 if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
@@ -655,39 +670,21 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 
-                //如果结算方式是教师默认课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
-                    //课程时长与结算单位时长占比
-                    BigDecimal classTimeDuty = new BigDecimal(duration);
-                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    }
-                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
-                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
-                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-                    }
-                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
-                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
-                    //课程时长与结算单位时长占比
-                    BigDecimal classTimeDuty = new BigDecimal(duration);
-                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    }
-                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
-                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
-                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-                    }
-                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
+                if(Objects.isNull(normalStudentNum)){
+                    normalStudentNum = Long.valueOf(0);
                 }
-            }else if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
+                if(normalStudentNum>5){
+                    normalStudentNum=Long.valueOf(5);
+                }
+                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
+                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
+                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
+                }
+                if(Objects.isNull(teacherSalary)){
+                    teacherSalary = BigDecimal.ZERO;
+                }
+            }else if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
                 if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
@@ -699,17 +696,31 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 
-                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
-                if(Objects.isNull(normalStudentNum)){
-                    normalStudentNum = Long.valueOf(0);
-                }
-                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
-                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
-                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration);
+                BigDecimal teacherDefaultSalary = new BigDecimal(0);
+
+                //如果结算方式是教师默认课酬
+                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
+                    classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
+                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                    }
+                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
+                    classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
+                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+                    }
                 }
-                if(Objects.isNull(teacherSalary)){
-                    teacherSalary = BigDecimal.ZERO;
+
+                if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                    teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
                 }
+
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
             }else{
                 teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
             }
@@ -719,8 +730,57 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 subsidy = new BigDecimal(0);
             }
             teacherSalary = teacherSalary.add(subsidy);
+
+            //扣除费用
+            BigDecimal deductCost = BigDecimal.ZERO;
+            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
+
+            boolean isCallName = false;
+            List<StudentAttendance> courseStudentAttendance = courseStudentAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            if(!CollectionUtils.isEmpty(courseStudentAttendance)){
+                long csaNum = courseStudentAttendance.stream().filter(csa -> DateUtil.hoursBetween(csa.getCreateTime(), courseSchedule.getStartClassTime()) < 4).count();
+                if(csaNum>0){
+                    isCallName = true;
+                }
+            }
+
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)){
+                //无签到记录扣除全部课酬
+                deductCost = deductCost.add(teacherSalary);
+            }else{
+                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+                if(Objects.isNull(teacherAttendance.getSignInStatus())){
+                    //未签到扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary);
+                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                    int signCourseTimeBetween = DateUtil.minutesBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+                    if(signCourseTimeBetween>=0&&signCourseTimeBetween<20){
+                        //未提前20分钟打卡扣除50元
+                        deductCost = deductCost.add(new BigDecimal(50));
+                    }else if(signCourseTimeBetween<0&&signCourseTimeBetween>-30){
+                        //迟到30分钟内扣除一半课酬
+                        deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                    }else if(signCourseTimeBetween<=-30){
+                        //迟到30分钟及以上扣除全部课酬
+                        deductCost = deductCost.add(teacherSalary);
+                    }
+                }
+
+                if(!isCallName){
+                    //未点名扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                }else if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
+                    //异常签退或者未签退,但是正常点名扣除50元课酬
+                    deductCost = deductCost.add(new BigDecimal(50));
+                }
+
+
+            }
+
+            BigDecimal finalSalary = teacherSalary.subtract(deductCost);
+
             //更新教师结算信息
-            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
@@ -1037,4 +1097,96 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         teacherSalaryComplaintsDao.updateComplaintStatusTuDoneWithMonth(month);
         teacherCourseRewardDao.updateTeacherRewardConfirmStatusWithMonth(month, null, TeacherSalaryConfirmStatus.COMPLETED);
     }
+
+    /**
+     * @describe 创建课程指定教师的课酬记录-乐团课
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    private List<CourseScheduleTeacherSalary> createMusicGroupCourseTeacerSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
+        MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+
+        List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
+        teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
+
+//        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
+//
+//        BigDecimal salary;
+//
+//        Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+//
+//        TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroup4MixDto.getCourseType());
+//
+//        Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
+//        if (teacherDefaultMusicGroupSalary == null) {
+//            throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
+//        }
+//
+//        //对应基准课酬
+//        BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
+//
+//        SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
+//        if (Objects.nonNull(teacher.getEntryDate())
+//                && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
+//            settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
+//        }
+//
+//        //基准课酬
+//        if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT) && teacherDefaultMusicGroupSalary != null) {
+//            //课程时长与结算单位时长占比
+//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//        }
+//        //阶梯课酬
+//        if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY) && teacherDefaultMusicGroupSalary != null) {
+//            //课程时长与结算单位时长占比
+//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+//        }
+//
+//        //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+//        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+//            baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//            classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
+//        }
+//
+//        salary = baseSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+//
+//        //基础技能提高课
+//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+//            salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+//            if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+//                salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+//            }
+//        }
+//        //线上小班课
+//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
+//            Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
+//            if (studentNum < 3 || studentNum > 5) {
+//                String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
+//                throw new BizException(classGroup.getName() + numWaring + "请调整");
+//            }
+//            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+//        }
+//
+//        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+//            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+//        }
+//
+//        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+//        courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+//        courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+//        courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+//        courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+//        courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
+//        courseScheduleTeacherSalary.setExpectSalary(salary);
+//        courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+//        courseScheduleTeacherSalary.setCreateTime(date);
+//        courseScheduleTeacherSalary.setUpdateTime(date);
+//        courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
+        return null;
+    }
 }

+ 49 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -110,7 +110,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		teacherAttendance.setMusicGroupId(currentCourseDetail.getMusicGroupId());
 		teacherAttendance.setClassGroupId(currentCourseDetail.getClassId());
 		teacherAttendance.setRemark(teacherSignOutDto.getTeacherAttendanceInfo().getRemark());
+		teacherAttendance.setSignOutRemark(teacherSignOutDto.getTeacherAttendanceInfo().getSignOutRemark());
 		int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
+		int offlineSignInEarlyForwardTime = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME));
 
 		CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 		teacherAttendance.setGroupType(courseSchedule.getGroupType());
@@ -124,13 +126,16 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			throw new BizException("明天的课程不能进行签到");
 		}
 
+		School school = schoolDao.get(courseSchedule.getSchoolId());
+
 		String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 		String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 		String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 		//上课时间
 		Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 180);
+		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 60);
+		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, offlineSignInEarlyForwardTime * -1);
 		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1);
 		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){
 
@@ -138,8 +143,6 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				throw new BizException("未获取到您的位置");
 			}
 
-			School school = schoolDao.get(courseSchedule.getSchoolId());
-
 			//是否在范围内
 			boolean isInScore = true;
 			if(StringUtils.isBlank(school.getLongitudeLatitude())){
@@ -165,24 +168,25 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				throw new BizException("该课程已结束,不能进行签到!");
 			}
 
-			YesOrNoEnum yesOrNoEnum = YesOrNoEnum.NO;
+			boolean enableIgnoreAttendanceTime = false;
 			if(Objects.nonNull(courseSchedule.getSchoolId())){
-				yesOrNoEnum = courseScheduleService.enableOnlyNormalAttendance(currentCourseDetail.getStartClassTime(),
-						user.getId().longValue(),
-						true,
+				enableIgnoreAttendanceTime = courseScheduleService.enableIgnoreAttendanceTime(currentCourseDetail.getStartClassTime(),
+						user.getId(),
 						currentCourseDetail.getSchoolId().intValue());
 			}
 			teacherAttendance.setSignInTime(date);
 			teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
 			result.put("signInStatus",0);
-			if(yesOrNoEnum == YesOrNoEnum.YES){
-				//连堂课
-			}else if(DateUtil.minutesBetween(date,add20Minutes) >= 0){
+			if(!isInScore){
+				teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
+			}else if(enableIgnoreAttendanceTime){
+				//连堂课,可忽略正常时间签到范围
+			}else if(date.compareTo(add20Minutes) <= 0&&date.compareTo(add60Minutes)>=0){
 				//正常签到范围(开始前60分钟  ~  开始之前20分钟)
 				if(!isInScore){
 					teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
 				}
-			}else if(DateUtil.minutesBetween(add20Minutes,date) > 0){
+			}else if(date.compareTo(add20Minutes) > 0||date.compareTo(add60Minutes) < 0){
 				if(StringUtils.isEmpty(teacherAttendance.getRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
 					//当前为异常签到,请填写原因!
 					result.put("status",2);
@@ -201,17 +205,42 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			}
 			return result;
 		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){
+			//是否在范围内
+			boolean isInScore = false;
+			if(StringUtils.isBlank(school.getLongitudeLatitude())){
+				if(teacherSignOutDto.getTeacherAttendanceInfo().getUpdate().equals(YesOrNoEnum.YES.getCode())){
+					school.setLongitudeLatitude(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude());
+					schoolDao.update(school);
+				}
+			}else if(StringUtils.isNotBlank(teacherSignOutDto.getTeacherAttendanceInfo().getSignOutLongitudeLatitude())){
+				SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE);
+				double attendanceRange = Double.valueOf(sysConfig.getParanValue());
+				double distance = MapUtil.distance(teacherSignOutDto.getTeacherAttendanceInfo().getSignOutLongitudeLatitude(),
+						school.getLongitudeLatitude());
+				if(distance<=attendanceRange){
+					isInScore=true;
+				}
+			}
+
 			//正常签退范围(结束后1小时内)
 			teacherAttendance.setSignOutTime(date);
 			teacherAttendance.setSignOutAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
 			ClassGroup classGroup = classGroupDao.get(courseSchedule.getClassGroupId());
 			teacherAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0 && DateUtil.minutesBetween(date,classEndDateAdd60Minutes) >= 0){
+			if(!isInScore){
+				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
+				result.put("signOutStatus",1);
+			}else if(date.compareTo(classEndDateTime) >= 0 && date.compareTo(classEndDateAdd60Minutes) <= 0){
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-				result.put("signInStatus",0);
-			}else if(DateUtil.minutesBetween(classEndDateAdd60Minutes,date) > 0){
+				result.put("signOutStatus",0);
+			}else if(date.compareTo(classEndDateAdd60Minutes) > 0){
+				if(StringUtils.isEmpty(teacherAttendance.getSignOutRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
+					//当前为异常签退,请填写原因!
+					result.put("status",2);
+					return result;
+				}
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
-				result.put("signInStatus",1);
+				result.put("signOutStatus",1);
 			}else {
 				throw new BizException("签退时间异常");
 			}
@@ -510,13 +539,16 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		TeacherAttendance teacherAttendanceInfo = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(), courseScheduleId.longValue());
 		teacherSignDetail.setTeacherAttendanceInfo(teacherAttendanceInfo);
 		CourseHomework courseHomewok = courseHomeworkDao.findByCourseSchedule(courseScheduleId.longValue());
+		if(Objects.nonNull(teacherAttendanceInfo)&&Objects.nonNull(courseHomewok)){
+			courseHomewok.setAttachments(teacherAttendanceInfo.getSignOutAttachments());
+		}
 		teacherSignDetail.setCourseHomeworkInfo(courseHomewok);
 		return teacherSignDetail;
 	}
 
 	@Override
 	public TeacherAttendance getTeacherPersonalAttendance(Integer courseScheduleId) {
-		return teacherAttendanceDao.getTeacherPersonalAttendance(courseScheduleId);
+		return teacherAttendanceDao.getMainTeacherAttendance(courseScheduleId);
 	}
 
 	@Override
@@ -588,7 +620,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	public TeacherAttendanceDetailDto getTeacherPersonalAttendanceDetail(Integer courseScheduleId) {
-		TeacherAttendance teacherAttendance = teacherAttendanceDao.getTeacherPersonalAttendance(courseScheduleId);
+		TeacherAttendance teacherAttendance = teacherAttendanceDao.getMainTeacherAttendance(courseScheduleId);
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
 		TeacherAttendanceDetailDto result = new TeacherAttendanceDetailDto();
 		result.setStatus(courseSchedule.getStatus());

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

@@ -437,6 +437,8 @@
         ORDER BY cs.id_
     </select>
 
+
+
     <resultMap id="studentAttendanceViewUtilEntity" type="com.ym.mec.biz.dal.dto.StudentAttendanceViewDto">
         <result property="classGroupId" column="class_group_id_"/>
         <result property="studentId" column="student_id_"/>
@@ -2321,7 +2323,7 @@
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
             LEFT JOIN organization o ON cs.organ_id_=o.id_
-            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.remark_ IS NULL
             <include refid="endFindCourseSchedulesCondition"/>
         GROUP BY cs.id_
         ORDER BY course_start_time_,cs.id_
@@ -3244,4 +3246,67 @@
         GROUP BY cgtm.class_group_id_
     </select>
 
+    <select id="getTeacherPrevCourseWithStartTime" resultMap="CourseSchedule">
+        SELECT  cs.id_,
+                cs.music_group_id_,
+                cs.group_type_,
+                cs.class_group_id_,
+                cs.status_,
+                cs.subsidy_,
+                cs.class_date_,
+                CONCAT(cs.class_date_, ' ', cs.start_class_time_) start_class_time_,
+                CONCAT(cs.class_date_, ' ', cs.end_class_time_)   end_class_time_,
+                cs.teacher_id_,
+                cs.actual_teacher_id_,
+                cs.create_time_,
+                cs.update_time_,
+                cs.teach_mode_,
+                cs.type_,
+                cs.name_,
+                cs.student_num_,
+                cs.leave_student_num_,
+                cs.teaching_content_,
+                cs.note_,
+                cs.schoole_id_,
+                cs.organ_id_
+        FROM course_schedule cs LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_=cs.id_
+        WHERE csts.user_id_=#{teacherId}
+        AND cs.class_date_ = DATE_FORMAT(#{startClassTime},'%Y-%m-%d')
+        AND cs.start_class_time_ &lt; DATE_FORMAT(#{startClassTime},'%H:%i:%S')
+        ORDER BY start_class_time_ DESC LIMIT 1;
+    </select>
+
+    <select id="getTeacherAttendanceCourseBeforeStartTime" resultMap="CourseSchedule">
+        SELECT  cs.id_,
+                cs.music_group_id_,
+                cs.group_type_,
+                cs.class_group_id_,
+                cs.status_,
+                cs.subsidy_,
+                cs.class_date_,
+                CONCAT(cs.class_date_, ' ', cs.start_class_time_) start_class_time_,
+                CONCAT(cs.class_date_, ' ', cs.end_class_time_)   end_class_time_,
+                cs.teacher_id_,
+                cs.actual_teacher_id_,
+                cs.create_time_,
+                cs.update_time_,
+                cs.teach_mode_,
+                cs.type_,
+                cs.name_,
+                cs.student_num_,
+                cs.leave_student_num_,
+                cs.teaching_content_,
+                cs.note_,
+                cs.schoole_id_,
+                cs.organ_id_
+        FROM course_schedule cs
+            LEFT JOIN course_schedule_teacher_salary csts ON csts.course_schedule_id_=cs.id_
+            LEFT JOIN teacher_attendance ta ON cs.id_=ta.course_schedule_id_ AND ta.teacher_id_=#{teacherId}
+        WHERE csts.user_id_=#{teacherId}
+        AND cs.class_date_ = DATE_FORMAT(#{startClassTime},'%Y-%m-%d')
+        AND cs.start_class_time_ &lt; DATE_FORMAT(#{startClassTime},'%H:%i:%S')
+        AND ta.sign_in_status_ IS NOT NULL
+        ORDER BY start_class_time_ DESC LIMIT 1;
+    </select>
+
 </mapper>

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

@@ -437,6 +437,7 @@
             <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
                 #{courseScheduleId}
             </foreach>
+            AND remark_ IS NULL
         GROUP BY
             course_schedule_id_
     </select>

+ 22 - 7
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -31,6 +31,7 @@
         <result column="complaints_time_" property="complaintsTime"/>
         <result column="current_schedule_id_" property="currentScheduleId"/>
         <result column="sign_out_attachments_" property="signOutAttachments"/>
+        <result column="sign_out_remark_" property="signOutRemark"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -54,18 +55,20 @@
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
-        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_)
+        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
+        sign_out_remark_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
         #{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},
         now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments})
+        #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments},#{signOutRemark})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
-        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_)
+        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_,
+        sign_out_remark_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -74,7 +77,8 @@
             #{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},#{teacherAttendance.signOutAttachments})
+            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},
+            #{teacherAttendance.signOutAttachments},#{teacherAttendance.signOutRemark})
         </foreach>
     </insert>
 
@@ -145,6 +149,9 @@
             <if test="signOutAttachments != null">
                 sign_out_attachments_ = #{signOutAttachments},
             </if>
+            <if test="signOutRemark != null">
+                sign_out_remark_ = #{signOutRemark},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -425,6 +432,15 @@
             #{courseScheduleId}
         </foreach>
     </select>
+    <select id="findByCourseSchedules" resultMap="TeacherAttendance">
+        SELECT
+        *
+        FROM teacher_attendance
+        WHERE course_schedule_id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </select>
     <select id="findCourseTimeByClassGroup" resultType="java.util.Map">
         SELECT
             course_schedule_id_ AS 'key',
@@ -446,12 +462,11 @@
                 #{courseScheduleId}
             </foreach>
     </select>
-    <select id="getTeacherPersonalAttendance" resultMap="TeacherAttendance">
+    <select id="getMainTeacherAttendance" resultMap="TeacherAttendance">
         SELECT ta.*,s.longitude_latitude_ FROM teacher_attendance ta
         LEFT JOIN course_schedule cs ON ta.course_schedule_id_ = cs.id_
         LEFT JOIN school s ON cs.schoole_id_ = s.id_
-        WHERE ta.course_schedule_id_ = #{courseScheduleId}
-        LIMIT 1
+        WHERE ta.course_schedule_id_ = #{courseScheduleId} and ta.teacher_id_ = cs.actual_teacher_id_
     </select>
     <select id="getTotalMinutes" resultType="java.lang.Integer">
         SELECT ROUND((UNIX_TIMESTAMP(CONCAT(ta.sign_out_time_)) - UNIX_TIMESTAMP(CONCAT(cs.class_date_,' ',cs.start_class_time_))) / 60)

+ 59 - 52
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleController.java

@@ -49,7 +49,7 @@ import java.util.stream.Collectors;
 public class CourseScheduleController extends BaseController {
 
     @Autowired
-    private CourseScheduleService scheduleService;
+    private CourseScheduleService courseScheduleService;
     @Autowired
     private StudentAttendanceService studentAttendanceService;
     @Autowired
@@ -69,6 +69,37 @@ public class CourseScheduleController extends BaseController {
     @Autowired
     private VipGroupDao vipGroupDao;
 
+    @ApiOperation(value = "课表详情")
+    @GetMapping("/query")
+    @PreAuthorize("@pcs.hasPermissions('courseSchedule/query')")
+    public Object query(Long courseScheduleId){
+        return succeed(courseScheduleService.queryById(courseScheduleId));
+    }
+
+    @ApiOperation(value = "终极课表获取")
+    @GetMapping("/superFindCourseSchedules")
+    @PreAuthorize("@pcs.hasPermissions('courseSchedule/superFindCourseSchedules')")
+    public Object superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if(!sysUser.getIsSuperAdmin()){
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (org.apache.commons.lang3.StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+                queryInfo.setOrganIdList(employee.getOrganIdList());
+            }else if(org.apache.commons.lang3.StringUtils.isEmpty(employee.getOrganIdList())){
+                return failed("用户所在分部异常");
+            }else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
+                    return failed("非法请求");
+                }
+            }
+        }
+        return succeed(courseScheduleService.endFindCourseSchedules(queryInfo));
+    }
+
     @ApiOperation(value = "排课")
     @PostMapping("/batchAddCourseSchedule")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchAddCourseSchedule')")
@@ -103,7 +134,7 @@ public class CourseScheduleController extends BaseController {
             courseSchedule.setOrganId(musicGroup.getOrganId());
         });
 
-        scheduleService.createCourseSchedules(createCourseScheduleDto);
+        courseScheduleService.createCourseSchedules(createCourseScheduleDto);
         return succeed();
     }
 
@@ -112,7 +143,7 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchUpdateCourseSchedule')")
     public Object batchUpdateCourseSchedule(@RequestBody List<CourseSchedule> courseSchedules,
                                             @ApiParam(value = "乐团编号", required = true) @PathVariable("musicGroupID") String musicGroupID){
-        scheduleService.batchUpdateCourseSchedule(courseSchedules,musicGroupID);
+        courseScheduleService.batchUpdateCourseSchedule(courseSchedules,musicGroupID);
         return succeed();
     }
 
@@ -125,7 +156,7 @@ public class CourseScheduleController extends BaseController {
         }
         long[] ints = Arrays.asList(courseScheduleIds.split(",")).stream().mapToLong(Long::parseLong).toArray();
         Long[] longs = ArrayUtils.toObject(ints);
-        scheduleService.batchDeleteCourseSchedules(Arrays.asList(longs));
+        courseScheduleService.batchDeleteCourseSchedules(Arrays.asList(longs));
         return succeed();
     }
 
@@ -133,7 +164,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping(value = "/findVipGroupCourseSchedules")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/findVipGroupCourseSchedules')")
     public Object findVipGroupCourseSchedules(VipGroupQueryInfo queryInfo){
-        return succeed(scheduleService.findVipGroupCourseSchedules(queryInfo));
+        return succeed(courseScheduleService.findVipGroupCourseSchedules(queryInfo));
     }
 
     @ApiOperation(value = "根据月份获取乐团在该月有课的日期")
@@ -141,14 +172,14 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/getCourseScheduleDateByMonth')")
         public Object getCourseScheduleDateByMonth(@ApiParam(value = "乐团编号", required = true) @RequestParam Long musicGroupID,
                                                    @ApiParam(value = "月份", required = true) @RequestParam Date month) {
-        return succeed(scheduleService.getCourseScheduleDateByMonth(musicGroupID,month));
+        return succeed(courseScheduleService.getCourseScheduleDateByMonth(musicGroupID,month));
     }
 
     @ApiOperation(value = "根据课程ID查询正在或即将开始的课程")
     @GetMapping("/getCurrentCourseDetail/{courseID}")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/getCurrentCourseDetail')")
     public Object getCurrentCourseDetail(@ApiParam(value = "课程ID", required = true) @PathVariable("courseID") Long courseID){
-        return succeed(scheduleService.getCurrentCourseDetail(courseID));
+        return succeed(courseScheduleService.getCurrentCourseDetail(courseID));
     }
 
     @ApiOperation(value = "根据班级ID获取当前课程的学生")
@@ -162,7 +193,7 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/classStartDateAdjust','system')")
     @PostMapping(value = "/classStartDateAdjust",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public Object classStartDateAdjust(CourseSchedule courseSchedule){
-        CourseSchedule oldCourseSchedule = scheduleService.get(courseSchedule.getId());
+        CourseSchedule oldCourseSchedule = courseScheduleService.get(courseSchedule.getId());
         if(Objects.isNull(oldCourseSchedule)){
             return failed("未找到指定课程");
         }
@@ -179,7 +210,7 @@ public class CourseScheduleController extends BaseController {
         }
         List<CourseSchedule> courseSchedules=new ArrayList<>();
         courseSchedules.add(courseSchedule);
-        scheduleService.courseAdjust(courseSchedules);
+        courseScheduleService.courseAdjust(courseSchedules);
         return succeed();
     }
 
@@ -187,7 +218,7 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/classGroupTeacherAdjust','system')")
     @PostMapping(value = "/classGroupTeacherAdjust")
     public Object classGroupTeacherAdjust(String classGroupIds,Integer teacherId,Integer targetTeacherId){
-        scheduleService.classGroupTeacherAdjust(classGroupIds,teacherId,targetTeacherId);
+        courseScheduleService.classGroupTeacherAdjust(classGroupIds,teacherId,targetTeacherId);
         return succeed();
     }
 
@@ -195,7 +226,7 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchClassStartDateAdjust')")
     @PostMapping(value = "/batchClassStartDateAdjust")
     public Object batchClassStartDateAdjust(@RequestBody List<CourseSchedule> courseSchedules){
-        scheduleService.courseAdjust(courseSchedules);
+        courseScheduleService.courseAdjust(courseSchedules);
         return succeed();
     }
 
@@ -206,7 +237,7 @@ public class CourseScheduleController extends BaseController {
         if(Objects.isNull(courseScheduleId1)||Objects.isNull(courseScheduleId2)){
             return failed("请指定课程");
         }
-        scheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
+        courseScheduleService.courseSwap(courseScheduleId1,courseScheduleId2);
         return succeed();
     }
 
@@ -214,7 +245,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping(value = "/courseScheduleCommplaintAudit")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/courseScheduleCommplaintAudit')")
 	public Object courseScheduleCommplaintAudit(Long id, Double teacherLiabilityRatio, Double studentLiabilityRatio, AuditStatusEnum status) {
-		scheduleService.courseScheduleCommplaintAudit(id, teacherLiabilityRatio, studentLiabilityRatio, status);
+		courseScheduleService.courseScheduleCommplaintAudit(id, teacherLiabilityRatio, studentLiabilityRatio, status);
 		return succeed();
 	}
 
@@ -222,7 +253,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping(value = "/checkMusicGroupClassCourse")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/checkMusicGroupClassCourse')")
     public Object checkMusicGroupClassCourse(String musicGroupId){
-        scheduleService.checkMusicGroupClassCourse(musicGroupId);
+        courseScheduleService.checkMusicGroupClassCourse(musicGroupId);
         return succeed();
     }
 
@@ -237,7 +268,7 @@ public class CourseScheduleController extends BaseController {
     @GetMapping("/batchDeleteMusicGroupNotStartCourse")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchDeleteMusicGroupNotStartCourse')")
 	public Object batchDeleteMusicGroupNotStartCourse(String musicGroupId){
-        scheduleService.batchDeleteMusicGroup(musicGroupId,GroupType.MUSIC);
+        courseScheduleService.batchDeleteMusicGroup(musicGroupId,GroupType.MUSIC);
         return succeed();
     }
 
@@ -252,7 +283,7 @@ public class CourseScheduleController extends BaseController {
     @GetMapping("/findCourseScheduleByClassGroup")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/findCourseScheduleByClassGroup')")
 	public Object findCourseScheduleByClassGroup(Integer classGroupId){
-        return succeed(scheduleService.findCourseScheduleByClassGroup(classGroupId));
+        return succeed(courseScheduleService.findCourseScheduleByClassGroup(classGroupId));
     }
     
     @ApiOperation(value = "查询课程投诉详情")
@@ -267,7 +298,7 @@ public class CourseScheduleController extends BaseController {
     	SysUser user = sysUserFeignService.queryUserById(complaints.getUserId());
     	complaints.getUser().setUsername(user.getUsername());
     	
-    	CourseSchedule courseSchedule = scheduleService.get(complaints.getCourseScheduleId());
+    	CourseSchedule courseSchedule = courseScheduleService.get(complaints.getCourseScheduleId());
     	SysUser teacher = sysUserFeignService.queryUserById(courseSchedule.getActualTeacherId());
     	courseSchedule.getTeacher().setUsername(teacher.getUsername());
     	
@@ -282,7 +313,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/vipCourseAdjust")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/vipCourseAdjust')")
     public Object vipCourseAdjust(@RequestBody VipGroupCourseAdjustInfoDto vipGroupCourseAdjustInfo){
-        scheduleService.vipCourseAdjust(vipGroupCourseAdjustInfo);
+        courseScheduleService.vipCourseAdjust(vipGroupCourseAdjustInfo);
         return succeed();
     }
 
@@ -290,7 +321,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/batchUpdateCourseSchedule")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchUpdateCourseSchedule')")
     public Object batchUpdateCourseSchedule(@RequestBody BatchInsertCoursesDto batchInsertCoursesDto){
-        scheduleService.batchUpdateCourseSchedule(batchInsertCoursesDto);
+        courseScheduleService.batchUpdateCourseSchedule(batchInsertCoursesDto);
         return succeed();
     }
 
@@ -298,7 +329,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/batchAppendVipGroupCourses")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchAppendVipGroupCourses')")
     public Object batchAppendVipGroupCourses(@RequestBody VipGroupCourseAdjustInfoDto vipGroupCourseAdjustInfo){
-        scheduleService.batchAppendVipGroupCourses(vipGroupCourseAdjustInfo);
+        courseScheduleService.batchAppendVipGroupCourses(vipGroupCourseAdjustInfo);
         return succeed();
     }
 
@@ -316,41 +347,17 @@ public class CourseScheduleController extends BaseController {
     		}
     		batchInsertCoursesDto.setClassGroupId(classGroupList.get(0).getId());
     	}
-		scheduleService.batchAddCourseSchedule(batchInsertCoursesDto.getClassGroupId(), batchInsertCoursesDto.getCoursesTimes(),
+		courseScheduleService.batchAddCourseSchedule(batchInsertCoursesDto.getClassGroupId(), batchInsertCoursesDto.getCoursesTimes(),
 				batchInsertCoursesDto.getStartDate(), null,null, batchInsertCoursesDto.getTeachingArrangementList(), batchInsertCoursesDto.getTeachMode(),
 				batchInsertCoursesDto.getType(), batchInsertCoursesDto.getSchoolId(), batchInsertCoursesDto.getIsJumpHoliday());
         return succeed();
     }
 
-    @ApiOperation(value = "终极课表获取")
-    @GetMapping("/superFindCourseSchedules")
-    @PreAuthorize("@pcs.hasPermissions('courseSchedule/superFindCourseSchedules')")
-    public Object superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed("用户信息获取失败");
-        }
-        if(!sysUser.getIsSuperAdmin()){
-            Employee employee = employeeDao.get(sysUser.getId());
-            if (org.apache.commons.lang3.StringUtils.isEmpty(queryInfo.getOrganIdList())) {
-                queryInfo.setOrganIdList(employee.getOrganIdList());
-            }else if(org.apache.commons.lang3.StringUtils.isEmpty(employee.getOrganIdList())){
-                return failed("用户所在分部异常");
-            }else {
-                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
-                    return failed("非法请求");
-                }
-            }
-        }
-        return succeed(scheduleService.endFindCourseSchedules(queryInfo));
-    }
-
     @ApiOperation(value = "课程顺延")
     @PostMapping("/coursePostpone")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/coursePostpone')")
     public Object coursePostpone(CoursePostponeDto coursePostPoneInfo){
-        scheduleService.coursePostpone(coursePostPoneInfo);
+        courseScheduleService.coursePostpone(coursePostPoneInfo);
         return succeed();
     }
 
@@ -358,7 +365,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/practiceCourseAdjust")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/practiceCourseAdjust')")
     public Object practiceCourseAdjust(CourseSchedule courseSchedule){
-        scheduleService.practiceCourseAdjust(courseSchedule);
+        courseScheduleService.practiceCourseAdjust(courseSchedule);
         return succeed();
     }
 
@@ -366,7 +373,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/practiceCourseTeacherAdjust")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/practiceCourseTeacherAdjust')")
     public Object practiceCourseTeacherAdjust(Long courseScheduleId,Integer teacherId){
-        scheduleService.practiceCourseTeacherAdjust(courseScheduleId,teacherId);
+        courseScheduleService.practiceCourseTeacherAdjust(courseScheduleId,teacherId);
         return succeed();
     }
 
@@ -374,7 +381,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/practiceGroupTeacherAdjust")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/practiceGroupTeacherAdjust')")
     public Object practiceGroupTeacherAdjust(String practiceGroupId, Integer teacherId, Integer subjectId, Integer educationalTeacherId){
-        scheduleService.practiceGroupTeacherAdjust(practiceGroupId,teacherId,subjectId, educationalTeacherId);
+        courseScheduleService.practiceGroupTeacherAdjust(practiceGroupId,teacherId,subjectId, educationalTeacherId);
         return succeed();
     }
 
@@ -383,7 +390,7 @@ public class CourseScheduleController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/batchPracticeGroupTeacherAdjust')")
     @Transactional(rollbackFor = Exception.class)
     public Object batchPracticeGroupTeacherAdjust(String practiceGroupId, Integer teacherId, Integer subjectId, Integer educationalTeacherId,Integer oldTeacherId){
-        scheduleService.batchPracticeGroupTeacherAdjust(practiceGroupId,teacherId,subjectId,educationalTeacherId,oldTeacherId);
+        courseScheduleService.batchPracticeGroupTeacherAdjust(practiceGroupId,teacherId,subjectId,educationalTeacherId,oldTeacherId);
         return succeed();
     }
 
@@ -391,7 +398,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/updateCoursesExpireDate")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/updateCoursesExpireDate')")
     public Object updateCoursesExpireDate(String practiceGroupId,Date coursesExpireDate){
-        scheduleService.updateCoursesExpireDate(practiceGroupId,coursesExpireDate);
+        courseScheduleService.updateCoursesExpireDate(practiceGroupId,coursesExpireDate);
         return succeed();
     }
 
@@ -399,7 +406,7 @@ public class CourseScheduleController extends BaseController {
     @PostMapping("/cleanAttendance")
     @PreAuthorize("@pcs.hasPermissions('courseSchedule/cleanAttendance')")
     public Object cleanAttendance(String courseScheduleIds){
-        scheduleService.cleanAttendance(courseScheduleIds);
+        courseScheduleService.cleanAttendance(courseScheduleIds);
         return succeed();
     }
 }