Browse Source

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

yonge 4 years ago
parent
commit
2d1dc62015

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

@@ -137,7 +137,7 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto
      * @describe 根据课程统计点名记录
      */
-    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId}")
+    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId} AND remark_ IS NULL")
     int countByCourseSchedule(Long courseScheduleId);
 
     /**

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

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

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

@@ -156,4 +156,15 @@ public interface CourseScheduleTeacherSalaryService extends BaseService<Long, Co
      * @return void
      */
     void closeSalaryConfirm(String month);
+
+    /**
+     * @describe 创建教师课程课酬记录
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @param teacherIds: 教师编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds);
+
 }

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

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

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

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

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

@@ -304,6 +304,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         currentCourseDetail.setCurrentTime(new Date());
         currentCourseDetail.setAdvanceSignInMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)));
         currentCourseDetail.setAttendanceRange(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ATTENDANCE_RANGE)));
+        currentCourseDetail.setAdvanceSignOutMinutes(Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES)));
         return currentCourseDetail;
     }
 
@@ -440,8 +441,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if(!schoolId.equals(prevCourse.getSchoolId())){
 			return true;
 		}
-		int hoursBetween = DateUtil.hoursBetween(prevCourse.getStartClassTime(), startClassTime);
-		if(hoursBetween>1){
+		int minutesBetween = DateUtil.minutesBetween(prevCourse.getEndClassTime(), startClassTime);
+		if(minutesBetween>60){
 			return false;
 		}else{
 			return true;
@@ -2989,7 +2990,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				for (StudentAttendance studentAttendance : studentAttendanceList) {
 					if (studentAttendance.getStatus() != StudentAttendanceStatusEnum.LEAVE
 						|| (studentAttendance.getStatus() == StudentAttendanceStatusEnum.LEAVE
-							&&DateUtil.addHours(studentAttendance.getCreateTime(),4).compareTo(oldCourseSchedule.getStartClassTime())>=0)) {
+							&&StringUtils.isBlank(studentAttendance.getRemark()))) {
 						throw new BizException("{}[{}] {}-{}课程已点名", oldCourseSchedule.getName(), oldCourseSchedule.getId(), DateUtil.dateToString(
 								oldCourseSchedule.getStartClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT), DateUtil.dateToString(
 								oldCourseSchedule.getEndClassTime(), DateUtil.EXPANDED_DATE_TIME_FORMAT));
@@ -3201,10 +3202,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				vipGroupDao.update(vipGroup);
 			}
 
-			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
-                
+			if (newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START) {
 				//如果已结束修改成了未开始,需要更新学生考勤记录
-                studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
+				studentAttendanceDao.deleteStudentAttendancesByCourse(courseScheduleId);
+			}
+
+			if ((newCourseSchedule.getStatus() != oldCourseSchedule.getStatus() && newCourseSchedule.getStatus() == CourseStatusEnum.NOT_START)) {
                 
 				// 清理课程作业
 				courseHomeworkService.delHomwworkByCourseScheduleId(courseScheduleId);

+ 185 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -18,10 +19,8 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 
-import org.apache.poi.util.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -31,6 +30,8 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -86,6 +87,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
     private SysMessageService sysMessageService;
     @Autowired
     private TeacherCourseRewardDao teacherCourseRewardDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private TeacherDefaultPracticeGroupSalaryDao teacherDefaultPracticeGroupSalaryDao;
 
     private static final Logger LOGGER = LoggerFactory
             .getLogger(CourseScheduleTeacherSalaryServiceImpl.class);
@@ -1096,4 +1101,182 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         teacherSalaryComplaintsDao.updateComplaintStatusTuDoneWithMonth(month);
         teacherCourseRewardDao.updateTeacherRewardConfirmStatusWithMonth(month, null, TeacherSalaryConfirmStatus.COMPLETED);
     }
+
+    @Override
+    public List<CourseScheduleTeacherSalary> createTeacherCourseSalary(CourseSchedule courseSchedule, List<Integer> teacherIds) {
+        if(Objects.isNull(courseSchedule.getType())){
+            throw new BizException("请指定课程类型");
+        }
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        Date now = new Date();
+        for (Integer teacherId : teacherIds) {
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+            courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            if(teacherId.equals(courseSchedule.getActualTeacherId())){
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+            }else{
+                courseScheduleTeacherSalary.setTeacherRole(TeachTypeEnum.TEACHING);
+            }
+            courseScheduleTeacherSalary.setUserId(teacherId);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+        }
+        switch (courseSchedule.getGroupType()){
+            case MUSIC:
+                //生成乐团课课酬
+                createMusicGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                break;
+            case VIP:
+                //生成vip课课酬
+                createVipGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                break;
+            case PRACTICE:
+                //生成网管课课酬
+                createPracticeGroupCourseTeacherSalary(courseSchedule, courseScheduleTeacherSalaries);
+                break;
+        }
+        return courseScheduleTeacherSalaries;
+    }
+
+    /**
+     * @describe 创建课程指定教师的课酬记录-乐团课
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @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());
+
+        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 now = new Date();
+        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) {
+            List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
+
+            BigDecimal salary;
+
+            Map<CourseSchedule.CourseScheduleType, TeacherDefaultMusicGroupSalary> collect = teacherSalaryList.stream().collect(Collectors.toMap(TeacherDefaultMusicGroupSalary::getCourseScheduleType, teacherDefaultMusicGroupSalary -> teacherDefaultMusicGroupSalary));
+
+            TeacherDefaultMusicGroupSalary teacherDefaultMusicGroupSalary = collect.get(courseSchedule.getType());
+
+            Teacher teacher = teacherMap.get(courseScheduleTeacherSalary.getUserId());
+            if (teacherDefaultMusicGroupSalary == null) {
+                throw new BizException("请设置" + teacher.getRealName() + "老师的" + courseSchedule.getType().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 = courseScheduleTeacherSalary.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 = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+            }
+
+            //课堂课课酬改为按分钟数计算,并且时长占比向下取整
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.CLASSROOM)){
+                baseSalary = courseScheduleTeacherSalary.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 (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.HIGH)) {
+                salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher30MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher30MinSalary();
+                if (settlementType.equals(SalarySettlementTypeEnum.GRADIENT_SALARY)) {
+                    salary = courseScheduleTeacherSalary.getTeacherRole().equals(TeachTypeEnum.BISHOP) ? teacherDefaultMusicGroupSalary.getMainTeacher90MinSalary() : teacherDefaultMusicGroupSalary.getAssistantTeacher90MinSalary();
+                }
+            }
+            //线上小班课
+            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 + "请调整");
+                }
+                salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal(studentNum.toString());
+            }
+
+            if (courseSchedule.getType().equals(CourseSchedule.CourseScheduleType.MUSIC_NETWORK)) {
+                salary = JSON.parseObject(teacherDefaultMusicGroupSalary.getSalaryRuleJson()).getBigDecimal("1");
+            }
+
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(courseSchedule.getGroupType());
+            courseScheduleTeacherSalary.setMusicGroupId(courseSchedule.getMusicGroupId());
+            courseScheduleTeacherSalary.setExpectSalary(salary);
+            courseScheduleTeacherSalary.setClassGroupId(courseSchedule.getClassGroupId());
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+        }
+    }
+
+    /**
+     * @describe 创建课程指定教师的课酬记录-VIP课
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    private void createVipGroupCourseTeacherSalary(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);
+            courseScheduleTeacherSalary.setExpectSalary(courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary"));
+        }
+    }
+
+    /**
+     * @describe 创建课程指定教师的课酬记录-网管课
+     * @author Joburgess
+     * @date 2020.10.22
+     * @param courseSchedule: 课程计划
+     * @param courseScheduleTeacherSalaries: 教师课酬记录基本信息
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary>
+     */
+    private void createPracticeGroupCourseTeacherSalary(CourseSchedule courseSchedule, List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries){
+        List<Integer> teacherIds = courseScheduleTeacherSalaries.stream().map(CourseScheduleTeacherSalary::getUserId).collect(Collectors.toList());
+
+        List<TeacherDefaultPracticeGroupSalary> allTeacherDefaultPracticeGroupSalaryList = teacherDefaultPracticeGroupSalaryDao.queryByUserIdList(teacherIds);
+        Map<Integer, List<TeacherDefaultPracticeGroupSalary>> teacherSalaryMap = allTeacherDefaultPracticeGroupSalaryList.stream().collect(Collectors.groupingBy(TeacherDefaultPracticeGroupSalary::getUserId));
+        for (CourseScheduleTeacherSalary courseScheduleTeacherSalary : courseScheduleTeacherSalaries) {
+            final List<TeacherDefaultPracticeGroupSalary> teacherDefaultPracticeGroupSalaryList = teacherSalaryMap.get(courseScheduleTeacherSalary.getUserId());
+            if (teacherDefaultPracticeGroupSalaryList != null && teacherDefaultPracticeGroupSalaryList.size() > 0) {
+                courseScheduleTeacherSalary.setExpectSalary(teacherDefaultPracticeGroupSalaryList.get(0).getMainTeacherSalary());
+            } else {
+                throw new BizException("请设置老师 的网管课课酬");
+            }
+        }
+    }
 }

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

@@ -110,7 +110,9 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		teacherAttendance.setMusicGroupId(currentCourseDetail.getMusicGroupId());
 		teacherAttendance.setClassGroupId(currentCourseDetail.getClassId());
 		teacherAttendance.setRemark(teacherSignOutDto.getTeacherAttendanceInfo().getRemark());
+		teacherAttendance.setSignOutRemark(teacherSignOutDto.getTeacherAttendanceInfo().getSignOutRemark());
 		int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
+		int advanceSignOutMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_OUT_MINUTES));
 		int offlineSignInEarlyForwardTime = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.OFFLINE_SIGN_IN_EARLY_FORWARD_TIME));
 
 		CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId());
@@ -133,7 +135,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		//上课时间
 		Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 60);
+		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, advanceSignOutMinutes);
 		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, offlineSignInEarlyForwardTime * -1);
 		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1);
 		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){
@@ -185,7 +187,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 				if(!isInScore){
 					teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
 				}
-			}else if(date.compareTo(add20Minutes) > 0&&date.compareTo(add60Minutes) < 0){
+			}else if(date.compareTo(add20Minutes) > 0||date.compareTo(add60Minutes) < 0){
 				if(StringUtils.isEmpty(teacherAttendance.getRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){
 					//当前为异常签到,请填写原因!
 					result.put("status",2);

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

@@ -2323,7 +2323,7 @@
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
             LEFT JOIN organization o ON cs.organ_id_=o.id_
-            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_
+            LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cs.id_ AND sa.remark_ IS NULL
             <include refid="endFindCourseSchedulesCondition"/>
         GROUP BY cs.id_
         ORDER BY course_start_time_,cs.id_