Selaa lähdekoodia

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

zouxuan 5 vuotta sitten
vanhempi
commit
03e7eb62cd
17 muutettua tiedostoa jossa 721 lisäystä ja 43 poistoa
  1. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  2. 46 29
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java
  3. 167 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherAttendanceComplaintsDto.java
  4. 66 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  5. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ComplaintsStatusEnum.java
  6. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  7. 62 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherAttendanceComplaintsQueryInfo.java
  8. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherCloseQueryInfo.java
  9. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  10. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  11. 132 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  12. 16 4
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  13. 89 0
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  14. 3 0
      mec-task/src/main/java/com/ym/mec/task/jobs/PushTeacherExceptionAttendanceTask.java
  15. 14 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherAttendanceController.java
  16. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherCourseScheduleController.java
  17. 24 0
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherAttendanceController.java

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.Mapper;
-import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
-import com.ym.mec.biz.dal.dto.TeacherAttendancesDto;
-import com.ym.mec.biz.dal.dto.TeacherPersonalAttendanceDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.common.dal.BaseDAO;
@@ -219,4 +216,18 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * @return
 	 */
     Set<Integer> queryTeacherExceptionAttendance(String format);
+
+	/**
+	 * 获取教师课时申述列表
+	 * @param params
+	 * @return
+	 */
+	List<TeacherAttendanceComplaintsDto> queryTeacherAttendanceComplaints(Map<String, Object> params);
+
+	/**
+	 * COUNT教师课时申述列表
+	 * @param params
+	 * @return
+	 */
+	int countTeacherAttendanceComplaints(Map<String, Object> params);
 }

+ 46 - 29
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleDto.java

@@ -35,18 +35,15 @@ public class CourseScheduleDto extends CourseSchedule {
     @ApiModelProperty(value = "班级编号,房间号",required = false)
     private String sealClassId;
 
-    @ApiModelProperty(value = "签到状态(1正常,0异常,3未签到)",required = false)
+    /*@ApiModelProperty(value = "签到状态(1正常,0异常,3未签到)",required = false)
     private Integer signInStatus;
 
     @ApiModelProperty(value = "签退状态(11正常,0异常,3未签到)",required = false)
     private Integer signOutStatus;
-
+*/
     @ApiModelProperty(value = "教师角色")
     private TeachTypeEnum teacherRole;
 
-    @ApiModelProperty(value = "投诉状态")
-    private Integer complaintStatus;
-
     private String subjectName;
 
     private String subjectId;
@@ -69,8 +66,52 @@ public class CourseScheduleDto extends CourseSchedule {
 
     private Integer studentId;
 
+    //是否提交过申述0否1是
+    private int isComplaints;
+
+    //申述状态0拒绝1通过2待处理3已撤销
+    private Integer complaintsStatus;
+
+    //申述内容
+    private String complaintsContent;
+
+    //处理结果
+    private String disposeContent;
+
     private int isNew;
 
+    public Integer getComplaintsStatus() {
+        return complaintsStatus;
+    }
+
+    public void setComplaintsStatus(Integer complaintsStatus) {
+        this.complaintsStatus = complaintsStatus;
+    }
+
+    public String getComplaintsContent() {
+        return complaintsContent;
+    }
+
+    public void setComplaintsContent(String complaintsContent) {
+        this.complaintsContent = complaintsContent;
+    }
+
+    public String getDisposeContent() {
+        return disposeContent;
+    }
+
+    public void setDisposeContent(String disposeContent) {
+        this.disposeContent = disposeContent;
+    }
+
+    public int getIsComplaints() {
+        return isComplaints;
+    }
+
+    public void setIsComplaints(int isComplaints) {
+        this.isComplaints = isComplaints;
+    }
+
     public int getIsNew() {
         return isNew;
     }
@@ -135,14 +176,6 @@ public class CourseScheduleDto extends CourseSchedule {
         this.subjectName = subjectName;
     }
 
-    public Integer getComplaintStatus() {
-        return complaintStatus;
-    }
-
-    public void setComplaintStatus(Integer complaintStatus) {
-        this.complaintStatus = complaintStatus;
-    }
-
     public TeachTypeEnum getTeacherRole() {
         return teacherRole;
     }
@@ -167,22 +200,6 @@ public class CourseScheduleDto extends CourseSchedule {
         this.totalStudentNum = totalStudentNum;
     }
 
-    public Integer getSignInStatus() {
-        return signInStatus;
-    }
-
-    public void setSignInStatus(Integer signInStatus) {
-        this.signInStatus = signInStatus;
-    }
-
-    public Integer getSignOutStatus() {
-        return signOutStatus;
-    }
-
-    public void setSignOutStatus(Integer signOutStatus) {
-        this.signOutStatus = signOutStatus;
-    }
-
     public String getSealClassId() {
         return sealClassId;
     }

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

@@ -0,0 +1,167 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.ComplaintsStatusEnum;
+import com.ym.mec.biz.dal.enums.SignInStatusEnum;
+import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
+
+public class TeacherAttendanceComplaintsDto{
+    private String organName;
+
+    private Long teacherAttendanceId;
+
+    private Long courseScheduleId;
+
+    private String courseScheduleName;
+
+    private String courseScheduleTime;
+
+    private String courseScheduleStartTime;
+
+    private String courseScheduleEndTime;
+
+    private SignInStatusEnum signInStatus;
+
+    private SignOutStatusEnum signOutStatus;
+
+    private String teacherName;
+
+    private ComplaintsStatusEnum complaintsStatusEnum;
+
+    private String operatorName;
+
+    private String signInTime;
+
+    private String signOutTime;
+
+    private String complaintsContent;
+
+    private String disposeContent;
+
+    public Long getTeacherAttendanceId() {
+        return teacherAttendanceId;
+    }
+
+    public void setTeacherAttendanceId(Long teacherAttendanceId) {
+        this.teacherAttendanceId = teacherAttendanceId;
+    }
+
+    public String getCourseScheduleEndTime() {
+        return courseScheduleEndTime;
+    }
+
+    public void setCourseScheduleEndTime(String courseScheduleEndTime) {
+        this.courseScheduleEndTime = courseScheduleEndTime;
+    }
+
+    public String getCourseScheduleStartTime() {
+        return courseScheduleStartTime;
+    }
+
+    public void setCourseScheduleStartTime(String courseScheduleStartTime) {
+        this.courseScheduleStartTime = courseScheduleStartTime;
+    }
+
+    public String getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(String signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public String getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(String signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public String getComplaintsContent() {
+        return complaintsContent;
+    }
+
+    public void setComplaintsContent(String complaintsContent) {
+        this.complaintsContent = complaintsContent;
+    }
+
+    public String getDisposeContent() {
+        return disposeContent;
+    }
+
+    public void setDisposeContent(String disposeContent) {
+        this.disposeContent = disposeContent;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseScheduleName() {
+        return courseScheduleName;
+    }
+
+    public void setCourseScheduleName(String courseScheduleName) {
+        this.courseScheduleName = courseScheduleName;
+    }
+
+    public String getCourseScheduleTime() {
+        return courseScheduleTime;
+    }
+
+    public void setCourseScheduleTime(String courseScheduleTime) {
+        this.courseScheduleTime = courseScheduleTime;
+    }
+
+    public SignInStatusEnum getSignInStatus() {
+        return signInStatus;
+    }
+
+    public void setSignInStatus(SignInStatusEnum signInStatus) {
+        this.signInStatus = signInStatus;
+    }
+
+    public SignOutStatusEnum getSignOutStatus() {
+        return signOutStatus;
+    }
+
+    public void setSignOutStatus(SignOutStatusEnum signOutStatus) {
+        this.signOutStatus = signOutStatus;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public ComplaintsStatusEnum getComplaintsStatusEnum() {
+        return complaintsStatusEnum;
+    }
+
+    public void setComplaintsStatusEnum(ComplaintsStatusEnum complaintsStatusEnum) {
+        this.complaintsStatusEnum = complaintsStatusEnum;
+    }
+
+    public String getOperatorName() {
+        return operatorName;
+    }
+
+    public void setOperatorName(String operatorName) {
+        this.operatorName = operatorName;
+    }
+}

+ 66 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -1,10 +1,9 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.enums.ComplaintsStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-
 import io.swagger.annotations.ApiModelProperty;
-
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
@@ -61,6 +60,9 @@ public class TeacherAttendance {
 	/**  */
 	private java.util.Date createTime;
 
+	//申述提交时间
+	private java.util.Date complaintsTime;
+
 	private String signInLongitudeLatitude;
 
 	private String signOutLongitudeLatitude;
@@ -69,6 +71,68 @@ public class TeacherAttendance {
 
 	private Integer update;
 
+	private int isComplaints;
+
+	//申述状态0拒绝1通过2待处理3已撤销
+	private ComplaintsStatusEnum complaintsStatus;
+
+	//申述内容
+	private String complaintsContent;
+
+	//处理结果
+	private String disposeContent;
+
+	//处理结果
+	private Integer operator;
+
+	public Date getComplaintsTime() {
+		return complaintsTime;
+	}
+
+	public void setComplaintsTime(Date complaintsTime) {
+		this.complaintsTime = complaintsTime;
+	}
+
+	public Integer getOperator() {
+		return operator;
+	}
+
+	public void setOperator(Integer operator) {
+		this.operator = operator;
+	}
+
+	public int getIsComplaints() {
+		return isComplaints;
+	}
+
+	public void setIsComplaints(int isComplaints) {
+		this.isComplaints = isComplaints;
+	}
+
+	public ComplaintsStatusEnum getComplaintsStatus() {
+		return complaintsStatus;
+	}
+
+	public void setComplaintsStatus(ComplaintsStatusEnum complaintsStatus) {
+		this.complaintsStatus = complaintsStatus;
+	}
+
+	public String getComplaintsContent() {
+		return complaintsContent;
+	}
+
+	public void setComplaintsContent(String complaintsContent) {
+		this.complaintsContent = complaintsContent;
+	}
+
+	public String getDisposeContent() {
+		return disposeContent;
+	}
+
+	public void setDisposeContent(String disposeContent) {
+		this.disposeContent = disposeContent;
+	}
+
 	public String getSchoolLongitudeLatitude() {
 		return schoolLongitudeLatitude;
 	}

+ 39 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ComplaintsStatusEnum.java

@@ -0,0 +1,39 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * '申述状态0拒绝1通过2待处理3已撤销
+ */
+public enum ComplaintsStatusEnum implements BaseEnum<Integer, ComplaintsStatusEnum> {
+	REJECT(0, "拒绝"),
+	PASS(1, "通过"),
+	WAIT(2, "待处理"),
+	REPEAL(3, "撤销");
+
+	private Integer code;
+
+	private String msg;
+
+	ComplaintsStatusEnum(Integer code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(Integer code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public Integer getCode() {
+		return this.code;
+	}
+}

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

@@ -91,6 +91,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TEACHER_PUSH_NAMES_MESSAGE("TEACHER_PUSH_NAMES_MESSAGE", "点名提醒"),
     TEACHER_PUSH_SIGN_OUT_MESSAGE("TEACHER_PUSH_SIGN_OUT_MESSAGE", "签退提醒"),
     TEACHER_PUSH_JOB_WAIT_REPLY("TEACHER_PUSH_JOB_WAIT_REPLY", "作业待回复"),
+    TEACHER_ATTENDANCE_COMPLAINTS_RESULT("TEACHER_ATTENDANCE_COMPLAINTS_RESULT", "考勤申述结果"),
     TEACHER_PUSH_SUBSTITUTE_PLAN("TEACHER_PUSH_SUBSTITUTE_PLAN", "代课安排"),
     TEACHER_PUSH_LEAVE_RESULT("TEACHER_PUSH_LEAVE_RESULT", "请假结果"),
     TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT("TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT", "课时调整结果"),

+ 62 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherAttendanceComplaintsQueryInfo.java

@@ -0,0 +1,62 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class TeacherAttendanceComplaintsQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "分部编号")
+    private String organId;
+
+    @ApiModelProperty(value = "申述时间")
+    private String complaintsTime;
+
+    @ApiModelProperty(value = "申述状态")
+    private String complaintsStatus;
+
+    @ApiModelProperty(value = "课程开始时间")
+    private String courseScheduleStartDate;
+
+    @ApiModelProperty(value = "课程结束时间")
+    private String courseScheduleEndDate;
+
+    public String getCourseScheduleStartDate() {
+        return courseScheduleStartDate;
+    }
+
+    public void setCourseScheduleStartDate(String courseScheduleStartDate) {
+        this.courseScheduleStartDate = courseScheduleStartDate;
+    }
+
+    public String getCourseScheduleEndDate() {
+        return courseScheduleEndDate;
+    }
+
+    public void setCourseScheduleEndDate(String courseScheduleEndDate) {
+        this.courseScheduleEndDate = courseScheduleEndDate;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getComplaintsTime() {
+        return complaintsTime;
+    }
+
+    public void setComplaintsTime(String complaintsTime) {
+        this.complaintsTime = complaintsTime;
+    }
+
+    public String getComplaintsStatus() {
+        return complaintsStatus;
+    }
+
+    public void setComplaintsStatus(String complaintsStatus) {
+        this.complaintsStatus = complaintsStatus;
+    }
+}

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherCloseQueryInfo.java

@@ -34,6 +34,14 @@ public class TeacherCloseQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "分部")
     private String organId;
 
+    public String getCourseScheduleStatus() {
+        return courseScheduleStatus;
+    }
+
+    public void setCourseScheduleStatus(String courseScheduleStatus) {
+        this.courseScheduleStatus = courseScheduleStatus;
+    }
+
     public String getSignOutStatus() {
         return signOutStatus;
     }

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java

@@ -1,12 +1,15 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.TeacherAbnormalAttendanceInfoDto;
+import com.ym.mec.biz.dal.dto.TeacherAttendanceComplaintsDto;
 import com.ym.mec.biz.dal.dto.TeacherAttendanceDetailDto;
 import com.ym.mec.biz.dal.dto.TeacherSignOutDto;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
+import com.ym.mec.biz.dal.page.TeacherAttendanceComplaintsQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.Date;
@@ -137,4 +140,37 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	 * 推送教师异常考勤
 	 */
     void pushTeacherExceptionAttendanceTask();
+
+	/**
+	 * 提交考勤申述
+	 * @param courseScheduleId
+	 * @param content
+	 */
+	void addComplaints(Long courseScheduleId, String content);
+
+	/**
+	 * 撤销考勤申述
+	 * @param courseScheduleId
+	 */
+	void repealComplaints(Long courseScheduleId);
+
+	/**
+	 * 获取教师申述列表
+	 * @param queryInfo
+	 */
+	PageInfo<TeacherAttendanceComplaintsDto> queryTeacherAttendanceComplaints(TeacherAttendanceComplaintsQueryInfo queryInfo);
+
+	/**
+	 * 同意异常考勤申述
+	 * @param signInStatus
+	 * @param signOutStatus
+	 * @param teacherAttendanceId
+	 */
+	void agreeTeacherAttendanceComplaints(Integer signInStatus, Integer signOutStatus, long teacherAttendanceId,String content);
+
+	/**
+	 * 拒绝教师课酬申述
+	 * @param teacherAttendanceId
+	 */
+	void rejectTeacherAttendanceComplaints(long teacherAttendanceId,String content);
 }

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

@@ -997,11 +997,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             }
 			List<CourseScheduleReview> courseScheduleReviews = idCourseReview.get(courseScheduleDto.getId().intValue());
             if(!CollectionUtils.isEmpty(courseScheduleReviews)){
-				courseScheduleDto.setComplaintStatus(1);
+				courseScheduleDto.setComplaintsStatus(1);
 				CourseScheduleReview courseScheduleReview = courseScheduleReviews.get(0);
 				courseScheduleDto.setReviewId(courseScheduleReview.getId());
 			}else{
-            	courseScheduleDto.setComplaintStatus(0);
+            	courseScheduleDto.setComplaintsStatus(0);
 			}
 		}
         return teacherCourseSchedulesWithDate;

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

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.TeacherAttendanceComplaintsQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
@@ -25,6 +26,7 @@ import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 
+import static com.ym.mec.biz.dal.enums.ComplaintsStatusEnum.REPEAL;
 import static com.ym.mec.biz.dal.enums.SignInStatusEnum.*;
 
 @Service
@@ -601,7 +603,136 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 		teacherId.forEach(e->{
 			receivers.put(e,e.toString());
 		});
-		String url = new StringBuffer("8?").append(sysConfigDao.findConfigValue(SysConfigService.TEACHER_BASE_URL)).append("/#/appealResult?date=").append(format).toString();
+		String url = new StringBuffer("10?date=").append(format).toString();
 		sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_TEACHER_EXCEPTION_ATTENDANCE,receivers,null,0,url,"TEACHER",format);
 	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public synchronized void addComplaints(Long courseScheduleId, String content) {
+		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("课程不存在");
+		}
+		//如果课程时间在两天前
+		Date date = new Date();
+        int i = DateUtil.daysBetween(courseSchedule.getClassDate(), DateUtil.stringToDate(DateUtil.format(date,DateUtil.DEFAULT_PATTERN),DateUtil.DEFAULT_PATTERN));
+        if(i > 1){
+			throw new BizException("超出可申述时间");
+		}
+		teacherAttendance.setIsComplaints(1);
+		teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.WAIT);
+		teacherAttendance.setComplaintsContent(content);
+		teacherAttendance.setComplaintsTime(date);
+		teacherAttendanceDao.update(teacherAttendance);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void repealComplaints(Long courseScheduleId) {
+		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() == ComplaintsStatusEnum.WAIT){
+			teacherAttendance.setComplaintsStatus(REPEAL);
+			teacherAttendanceDao.update(teacherAttendance);
+		}else {
+			throw new BizException("操作失败: 当前申述状态不允许撤销");
+		}
+	}
+
+	@Override
+	public PageInfo<TeacherAttendanceComplaintsDto> queryTeacherAttendanceComplaints(TeacherAttendanceComplaintsQueryInfo queryInfo) {
+		PageInfo<TeacherAttendanceComplaintsDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<TeacherAttendanceComplaintsDto> dataList = null;
+		int count = teacherAttendanceDao.countTeacherAttendanceComplaints(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = teacherAttendanceDao.queryTeacherAttendanceComplaints(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@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("考勤信息不存在");
+		}
+		if(teacherAttendance.getComplaintsStatus() == ComplaintsStatusEnum.WAIT){
+			if(signInStatus != null){
+				teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
+			}
+			if(signOutStatus != null){
+				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
+			}
+			teacherAttendance.setDisposeContent(content);
+			teacherAttendance.setOperator(user.getId());
+			teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.PASS);
+			teacherAttendanceDao.update(teacherAttendance);
+			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());
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
+					format,courseSchedule.getName(),"通过");
+		}else {
+			throw new BizException("操作失败: 当前申述状态不允许该操作");
+		}
+	}
+
+	@Override
+	public void rejectTeacherAttendanceComplaints(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("考勤信息不存在");
+		}
+		if(teacherAttendance.getComplaintsStatus() == ComplaintsStatusEnum.WAIT){
+			teacherAttendance.setDisposeContent(content);
+			teacherAttendance.setOperator(user.getId());
+			teacherAttendance.setComplaintsStatus(ComplaintsStatusEnum.REJECT);
+			teacherAttendanceDao.update(teacherAttendance);
+			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());
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_ATTENDANCE_COMPLAINTS_RESULT, receivers, null, 0, null, "TEACHER",
+					format,courseSchedule.getName(),"拒绝");
+		}else {
+			throw new BizException("操作失败: 当前申述状态不允许该操作");
+		}
+	}
 }

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

@@ -53,8 +53,14 @@
         <result column="name_" property="classGroupName"/>
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="school_name_" property="schoolName"/>
-        <result column="sign_in_status_" property="signInStatus"/>
-        <result column="sign_out_status_" property="signOutStatus"/>
+        <result column="sign_in_status_" property="signInStatusEnum" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="sign_out_status_" property="signOutStatusEnum" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="sign_in_time_" property="signInTime"/>
+        <result column="sign_out_time_" property="signOutTime"/>
+        <result column="is_complaints_" property="isComplaints"/>
+        <result column="complaints_status_" property="complaintsStatus"/>
+        <result column="complaints_content_" property="complaintsContent"/>
+        <result column="dispose_content_" property="disposeContent"/>
         <result column="seal_class_id_" property="sealClassId"/>
         <result column="total_student_num_" property="totalStudentNum"/>
         <result column="expect_student_num_" property="expectStudentNum"/>
@@ -697,8 +703,14 @@
                csts.teacher_role_,
                cs.schoole_id_,
                s.name_                                           school_name_,
-               if(ta.sign_in_status_ IS NULL, 0, 1)              sign_in_status_,
-               if(ta.sign_out_status_ IS NULL, 0, 1)             sign_out_status_,
+               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_,
+               ta.is_complaints_,
+               ta.sign_out_time_,
+               ta.sign_in_time_,
+               ta.complaints_status_,
+               ta.complaints_content_,
+               ta.dispose_content_,
                cs.teach_mode_
         FROM course_schedule_teacher_salary csts
                  LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_

+ 89 - 0
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -23,6 +23,12 @@
         <result column="sign_in_longitude_latitude_" property="signInLongitudeLatitude"/>
         <result column="sign_out_longitude_latitude_" property="signOutLongitudeLatitude"/>
         <result column="longitude_latitude_" property="schoolLongitudeLatitude"/>
+        <result column="is_complaints_" property="isComplaints"/>
+        <result column="complaints_status_" property="complaintsStatus" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="complaints_content_" property="complaintsContent"/>
+        <result column="dispose_content_" property="disposeContent"/>
+        <result column="operator_" property="operator"/>
+        <result column="complaints_time_" property="complaintsTime"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -118,6 +124,24 @@
             <if test="signOutLongitudeLatitude != null">
                 sign_out_longitude_latitude_ = #{signOutLongitudeLatitude},
             </if>
+            <if test="isComplaints != null">
+                is_complaints_ = #{isComplaints},
+            </if>
+            <if test="complaintsStatus != null">
+                complaints_status_ = #{complaintsStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
+            <if test="complaintsContent != null and complaintsContent != ''">
+                complaints_content_ = #{complaintsContent},
+            </if>
+            <if test="disposeContent != null and disposeContent != ''">
+                dispose_content_ = #{disposeContent},
+            </if>
+            <if test="operator != null">
+                operator_ = #{operator},
+            </if>
+            <if test="complaintsTime != null">
+                complaints_time_ = #{complaintsTime},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>
@@ -438,6 +462,71 @@
         WHERE cs.class_date_ = #{format} AND ta.teacher_id_ = cs.actual_teacher_id_
         AND (ta.sign_in_status_ IS NULL OR ta.sign_in_status_ = 0 OR ta.sign_out_status_ IS NULL OR ta.sign_out_status_ = 0)
     </select>
+    <resultMap id="TeacherAttendanceComplaintsDtoMap" type="com.ym.mec.biz.dal.dto.TeacherAttendanceComplaintsDto">
+        <result property="organName" column="organ_name_"/>
+        <result property="courseScheduleId" column="course_schedule_id_"/>
+        <result property="courseScheduleName" column="course_schedule_name_"/>
+        <result property="courseScheduleTime" column="course_schedule_time_"/>
+        <result property="courseScheduleStartTime" column="start_class_time_"/>
+        <result property="courseScheduleEndTime" column="end_class_time_"/>
+        <result property="signInStatus" column="sign_in_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="signOutStatus" column="sign_out_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="teacherName" column="teacher_name_"/>
+        <result property="complaintsStatusEnum" column="complaints_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="operatorName" column="operator_name_"/>
+        <result property="signInTime" column="sign_in_time_"/>
+        <result property="signOutTime" column="sign_out_time_"/>
+        <result property="complaintsContent" column="complaints_content_"/>
+        <result property="disposeContent" column="dispose_content_"/>
+        <result property="teacherAttendanceId" column="teacher_attendance_id_"/>
+    </resultMap>
+    <select id="queryTeacherAttendanceComplaints" resultMap="TeacherAttendanceComplaintsDtoMap">
+        SELECT o.name_ organ_name_,ta.course_schedule_id_,cs.name_ course_schedule_name_,cs.class_date_ course_schedule_time_,
+        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_
+        FROM teacher_attendance ta
+        LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
+        LEFT JOIN teacher t ON t.id_ = su.id_
+        LEFT JOIN organization o ON o.id_ = t.organ_id_
+        LEFT JOIN sys_user suo ON suo.id_ = ta.operator_
+        LEFT JOIN course_schedule cs ON cs.id_ = ta.course_schedule_id_
+        <include refid="queryTeacherAttendanceComplaintsSql"/>
+        ORDER BY cs.class_date_ ASC,cs.start_class_time_ ASC
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryTeacherAttendanceComplaintsSql">
+        <where>
+            cs.actual_teacher_id_ = ta.teacher_id_ AND ta.is_complaints_ = 1
+            <if test="organId != null and organId != ''">
+                AND t.organ_id_ = #{organId}
+            </if>
+            <if test="complaintsTime != null and complaintsTime != ''">
+                AND ta.complaints_time_ = #{complaintsTime}
+            </if>
+            <if test="complaintsStatus != null and complaintsStatus != ''">
+                AND ta.complaints_status_ = #{complaintsStatus}
+            </if>
+            <if test="search != null and search != ''">
+                AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR ta.teacher_id_ = #{search})
+            </if>
+            <if test="courseScheduleStartDate != null and courseScheduleStartDate != ''">
+                AND cs.class_date_ >= #{courseScheduleStartDate}
+            </if>
+            <if test="courseScheduleEndDate != null and courseScheduleEndDate != ''">
+                AND cs.class_date_ &lt;= #{courseScheduleEndDate}
+            </if>
+        </where>
+    </sql>
+    <select id="countTeacherAttendanceComplaints" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT ta.id_)
+        FROM teacher_attendance ta
+        LEFT JOIN sys_user su ON ta.teacher_id_ = su.id_
+        LEFT JOIN teacher t ON t.id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = ta.course_schedule_id_
+        <include refid="queryTeacherAttendanceComplaintsSql"/>
+    </select>
 
     <update id="updateViPSignOutStatus" parameterType="string">
     	UPDATE teacher_attendance SET sign_out_status_ = 1,sign_out_time_= now()

+ 3 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/PushTeacherExceptionAttendanceTask.java

@@ -6,6 +6,9 @@ import com.ym.mec.task.core.TaskException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+/**
+ * 教师异常考勤推送
+ */
 @Service
 public class PushTeacherExceptionAttendanceTask extends BaseTask {
 

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

@@ -67,4 +67,18 @@ public class TeacherAttendanceController extends BaseController {
         }
         return succeed(teacherAttendanceService.getTeacherSignDetail(courseScheduleId, user.getId()));
     }
+
+    @ApiOperation(value = "提交考勤申述")
+    @PostMapping("/addComplaints")
+    public Object addComplaints(Long courseScheduleId,String content){
+        teacherAttendanceService.addComplaints(courseScheduleId,content);
+        return succeed();
+    }
+
+    @ApiOperation(value = "撤销考勤申述")
+    @PostMapping("/repealComplaints")
+    public Object repealComplaints(Long courseScheduleId){
+        teacherAttendanceService.repealComplaints(courseScheduleId);
+        return succeed();
+    }
 }

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

@@ -19,7 +19,6 @@ import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.CourseScheduleService;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.QueryInfo;
@@ -123,6 +122,7 @@ public class TeacherCourseScheduleController extends BaseController {
         Map<String,Object> result = new HashMap<>();
         result.put("rows",teacherCourseSchedulesWithDate);
         result.put("appealDaysRange",1);
+        result.put("complaintsDaysRange",1);
         return succeed(result);
     }
 

+ 24 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TeacherAttendanceController.java

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.TeacherAttendance;
+import com.ym.mec.biz.dal.page.TeacherAttendanceComplaintsQueryInfo;
 import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.biz.service.TeacherAttendanceService;
 import com.ym.mec.common.controller.BaseController;
@@ -85,4 +86,27 @@ public class TeacherAttendanceController extends BaseController {
         teacherAttendanceService.updateTeacherAttendance(teacherAttendance);
         return succeed();
     }
+
+    @ApiOperation(value = "获取教师考勤申述列表")
+    @PostMapping("/queryTeacherAttendanceComplaints")
+    @PreAuthorize("@pcs.hasPermissions('teacherAttendance/queryTeacherAttendanceComplaints')")
+    public Object queryTeacherAttendanceComplaints(TeacherAttendanceComplaintsQueryInfo queryInfo){
+        return succeed(teacherAttendanceService.queryTeacherAttendanceComplaints(queryInfo));
+    }
+
+    @ApiOperation(value = "同意教师异常考勤申述")
+    @PostMapping("/agreeTeacherAttendanceComplaints")
+    @PreAuthorize("@pcs.hasPermissions('teacherAttendance/agreeTeacherAttendanceComplaints')")
+    public Object agreeTeacherAttendanceComplaints(Integer signInStatus,Integer signOutStatus,long teacherAttendanceId,String content){
+        teacherAttendanceService.agreeTeacherAttendanceComplaints(signInStatus,signOutStatus,teacherAttendanceId,content);
+        return succeed();
+    }
+
+    @ApiOperation(value = "拒绝教师异常考勤申述")
+    @PostMapping("/rejectTeacherAttendanceComplaints")
+    @PreAuthorize("@pcs.hasPermissions('teacherAttendance/rejectTeacherAttendanceComplaints')")
+    public Object rejectTeacherAttendanceComplaints(long teacherAttendanceId,String content){
+        teacherAttendanceService.rejectTeacherAttendanceComplaints(teacherAttendanceId,content);
+        return succeed();
+    }
 }