为生物识别出勤标记checkTypes

时间:2018-04-13 04:36:48

标签: c# sql-server asp.net-mvc sorting biometrics

我有一个名为Attendancelogs的表,我正在保存从生物识别设备获取的记录,表结构是;

enter image description here

LogType定义日志的类型,即Biometric / Manual

CheckType定义条目的类型,即IO

VerifyMode定义打卡类型,即指纹/密码

isIgnore用于从日志中排除条目。

现在,我要做的是编写一个名为sortFunc();的函数,该函数将处理Attendancelogs表中已存储的记录。这是假设要做的;

  1. 将第一个条目的每个员工的checkType标记为I,然后将O标记为日期的第二个条目,依此类推。

  2. 如果员工在一天结束时有最后I,意味着没有结账,那么第二天该员工的第一拳(在上午12点到上午7点)被视为检查在前一天(标记为该员工的更明确的情况),其余条目被视为顺序IO

  3. 忽略10秒(或定义时间)内的任何多个条目,并将CheckType标记为“自动忽略x秒”

  4. 如果员工不允许使用卡/密码,则他的CheckType标记为Card not allowedPassword not allowed

  5. 这是我写的函数;

    public static bool inn = true;
    public void sortLogs(int machineNum)
    {
        DateTime prevDate = DateTime.MinValue;
        DateTime currentDate = DateTime.MinValue;
    
        DateTime prevDateTime = DateTime.MinValue;
        DateTime currentDateTime = DateTime.MinValue;
    
    
    
        TimeSpan lowerBound = TimeSpan.Zero;
        TimeSpan upperBound = TimeSpan.Zero;
    
        var time = DateTime.ParseExact("00:00:00", "HH:mm:ss", null).ToString("hh:mm:ss tt", CultureInfo.GetCultureInfo("en-US"));
        lowerBound = Convert.ToDateTime(time).TimeOfDay;
    
        var time2 = DateTime.ParseExact("07:00:00", "HH:mm:ss", null).ToString("hh:mm:ss tt", CultureInfo.GetCultureInfo("en-US"));
        upperBound = Convert.ToDateTime(time2).TimeOfDay;
    
        upperBound = new TimeSpan(7, 0, 0);
    
    
    
        var CheckType = "N/S";
        bool isNighter = false;
        List<AttendanceLog> firstDates = new List<AttendanceLog>();
    
    
    
        AttendanceLog lastEmp = new AttendanceLog();
        var empList = db.AttendanceLogs.OrderBy(x => x.EmpID).ThenBy(x => x.DateTime).ToList();
    
        var countEmps = empList.DistinctBy(p => p.EmpID).Count();
        string[,] array = new string[countEmps, 2];
    
        var checkDevice = db.DeviceInformations.Where(xy => xy.DeviceID == machineNum && xy.IsActive == 1.ToString()).ToList();
    
        AttendanceLog firstObj = new AttendanceLog();
        int counter = 0;
        int tempEmp = -1;
        foreach (var emp in empList)
        {
            if (emp.EmpID == 0)
                continue;
    
            var cardAcceptance = db.Roles.Where(x => x.EmpID == emp.EmpID && x.Card_Acceptance == true).ToList();
            var passwordAcceptance = db.Roles.Where(x => x.EmpID == emp.EmpID && x.Password_Acceptance == true).ToList();
            currentDate = emp.Date;
            currentDateTime = emp.DateTime;
    
            if (emp.EmpID != tempEmp)
            {
                inn = true;
            }
    
    
    
            if (prevDateTime !=  DateTime.MinValue)
            {
                var seconds = (emp.DateTime - prevDateTime).TotalSeconds;
                var settings = db.settings.Where(xy => xy.Constant_Name == "Entry Delay").FirstOrDefault();
                if (settings.Constant_Value <= 0)
                    settings.Constant_Value = 10;
                else
                if (seconds > 0 && seconds < settings.Constant_Value)
                {
                    //store prevDateTime in deleted table
    
                    emp.CheckType = "Auto Ignored: " + seconds + " seconds interval.";
                  //  prevDateTime = emp.DateTime;
                    continue;
                }
            }
    
            if (passwordAcceptance.Count <= 0)
            {
                if (emp.VerifyMode == "3")
                {
                    try
                    {
                        emp.CheckType = "Password not allowed";
                        //db.SaveChanges();
                        continue;
                    }
                    catch (DbEntityValidationException e)
                    {
                        foreach (var eve in e.EntityValidationErrors)
                        {
                            foreach (var ve in eve.ValidationErrors)
                            {
                            }
                        }
                        throw;
                    }
                }
    
            }
            if (cardAcceptance.Count <= 0)
            {
                if (emp.VerifyMode == "4")
                {
                    try
                    {
                        emp.CheckType = "Card not allowed";
                       // db.SaveChanges();
                        continue;
                    }
                    catch (DbEntityValidationException e)
                    {
                        foreach (var eve in e.EntityValidationErrors)
                        {
                            foreach (var ve in eve.ValidationErrors)
                            {
                            }
                        }
                        throw;
                    }
                }
    
            }
    
            if (counter != countEmps)
            {
                if (emp.EmpID != firstObj.EmpID)
                {
                    array[counter, 0] = emp.EmpID.ToString();
                    firstObj.EmpID = emp.EmpID;
                    firstObj.Date = emp.Date;
                    counter++;
                }
            }
    
            if (currentDate == firstObj.Date)
            {
                //check for entry delay
    
    
                //get emp datetime here
                //comapre with the slots
                //if the datetime exsits in between 
                //otherwise store it with boolean flag for the first entry only, the rest should not be flagged
                if (emp.DateTime.TimeOfDay > lowerBound && emp.DateTime.TimeOfDay < upperBound)
                {
                    //consider the first check as nighter and then ignore the rest
    
                }
                else {
                    //checks after the upperBound means, no nighter
    
                }
                if (inn)
                {
                    inn = false;
                    emp.CheckType = "I";
                }
                else
                {
                    inn = true;
                    emp.CheckType = "O";
                }
                for (int i = 0; i < array.Length / 2; i++)
                {
                    if (array[i, 0] == emp.EmpID.ToString())
                    {
                        array[i, 1] = emp.CheckType;
                        break;
                    }
                }
    
                //CheckType = emp.CheckType;
                prevDate = currentDate;
                prevDateTime = currentDateTime;
    
            }
    
            else
            {
                if (prevDate != currentDate)
                {
                    if (emp.DateTime.TimeOfDay > lowerBound && emp.DateTime.TimeOfDay < upperBound)
                    {
                        //consider the first check as nighter and then ignore the rest
                        if (inn)
                        {
                            inn = false;
                            emp.CheckType = "I";
                        }
                        else
                        {
                            inn = true;
                            emp.CheckType = "O";
                        }
                        for (int i = 0; i < array.Length / 2; i++)
                        {
                            if (array[i, 0] == emp.EmpID.ToString())
                            {
                                array[i, 1] = emp.CheckType;
                                break;
                            }
                        }
    
                        //CheckType = emp.CheckType;
                        prevDate = currentDate;
                        prevDateTime = currentDateTime;
                    }
                    else
                    {
                        //checks after the upperBound means, no nighter
                    }
                    for (int i = 0; i < array.Length / 2; i++)
                    {
                        if (array[i, 0] == emp.EmpID.ToString())
                        {
                            if (array[i, 1] == "I")
                            {
                                emp.CheckType = "O";
                                inn = true;
                            }
                            else
                            {
                                emp.CheckType = "I";
                                inn = false;
                            }
                        }
                    }
                }
                else
                {
    
                    if (inn)
                    {
                        inn = false;
                        emp.CheckType = "I";
                    }
                    else
                    {
                        inn = true;
                        emp.CheckType = "O";
                    }
    
                    for (int i = 0; i < array.Length / 2; i++)
                    {
                        if (array[i, 0] == emp.EmpID.ToString())
                        {
                            array[i, 1] = emp.CheckType;
                        }
                    }
    
                }
                prevDate = currentDate;
            }
    
            tempEmp = emp.EmpID.Value;
        }
        db.SaveChanges();
    }
    

    这确实有效,但它会弄乱“上午12点到早上7点”检查和密码检查,即不准确的结果。

    enter image description here

    作为一个例子,^连续O不应该在那里。我一直在为此疯狂!

0 个答案:

没有答案