فهرست منبع

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

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
yonge 4 سال پیش
والد
کامیت
9cb1a35759
39فایلهای تغییر یافته به همراه1116 افزوده شده و 1178 حذف شده
  1. 2 2
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  2. 11 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  4. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  5. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportTeacherSalaryDto.java
  6. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceComplaintsDto.java
  7. 236 94
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherDefaultSalaryDto.java
  8. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  9. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EndCourseScheduleQueryInfo.java
  11. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleTeacherSalaryService.java
  12. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  13. 7 1
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  14. 11 9
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  15. 4 322
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  16. 22 298
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java
  17. 3 97
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  18. 152 135
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  19. 71 79
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  20. 33 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  21. 182 56
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  22. 11 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  23. 21 16
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  24. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  25. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  26. 7 0
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  27. 14 5
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  28. 61 28
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  29. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  30. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  31. 57 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImSystemMessage.java
  32. 12 1
      mec-im/src/main/java/com/ym/controller/SystemController.java
  33. 4 0
      mec-im/src/main/java/com/ym/pojo/RoomResult.java
  34. 4 1
      mec-im/src/main/java/com/ym/service/Impl/MessageServiceImpl.java
  35. 9 1
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  36. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/AttendanceComplaintsAutoAffirmTask.java
  37. 2 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  38. 19 9
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  39. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 2 - 2
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java

@@ -9,13 +9,13 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 public class SysUserRole {
 	//分部经理
 	public static Integer SECTION_MANAGER = 3;
-	//教务老师
+	//教务老师、乐团主管
 	public static Integer EDUCATIONAL_TEACHER = 4;
 	//运营主管
 	public static Integer OPERATION_EXECUTIVE = 5;
 	//招生主管
 	public static Integer ADMISSIONS_DIRECTOR = 6;
-	//教学主任
+	//教学主任、乐队指导
 	public static Integer DEAN_OF_STUDIES = 7;
 	//总部管理员
 	public static Integer ADMINISTRATOR = 25;

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

@@ -363,16 +363,25 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取分部乐团在读学生数
+     *
      * @return
      */
     List<OrderStatisDto> getOrganNormalStudent();
 
     /**
+     * @param userIds:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.UserGroupDto>
      * @describe 获取学员关联乐团记录
      * @author qnc99
      * @date 2020/11/24 0024
-     * @param userIds:
-     * @return java.util.List<com.ym.mec.biz.dal.dto.UserGroupDto>
      */
     List<UserGroupDto> getUserGroups(@Param("userIds") List<Integer> userIds);
+
+
+    /**
+     * 获取乐团未交费的学生
+     * @param musicGroupId
+     * @return
+     */
+    List<StudentRegistration> getNoPaymentStudent(@Param("musicGroupId") String musicGroupId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.StudentVisitDto;
 import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -37,8 +38,18 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
 
     /**
      * 获取学生总数
+     *
      * @param params
      * @return
      */
     Integer getStudentsCount(Map<String, Object> params);
+
+    /**
+     * 获取乐团回访的学生
+     *
+     * @param musicGroupId
+     * @param studentIds
+     * @return
+     */
+    List<Integer> getMusicGroupVisitStudent(@Param("musicGroupId") String musicGroupId, @Param("studentIds") List<Integer> studentIds);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -266,4 +266,11 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
      * @return java.lang.Long
      */
 	Long findFirstSign(@Param("currentScheduleId") Long currentScheduleId, @Param("userId") Integer userId);
+
+	/**
+	 * 获取指定天数之后还没有审批的考勤申述列表
+	 * @param affirmDay
+	 * @return
+	 */
+	List<TeacherAttendance> queryAttendanceComplaintsAutoAffirmList(@Param("affirmDay") String affirmDay);
 }

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportTeacherSalaryDto.java

@@ -79,6 +79,15 @@ public class ExportTeacherSalaryDto{
     //签退时间
     private String studentSignOutTime;
 
+    //申述处理状态
+    private String complaintsStatus;
+
+    //申述处理结果
+    private String disposeContent;
+
+    //扣款原因
+    private String deductionReason;
+
     //主辅	上课地点	应到学员
     private String teacherRole;
 
@@ -97,6 +106,41 @@ public class ExportTeacherSalaryDto{
     //应到学员
     private int studentNum;
 
+    //实际上课学员
+    private int realStudentNum;
+
+    public String getDeductionReason() {
+        return deductionReason;
+    }
+
+    public void setDeductionReason(String deductionReason) {
+        this.deductionReason = deductionReason;
+    }
+
+    public String getComplaintsStatus() {
+        return complaintsStatus;
+    }
+
+    public void setComplaintsStatus(String complaintsStatus) {
+        this.complaintsStatus = complaintsStatus;
+    }
+
+    public String getDisposeContent() {
+        return disposeContent;
+    }
+
+    public void setDisposeContent(String disposeContent) {
+        this.disposeContent = disposeContent;
+    }
+
+    public int getRealStudentNum() {
+        return realStudentNum;
+    }
+
+    public void setRealStudentNum(int realStudentNum) {
+        this.realStudentNum = realStudentNum;
+    }
+
     public String getGroupId() {
         return groupId;
     }

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

@@ -40,6 +40,16 @@ public class TeacherAttendanceComplaintsDto{
 
     private String disposeContent;
 
+    private String url;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
     public UpdateAttendanceEnum getUpdateAttendanceEnum() {
         return updateAttendanceEnum;
     }

+ 236 - 94
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherDefaultSalaryDto.java

@@ -31,34 +31,65 @@ public class TeacherDefaultSalaryDto {
 	private BigDecimal vip7 = new BigDecimal(0);
 	
 	private BigDecimal practiceSalary = new BigDecimal(0);
+
 	
-	private BigDecimal singleSalary2 = new BigDecimal(0);
+	private BigDecimal mainSingleSalary2 = new BigDecimal(0);
 	
-	private BigDecimal mixSalary2 = new BigDecimal(0);
+	private BigDecimal mainMixSalary2 = new BigDecimal(0);
 	
-	private BigDecimal comprehensiveSalary2 = new BigDecimal(0);
+	private BigDecimal mainComprehensiveSalary2 = new BigDecimal(0);
 	
-	private BigDecimal traningSigleSalary2 = new BigDecimal(0);
+	private BigDecimal mainTraningSigleSalary2 = new BigDecimal(0);
 	
-	private BigDecimal traningMixSalary2 = new BigDecimal(0);
+	private BigDecimal mainTraningMixSalary2 = new BigDecimal(0);
 	
-	private BigDecimal highSalary2 = new BigDecimal(0);
+	private BigDecimal mainHighSalary2 = new BigDecimal(0);
 	
-	private BigDecimal classroomSalary2 = new BigDecimal(0);
+	private BigDecimal mainClassroomSalary2 = new BigDecimal(0);
 	
-	private BigDecimal singleSalary = new BigDecimal(0);
+	private BigDecimal mainSingleSalary = new BigDecimal(0);
 	
-	private BigDecimal mixSalary = new BigDecimal(0);
+	private BigDecimal mainMixSalary = new BigDecimal(0);
 	
-	private BigDecimal comprehensiveSalary = new BigDecimal(0);
+	private BigDecimal mainComprehensiveSalary = new BigDecimal(0);
 	
-	private BigDecimal traningSigleSalary = new BigDecimal(0);
+	private BigDecimal mainTraningSigleSalary = new BigDecimal(0);
 	
-	private BigDecimal traningMixSalary = new BigDecimal(0);
+	private BigDecimal mainTraningMixSalary = new BigDecimal(0);
 	
-	private BigDecimal highSalary = new BigDecimal(0);
+	private BigDecimal mainHighSalary = new BigDecimal(0);
+
+	private BigDecimal mainClassroomSalary = new BigDecimal(0);
+
+
+	private BigDecimal assistantSingleSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantMixSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantComprehensiveSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantTraningSigleSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantTraningMixSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantHighSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantClassroomSalary2 = new BigDecimal(0);
+
+	private BigDecimal assistantSingleSalary = new BigDecimal(0);
+
+	private BigDecimal assistantMixSalary = new BigDecimal(0);
+
+	private BigDecimal assistantComprehensiveSalary = new BigDecimal(0);
+
+	private BigDecimal assistantTraningSigleSalary = new BigDecimal(0);
+
+	private BigDecimal assistantTraningMixSalary = new BigDecimal(0);
+
+	private BigDecimal assistantHighSalary = new BigDecimal(0);
 	
-	private BigDecimal classroomSalary = new BigDecimal(0);
+	private BigDecimal assistantClassroomSalary = new BigDecimal(0);
+
 	
 	private BigDecimal highOnline3Salary = new BigDecimal(0);
 	
@@ -68,6 +99,14 @@ public class TeacherDefaultSalaryDto {
 	
 	private BigDecimal musicNetwork1Salary = new BigDecimal(0);
 
+	public BigDecimal getMainClassroomSalary() {
+		return mainClassroomSalary;
+	}
+
+	public void setMainClassroomSalary(BigDecimal mainClassroomSalary) {
+		this.mainClassroomSalary = mainClassroomSalary;
+	}
+
 	public Integer getUserId() {
 		return userId;
 	}
@@ -164,163 +203,266 @@ public class TeacherDefaultSalaryDto {
 		this.practiceSalary = practiceSalary;
 	}
 
-	public BigDecimal getSingleSalary() {
-		return singleSalary;
+	public BigDecimal getHighOnline3Salary() {
+		return highOnline3Salary;
 	}
 
-	public void setSingleSalary(BigDecimal singleSalary) {
-		this.singleSalary = singleSalary;
+	public void setHighOnline3Salary(BigDecimal highOnline3Salary) {
+		this.highOnline3Salary = highOnline3Salary;
 	}
 
-	public BigDecimal getMixSalary() {
-		return mixSalary;
+	public BigDecimal getHighOnline4Salary() {
+		return highOnline4Salary;
 	}
 
-	public void setMixSalary(BigDecimal mixSalary) {
-		this.mixSalary = mixSalary;
+	public void setHighOnline4Salary(BigDecimal highOnline4Salary) {
+		this.highOnline4Salary = highOnline4Salary;
 	}
 
-	public BigDecimal getComprehensiveSalary() {
-		return comprehensiveSalary;
+	public BigDecimal getHighOnline5Salary() {
+		return highOnline5Salary;
 	}
 
-	public void setComprehensiveSalary(BigDecimal comprehensiveSalary) {
-		this.comprehensiveSalary = comprehensiveSalary;
+	public void setHighOnline5Salary(BigDecimal highOnline5Salary) {
+		this.highOnline5Salary = highOnline5Salary;
 	}
 
-	public BigDecimal getTraningSigleSalary() {
-		return traningSigleSalary;
+	public BigDecimal getMusicNetwork1Salary() {
+		return musicNetwork1Salary;
 	}
 
-	public void setTraningSigleSalary(BigDecimal traningSigleSalary) {
-		this.traningSigleSalary = traningSigleSalary;
+	public void setMusicNetwork1Salary(BigDecimal musicNetwork1Salary) {
+		this.musicNetwork1Salary = musicNetwork1Salary;
+	}
+	public BigDecimal getVip6() {
+		return vip6;
 	}
 
-	public BigDecimal getTraningMixSalary() {
-		return traningMixSalary;
+	public void setVip6(BigDecimal vip6) {
+		this.vip6 = vip6;
 	}
 
-	public void setTraningMixSalary(BigDecimal traningMixSalary) {
-		this.traningMixSalary = traningMixSalary;
+	public BigDecimal getVip7() {
+		return vip7;
 	}
 
-	public BigDecimal getHighSalary() {
-		return highSalary;
+	public void setVip7(BigDecimal vip7) {
+		this.vip7 = vip7;
 	}
 
-	public void setHighSalary(BigDecimal highSalary) {
-		this.highSalary = highSalary;
+	public BigDecimal getMainSingleSalary2() {
+		return mainSingleSalary2;
 	}
 
-	public BigDecimal getClassroomSalary() {
-		return classroomSalary;
+	public void setMainSingleSalary2(BigDecimal mainSingleSalary2) {
+		this.mainSingleSalary2 = mainSingleSalary2;
 	}
 
-	public void setClassroomSalary(BigDecimal classroomSalary) {
-		this.classroomSalary = classroomSalary;
+	public BigDecimal getMainMixSalary2() {
+		return mainMixSalary2;
 	}
 
-	public BigDecimal getHighOnline3Salary() {
-		return highOnline3Salary;
+	public void setMainMixSalary2(BigDecimal mainMixSalary2) {
+		this.mainMixSalary2 = mainMixSalary2;
 	}
 
-	public void setHighOnline3Salary(BigDecimal highOnline3Salary) {
-		this.highOnline3Salary = highOnline3Salary;
+	public BigDecimal getMainComprehensiveSalary2() {
+		return mainComprehensiveSalary2;
 	}
 
-	public BigDecimal getHighOnline4Salary() {
-		return highOnline4Salary;
+	public void setMainComprehensiveSalary2(BigDecimal mainComprehensiveSalary2) {
+		this.mainComprehensiveSalary2 = mainComprehensiveSalary2;
 	}
 
-	public void setHighOnline4Salary(BigDecimal highOnline4Salary) {
-		this.highOnline4Salary = highOnline4Salary;
+	public BigDecimal getMainTraningSigleSalary2() {
+		return mainTraningSigleSalary2;
 	}
 
-	public BigDecimal getHighOnline5Salary() {
-		return highOnline5Salary;
+	public void setMainTraningSigleSalary2(BigDecimal mainTraningSigleSalary2) {
+		this.mainTraningSigleSalary2 = mainTraningSigleSalary2;
 	}
 
-	public void setHighOnline5Salary(BigDecimal highOnline5Salary) {
-		this.highOnline5Salary = highOnline5Salary;
+	public BigDecimal getMainTraningMixSalary2() {
+		return mainTraningMixSalary2;
 	}
 
-	public BigDecimal getMusicNetwork1Salary() {
-		return musicNetwork1Salary;
+	public void setMainTraningMixSalary2(BigDecimal mainTraningMixSalary2) {
+		this.mainTraningMixSalary2 = mainTraningMixSalary2;
 	}
 
-	public void setMusicNetwork1Salary(BigDecimal musicNetwork1Salary) {
-		this.musicNetwork1Salary = musicNetwork1Salary;
+	public BigDecimal getMainHighSalary2() {
+		return mainHighSalary2;
 	}
 
-	public BigDecimal getSingleSalary2() {
-		return singleSalary2;
+	public void setMainHighSalary2(BigDecimal mainHighSalary2) {
+		this.mainHighSalary2 = mainHighSalary2;
 	}
 
-	public void setSingleSalary2(BigDecimal singleSalary2) {
-		this.singleSalary2 = singleSalary2;
+	public BigDecimal getMainClassroomSalary2() {
+		return mainClassroomSalary2;
 	}
 
-	public BigDecimal getMixSalary2() {
-		return mixSalary2;
+	public void setMainClassroomSalary2(BigDecimal mainClassroomSalary2) {
+		this.mainClassroomSalary2 = mainClassroomSalary2;
 	}
 
-	public void setMixSalary2(BigDecimal mixSalary2) {
-		this.mixSalary2 = mixSalary2;
+	public BigDecimal getMainSingleSalary() {
+		return mainSingleSalary;
 	}
 
-	public BigDecimal getComprehensiveSalary2() {
-		return comprehensiveSalary2;
+	public void setMainSingleSalary(BigDecimal mainSingleSalary) {
+		this.mainSingleSalary = mainSingleSalary;
 	}
 
-	public void setComprehensiveSalary2(BigDecimal comprehensiveSalary2) {
-		this.comprehensiveSalary2 = comprehensiveSalary2;
+	public BigDecimal getMainMixSalary() {
+		return mainMixSalary;
 	}
 
-	public BigDecimal getTraningSigleSalary2() {
-		return traningSigleSalary2;
+	public void setMainMixSalary(BigDecimal mainMixSalary) {
+		this.mainMixSalary = mainMixSalary;
 	}
 
-	public void setTraningSigleSalary2(BigDecimal traningSigleSalary2) {
-		this.traningSigleSalary2 = traningSigleSalary2;
+	public BigDecimal getMainComprehensiveSalary() {
+		return mainComprehensiveSalary;
 	}
 
-	public BigDecimal getTraningMixSalary2() {
-		return traningMixSalary2;
+	public void setMainComprehensiveSalary(BigDecimal mainComprehensiveSalary) {
+		this.mainComprehensiveSalary = mainComprehensiveSalary;
 	}
 
-	public void setTraningMixSalary2(BigDecimal traningMixSalary2) {
-		this.traningMixSalary2 = traningMixSalary2;
+	public BigDecimal getMainTraningSigleSalary() {
+		return mainTraningSigleSalary;
 	}
 
-	public BigDecimal getHighSalary2() {
-		return highSalary2;
+	public void setMainTraningSigleSalary(BigDecimal mainTraningSigleSalary) {
+		this.mainTraningSigleSalary = mainTraningSigleSalary;
 	}
 
-	public void setHighSalary2(BigDecimal highSalary2) {
-		this.highSalary2 = highSalary2;
+	public BigDecimal getMainTraningMixSalary() {
+		return mainTraningMixSalary;
 	}
 
-	public BigDecimal getClassroomSalary2() {
-		return classroomSalary2;
+	public void setMainTraningMixSalary(BigDecimal mainTraningMixSalary) {
+		this.mainTraningMixSalary = mainTraningMixSalary;
 	}
 
-	public void setClassroomSalary2(BigDecimal classroomSalary2) {
-		this.classroomSalary2 = classroomSalary2;
+	public BigDecimal getMainHighSalary() {
+		return mainHighSalary;
 	}
 
-	public BigDecimal getVip6() {
-		return vip6;
+	public void setMainHighSalary(BigDecimal mainHighSalary) {
+		this.mainHighSalary = mainHighSalary;
 	}
 
-	public void setVip6(BigDecimal vip6) {
-		this.vip6 = vip6;
+	public BigDecimal getAssistantSingleSalary2() {
+		return assistantSingleSalary2;
 	}
 
-	public BigDecimal getVip7() {
-		return vip7;
+	public void setAssistantSingleSalary2(BigDecimal assistantSingleSalary2) {
+		this.assistantSingleSalary2 = assistantSingleSalary2;
 	}
 
-	public void setVip7(BigDecimal vip7) {
-		this.vip7 = vip7;
+	public BigDecimal getAssistantMixSalary2() {
+		return assistantMixSalary2;
+	}
+
+	public void setAssistantMixSalary2(BigDecimal assistantMixSalary2) {
+		this.assistantMixSalary2 = assistantMixSalary2;
+	}
+
+	public BigDecimal getAssistantComprehensiveSalary2() {
+		return assistantComprehensiveSalary2;
+	}
+
+	public void setAssistantComprehensiveSalary2(BigDecimal assistantComprehensiveSalary2) {
+		this.assistantComprehensiveSalary2 = assistantComprehensiveSalary2;
+	}
+
+	public BigDecimal getAssistantTraningSigleSalary2() {
+		return assistantTraningSigleSalary2;
+	}
+
+	public void setAssistantTraningSigleSalary2(BigDecimal assistantTraningSigleSalary2) {
+		this.assistantTraningSigleSalary2 = assistantTraningSigleSalary2;
+	}
+
+	public BigDecimal getAssistantTraningMixSalary2() {
+		return assistantTraningMixSalary2;
+	}
+
+	public void setAssistantTraningMixSalary2(BigDecimal assistantTraningMixSalary2) {
+		this.assistantTraningMixSalary2 = assistantTraningMixSalary2;
+	}
+
+	public BigDecimal getAssistantHighSalary2() {
+		return assistantHighSalary2;
+	}
+
+	public void setAssistantHighSalary2(BigDecimal assistantHighSalary2) {
+		this.assistantHighSalary2 = assistantHighSalary2;
+	}
+
+	public BigDecimal getAssistantClassroomSalary2() {
+		return assistantClassroomSalary2;
+	}
+
+	public void setAssistantClassroomSalary2(BigDecimal assistantClassroomSalary2) {
+		this.assistantClassroomSalary2 = assistantClassroomSalary2;
+	}
+
+	public BigDecimal getAssistantSingleSalary() {
+		return assistantSingleSalary;
+	}
+
+	public void setAssistantSingleSalary(BigDecimal assistantSingleSalary) {
+		this.assistantSingleSalary = assistantSingleSalary;
+	}
+
+	public BigDecimal getAssistantMixSalary() {
+		return assistantMixSalary;
+	}
+
+	public void setAssistantMixSalary(BigDecimal assistantMixSalary) {
+		this.assistantMixSalary = assistantMixSalary;
+	}
+
+	public BigDecimal getAssistantComprehensiveSalary() {
+		return assistantComprehensiveSalary;
+	}
+
+	public void setAssistantComprehensiveSalary(BigDecimal assistantComprehensiveSalary) {
+		this.assistantComprehensiveSalary = assistantComprehensiveSalary;
+	}
+
+	public BigDecimal getAssistantTraningSigleSalary() {
+		return assistantTraningSigleSalary;
+	}
+
+	public void setAssistantTraningSigleSalary(BigDecimal assistantTraningSigleSalary) {
+		this.assistantTraningSigleSalary = assistantTraningSigleSalary;
+	}
+
+	public BigDecimal getAssistantTraningMixSalary() {
+		return assistantTraningMixSalary;
+	}
+
+	public void setAssistantTraningMixSalary(BigDecimal assistantTraningMixSalary) {
+		this.assistantTraningMixSalary = assistantTraningMixSalary;
+	}
+
+	public BigDecimal getAssistantHighSalary() {
+		return assistantHighSalary;
+	}
+
+	public void setAssistantHighSalary(BigDecimal assistantHighSalary) {
+		this.assistantHighSalary = assistantHighSalary;
+	}
+
+	public BigDecimal getAssistantClassroomSalary() {
+		return assistantClassroomSalary;
+	}
+
+	public void setAssistantClassroomSalary(BigDecimal assistantClassroomSalary) {
+		this.assistantClassroomSalary = assistantClassroomSalary;
 	}
 }

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

@@ -150,6 +150,9 @@ public class MusicGroup {
 
 	private Integer repairUserId;
 
+	@ApiModelProperty(value = "维修技师名称",required = true)
+	private String repairUserName;
+
 	@ApiModelProperty(value = "预计开团日期",required = true)
 	private Date expectStartGroupDate;
 
@@ -164,6 +167,14 @@ public class MusicGroup {
 
 	private Boolean hasVerifyMusicalList = false;
 
+	public String getRepairUserName() {
+		return repairUserName;
+	}
+
+	public void setRepairUserName(String repairUserName) {
+		this.repairUserName = repairUserName;
+	}
+
 	public Integer getPaymentPattern() {
 		return paymentPattern;
 	}

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

@@ -99,6 +99,17 @@ public class TeacherAttendance {
 	@ApiModelProperty(value = "签退备注")
 	private String signOutRemark;
 
+	@ApiModelProperty(value = "考勤申述凭证")
+	private String url;
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
 	public UpdateAttendanceEnum getUpdateAttendanceEnum() {
 		return updateAttendanceEnum;
 	}

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

@@ -72,6 +72,17 @@ public class EndCourseScheduleQueryInfo extends QueryInfo {
 
     private boolean isExport = false;
 
+    @ApiModelProperty(value = "合并课程类型,MASTER 主课,ASSIST 副课,ALL 全部")
+    private String mergeCourseType;
+
+    public String getMergeCourseType() {
+        return mergeCourseType;
+    }
+
+    public void setMergeCourseType(String mergeCourseType) {
+        this.mergeCourseType = mergeCourseType;
+    }
+
     public TeachModeEnum getTeachMode() {
         return teachMode;
     }

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.VipGroup;
 import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
@@ -166,6 +167,17 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
     List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds);
 
     /**
+     * @describe 计算乐团课教师课酬
+     * @author Joburgess
+     * @date 2020/12/16 0016
+     * @param musicGroup:
+     * @param courseSchedule:
+     * @param courseScheduleTeacherSalaries:
+     * @return void
+     */
+    void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalaries);
+
+    /**
      * @describe 获取指定课程上的教师信息
      * @author Joburgess
      * @date 2020/11/17 0017

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

@@ -85,11 +85,6 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String REFUND_PERIOD = "refund_period";
 
     /**
-     * 教师入职时间为此时间之后的,按照3.0的课酬结算
-     */
-    String TEACHER_ENTRY_DATE = "teacher_entry_date";
-
-    /**
      * 可签退时间限制(自然天)
      */
     String ENABLE_SIGN_OUT_TIME_RANGE = "enable_sign_out_time_range";
@@ -152,6 +147,11 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String ONLINE_CONTINUE_COURSE_TIME = "online_continue_course_time";
 
     /**
+     * 连堂课间隔时间
+     */
+    String AUTO_CLOSE_NETWORK_ROOM = "auto_close_network_room";
+
+    /**
      * @describe 付费陪练课可购买最大月数
      */
     String PRACTICE_PAY_MAX_MONTH = "practice_pay_max_month";

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

@@ -159,7 +159,7 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param courseScheduleId
 	 * @param content
 	 */
-	void addComplaints(Long courseScheduleId, String content);
+	void addComplaints(Long courseScheduleId, String content,String url);
 
 	/**
 	 * 撤销考勤申述
@@ -186,4 +186,10 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * @param teacherAttendanceId
 	 */
 	void rejectTeacherAttendanceComplaints(long teacherAttendanceId,String content);
+
+	/**
+	 * @author zouxuan
+	 * 考勤申述7天未处理默认同意
+	 */
+	void attendanceComplaintsAutoAffirmTask();
 }

+ 11 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java

@@ -68,15 +68,6 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     void deleteVipGroup(Long vipGroupId);
 
     /**
-     * @describe 更新vip课程信息
-     * @author Joburgess
-     * @date 2019/10/30
-     * @param vipGroupApplyInfo: vip课信息
-     * @return void
-     */
-    void updateVipGroup(VipGroupApplyDto vipGroupApplyInfo);
-
-    /**
      * @describe 新增vip课程计划
      * @author Joburgess
      * @date 2019/11/11
@@ -182,6 +173,17 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
                                                      BigDecimal onlineClassesUnitPrice,
                                                      BigDecimal offlineClassesUnitPrice);
 
+    /**
+     * @describe 计算vip课程购买总价,及老师课酬-只是学生人数统计方式不同
+     * @author Joburgess
+     * @date 2019/10/23
+     * @param vipGroup: vip课程
+     * @param teacherId: 要计算课酬的老师的编号
+     * @return java.util.Map
+     */
+    <K extends VipGroup> Map<String, BigDecimal> countVipGroupCoursePredictFee(K vipGroup,
+                                                                         Integer teacherId,
+                                                                               Long courseId);
 
 
     /**

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

@@ -1675,7 +1675,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("排课次数必须大于0");
         }
 
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         Integer schoolId = musicGroup.getSchoolId();
 
         List<Integer> studentIdList = classGroup4MixDtos.get(0).getStudents();
@@ -1867,84 +1866,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleList.add(courseSchedule);
 
                     for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
-                        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-                        BigDecimal salary = new BigDecimal("0");
-
-                        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() + "课酬");
-                        }
-                        if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
-                                classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
-                                StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-                            throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                        } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == 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)||classGroup4MixDto.getCourseType().equals(CourseScheduleType.HIGH)) {
-                            teacherDefaultMusicGroupSalary = collect.get(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 + "请调整");
-//                            }
-                            if(studentNum>5){
-                                studentNum=5;
-                            }
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                            if(Objects.isNull(salary)){
-                                throw new BizException("课酬设置异常");
-                            }
-                        }
-
-                        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
-                        }
 
                         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                         courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
@@ -1952,11 +1873,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
                         courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
                         courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-                        courseScheduleTeacherSalary.setExpectSalary(salary);
                         courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
                         courseScheduleTeacherSalary.setMusicGroupId(musicGroupId);
                         courseScheduleTeacherSalary.setCreateTime(date);
                         courseScheduleTeacherSalary.setUpdateTime(date);
+                        courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
                         courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
                     }
                 }
@@ -2221,103 +2142,23 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             courseScheduleDao.batchAddCourseSchedules(courseScheduleList);
 
-            Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
             //计算每节课的课酬
             List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
 
             for (CourseSchedule courseSchedule : courseScheduleList) {
                 //默认课程时长
                 for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
-                    List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-                    BigDecimal salary = new BigDecimal("0");
-
-                    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() + "课酬");
-                    }
-                    if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
-                            classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
-                            StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-                        throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                    } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-                            || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-                            || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-                            || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == 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)||classGroup4MixDto.getCourseType().equals(CourseScheduleType.HIGH)) {
-                        teacherDefaultMusicGroupSalary = collect.get(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
-                        Integer classGroupId = classGroupTeacherMapper.getClassGroupId();
-                        if(classGroupId == null){
-                            classGroupId = classGroup.getId();
-                        }
-                        Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
-                        if(studentNum>5){
-                            studentNum=5;
-                        }
-                        salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                        if(Objects.isNull(salary)){
-                            throw new BizException("课酬设置异常");
-                        }
-                    }
-
-                    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.setMusicGroupId(musicGroupId);
                     courseScheduleTeacherSalary.setCreateTime(date);
                     courseScheduleTeacherSalary.setUpdateTime(date);
+                    courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
                     courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
                 }
             }
@@ -2392,8 +2233,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         Integer courseTimes = classGroup4MixDtos.get(0).getCourseTimes();
 
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-
         classGroupService.updateTotalClassTimes(classGroup.getId(), courseTimes);
 
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
@@ -2535,97 +2374,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleList.add(courseSchedule);
 
                     for (ClassGroupTeacherMapper classGroupTeacherMapper : newClassGroupTeacherMapperList) {
-                        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-                        BigDecimal salary = new BigDecimal("0");
-
-                        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() + "课酬");
-                        }
-
-                        if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
-                                classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
-                                StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-                            throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                        } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == 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)||classGroup4MixDto.getCourseType().equals(CourseScheduleType.HIGH)) {
-                            teacherDefaultMusicGroupSalary = collect.get(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 + "请调整");
-//                            }
-                            if(studentNum>5){
-                                studentNum=5;
-                            }
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                            if(Objects.isNull(salary)){
-                                throw new BizException("课酬设置异常");
-                            }
-                        }
-
-                        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);
+                        courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
                         courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
                     }
                 }
@@ -2670,8 +2428,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         Integer schoolId = musicGroup.getSchoolId();
 
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-
         List<Integer> studentIdList = classGroup4MixDtos.get(0).getStudents();
 
         List<StudentRegistration> studentList = studentRegistrationService.findStudentListByUserIdList(musicGroupId, studentIdList);
@@ -2834,79 +2590,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
 
                     for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
-                        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(classGroupTeacherMapper.getUserId(), null, null);
-                        BigDecimal salary = new BigDecimal("0");
-
-                        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() + "课酬");
-                        }
-                        if ((classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE) ||
-                                classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) &&
-                                StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-                            throw new BizException("请设置" + teacher.getRealName() + "老师的" + classGroup4MixDto.getCourseType().getMsg() + "课酬");
-                        } else if (teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() == null
-                                || teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() == 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_ONLINE)||classGroup4MixDto.getCourseType().equals(CourseScheduleType.HIGH)) {
-                            teacherDefaultMusicGroupSalary = collect.get(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 + "请调整");
-//                            }
-                            if(studentNum>5){
-                                studentNum=5;
-                            }
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                            if(Objects.isNull(salary)){
-                                throw new BizException("课酬设置异常");
-                            }
-                        }
-
-                        if (classGroup4MixDto.getCourseType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-                            salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
-                        }
-
                         CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
                         courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
                         courseScheduleTeacherSalary.setMusicGroupId(musicGroupId);
@@ -2914,10 +2597,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         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);
+                        courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, courseSchedule, courseScheduleTeacherSalary);
                         courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
                     }
                 }
@@ -3657,7 +3340,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if(paymentCalenderDtos != null && paymentCalenderDtos.size() > 0){
             for (MusicGroupPaymentCalenderDto calenderDto : paymentCalenderDtos) {
                 if(status == null || status != AUDITING){
-
                     List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList = calenderDto.getMusicGroupPaymentCalenderCourseSettingsList();
                     for (MusicGroupPaymentCalenderCourseSettings courseSettings : musicGroupPaymentCalenderCourseSettingsList) {
                         OrganizationCourseUnitPriceSettings defaultUnitPrice = organizationCourseUnitPriceSettingsDao.queryByOrganIdAndCourseTypeAndChargeType(

+ 22 - 298
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupTeacherMapperServiceImpl.java

@@ -157,7 +157,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
 
     public boolean classGroupTeacherMapperUpdate(List<ClassGroupTeacherMapper> classGroupTeacherMapperList) {
         Date date = new Date();
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
         List<Integer> classGroupIds = classGroupTeacherMapperList.stream().map(classGroupTeacherMapper -> classGroupTeacherMapper.getClassGroupId()).collect(Collectors.toList());
 
         List<CourseSchedule> classGroupNoStartCourseSchedules = courseScheduleService.findClassGroupNoStartCourseSchedules(classGroupIds, GroupType.MUSIC);
@@ -166,111 +165,20 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
             return true;
         }
 
-        //老师默认的课酬
-        List<Integer> teacherUserIds = classGroupTeacherMapperList.stream().map(teacher -> teacher.getUserId()).collect(Collectors.toList());
-        List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherUserIds);
-        Map<String, TeacherDefaultMusicGroupSalary> teacherDefaultSalary = new HashMap<>();
-        if (teacherSalaryList.size() > 0) {
-            teacherDefaultSalary = teacherSalaryList.stream().collect(Collectors.toMap(teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary.getCourseScheduleType().getCode() + teacherDefaultMusicGroupSalary.getUserId(), teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-        }
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
         String musicGroupId = classGroupTeacherMapperList.get(0).getMusicGroupId();
         MusicGroup musicGroup = musicGroupService.get(musicGroupId);
 
-        //所有教师列表
-        List<Teacher> teachers = teacherDao.findByTeacherIds(teacherUserIds);
-        Map<Integer, Teacher> teacherMap = teachers.stream()
-                .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-
         //删除未开始的课程老师课酬,和签到
         List<Long> courseScheduleIds = classGroupNoStartCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
         courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
         teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
 
         for (CourseSchedule classGroupNoStartCourseSchedule : classGroupNoStartCourseSchedules) {
-            //课时长度
-            int duration = DateUtil.minutesBetween(classGroupNoStartCourseSchedule.getStartClassTime(), classGroupNoStartCourseSchedule.getEndClassTime());
             for (ClassGroupTeacherMapper classGroupTeacherMapper : classGroupTeacherMapperList) {
                 if (!classGroupTeacherMapper.getClassGroupId().equals(classGroupNoStartCourseSchedule.getClassGroupId())) {
                     continue;
                 }
-                BigDecimal salary;
-                List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaryList = classGroupTeacherMapper.getTeacherDefaultMusicGroupSalaryList();
-
-                Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherDefaultMusicGroupSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(classGroupNoStartCourseSchedule.getType());
-                if (teacherDefaultMusicGroupSalary == null) {
-                    teacherDefaultMusicGroupSalary = teacherDefaultSalary.get(classGroupNoStartCourseSchedule.getType().getCode() + classGroupTeacherMapper.getUserId());
-                }
-                if (teacherDefaultMusicGroupSalary == null) {
-                    Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
-                    throw new BizException("请设置"+teacher.getRealName()+"老师"+classGroupNoStartCourseSchedule.getType().getMsg()+"默认课酬");
-                }
-
-                //对应基准课酬
-                BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
-
-                Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
-                SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
-                if (Objects.nonNull(teacher.getEntryDate())
-                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-                    settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
-                }
-
-
-                //2.0课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
-                //3.0课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                    //课程时长与结算单位时长占比
-                    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(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 (classGroupNoStartCourseSchedule.getType().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 (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)
-						|| classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-					if (StringUtils.isBlank(teacherDefaultMusicGroupSalary.getSalaryRuleJson())) {
-						throw new BizException("请设置老师默认课酬");
-					}
-				}
-                //线上小班课
-                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
-                    Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
-                    if (studentNum < 3 || studentNum > 5) {
-                        ClassGroup classGroup = classGroupService.get(classGroupTeacherMapper.getClassGroupId());
-                        String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
-                        throw new BizException(classGroup.getName() + numWaring + "请调整");
-                    }
-                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                }
-
-                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
-                }
 
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -279,10 +187,10 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 courseScheduleTeacherSalary.setMusicGroupId(classGroupNoStartCourseSchedule.getMusicGroupId());
                 courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
                 courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-                courseScheduleTeacherSalary.setExpectSalary(salary);
                 courseScheduleTeacherSalary.setCreateTime(date);
                 courseScheduleTeacherSalary.setUpdateTime(date);
                 courseScheduleTeacherSalary.setClassGroupId(classGroupTeacherMapper.getClassGroupId());
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, classGroupNoStartCourseSchedule, courseScheduleTeacherSalary);
                 courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
             }
         }
@@ -294,92 +202,17 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     public void createMusicGroupTeacherMapper(List<CourseSchedule> courseSchedules, String musicGroupId) {
         Date date = new Date();
         MusicGroup musicGroup = musicGroupService.get(musicGroupId);
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-        List<Integer> teacherUserIds = courseSchedules.stream()
-                .map(CourseSchedule::getActualTeacherId)
-                .collect(Collectors.toList());
-        //所有教师列表
-        List<Teacher> teachers = teacherDao.findByTeacherIds(teacherUserIds);
-        Map<Integer, Teacher> teacherMap = teachers.stream()
-                .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
 
         //老师默认的课酬
-//        Map<String, TeacherDefaultMusicGroupSalary> teacherDefaultSalary = new HashMap<>();
         for (CourseSchedule classGroupNoStartCourseSchedule : courseSchedules) {
             List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
             List<TeacherAttendance> teacherAttendances = new ArrayList<>();
 
-            //课时长度
-            int duration = DateUtil.minutesBetween(classGroupNoStartCourseSchedule.getStartClassTime(), classGroupNoStartCourseSchedule.getEndClassTime());
             List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupNoStartCourseSchedule.getClassGroupId());
             for (ClassGroupTeacherMapper classGroupTeacherMapper : byClassGroup) {
                 if (!classGroupTeacherMapper.getClassGroupId().equals(classGroupNoStartCourseSchedule.getClassGroupId())) {
                     continue;
                 }
-                BigDecimal salary = new BigDecimal("0");
-
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacherAndCourseType(classGroupTeacherMapper.getUserId(),
-                        classGroupNoStartCourseSchedule.getType().getCode());
-
-                if (teacherDefaultMusicGroupSalary == null) {
-                    throw new BizException("请先设置老师课酬");
-                }
-
-                //对应基准课酬
-                BigDecimal baseSalary = new BigDecimal(0), classTimeDuty = new BigDecimal(0);
-
-                Teacher teacher = teacherMap.get(classGroupTeacherMapper.getUserId());
-                SalarySettlementTypeEnum settlementType = musicGroup.getSettlementType();
-                if (Objects.nonNull(teacher.getEntryDate())
-                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-                    settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY;
-                }
-
-
-                //2.0课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT)) {
-                    //课程时长与结算单位时长占比
-                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    baseSalary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
-                }
-                //3.0课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                    //课程时长与结算单位时长占比
-                    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);
-                }
-
-                //课堂课课酬
-//                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();
-                    if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                        salary = classGroupTeacherMapper.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
-                    }
-                }
-                //线上小班课
-                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
-                    Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupTeacherMapper.getClassGroupId());
-                    if (studentNum < 3 || studentNum > 5) {
-                        ClassGroup classGroup = classGroupService.get(classGroupTeacherMapper.getClassGroupId());
-                        String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
-                        throw new BizException(classGroup.getName() + numWaring + "请调整");
-                    }
-                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-                }
-
-                if (classGroupNoStartCourseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-                    salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
-                }
 
                 //课程与老师薪水表
                 CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
@@ -388,10 +221,10 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 courseScheduleTeacherSalary.setMusicGroupId(classGroupNoStartCourseSchedule.getMusicGroupId());
                 courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
                 courseScheduleTeacherSalary.setUserId(classGroupTeacherMapper.getUserId());
-                courseScheduleTeacherSalary.setExpectSalary(salary);
                 courseScheduleTeacherSalary.setCreateTime(date);
                 courseScheduleTeacherSalary.setUpdateTime(date);
                 courseScheduleTeacherSalary.setClassGroupId(classGroupTeacherMapper.getClassGroupId());
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(musicGroup, classGroupNoStartCourseSchedule, courseScheduleTeacherSalary);
                 courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
 
                 TeacherAttendance teacherAttendance = new TeacherAttendance();
@@ -412,7 +245,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
     @Transactional(rollbackFor = Exception.class)
     public void createCourseScheduleTeacherSalary(List<CourseSchedule> courseSchedules, Map<Long, CourseSchedule> oldCourseSchedules) {
         List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaryList = new ArrayList<>();
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
 
         //课程编号列表
         List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
@@ -429,11 +261,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         //所有老师列表
         allTeacherIds = allTeacherIds.stream().distinct().collect(Collectors.toList());
 
-        //所有教师列表
-        List<Teacher> teachers = teacherDao.findByTeacherIds(allTeacherIds);
-        Map<Integer, Teacher> teacherMap = teachers.stream()
-                .collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-
         //所有老师默认乐团课酬
         List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(allTeacherIds);
         Map<CourseSchedule.CourseScheduleType, List<TeacherDefaultMusicGroupSalary>> teacherDefaultMusicGroupSalariesGroupByCourseType = teacherDefaultMusicGroupSalaries.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getCourseScheduleType));
@@ -463,25 +290,17 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 throw new BizException("存在未指定结算方式的课程类型");
             }
 
-            //根据教师编号将对应结算方式下的默认课酬设置分组
-            Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
-
             if (!courseSchedule.isBishopTeacherSalaryNotCreate()) {
-                Teacher teacher = teacherMap.get(courseSchedule.getActualTeacherId());
-                if (Objects.nonNull(teacher.getEntryDate())
-                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-                    settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
-                }
-
-                //根据课程获取主教的默认课酬设置列表
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseSchedule.getActualTeacherId());
-                courseScheduleTeacherSalaryList.add(countMusicGroupTeacherSalary(
-                        courseSchedule,
-                        TeachTypeEnum.BISHOP,
-                        settlementType,
-                        courseSubsidyMap.get(courseSchedule.getId()),
-                        courseSchedule.getActualTeacherId().intValue(),
-                        teacherDefaultMusicGroupSalaryWithTeacherId));
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+                courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+                courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+                courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+                courseScheduleTeacherSalary.setUserId(courseSchedule.getActualTeacherId());
+                courseScheduleTeacherSalary.setSubsidy(courseSubsidyMap.get(courseSchedule.getId()));
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, courseSchedule, courseScheduleTeacherSalary);
+                courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
             }
 
             //计算助教课程薪酬
@@ -494,19 +313,16 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
                 if (Objects.isNull(teacherId)) {
                     return;
                 }
-                Teacher teacher = teacherMap.get(teacherId);
-                if (Objects.nonNull(teacher.getEntryDate())
-                        && (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-                    settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
-                }
-                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(teacherId);
-                courseScheduleTeacherSalaryList.add(countMusicGroupTeacherSalary(
-                        courseSchedule,
-                        TeachTypeEnum.TEACHING,
-                        settlementType,
-                        courseSubsidyMap.get(courseSchedule.getId()),
-                        teacherId,
-                        teacherDefaultMusicGroupSalaryWithTeacherId));
+                CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+                courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+                courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+                courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+                courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.TEACHING);
+                courseScheduleTeacherSalary.setUserId(teacherId);
+                courseScheduleTeacherSalary.setSubsidy(courseSubsidyMap.get(courseSchedule.getId()));
+                courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, courseSchedule, courseScheduleTeacherSalary);
+                courseScheduleTeacherSalaryList.add(courseScheduleTeacherSalary);
             }
         }
         if (!CollectionUtils.isEmpty(courseScheduleTeacherSalaryList)) {
@@ -539,98 +355,6 @@ public class ClassGroupTeacherMapperServiceImpl extends BaseServiceImpl<Long, Cl
         courseScheduleTeacherSalaryService.batchInsert(courseScheduleTeacherSalaryList);
     }
 
-    /**
-     * @param courseSchedule:                              课程信息
-     * @param teachType:                                   教师类型
-     * @param settlementType:                              结算方式
-     * @param subsidy:                                     补贴
-     * @param teacherId:                                   教师编号
-     * @param teacherDefaultMusicGroupSalaryWithTeacherId: 教师课酬
-     * @return com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary
-     * @describe 计算教师课酬
-     * @author Joburgess
-     * @date 2019/10/24
-     */
-    private CourseScheduleTeacherSalary countMusicGroupTeacherSalary(CourseSchedule courseSchedule,
-                                                                     TeachTypeEnum teachType,
-                                                                     String settlementType,
-                                                                     BigDecimal subsidy,
-                                                                     Integer teacherId,
-                                                                     TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId) {
-        if (Objects.isNull(teacherDefaultMusicGroupSalaryWithTeacherId)) {
-            throw new BizException("存在未设置默认课酬的教师");
-        }
-        //教师课酬
-        BigDecimal teacherSalary = new BigDecimal(0);
-
-        //课时长度
-        int duration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
-
-        BigDecimal teacherDefaultSalary = BigDecimal.ZERO;
-        BigDecimal baseTime = BigDecimal.ZERO;
-
-        //如果结算方式是教师默认课酬
-        if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
-             baseTime = new BigDecimal(30);
-            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-        } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
-            teacherDefaultSalary = teachType == TeachTypeEnum.BISHOP ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-            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)){
-            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();
-            if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                teacherSalary = teachType.equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-            }
-        }
-        //线上小班课
-        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
-            Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
-            if (studentNum < 3 || studentNum > 5) {
-                ClassGroup classGroup = classGroupService.get(courseSchedule.getClassGroupId());
-                String numWaring = studentNum < 3 ? "人数不能小于3," : "人数不能大于5,";
-                throw new BizException(classGroup.getName() + numWaring + "请调整");
-            }
-            teacherSalary = JSON.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
-        }
-
-        if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
-            teacherSalary = JSON.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson()).getBigDecimal("1");
-        }
-
-        CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary(
-                courseSchedule.getId(),
-                teachType,
-                teacherId,
-                teacherSalary,
-                subsidy,
-                courseSchedule.getClassGroupId());
-        courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
-        courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
-        return courseScheduleTeacherSalary;
-    }
-
     public List<ClassGroupTeacherMapper> getClassGroupTeachers(Integer classGroupId) {
         return classGroupTeacherMapperDao.findClassGroupTeachers(classGroupId.toString());
     }

+ 3 - 97
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -506,9 +506,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			// 乐团结算方式
 			settlementType = musicGroup.getSettlementType().getCode();
 
-			// 老师入职的分界线
-			entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-
 			// 所有老师默认乐团课酬
 			List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalaries = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIdList);
 
@@ -3150,9 +3147,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			map.put(ts.getUserId(), ts);
 			courseScheduleTeacherSalaryMap.put(ts.getCourseScheduleId(), map);
 		}
-
-		Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-
 		List<CourseScheduleStudentPayment> insertCourseScheduleStudentPaymentList = new ArrayList<CourseScheduleStudentPayment>();
 
 		for (CourseSchedule newCourseSchedule : newCourseSchedules) {
@@ -3302,95 +3296,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					ts.setUserId(teacherId);
 					// 重新生成课酬
 					if (newCourseSchedule.getGroupType() == GroupType.MUSIC) {
-						Map<CourseScheduleType, TeacherDefaultMusicGroupSalary> map = musicGroupSalaryMap.get(teacherId);
-
-						if (map == null) {
-							SysUser user = sysUserFeignService.queryUserById(teacherId);
-							throw new BizException("老师{}[{}]没有设置默认课酬,请先设置", user.getRealName(), teacherId);
-						}
-
-						TeacherDefaultMusicGroupSalary tdms = null;
-						if(newCourseSchedule.getType() == CourseScheduleType.HIGH){
-							tdms = map.get(CourseScheduleType.HIGH_ONLINE);
-						}else{
-							tdms = map.get(newCourseSchedule.getType());
-						}
-						if (tdms == null) {
-							SysUser user = sysUserFeignService.queryUserById(teacherId);
-							throw new BizException("老师{}[{}]没有设置默认课酬,请先设置", user.getRealName(), teacherId);
-						}
-
-						// 乐团结算方式
-						String settlementType = musicGroupSettlementsMap.get(courseScheduleId);
-						int unitMinutes = 30;
-
-						// 如果当前教师是在指定日期之后入职的,则按照3.0的方式结算
-						if (newCourseSchedule.getType() != CourseScheduleType.CLASSROOM) {
-							Teacher teacher = teacherMap.get(teacherId);
-							if (Objects.nonNull(teacher.getEntryDate())
-									&& (teacher.getEntryDate().after(entryDate) || teacher.getEntryDate().getTime() == entryDate.getTime())) {
-								settlementType = SalarySettlementTypeEnum.GRADIENT_SALARY.getCode();
-							}
-						}
-						if (StringUtils.equals(settlementType, "TEACHER_DEFAULT")) {
-							if (newCourseSchedule.getType() == CourseScheduleType.CLASSROOM) {
-								unitMinutes = 40;
-							} else if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
-								unitMinutes = 45;
-							}
-							if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
-								ts.setExpectSalary(new BigDecimal(tdms.getMainTeacher30MinSalary().doubleValue() * newMinutes / unitMinutes));
-							} else {
-								ts.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher30MinSalary().doubleValue() * newMinutes / unitMinutes));
-							}
-						} else if (StringUtils.equals(settlementType, "GRADIENT_SALARY")) {
-							unitMinutes = 90;
-							if (newCourseSchedule.getType() == CourseScheduleType.CLASSROOM) {
-								unitMinutes = 40;
-							} else if (newCourseSchedule.getType() == CourseScheduleType.HIGH) {
-								unitMinutes = 45;
-							}
-							if (ts.getTeacherRole() == TeachTypeEnum.BISHOP) {
-								ts.setExpectSalary(new BigDecimal(tdms.getMainTeacher90MinSalary().doubleValue() * newMinutes / unitMinutes));
-							} else {
-								ts.setExpectSalary(new BigDecimal(tdms.getAssistantTeacher90MinSalary().doubleValue() * newMinutes / unitMinutes));
-							}
-						}
-
-						//课堂课课酬
-						if (newCourseSchedule.getType() == CourseScheduleType.CLASSROOM) {
-							BigDecimal salary = ts.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? tdms.getMainTeacher30MinSalary() : tdms.getAssistantTeacher30MinSalary();
-							ts.setExpectSalary(salary);
-						}
-						//基础技能提高课
-						/*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)) &&
-										StringUtils.isBlank(tdms.getSalaryRuleJson())
-								){
-								throw new BizException("请设置老师默认课酬");
-						}
-
-						//线上小班课
-						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("请设置老师默认课酬");
-							}
-							ts.setExpectSalary(salary);
-						}
-
+						courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, newCourseSchedule, ts);
 					} else if (newCourseSchedule.getGroupType() == GroupType.VIP) {
 						Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, teacherId, null, null);
 
@@ -4438,7 +4344,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			//Map<Long, String> coursesSettlementTimeMap = MapUtil.convertIntegerMap(coursesSettlementTimeMaps);
 
 			/*List<Long> practiceIds = results.stream().filter(e -> PRACTICE.equals(e.getGroupType())).map(e -> Long.valueOf(e.getMusicGroupId())).collect(Collectors.toList());
-			Map<Long, PracticeGroup> idPracticeMap=new HashMap<>();
+			Map<Long, PracticeGroup> idPracticeMap = new HashMap<>();
 			if(!CollectionUtils.isEmpty(practiceIds)){
 				List<PracticeGroup> practiceGroups = practiceGroupDao.getWithIds(practiceIds);
                 idPracticeMap = practiceGroups.stream().collect(Collectors.toMap(PracticeGroup::getId, e->e));
@@ -4450,7 +4356,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				courseMergeCourseNumMap = MapUtil.convertIntegerMap(courseMergeCourseNum);
 			}
 
-			//Set<Long> mergeCourseIds = results.stream().filter(e -> Objects.nonNull(e.getNewCourseId())).map(e -> e.getNewCourseId()).collect(Collectors.toSet());
 
 			//获取班级声部名称
             List<Map<Integer, String>> classGroupSubjectNameMaps = classGroupDao.findClassGroupSubjectNameMaps(courseScheduleIds);
@@ -5325,6 +5230,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
 
 		List<CourseSchedule> courseSchedules=new ArrayList<>();
+		courseMergeInfo.setNewCourseId(courseMergeInfo.getId());
 		courseSchedules.add(courseMergeInfo);
 		List<CourseScheduleModifyLog> insertCourseScheduleModifyLogList = new ArrayList<>();
 

+ 152 - 135
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -19,6 +19,7 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,12 +28,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.Duration;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -82,15 +79,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private MusicGroupDao musicGroupDao;
     @Autowired
     private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
-    @Autowired
-    private VipGroupDao vipGroupDao;
 
     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.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
-
     @Override
     public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
         return courseScheduleTeacherSalaryDao;
@@ -204,85 +196,54 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void practiceTeacherSalarySettlement() {
-//        int days = Integer.parseInt(sysConfigDao.findByParamName(SysConfigService.VIP_APPEAL_DAYS_RANGE).getParanValue());
-//        int days = 0;
         //获取教师未结算课程记录
         Date now = new Date();
         Date date = DateUtil.addMonths(now, -1);
         String startDate = DateUtil.format(DateUtil.getFirstDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
         String endDate = DateUtil.format(DateUtil.getLastDayOfMonth(date),DateUtil.DEFAULT_PATTERN);
         List<CourseScheduleTeacherSalary> someDayAgoTeacherCourseSalaryNoSettlement = courseScheduleTeacherSalaryDao.findTeacherCourseSalaryNoSettlement(startDate,endDate);
-        if (!CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
-            someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
-                courseScheduleTeacherSalary.setActualSalary(courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
-                courseScheduleTeacherSalary.setSettlementTime(now);
-                courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-            });
+
+        Set<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toSet());
+
+        //教师签到记录
+        List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(new ArrayList<>(courseScheduleIds));
+        Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
+
+        if (CollectionUtils.isEmpty(someDayAgoTeacherCourseSalaryNoSettlement)) {
+            return;
         }
-        //获取未转结的
-        List<TeacherCourseReward> teacherCourseRewards = teacherCourseRewardService.findBySettlementStatus(0);
-        if(teacherCourseRewards.size() > 0){
-            //逗号分隔的课程拆分
-            List<String> collect = teacherCourseRewards.stream().map(e -> e.getCourseScheduleIdList()).collect(Collectors.toList());
-            List<Long> courseScheduleIds = new ArrayList<>();
-            collect.forEach(e->{
-                if(!StringUtils.isEmpty(e)){
-                    String[] split = e.split(",");
-                    for (String s : split) {
-                        courseScheduleIds.add(Long.parseLong(s));
-                    }
-                }
-            });
-            if (courseScheduleIds.size() > 0){
-                //去掉有未结束课程的数据
-                List<Long> mapList = courseScheduleDao.findNotStartCourseByIds(courseScheduleIds);
-                List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.findTeacherIdByCourseSchedule(courseScheduleIds);
-                Map<Long, TeacherAttendance> teacherAttendancesMap = teacherAttendances.stream().collect(Collectors.toMap(TeacherAttendance::getCourseScheduleId,t -> t));
-                String courseScheduleIdList = null;
-                StringBuffer memo;
-                BigDecimal multiply;
-                BigDecimal add;
-                outer1:for (TeacherCourseReward e : teacherCourseRewards) {
-                    memo = new StringBuffer();
-                    courseScheduleIdList = e.getCourseScheduleIdList();
-                    if(!StringUtils.isEmpty(courseScheduleIdList)){
-                        String[] split = courseScheduleIdList.split(",");
-                        for (String s : split) {
-                            //如果包含未结算的课程,不转结
-                            if(mapList.contains(Long.parseLong(s))){
-                                continue outer1;
-                            }
-                        }
-                        //转结,是否正常签到,签退
-                        BigDecimal expectRewardAmount = e.getExpectRewardAmount().divide(new BigDecimal(split.length));
-                        multiply = expectRewardAmount.multiply(new BigDecimal(0.5));
-                        add = expectRewardAmount.multiply(new BigDecimal(0));
-                        for (String s : split) {
-                            //如果包含未结算的课程,不转结
-                            TeacherAttendance teacherAttendance = teacherAttendancesMap.get(Long.parseLong(s));
-                            if(teacherAttendance == null){
-                                throw new BizException("教师签到记录不存在 : courseScheduleId:{}",s);
-                            }
-                            if(teacherAttendance.getSignInStatus() == null || teacherAttendance.getSignInStatus() == YesOrNoEnum.NO){
-                                expectRewardAmount = expectRewardAmount.subtract(multiply);
-                                memo.append("课程").append(s).append("异常签到;");
-                            }
-                            if(teacherAttendance.getSignOutStatus() == null || teacherAttendance.getSignOutStatus() == YesOrNoEnum.NO){
-                                expectRewardAmount = expectRewardAmount.subtract(multiply);
-                                memo.append("课程").append(s).append("异常签退;");
-                            }
-                            add = add.add(expectRewardAmount);
-                            expectRewardAmount = e.getExpectRewardAmount().divide(new BigDecimal(split.length));
-                        }
-                        e.setMemo(memo.toString());
-                        e.setActualRewardAmount(add);
-                        e.setSettlementStatus(YesOrNoEnum.YES);
-                        e.setSettlementDate(now);
-                    }
-                }
-                teacherCourseRewardService.batchUpdate(teacherCourseRewards);
+
+        someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
+
+            //扣除费用
+            BigDecimal deductCost = new BigDecimal(0);
+            List<String> deductReasons = new ArrayList<>();
+            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
+
+            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                //未签到或异常签到扣除一半课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                deductReasons.add("未签到或异常签到扣除一半课酬");
             }
-        }
+
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                //未签退或异常签退扣除一半课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                deductReasons.add("未签退或异常签退扣除一半课酬");
+            }
+
+            BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+            if(BigDecimal.ZERO.compareTo(deductCost)<0){
+                deductReasons.add("扣除总费用:" + deductCost);
+            }
+
+            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setSettlementTime(now);
+            courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
+            courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
+        });
     }
 
     @Override
@@ -311,7 +272,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }else{
                 //按照活动重新计算课酬
                 VipGroup vipGroup = vipGroupService.get(Long.valueOf(ts.getMusicGroupId()));
-                Map<String, BigDecimal> teachModeSalaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, ts.getUserId(), null, null);
+                Map<String, BigDecimal> teachModeSalaryMap = vipGroupService.countVipGroupCoursePredictFee(vipGroup, ts.getUserId(), ts.getCourseScheduleId());
                 if(TeachModeEnum.ONLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("onlineTeacherSalary")){
                     ts.setExpectSalary(teachModeSalaryMap.get("onlineTeacherSalary"));
                 }else if(TeachModeEnum.OFFLINE.equals(ts.getTeachMode())&&teachModeSalaryMap.containsKey("offlineTeacherSalary")){
@@ -330,31 +291,41 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         //获取未结算课程编号列表
         List<Long> courseScheduleIds = someDayAgoTeacherCourseSalaryNoSettlement.stream().map(CourseScheduleTeacherSalary::getCourseScheduleId).collect(Collectors.toList());
 
-        //获取未结算课程学生缴费信息
-        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseScheduleIds);
-
-        //根据课程将学生缴费信息分组
-        Map<Long, List<CourseScheduleStudentPayment>> studentPaymentGroupByCourse = courseScheduleStudentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseScheduleId));
-
-        //需更新教师课程结算记录
-        List<CourseScheduleTeacherSalary> updateTeacherSalarys = new ArrayList<>();
+        //教师签到记录
+        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())));
 
         //处理课酬信息
         someDayAgoTeacherCourseSalaryNoSettlement.forEach(courseScheduleTeacherSalary -> {
 
-            //获取当前课程学生缴费记录
-            List<CourseScheduleStudentPayment> studentPaymentsWithCourse = studentPaymentGroupByCourse.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            //扣除费用
+            BigDecimal deductCost = new BigDecimal(0);
+            List<String> deductReasons = new ArrayList<>();
+            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
-            if (CollectionUtils.isEmpty(studentPaymentsWithCourse)) {
-                return;
+            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+                //未签到或异常签到扣除一半课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                deductReasons.add("未签到或异常签到扣除一半课酬");
             }
-            BigDecimal expectSalary = courseScheduleTeacherSalary.getTeacherActualSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
-            courseScheduleTeacherSalary.setActualSalary(expectSalary);
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+                //未签退或异常签退扣除一半课酬
+                deductCost = deductCost.add(courseScheduleTeacherSalary.getExpectSalary().divide(new BigDecimal(2)));
+                deductReasons.add("未签退或异常签退扣除一半课酬");
+            }
+
+            if(BigDecimal.ZERO.compareTo(deductCost)<0){
+                deductReasons.add("扣除总费用:" + deductCost);
+            }
+
+            BigDecimal finalSalary = courseScheduleTeacherSalary.getExpectSalary().subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
+
+            courseScheduleTeacherSalary.setActualSalary(finalSalary);
+            courseScheduleTeacherSalary.setDeductionReason(StringUtils.join(deductReasons, ";"));
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
-            updateTeacherSalarys.add(courseScheduleTeacherSalary);
-
         });
     }
 
@@ -412,6 +383,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     .collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId, Collectors.counting()));
         }
 
+        //课程对应乐团结算方式集合
+        List<Map<String, String>> musicGroupSettlementTypeByCourse = courseScheduleTeacherSalaryDao.findMusicGroupSettlementTypeByCourse(courseScheduleIds);
+        Map<String, String> musicGroupSettlementsMap = MapUtil.convertMybatisMap(musicGroupSettlementTypeByCourse);
+
         //所有老师编号
         List<Integer> allTeacherIds = courseScheduleTeacherSalaries.stream()
                 .map(CourseScheduleTeacherSalary::getUserId)
@@ -426,10 +401,6 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             //当前课酬对应的课程信息
             CourseSchedule courseSchedule = courseScheduleIdMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
 
-            if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
-                courseSchedule.setType(CourseSchedule.CourseScheduleType.HIGH_ONLINE);
-            }
-
             //教师课酬
             BigDecimal teacherSalary = new BigDecimal(0);
 
@@ -459,6 +430,41 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 if(Objects.isNull(teacherSalary)){
                     teacherSalary = BigDecimal.ZERO;
                 }
+            }else if(CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
+                //根据课程类型获取对应的默认课酬设置列表
+                List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
+                if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
+                    LOGGER.error("存在未指定结算方式的课程类型[{}]", courseScheduleTeacherSalary.getId());
+                    continue;
+                }
+
+                //根据教师编号将对应结算方式下的默认课酬设置分组
+                Map<Integer, TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesGroupByTeacherId = teacherDefaultMusicGroupSalariesWithCourseType.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getUserId, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+                TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
+
+                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
+                if(Objects.isNull(normalStudentNum)){
+                    normalStudentNum = Long.valueOf(0);
+                }
+
+                //结算方式
+                String settlementType = musicGroupSettlementsMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+                if(StringUtils.isEmpty(settlementType)){
+                    LOGGER.error("未指定课酬结算方式[{}]", courseScheduleTeacherSalary.getId());
+                    continue;
+                }
+
+                teacherSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                    teacherSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+                }
+
+                if(Objects.isNull(teacherSalary)){
+                    LOGGER.error("教师课酬设置异常{}", courseSchedule.getId());
+                    continue;
+                }
+                teacherSalary = teacherSalary.multiply(new BigDecimal(normalStudentNum));
             }else{
                 teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
             }
@@ -483,8 +489,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
             }
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)){
-                //无签到记录扣除全部课酬
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||!isCallName){
+                //无签到记录或者未点名扣除全部课酬
                 deductCost = deductCost.add(teacherSalary);
                 deductReasons.add("无签到记录扣除全部课酬");
             }else{
@@ -511,21 +517,20 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     }
                 }
 
-                if(!isCallName){
-                    //未点名扣除一半课酬
-                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
-                    deductReasons.add("未点名扣除一半课酬");
-                }else if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
+                if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
                     //异常签退或者未签退,但是正常点名扣除50元课酬
                     deductCost = deductCost.add(new BigDecimal(50));
                     deductReasons.add("异常签退或者未签退,但是正常点名扣除50元课酬");
                 }
 
-
             }
 
             BigDecimal finalSalary = teacherSalary.subtract(deductCost).setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP);
 
+            if(BigDecimal.ZERO.compareTo(deductCost)<0){
+                deductReasons.add("扣除总费用:" + deductCost);
+            }
+
             //更新教师结算信息
             courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
@@ -872,20 +877,28 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         switch (courseSchedule.getGroupType()){
             case MUSIC:
                 //生成乐团课课酬
-                createMusicGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                createMusicGroupCourseTeacherSalaries(null, courseSchedule, courseScheduleTeacherSalaries);
                 break;
             case VIP:
                 //生成vip课课酬
-                createVipGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                createVipGroupCourseTeacherSalaries(courseSchedule, courseScheduleTeacherSalaries);
                 break;
             case PRACTICE:
                 //生成网管课课酬
-                createPracticeGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                createPracticeGroupCourseTeacherSalaries(courseSchedule, courseScheduleTeacherSalaries);
                 break;
         }
         return courseScheduleTeacherSalaries;
     }
 
+    @Override
+    public void createMusicGroupCourseTeacherSalary(MusicGroup musicGroup, CourseSchedule courseSchedule, CourseScheduleTeacherSalary courseScheduleTeacherSalary) {
+        List<CourseScheduleTeacherSalary> teacherSalaries = new ArrayList<>();
+        teacherSalaries.add(courseScheduleTeacherSalary);
+        createMusicGroupCourseTeacherSalaries(musicGroup,courseSchedule,teacherSalaries);
+        courseScheduleTeacherSalary.setExpectSalary(teacherSalaries.get(0).getExpectSalary());
+    }
+
     /**
      * @describe 创建课程指定教师的课酬记录-乐团课
      * @author Joburgess
@@ -894,22 +907,22 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
      * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
      */
-    private void createMusicGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
-        MusicGroup musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+    private void createMusicGroupCourseTeacherSalaries(MusicGroup musicGroup, CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries) {
+        if(Objects.isNull(musicGroup)){
+            musicGroup = musicGroupDao.get(courseSchedule.getMusicGroupId());
+        }
 
         List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
 
-        List<Teacher> teachers = teacherDao.findByTeacherIds(teacherIds);
-        Map<Integer, Teacher> teacherMap = teachers.stream().collect(Collectors.toMap(Teacher::getId, teacher -> teacher));
-
         List<TeacherDefaultMusicGroupSalary> allTeacherDefaultMusicGroupSalary = teacherDefaultMusicGroupSalaryDao.findByTeacher(teacherIds);
         Map<Integer, List<TeacherDefaultMusicGroupSalary>> teacherSalaryMap = allTeacherDefaultMusicGroupSalary.stream().collect(Collectors.groupingBy(TeacherDefaultMusicGroupSalary::getUserId));
 
-        Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(), "yyyy-MM-dd");
-
         long classCourseDuration = DateUtil.minutesBetween(courseSchedule.getStartClassTime(), courseSchedule.getEndClassTime());
 
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+            if(Objects.isNull(courseScheduleTeacherSalary.getTeacherRole())){
+                throw new BizException("请指定教师类型");
+            }
             List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
 
             BigDecimal salary;
@@ -918,8 +931,8 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
 
-            Teacher teacher = teacherMap.get(courseScheduleTeacherSalary.getUserId());
             if (teacherDefaultMusicGroupSalary == null) {
+                Teacher teacher = teacherDao.get(courseScheduleTeacherSalary.getUserId());
                 throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().getMsg() + "课酬");
             }
 
@@ -927,27 +940,23 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             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 = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? 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 = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
             }
 
             //课堂课课酬改为按分钟数计算,并且时长占比向下取整
             if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
-                baseSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                baseSalary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 classTimeDuty = new BigDecimal(classCourseDuration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
             }
 
@@ -955,17 +964,21 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
             //基础技能提高课
             if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                salary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
                 if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
-                    salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                    salary = TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole()) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                }
+                if(Objects.isNull(salary)){
+                    throw new BizException("课酬设置异常");
                 }
+                Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
+                salary = salary.multiply(new BigDecimal(studentNum));
             }
             //线上小班课
             if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH_ONLINE)) {
                 Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(courseSchedule.getClassGroupId());
-                if (studentNum < 3 || studentNum > 5) {
-                    String numWaring = studentNum < 3 ? "小班课人数不能小于3," : "小班课人数不能大于5,";
-                    throw new BizException( numWaring + "请调整");
+                if(studentNum>5){
+                    studentNum=5;
                 }
                 salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
             }
@@ -974,6 +987,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
             }
 
+            if(Objects.isNull(salary)){
+                throw new BizException("课酬设置异常");
+            }
+
             courseScheduleTeacherSalary.setExpectSalary(salary);
         }
     }
@@ -986,10 +1003,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
      * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
      */
-    private void createVipGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
+    private void createVipGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         VipGroup vipGroup = vipGroupService.get(Long.valueOf(courseSchedule.getMusicGroupId()));
         for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
-            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupPredictFee(vipGroup, courseSchedule.getActualTeacherId(), null, null);
+            Map<String, BigDecimal> salaryMap = vipGroupService.countVipGroupCoursePredictFee(vipGroup, courseSchedule.getActualTeacherId(), courseSchedule.getId());
             courseScheduleTeacherSalary.setExpectSalary(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary"));
         }
     }
@@ -1002,7 +1019,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
      * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
      */
-    private void createPracticeGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
+    private void createPracticeGroupCourseTeacherSalaries(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
         List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
 
         List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);

+ 71 - 79
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -9,6 +9,7 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -21,37 +22,6 @@ import com.alibaba.fastjson.TypeReference;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dao.ChargeTypeDao;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentEntitiesDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
-import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.SchoolDao;
-import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SubjectChangeDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
@@ -259,6 +229,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
     @Autowired
     private SubjectChangeDao subjectChangeDao;
+    @Autowired
+    private StudentVisitDao studentVisitDao;
 
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -1602,19 +1574,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             studentRegistration.setUpdateTime(date);
 
             studentRegistrationDao.update(studentRegistration);
-            
+
             //更新服务指标、运营指标
             int remainCourseNum = courseScheduleStudentPaymentDao.countStudentNotStartCourseNumWithCourseType(userId, null);
-            if(remainCourseNum == 0){
-            	Student student = studentDao.get(userId);
-            	if(student == null){
-            		throw new BizException("学生信息查询失败");
-            	}
-            	student.setServiceTag(0);
-            	student.setOperatingTag(0);
-            	student.setOperatingTempTag(0);
-            	student.setUpdateTime(date);
-            	studentDao.update(student);
+            if (remainCourseNum == 0) {
+                Student student = studentDao.get(userId);
+                if (student == null) {
+                    throw new BizException("学生信息查询失败");
+                }
+                student.setServiceTag(0);
+                student.setOperatingTag(0);
+                student.setOperatingTempTag(0);
+                student.setUpdateTime(date);
+                studentDao.update(student);
             }
 
             //删除用户购买的课程记录
@@ -1625,11 +1597,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             BigDecimal price = courseScheduleStudentPaymentDao.countFinishCoursePriceWithMusicGroup(musicGroupId, GroupType.MUSIC, userId);
             BigDecimal subtractAmount = studentRegistration.getSurplusCourseFee();
-            if(Objects.isNull(price)){
+            if (Objects.isNull(price)) {
                 price = new BigDecimal(0);
             }
             subtractAmount = subtractAmount.subtract(price);
-            if(BigDecimal.ZERO.compareTo(subtractAmount)<0){
+            if (BigDecimal.ZERO.compareTo(subtractAmount) < 0) {
                 studentRegistrationService.updateUserSurplusCourseFee(userId, musicGroupId, subtractAmount.negate(), reason, operator.getId());
             }
 
@@ -1637,10 +1609,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             // 判断乐器是否是租赁
             MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
-            if(musicGroupSubjectPlan != null){
-            	musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
-            	musicGroupSubjectPlan.setUpdateTime(date);
-            	musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
+            if (musicGroupSubjectPlan != null) {
+                musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+                musicGroupSubjectPlan.setUpdateTime(date);
+                musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
             }
 
             StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
@@ -1752,21 +1724,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentRegistration.setUpdateTime(date);
 
         studentRegistrationDao.update(studentRegistration);
-        
+
         //更新服务指标、运营指标
         int remainCourseNum = courseScheduleStudentPaymentDao.countStudentNotStartCourseNumWithCourseType(userId, null);
-        if(remainCourseNum == 0){
-        	Student student = studentDao.get(userId);
-        	if(student == null){
-        		throw new BizException("学生信息查询失败");
-        	}
-        	student.setServiceTag(0);
-        	student.setOperatingTag(0);
-        	student.setOperatingTempTag(0);
-        	student.setUpdateTime(date);
-        	studentDao.update(student);
-        }
-        
+        if (remainCourseNum == 0) {
+            Student student = studentDao.get(userId);
+            if (student == null) {
+                throw new BizException("学生信息查询失败");
+            }
+            student.setServiceTag(0);
+            student.setOperatingTag(0);
+            student.setOperatingTempTag(0);
+            student.setUpdateTime(date);
+            studentDao.update(student);
+        }
+
 
         //删除用户购买的课程记录
         musicGroupPaymentStudentCourseDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
@@ -1776,11 +1748,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         BigDecimal price = courseScheduleStudentPaymentDao.countFinishCoursePriceWithMusicGroup(musicGroupId, GroupType.MUSIC, userId);
         BigDecimal subtractAmount = studentRegistration.getSurplusCourseFee();
-        if(Objects.isNull(price)){
+        if (Objects.isNull(price)) {
             price = new BigDecimal(0);
         }
         subtractAmount = subtractAmount.subtract(price);
-        if(BigDecimal.ZERO.compareTo(subtractAmount)<0){
+        if (BigDecimal.ZERO.compareTo(subtractAmount) < 0) {
             studentRegistrationService.updateUserSurplusCourseFee(userId, musicGroupId, subtractAmount.negate(), reason, operator.getId());
         }
 
@@ -1788,10 +1760,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         // 判断乐器是否是租赁
         MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, studentRegistration.getActualSubjectId());
-        if(musicGroupSubjectPlan != null){
-        	musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
-        	musicGroupSubjectPlan.setUpdateTime(date);
-        	musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
+        if (musicGroupSubjectPlan != null) {
+            musicGroupSubjectPlan.setPaidStudentNum(musicGroupSubjectPlan.getPaidStudentNum() - 1);
+            musicGroupSubjectPlan.setUpdateTime(date);
+            musicGroupSubjectPlanDao.update(musicGroupSubjectPlan);
         }
 
         StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, SUCCESS);
@@ -1853,12 +1825,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         //缴费项目预计人数减一
-        musicGroupPaymentCalenderDao.cutCalenderExpectNum(userId,musicGroupId);
+        musicGroupPaymentCalenderDao.cutCalenderExpectNum(userId, musicGroupId);
         //删除缴费项目
-        List<Long> calenderIds = musicGroupPaymentCalenderDao.findStudentNoPaymentCalender(userId,musicGroupId);
+        List<Long> calenderIds = musicGroupPaymentCalenderDao.findStudentNoPaymentCalender(userId, musicGroupId);
         //删除缴费项目详情
         musicGroupPaymentCalenderDetailDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
-        if(calenderIds != null && calenderIds.size() > 0){
+        if (calenderIds != null && calenderIds.size() > 0) {
             musicGroupPaymentCalenderDao.delByIds(calenderIds);
         }
         return true;
@@ -2073,7 +2045,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 sysMessageService.batchSendMessage(MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, yimei, null, 0, "1", "",
                         studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
             }
-            studentRegistrationService.updateUserSurplusCourseFee(userId,musicGroupId,studentPaymentOrder.getExpectAmount(),"乐团续费",userId);
+            studentRegistrationService.updateUserSurplusCourseFee(userId, musicGroupId, studentPaymentOrder.getExpectAmount(), "乐团续费", userId);
             return true;
         } else {
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {
@@ -2275,11 +2247,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (group == null) {
             throw new BizException("乐团信息不存在");
         }
-        
-		if (!(group.getStatus() == MusicGroupStatusEnum.DRAFT || group.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED
-				|| group.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
-			throw new BizException("当前乐团状态不能修改基本信息");
-		}
+
+        if (!(group.getStatus() == MusicGroupStatusEnum.DRAFT || group.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED
+                || group.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
+            throw new BizException("当前乐团状态不能修改基本信息");
+        }
 
         MusicGroup musicGroup = subFeeSettingDto.getMusicGroup();
         musicGroup.setStatus(group.getStatus());
@@ -2300,9 +2272,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             MusicGroupPaymentCalender regCalender = musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
             if (regCalender != null) {
                 musicGroupPaymentCalenderDao.delByGroupId(musicGroupId);
-                
+
                 List<Long> calenderIds = new ArrayList<Long>();
-        		calenderIds.add(regCalender.getId());
+                calenderIds.add(regCalender.getId());
                 musicGroupPaymentCalenderCourseSettingsDao.deleteByMusicGroupPaymentCalenderId(calenderIds);
             }
         }
@@ -2401,7 +2373,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     @Override
-    public List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId,Integer teacherId) {
+    public List<CourseScheduleTeachersDto> queryTeacherSalary(Long courseScheduleId, Integer teacherId) {
         return courseScheduleTeacherSalaryDao.queryTeacherSalary(courseScheduleId, teacherId);
     }
 
@@ -2452,6 +2424,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         musicGroup.setEducationalTeacherName(teacherDao.queryNameById(musicGroup.getEducationalTeacherId()));
         musicGroup.setTeamTeacherName(teacherDao.queryNameById(musicGroup.getTeamTeacherId()));
         musicGroup.setDirectorUserName(teacherDao.queryNameById(musicGroup.getDirectorUserId()));
+        musicGroup.setRepairUserName(teacherDao.queryNameById(musicGroup.getRepairUserId()));
         Organization organization = organizationDao.get(musicGroup.getOrganId());
         if (organization != null) {
             musicGroup.setOrganName(organization.getName());
@@ -2506,6 +2479,25 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         } else {
             throw new BizException("当前乐团状态不支持此操作");
         }
+        //报名未交费的学生,完成回访才能到下一步
+        boolean hasNoVisit = false;
+        StringBuilder tipsMsg = new StringBuilder();
+        List<StudentRegistration> noPaymentStudents = studentRegistrationDao.getNoPaymentStudent(musicGroupId);
+        if (noPaymentStudents.size() > 0) {
+            tipsMsg.append("以下学生未完成回访,");
+            List<Integer> studentIds = noPaymentStudents.stream().map(StudentRegistration::getUserId).collect(Collectors.toList());
+            List<Integer> musicGroupVisitStudent = studentVisitDao.getMusicGroupVisitStudent(musicGroupId, studentIds);
+            for (StudentRegistration noPaymentStudent : noPaymentStudents) {
+                if (!musicGroupVisitStudent.contains(noPaymentStudent.getUserId())) {
+                    hasNoVisit = true;
+                    tipsMsg.append(noPaymentStudent.getName()).append("(").append(noPaymentStudent.getUserId()).append(")、");
+                }
+            }
+        }
+        if (hasNoVisit) {
+            throw new BizException(tipsMsg.append("请完成回访").toString());
+        }
+
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, event, sysUser.getId(), ""));
         musicGroup.setStatus(MusicGroupStatusEnum.PREPARE);
         musicGroupDao.update(musicGroup);

+ 33 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -667,22 +667,28 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public synchronized void addComplaints(Long courseScheduleId, String content) {
+	public synchronized void addComplaints(Long courseScheduleId, String content,String url) {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if(Objects.isNull(user)){
 			throw new BizException("请登录");
 		}
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(user.getId().longValue(), courseScheduleId);
-		if(teacherAttendance == null){
-			throw new BizException("考勤信息不存在");
-		}
-		if(teacherAttendance.getComplaintsStatus() != null && teacherAttendance.getComplaintsStatus() != REPEAL){
-            throw new BizException("请勿重复提交考勤申述");
-        }
+
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
 		if(courseSchedule == null){
 			throw new BizException("课程不存在");
 		}
+		if(teacherAttendance == null){
+			teacherAttendance = new TeacherAttendance();
+			teacherAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+			teacherAttendance.setTeacherId(user.getId());
+			teacherAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+			teacherAttendance.setGroupType(courseSchedule.getGroupType());
+			teacherAttendance.setCourseScheduleId(courseScheduleId);
+			teacherAttendanceDao.insert(teacherAttendance);
+		}else if(teacherAttendance.getComplaintsStatus() != null && teacherAttendance.getComplaintsStatus() != REPEAL){
+            throw new BizException("请勿重复提交考勤申述");
+        }
 		//如果课程时间在两天前
 		Date date = new Date();
         int i = DateUtil.daysBetween(courseSchedule.getClassDate(), DateUtil.stringToDate(DateUtil.format(date,DateUtil.DEFAULT_PATTERN),DateUtil.DEFAULT_PATTERN));
@@ -693,6 +699,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.WAIT);
 		teacherAttendance.setComplaintsContent(content);
 		teacherAttendance.setComplaintsTime(date);
+		teacherAttendance.setUrl(url);
 		teacherAttendanceDao.update(teacherAttendance);
 	}
 
@@ -737,10 +744,6 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void agreeTeacherAttendanceComplaints(Integer signInStatus, Integer signOutStatus, long teacherAttendanceId,String content) {
-		SysUser user = sysUserFeignService.queryUserInfo();
-		if(Objects.isNull(user)){
-			throw new BizException("请登录");
-		}
 		TeacherAttendance teacherAttendance = teacherAttendanceDao.get(teacherAttendanceId);
 		if(teacherAttendance == null){
 			throw new BizException("考勤信息不存在");
@@ -775,13 +778,16 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
 			}
 			teacherAttendance.setDisposeContent(content);
-			teacherAttendance.setOperator(user.getId());
+			SysUser user = sysUserFeignService.queryUserInfo();
+			if(user != null && user.getId() != null){
+				teacherAttendance.setOperator(user.getId());
+			}
 			teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.PASS);
 			teacherAttendance.setRemark(remark.toString());
 			teacherAttendanceDao.update(teacherAttendance);
 			String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			Map<Integer, String> receivers = new HashMap<>(1);
-			receivers.put(user.getId(),user.getId().toString());
+			receivers.put(teacherAttendance.getTeacherId(),teacherAttendance.getTeacherId().toString());
 			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
 					format,courseSchedule.getName(),"通过");
 		}else {
@@ -807,11 +813,24 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
 			String format = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 			Map<Integer, String> receivers = new HashMap<>(1);
-			receivers.put(user.getId(),user.getId().toString());
+			receivers.put(teacherAttendance.getTeacherId(),teacherAttendance.getTeacherId().toString());
 			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
 					format,courseSchedule.getName(),"拒绝");
 		}else {
 			throw new BizException("操作失败: 当前申述状态不允许该操作");
 		}
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void attendanceComplaintsAutoAffirmTask() {
+		String affirmDay = sysConfigDao.findConfigValue("attendance_complaints_auto_affirm_day");
+		if(StringUtils.isEmpty(affirmDay)){
+			affirmDay = "7";
+		}
+		List<TeacherAttendance> teacherAttendances = teacherAttendanceDao.queryAttendanceComplaintsAutoAffirmList(affirmDay);
+		teacherAttendances.forEach(e->{
+			agreeTeacherAttendanceComplaints(1,1,e.getId(),"系统自动审核通过");
+		});
+	}
 }

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

@@ -532,61 +532,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         }
     }
 
-    @Override
-	@Transactional(rollbackFor = Exception.class)
-	public void updateVipGroup(VipGroupApplyDto vipGroupApplyInfo) {
-		VipGroupApplyBaseInfoDto vipGroupUpdateInfo = vipGroupApplyInfo.getVipGroupApplyBaseInfo();
-		//更新vip课
-		updateVipGroupBaseInfo(vipGroupUpdateInfo);
-
-		//课程调整
-		List<CourseSchedule> courseSchedules = vipGroupApplyInfo.getCourseSchedules();
-		if(CollectionUtils.isEmpty(courseSchedules)){
-			return;
-		}
-
-		//只需要调整课程信息的课程列表
-		List<CourseSchedule> updateCourseSchedules = courseSchedules
-				.stream()
-				.filter(courseSchedule -> Objects.nonNull(courseSchedule.getId()))
-				.collect(Collectors.toList());
-		List<Long> updateCourseScheduleIds = updateCourseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
-
-		//新增的课程列表
-		List<CourseSchedule> newCourseSchedules = courseSchedules
-				.stream()
-				.filter(courseSchedule -> Objects.nonNull(courseSchedule.getId()))
-				.collect(Collectors.toList());
-
-		//指定VIP课原有的课程列表
-		List<CourseSchedule> vipGroupCourseSchedules = courseScheduleDao.findGroupCourseSchedules(vipGroupUpdateInfo.getId(),GroupType.VIP.getCode());
-
-		if(!CollectionUtils.isEmpty(updateCourseSchedules)){
-			//需要删除的课程编号列表
-			List<Long> deleteCourseScheduleIds = vipGroupCourseSchedules.stream()
-					.filter(courseSchedule -> !updateCourseScheduleIds.contains(courseSchedule.getId()))
-					.map(CourseSchedule::getId)
-					.collect(Collectors.toList());
-			//删除对应的课程及相关信息
-			courseScheduleService.batchDeleteCourseSchedules(deleteCourseScheduleIds);
-
-		}
-
-		//检测课程信息是否存在冲突
-		courseScheduleService.checkNewCourseSchedules(courseSchedules,false,false);
-		//只需要更新的课程走课程调整流程
-		courseScheduleService.classStartDateAdjust(updateCourseSchedules);
-
-		//新增的课程需要重新创建相关信息
-		courseScheduleService.batchAddCourseSchedule(newCourseSchedules);
-		//创建老师单节课课酬信息
-		courseScheduleTeacherSalaryService.createCourseScheduleTeacherVipSalary(vipGroupUpdateInfo,
-				newCourseSchedules,
-				vipGroupUpdateInfo.getOnlineTeacherSalary(),
-				vipGroupUpdateInfo.getOfflineTeacherSalary());
-
-	}
-
 	@Override
 	public void vipApplyAudit(Long vipGroupId, AuditStatusEnum auditStatus, String reason) {
 		if(Objects.isNull(vipGroupId)||Objects.isNull(auditStatus)){
@@ -1081,7 +1026,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
 
-
 		int normalStudentNum = 0;
 		if(Objects.nonNull(vipGroup.getId())){
 			normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(GroupType.VIP, vipGroup.getId().toString());
@@ -1181,6 +1125,188 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
     }
 
 	@Override
+	public <K extends VipGroup> Map<String,BigDecimal> countVipGroupCoursePredictFee(K vipGroup,
+																			   Integer teacherId,
+																					 Long courseId){
+
+		if(Objects.isNull(teacherId)){
+			throw new BizException("请指定教师");
+		}
+
+		if(Objects.isNull(vipGroup.getVipGroupCategoryId())){
+			throw new BizException("请指定课程形式");
+		}
+
+		VipGroupCategory vipGroupCategory = vipGroupCategoryDao.get(vipGroup.getVipGroupCategoryId().intValue());
+		if(Objects.isNull(vipGroupCategory)){
+			throw new BizException("未找到课程形式");
+		}
+
+		TeacherDefaultVipGroupSalary teacherDefaultVipGroupSalary = teacherDefaultVipGroupSalaryDao.findByTeacherAndCategory(teacherId,
+				vipGroup.getVipGroupCategoryId());
+
+		if(Objects.isNull(teacherDefaultVipGroupSalary)){
+			throw new BizException("请设置教师课酬");
+		}
+
+		if(Objects.isNull(vipGroup.getVipGroupActivityId())){
+			throw new BizException("请指定活动方案");
+		}
+
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+
+		if(Objects.isNull(vipGroupActivity)){
+			throw new BizException("指定的活动方案不存在");
+		}
+
+		VipGroupSalarySettlementDto vipGroupSalarySettlementDto = JSON.parseObject(vipGroupActivity.getSalarySettlementJson(), VipGroupSalarySettlementDto.class);
+
+		if(Objects.isNull(vipGroupSalarySettlementDto)){
+			throw new BizException("课酬结算方案错误");
+		}
+
+		Map<String,BigDecimal> results=new HashMap<>(1);
+
+		BigDecimal offlineClassNum=new BigDecimal(vipGroup.getOfflineClassesNum());
+		BigDecimal onlineClassNum=new BigDecimal(vipGroup.getOnlineClassesNum());
+		BigDecimal onlineClassesUnitPrice=vipGroup.getOnlineClassesUnitPrice();
+		if(Objects.isNull(onlineClassesUnitPrice)){
+			onlineClassesUnitPrice = BigDecimal.ZERO;
+		}
+		BigDecimal onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
+		BigDecimal offlineClassesUnitPrice=vipGroup.getOfflineClassesUnitPrice();
+		if(Objects.isNull(offlineClassesUnitPrice)){
+			offlineClassesUnitPrice = BigDecimal.ZERO;
+		}
+		BigDecimal offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
+		BigDecimal totalClassNum=offlineClassNum.add(onlineClassNum);
+		BigDecimal teacherOnlineSalary=null,teacherOfflineSalary=null;
+
+		if(Objects.isNull(vipGroupActivity.getType())){
+			throw new BizException("此活动未设置活动类型");
+		}
+
+		//课程购买费用计算
+		BigDecimal totalPrice;
+		switch (vipGroupActivity.getType()){
+			case BASE_ACTIVITY:
+				totalPrice=onlineVipGroupCharge.add(offlineVipGroupCharge);
+				break;
+			case DISCOUNT:
+				BigDecimal discount=new BigDecimal(vipGroupActivity.getAttribute1());
+				totalPrice=onlineVipGroupCharge.add(offlineVipGroupCharge);
+				totalPrice=totalPrice.multiply(discount).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+				break;
+			case GIVE_CLASS:
+				if(totalClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))<0){
+
+				}else if(vipGroup.getGiveTeachMode()==TeachModeEnum.OFFLINE){
+					if(totalClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
+						offlineClassNum=offlineClassNum.subtract(new BigDecimal(vipGroupActivity.getAttribute2()));
+					}
+					offlineVipGroupCharge = offlineClassesUnitPrice.multiply(offlineClassNum);
+				}else if(vipGroup.getGiveTeachMode()==TeachModeEnum.ONLINE){
+					if(totalClassNum.compareTo(new BigDecimal(vipGroupActivity.getAttribute1()))>-1){
+						onlineClassNum=onlineClassNum.subtract(new BigDecimal(vipGroupActivity.getAttribute2()));
+					}
+					onlineVipGroupCharge = onlineClassesUnitPrice.multiply(onlineClassNum);
+				}else{
+					throw new BizException("请指定赠送课程类型!");
+				}
+				totalPrice=onlineVipGroupCharge.add(offlineVipGroupCharge);
+				break;
+			default:
+				throw new BizException("活动类型错误!");
+		}
+
+		results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
+
+		int normalStudentNum = 0;
+		if(Objects.nonNull(vipGroup.getId())){
+			normalStudentNum = courseScheduleStudentPaymentDao.countStudentNum(courseId.intValue());
+		}
+
+		//教师课酬线上单课酬计算
+		if(Objects.nonNull(vipGroupSalarySettlementDto.getOnlineSalarySettlement())){
+			if(Objects.isNull(teacherOnlineSalary)){
+				switch (vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())){
+							teacherOnlineSalary=new BigDecimal(0);
+						}else{
+							teacherOnlineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+						}
+						results.put("onlineTeacherSalary",teacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					case RATIO_DISCOUNT:
+						results.put("onlineTeacherSalary",totalPrice.multiply(new BigDecimal(vipGroupCategory.getStudentNum()))
+								.divide(totalClassNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN)
+								.multiply(vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue())
+								.divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN)
+								.setScale(0,BigDecimal.ROUND_HALF_UP));
+
+						break;
+					case FIXED_SALARY:
+						results.put("onlineTeacherSalary",vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("未指定课酬结算标准!");
+				}
+
+			}
+		}
+
+		//教师线下单课酬计算
+		if(Objects.nonNull(vipGroupSalarySettlementDto.getOfflineSalarySettlement())){
+			if(Objects.isNull(teacherOfflineSalary)){
+				switch (vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSalarySettlementType()){
+					case TEACHER_DEFAULT:
+						if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())){
+							teacherOfflineSalary=new BigDecimal(0);
+						}else{
+							teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+						}
+						results.put("offlineTeacherSalary",teacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					case RATIO_DISCOUNT:
+						results.put("offlineTeacherSalary",totalPrice.multiply(new BigDecimal(vipGroupCategory.getStudentNum())).divide(totalClassNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue()).divide(new BigDecimal(100), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0,BigDecimal.ROUND_HALF_UP));
+
+						break;
+					case FIXED_SALARY:
+						results.put("offlineTeacherSalary",vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSettlementValue().setScale(0, BigDecimal.ROUND_HALF_UP));
+						break;
+					default:
+						throw new BizException("未指定课酬结算标准!");
+				}
+			}
+		}
+
+		BigDecimal ots = results.get("onlineTeacherSalary");
+		if(Objects.isNull(ots)){
+			ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(ots)){
+			ots = BigDecimal.ZERO;
+		}
+		BigDecimal ofts = results.get("offlineTeacherSalary");
+		if(Objects.isNull(ofts)){
+			ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+		}
+		if(Objects.isNull(ofts)){
+			ofts = BigDecimal.ZERO;
+		}
+		if(Objects.nonNull(vipGroup.getStatus())&&normalStudentNum!=vipGroupCategory.getStudentNum()){
+			ots = ots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+			ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+		}
+
+		results.put("onlineTeacherSalary", ots);
+		results.put("offlineTeacherSalary", ofts);
+
+		return results;
+	}
+
+	@Override
 	public void enableBuyVipGroup(Integer vipGroupId, Integer userId) {
 		if (Objects.isNull(vipGroupId)){
 			throw new BizException("请指定VIP课");

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

@@ -2445,6 +2445,17 @@
         <include refid="queryVipCourseScheduleIds"/>
     </select>
     <sql id="queryVipCourseScheduleIds">
+        <if test="mergeCourseType != null and mergeCourseType != ''">
+            <if test="mergeCourseType == 'MASTER'">
+                AND cs.new_course_id_ = cs.id_
+            </if>
+            <if test="mergeCourseType == 'ASSIST'">
+                AND cs.new_course_id_ > 0 AND cs.new_course_id_ != cs.id_
+            </if>
+            <if test="mergeCourseType == 'ALL'">
+                AND cs.new_course_id_ > 0
+            </if>
+        </if>
         <if test="isCallNames != null and isCallNames == 1">
             AND sa.id_ IS NOT NULL
         </if>

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

@@ -267,14 +267,11 @@
     <select id="findSomeDayAgoTeacherCourseSalaryNoSettlement" resultMap="CourseScheduleTeacherSalary">
 		SELECT
 		cs.class_date_,
-		csts.*,csts.expect_salary_ * (CASE WHEN (ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0) AND (ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0) THEN 0
-		WHEN ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 THEN 0.5
-		WHEN ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0 THEN 0.5 ELSE 1 END) teacher_actual_salary_
+		csts.*
 		FROM
 		course_schedule_teacher_salary csts
 		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
 		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
-		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
 		WHERE 1=1
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
@@ -298,14 +295,11 @@
     <select id="findTeacherCourseSalaryNoSettlement" resultMap="CourseScheduleTeacherSalary">
 		SELECT
 		cs.class_date_,
-		csts.*,csts.expect_salary_ * (CASE WHEN (ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0) AND (ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0) THEN 0
-		WHEN ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 THEN 0.5
-		WHEN ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0 THEN 0.5 ELSE 1 END) teacher_actual_salary_
+		csts.*
 		FROM
 		course_schedule_teacher_salary csts
 		LEFT JOIN course_schedule cs ON cs.id_ = csts.course_schedule_id_
-		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-		WHERE ta.id_ IS NOT NULL
+		WHERE 1=1
 		<if test="startDate != null">
 			AND cs.class_date_ BETWEEN #{startDate} AND #{endDate}
 		</if>
@@ -610,10 +604,14 @@
 		<result property="signInTime" column="signInTime"/>
 		<result property="studentSignInTime" column="studentSignInTime"/>
 		<result property="studentSignOutTime" column="studentSignOutTime"/>
+		<result property="complaintsStatus" column="complaints_status_"/>
+		<result property="disposeContent" column="dispose_content_"/>
+		<result property="deductionReason" column="deduction_reason_"/>
 		<result property="teacherName" column="teacherName"/>
 		<result property="groupName" column="groupName"/>
 		<result property="groupId" column="group_id_"/>
 		<result property="studentNum" column="studentNum"/>
+		<result property="realStudentNum" column="realStudentNum"/>
 		<result property="teacherId" column="teacherId"/>
 		<result property="activeName" column="activeName"/>
 		<result property="vipActiveName" column="vip_active_name_"/>
@@ -653,11 +651,14 @@
 		CASE WHEN ts.teacher_role_ = 'TEACHING' THEN '助教' ELSE '主教' END teacherRole,
 		CASE WHEN ta.sign_in_status_ = 0 THEN '异常' WHEN ta.sign_in_status_ = 1 THEN '正常' END signInStatus,
 		CASE WHEN ta.sign_out_status_=0 THEN '异常' WHEN ta.sign_out_status_ = 1 THEN '正常' END signOutStatus,
+		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
+		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
 		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
 		LEFT JOIN `teacher_attendance` ta ON ta.`teacher_id_` = ts.`user_id_` AND ta.`course_schedule_id_` = ts.`course_schedule_id_`
+		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
 		LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
 		LEFT JOIN sys_user u ON ts.user_id_= u.id_
 		LEFT JOIN teacher t ON t.id_ = ts.user_id_
@@ -686,20 +687,22 @@
 		CASE WHEN ts.teacher_role_ = 'TEACHING' THEN '助教' ELSE '主教' END teacherRole,
 		CASE WHEN ta.sign_in_status_ = 0 THEN '异常' WHEN ta.sign_in_status_ = 1 THEN '正常' END signInStatus,
 		CASE WHEN ta.sign_out_status_=0 THEN '异常' WHEN ta.sign_out_status_ = 1 THEN '正常' END signOutStatus,
+		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
+		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,
 		vg.online_classes_unit_price_,vg.offline_classes_unit_price_,
-		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime
+		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
 		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
 		LEFT JOIN `teacher_attendance` ta ON ta.`teacher_id_` = ts.`user_id_` AND ta.`course_schedule_id_` = ts.`course_schedule_id_`
-		LEFT JOIN `student_attendance` sa ON sa.course_schedule_id_ = ts.course_schedule_id_
 		LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
 		LEFT JOIN sys_user u ON ts.user_id_= u.id_
 		LEFT JOIN teacher t ON t.id_ = ts.user_id_
 		LEFT JOIN organization o ON o.id_ = t.organ_id_
 		LEFT JOIN school s ON s.id_ = cs.schoole_id_
 		LEFT JOIN course_schedule_student_payment sp ON sp.course_schedule_id_ = ts.course_schedule_id_
+		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
 		LEFT JOIN vip_group vg ON (vg.id_ = ts.music_group_id_ AND ts.group_type_ = 'VIP')
 		LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_ = vga.id_
 		LEFT JOIN organization vgo ON vgo.id_ = vg.organ_id_
@@ -727,19 +730,21 @@
 		CASE WHEN ts.teacher_role_ = 'TEACHING' THEN '助教' ELSE '主教' END teacherRole,
 		CASE WHEN ta.sign_in_status_ = 0 THEN '异常' WHEN ta.sign_in_status_ = 1 THEN '正常' END signInStatus,
 		CASE WHEN ta.sign_out_status_= 0 THEN '异常' WHEN ta.sign_out_status_ = 1 THEN '正常' END signOutStatus,
+		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
+		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,
-		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,
+		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
 		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
 		LEFT JOIN `teacher_attendance` ta ON ta.`teacher_id_` = ts.`user_id_` AND ta.`course_schedule_id_` = ts.`course_schedule_id_`
-		LEFT JOIN `student_attendance` sa ON sa.course_schedule_id_ = ts.course_schedule_id_
 		LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
 		LEFT JOIN sys_user u ON ts.user_id_= u.id_
 		LEFT JOIN teacher t ON t.id_ = ts.user_id_
 		LEFT JOIN organization o ON o.id_ = t.organ_id_
 		LEFT JOIN school s ON s.id_ = cs.schoole_id_
 		LEFT JOIN course_schedule_student_payment sp ON sp.course_schedule_id_ = ts.course_schedule_id_
+		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
 		LEFT JOIN practice_group pg ON (pg.id_ = ts.music_group_id_ AND ts.group_type_ = 'PRACTICE')
 		LEFT JOIN organization pgo ON pgo.id_ = pg.organ_id_
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'PRACTICE' AND ts.settlement_time_ IS NOT NULL

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

@@ -150,7 +150,8 @@
 
     <select id="findStudentsByOrganId" resultMap="studentManageListDto">
         SELECT o.`name_` organ_name_,s.`user_id_` ,su.`username_` ,su.`phone_` parents_phone_,su.`real_name_` ,su.`gender_` , su.organ_id_,
-		tu.`real_name_` teacher_name_,IF(s.service_tag_=2,0,s.service_tag_) service_tag_ ,s.`operating_tag_` , suca.`course_balance_` ,sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,
+		tu.`real_name_` teacher_name_,IF(s.service_tag_=2,0,s.service_tag_) service_tag_ ,s.`operating_tag_` , suca.`course_balance_` ,
+		sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,
 		case when su.password_ is null then false else true end isActive_,s.is_new_user_
 		FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
 		LEFT JOIN `organization` o on o.`id_` = su.`organ_id_`

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

@@ -690,4 +690,7 @@
             #{userId}
         </foreach>
     </select>
+    <select id="getNoPaymentStudent" resultMap="StudentRegistration">
+        SELECT * FROM student_registration WHERE music_group_id_ = #{musicGroupId} AND payment_status_ IN (0,1)
+    </select>
 </mapper>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml

@@ -172,4 +172,11 @@
         </if>
         AND s.del_flag_ = 0
     </select>
+    <select id="getMusicGroupVisitStudent" resultType="java.lang.Integer">
+        SELECT DISTINCT student_id_ FROM student_visit WHERE music_group_id_=#{musicGroupId}
+        AND student_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
 </mapper>

+ 14 - 5
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -33,6 +33,7 @@
         <result column="current_schedule_id_" property="currentScheduleId"/>
         <result column="sign_out_attachments_" property="signOutAttachments"/>
         <result column="sign_out_remark_" property="signOutRemark"/>
+        <result column="url_" property="url"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -57,12 +58,12 @@
         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_remark_,update_attendance_type_)
+        sign_out_remark_,update_attendance_type_,url_)
         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},#{signOutRemark},
-        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+        #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{url})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
@@ -70,7 +71,7 @@
         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_,
-        sign_out_remark_,update_attendance_type_)
+        sign_out_remark_,update_attendance_type_,url_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -81,7 +82,7 @@
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},
             #{teacherAttendance.signOutAttachments},#{teacherAttendance.signOutRemark},
-            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
+            #{teacherAttendance.updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherAttendance.url})
         </foreach>
     </insert>
 
@@ -89,6 +90,9 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance">
         UPDATE teacher_attendance
         <set>
+            <if test="url != null and url != ''">
+                url_ = #{url},
+            </if>
             <if test="updateAttendanceEnum != null">
                 update_attendance_type_ = #{updateAttendanceEnum,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
@@ -506,6 +510,7 @@
         <result property="complaintsContent" column="complaints_content_"/>
         <result property="disposeContent" column="dispose_content_"/>
         <result property="teacherAttendanceId" column="teacher_attendance_id_"/>
+        <result property="url" column="url_"/>
         <result property="updateAttendanceEnum" column="update_attendance_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
     <select id="queryTeacherAttendanceComplaints" resultMap="TeacherAttendanceComplaintsDtoMap">
@@ -513,7 +518,7 @@
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_,
         suo.real_name_ operator_name_,su.real_name_ teacher_name_,ta.complaints_status_,ta.sign_in_time_,ta.sign_out_time_
-        ,ta.complaints_content_,ta.dispose_content_,cs.end_class_time_,cs.start_class_time_,ta.id_ teacher_attendance_id_,ta.update_attendance_type_
+        ,ta.complaints_content_,ta.dispose_content_,cs.end_class_time_,cs.start_class_time_,ta.id_ teacher_attendance_id_,ta.update_attendance_type_,ta.url_
         FROM teacher_attendance ta
         LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
         LEFT JOIN teacher t ON t.id_ = su.id_
@@ -567,6 +572,10 @@
         WHERE ta.current_schedule_id_ = #{currentScheduleId} AND ta.teacher_id_ = #{userId}
         AND ta.sign_in_time_ IS NOT NULL ORDER BY ta.sign_in_time_ ASC LIMIT 1
     </select>
+    <select id="queryAttendanceComplaintsAutoAffirmList" resultMap="TeacherAttendance">
+        SELECT * FROM teacher_attendance
+        WHERE complaints_status_ = 2 AND TIMESTAMPDIFF(DAY,complaints_time_,NOW()) >= #{affirmDay}
+    </select>
 
     <update id="updateViPSignOutStatus" parameterType="string">
     	UPDATE teacher_attendance SET sign_out_status_ = 1,sign_out_time_= now()

+ 61 - 28
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -71,24 +71,41 @@
         <result column="vip6" property="vip6"/>
         <result column="vip7" property="vip7"/>
         <result column="practice" property="practiceSalary"/>
-        <result column="single2" property="singleSalary2"/>
-        <result column="mix2" property="mixSalary2"/>
-        <result column="comprehensive2" property="comprehensiveSalary2"/>
-        <result column="training_single2" property="traningSigleSalary2"/>
-        <result column="training_mix2" property="traningMixSalary2"/>
-        <result column="high2" property="highSalary2"/>
-        <result column="classroom2" property="classroomSalary2"/>
-        <result column="single" property="singleSalary"/>
-        <result column="mix" property="mixSalary"/>
-        <result column="comprehensive" property="comprehensiveSalary"/>
-        <result column="training_single" property="traningSigleSalary"/>
-        <result column="training_mix" property="traningMixSalary"/>
-        <result column="high" property="highSalary"/>
-        <result column="classroom" property="classroomSalary"/>
+
+        <result column="main_single2" property="mainSingleSalary2"/>
+        <result column="main_mix2" property="mainMixSalary2"/>
+        <result column="main_comprehensive2" property="mainComprehensiveSalary2"/>
+        <result column="main_training_single2" property="mainTraningSigleSalary2"/>
+        <result column="main_training_mix2" property="mainTraningMixSalary2"/>
+        <result column="main_high2" property="mainHighSalary2"/>
+        <result column="main_classroom2" property="mainClassroomSalary2"/>
+        <result column="main_single" property="mainSingleSalary"/>
+        <result column="main_mix" property="mainMixSalary"/>
+        <result column="main_comprehensive" property="mainComprehensiveSalary"/>
+        <result column="main_training_single" property="mainTraningSigleSalary"/>
+        <result column="main_training_mix" property="mainTraningMixSalary"/>
+        <result column="main_high" property="mainHighSalary"/>
+        <result column="main_classroom" property="mainClassroomSalary"/>
+
         <result column="high_online3" property="highOnline3Salary"/>
         <result column="high_online4" property="highOnline4Salary"/>
         <result column="high_online5" property="highOnline5Salary"/>
         <result column="music_network1" property="musicNetwork1Salary"/>
+
+        <result column="assistant_single2" property="assistantSingleSalary2"/>
+        <result column="assistant_mix2" property="assistantMixSalary2"/>
+        <result column="assistant_comprehensive2" property="assistantComprehensiveSalary2"/>
+        <result column="assistant_training_single2" property="assistantTraningSigleSalary2"/>
+        <result column="assistant_training_mix2" property="assistantTraningMixSalary2"/>
+        <result column="assistant_high2" property="assistantHighSalary2"/>
+        <result column="assistant_classroom2" property="assistantClassroomSalary2"/>
+        <result column="assistant_single" property="assistantSingleSalary"/>
+        <result column="assistant_mix" property="assistantMixSalary"/>
+        <result column="assistant_comprehensive" property="assistantComprehensiveSalary"/>
+        <result column="assistant_training_single" property="assistantTraningSigleSalary"/>
+        <result column="assistant_training_mix" property="assistantTraningMixSalary"/>
+        <result column="assistant_high" property="assistantHighSalary"/>
+        <result column="assistant_classroom" property="assistantClassroomSalary"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -1169,20 +1186,36 @@
 		max(case when gc.`name_` = '1V6' then gs.`offline_classes_salary_` else 0 end) vip6,
 		max(case when gc.`name_` = '1V7' then gs.`offline_classes_salary_` else 0 end) vip7,
 		max(pgs.main_teacher_salary_) practice,
-		MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.main_teacher_30min_salary_ ELSE 0 END) single2,
-		MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.main_teacher_30min_salary_ ELSE 0 END) mix2,
-		MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.main_teacher_30min_salary_ ELSE 0 END) comprehensive2,
-		MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.main_teacher_30min_salary_ ELSE 0 END) training_single2,
-		MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.main_teacher_30min_salary_ ELSE 0 END) training_mix2,
-		MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.main_teacher_30min_salary_ ELSE 0 END) high2,
-		MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.main_teacher_30min_salary_ ELSE 0 END) classroom2,
-		MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.main_teacher_90min_salary_ ELSE 0 END) single,
-		MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.main_teacher_90min_salary_ ELSE 0 END) mix,
-		MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.main_teacher_90min_salary_ ELSE 0 END) comprehensive,
-		MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.main_teacher_90min_salary_ ELSE 0 END) training_single,
-		MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.main_teacher_90min_salary_ ELSE 0 END) training_mix,
-		MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.main_teacher_90min_salary_ ELSE 0 END) high,
-		MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.main_teacher_90min_salary_ ELSE 0 END) classroom,
+        MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_single2,
+        MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_mix2,
+        MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_comprehensive2,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_training_single2,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_training_mix2,
+        MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_high2,
+        MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.main_teacher_30min_salary_ ELSE 0 END) main_classroom2,
+        MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_single,
+        MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_mix,
+        MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_comprehensive,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_training_single,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_training_mix,
+        MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_high,
+        MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.main_teacher_90min_salary_ ELSE 0 END) main_classroom,
+
+        MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_single2,
+        MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_mix2,
+        MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_comprehensive2,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_training_single2,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_training_mix2,
+        MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_high2,
+        MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.assistant_teacher_30min_salary_ ELSE 0 END) assistant_classroom2,
+        MAX(case when mgs.course_schedule_type_ = 'SINGLE' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_single,
+        MAX(case when mgs.course_schedule_type_ = 'MIX' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_mix,
+        MAX(case when mgs.course_schedule_type_ = 'COMPREHENSIVE' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_comprehensive,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_SINGLE' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_training_single,
+        MAX(case when mgs.course_schedule_type_ = 'TRAINING_MIX' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_training_mix,
+        MAX(case when mgs.course_schedule_type_ = 'HIGH' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_high,
+        MAX(case when mgs.course_schedule_type_ = 'CLASSROOM' then mgs.assistant_teacher_90min_salary_ ELSE 0 END) assistant_classroom,
+
 		MAX(case when mgs.course_schedule_type_ = 'HIGH_ONLINE' then CONVERT(JSON_EXTRACT(mgs.salary_rule_json_,'$."3"'),DECIMAL) END) high_online3,
 		MAX(case when mgs.course_schedule_type_ = 'HIGH_ONLINE' then CONVERT(JSON_EXTRACT(mgs.salary_rule_json_,'$."4"'),DECIMAL) END) high_online4,
 		MAX(case when mgs.course_schedule_type_ = 'HIGH_ONLINE' then CONVERT(JSON_EXTRACT(mgs.salary_rule_json_,'$."5"'),DECIMAL) END) high_online5,

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -13,6 +13,10 @@ public interface TaskRemoteService {
 	// 教师异常考勤推送
 	public void pushTeacherExceptionAttendanceTask();
 
+	@GetMapping(value = "task/attendanceComplaintsAutoAffirmTask")
+	// 考勤申述7天未处理默认同意
+	public void attendanceComplaintsAutoAffirmTask();
+
 	@GetMapping(value = "task/updateMusicGroupStudentFeeStatus")
 	// 更新学员缴费状态(新)
 	public void updateMusicGroupStudentFeeStatus();

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -157,6 +157,11 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	}
 
 	@Override
+	public void attendanceComplaintsAutoAffirmTask() {
+		logger.info("考勤申述系统自动处理");
+	}
+
+	@Override
 	public void updateMusicGroupStudentFeeStatus() {
 		logger.info("更新乐团学员缴费状态失败");
 	}

+ 57 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImSystemMessage.java

@@ -0,0 +1,57 @@
+package com.ym.mec.common.entity;
+
+public class ImSystemMessage extends ImMessageModel {
+    public Integer isIncludeSender;
+    public Integer isPersisted;
+    public Integer contentAvailable;
+    public String[] toUserId;
+    private String type;
+
+    public ImSystemMessage setContent(ImTxtMessage content) {
+        super.setContent(content);
+        return this;
+    }
+
+    public ImSystemMessage() {
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getIsIncludeSender() {
+        return isIncludeSender;
+    }
+
+    public void setIsIncludeSender(Integer isIncludeSender) {
+        this.isIncludeSender = isIncludeSender;
+    }
+
+    public Integer getIsPersisted() {
+        return isPersisted;
+    }
+
+    public void setIsPersisted(Integer isPersisted) {
+        this.isPersisted = isPersisted;
+    }
+
+    public Integer getContentAvailable() {
+        return contentAvailable;
+    }
+
+    public void setContentAvailable(Integer contentAvailable) {
+        this.contentAvailable = contentAvailable;
+    }
+
+    public String[] getToUserId() {
+        return toUserId;
+    }
+
+    public void setToUserId(String[] toUserId) {
+        this.toUserId = toUserId;
+    }
+}

+ 12 - 1
mec-im/src/main/java/com/ym/controller/SystemController.java

@@ -1,7 +1,11 @@
 package com.ym.controller;
 
+import com.ym.mec.common.entity.ImSystemMessage;
+import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.service.MessageService;
+import io.rong.messages.TxtMessage;
 import io.rong.models.message.BroadcastMessage;
+import io.rong.models.message.GroupMessage;
 import io.rong.models.message.SystemMessage;
 import io.rong.models.message.TemplateMessage;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +25,14 @@ public class SystemController {
     MessageService messageService;
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
-    public Object send(@RequestBody SystemMessage systemMessage) throws Exception {
+    public Object send(@RequestBody ImSystemMessage imSystemMessage) throws Exception {
+        SystemMessage systemMessage = new SystemMessage();
+        ImTxtMessage content = (ImTxtMessage)imSystemMessage.getContent();
+        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
+        systemMessage.setContent(txtMessage);
+        systemMessage.setTargetId(imSystemMessage.getTargetId());
+        systemMessage.setSenderId(imSystemMessage.getSenderId());
+        systemMessage.setObjectName(imSystemMessage.getObjectName());
         return messageService.systemSend(systemMessage);
     }
 

+ 4 - 0
mec-im/src/main/java/com/ym/pojo/RoomResult.java

@@ -17,6 +17,10 @@ import java.util.Map;
  */
 public class RoomResult {
     private @Getter @Setter String roomId;
+    //课程结束后是否自动关闭课程
+    private @Getter @Setter Boolean autoCloseFlag = true;
+    //课程结束后多少分钟关闭网络教室
+    private @Getter @Setter String autoCloseNetworkRoomTime;
     private @Getter @Setter Date startTime;
     private @Getter @Setter int surplusTime;
     private @Getter @Setter String imToken;

+ 4 - 1
mec-im/src/main/java/com/ym/service/Impl/MessageServiceImpl.java

@@ -41,7 +41,10 @@ public class MessageServiceImpl implements MessageService {
         return new Chatroom(appKey,appSecret);
     }
     private MsgSystem getMsgSystem(){
-        return new MsgSystem(appKey,appSecret);
+        RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
+        MsgSystem msgSystem = new MsgSystem(appKey, appSecret);
+        msgSystem.setRongCloud(rongCloud);
+        return msgSystem;
     }
     private History getHistory(){
         return new History(appKey,appSecret);

+ 9 - 1
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -138,6 +138,13 @@ public class RoomServiceImpl implements RoomService {
         if(StringUtils.isEmpty(continueCourseTime)){
             continueCourseTime = "5";
         }
+
+        String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigService.AUTO_CLOSE_NETWORK_ROOM);
+        if(StringUtils.isEmpty(autoCloseNetworkRoomTime)){
+            continueCourseTime = "15";
+        }
+        RoomResult roomResult = new RoomResult();
+        roomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
         CourseSchedule schedule = courseSchedule;
         //如果当前课程是连堂课,那么获取第一节课的课程编号
         while (true){
@@ -146,6 +153,7 @@ public class RoomServiceImpl implements RoomService {
             schedule = courseScheduleDao.getLastCourse(schedule.getClassGroupId(),classDate + " " + startClassTime,schedule.getActualTeacherId(),continueCourseTime);
             if(schedule != null){
                 roomId = schedule.getId().toString();
+                roomResult.setAutoCloseFlag(false);
             }else {
                 break;
             }
@@ -162,7 +170,7 @@ public class RoomServiceImpl implements RoomService {
         Date curTime = DateTimeUtils.currentUTC();
 
         RoleEnum roleEnum;
-        RoomResult roomResult = new RoomResult();
+
 
         RoomResult.MemberResult userResult = new RoomResult.MemberResult();
         RoomMember member = roomMemberDao.findByRidAndUid(roomId, userId);

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/AttendanceComplaintsAutoAffirmTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AttendanceComplaintsAutoAffirmTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.attendanceComplaintsAutoAffirmTask();
+	}
+}

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

@@ -69,8 +69,8 @@ public class TeacherAttendanceController extends BaseController {
 
     @ApiOperation(value = "提交考勤申述")
     @PostMapping("/addComplaints")
-    public Object addComplaints(Long courseScheduleId,String content){
-        teacherAttendanceService.addComplaints(courseScheduleId,content);
+    public Object addComplaints(Long courseScheduleId,String content,String url){
+        teacherAttendanceService.addComplaints(courseScheduleId,content,url);
         return succeed();
     }
 

+ 19 - 9
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -545,12 +545,13 @@ public class ExportController extends BaseController {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"课时编号", "老师编号", "老师姓名", "老师分部", "工作类别",
                     "课程分部", "课程组编号", "课程班名称", "乐团模式", "vip活动名称", "Vip课程类型", "阶梯奖励名称", "线上课/线下课", "线上课单价", "线下课单价",
                     "课程类别", "课时时长", "实际上课时长", "上课日期",
-                    "上课时间", "教师签到状态", "教师签退状态", "教师签到时间", "教师签退时间",
-                    "主辅", "上课地点", "应到学员", "学员签到时间", "学员签退时间", "课时课酬", "阶梯奖励"}, new String[]{
+                    "上课时间", "教师签到状态", "教师签退状态", "教师签到时间", "教师签退时间", "申诉处理状态", "处理意见",
+                    "主辅", "上课地点", "应到学员", "实际到课学员", "学员签到时间", "学员签退时间", "课时课酬", "阶梯奖励", "扣款原因"}, new String[]{
                     "courseScheduleId", "teacherId", "teacherName", "teacherOrganName", "jobType",
                     "courseScheduleOrganName", "groupId", "groupName", "changeType", "vipActiveName", "vipCategoryName", "activeName", "teachMode", "onlineClassesUnitPrice", "offlineClassesUnitPrice",
                     "courseScheduleType", "signCourseScheduleTime", "currentTime", "classDate", "courseScheduleStartTime", "signInStatus",
-                    "signOutStatus", "signInTime", "signOutTime", "teacherRole", "address", "studentNum", "studentSignInTime", "studentSignOutTime", "price", "rewards"}, rows);
+                    "signOutStatus", "signInTime", "signOutTime","complaintsStatus", "disposeContent", "teacherRole", "address", "studentNum", "realStudentNum",
+                    "studentSignInTime", "studentSignOutTime", "price", "rewards", "deductionReason"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             response.flushBuffer();
@@ -2306,13 +2307,22 @@ public class ExportController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
 
-            String[] header = {"老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7", "网管课", "单技课2.0", "合奏课2.0", "综合课2.0", "集训单技课2.0", "集训合奏课2.0",
-                    "基础技能课2.0", "课堂课2.0", "单技课3.0", "合奏课3.0", "综合课3.0", "集训单技课3.0", "集训合奏课3.0",
-                    "基础技能课3.0", "课堂课3.0", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"};
+            String[] header = {"老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7",
+                    "网管课", "单技课2.0(主教)", "合奏课2.0(主教)", "综合课2.0(主教)", "集训单技课2.0(主教)", "集训合奏课2.0(主教)",
+                    "基础技能课2.0(主教)", "课堂课2.0(主教)", "单技课3.0(主教)", "合奏课3.0(主教)", "综合课3.0(主教)", "集训单技课3.0(主教)", "集训合奏课3.0(主教)",
+                    "基础技能课3.0(主教)"
+                    , "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)",
+                    "基础技能课2.0(助教)", "课堂课2.0(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)",
+                    "基础技能课3.0(助教)", "课堂课3.0", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"};
             String[] body = {"userId", "realName", "organName", "jobNature", "demissionStatus", "status", "vip1", "vip2", "vip3", "vip4", "vip5", "vip6", "vip7",
-                    "practiceSalary", "singleSalary2", "mixSalary2", "comprehensiveSalary2", "traningSigleSalary2", "traningMixSalary2", "highSalary2",
-                    "classroomSalary2", "singleSalary", "mixSalary", "comprehensiveSalary", "traningSigleSalary", "traningMixSalary", "highSalary",
-                    "classroomSalary", "highOnline3Salary", "highOnline4Salary", "highOnline5Salary", "musicNetwork1Salary"};
+                    "practiceSalary",
+                    "mainSingleSalary2", "mainMixSalary2", "mainComprehensiveSalary2", "mainTraningSigleSalary2", "mainTraningMixSalary2", "mainHighSalary2",
+                    "mainClassroomSalary2", "mainSingleSalary", "mainMixSalary", "mainComprehensiveSalary", "mainTraningSigleSalary", "mainTraningMixSalary", "mainHighSalary",
+                    "mainClassroomSalary",
+                    "assistantSingleSalary2", "assistantMixSalary2", "assistantComprehensiveSalary2", "assistantTraningSigleSalary2", "assistantTraningMixSalary2", "assistantHighSalary2",
+                    "assistantClassroomSalary2", "assistantSingleSalary", "assistantMixSalary", "assistantComprehensiveSalary", "assistantTraningSigleSalary", "assistantTraningMixSalary", "assistantHighSalary",
+                    "assistantClassroomSalary",
+                    "highOnline3Salary", "highOnline4Salary", "highOnline5Salary", "musicNetwork1Salary"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, pageList);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");

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

@@ -88,6 +88,12 @@ public class TaskController extends BaseController {
 		studentGoodsSellService.affirmReceive(null);
 	}
 
+	@GetMapping(value = "/attendanceComplaintsAutoAffirmTask")
+	// 考勤申述7天未处理默认同意
+	public void attendanceComplaintsAutoAffirmTask(){
+		teacherAttendanceService.attendanceComplaintsAutoAffirmTask();
+	}
+
 	@GetMapping(value = "/repertoryWarn")
 	// 商品库存预警
 	public void repertoryWarn(){