考勤查询相关函数实现。
#region 考勤统计信息
///
/// 获取打卡信息
///
/// 开始时间
/// 结束时间
/// 员工姓名
///
public DataTable GetSignRecord(string StartDate, string EndDate)
{
#region
DataTable dtUser = CommUtils.GetUserList(StartDate, EndDate, "");
string where = "";
string strSQL = string.Format(@"SELECT b.emp_fname, b.depart_name,b.date,b.BeginTime,b.EndTime,( CASE
WHEN ms = 0 AND CONVERT(CHAR(10), BeginTime, 108) < '12:00:00' THEN '下班未打卡'
WHEN ms = 0 AND CONVERT(CHAR(10), BeginTime, 108) > '12:00:00' THEN '上班未打卡'
WHEN 540 - ms BETWEEN 0 AND 30 THEN '迟到或早退30分钟以内'
WHEN 540 - ms > 30 THEN '迟到或早退30分钟以上' ELSE '正常' END) AS 状态
FROM (SELECT TOP 100 PERCENT a.emp_fname, b.depart_name, CONVERT(CHAR(10), sign_time, 120) date,
Min(c.sign_time) AS BeginTime,Max(c.sign_time) AS EndTime,Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS Ms
FROM Employee a LEFT JOIN Departs b ON a.depart_id = b.depart_id
LEFT JOIN TimeRecords c ON a.emp_id = c.emp_id
WHERE
CONVERT(CHAR(10), sign_time, 120) BETWEEN '{0}' AND '{1}' {2} AND a.emp_id IS NOT NULL
GROUP BY depart_name, emp_fname, CONVERT(CHAR(10), sign_time, 120)
ORDER BY depart_name, emp_fname, CONVERT(CHAR(10), sign_time, 120) ASC) AS b
GROUP BY emp_fname, b.date, b.BeginTime,b.EndTime, depart_name, b.ms
ORDER BY b.depart_name, b.emp_fname ", StartDate, EndDate, where);
DataTable dt = DbNoarkKQSQL.Query(strSQL).Tables[0];
List items = (from m in dtUser.AsEnumerable()
join
n in dt.AsEnumerable() on
new { Name = m.Field("UName"), Date = m.Field("WorkDate") } equals
new { Name = n.Field("emp_fname"), Date = n.Field("date") }
into mn
from x in mn.DefaultIfEmpty()
select new SignInVM
{
Guid = Guid.NewGuid(),
UserName = m.Field("UName"),
Department = m.Field("ONAME"),
Date = m.Field("WorkDate"),
DateType = string.Format(@"{0}({1})", m.Field("DateType"), m.Field("Remark")),
BeginTime = x == null ? null : x.Field("BeginTime"),
Endtime = x == null ? null : x.Field("EndTime"),
Status = x == null ? (m.Field("Remark") != "工作日" ? "正常" : "未打卡") : x.Field("状态"),
Remark = m.Field("Remark"),
}).ToList();
var list = items.GroupBy(a => new { a.Department, a.UserName }).Select(a => new
{
DepartMent = a.Key.Department,
Employee = a.Key.UserName,
LateMore = a.Count(o => o.Status == "迟到或早退30分钟以内"),
LateLess = a.Count(o => o.Status == "迟到或早退30分钟以上"),
SignIn = a.Count(o => o.Status == "上班未打卡"),
SignOut = a.Count(o => o.Status == "下班未打卡"),
SignNo = a.Count(o => o.Status == "未打卡"),
});
DataTable dttmp = new DataTable();
dttmp.Columns.Add("DepartMent");
dttmp.Columns.Add("Employee");
dttmp.Columns.Add("LateMore");
dttmp.Columns.Add("LateLess");
dttmp.Columns.Add("SignIn");
dttmp.Columns.Add("SignOut");
dttmp.Columns.Add("SignNo");
foreach (var item in list)
{
DataRow dr = dttmp.NewRow();
dr["DepartMent"] = item.DepartMent;
dr["Employee"] = item.Employee;
dr["LateMore"] = item.LateMore;
dr["LateLess"] = item.LateLess;
dr["SignIn"] = item.SignIn;
dr["SignOut"] = item.SignOut;
dr["SignNo"] = item.SignNo;
dttmp.Rows.Add(dr);
}
return dttmp;
#endregion
#region
// string strSQL = string.Format(@"SELECT b.emp_fname,
// b.depart_name,
// Sum(CASE
// WHEN ms = 0
// AND CONVERT(CHAR(10), EndTime, 23) < '12:00:00' THEN 1
// ELSE 0
// END) AS 上班未打卡,
// Sum(CASE
// WHEN ms = 0
// AND CONVERT(CHAR(10), EndTime, 23) > '12:00:00' THEN 1
// ELSE 0
// END) AS 下班未打卡,
// Sum(CASE
// WHEN ms <> 0
// AND 540 - ms BETWEEN 0 AND 30 THEN 1
// ELSE 0
// END) AS 迟到或早退30分钟以内,
// Sum(CASE
// WHEN ms <> 0
// AND 540 - ms > 30 THEN 1
// ELSE 0
// END) AS 迟到或早退30分钟以上
// FROM (SELECT TOP 100 PERCENT a.emp_fname,
// b.depart_name,
// Min(c.sign_time) AS BeginTime,
// Max(c.sign_time) AS EndTime,
// Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS ms
// FROM Employee a
// LEFT JOIN Departs b ON a.depart_id = b.depart_id
// LEFT JOIN TimeRecords c ON a.emp_id = c.emp_id
// WHERE Substring(a.depart_id, 1, 3) = '041'
// AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '{0}' AND '{1}'
// AND a.emp_id IS NOT NULL
// GROUP BY depart_name,emp_fname, CONVERT(CHAR(10), sign_time, 120)
// ORDER BY depart_name,emp_fname, CONVERT(CHAR(10), sign_time, 120) ASC) AS b
// GROUP BY emp_fname,depart_name
// ORDER BY depart_name,emp_fname ", StartDate, EndDate);
// return DbNoarkKQSQL.Query(strSQL).Tables[0];
#endregion
}
///
/// 获取请假信息
///
/// 开始时间
/// 结束时间
/// 员工姓名
///
public DataTable GetLeaveRecord(string StartDate, string EndDate)
{
string strSQL = string.Format(@"SELECT ApplyUserId,
SUM(leaveHours) as TotalHours,
Sum(CASE
WHEN leavetype = '事假' THEN leaveHours ELSE 0 END) AS 事假,
Sum(CASE
WHEN leavetype = '病假' THEN leaveHours ELSE 0 END) AS 病假,
Sum(CASE
WHEN leavetype = '产检假' THEN leaveHours ELSE 0 END) AS 产前病事假,
Sum(CASE
WHEN leavetype = '产假' OR LeaveType = '陪产假' THEN leaveHours ELSE 0 END) AS 产假或护理假,
Sum(CASE
WHEN leavetype = '婚假' THEN leaveHours ELSE 0 END) AS 婚假,
Sum(CASE
WHEN leavetype = '丧假' THEN leaveHours ELSE 0 END) AS 丧假,
Sum(CASE
WHEN leavetype = '年休假' THEN leaveHours ELSE 0 END) AS 年假,
Sum(CASE
WHEN leavetype = '公假' THEN leaveHours ELSE 0 END) AS 公假,
Sum(CASE
WHEN leavetype = '其他' THEN leaveHours ELSE 0 END) AS 其他,
Sum(CASE
WHEN leavetype = '调休' THEN leaveHours ELSE 0 END) AS 调休,
Sum(CASE
WHEN leavetype = '工伤假' THEN leaveHours ELSE 0 END) AS 工伤假
FROM HR_Leave
WHERE CompanyId = 16 AND Node = 2 AND CONVERT(CHAR(10), Start, 120) BETWEEN '{0}' AND '{1}'
GROUP BY ApplyUserId
ORDER BY ApplyUserId ASC", StartDate, EndDate);
return DbOaSQL.Query(strSQL).Tables[0];
}
///
/// 获取加班信息
///
/// 开始日期
/// 结束日期
/// 员工姓名
///
public DataTable GetOverTimeRecord(string StartDate, string EndDate)
{
string strSQL = string.Format(@"SELECT [ApplyUserId],
Sum(CASE
WHEN [OtType] = '休息日' or [OtType] = '平时延长' THEN Duration ELSE 0 END) AS TotalLeave,
Sum(CASE
WHEN [OtType] = '平时延长' THEN Duration ELSE 0 END) AS 平时延长,
Sum(CASE
WHEN [OtType] = '休息日' THEN Duration ELSE 0 END) AS 休息日,
Sum(CASE
WHEN [OtType] = '法定节假日' THEN Duration ELSE 0 END) AS 法定节假日
FROM HR_Overtime
WHERE CompanyId = 16 AND Node = 2
AND CONVERT(CHAR(10), CreateDateTime, 120) BETWEEN '{0}' AND '{1}'
GROUP BY ApplyUserId
ORDER BY ApplyUserId ASC ", StartDate, EndDate);
return DbOaSQL.Query(strSQL).Tables[0];
}
///
/// 获取出差信息
///
/// 开始日期
/// 结束日期
///
public DataTable GetOutSideRecord(string StartDate, string EndDate)
{
string strSQL = string.Format(@"SELECT [ApplyUserId],
sum((dbo.f_workday(StartTime,EndTime)-1)*8) as TotalOutSide
FROM FI_OutSideBussinessTravel a left join FI_BussinessTravelItem b on a.OutSideBussinessTravelID=b.OutSideBussinessTravelID where b.StartTime>='{0}' and b.EndTime<='{1}'
and a.node=2
group by ApplyUserId
order by ApplyUserId asc ", StartDate, EndDate);
return DbOaSQL.Query(strSQL).Tables[0];
}
///
/// 获取两个日期之间的工作日天数
///
/// 开始日期
/// 结束日期
///
public int GetWorkDays(string BeginDate, string EndDate)
{
string strSQL = string.Format(@"SELECT count(*) as Count
FROM[HR_WorkDayList] where workdate between '{0}' and '{1}' and isworkday=1", BeginDate, EndDate);
DataTable dt = DbOaSQL.Query(strSQL).Tables[0];
if (dt != null && dt.Rows.Count > 0)
{
return int.Parse(dt.Rows[0]["count"].ToString());
}
return 0;
//DateTime Start = Convert.ToDateTime(BeginDate);
//DateTime End = Convert.ToDateTime(EndDate); ;//获取今天日期
//TimeSpan Tspan = End.Subtract(Start);//TimeSpan得到dt1和dt2的时间间隔
//int DayCount = Tspan.Days;//获取两个日期间的总天数
//int WorkDayCount = 0;//工作日
////循环用来扣除总天数中的双休日
//for (int i = 0; i <= DayCount; i++)
//{
// DateTime tempdt = Start.Date.AddDays(i);
// if (tempdt.DayOfWeek != System.DayOfWeek.Saturday && tempdt.DayOfWeek != System.DayOfWeek.Sunday)
// {
// WorkDayCount++;
// }
//}
//return WorkDayCount;
}
#endregion