public HttpResponseMessage GetDataDashboard()
        {
            try
            {
                DashboardResultModel modelResult = dashboardBusiness.GetDataDashboard();

                return(Request.CreateResponse(HttpStatusCode.OK, modelResult));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        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);
            }
        }
Example #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);
        }