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); }
/// <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); } }
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); }
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(); } }
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(); } }
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)); } }
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); }
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)); }
/// <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); }
/// <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); } }