查询请假、加班、打卡、出差信息

 考勤查询相关函数实现。

       #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

 

你可能感兴趣的:(C#)