diff --git a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AttendanceApi.cs b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AttendanceApi.cs index bd9bedd25..8e0faa69c 100644 --- a/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AttendanceApi.cs +++ b/Learun.Framework.Ultimate V7/Learun.Application.WebApi/Modules/AttendanceApi.cs @@ -19,7 +19,7 @@ namespace Learun.Application.WebApi.Modules { //判断当前时间是否可以打卡 Get["/IsAttendance"] = IsAttendance; - //打卡 + //上下班打卡 Post["/clockin"] = ClockIn; //获取考勤打卡记录 Get["/getrecordpagelist"] = GetRecordPageList; @@ -29,6 +29,11 @@ namespace Learun.Application.WebApi.Modules Post["/clockinStudent"] = ClockInStudent; //打卡记录 Get["/GetTeacherRecord"] = GetTeacherRecord; + + //教师上下课打卡:判断当前打卡状态 + //Get["IsAttendanceTeacher"] = IsAttendanceTeacher; + //教师上下课打卡 + //Post["/clockinTeacher"] = ClockInTeacher; } private ADR_RestrictionIBLL adr_RestrictionBLL = new ADR_RestrictionBLL(); private ADR_RecordIBLL adr_RecordBLL = new ADR_RecordBLL(); @@ -91,7 +96,7 @@ namespace Learun.Application.WebApi.Modules } /// - /// 打卡 + /// 上下班打卡 /// /// /// @@ -103,6 +108,11 @@ namespace Learun.Application.WebApi.Modules return Success("打卡成功"); } + /// + /// 学生打卡 + /// + /// + /// public Response ClockInStudent(dynamic _) { Attendance parameter = this.GetReqData(); @@ -129,5 +139,33 @@ namespace Learun.Application.WebApi.Modules }; return Success(jsonData); } + + /// + /// 教师上下课打卡:判断当前打卡状态 + /// + /// + /// + public Response IsAttendanceTeacher(dynamic _) + { + var res = adr_RestrictionBLL.IsAttendanceTeacher(); + var jsondata = + new + { + data = res + }; + return Success(jsondata); + } + /// + /// 教师上下课打卡 + /// + /// + /// + public Response ClockInTeacher(dynamic _) + { + Attendance parameter = this.GetReqData(); + adr_RestrictionBLL.ClockInTeacher(parameter.ALon, parameter.ALat, parameter.AIsOut, parameter.ARemark, parameter.ADPhoto, parameter.ClockPlace, parameter.LessonSortNo, parameter.ALTId, parameter.ALTOEId); + + return Success("打卡成功"); + } } } \ No newline at end of file diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/TeachAttendance/TeachAttendanceEntity.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/TeachAttendance/TeachAttendanceEntity.cs index 0ecb28ac0..4e4a33467 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/TeachAttendance/TeachAttendanceEntity.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/EducationalAdministration/TeachAttendance/TeachAttendanceEntity.cs @@ -20,30 +20,80 @@ namespace Learun.Application.TwoDevelopment.EducationalAdministration [Column("ID")] public string ID { get; set; } /// - /// 打卡时间 + /// 教师编号 + /// + [Column("EMPNO")] + public string EmpNo { get; set; } + /// + /// 教师姓名 + /// + [Column("EMPNAME")] + public string EmpName { get; set; } + /// + /// 必修课表主键 + /// + [Column("ALTID")] + public string ALTId { get; set; } + /// + /// 选修课表主键 + /// + [Column("ALTOEID")] + public string ALTOEId { get; set; } + /// + /// 课程标识:1必修,2选修 + /// + [Column("ALTOEID")] + public string LessonSortNo { get; set; } + /// + /// 考勤类型 0-未定义,1-上课,2-下课, + /// + [Column("ADTYPE")] + public string ADType { get; set; } + /// + /// 考勤时间(服务器时间) + /// + [Column("ADTIME")] + public DateTime? ADTime { get; set; } + /// + /// 打卡时间(考勤机时间) /// [Column("CLOCKTIME")] public DateTime? ClockTime { get; set; } /// - /// 打卡地点 + /// 打卡结果 1正常,2迟到,3早退,6缺勤 + /// + [Column("CLOCKSTATUS")] + public string ClockStatus { get; set; } + /// + /// 打卡地点 /// [Column("CLOCKPLACE")] public string ClockPlace { get; set; } /// - /// 教师编号 + /// 考勤照片 /// - [Column("EMPNO")] - public string EmpNo { get; set; } + [Column("ADPHOTO")] + public string ADPhoto { get; set; } /// - /// 教师姓名 + /// 经度 /// - [Column("EMPNAME")] - public string EmpName { get; set; } + [Column("ALON")] + public decimal ALon { get; set; } + /// + /// 纬度 + /// + [Column("ALAT")] + public decimal ALat { get; set; } + /// + /// 是否外勤 + /// + [Column("AISOUT")] + public bool AIsOut { get; set; } /// /// 备注 /// - [Column("REMARK")] - public string Remark { get; set; } + [Column("AREMARK")] + public string ARemark { get; set; } #endregion #region 扩展操作 diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionBLL.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionBLL.cs index 8c0c13f4d..1c0967481 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionBLL.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionBLL.cs @@ -282,6 +282,62 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement } } + /// + /// 教师上下课打卡:判断当前打卡状态 + /// + /// + public ADR_RestrictionEntity IsAttendanceTeacher() + { + try + { + return aDR_RestrictionService.IsAttendanceTeacher(); + } + catch (Exception ex) + { + if (ex is ExceptionEx) + { + throw; + } + else + { + throw ExceptionEx.ThrowBusinessException(ex); + } + } + } + + /// + /// 教师上下课打卡 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public bool ClockInTeacher(decimal ALon, decimal ALat, bool AIsOut, string ARemark, string ADPhoto, string ClockPlace, + string LessonSortNo, string ALTId, string AlTOEId) + { + try + { + return aDR_RestrictionService.ClockInTeacher(ALon, ALat, AIsOut, ARemark, ADPhoto, ClockPlace, LessonSortNo, ALTId, AlTOEId); + } + catch (Exception ex) + { + if (ex is ExceptionEx) + { + throw; + } + else + { + throw ExceptionEx.ThrowBusinessException(ex); + } + } + } + #endregion } diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionIBLL.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionIBLL.cs index 27fd369b3..56ee4b5a7 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionIBLL.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionIBLL.cs @@ -63,5 +63,26 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement void SaveFormDay(string keyValue, List entity); ADR_RestrictionEntity IsAttendanceStudent(); bool ClockInStudent(decimal ALon, decimal ALat, bool AIsOut, string ARemark, string ADPhoto, string ClockPlace, string LessonSortNo, string ALTId, string AlTOEId); + /// + /// 教师上下课打卡:判断当前打卡状态 + /// + /// + ADR_RestrictionEntity IsAttendanceTeacher(); + + /// + /// 教师上下课打卡 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + bool ClockInTeacher(decimal ALon, decimal ALat, bool AIsOut, string ARemark, string ADPhoto, string ClockPlace, string LessonSortNo, string ALTId, string AlTOEId); + } } diff --git a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionService.cs b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionService.cs index 03f1bf20d..8800fb8b2 100644 --- a/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionService.cs +++ b/Learun.Framework.Ultimate V7/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/PersonnelManagement/ADR_Restriction/ADR_RestrictionService.cs @@ -1190,7 +1190,7 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement //更新最晚下班时间 adrresult.AttendanceType = 1; adrresult.AttendanceTypeString = "正常打卡"; - var userWorkTime= attendancerecordList.Where(m => m.ADType == "1").OrderByDescending(m => m.ADTime).FirstOrDefault()?.ADTime.Value; + var userWorkTime = attendancerecordList.Where(m => m.ADType == "1").OrderByDescending(m => m.ADTime).FirstOrDefault()?.ADTime.Value; var userCloseTime = attendancerecordList.Where(m => m.ADType == "2").OrderByDescending(m => m.ADTime).FirstOrDefault()?.ADTime.Value; adrresult.UserWorkTime = userWorkTime != null ? userWorkTime.ToString() : ""; adrresult.UserCloseTime = userCloseTime != null ? userCloseTime.ToString() : ""; @@ -1775,5 +1775,238 @@ namespace Learun.Application.TwoDevelopment.PersonnelManagement } } } + + /// + /// 教师上下课打卡:判断当前打卡状态 + /// + /// + public ADR_RestrictionEntity IsAttendanceTeacher() + { + try + { + var adrresult = new ADR_RestrictionEntity(); + var userinfo = LoginUserInfo.Get(); + var empInfo = BaseRepository("CollegeMIS").FindEntity(m => m.EmpNo == userinfo.account); + //当前服务器日期 + var datenow = DateTime.Now.ToString("yyyy-MM-dd"); + DateTime datenowdatetime = Convert.ToDateTime(datenow); + var datetimenow = DateTime.Now; + //首先获取考勤规则 + ADR_RestrictionEntity attendancerulEntity = null; + if (empInfo != null) + { + attendancerulEntity = this.BaseRepository("CollegeMIS") + .FindEntity(m => m.REnable == true && m.AType == 2); + } + else + { + adrresult.AttendanceType = 5; + adrresult.AttendanceTypeString = "非教师用户不能签到"; + return adrresult; + } + //考勤范围 + adrresult.GPSLon = attendancerulEntity.GPSLon; + adrresult.GPSLat = attendancerulEntity.GPSLat; + adrresult.GPSRange = attendancerulEntity.GPSRange; + adrresult.GPSAddr = attendancerulEntity.GPSAddr; + //获取课表信息 + //当前学年学期信息 + var say = Common.GetSemesterAndYear(); + //当天课程 + //todo:待完善问题:必修课和选修课时间可能会交叉,不是必修在前,选修在后,则需要必修选修一起根据上课节次升序排序; + //todo:学生打卡也存在待完善问题; + //必修课 + var lessons = BaseRepository("CollegeMIS").FindList(m => m.AcademicYearNo == say.AcademicYearShort && m.Semester == say.Semester + && m.EmpNo == empInfo.EmpNo && m.LessonDate.Value == datenowdatetime).OrderBy(x => Convert.ToInt32(x.LessonTime.Substring(1))); + //当前打卡课程判断 + foreach (var arrangeLessonTermEntity in lessons) + { + TimeSpan start = TimeSpan.Parse(arrangeLessonTermEntity.StartTime); + TimeSpan end = TimeSpan.Parse(arrangeLessonTermEntity.EndTime); + int StuAttendanceEarliestMinute = !string.IsNullOrEmpty(Util.Config.GetValue("StuAttendanceEarliestMinute")) ? Convert.ToInt32(Util.Config.GetValue("StuAttendanceEarliestMinute")) : 0; + //当前时间小于等于上课时间,且大于开课前指定分钟 + if (datetimenow.TimeOfDay <= start && datetimenow.TimeOfDay >= start.Add(-TimeSpan.FromMinutes(StuAttendanceEarliestMinute))) + { + //todo:返回结果集增加班级信息 + adrresult.AttendanceType = 1; + adrresult.AttendanceTypeString = "正常签到"; + adrresult.LessonName = arrangeLessonTermEntity.LessonName; + adrresult.StartTime = arrangeLessonTermEntity.StartTime; + adrresult.EndTime = arrangeLessonTermEntity.EndTime; + adrresult.EmpName = arrangeLessonTermEntity.EmpName; + adrresult.Classroom = BaseRepository("CollegeMIS").FindEntity(m => m.ClassroomNo == arrangeLessonTermEntity.ClassroomNo)?.ClassroomName; + adrresult.LessonSortNo = "1"; + adrresult.ALTId = arrangeLessonTermEntity.ALTId; + //签到记录 + //todo:应该查找上课记录;无则进入正常上课打卡,有则提示已打过卡; + var attendanceEntity = BaseRepository("CollegeMIS").FindEntity(m => m.ALTId == arrangeLessonTermEntity.ALTId && m.EmpNo == arrangeLessonTermEntity.EmpNo); + if (attendanceEntity != null) + { + adrresult.UserWorkTime = attendanceEntity.ClockTime.ToString(); + } + return adrresult; + } + //迟到打卡 + if (datetimenow.TimeOfDay > start && datetimenow.TimeOfDay <= end) + { + adrresult.AttendanceType = 2; + adrresult.AttendanceTypeString = "迟到"; + adrresult.LessonName = arrangeLessonTermEntity.LessonName; + adrresult.StartTime = arrangeLessonTermEntity.StartTime; + adrresult.EndTime = arrangeLessonTermEntity.EndTime; + adrresult.EmpName = arrangeLessonTermEntity.EmpName; + adrresult.Classroom = BaseRepository("CollegeMIS").FindEntity(m => m.ClassroomNo == arrangeLessonTermEntity.ClassroomNo)?.ClassroomName; + adrresult.LessonSortNo = "1"; + adrresult.ALTId = arrangeLessonTermEntity.ALTId; + //签到记录 + //todo:应该查找上课记录;无则进入迟到打卡,有则开始查找下课记录(无则进入早退打卡,有则提示已打过卡;); + var attendanceEntity = BaseRepository("CollegeMIS").FindEntity(m => m.ALTId == arrangeLessonTermEntity.ALTId && m.EmpNo == arrangeLessonTermEntity.EmpNo); + if (attendanceEntity != null) + { + adrresult.UserWorkTime = attendanceEntity.ClockTime.ToString(); + } + return adrresult; + } + //下课打卡 + //todo:当前时间大于下课时间,则查找下课记录;有则进入下一个循环,无则进入下课打卡; + //存在问题:上了一天课都没打卡,时间到了晚上,可以从第一门课开始,每门课都可以一直打下课打卡; + } + //选修课 + var lessonelective = BaseRepository("CollegeMIS").FindList($@"select a.* + from ArrangeLessonTermOfElective a + where a.EmpNo='{empInfo.EmpNo}' + and a.AcademicYearNo='{say.AcademicYearShort}' and a.Semester='{say.Semester}' + and a.LessonDate ='{datenow}' + and a.CheckMark='1' ").OrderBy(x => Convert.ToInt32(x.LessonSection.Substring(1))); + //当前打卡课程判断 + foreach (var arrangeLessonTermEntity in lessonelective) + { + if (arrangeLessonTermEntity.LessonTime.Contains("-")) + { + var lessontime = arrangeLessonTermEntity.LessonTime.Split('-'); + TimeSpan start = TimeSpan.Parse(lessontime[0]); + TimeSpan end = TimeSpan.Parse(lessontime[1]); + int StuAttendanceEarliestMinute = !string.IsNullOrEmpty(Util.Config.GetValue("StuAttendanceEarliestMinute")) ? Convert.ToInt32(Util.Config.GetValue("StuAttendanceEarliestMinute")) : 0; + //当前时间小于等于上课时间,且大于开课前指定分钟 + if (datetimenow.TimeOfDay <= start && datetimenow.TimeOfDay >= start.Add(-TimeSpan.FromMinutes(StuAttendanceEarliestMinute))) + { + adrresult.AttendanceType = 1; + adrresult.AttendanceTypeString = "正常签到"; + adrresult.LessonName = arrangeLessonTermEntity.LessonName; + adrresult.StartTime = lessontime[0]; + adrresult.EndTime = lessontime[1]; + adrresult.EmpName = arrangeLessonTermEntity.EmpName; + adrresult.Classroom = BaseRepository("CollegeMIS").FindEntity(m => m.ClassroomNo == arrangeLessonTermEntity.ClassRoomNo)?.ClassroomName; + adrresult.LessonSortNo = "2"; + adrresult.ALTOEId = arrangeLessonTermEntity.Id; + //签到记录 + var attendanceEntity = BaseRepository("CollegeMIS").FindEntity(m => m.ALTOEId == arrangeLessonTermEntity.Id && m.EmpNo == arrangeLessonTermEntity.EmpNo); + if (attendanceEntity != null) + { + adrresult.UserWorkTime = attendanceEntity.ClockTime.ToString(); + } + return adrresult; + } + //迟到打卡 + if (datetimenow.TimeOfDay > start && datetimenow.TimeOfDay <= end) + { + adrresult.AttendanceType = 2; + adrresult.AttendanceTypeString = "迟到"; + adrresult.LessonName = arrangeLessonTermEntity.LessonName; + adrresult.StartTime = lessontime[0]; + adrresult.EndTime = lessontime[1]; + adrresult.EmpName = arrangeLessonTermEntity.EmpName; + adrresult.Classroom = BaseRepository("CollegeMIS").FindEntity(m => m.ClassroomNo == arrangeLessonTermEntity.ClassRoomNo)?.ClassroomName; + adrresult.LessonSortNo = "2"; + adrresult.ALTOEId = arrangeLessonTermEntity.Id; + //签到记录 + var attendanceEntity = BaseRepository("CollegeMIS").FindEntity(m => m.ALTOEId == arrangeLessonTermEntity.Id && m.EmpNo == arrangeLessonTermEntity.EmpNo); + { + adrresult.UserWorkTime = attendanceEntity.ClockTime.ToString(); + } + return adrresult; + } + } + } + adrresult.AttendanceType = 5; + adrresult.AttendanceTypeString = "不在考勤时间范围"; + return adrresult; + } + catch (Exception ex) + { + if (ex is ExceptionEx) + { + throw; + } + else + { + throw ExceptionEx.ThrowServiceException(ex); + } + } + } + + /// + /// 教师上下课打卡 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public bool ClockInTeacher(decimal aLon, decimal aLat, bool aIsOut, string aRemark, string adPhoto, string clockPlace, string lessonSortNo, string altId, string alToeId) + { + try + { + var userinfo = LoginUserInfo.Get(); + var empinfo = BaseRepository("CollegeMIS").FindEntity(m => m.EmpNo == userinfo.account); + if (empinfo == null) + { + return false; + } + //教学考勤 + Teach_attendanceEntity teach_AttendanceEntity = new Teach_attendanceEntity(); + teach_AttendanceEntity.Create(); + teach_AttendanceEntity.EmpNo = empinfo.EmpNo; + teach_AttendanceEntity.EmpName = empinfo.EmpName; + teach_AttendanceEntity.LessonSortNo = lessonSortNo; + teach_AttendanceEntity.ClockPlace = clockPlace; + teach_AttendanceEntity.ADPhoto = adPhoto; + teach_AttendanceEntity.ALon = aLon; + teach_AttendanceEntity.ALat = aLat; + teach_AttendanceEntity.AIsOut = aIsOut; + teach_AttendanceEntity.ARemark = aRemark; + if (lessonSortNo == "1") + { + teach_AttendanceEntity.ALTId = altId; + //todo:待赋值ADType、ADTime、ClockTime、ClockStatus、 + //todo:判断正常签到、迟到打卡、早退打卡、下课打卡、 + } + if (lessonSortNo == "2") + { + teach_AttendanceEntity.ALTOEId = alToeId; + //todo:待开发ADType、ADTime、ClockTime、ClockStatus + + } + base.BaseRepository("CollegeMIS").Insert(teach_AttendanceEntity); + return true; + } + catch (Exception ex) + { + if (ex is ExceptionEx) + { + throw; + } + else + { + throw ExceptionEx.ThrowServiceException(ex); + } + } + } + } }