1、请假模块申请
2、工作日设置
3、工作时间设置(开始时间、截止时间、上午上班时间、上午下班时间、下午上班时间和下午下班时间)
4、请假实体类
请假表
[Table("KTD_Leaves", "LeaveID")]
public class Leaves: BaseEntity
{
private string leaveID = string.Empty;
[PrimaryKey(PrimaryKeyType.Assign,"LeaveID", DbType.String)]
public string LeaveID
{
get{ return leaveID; }
set{ leaveID = value; }
}
/// <summary>
/// 请假类型
/// </summary>
private string leaveType = string.Empty;
[Colum("LeaveType")]
public string LeaveType
{
get { return leaveType; }
set { leaveType = value; }
}
/// <summary>
/// 请假人
/// </summary>
private string leaveUserID = string.Empty;
[Colum("LeaveUserID")]
public string LeaveUserID
{
get{ return leaveUserID; }
set{ leaveUserID = value; }
}
/// <summary>
/// 开始时间
/// </summary>
private DateTime? startTime = null;
[Colum("StartTime", DbType.DateTime)]
public DateTime? StartTime
{
get{ return startTime; }
set{ startTime = value; }
}
/// <summary>
/// 截止时间
/// </summary>
private DateTime? endTime = null;
[Colum("EndTime", DbType.DateTime)]
public DateTime? EndTime
{
get{ return endTime; }
set{ endTime = value; }
}
/// <summary>
/// 请假原由
/// </summary>
private string reasonTxt = string.Empty;
[Colum("ReasonTxt")]
public string ReasonTxt
{
get{ return reasonTxt; }
set{ reasonTxt = value; }
}
/// <summary>
///
/// </summary>
private double allDay = 0;
[Colum("AllDay",DbType.Double)]
public double AllDay
{
get { return allDay; }
set { allDay = value; }
}
/// <summary>
/// 详细
/// </summary>
private string leaveEx = string.Empty;
[Colum("LeaveEx")]
public string LeaveEx
{
get { return leaveEx; }
set { leaveEx = value; }
}
/// <summary>
/// 操作人员
/// </summary>
private string userID = string.Empty;
[Colum("UserID")]
public string UserID
{
get { return userID; }
set { userID = value; }
}
/// <summary>
/// 创建时间
/// </summary>
private DateTime? createDate = DateTime.Now;
[Colum("CreateDate", DbType.DateTime)]
public DateTime? CreateDate
{
get{ return createDate; }
set{ createDate = value; }
}
}
请假类型
[Table("KTD_LeaveTypes", "LeaveTypeID")]
public class LeaveTypes : BaseEntity
{
private string leaveTypeID = string.Empty;
[PrimaryKey(PrimaryKeyType.Assign, "LeaveTypeID", DbType.String)]
public string LeaveTypeID
{
get { return leaveTypeID; }
set { leaveTypeID = value; }
}
/// <summary>
/// 请假类型
/// </summary>
private string leaveTypeName = string.Empty;
[Colum("LeaveTypeName")]
public string LeaveTypeName
{
get { return leaveTypeName; }
set { leaveTypeName = value; }
}
/// <summary>
/// 状态
/// </summary>
private bool state = false;
[Colum("State", DbType.Boolean)]
public bool State
{
get { return state; }
set { state = value; }
}
/// <summary>
/// 是否工作日计算
/// </summary>
private bool isWorkDay = false;
[Colum("IsWorkDay", DbType.Boolean)]
public bool IsWorkDay
{
get { return isWorkDay; }
set { isWorkDay = value; }
}
}
5、请假具体算法
/// <summary>
/// 请假不在同一天(小时)-开始时间
/// </summary>
/// <param name="t1"></param>
/// <param name="wt"></param>
/// <returns></returns>
public double GetSameDayTimeFirstDate(DateTime t1, WorkTimes wt)
{
double dayHoule = 0;
DateTime s1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
DateTime e1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
DateTime s2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
DateTime e2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30
TimeSpan sts33 = new TimeSpan(e1.Ticks);
TimeSpan ets33 = new TimeSpan(s2.Ticks);
TimeSpan interval33 = ets33.Subtract(sts33);
TimeSpan sts22 = new TimeSpan(s1.Ticks);
TimeSpan ets22 = new TimeSpan(e2.Ticks);
TimeSpan interval22 = ets22.Subtract(sts22);
double dayAllHoule = interval22.TotalHours - interval33.TotalHours;
if (t1 < s1)
{
t1 = s1;
}
if (t1 < e2)
{
if (t1 <= e1) //上午
{
TimeSpan sts3 = new TimeSpan(e1.Ticks);
TimeSpan ets3 = new TimeSpan(s2.Ticks);
TimeSpan interval3 = ets3.Subtract(sts3);
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(e2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours - interval3.TotalHours;
}
else if (t1 >= s2 && t1 <= e2) //下午
{
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(e2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
else
{
TimeSpan sts3 = new TimeSpan(t1.Ticks);
TimeSpan ets3 = new TimeSpan(s2.Ticks);
TimeSpan interval3 = ets3.Subtract(sts3);
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(e2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours - interval3.TotalHours;
}
}
else
{
dayHoule = 0;
}
if (dayHoule == dayAllHoule)
{
return 1;
}
else
{
return dayHoule * 0.1;
}
}
/// <summary>
/// 请假不在同一天(小时转天)-截止时间
/// </summary>
/// <param name="t2"></param>
/// <param name="wt"></param>
/// <returns></returns>
public double GetSameDayTimeEndDate(DateTime t2, WorkTimes wt)
{
double dayHoule = 0;
DateTime s1 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
DateTime e1 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
DateTime s2 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
DateTime e2 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30
TimeSpan sts33 = new TimeSpan(e1.Ticks);
TimeSpan ets33 = new TimeSpan(s2.Ticks);
TimeSpan interval33 = ets33.Subtract(sts33);
TimeSpan sts22 = new TimeSpan(s1.Ticks);
TimeSpan ets22 = new TimeSpan(e2.Ticks);
TimeSpan interval22 = ets22.Subtract(sts22);
double dayAllHoule = interval22.TotalHours - interval33.TotalHours;
if (t2 > e2)
{
t2 = e2;
}
if (t2 > s1)
{
if (t2 > s1 && t2 <= e1) //上午
{
TimeSpan sts2 = new TimeSpan(s1.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
else if (t2 > s2) //下午
{
TimeSpan sts3 = new TimeSpan(e1.Ticks);
TimeSpan ets3 = new TimeSpan(s2.Ticks);
TimeSpan interval3 = ets3.Subtract(sts3);
TimeSpan sts2 = new TimeSpan(s1.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours - interval3.TotalHours;
}
else //中午
{
TimeSpan sts2 = new TimeSpan(s1.Ticks);
TimeSpan ets2 = new TimeSpan(e1.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
}
else
{
dayHoule = 0;
}
if (dayHoule == dayAllHoule)
{
return 1;
}
else
{
return dayHoule * 0.1;
}
}
/// <summary>
/// 请假在同一天(小时转天)
/// </summary>
/// <param name="t1"></param>
/// <param name="t2"></param>
/// <param name="wt"></param>
/// <returns></returns>
public double GetSameDayTimeDate(DateTime t1, DateTime t2, WorkTimes wt)
{
double dayHoule = 0;
DateTime s1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
DateTime e1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
DateTime s2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
DateTime e2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30
TimeSpan sts33 = new TimeSpan(e1.Ticks);
TimeSpan ets33 = new TimeSpan(s2.Ticks);
TimeSpan interval33 = ets33.Subtract(sts33);
TimeSpan sts22 = new TimeSpan(s1.Ticks);
TimeSpan ets22 = new TimeSpan(e2.Ticks);
TimeSpan interval22 = ets22.Subtract(sts22);
double dayAllHoule = interval22.TotalHours - interval33.TotalHours;
if (t1 < s1)
{
t1 = s1;
}
if (t2 > e2)
{
t2 = e2;
}
if (t2 <= e1) //上午
{
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
else if (t1 >= s2) //下午
{
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
else if (t1 >= e1 && t1 < s2) //中午
{
TimeSpan sts2 = new TimeSpan(s2.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours;
}
else
{
TimeSpan sts3 = new TimeSpan(e1.Ticks);
TimeSpan ets3 = new TimeSpan(s2.Ticks);
TimeSpan interval3 = ets3.Subtract(sts3);
TimeSpan sts2 = new TimeSpan(t1.Ticks);
TimeSpan ets2 = new TimeSpan(t2.Ticks);
TimeSpan interval2 = ets2.Subtract(sts2);
dayHoule = interval2.TotalHours - interval3.TotalHours;
}
if (dayHoule == dayAllHoule)
{
return 1;
}
else
{
return dayHoule * 0.1;
}
}
public List<LeaveDateTimes> GetWorkTimeOfTwoDay(Trans t, DateTime t1, DateTime t2, string leaveID)
{
List<LeaveDateTimes> list = new List<LeaveDateTimes>();
DateTime? sD = null;
DateTime? eD = null;
DateTime? tmp = null;
if (t1.CompareTo(t2) > 0)
{
tmp = t1;
t1 = t2;
t2 = tmp.Value;
}
sD = t1.AddDays(1).Date;
eD = t2.Date.AddMilliseconds(-1);
double days = 0;
while (sD < eD)
{
if (IsWorkDate(t, sD.Value))
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = sD.Value;
item.LeaveDay = 1;
item.LeaveHour = 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
sD = sD.Value.AddDays(1);
}
if (t1.Date != t2.Date)
{
if (IsWorkDate(t, t1))
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
days = (new WorkTimesBLL()).GetSameDayTimeFirstDate(t1, wt);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t1.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
if (IsWorkDate(t, t2))
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t2);
days = (new WorkTimesBLL()).GetSameDayTimeEndDate(t2, wt);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t2.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
}
else
{
if (IsWorkDate(t, t1))
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
days = (new WorkTimesBLL()).GetSameDayTimeDate(t1, t2, wt);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t1.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
}
return list;
}
public List<LeaveDateTimes> GetNoWorkTimeOfTwoDay(Trans t, DateTime t1, DateTime t2, string leaveID)
{
List<LeaveDateTimes> list = new List<LeaveDateTimes>();
DateTime? sD = null;
DateTime? eD = null;
DateTime? tmp = null;
if (t1.CompareTo(t2) > 0)
{
tmp = t1;
t1 = t2;
t2 = tmp.Value;
}
sD = t1.AddDays(1).Date;
eD = t2.Date.AddMilliseconds(-1);
double days = 0;
while (sD < eD)
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = sD.Value;
item.LeaveDay = 1;
item.LeaveHour = 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
sD = sD.Value.AddDays(1);
}
if (t1.Date != t2.Date)
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
days = (new WorkTimesBLL()).GetSameDayTimeFirstDate(t1, wt);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t1.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
wt = (new WorkTimesBLL()).GetWorkTime(t, t2);
days = (new WorkTimesBLL()).GetSameDayTimeEndDate(t2, wt);
item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t2.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
else
{
WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
days = (new WorkTimesBLL()).GetSameDayTimeDate(t1, t2, wt);
LeaveDateTimes item = new LeaveDateTimes();
item.LeaveID = leaveID;
item.LeaveDate = t1.Date;
item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
item.LeaveHour = days < 1 ? days : 0;
item.WorkTime = wt.WorkHour;
list.Add(item);
}
return list;
}
public bool IsWorkDate(Trans t, DateTime theDay)
{
try
{
List<WorkDates> wds = this.Find(t,string.Format(" StartDate<='{0}' AND EndDate>='{0}'", theDay.ToString("yyyy-MM-dd HH:mm:ss")),false);
if (wds.Count > 0)
{
return wds[0].IsWorkDate;
}
else
{
return (theDay.DayOfWeek != DayOfWeek.Saturday && theDay.DayOfWeek != DayOfWeek.Sunday);
}
}
catch (Exception ex)
{
throw ex;
}
}