public void AddOrUpdateCacheColectionFuntion()
        {
            // db = new TimeAttendanceEntities(_connStr);
            DashboardResultModel modelResult = new DashboardResultModel();

            try
            {
                var lstEmp   = db.Employee.ToList();
                var lstEmpId = lstEmp.Select(r => r.EmployeeId);
                modelResult.TotalEmployee = lstEmpId.Count();

                //Ngày hiện tại
                modelResult.DateNow = DateTime.Now;
                //Ngày hôm qua
                modelResult.DateBefore = modelResult.DateNow.AddDays(-1);
                modelResult.DayNow     = modelResult.DateNow.ToString("dd/MM/yyyy");

                DateTimeFormatInfo dfi      = DateTimeFormatInfo.CurrentInfo;
                Calendar           calendar = dfi.Calendar;
                //Tuần hiện tại
                modelResult.WeekNow = calendar.GetWeekOfYear(modelResult.DateNow, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
                //Ngày đầu của tuần hiện tại
                DateTime firstDayOfWeekNow = DateTimeUtils.FirstDayOfWeek(modelResult.DateNow);
                //Ngày cuối của tuần hiện tại
                DateTime lastDayOfWeekNow = firstDayOfWeekNow.AddDays(6);

                //Ngày đầu của tuần trước
                DateTime firstDayOfWeekBefore = firstDayOfWeekNow.AddDays(-7);
                //Ngày cuối của tuần trước
                DateTime lastDayOfWeekBefore = firstDayOfWeekBefore.AddDays(6);
                //Tuần trước
                modelResult.WeekBefore = calendar.GetWeekOfYear(firstDayOfWeekBefore, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

                //Tháng hiện tại
                modelResult.MonthNow = modelResult.DateNow.Month;
                //Ngày đầu của tháng hiện tại
                DateTime firstDayOfMonthNow = new DateTime(modelResult.DateNow.Year, modelResult.MonthNow, 1);
                //Ngày cuối của tháng hiện tại
                DateTime lastDayOfMonthNow = firstDayOfMonthNow.AddMonths(1).AddDays(-1);
                //Tháng trước
                modelResult.MonthBefore = modelResult.DateNow.AddMonths(-1).Month;
                //Ngày đầu của tháng trước
                DateTime firstDayOfMonthBefore = new DateTime(modelResult.DateNow.AddMonths(-1).Year, modelResult.DateNow.AddMonths(-1).Month, 1);
                //Ngày cuối của tháng trước
                DateTime lastDayOfMonthBefore = firstDayOfMonthBefore.AddMonths(1).AddDays(-1);
                //Quý hiện tại
                modelResult.QuarterNow = ((modelResult.DateNow.Month + 2) / 3);

                //Ngày đầu của quý hiện tại
                DateTime firstDayOfQuarterNow = new DateTime(modelResult.DateNow.Year, (modelResult.QuarterNow - 1) * 3 + 1, 1);
                //Ngày cuối của quý hiện tại
                DateTime lastDayOfQuarterNow = firstDayOfQuarterNow.AddMonths(3).AddDays(-1);

                //Lấy quý trước
                DateTime dateBeforeOfQuarterNow = firstDayOfQuarterNow.AddMonths(-1);
                modelResult.QuarterBefore = ((dateBeforeOfQuarterNow.Month + 2) / 3);
                //Ngày đầu của quý trước
                DateTime firstDayOfQuarterBefore = new DateTime(dateBeforeOfQuarterNow.Year, (modelResult.QuarterBefore - 1) * 3 + 1, 1);
                //Ngày cuối của quý trước
                DateTime lastDayOfQuarterBefore = firstDayOfQuarterBefore.AddMonths(3).AddDays(-1);

                DateTime dateFrom;
                DateTime dateTo;

                //lấy tổng dữ liệu trong quý
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfQuarterNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfQuarterNow);
                var listQuarterNow = db.TimeAttendanceLog.Where(u => u.Date >= dateFrom && u.Date <= dateTo).ToList();

                //lấy dữ liệu trong ngày
                dateFrom = DateTimeUtils.ConvertDateFrom(modelResult.DateNow);
                dateTo   = DateTimeUtils.ConvertDateTo(modelResult.DateNow);
                var listDayNow = listQuarterNow.Where(u => u.Date >= dateFrom && u.Date <= dateTo).ToList();

                //lấy dữ liệu trong tuần
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfWeekNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfWeekNow);
                var listWeekNow = listQuarterNow.Where(u => u.Date >= dateFrom && u.Date <= dateTo).ToList();

                //lấy dữ liệu trong tháng
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfMonthNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfMonthNow);
                var listMonthNow = listQuarterNow.Where(u => u.Date >= dateFrom && u.Date <= dateTo).ToList();

                #region  //Thống kê chấm công ngày hiện tại và ngày trước
                //tinh toán
                modelResult.ListDataDay = new List <DataResultModel>();
                modelResult.ListDataDay.Add(new DataResultModel()
                {
                    Name        = "Ngày " + modelResult.DateNow.ToString("dd/MM/yyyy") + "",
                    TotalLate   = listDayNow.Where(u => u.LateMinutes.HasValue && u.LateMinutes > 0).Count(),
                    TotalEarly  = listDayNow.Where(u => u.EarlyMinutes.HasValue && u.EarlyMinutes > 0).Count(),
                    TotalAbsent = listDayNow.Where(u => !lstEmpId.Contains(u.EmployeeId)).Count()
                });

                var dataDayNow = modelResult.ListDataDay.First();
                modelResult.LatePercent   = Math.Round((double)(dataDayNow.TotalLate / modelResult.TotalEmployee) * 100, 2);
                modelResult.EarlyPercent  = Math.Round((double)(dataDayNow.TotalEarly / modelResult.TotalEmployee) * 100, 2);
                modelResult.AbsentPercent = Math.Round((double)(dataDayNow.TotalAbsent / modelResult.TotalEmployee) * 100, 2);

                #region [lấy cache ngày]

                var DateNowKey        = "AT:DayHome:" + modelResult.DateNow.ToString("ddMMyyyy");
                var redisDayHomeCache = RedisService <DayHomeCache> .GetInstance(_RedisConnection);

                DayHomeCache DayHomeCache;
                DayHomeCache = redisDayHomeCache.Get <DayHomeCache>(DateNowKey);
                if (DayHomeCache != null)
                {
                    DayHomeCache.ListDataDay   = modelResult.ListDataDay;
                    DayHomeCache.LatePercent   = modelResult.LatePercent;
                    DayHomeCache.EarlyPercent  = modelResult.EarlyPercent;
                    DayHomeCache.AbsentPercent = modelResult.AbsentPercent;
                    //add vào cache
                    redisDayHomeCache.Replace(DateNowKey, DayHomeCache);
                }
                else
                {
                    DayHomeCache = new DayHomeCache();

                    DayHomeCache.ListDataDay   = modelResult.ListDataDay;
                    DayHomeCache.LatePercent   = modelResult.LatePercent;
                    DayHomeCache.EarlyPercent  = modelResult.EarlyPercent;
                    DayHomeCache.AbsentPercent = modelResult.AbsentPercent;

                    //add vào cache
                    redisDayHomeCache.Add(DateNowKey, DayHomeCache);
                }
                #endregion

                #endregion

                #region  //Thống kê chấm công tuần hiện tại và tuần trước
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfWeekNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfWeekNow);

                //tính toán
                modelResult.ListDataWeek = new List <DataResultModel>();
                modelResult.ListDataWeek.Add(new DataResultModel()
                {
                    Name        = "Tuần " + modelResult.WeekNow + " Năm " + firstDayOfWeekNow.ToString("yyyy"),
                    TotalLate   = listWeekNow.Where(u => u.LateMinutes.HasValue && u.LateMinutes > 0).Count(),
                    TotalEarly  = listWeekNow.Where(u => u.EarlyMinutes.HasValue && u.EarlyMinutes > 0).Count(),
                    TotalAbsent = listWeekNow.Where(u => !lstEmpId.Contains(u.EmployeeId)).Count()
                });
                modelResult.ListLateTopInWeek = (from b in lstEmp
                                                 select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listWeekNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                      select x.LateMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();
                modelResult.ListEarlyTopInWeek = (from b in lstEmp
                                                  select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listWeekNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                      select x.EarlyMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();
                //Dữ liệu biểu đồ
                modelResult.DataChartWeek = new DataChartModel();
                for (DateTime dateWeek = firstDayOfWeekNow; dateWeek <= lastDayOfWeekNow;)
                {
                    dateFrom = DateTimeUtils.ConvertDateFrom(dateWeek);
                    dateTo   = DateTimeUtils.ConvertDateTo(dateWeek);
                    var listDataChart = listWeekNow.Where(r => r.Date >= dateFrom && r.Date <= dateTo).ToList();

                    modelResult.DataChartWeek.ListTotalLate.Add(listDataChart.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count());
                    modelResult.DataChartWeek.ListTotalEarly.Add(listDataChart.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count());
                    modelResult.DataChartWeek.ListTotalAbsent.Add(listDataChart.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count());
                    dateWeek = dateWeek.AddDays(1);
                }


                #region [lấy cache ngày]
                var DateFrom_ToKeyW    = "AT:WeekHome:" + firstDayOfWeekNow.ToString("ddMMyyyy") + "_" + lastDayOfWeekNow.ToString("ddMMyyyy");
                var redisWeekHomeCache = RedisService <WeekHomeCache> .GetInstance(_RedisConnection);

                WeekHomeCache WeekHomeCache;
                WeekHomeCache = redisWeekHomeCache.Get <WeekHomeCache>(DateFrom_ToKeyW);
                if (WeekHomeCache != null)
                {
                    WeekHomeCache.ListDataWeek       = modelResult.ListDataWeek;
                    WeekHomeCache.ListLateTopInWeek  = modelResult.ListLateTopInWeek;
                    WeekHomeCache.ListEarlyTopInWeek = modelResult.ListEarlyTopInWeek;
                    WeekHomeCache.DataChartWeek      = modelResult.DataChartWeek;

                    //add vào cache
                    redisWeekHomeCache.Replace(DateFrom_ToKeyW, WeekHomeCache);
                }
                else
                {
                    WeekHomeCache = new WeekHomeCache();
                    WeekHomeCache.ListDataWeek       = modelResult.ListDataWeek;
                    WeekHomeCache.ListLateTopInWeek  = modelResult.ListLateTopInWeek;
                    WeekHomeCache.ListEarlyTopInWeek = modelResult.ListEarlyTopInWeek;
                    WeekHomeCache.DataChartWeek      = modelResult.DataChartWeek;

                    //add vào cache
                    redisWeekHomeCache.Add(DateFrom_ToKeyW, WeekHomeCache);
                }
                #endregion
                #endregion

                #region  //Thống kê chấm công tháng hiện tại và tháng trước
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfMonthNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfMonthNow);
                #region //tính toán
                modelResult.ListDataMonth = new List <DataResultModel>();
                modelResult.ListDataMonth.Add(new DataResultModel()
                {
                    Name        = "Tháng " + modelResult.MonthNow + " Năm " + firstDayOfMonthNow.ToString("yyyy"),
                    TotalLate   = listMonthNow.Where(u => u.LateMinutes.HasValue && u.LateMinutes > 0).Count(),
                    TotalEarly  = listMonthNow.Where(u => u.EarlyMinutes.HasValue && u.EarlyMinutes > 0).Count(),
                    TotalAbsent = listMonthNow.Where(u => !lstEmpId.Contains(u.EmployeeId)).Count()
                });
                modelResult.ListLateTopInMonth = (from b in lstEmp
                                                  select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listMonthNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                      select x.LateMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();
                modelResult.ListEarlyTopInMonth = (from b in lstEmp
                                                   select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listMonthNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                      select x.EarlyMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();

                ////Dữ liệu biểu đồ
                modelResult.DataChartMonth = new DataChartModel();
                for (DateTime dateMonth = firstDayOfMonthNow; dateMonth <= lastDayOfMonthNow;)
                {
                    dateFrom = DateTimeUtils.ConvertDateFrom(dateMonth);
                    dateTo   = DateTimeUtils.ConvertDateTo(dateMonth);
                    var listDataChart = listMonthNow.Where(r => r.Date >= dateFrom && r.Date <= dateTo).ToList();

                    modelResult.DataChartMonth.ListCategories.Add(dateMonth.Day.ToString());
                    modelResult.DataChartMonth.ListTotalLate.Add(listDataChart.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count());
                    modelResult.DataChartMonth.ListTotalEarly.Add(listDataChart.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count());
                    modelResult.DataChartMonth.ListTotalAbsent.Add(listDataChart.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count());
                    dateMonth = dateMonth.AddDays(1);
                }
                #endregion
                #region [lấy cache ngày]
                var DateFrom_ToKeyM     = "AT:MonthHome:" + firstDayOfMonthNow.ToString("ddMMyyyy") + "_" + lastDayOfMonthNow.ToString("ddMMyyyy");
                var redisMonthHomeCache = RedisService <MonthHomeCache> .GetInstance(_RedisConnection);

                MonthHomeCache MonthHomeCache;
                MonthHomeCache = redisMonthHomeCache.Get <MonthHomeCache>(DateFrom_ToKeyM);
                if (MonthHomeCache != null)
                {
                    MonthHomeCache.ListDataMonth       = modelResult.ListDataMonth;
                    MonthHomeCache.ListLateTopInMonth  = modelResult.ListLateTopInMonth;
                    MonthHomeCache.ListEarlyTopInMonth = modelResult.ListEarlyTopInMonth;
                    MonthHomeCache.DataChartMonth      = modelResult.DataChartMonth;

                    redisMonthHomeCache.Replace(DateFrom_ToKeyM, MonthHomeCache);
                }
                else
                {
                    MonthHomeCache = new MonthHomeCache();
                    MonthHomeCache.ListDataMonth       = modelResult.ListDataMonth;
                    MonthHomeCache.ListLateTopInMonth  = modelResult.ListLateTopInMonth;
                    MonthHomeCache.ListEarlyTopInMonth = modelResult.ListEarlyTopInMonth;
                    MonthHomeCache.DataChartMonth      = modelResult.DataChartMonth;

                    redisMonthHomeCache.Add(DateFrom_ToKeyM, MonthHomeCache);
                }
                #endregion


                #endregion

                #region  //Thống kê chấm công quý hiện tại và quý trước
                #region  //tính toán
                modelResult.ListDataQuarter = new List <DataResultModel>();
                modelResult.ListDataQuarter.Add(new DataResultModel()
                {
                    Name        = "Quý " + modelResult.QuarterNow + " Năm " + firstDayOfQuarterNow.ToString("yyyy"),
                    TotalLate   = listQuarterNow.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count(),
                    TotalEarly  = listQuarterNow.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count(),
                    TotalAbsent = listQuarterNow.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count()
                });
                ////Dữ liệu top
                modelResult.ListLateTopInQuarter = (from b in lstEmp
                                                    select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listQuarterNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.LateMinutes.HasValue
                                      select x.LateMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();
                modelResult.ListEarlyTopInQuarter = (from b in lstEmp
                                                     select new DataTopModel
                {
                    Code = b.Code,
                    EmployeeName = b.Name,
                    Total = (int)(from x in listQuarterNow
                                  where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                  select x.TimeAttendanceLogId).Count(),
                    TotalTime = (int)(from x in listWeekNow
                                      where x.EmployeeId.Equals(b.EmployeeId) && x.EarlyMinutes.HasValue
                                      select x.EarlyMinutes).Sum(),
                }).Where(r => r.Total > 0).OrderByDescending(r => r.Total).ThenBy(r => r.TotalTime).Take(20).ToList();

                modelResult.DataChartQuarter = new DataChartModel();
                //Tháng thứ 1 của quý
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfQuarterNow);
                dateTo   = DateTimeUtils.ConvertDateTo(firstDayOfQuarterNow.AddMonths(1).AddDays(1));
                var listDataChartQuarter = listQuarterNow.Where(r => r.Date >= dateFrom && r.Date <= dateTo).ToList();
                modelResult.DataChartQuarter.ListCategories.Add("Tháng " + firstDayOfQuarterNow.Month.ToString());
                modelResult.DataChartQuarter.ListTotalLate.Add(listDataChartQuarter.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalEarly.Add(listDataChartQuarter.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalAbsent.Add(listDataChartQuarter.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count());

                ////Tháng thứ 2 của quý
                DateTime firstDayOfQuarterNext = firstDayOfQuarterNow.AddMonths(1);
                dateFrom             = DateTimeUtils.ConvertDateFrom(firstDayOfQuarterNext);
                dateTo               = DateTimeUtils.ConvertDateTo(firstDayOfQuarterNext.AddMonths(1).AddDays(1));
                listDataChartQuarter = listQuarterNow.Where(r => r.Date >= dateFrom && r.Date <= dateTo).ToList();
                modelResult.DataChartQuarter.ListCategories.Add("Tháng " + firstDayOfQuarterNext.Month.ToString());
                modelResult.DataChartQuarter.ListTotalLate.Add(listDataChartQuarter.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalEarly.Add(listDataChartQuarter.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalAbsent.Add(listDataChartQuarter.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count());

                ////Tháng thứ 3 của quý
                firstDayOfQuarterNext = firstDayOfQuarterNow.AddMonths(2);
                dateFrom             = DateTimeUtils.ConvertDateFrom(firstDayOfQuarterNext);
                dateTo               = DateTimeUtils.ConvertDateTo(firstDayOfQuarterNext.AddMonths(1).AddDays(1));
                listDataChartQuarter = listQuarterNow.Where(r => r.Date >= dateFrom && r.Date <= dateTo).ToList();
                modelResult.DataChartQuarter.ListCategories.Add("Tháng " + firstDayOfQuarterNext.Month.ToString());
                modelResult.DataChartQuarter.ListTotalLate.Add(listDataChartQuarter.Where(r => r.LateMinutes.HasValue && r.LateMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalEarly.Add(listDataChartQuarter.Where(r => r.EarlyMinutes.HasValue && r.EarlyMinutes > 0).Count());
                modelResult.DataChartQuarter.ListTotalAbsent.Add(listDataChartQuarter.Where(r => !lstEmpId.Contains(r.EmployeeId)).Count());
                #endregion

                #region [lấy cache ngày]
                var DateFrom_ToKeyQ       = "AT:QuarterHome:" + firstDayOfQuarterNow.ToString("ddMMyyyy") + "_" + lastDayOfQuarterNow.ToString("ddMMyyyy");
                var redisQuarterHomeCache = RedisService <QuarterHomeCache> .GetInstance(_RedisConnection);

                QuarterHomeCache QuarterHomeCache;
                QuarterHomeCache = redisQuarterHomeCache.Get <QuarterHomeCache>(DateFrom_ToKeyQ);
                if (QuarterHomeCache != null)
                {
                    QuarterHomeCache.ListDataQuarter       = modelResult.ListDataQuarter;
                    QuarterHomeCache.ListLateTopInQuarter  = modelResult.ListLateTopInQuarter;
                    QuarterHomeCache.ListEarlyTopInQuarter = modelResult.ListEarlyTopInQuarter;
                    QuarterHomeCache.DataChartQuarter      = modelResult.DataChartQuarter;

                    redisQuarterHomeCache.Replace(DateFrom_ToKeyQ, QuarterHomeCache);
                }
                else
                {
                    QuarterHomeCache = new QuarterHomeCache();
                    QuarterHomeCache.ListDataQuarter       = modelResult.ListDataQuarter;
                    QuarterHomeCache.ListLateTopInQuarter  = modelResult.ListLateTopInQuarter;
                    QuarterHomeCache.ListEarlyTopInQuarter = modelResult.ListEarlyTopInQuarter;
                    QuarterHomeCache.DataChartQuarter      = modelResult.DataChartQuarter;

                    redisQuarterHomeCache.Add(DateFrom_ToKeyQ, QuarterHomeCache);
                }
                #endregion
                #endregion
            }
            catch (Exception ex)
            {
                throw new ErrorException(ErrorMessage.ERR001, ex.InnerException);
            }
        }
Beispiel #2
0
        public bool SyncTimeAttendance(DateTime day)
        {
            try
            {
                db = new TimeAttendanceEntities();
                DateTime dateFrom     = DateTimeUtils.ConvertDateFrom(day);
                DateTime dateTo       = DateTimeUtils.ConvertDateTo(day);
                var      listDataSync = (from a in db.Employee
                                         join b in db.Department on a.DepartmentId equals b.DepartmentId
                                         join c in db.JobTitle on a.JobTitleId equals c.JobTitleId
                                         join d in db.TimeAttendanceLog.Where(r => r.Date >= dateFrom && r.Date <= dateTo) on a.EmployeeId equals d.EmployeeId into ad
                                         from adv in ad.DefaultIfEmpty()
                                         select new
                {
                    a.EmployeeId,
                    a.Name,
                    a.Code,
                    DepartmentName = b.Name,
                    JobTitleName = c.Name,
                    Gender = !a.Gender.HasValue ? "Khác" : a.Gender.Value == Constants.Male ? "Nam" : "Nữ",
                    Date = adv != null ? adv.TimeIn : dateFrom,
                    TimeIn = adv != null ? adv.TimeIn : null,
                    TimeOut = adv != null ? adv.TimeOut : null,
                    Total = adv != null ? adv.Total : null,
                    LateMinutes = adv != null ? adv.LateMinutes : null,
                    EarlyMinutes = adv != null ? adv.EarlyMinutes : null,
                }).ToList();
                using (var trans = db.Database.BeginTransaction())
                {
                    try
                    {
                        var checkSyncTimeAttendance = db.SyncTimeAttendance.Where(r => r.Date >= dateFrom && r.Date <= dateTo);
                        if (checkSyncTimeAttendance != null && checkSyncTimeAttendance.Count() > 0)
                        {
                            db.SyncTimeAttendance.RemoveRange(checkSyncTimeAttendance);
                        }

                        List <SyncTimeAttendance> listSync = new List <SyncTimeAttendance>();
                        SyncTimeAttendance        model;
                        foreach (var itemSync in listDataSync)
                        {
                            model = new SyncTimeAttendance()
                            {
                                SyncAttendanceId = Guid.NewGuid().ToString(),
                                EmployeeId       = itemSync.EmployeeId,
                                EmployeeName     = itemSync.Name,
                                Code             = itemSync.Code,
                                DepartmentName   = itemSync.DepartmentName,
                                JobTitleName     = itemSync.JobTitleName,
                                Gender           = itemSync.Gender,
                                Date             = itemSync.Date.Value,
                                TimeIn           = itemSync.TimeIn,
                                TimeOut          = itemSync.TimeOut,
                                Total            = itemSync.Total,
                                LateMinutes      = itemSync.LateMinutes,
                                EarlyMinutes     = itemSync.EarlyMinutes,
                            };
                            model.IsLate   = false;
                            model.IsEarly  = false;
                            model.IsAbsent = false;
                            //Đi muộn
                            if (model.TimeIn != null && model.LateMinutes != null && model.LateMinutes > 0)
                            {
                                model.IsLate = true;
                            }
                            //Về sớm
                            if (model.TimeOut != null && model.EarlyMinutes != null && model.EarlyMinutes > 0)
                            {
                                model.IsEarly = true;
                            }
                            //Nghỉ
                            if (model.TimeIn == null && model.TimeOut == null)
                            {
                                model.IsAbsent = true;
                            }
                            listSync.Add(model);
                        }
                        db.SyncTimeAttendance.AddRange(listSync);
                        db.SaveChanges();
                        trans.Commit();
                        return(true);
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        return(false);
                    }
                }
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
Beispiel #3
0
        public DashboardResultModel GetDataDashboard()
        {
            var RedisConnection = System.Configuration.ConfigurationManager.AppSettings["RedisConnection"];
            DashboardResultModel modelResult = new DashboardResultModel();

            try
            {
                //var lstEmpId = db.Employee.Select(r => r.EmployeeId);
                //modelResult.TotalEmployee = lstEmpId.Count();

                //Ngày hiện tại
                modelResult.DateNow = DateTime.Now;
                //Ngày hôm qua
                modelResult.DateBefore = modelResult.DateNow.AddDays(-1);
                modelResult.DayNow     = modelResult.DateNow.ToString("dd/MM/yyyy");

                DateTimeFormatInfo dfi      = DateTimeFormatInfo.CurrentInfo;
                Calendar           calendar = dfi.Calendar;
                //Tuần hiện tại
                modelResult.WeekNow = calendar.GetWeekOfYear(modelResult.DateNow, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
                //Ngày đầu của tuần hiện tại
                DateTime firstDayOfWeekNow = DateTimeUtils.FirstDayOfWeek(modelResult.DateNow);
                //Ngày cuối của tuần hiện tại
                DateTime lastDayOfWeekNow = firstDayOfWeekNow.AddDays(6);

                //Ngày đầu của tuần trước
                DateTime firstDayOfWeekBefore = firstDayOfWeekNow.AddDays(-7);
                //Ngày cuối của tuần trước
                DateTime lastDayOfWeekBefore = firstDayOfWeekBefore.AddDays(6);
                //Tuần trước
                modelResult.WeekBefore = calendar.GetWeekOfYear(firstDayOfWeekBefore, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

                //Tháng hiện tại
                modelResult.MonthNow = modelResult.DateNow.Month;
                //Ngày đầu của tháng hiện tại
                DateTime firstDayOfMonthNow = new DateTime(modelResult.DateNow.Year, modelResult.MonthNow, 1);
                //Ngày cuối của tháng hiện tại
                DateTime lastDayOfMonthNow = firstDayOfMonthNow.AddMonths(1).AddDays(-1);
                //Tháng trước
                modelResult.MonthBefore = modelResult.DateNow.AddMonths(-1).Month;
                //Ngày đầu của tháng trước
                DateTime firstDayOfMonthBefore = new DateTime(modelResult.DateNow.AddMonths(-1).Year, modelResult.DateNow.AddMonths(-1).Month, 1);
                //Ngày cuối của tháng trước
                DateTime lastDayOfMonthBefore = firstDayOfMonthBefore.AddMonths(1).AddDays(-1);
                //Quý hiện tại
                modelResult.QuarterNow = ((modelResult.DateNow.Month + 2) / 3);

                //Ngày đầu của quý hiện tại
                DateTime firstDayOfQuarterNow = new DateTime(modelResult.DateNow.Year, (modelResult.QuarterNow - 1) * 3 + 1, 1);
                //Ngày cuối của quý hiện tại
                DateTime lastDayOfQuarterNow = firstDayOfQuarterNow.AddMonths(3).AddDays(-1);

                //Lấy quý trước
                DateTime dateBeforeOfQuarterNow = firstDayOfQuarterNow.AddMonths(-1);
                modelResult.QuarterBefore = ((dateBeforeOfQuarterNow.Month + 2) / 3);
                //Ngày đầu của quý trước
                DateTime firstDayOfQuarterBefore = new DateTime(dateBeforeOfQuarterNow.Year, (modelResult.QuarterBefore - 1) * 3 + 1, 1);
                //Ngày cuối của quý trước
                DateTime lastDayOfQuarterBefore = firstDayOfQuarterBefore.AddMonths(3).AddDays(-1);

                DateTime dateFrom;
                DateTime dateTo;

                //lấy dữ liệu trong ngày
                //dateFrom = DateTimeUtils.ConvertDateFrom(modelResult.DateNow);
                //dateTo = DateTimeUtils.ConvertDateTo(modelResult.DateNow);
                //var listDayNow = db.TimeAttendanceLog.AsNoTracking().Where(u => u.Date >= dateFrom && u.Date <= dateTo).AsQueryable();


                //#region  //Thống kê chấm công ngày hiện tại và ngày trước
                //#region //tinh toán
                //modelResult.ListDataDay = new List<DataResultModel>();
                //modelResult.ListDataDay.Add(new DataResultModel()
                //{
                //    Name = "Ngày " + modelResult.DateNow.ToString("dd/MM/yyyy"),
                //    TotalLate = listDayNow.Where(u => u.LateMinutes.HasValue && u.LateMinutes > 0).Count(),
                //    TotalEarly = listDayNow.Where(u => u.EarlyMinutes.HasValue && u.EarlyMinutes > 0).Count(),
                //    TotalAbsent = listDayNow.Where(u => !lstEmpId.Contains(u.EmployeeId)).Count()
                //});

                //var dataDayNow = modelResult.ListDataDay.First();
                //modelResult.LatePercent = Math.Round((double)(dataDayNow.TotalLate / modelResult.TotalEmployee) * 100, 2);
                //modelResult.EarlyPercent = Math.Round((double)(dataDayNow.TotalEarly / modelResult.TotalEmployee) * 100, 2);
                //modelResult.AbsentPercent = Math.Round((double)(dataDayNow.TotalAbsent / modelResult.TotalEmployee) * 100, 2);
                //#endregion

                //#region[lấy cache ngày]

                //var DateNowKey = "AT:DayHome:" + modelResult.DateNow.ToString("ddMMyyyy");
                //var redisDayHomeCache = RedisService<DayHomeCache>.GetInstance(RedisConnection);
                //DayHomeCache DayHomeCache;
                //DayHomeCache = redisDayHomeCache.Get<DayHomeCache>(DateNowKey);
                //if (DayHomeCache != null)
                //{
                //    DayHomeCache.ListDataDay = modelResult.ListDataDay;
                //    DayHomeCache.LatePercent = modelResult.LatePercent;
                //    DayHomeCache.EarlyPercent = modelResult.EarlyPercent;
                //    DayHomeCache.AbsentPercent = modelResult.AbsentPercent;
                //    //add vào cache
                //    redisDayHomeCache.Replace(DateNowKey, DayHomeCache);

                //    //lay cache hôm trước
                //    var DateBeforKey = "AT:DayHome:" + modelResult.DateNow.AddDays(-1).ToString("ddMMyyyy");
                //    var DayHomeCacheBefor = redisDayHomeCache.Get<DayHomeCache>(DateBeforKey);
                //    if (DayHomeCacheBefor != null)
                //    {
                //        modelResult.ListDataDay.Add(DayHomeCacheBefor.ListDataDay[0]);
                //    }
                //}
                //else
                //{
                //    DayHomeCache = new DayHomeCache();

                //    DayHomeCache.ListDataDay = modelResult.ListDataDay;
                //    DayHomeCache.LatePercent = modelResult.LatePercent;
                //    DayHomeCache.EarlyPercent = modelResult.EarlyPercent;
                //    DayHomeCache.AbsentPercent = modelResult.AbsentPercent;
                //    //add vào cache
                //    redisDayHomeCache.Add(DateNowKey, DayHomeCache);
                //}
                //#endregion

                //#endregion

                #region  //Thống kê chấm công tuần hiện tại và tuần trước
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfWeekNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfWeekNow);
                #region [lấy cache ngày]
                var DateFrom_ToKeyW    = "AT:WeekHome:" + firstDayOfWeekNow.ToString("ddMMyyyy") + "_" + lastDayOfWeekNow.ToString("ddMMyyyy");
                var redisWeekHomeCache = RedisService <WeekHomeCache> .GetInstance(RedisConnection);

                WeekHomeCache WeekHomeCache;
                WeekHomeCache = redisWeekHomeCache.Get <WeekHomeCache>(DateFrom_ToKeyW);

                modelResult.ListDataWeek       = new List <DataResultModel>();
                modelResult.ListLateTopInWeek  = new List <DataTopModel>();
                modelResult.ListEarlyTopInWeek = new List <DataTopModel>();
                modelResult.DataChartWeek      = new DataChartModel();

                if (WeekHomeCache != null)
                {
                    modelResult.ListDataWeek       = WeekHomeCache.ListDataWeek;
                    modelResult.ListLateTopInWeek  = WeekHomeCache.ListLateTopInWeek;
                    modelResult.ListEarlyTopInWeek = WeekHomeCache.ListEarlyTopInWeek;
                    modelResult.DataChartWeek      = WeekHomeCache.DataChartWeek;

                    //lấy cache tuần trước
                    var DateFrom_ToKeyWBefor = "AT:WeekHome:" + firstDayOfWeekBefore.ToString("ddMMyyyy") + "_" + lastDayOfWeekBefore.ToString("ddMMyyyy");
                    var WeekHomeCacheBefor   = redisWeekHomeCache.Get <WeekHomeCache>(DateFrom_ToKeyWBefor);
                    if (WeekHomeCacheBefor != null)
                    {
                        modelResult.ListDataWeek.Add(WeekHomeCacheBefor.ListDataWeek[0]);
                    }
                }

                #endregion
                #endregion

                #region  //Thống kê chấm công tháng hiện tại và tháng trước
                dateFrom = DateTimeUtils.ConvertDateFrom(firstDayOfMonthNow);
                dateTo   = DateTimeUtils.ConvertDateTo(lastDayOfMonthNow);
                #region [lấy cache ngày]
                var DateFrom_ToKeyM     = "AT:MonthHome:" + firstDayOfMonthNow.ToString("ddMMyyyy") + "_" + lastDayOfMonthNow.ToString("ddMMyyyy");
                var redisMonthHomeCache = RedisService <MonthHomeCache> .GetInstance(RedisConnection);

                MonthHomeCache MonthHomeCache;
                MonthHomeCache = redisMonthHomeCache.Get <MonthHomeCache>(DateFrom_ToKeyM);
                if (MonthHomeCache != null)
                {
                    modelResult.ListDataMonth       = MonthHomeCache.ListDataMonth;;
                    modelResult.ListLateTopInMonth  = MonthHomeCache.ListLateTopInMonth;
                    modelResult.ListEarlyTopInMonth = MonthHomeCache.ListEarlyTopInMonth;
                    modelResult.DataChartMonth      = MonthHomeCache.DataChartMonth;
                    //lấy cache cũ
                    var DateFrom_ToKeyMBefor = "AT:MonthHome:" + firstDayOfMonthBefore.ToString("ddMMyyyy") + "_" + lastDayOfMonthBefore.ToString("ddMMyyyy");
                    var MonthHomeCacheBefor  = redisMonthHomeCache.Get <MonthHomeCache>(DateFrom_ToKeyMBefor);
                    if (MonthHomeCacheBefor != null)
                    {
                        modelResult.ListDataMonth.Add(MonthHomeCacheBefor.ListDataMonth[0]);
                    }
                }

                #endregion


                #endregion

                #region  //Thống kê chấm công quý hiện tại và quý trước
                #region [lấy cache ngày]
                var DateFrom_ToKeyQ       = "AT:QuarterHome:" + firstDayOfQuarterNow.ToString("ddMMyyyy") + "_" + lastDayOfQuarterNow.ToString("ddMMyyyy");
                var redisQuarterHomeCache = RedisService <QuarterHomeCache> .GetInstance(RedisConnection);

                QuarterHomeCache QuarterHomeCache;
                QuarterHomeCache = redisQuarterHomeCache.Get <QuarterHomeCache>(DateFrom_ToKeyQ);
                if (QuarterHomeCache != null)
                {
                    modelResult.ListDataQuarter       = QuarterHomeCache.ListDataQuarter;;
                    modelResult.ListLateTopInQuarter  = QuarterHomeCache.ListLateTopInQuarter;
                    modelResult.ListEarlyTopInQuarter = QuarterHomeCache.ListEarlyTopInQuarter;
                    modelResult.DataChartQuarter      = QuarterHomeCache.DataChartQuarter;
                    //lây cache quý trước
                    var DateFrom_ToKeyQBefor  = "AT:QuarterHome:" + firstDayOfQuarterBefore.ToString("ddMMyyyy") + "_" + lastDayOfQuarterBefore.ToString("ddMMyyyy");
                    var QuarterHomeCacheBefor = redisQuarterHomeCache.Get <QuarterHomeCache>(DateFrom_ToKeyQBefor);
                    if (QuarterHomeCacheBefor != null)
                    {
                        modelResult.ListDataQuarter.Add(QuarterHomeCacheBefor.ListDataQuarter[0]);
                    }
                }

                #endregion
                #endregion
            }
            catch (Exception ex)
            {
                throw new ErrorException(ErrorMessage.ERR001, ex.InnerException);
            }
            return(modelResult);
        }
        public SearchResultObject <UserEventLogSearchResult> SearchUserEventLog(UserEventLogSearchCondition searchCondition, string saveOption)
        {
            db = new TimeAttendanceEntities();
            SearchResultObject <UserEventLogSearchResult> searchResult = new SearchResultObject <UserEventLogSearchResult>();

            try
            {
                var listmodel = (from a in db.UserEventLog.AsNoTracking()
                                 join b in db.User.AsNoTracking() on a.UserId equals b.UserId into ab
                                 from abv in ab.DefaultIfEmpty()
                                 select new UserEventLogSearchResult()
                {
                    UserEventLogId = a.UserEventLogId,
                    UserId = a.UserId,
                    Description = a.Description,
                    LogType = a.LogType,
                    LogTypeName = a.LogType == 0 ? "Truy cập hệ thống" : "Khai thác dữ liệu",
                    Type = abv.Type,
                    CreateDate = a.CreateDate,
                    UserName = abv.Name,
                    FullName = abv.FullName
                }).AsQueryable();

                if (!string.IsNullOrEmpty(searchCondition.UserName))
                {
                    listmodel = listmodel.Where(r => r.UserName != null && r.UserName.ToUpper().Contains(searchCondition.UserName.ToUpper()));
                }
                if (!string.IsNullOrEmpty(searchCondition.UserType))
                {
                    listmodel = listmodel.Where(r => r.Type != null && r.Type.Equals(searchCondition.UserType));
                }
                if (!string.IsNullOrEmpty(searchCondition.UserIdSearch))
                {
                    listmodel = listmodel.Where(r => r.UserId != null && r.UserId.Equals(searchCondition.UserIdSearch));
                }
                if (!string.IsNullOrEmpty(searchCondition.FullName))
                {
                    listmodel = listmodel.Where(r => r.FullName != null && r.FullName.ToUpper().Contains(searchCondition.FullName.ToUpper()));
                }
                if (!string.IsNullOrEmpty(searchCondition.Description))
                {
                    listmodel = listmodel.Where(r => r.Description.ToUpper().Contains(searchCondition.Description.ToUpper()));
                }
                if (searchCondition.LogType.HasValue)
                {
                    listmodel = listmodel.Where(r => r.LogType.HasValue && r.LogType.Value == searchCondition.LogType.Value);
                }
                if (searchCondition.LogDateFrom.HasValue)
                {
                    searchCondition.LogDateFrom = DateTimeUtils.ConvertDateFrom(searchCondition.LogDateFrom);
                    listmodel = listmodel.Where(r => r.CreateDate.HasValue && r.CreateDate >= searchCondition.LogDateFrom);
                }
                if (searchCondition.LogDateTo.HasValue)
                {
                    searchCondition.LogDateTo = DateTimeUtils.ConvertDateTo(searchCondition.LogDateTo);
                    listmodel = listmodel.Where(r => r.CreateDate.HasValue && r.CreateDate <= searchCondition.LogDateTo);
                }

                searchResult.TotalItem = listmodel.Select(r => r.UserEventLogId).Count();
                var listResult = SQLHelpper.OrderBy(listmodel, searchCondition.OrderBy, searchCondition.OrderType).Skip((searchCondition.PageNumber - 1) * searchCondition.PageSize)
                                 .Take(searchCondition.PageSize)
                                 .ToList();


                string pathFile = string.Empty;
                if ((saveOption.Equals("PDF") || saveOption.Equals("XLSX")) && searchResult.TotalItem > 0)
                {
                    if (searchResult.TotalItem > Constants.MAX_RETURN_DATA_ROW)
                    {
                        throw new BusinessException(ErrorMessage.ERR007);
                    }
                    else
                    {
                        pathFile = this.Export(saveOption, listmodel.ToList(), searchCondition);
                    }
                }

                searchResult.ListResult = listResult;
                searchResult.PathFile   = pathFile;
            }
            catch (Exception ex)
            {
                throw new ErrorException(ErrorMessage.ERR001, ex.InnerException);
            }

            return(searchResult);
        }