Forráskód Böngészése

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

yonge 4 éve
szülő
commit
75b3942d12

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

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

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

@@ -89,6 +89,9 @@ public class TeacherAttendance {
 	//处理结果
 	private Integer operator;
 
+	@ApiModelProperty(value = "签退附件")
+	private String signOutAttachments;
+
 	public Long getCurrentScheduleId() {
 		return currentScheduleId;
 	}
@@ -105,6 +108,14 @@ public class TeacherAttendance {
 		this.complaintsTime = complaintsTime;
 	}
 
+	public String getSignOutAttachments() {
+		return signOutAttachments;
+	}
+
+	public void setSignOutAttachments(String signOutAttachments) {
+		this.signOutAttachments = signOutAttachments;
+	}
+
 	public Integer getOperator() {
 		return operator;
 	}

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

@@ -18,6 +18,11 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     public static final String VIP_APPEAL_DAYS_RANGE = "vip_appeal_days_range";
 
     /**
+     * 线下课最早打卡时间可提前分钟数
+     */
+    String OFFLINE_SIGN_IN_EARLY_FORWARD_TIME = "offline_sign_in_early_forward_time";
+
+    /**
      * 老师正常打卡时间,为课程当天,距离开课时间前{}分钟
      */
     public static final String ADVANCE_SIGN_IN_MINUTES = "advance_sign_in_minutes";

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

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

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

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

+ 97 - 44
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -91,7 +91,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
 
     //按节数计算课酬的课程类型
-    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.CLASSROOM, CourseSchedule.CourseScheduleType.HIGH, CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
+    protected static final Set<CourseSchedule.CourseScheduleType> UNIT_PRICE_COURSE_TYPES=new HashSet<>(Arrays.asList(CourseSchedule.CourseScheduleType.HIGH_ONLINE, CourseSchedule.CourseScheduleType.MUSIC_NETWORK));
 
     @Override
     public BaseDAO<Long, CourseScheduleTeacherSalary> getDAO() {
@@ -532,6 +532,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             return;
         }
 
+        //教师签到记录
+        List<TeacherAttendance> allTeacherAttendances = teacherAttendanceDao.findByCourseSchedules(courseScheduleIds);
+        Map<String, List<TeacherAttendance>> teacherCourseAttendanceMap = allTeacherAttendances.stream().collect(Collectors.groupingBy(ta -> org.apache.commons.lang3.StringUtils.joinWith(":", ta.getCourseScheduleId(), ta.getTeacherId())));
+
+        //学员点名记录
+        List<StudentAttendance> allStudentAttendances = studentAttendanceDao.findByCourseIds(courseScheduleIds);
+        Map<Long, List<StudentAttendance>> courseStudentAttendanceMap = allStudentAttendances.stream().collect(Collectors.groupingBy(StudentAttendance::getCourseScheduleId));
+
         //需要根据实际上课学员结算课酬的课程编号
         List<Long> needStudentAttendanceCourseScheduleIds = yesterdayCourseSchedules.stream()
                 .filter(c -> CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(c.getType()) || CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(c.getType()))
@@ -643,7 +651,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             //教师课酬
             BigDecimal teacherSalary = new BigDecimal(0);
 
-            if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
+            if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH.equals(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
                 if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
@@ -655,39 +663,18 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 
-                //如果结算方式是教师默认课酬
-                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
-                    //课程时长与结算单位时长占比
-                    BigDecimal classTimeDuty = new BigDecimal(duration);
-                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    }
-                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
-                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
-                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
-                    }
-                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
-                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
-                    //课程时长与结算单位时长占比
-                    BigDecimal classTimeDuty = new BigDecimal(duration);
-                    if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(40), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    } else {
-                        classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
-                    }
-                    BigDecimal teacherDefaultSalary = new BigDecimal(0);
-                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
-                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
-                    }
-                    teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
+                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
+                if(Objects.isNull(normalStudentNum)){
+                    normalStudentNum = Long.valueOf(0);
+                }
+                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
+                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
+                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
                 }
-            }else if(CourseSchedule.CourseScheduleType.MUSIC_NETWORK.equals(courseSchedule.getType())||CourseSchedule.CourseScheduleType.HIGH_ONLINE.equals(courseSchedule.getType())){
+                if(Objects.isNull(teacherSalary)){
+                    teacherSalary = BigDecimal.ZERO;
+                }
+            }else if(durationIsChange&&!UNIT_PRICE_COURSE_TYPES.contains(courseSchedule.getType())){
                 //根据课程类型获取对应的默认课酬设置列表
                 List<TeacherDefaultMusicGroupSalary> teacherDefaultMusicGroupSalariesWithCourseType = teacherDefaultMusicGroupSalariesGroupByCourseType.get(courseSchedule.getType());
                 if (CollectionUtils.isEmpty(teacherDefaultMusicGroupSalariesWithCourseType)) {
@@ -699,17 +686,31 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
                 TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalaryWithTeacherId = teacherDefaultMusicGroupSalariesGroupByTeacherId.get(courseScheduleTeacherSalary.getUserId());
 
-                Long normalStudentNum = courseNormalStudentsMap.get(courseSchedule.getId());
-                if(Objects.isNull(normalStudentNum)){
-                    normalStudentNum = Long.valueOf(0);
-                }
-                if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)&& org.apache.commons.lang3.StringUtils.isNoneBlank(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson())){
-                    JSONObject salaryRuleJsonObject = JSONObject.parseObject(teacherDefaultMusicGroupSalaryWithTeacherId.getSalaryRuleJson());
-                    teacherSalary = salaryRuleJsonObject.getBigDecimal(normalStudentNum.toString());
+                //课程时长与结算单位时长占比
+                BigDecimal classTimeDuty = new BigDecimal(duration);
+                BigDecimal teacherDefaultSalary = new BigDecimal(0);
+
+                //如果结算方式是教师默认课酬
+                if (settlementType.equals(SalarySettlementTypeEnum.TEACHER_DEFAULT.getCode())) {
+                    classTimeDuty = classTimeDuty.divide(new BigDecimal(30), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
+                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                    }
+                } else if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY.getCode())) {
+                    classTimeDuty = classTimeDuty.divide(new BigDecimal(90), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                    if(Objects.nonNull(teacherDefaultMusicGroupSalaryWithTeacherId)){
+                        teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher90MinSalary();
+                    }
                 }
-                if(Objects.isNull(teacherSalary)){
-                    teacherSalary = BigDecimal.ZERO;
+
+                if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(45), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+                } else if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)) {
+                    teacherDefaultSalary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalaryWithTeacherId.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalaryWithTeacherId.getAssistantTeacher30MinSalary();
+                    classTimeDuty = new BigDecimal(duration).divide(new BigDecimal(40), BigDecimal.ZERO.intValue(), BigDecimal.ROUND_DOWN);
                 }
+
+                teacherSalary = teacherDefaultSalary.multiply(classTimeDuty).setScale(2, BigDecimal.ROUND_HALF_UP);
             }else{
                 teacherSalary=courseScheduleTeacherSalary.getExpectSalary();
             }
@@ -719,8 +720,60 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 subsidy = new BigDecimal(0);
             }
             teacherSalary = teacherSalary.add(subsidy);
+
+            //扣除费用
+            BigDecimal deductCost = BigDecimal.ZERO;
+            List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+
+            boolean isCallName = false;
+            List<StudentAttendance> courseStudentAttendance = courseStudentAttendanceMap.get(courseScheduleTeacherSalary.getCourseScheduleId());
+            if(!CollectionUtils.isEmpty(courseStudentAttendance)){
+                long csaNum = courseStudentAttendance.stream().filter(csa -> DateUtil.hoursBetween(csa.getSignInTime(), courseSchedule.getStartClassTime()) < 4).count();
+                if(csaNum>0){
+                    isCallName = true;
+                }
+            }
+
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)){
+                //无签到记录扣除全部课酬
+                deductCost = deductCost.add(teacherSalary);
+            }else{
+                TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+                int signCourseTimeBetween = DateUtil.minutesBetween(teacherAttendance.getSignInTime(), courseSchedule.getStartClassTime());
+                if(Objects.isNull(teacherAttendance.getSignInStatus())){
+                    //未签到扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary);
+                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween>=0&&signCourseTimeBetween<20){
+                    //未提前20分钟打卡扣除50元
+                    deductCost = deductCost.add(new BigDecimal(50));
+                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween<0&&signCourseTimeBetween>-30){
+                    //迟到30分钟内扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())&&signCourseTimeBetween<=-30){
+                    //迟到30分钟及以上扣除全部课酬
+                    deductCost = deductCost.add(teacherSalary);
+                }
+
+                if((Objects.isNull(teacherAttendance.getSignOutStatus())||YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus()))&&isCallName){
+                    if(isCallName){
+                        //异常签退或者未签退,但是正常点名扣除50元课酬
+                        deductCost = deductCost.add(new BigDecimal(50));
+                    }else{
+                        //异常签退或者未签退, 且未点名扣除一半课酬
+                        deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                    }
+                }
+
+                if(!isCallName){
+                    //未点名扣除一半课酬
+                    deductCost = deductCost.add(teacherSalary.divide(new BigDecimal(2)));
+                }
+            }
+
+            BigDecimal finalSalary = teacherSalary.subtract(deductCost);
+
             //更新教师结算信息
-            courseScheduleTeacherSalary.setActualSalary(teacherSalary);
+            courseScheduleTeacherSalary.setActualSalary(finalSalary.compareTo(BigDecimal.ZERO)<0?BigDecimal.ZERO:finalSalary);
             courseScheduleTeacherSalary.setSettlementTime(now);
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }

+ 53 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.ComplaintsStatusEnum.REPEAL;
 import static com.ym.mec.biz.dal.enums.SignInStatusEnum.*;
@@ -202,6 +203,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){
 			//正常签退范围(结束后1小时内)
 			teacherAttendance.setSignOutTime(date);
+			teacherAttendance.setSignOutAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
 			ClassGroup classGroup = classGroupDao.get(courseSchedule.getClassGroupId());
 			teacherAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
 			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0 && DateUtil.minutesBetween(date,classEndDateAdd60Minutes) >= 0){
@@ -219,28 +221,30 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				teacherAttendanceDao.insert(teacherAttendance);
 			}
 
-			CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(teacherAttendance.getCourseScheduleId());
-			if(Objects.isNull(courseHomework)){
-				//新增课堂作业
-				courseHomework=teacherSignOutDto.getCourseHomeworkInfo();
-				courseHomework.setCourseScheduleId(teacherAttendance.getCourseScheduleId());
-				courseHomework.setMusicGroupId(currentCourseDetail.getMusicGroupId());
-				courseHomework.setGroupType(teacherAttendance.getGroupType());
-				courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue());
-				courseHomework.setExpiryDate(DateUtil.addDays(date,7));
-				courseHomework.setExpectNum(courseScheduleDao.countCourseStudentNum(teacherAttendance.getCourseScheduleId()));
-				courseHomeworkService.insert(courseHomework);
-				List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao
-						.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
-								courseHomework.getId());
-				if(CollectionUtils.isEmpty(studentCourseHomeworks)){
-					throw new BizException("此课程没有学生");
+			if(StringUtils.isNotBlank(teacherSignOutDto.getCourseHomeworkInfo().getContent())){
+				CourseHomework courseHomework = courseHomeworkDao.findByCourseSchedule(teacherAttendance.getCourseScheduleId());
+				if(Objects.isNull(courseHomework)){
+					//新增课堂作业
+					courseHomework=teacherSignOutDto.getCourseHomeworkInfo();
+					courseHomework.setCourseScheduleId(teacherAttendance.getCourseScheduleId());
+					courseHomework.setMusicGroupId(currentCourseDetail.getMusicGroupId());
+					courseHomework.setGroupType(teacherAttendance.getGroupType());
+					courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue());
+					courseHomework.setExpiryDate(DateUtil.addDays(date,7));
+					courseHomework.setExpectNum(courseScheduleDao.countCourseStudentNum(teacherAttendance.getCourseScheduleId()));
+					courseHomeworkService.insert(courseHomework);
+					List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao
+							.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(),
+									courseHomework.getId());
+					if(CollectionUtils.isEmpty(studentCourseHomeworks)){
+						throw new BizException("此课程没有学生");
+					}
+					studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
+				}else{
+					courseHomework.setContent(teacherSignOutDto.getCourseHomeworkInfo().getContent());
+					courseHomework.setAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
+					courseHomeworkService.update(courseHomework);
 				}
-				studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks);
-			}else{
-				courseHomework.setContent(teacherSignOutDto.getCourseHomeworkInfo().getContent());
-				courseHomework.setAttachments(teacherSignOutDto.getCourseHomeworkInfo().getAttachments());
-				courseHomeworkService.update(courseHomework);
 			}
 			return result;
 		}
@@ -433,10 +437,22 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	public boolean pushNoSignOutMessage() {
-
 		Integer minutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.SIGN_OUT_MESSAGE_PUSH_MINUTE));;
 
 		List<Mapper> list = teacherAttendanceDao.queryNoSignOutListByOverMinutes(minutes);
+		if(CollectionUtils.isEmpty(list)){
+			return true;
+		}
+		List<Long> courseScheduleIds = list.stream().map(m -> m.getCourseScheduleId().longValue()).collect(Collectors.toList());
+
+		List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
+		Map<Long, CourseSchedule> idCourseMap = courseSchedules.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c, (c1, c2) -> c1));
+
+		List<CourseScheduleTeacherSalary> courseScheduleTeacherSalarys = courseScheduleTeacherSalaryDao.findByCourseSchedules(courseScheduleIds);
+		Map<Long, List<CourseScheduleTeacherSalary>> courseTeacherSalaryMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(courseScheduleTeacherSalarys)){
+			courseTeacherSalaryMap = courseScheduleTeacherSalarys.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+		}
 
 		for (Mapper mapper : list) {
 			Map<Integer, String> receivers = new HashMap<Integer, String>();
@@ -445,9 +461,22 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 			String key = "SignOut_" + userId + "_" + mapper.getCourseScheduleId();
 
+			CourseSchedule courseSchedule = idCourseMap.get(mapper.getCourseScheduleId().longValue());
+
+			List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseTeacherSalaryMap.get(mapper.getCourseScheduleId().longValue());
+			TeachTypeEnum teachType = TeachTypeEnum.BISHOP;
+			if(!CollectionUtils.isEmpty(courseScheduleTeacherSalaries)){
+				for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+					if(mapper.getKey().equals(courseScheduleTeacherSalary.getUserId())){
+						teachType = courseScheduleTeacherSalary.getTeacherRole();
+					}
+				}
+			}
+
 			if (!redisCache.exists(key)) {
 				sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_SIGN_OUT_MESSAGE, receivers, null, 0,
-						"5?courseScheduleId=" + mapper.getCourseScheduleId(), "TEACHER", mapper.getValue());
+						"5?courseScheduleId=" + mapper.getCourseScheduleId() + "&teacherRole=" + teachType.getCode(), "TEACHER",
+						mapper.getValue() + (Objects.isNull(courseSchedule)?"":("(" + DateUtil.format(courseSchedule.getStartClassTime(), "yyyy年MM月dd日 HH时mm分") + ")")));
 				redisCache.put(key, 1, (int) DateUtil.getTomorrowZeroSeconds());
 			}
 		}
@@ -481,6 +510,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		TeacherAttendance teacherAttendanceInfo = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(), courseScheduleId.longValue());
 		teacherSignDetail.setTeacherAttendanceInfo(teacherAttendanceInfo);
 		CourseHomework courseHomewok = courseHomeworkDao.findByCourseSchedule(courseScheduleId.longValue());
+		courseHomewok.setAttachments(teacherAttendanceInfo.getSignOutAttachments());
 		teacherSignDetail.setCourseHomeworkInfo(courseHomewok);
 		return teacherSignDetail;
 	}

+ 17 - 4
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -30,6 +30,7 @@
         <result column="operator_" property="operator"/>
         <result column="complaints_time_" property="complaintsTime"/>
         <result column="current_schedule_id_" property="currentScheduleId"/>
+        <result column="sign_out_attachments_" property="signOutAttachments"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -53,18 +54,18 @@
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
-        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_)
+        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_)
         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})
+        #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId},#{signOutAttachments})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
-        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_)
+        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_,sign_out_attachments_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -73,7 +74,7 @@
             #{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId})
+            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId},#{teacherAttendance.signOutAttachments})
         </foreach>
     </insert>
 
@@ -141,6 +142,9 @@
             <if test="complaintsTime != null">
                 complaints_time_ = #{complaintsTime},
             </if>
+            <if test="signOutAttachments != null">
+                sign_out_attachments_ = #{signOutAttachments},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -421,6 +425,15 @@
             #{courseScheduleId}
         </foreach>
     </select>
+    <select id="findByCourseSchedules" resultMap="TeacherAttendance">
+        SELECT
+        *
+        FROM teacher_attendance
+        WHERE course_schedule_id_ IN
+        <foreach collection="courseScheduleIds" item="courseScheduleId" open="(" close=")" separator=",">
+            #{courseScheduleId}
+        </foreach>
+    </select>
     <select id="findCourseTimeByClassGroup" resultType="java.util.Map">
         SELECT
             course_schedule_id_ AS 'key',

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

@@ -80,6 +80,7 @@ public class TeacherCourseScheduleController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE);
+        SysConfig offlineSignInEarlyForwardTime = sysConfigService.findByParamName(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME);
         SysConfig sysConfigVip = sysConfigService.findByParamName(SysConfigService.ENABLE_STUDENT_ATTENDANCE_TIME_RANGE_VIP);
         SysConfig courseBeforeBufferTime = sysConfigService.findByParamName(SysConfigService.COURSE_BEFORE_BUFFER_TIME);
         SysConfig courseAfterBufferTime = sysConfigService.findByParamName(SysConfigService.COURSE_AFTER_BUFFER_TIME);
@@ -88,6 +89,7 @@ public class TeacherCourseScheduleController extends BaseController {
         Map<String,Object> result = new HashMap<>();
         result.put("rows",teacherCourseSchedulesWithDate);
         result.put("appealHoursRange",4);
+        result.put("offlineSignInEarlyForwardTime", offlineSignInEarlyForwardTime.getParanValue(Integer.class));
         result.put("enableStudentAttendanceTimeRange",sysConfig.getParanValue(Integer.class));
         result.put("enableStudentAttendanceTimeRangeVip",sysConfigVip.getParanValue(Integer.class));
         result.put("joinRoomBeforeTime",studentAttendanceAfterTimeConfig.getParanValue(Integer.class));