Beispiel #1
0
        public string CityDashboard(int id)
        {
            var result = "";

            using (diplomaDBContext = new DiplomaDBContext())
            {
                var dailyTripList = diplomaDBContext.Trip.Where(t => t.Date.Date == DateTime.Today && !t.InProgress && t.TripContainers.Any() && t.TripContainers.First().Container.Region.City.Id == id).ToList();

                var dailyStatistics = new DailyStatistics
                {
                    Date                     = DateTime.Today,
                    CityId                   = id,
                    AvgTime                  = (long?)dailyTripList.Average(t => t.Time),
                    AvgPetrolAmount          = (int?)dailyTripList.Average(t => t.PetrolAmount.Value),
                    PetrolAmount             = dailyTripList.Sum(t => t.PetrolAmount).HasValue ? dailyTripList.Sum(t => t.PetrolAmount).Value : 0,
                    AvgDynamicChangesCount   = (int?)dailyTripList.Average(t => t.DynamicChangesCount.Value),
                    DynamicChangesCount      = dailyTripList.Sum(t => t.DynamicChangesCount).HasValue ? dailyTripList.Sum(t => t.DynamicChangesCount).Value : 0,
                    AvgContainersCount       = (int?)dailyTripList.Average(t => t.TripContainers.Count()),
                    CollectedContainersCount = dailyTripList.Sum(t => t.TripContainers.Count()),
                    ContainersCount          = diplomaDBContext.Container.Count(),
                    UtilitiesCount           = diplomaDBContext.Utility.Count(),
                    RegionsCount             = diplomaDBContext.Region.Count(),
                    FactoriesCount           = diplomaDBContext.RecycleFactory.Count()
                };

                result = JsonSerializer.Serialize(dailyStatistics, JsonOptions);
            }

            return(result);
        }
        protected override async Task <Response> CreateInternalResponseAsync(
            DateRangeDomainRequest request)
        {
            DailyStatistics dailyStatistics = await AggregateReportApiDao
                                              .GetDailyDispositionStatisticsAsync(request.BeginDateUtc.Value, request.EndDateUtc.Value,
                                                                                  request.DomainId);

            return(new DailyStatisticsResponse(dailyStatistics.Values));
        }
        public async Task <DailyStatistics> GetWeekStatistics(int userID)
        {
            UriBuilder uriBuilder = new UriBuilder(ApiConstants.BaseUri)
            {
                Path = ApiConstants.WeekStatistics + userID
            };
            DailyStatistics dailyStatistics = await _genericRepository.GetAsync <DailyStatistics>(uriBuilder.ToString());

            return(dailyStatistics);
        }
Beispiel #4
0
        /// <summary>
        /// Calculates and writes various statistics over various time periods.
        /// </summary>
        /// <param name="time">
        /// The current time, in UTC.
        /// </param>
        private void UpdateStatistics(DateTime time)
        {
            DateTime local = TimeZoneInfo.ConvertTimeFromUtc(time, config.position.timeZone);

            // At the start of a new day, recalculate the previous day's statistics because they
            // need to include the observation from 00:00:00 of the new day
            if (local.Hour == 0 && local.Minute == 0)
            {
                DateTime        local2      = local - TimeSpan.FromMinutes(1);
                DailyStatistics statistics1 = Database.CalculateDailyStatistics(local2,
                                                                                config.position.timeZone);

                Database.WriteDailyStatistics(statistics1, DatabaseFile.Data);
                if ((bool)config.uploader.upload)
                {
                    Database.WriteDailyStatistics(statistics1, DatabaseFile.Upload);
                }
            }

            DailyStatistics statistics2 = Database.CalculateDailyStatistics(local,
                                                                            config.position.timeZone);

            Database.WriteDailyStatistics(statistics2, DatabaseFile.Data);
            if ((bool)config.uploader.upload)
            {
                Database.WriteDailyStatistics(statistics2, DatabaseFile.Upload);
            }


            // At the start of a new month, recalculate the previous month's statistics because
            // they need to include the observation from 00:00:00 of the new month's first day
            if (local.Day == 1 && local.Hour == 0 && local.Minute == 0)
            {
                DateTime          local2      = local - TimeSpan.FromMinutes(1);
                MonthlyStatistics statistics1 = Database.CalculateMonthlyStatistics(local2.Year,
                                                                                    local2.Month, config.position.timeZone);

                Database.WriteMonthlyStatistics(statistics1, DatabaseFile.Data);
                if ((bool)config.uploader.upload)
                {
                    Database.WriteMonthlyStatistics(statistics1, DatabaseFile.Upload);
                }
            }

            MonthlyStatistics statistics3 = Database.CalculateMonthlyStatistics(local.Year,
                                                                                local.Month, config.position.timeZone);

            Database.WriteMonthlyStatistics(statistics3, DatabaseFile.Data);
            if ((bool)config.uploader.upload)
            {
                Database.WriteMonthlyStatistics(statistics3, DatabaseFile.Upload);
            }
        }
Beispiel #5
0
        DailyStatistics[] Calculate(string ftpUserName, DateTime fromDateTime)
        {
            string cerberusLogPath = String.Format(@"{0}\Cerberus LLC\Cerberus FTP Server\log", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));

            string[] filesList = Directory.GetFiles(cerberusLogPath, "server.*.log");

            ArrayList days = new ArrayList();
            DateTime  dateParsed;

            for (int i = 0; i < filesList.Length; i++)
            {
                if (DateTime.TryParseExact(filesList[i].Substring(filesList[i].LastIndexOf(".") + 1), "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault, out dateParsed))
                {
                    if (dateParsed >= fromDateTime)
                    {
                        using (StreamReader sr = new StreamReader(filesList[i]))
                        {
                            long   bytesReceived = 0;
                            long   bytesSent     = 0;
                            string line          = "";

                            while ((line = sr.ReadLine()) != null)
                            {
                                if (line.StartsWith("[") && line.Contains("B sent)") && ftpUserName == (line.Substring(line.IndexOf("[", 31) + 1, line.IndexOf("]", line.IndexOf("[", 31)) - (line.IndexOf("[", 31)) - 1)))
                                {
                                    bytesSent = bytesSent + long.Parse(line.Substring(line.IndexOf("' (") + 3, line.IndexOf(" B ", line.IndexOf("' (")) - (line.IndexOf("' (") + 3)));
                                }
                                if (line.StartsWith("[") && line.Contains("B received)") && ftpUserName == (line.Substring(line.IndexOf("[", 31) + 1, line.IndexOf("]", line.IndexOf("[", 31)) - (line.IndexOf("[", 31)) - 1)))
                                {
                                    bytesReceived = bytesReceived + long.Parse(line.Substring(line.IndexOf("' (") + 3, line.IndexOf(" B ", line.IndexOf("' (")) - (line.IndexOf("' (") + 3)));
                                }
                            }

                            DailyStatistics dailyStats = new DailyStatistics();
                            dailyStats.Year          = dateParsed.Year;
                            dailyStats.Month         = dateParsed.Month;
                            dailyStats.Day           = dateParsed.Day;
                            dailyStats.BytesSent     = bytesSent;
                            dailyStats.BytesReceived = bytesReceived;

                            days.Add(dailyStats);
                        }
                    }
                }
            }
            return((DailyStatistics[])days.ToArray(typeof(DailyStatistics)));
        }
        private static List <DailyStatistics> Read(OracleDataReader reader)
        {
            List <DailyStatistics> statistics = new List <DailyStatistics>();

            while (reader.Read())
            {
                int             i         = -1;
                DailyStatistics statistic = new DailyStatistics();
                statistic.Id   = reader.GetInt32(++i);
                statistic.Date = reader.GetDateTime(++i);
                statistic.number_of_reviews = reader.GetInt32(++i);
                statistic.Type = reader.GetString(++i);

                statistics.Add(statistic);
            }
            return(statistics);
        }
Beispiel #7
0
        public void Handle(IPublishedEvent <NoteAdded> e)
        {
            using (var context = new ReadModelContext())
            {
                var date          = e.Payload.CreationDate.Date;
                var totalsForDate = context.DailyStatistics.SingleOrDefault(i => i.Date == date);

                if (totalsForDate == null)
                {
                    totalsForDate = new DailyStatistics {
                        Id = 0, Date = date
                    };
                    context.DailyStatistics.Add(totalsForDate);
                }

                totalsForDate.NewCount++;
                context.SaveChanges();
            }
        }
Beispiel #8
0
        public void Handle(IPublishedEvent <NoteTextChanged> e)
        {
            using (var context = new ReadModelContext())
            {
                var date          = e.EventTimeStamp.Date;
                var totalsForDate = context.DailyStatistics.SingleOrDefault(i => i.Date == date);

                if (totalsForDate == null)
                {
                    totalsForDate = new DailyStatistics {
                        Date = date
                    };
                    context.DailyStatistics.Add(totalsForDate);
                }

                totalsForDate.EditCount++;

                context.SaveChanges();
            }
        }
Beispiel #9
0
        public IHttpActionResult GetWeeklyExpenseAndSaving(int userID)
        {
            int currentWeek  = HelperFunctions.HelperFunctions.CurrentWeekNumber;
            int currentMonth = DateTime.UtcNow.Month;
            int currentYear  = DateTime.UtcNow.Year;
            List <WeeklyExpenseDetail> weeklyExpenseDetailList = new List <WeeklyExpenseDetail>();

            weeklyExpenseDetailList = db.WeeklyExpenseDetails.Where(e => e.UserDataID == userID &&
                                                                    e.CurrentWeek == currentWeek &&
                                                                    e.CurrentMonth == currentMonth &&
                                                                    e.CurrentYear == currentYear).ToList();
            DailyStatistics dailyStatistics = new DailyStatistics();

            if (weeklyExpenseDetailList.Any())
            {
                decimal             totalExpenseSet  = weeklyExpenseDetailList.Sum(e => e.Amount);
                List <WeeklySaving> weeklySavingList = new List <WeeklySaving>();
                weeklySavingList = db.WeeklySavings.Where(e => e.UserDataID == userID &&
                                                          e.CurrentWeek == currentWeek &&
                                                          e.CurrentMonth == currentMonth &&
                                                          e.CurrentYear == currentYear).ToList();
                decimal currentWeekSaving  = weeklySavingList.Sum(e => e.Amount);
                decimal currentExpenditure = totalExpenseSet - currentWeekSaving;;
                dailyStatistics.CurrentWeekTotalExpenditure = Math.Round(totalExpenseSet, 2);
                dailyStatistics.CurrentWeekSavings          = Math.Round(currentWeekSaving, 2);
                dailyStatistics.CurrentWeekExpenses         = Math.Round(currentExpenditure, 2);
                dailyStatistics.IsWeekPlanSet = true;
                return(Ok(dailyStatistics));
            }
            else
            {
                dailyStatistics.IsWeekPlanSet = false;
                dailyStatistics.CurrentWeekTotalExpenditure = 0.00m;
                dailyStatistics.CurrentWeekSavings          = 0.00m;
                dailyStatistics.CurrentWeekExpenses         = 0.00m;
                return(Ok(dailyStatistics));
            }
        }
Beispiel #10
0
        public DailyStatistics[] GetDailyStatistics(DateTime since, params string[] keyValues)
        {
            ArrayList days = new ArrayList();

            // read statistics
            DateTime now  = DateTime.Now;
            DateTime date = since;

            if (date == DateTime.MinValue)
            {
                date = GetLogsBeginDate();
            }

            // iterate from since to now
            while (date < now)
            {
                // get monthly statistics
                MonthlyStatistics stats = GetMonthlyStatistics(date.Year, date.Month, keyValues);
                foreach (int day in stats.Days.Keys)
                {
                    StatsLine       line       = stats[day];
                    DailyStatistics dailyStats = new DailyStatistics();
                    dailyStats.Year          = date.Year;
                    dailyStats.Month         = date.Month;
                    dailyStats.Day           = day;
                    dailyStats.BytesSent     = line.BytesSent;
                    dailyStats.BytesReceived = line.BytesReceived;

                    days.Add(dailyStats);
                }

                // advance month
                date = date.AddMonths(1);
            }

            return((DailyStatistics[])days.ToArray(typeof(DailyStatistics)));
        }
        /// <summary>
        /// Dzienne statystyki użytkownika
        /// </summary>
        /// <param name="userId">Id użytkownika</param>
        /// <param name="day">Dzień (null - dzisiejszy dzień)</param>
        /// <returns>Statystyki podsumowaujące dany dzień</returns>
        public DailyStatistics GetDailyStatisticsForUser(int userId, DateTime?day)
        {
            var date = day ?? DateTime.Today;

            var data = Context.GameSessionTranslations
                       .Where(x => x.GameSession.UserId == userId)
                       .Where(x => x.GameSession.DateStart.Date == date.Date)
                       .ToList();

            if (data.Count == 0)
            {
                return(new DailyStatistics());
            }

            var result = new DailyStatistics
            {
                GamesCount  = data.GroupBy(x => x.GameSessionId).Count(),
                AnswersRate = Math.Round((decimal)data.Count(x => x.Correct) / data.Count() * 100, 0),
                AverageTime = Math.Round(data.Average(x => x.Duration), 1),
                TotalTime   = Math.Round(data.Sum(x => x.Duration))
            };

            return(result);
        }
Beispiel #12
0
        public DailyStatistics[] GetDailyStatistics(DateTime since, string maildomainName)
        {

            ArrayList days = new ArrayList();
            // read statistics
            DateTime now = DateTime.Now;
            DateTime date = since;

            try
            {
                while (date < now)
                {
                    svcDomainAdmin domains = new svcDomainAdmin();
                    PrepareProxy(domains);
                    StatInfoResult result =
                        domains.GetDomainStatistics(AdminUsername, AdminPassword, maildomainName, date, date);

                    if (!result.Result)
                        throw new Exception(result.Message);

                    if (result.BytesReceived != 0 | result.BytesSent != 0)
                    {
                        DailyStatistics dailyStats = new DailyStatistics();
                        dailyStats.Year = date.Year;
                        dailyStats.Month = date.Month;
                        dailyStats.Day = date.Day;
                        dailyStats.BytesSent = result.BytesSent;
                        dailyStats.BytesReceived = result.BytesReceived;
                        days.Add(dailyStats);
                    }
                    
                    // advance day
                    date = date.AddDays(1);
                }
            }
            catch(Exception ex)
            {
                Log.WriteError("Could not get SmarterMail domain statistics", ex);
            }
            return (DailyStatistics[])days.ToArray(typeof(DailyStatistics));
        }
Beispiel #13
0
        /// <summary>
        /// 计算用户某天的统计
        /// </summary>
        /// <param name="UserID">用户ID</param>
        /// <param name="Date">某天</param>
        public DailyStatistics   CalculateDailyStatistics(string UserID, DateTime Date)
        {
            //需要添加的未签到和未签退记录
            List <AttendanceLog> als = new List <AttendanceLog>();

            #region 得到基础的日统计对象
            //得到基础的日统计对象
            DailyStatistics dsd = new DailyStatistics();
            dsd.DS_AllCount        = 0;
            dsd.DS_ComeLateCount   = 0;
            dsd.DS_InTimeCount     = 0;
            dsd.DS_LeaveEarlyCount = 0;
            dsd.DS_NoSignInCount   = 0;
            dsd.DS_NoSignOutCount  = 0;
            dsd.DS_RealCount       = 0;
            dsd.DS_UserID          = UserID;
            dsd.DS_Date            = Date.Date;
            dsd.DS_IsNormal        = 0;
            dsd.DS_IsAbsent        = 0;
            #endregion
            #region 用户该天不存在日统计数据,则计算出来
            //计算数据
            AttendanceScheduling ats = _attendanceSchedulingRepository.GetByUserIDAndDate(UserID, Date.Date).AsNoTracking().FirstOrDefault();
            if (ats != null)
            {
                //应签次数
                //记录日志
                writestr(UserID + Date.ToString() + "的排班ID:" + ats.AS_ID);
                if (ats.AS_CommutingType == WorkTimeType.一天二上下班.ToString())
                {
                    dsd.DS_AllCount = 4;
                }
                else if (ats.AS_CommutingType == WorkTimeType.一天一上下班.ToString())
                {
                    dsd.DS_AllCount = 2;
                }
                //得到当天数据库中的签到记录条数
                int count = _AttendanceLogRepository.GetDayCount(UserID, ats.AS_DateTime);
                if (dsd.DS_AllCount == count)
                {
                    #region 用户当天数据库中的签到记录条数=应签到次数,则直接取对应种类的记录数量就可以了
                    //可以通过Sql语句来优化,不再每种都去读取一遍
                    DateTime      d1 = Date.Date;
                    DateTime      d2 = Date.AddDays(1).Date;
                    StringBuilder sb = new StringBuilder();
                    sb.Append("select top 1 (select COUNT(AL_Status)  from AttendanceLog where AL_Status='准点'  and AL_UserID='" + UserID + "' and  AL_Date>='" + d1 + "' and AL_Date<'" + d2 + "' ) as DS_InTimeCount,");
                    sb.Append("(select COUNT(AL_Status)  from AttendanceLog where AL_Status='迟到'  and AL_UserID='" + UserID + "' and  AL_Date>='" + d1 + "' and AL_Date<'" + d2 + "' ) as DS_ComeLateCount,");
                    sb.Append("(select COUNT(AL_Status)  from AttendanceLog where AL_Status='早退'  and AL_UserID='" + UserID + "' and  AL_Date>='" + d1 + "' and AL_Date<'" + d2 + "' ) as DS_LeaveEarlyCount,");
                    sb.Append("(select COUNT(AL_Status)  from AttendanceLog where AL_Status='未签到'  and AL_UserID='" + UserID + "' and  AL_Date>='" + d1 + "' and AL_Date<'" + d2 + "' ) as DS_NoSignInCount,");
                    sb.Append("(select COUNT(AL_Status)  from AttendanceLog where AL_Status='未签退'  and AL_UserID='" + UserID + "' and  AL_Date>='" + d1 + "' and AL_Date<'" + d2 + "' ) as DS_NoSignOutCount,");
                    sb.Append("(case AL_CommutingType when '一天一上下班' then 2 else 4 end ) as DS_AllCount");
                    sb.Append(" from [AttendanceLog]");
                    var DailyStatisticsDto = smoONEContext.Database.SqlQuery <DailyStatisticsDto>(sb.ToString()).FirstOrDefault();
                    dsd.DS_ComeLateCount   = DailyStatisticsDto.DS_ComeLateCount;
                    dsd.DS_InTimeCount     = DailyStatisticsDto.DS_InTimeCount;
                    dsd.DS_LeaveEarlyCount = DailyStatisticsDto.DS_LeaveEarlyCount;
                    dsd.DS_NoSignInCount   = DailyStatisticsDto.DS_NoSignInCount;
                    dsd.DS_NoSignOutCount  = DailyStatisticsDto.DS_NoSignOutCount;
                    dsd.DS_RealCount       = DailyStatisticsDto.DS_ComeLateCount + DailyStatisticsDto.DS_InTimeCount + DailyStatisticsDto.DS_LeaveEarlyCount;
                    if (dsd.DS_AllCount == dsd.DS_InTimeCount)
                    {
                        dsd.DS_IsNormal = 1;
                    }
                    if (dsd.DS_AllCount == dsd.DS_NoSignInCount + dsd.DS_NoSignOutCount)
                    {
                        dsd.DS_IsAbsent = 1;
                    }
                    #endregion
                }
                else
                {
                    #region 存在未签到/未签退的情况,只能逐条去判断
                    //存在未签到/未签退的情况,只能逐条去判断
                    foreach (StatisticsTime st in Enum.GetValues(typeof(StatisticsTime)))
                    {
                        string sTime = st.ToString();
                        if (ats.AS_CommutingType == WorkTimeType.一天二上下班.ToString() && sTime.Contains("午"))
                        {
                            #region 处理一天二上下班的情况
                            //得到记录
                            AttendanceLog al = _AttendanceLogRepository.GetByStatisticsTime(UserID, ats.AS_DateTime.Date, st).AsNoTracking().FirstOrDefault();
                            if (al == null)
                            {
                                #region 没有记录,则记录对应的未签到/未签退记录
                                //没有记录,则记录对应的未签到/未签退记录
                                AttendanceLog al2 = new AttendanceLog();
                                al2.AL_CommutingType = ats.AS_CommutingType;
                                al2.AL_Date          = ats.AS_DateTime.Date;
                                al2.AL_LogTimeType   = sTime;
                                al2.AL_UserID        = UserID;
                                if (sTime.Contains("上班"))
                                {
                                    //未签到
                                    dsd.DS_NoSignInCount++;
                                    if (sTime.Contains("上午"))
                                    {
                                        al2.AL_OnTime = ats.AS_AMStartTime.Value;
                                    }
                                    else
                                    {
                                        al2.AL_OnTime = ats.AS_PMStartTime.Value;
                                    }
                                    al2.AL_Status = AttendanceType.未签到.ToString();
                                }
                                else
                                {
                                    //未签退
                                    dsd.DS_NoSignOutCount++;
                                    if (sTime.Contains("上午"))
                                    {
                                        al2.AL_OnTime = ats.AS_AMEndTime.Value;
                                    }
                                    else
                                    {
                                        al2.AL_OnTime = ats.AS_PMEndTime.Value;
                                    }
                                    al2.AL_Status = AttendanceType.未签退.ToString();
                                }
                                als.Add(al2);
                                #endregion
                            }
                            else
                            {
                                #region   记录,则直接判断记录的类型
                                //有记录,则直接判断记录的类型
                                switch (al.AL_Status)
                                {
                                case "准点":
                                    dsd.DS_InTimeCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "迟到":
                                    dsd.DS_ComeLateCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "早退":
                                    dsd.DS_LeaveEarlyCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "未签到":
                                    dsd.DS_NoSignInCount++;
                                    break;

                                case "未签退":
                                    dsd.DS_NoSignOutCount++;
                                    break;

                                default:
                                    break;
                                }
                                #endregion
                            }
                            #endregion
                        }
                        else if (ats.AS_CommutingType == WorkTimeType.一天一上下班.ToString() && !sTime.Contains("午"))
                        {
                            //得到记录
                            AttendanceLog al = _AttendanceLogRepository.GetByStatisticsTime(UserID, ats.AS_DateTime.Date, st).AsNoTracking().FirstOrDefault();
                            if (al == null)
                            {
                                #region 没有记录,则记录对应的未签到/未签退记录
                                //没有记录,则记录对应的未签到/未签退记录
                                AttendanceLog al2 = new AttendanceLog();
                                al2.AL_CommutingType = ats.AS_CommutingType;
                                al2.AL_Date          = ats.AS_DateTime.Date;
                                al2.AL_LogTimeType   = sTime;
                                al2.AL_UserID        = UserID;
                                if (sTime.Contains("上班"))
                                {
                                    //未签到
                                    dsd.DS_NoSignInCount++;
                                    al2.AL_OnTime = ats.AS_StartTime.Value;
                                    al2.AL_Status = AttendanceType.未签到.ToString();
                                }
                                else
                                {
                                    //未签退
                                    dsd.DS_NoSignOutCount++;
                                    al2.AL_OnTime = ats.AS_EndTime.Value;
                                    al2.AL_Status = AttendanceType.未签退.ToString();
                                }
                                als.Add(al2);
                                #endregion
                            }
                            else
                            {
                                #region   记录,则直接判断记录的类型
                                //有记录,则直接判断记录的类型
                                switch (al.AL_Status)
                                {
                                case "准点":
                                    dsd.DS_InTimeCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "迟到":
                                    dsd.DS_ComeLateCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "早退":
                                    dsd.DS_LeaveEarlyCount++;
                                    dsd.DS_RealCount++;
                                    break;

                                case "未签到":
                                    dsd.DS_NoSignInCount++;
                                    break;

                                case "未签退":
                                    dsd.DS_NoSignOutCount++;
                                    break;

                                default:
                                    break;
                                }
                                #endregion
                            }
                        }
                    }
                    #endregion
                }
                if (dsd.DS_AllCount == dsd.DS_InTimeCount)
                {
                    dsd.DS_IsNormal = 1;
                }
                if (dsd.DS_AllCount == dsd.DS_NoSignInCount + dsd.DS_NoSignOutCount)
                {
                    dsd.DS_IsAbsent = 1;
                }
            }
            #endregion

            #region 保存未签到/未签退的记录
            //保存未签到/未签退的记录
            if (als.Count > 0)
            {
                try
                {
                    foreach (AttendanceLog a in als)
                    {
                        _unitOfWork.RegisterNew(a);
                    }
                    bool result = _unitOfWork.Commit();
                }
                catch (Exception ex)
                {
                    _unitOfWork.Rollback();
                }
            }
            #endregion

            #region 保存未记录的每日统计数据
            //保存未记录的每日统计数据
            try
            {
                _unitOfWork.RegisterNew(dsd);
                bool result = _unitOfWork.Commit();
            }
            catch (Exception ex)
            {
                _unitOfWork.Rollback();
            }
            #endregion

            return(dsd);
        }
Beispiel #14
0
        /// <summary>
        /// 执行统计(主要包括补全昨天及之前的排班,补全昨天及之前的未签记录和用户日统计,补全上个月及之前的用户月统计,补全上个月及之前的月总统计)
        /// </summary>
        public void RunStatistics()
        {
            try
            {
                writestr("服务运行.");
                //这里执行你的东西
                #region 计算模板当天的排班以及补全之前的排班
                //得到今天所有的模板
                List <string> ATIDs = _AT_UserLogRepository.GetATIDByDate(DateTime.Now.Date).AsNoTracking().ToList();
                StringBuilder ATids = new StringBuilder();
                if (ATIDs != null && ATIDs.Count > 0)
                {
                    foreach (string ATID in ATIDs)
                    {
                        ATids.Append(ATID.ToString() + ",");
                        //得到每个模板某天的排班
                        AttendanceScheduling ass = _attendanceSchedulingRepository.GetByATIDandDate(ATID, DateTime.Now.Date).FirstOrDefault();
                        if (ass != null)
                        {
                        }
                        else
                        {
                            AttendanceTemplate at = _AttendanceTemplateRepository.GetByID(ATID).AsNoTracking().FirstOrDefault();
                            //当天无排班,则先添加排班
                            if (at != null)
                            {
                                AddHisAttendanceScheduling(at);
                            }
                        }
                    }
                    writestr(ATids.ToString());
                }
                #endregion

                #region 计算用户的所有日统计
                //得到有过模板的所有用户
                List <string> UserNames = _AT_UserLogRepository.GetAll().Select(o => o.AT_UL_UserID).Distinct().ToList();
                //用于日志判断
                StringBuilder uName = new StringBuilder();
                foreach (string User in UserNames)
                {
                    uName.Append(User + ",");
                }
                writestr(uName.ToString());

                foreach (string User in UserNames)
                {
                    //判断用户昨天的日统计是否存在
                    DailyStatistics ds = _dailyStatisticsRepository.GetDSByUser(User, DateTime.Now.AddDays(-1).Date).AsNoTracking().FirstOrDefault();
                    if (ds == null)
                    {
                        //用户昨天没有日统计数据,则可能需要补日统计数据
                        //先得到用户最后的日统计数据日期

                        //用于日志判断
                        writestr(User + "昨天的ds为null");

                        ds = _dailyStatisticsRepository.GetNewestByUser(User);
                        DateTime Newest = DateTime.MinValue.Date;
                        if (ds != null)
                        {
                            Newest = ds.DS_Date.AddDays(1).Date;
                        }
                        writestr("Newest日期:" + Newest.ToString());
                        DateTime   EndDate = DateTime.Now.Date;
                        AT_UserLog au      = _AT_UserLogRepository.GetNewestByUser(User);
                        if (au != null && au.AT_UL_EndTime != DateTime.MaxValue)
                        {
                            writestr(au.AT_UL_EndTime.ToString());
                            EndDate = au.AT_UL_EndTime.AddDays(1).Date;
                        }
                        writestr("EndDate日期:" + EndDate.ToString());
                        //得到可能需要补全日统计数据的日期
                        List <DateTime> dates = _attendanceSchedulingRepository.GetByUserIDAndPeriod(User, Newest, EndDate).Select(o => o.AS_DateTime).ToList();
                        //记录日志
                        StringBuilder d = new StringBuilder();
                        if (dates != null && dates.Count > 0)
                        {
                            d.Append("需要补全的日期:");
                            foreach (DateTime dt in dates)
                            {
                                d.Append(dt.ToString() + " ");
                            }
                        }
                        if (dates != null && dates.Count > 0)
                        {
                            foreach (DateTime dt in dates)
                            {
                                CalculateDailyStatistics(User, dt.Date);
                            }
                        }
                    }
                }
                #endregion

                #region 计算用户的月统计和总的月统计
                foreach (string User in UserNames)
                {
                    //判断用户上个月的统计是否存在
                    writestr("进入" + User + "月统计");
                    MonthlyStatistics ms = _monthlyStatisticsRepository.GetUserMonthlyStatistics(User, DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month).AsNoTracking().FirstOrDefault();
                    if (ms == null)
                    {
                        //从排班中获取需要统计的月份
                        //得到用户最近的月统计月份
                        writestr(User + "上个月不存在月统计.");
                        ms = _monthlyStatisticsRepository.GetNewestUserMonthlyStatistics(User);
                        //加入日志
                        writestr("ms没报错.");
                        int StartYear  = 0;
                        int StartMonth = 0;
                        if (ms != null)
                        {
                            StartYear  = ms.MS_Year;
                            StartMonth = ms.MS_Month;
                        }
                        else
                        {
                            DailyStatistics ds = _dailyStatisticsRepository.GetOldestByUser(User);
                            if (ds != null)
                            {
                                StartYear  = ds.DS_Date.AddMonths(-1).Year;
                                StartMonth = ds.DS_Date.AddMonths(-1).Month;
                            }
                        }
                        //加入日志
                        writestr("StartYear:" + StartYear.ToString() + ";StartMonth:" + StartMonth.ToString());
                        if (StartYear != 0)
                        {
                            //用户至少有一条日统计数据才可能需要计算月统计数据
                            //得到用户需要统计的所有年和月
                            StringBuilder s = new StringBuilder();
                            s.Append(StartYear);
                            if (StartMonth < 10)
                            {
                                s.Append("0");
                            }
                            s.Append(StartMonth);
                            s.Append("01");
                            string        temp      = s.ToString();
                            DateTime      StartTemp = DateTime.ParseExact(temp, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
                            DateTime      StartDate = StartTemp.AddMonths(1).Date;
                            StringBuilder sb        = new StringBuilder();
                            sb.Append("select DS_UserID MS_UserID, year(DS_Date) MS_Year, month(DS_Date) MS_Month ,");
                            sb.Append("sum(DS_AllCount) MS_AllCount,sum(DS_RealCount) MS_RealCount,sum(DS_InTimeCount) MS_InTimeCount,");
                            sb.Append("sum(DS_ComeLateCount) MS_ComeLateCount,sum(DS_LeaveEarlyCount) MS_LeaveEarlyCount,");
                            sb.Append("sum(DS_NoSignInCount) MS_NoSignInCount,sum(DS_NoSignOutCount) MS_NoSignOutCount,");
                            sb.Append("sum(DS_IsNormal) DS_NormalDayCount,sum(DS_IsAbsent) DS_AbsentDayCount,count(DS_Date) DS_AllDayCount");
                            sb.Append(" from DailyStatistics");
                            sb.Append(" where DS_UserID='" + User + "' and  DS_Date>='" + StartDate + "' group by year(DS_Date), month(DS_Date),DS_UserID");
                            //加入日志
                            writestr("Sql语句:" + sb.ToString());
                            var MonthlyStatisticsDto = smoONEContext.Database.SqlQuery <MonthlyStatisticsDto>(sb.ToString()).ToList();
                            if (MonthlyStatisticsDto != null && MonthlyStatisticsDto.Count > 0)
                            {
                                //加入日志
                                writestr("MonthlyStatisticsDto未报错.");
                                foreach (MonthlyStatisticsDto msd in MonthlyStatisticsDto)
                                {
                                    if (msd.MS_Year == DateTime.Now.Year && msd.MS_Month == DateTime.Now.Month)
                                    {
                                        //当月的不记入数据库
                                    }
                                    else
                                    {
                                        //保存月统计记录
                                        try
                                        {
                                            MonthlyStatistics ms2 = new MonthlyStatistics();
                                            ms2.DS_AbsentDayCount  = msd.DS_AbsentDayCount;
                                            ms2.DS_AllDayCount     = msd.DS_AllDayCount;
                                            ms2.DS_NormalDayCount  = msd.DS_NormalDayCount;
                                            ms2.MS_AllCount        = msd.MS_AllCount;
                                            ms2.MS_ComeLateCount   = msd.MS_ComeLateCount;
                                            ms2.MS_InTimeCount     = msd.MS_InTimeCount;
                                            ms2.MS_LeaveEarlyCount = msd.MS_LeaveEarlyCount;
                                            ms2.MS_Month           = msd.MS_Month;
                                            ms2.MS_NoSignInCount   = msd.MS_NoSignInCount;
                                            ms2.MS_NoSignOutCount  = msd.MS_NoSignOutCount;
                                            ms2.MS_RealCount       = msd.MS_RealCount;
                                            ms2.MS_UserID          = msd.MS_UserID;
                                            ms2.MS_Year            = msd.MS_Year;
                                            _unitOfWork.RegisterNew(ms2);
                                            bool result = _unitOfWork.Commit();
                                            //加入日志
                                            if (result == true)
                                            {
                                                writestr(ms2.MS_Year.ToString() + ms2.MS_Month.ToString() + "的ms2成功添加.");
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            _unitOfWork.Rollback();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                //计算总的月统计
                //上个月的月统计是否存在
                MonthlyResult mr = _monthlyResultRepository.GetMonthlyResult(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month).AsNoTracking().FirstOrDefault();
                if (mr == null)
                {
                    //上个月总统计不存在
                    //先得到最近的总统计
                    //加入日志
                    writestr("上个月的总月统计不存在.");
                    mr = _monthlyResultRepository.GetAll().OrderByDescending(o => o.MR_Year).ThenByDescending(o => o.MR_Month).FirstOrDefault();
                    int StartYear  = 0;
                    int StartMonth = 0;
                    if (mr == null)
                    {
                        //之前都不存在月总统计
                        MonthlyStatistics ms = _monthlyStatisticsRepository.GetAll().OrderBy(o => o.MS_Year).ThenBy(o => o.MS_Month).AsNoTracking().FirstOrDefault();
                        if (ms != null)
                        {
                            StartYear  = ms.MS_Year;
                            StartMonth = ms.MS_Month;
                        }
                    }
                    else
                    {
                        //之前存在月总统计
                        if (mr.MR_Month < 12)
                        {
                            StartYear  = mr.MR_Year;
                            StartMonth = mr.MR_Month + 1;
                        }
                        else
                        {
                            StartYear  = mr.MR_Year + 1;
                            StartMonth = 1;
                        }
                    }
                    //加入日志
                    writestr("月总统计的StartYear:" + StartYear.ToString() + ",StartMonth:" + StartMonth.ToString());
                    if (StartYear != 0)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("select distinct MS_Year, MS_Month from MonthlyStatistics ");
                        sb.Append(" where (MS_Year=" + StartYear + " and MS_Month>=" + StartMonth + ") or MS_Year>" + StartYear);
                        //加入日志
                        writestr("得到需要月总统计的年月的Sql:" + sb.ToString());
                        var YearAndMonths = smoONEContext.Database.SqlQuery <MonthlyStatisticsDto>(sb.ToString()).ToList();
                        if (YearAndMonths != null && YearAndMonths.Count > 0)
                        {
                            //加入日志
                            writestr("YearAndMonths未报错.");
                            foreach (MonthlyStatisticsDto yam in YearAndMonths)
                            {
                                //加入日志
                                writestr("YearAndMonth:" + yam.MS_Year.ToString() + yam.MS_Month.ToString());
                                if (yam.MS_Year == DateTime.Now.Year && yam.MS_Month == DateTime.Now.Month)
                                {
                                    //当月的不保存
                                }
                                else
                                {
                                    //加入日志
                                    writestr("进入月总统计的计算.");
                                    CalculateMonthlyResult(yam.MS_Year, yam.MS_Month);
                                }
                            }
                        }
                    }
                }
                #endregion
                Thread.Sleep(10000);
            }
            catch (Exception err)
            {
                writestr(err.Message);
            }
        }