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);
+ }
+ }
+ }
+
}
}