static void Main2(string[] args) { using (MyDbContext dbc = new MyDbContext()) { dbc.Database.Log = (sql) => { Console.WriteLine(sql); }; long stateId = dbc.GetId <IdNameEntity>(i => i.Name == "已完成"); string val = dbc.GetParameter <SettingEntity>(s => s.Name == "自动确认收货时间", s => s.Param); double day; double.TryParse(val, out day); if (day == 0) { day = 7; } //Expression<Func<OrderEntity, bool>> timewhere = r => r.ConsignTime == null ? false : r.ConsignTime.Value.AddDays(Convert.ToDouble(val)) < DateTime.Now; //var orders = dbc.GetAll<OrderEntity>().Where(r => r.OrderState.Name == "已发货").Where(timewhere.Compile()).ToList(); var orders = dbc.GetAll <OrderEntity>().Where(r => r.OrderState.Name == "已发货").Where(r => SqlFunctions.DateAdd("day", day, r.ConsignTime) < DateTime.Now); foreach (OrderEntity order in orders) { order.EndTime = DateTime.Now; order.OrderStateId = stateId; } val = dbc.GetParameter <SettingEntity>(s => s.Name == "不能退货时间", s => s.Param); double.TryParse(val, out day); if (day == 0) { day = 3; } //timewhere = r => r.EndTime == null ? false : r.EndTime.Value.AddDays(Convert.ToDouble(val)) < DateTime.Now; //orders = dbc.GetAll<OrderEntity>().Where(r => r.OrderState.Name == "已完成" || r.OrderState.Name == "退货审核").Where(timewhere.Compile()).ToList(); var orders1 = dbc.GetAll <OrderEntity>().Where(r => r.CloseTime == null).Where(r => r.OrderState.Name == "已完成" || r.OrderState.Name == "退货审核").Where(r => SqlFunctions.DateAdd("day", day, r.EndTime) < DateTime.Now); List <string> orderCodes = new List <string>(); foreach (OrderEntity order in orders1) { order.OrderStateId = stateId; order.CloseTime = DateTime.Now; orderCodes.Add(order.Code); } //UserEntity user = await dbc.GetAll<UserEntity>().SingleOrDefaultAsync(u=>u.Id==order.BuyerId); var journals = dbc.GetAll <JournalEntity>().Where(j => orderCodes.Contains(j.OrderCode) && j.JournalTypeId == 1 && j.IsEnabled == false); Dictionary <long, long> dicts = new Dictionary <long, long>(); foreach (JournalEntity journal in journals) { dicts.Add(journal.Id, journal.UserId); } foreach (var dict in dicts) { //UserEntity user = dbc.GetAll<UserEntity>().SingleOrDefault(u => u.Id == journal.UserId); var user = dbc.GetAll <UserEntity>().SingleOrDefault(u => u.Id == dict.Value); JournalEntity journal = dbc.GetAll <JournalEntity>().SingleOrDefault(j => j.Id == dict.Key); user.Amount = user.Amount + journal.InAmount.Value; user.FrozenAmount = user.FrozenAmount - journal.InAmount.Value; user.BonusAmount = user.BonusAmount + journal.InAmount.Value; journal.BalanceAmount = user.Amount; journal.IsEnabled = true; } dbc.SaveChanges(); } Console.ReadKey(); }
/// <summary> /// 获取统计对象关联的设备能耗 /// </summary> /// <param name="transfer">统计对象</param> /// <param name="timeUnit">时间单位</param> /// <param name="start">起始时间</param> /// <param name="finish">完成时间</param> /// <param name="parameter">统计参数</param> /// <returns></returns> private IQueryable <IMeterResult> GetMeterResult(StatisticalTransfer transfer, TimeUnits timeUnit, DateTime start, DateTime finish, int parameterTypeId) { IQueryable <IMeterResult> meterResult = null; var ersid = SystemInfo.EffectiveResultStatusId.ToList(); // 获取参数对象 var parameters = db.Parameters.Where(p => p.TypeId == parameterTypeId).Select(p => p.Id); var meterId = transfer.Meters.Select(m => m.Id); var ids = meterId.ToList(); // 根据时间单位获取设备能耗 switch (timeUnit) { case TimeUnits.Hourly: case TimeUnits.H24: case TimeUnits.H48: case TimeUnits.H72: meterResult = db.MeterHourlyResults.Where(mr => meterId.Contains(mr.MeterId)); break; case TimeUnits.Daily: meterResult = db.MeterDailyResults.Where(mr => meterId.Contains(mr.MeterId)); break; case TimeUnits.Monthly: case TimeUnits.Quarterly: meterResult = db.MeterMonthlyResults.Where(mr => meterId.Contains(mr.MeterId)); break; case TimeUnits.Yearly: meterResult = from mr in db.MeterMonthlyResults where meterId.Contains(mr.MeterId) && !DictionaryCache.EnergyStatusIdNotUsed.Contains(mr.Status) select new MeterResult { Id = mr.Id, Meter = mr.Meter, MeterId = mr.MeterId, Parameter = mr.Parameter, ParameterId = mr.ParameterId, Status = mr.Status, StatusDict = mr.StatusDict, Unit = mr.Unit, StartTime = SqlFunctions.DateAdd("ms", -( (SqlFunctions.DatePart("hh", mr.StartTime) * 3600000) + (SqlFunctions.DatePart("n", mr.StartTime) * 60000) + (SqlFunctions.DatePart("s", mr.StartTime) * 1000) + SqlFunctions.DatePart("ms", mr.StartTime) ), SqlFunctions.DateAdd("dy", -(SqlFunctions.DatePart("dy", mr.StartTime) - 1), mr.StartTime).Value ).Value, FinishTime = mr.FinishTime, Total = mr.Total }; break; case TimeUnits.Daytime: meterResult = from mr in db.MeterHourlyResults where meterId.Contains(mr.MeterId) && (SqlFunctions.DatePart("hh", mr.StartTime) >= 7 && SqlFunctions.DatePart("hh", mr.StartTime) <= 19) select new MeterResult { Id = mr.Id, Meter = mr.Meter, MeterId = mr.MeterId, Parameter = mr.Parameter, ParameterId = mr.ParameterId, Status = mr.Status, StatusDict = mr.StatusDict, Unit = mr.Unit, StartTime = SqlFunctions.DateAdd("ms", -( (SqlFunctions.DatePart("hh", mr.StartTime) * 3600000) + (SqlFunctions.DatePart("n", mr.StartTime) * 60000) + (SqlFunctions.DatePart("s", mr.StartTime) * 1000) + SqlFunctions.DatePart("ms", mr.StartTime) ), mr.StartTime ).Value, FinishTime = mr.FinishTime, Total = mr.Total }; break; case TimeUnits.Nighttime: meterResult = from mr in db.MeterHourlyResults where meterId.Contains(mr.MeterId) && (SqlFunctions.DatePart("hh", mr.StartTime) <= 7 && SqlFunctions.DatePart("hh", mr.StartTime) >= 19) select new MeterResult { Id = mr.Id, Meter = mr.Meter, MeterId = mr.MeterId, Parameter = mr.Parameter, ParameterId = mr.ParameterId, Status = mr.Status, StatusDict = mr.StatusDict, Unit = mr.Unit, StartTime = SqlFunctions.DateAdd("ms", -( (SqlFunctions.DatePart("hh", mr.StartTime) * 3600000) + (SqlFunctions.DatePart("n", mr.StartTime) * 60000) + (SqlFunctions.DatePart("s", mr.StartTime) * 1000) + SqlFunctions.DatePart("ms", mr.StartTime) ), mr.StartTime ).Value, FinishTime = mr.FinishTime, Total = mr.Total }; break; case TimeUnits.Midnight: meterResult = from mr in db.MeterHourlyResults where meterId.Contains(mr.MeterId) && SqlFunctions.DatePart("hh", mr.StartTime) <= 6 select new MeterResult { Id = mr.Id, Meter = mr.Meter, MeterId = mr.MeterId, Parameter = mr.Parameter, ParameterId = mr.ParameterId, Status = mr.Status, StatusDict = mr.StatusDict, Unit = mr.Unit, StartTime = SqlFunctions.DateAdd("ms", -( (SqlFunctions.DatePart("hh", mr.StartTime) * 3600000) + (SqlFunctions.DatePart("n", mr.StartTime) * 60000) + (SqlFunctions.DatePart("s", mr.StartTime) * 1000) + SqlFunctions.DatePart("ms", mr.StartTime) ), mr.StartTime ).Value, FinishTime = mr.FinishTime, Total = mr.Total }; break; default: throw new System.IndexOutOfRangeException("时间单位(TimeUnit)不在指定范围内!"); } // 根据统计条件过滤设备能耗 var result = from r in meterResult where r.StartTime >= start && r.FinishTime <= finish && ersid.Contains(r.Status) //&& parameters.Contains(r.ParameterId)!!!!!!!!!!!!!!只会有一个值 select r; return(result); }
public void Execute(IJobExecutionContext context) { var rockContext = new RockContext(); var dataMap = context.JobDetail.JobDataMap; var systemEmailGuid = dataMap.GetString("Email").AsGuidOrNull(); string appRoot = Rock.Web.Cache.GlobalAttributesCache.Read().GetValue("PublicApplicationRoot"); if (appRoot.IsNullOrWhiteSpace()) { throw new Exception("Couldn't fetch application root!"); } if (systemEmailGuid == null) { throw new Exception("A system email template needs to be set."); } var systemEmailTemplate = new SystemEmailService(rockContext).Get(systemEmailGuid.Value); if (systemEmailTemplate == null) { throw new Exception("The system email template setting is not a valid system email template."); } var cutOffHours = dataMap.GetString("ExcludeHours").AsIntegerOrNull(); if (!cutOffHours.HasValue) { throw new Exception("A cutoff period needs to be set."); } var cutoff = RockDateTime.Now.AddHours(-1 * cutOffHours.Value); var connectionRequestService = new ConnectionRequestService(rockContext); var midnightToday = new DateTime(RockDateTime.Now.Year, RockDateTime.Now.Month, RockDateTime.Now.Day); var currentDateTime = RockDateTime.Now; var openConnectionRequests = connectionRequestService.Queryable() .AsNoTracking() .Where(cr => cr.CreatedDateTime < cutoff && (cr.ConnectionState == ConnectionState.Active || (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < midnightToday))); if (!openConnectionRequests.Any()) { context.Result = "There are no open and assigned connection requests to send reminders for"; return; } int totalCriticalCount = openConnectionRequests.Count(cr => cr.ConnectionStatus.IsCritical); int totalIdleCount = openConnectionRequests .Count(cr => (cr.ConnectionRequestActivities.Any() && cr.ConnectionRequestActivities.Max(ra => ra.CreatedDateTime) < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) || (!cr.ConnectionRequestActivities.Any() && cr.CreatedDateTime < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) ); var groupedRequests = openConnectionRequests .Where(cr => cr.ConnectorPersonAliasId != null) .GroupBy(cr => cr.ConnectorPersonAlias); int mailedCount = 0; foreach (var connectionRequestGrouping in groupedRequests) { var connectionRequests = connectionRequestGrouping.ToList(); var mergeFields = new Dictionary <string, object> { { "ConnectionRequests", connectionRequests }, { "Person", connectionRequestGrouping.Key.Person }, { "CriticalCount", connectionRequests.Count(cr => cr.ConnectionStatus.IsCritical) }, { "IdleCount", connectionRequests.Count(cr => { var idleDate = currentDateTime.AddDays(-cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle); return(cr.ConnectionRequestActivities.Any() && cr.ConnectionRequestActivities.Max(ra => ra.CreatedDateTime) < idleDate || (!cr.ConnectionRequestActivities.Any() && cr.CreatedDateTime < idleDate)); }) }, { "TotalIdleCount", totalIdleCount }, { "TotalCriticalCount", totalCriticalCount } }; var recipients = new List <string> { connectionRequestGrouping.Key.Person.Email }; Email.Send(systemEmailTemplate.From.ResolveMergeFields(mergeFields), systemEmailTemplate.FromName.ResolveMergeFields(mergeFields), systemEmailTemplate.Subject.ResolveMergeFields(mergeFields), recipients, systemEmailTemplate.Body.ResolveMergeFields(mergeFields), appRoot, null, null); mailedCount++; } context.Result = string.Format("{0} reminders were sent ", mailedCount); }
/// <summary> /// Gets the summary data. /// </summary> private void GetSummaryData() { SummaryState = new List <ConnectionTypeSummary>(); var rockContext = new RockContext(); var opportunities = new ConnectionOpportunityService(rockContext) .Queryable().AsNoTracking(); var typeFilter = GetAttributeValue("ConnectionTypes").SplitDelimitedValues().AsGuidList(); if (typeFilter.Any()) { opportunities = opportunities.Where(o => typeFilter.Contains(o.ConnectionType.Guid)); } // Loop through opportunities foreach (var opportunity in opportunities) { // Check to see if person can view the opportunity because of admin rights to this block or admin rights to // the opportunity bool canView = UserCanAdministrate || opportunity.IsAuthorized(Authorization.ADMINISTRATE, CurrentPerson); bool campusSpecificConnector = false; var campusIds = new List <int>(); if (CurrentPersonId.HasValue) { // Check to see if person belongs to any connector group that is not campus specific if (!canView) { canView = opportunity .ConnectionOpportunityConnectorGroups .Any(g => !g.CampusId.HasValue && g.ConnectorGroup != null && g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value)); } // If user is not yet authorized to view the opportunity, check to see if they are a member of one of the // campus-specific connector groups for the opportunity, and note the campus if (!canView) { foreach (var groupCampus in opportunity .ConnectionOpportunityConnectorGroups .Where(g => g.CampusId.HasValue && g.ConnectorGroup != null && g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value))) { campusSpecificConnector = true; canView = true; campusIds.Add(groupCampus.CampusId.Value); } } } // Is user is authorized to view this opportunity type... if (canView) { // Check if the opportunity's type has been added to summary yet, and if not, add it var connectionTypeSummary = SummaryState.Where(c => c.Id == opportunity.ConnectionTypeId).FirstOrDefault(); if (connectionTypeSummary == null) { connectionTypeSummary = new ConnectionTypeSummary { Id = opportunity.ConnectionTypeId, Name = opportunity.ConnectionType.Name, Opportunities = new List <OpportunitySummary>() }; SummaryState.Add(connectionTypeSummary); } // Count number of idle requests (no activity in past X days) var connectionRequestsQry = new ConnectionRequestService(rockContext).Queryable().Where(a => a.ConnectionOpportunityId == opportunity.Id); var currentDateTime = RockDateTime.Now; int idleCount = connectionRequestsQry .Where(cr => ( cr.ConnectionState == ConnectionState.Active || (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < _midnightToday) ) && ( (cr.ConnectionRequestActivities.Any() && cr.ConnectionRequestActivities.Max(ra => ra.CreatedDateTime) < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime))) || (!cr.ConnectionRequestActivities.Any() && cr.CreatedDateTime < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) ) .Count(); // Count the number requests that have a status that is considered critical. int criticalCount = connectionRequestsQry .Where(r => r.ConnectionStatus.IsCritical && ( r.ConnectionState == ConnectionState.Active || (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < _midnightToday) ) ) .Count(); // Add the opportunity var opportunitySummary = new OpportunitySummary { Id = opportunity.Id, Name = opportunity.Name, IconCssClass = opportunity.IconCssClass, IdleCount = idleCount, CriticalCount = criticalCount }; // If the user is limited requests with specific campus(es) set the list, otherwise leave it to be null opportunitySummary.CampusSpecificConnector = campusSpecificConnector; opportunitySummary.ConnectorCampusIds = campusIds.Distinct().ToList(); connectionTypeSummary.Opportunities.Add(opportunitySummary); } } // Get a list of all the authorized opportunity ids var allOpportunities = SummaryState.SelectMany(s => s.Opportunities).Select(o => o.Id).Distinct().ToList(); // Get all the active and past-due future followup request ids, and include the campus id and personid of connector var midnightToday = RockDateTime.Today.AddDays(1); var activeRequests = new ConnectionRequestService(rockContext) .Queryable().AsNoTracking() .Where(r => allOpportunities.Contains(r.ConnectionOpportunityId) && (r.ConnectionState == ConnectionState.Active || (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < midnightToday))) .Select(r => new { r.ConnectionOpportunityId, r.CampusId, ConnectorPersonId = r.ConnectorPersonAlias != null ? r.ConnectorPersonAlias.PersonId : -1 }) .ToList(); // Based on the active requests, set additional properties for each opportunity foreach (var opportunity in SummaryState.SelectMany(s => s.Opportunities)) { // Get the active requests for this opportunity that user is authorized to view (based on campus connector) var opportunityRequests = activeRequests .Where(r => r.ConnectionOpportunityId == opportunity.Id && ( !opportunity.CampusSpecificConnector || (r.CampusId.HasValue && opportunity.ConnectorCampusIds.Contains(r.CampusId.Value)) )) .ToList(); // The count of active requests assigned to the current person opportunity.AssignedToYou = opportunityRequests.Count(r => r.ConnectorPersonId == CurrentPersonId); // The count of active requests that are unassigned opportunity.UnassignedCount = opportunityRequests.Count(r => r.ConnectorPersonId == -1); // Flag indicating if current user is connector for any of the active types opportunity.HasActiveRequestsForConnector = opportunityRequests.Any(r => r.ConnectorPersonId == CurrentPersonId); } //Set the Idle tooltip var connectionTypes = opportunities.Where(o => allOpportunities.Contains(o.Id)).Select(o => o.ConnectionType).Distinct().ToList(); StringBuilder sb = new StringBuilder(); if (connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().Count() == 1) { sb.Append(String.Format("Idle (no activity in {0} days)", connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().First())); } else { sb.Append("Idle (no activity in several days)<br/><ul class='list-unstyled'>"); foreach (var connectionType in connectionTypes) { sb.Append(String.Format("<li>{0}: {1} days</li>", connectionType.Name, connectionType.DaysUntilRequestIdle)); } sb.Append("</ul>"); } var statusTemplate = this.GetAttributeValue("StatusTemplate"); var statusMergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage); statusMergeFields.Add("ConnectionOpportunities", allOpportunities); statusMergeFields.Add("ConnectionTypes", connectionTypes); statusMergeFields.Add("IdleTooltip", sb.ToString().EncodeHtml()); lStatusBarContent.Text = statusTemplate.ResolveMergeFields(statusMergeFields); BindSummaryData(); }
public void this_DoWork(object sender, EventArgs e) { //EventLog.WriteLog("star1"); try { //纯话务员 var list = userManager.Users.Where(m => m.RoleLevel == 0).Select(m => m.IID).ToList(); //有最近回访日期并且从属于某个话务员的客户 Expression <Func <Customer, bool> > lambda = m => m.AdminId > 0 && m.LastReviewTime != null && m.Frozen == false && m.Dealed == 0; lambda = lambda.And(m => list.Any(x => x == m.AdminId)); using (var customerService = new CustomerService()) { var query = customerService.GetCustomer(lambda); //回访日期超过了规定的天数 var vQuery = query.Where(m => SqlFunctions.DateDiff("dd", DateTime.Now, SqlFunctions.DateAdd("dd", m.Days, m.LastReviewTime)) <= 0); //EventLog.Log("" + vQuery, "info"); EventLog.Log("回访记录开始", "info"); foreach (var item in vQuery) { //int operatorId = item.AdminId; var operatorModel = userManager.Users.FirstOrDefault(m => m.IID == item.AdminId); if (operatorModel == null) //表示话务员不存在 { continue; } using (var customerService1 = new CustomerService()) { var model = customerService1.Get(item.GID); model.AdminId = 0; //话务员编号变为0 model.Recycle = 1; //标记客户为回收状态 model.LastReviewTime = null; customerService1.Update(model); //更新客户资料 EventLog.Log("回收客户编号:" + item.IID, "info"); } } } } catch (Exception ex) { EventLog.Log(ExceptionHelper.GetErrorMessageByLog(ex), "info"); } }
public async Task <IHttpActionResult> GetData([FromUri] Guid vesselId, [FromUri] Guid engineId, [FromUri] string channelId, [FromUri] DateTime fromDate, [FromUri] DateTime toDate) { int readLevel = Util.GetResourcePermission("Vessel", Util.ReourceOperations.Read); if (readLevel == 0) { return(Ok()); } List <Guid> channelIds = channelId.Split(',').Select(Guid.Parse).ToList(); User currentUser = Util.GetCurrentUser(); double offset = Util.GetUserTimeOffset(); fromDate = fromDate.AddSeconds((-1) * offset); toDate = toDate.AddSeconds((-1) * offset).AddDays(1); List <MonitorView> monitorings = await(from m in db.Monitorings join v in db.Vessels on m.IMO_No equals v.IMO_No into mv from m_v in mv join e in db.Engines on m.SerialNo equals e.SerialNo into me from m_e in me join ml in db.Models on m_e.EngineModelID equals ml.Id into mml from m_ml in mml.DefaultIfEmpty() join c in db.Channels on new { m.ChannelNo, ID = m_ml.Id } equals new { c.ChannelNo, ID = c.ModelID.HasValue ? c.ModelID.Value : Guid.Empty } into mch from m_ch in mch.DefaultIfEmpty() join ct in db.ChartTypes on m_ch.ChartTypeID equals ct.Id into mct from m_ct in mct.DefaultIfEmpty() where m.TimeStamp >= fromDate && m.TimeStamp <= toDate && m_v.Id == vesselId && m_e.Id == engineId && channelIds.Contains(m_ch.Id) && ( ((m_v.OwnerID == currentUser.AccountID && readLevel == Util.AccessLevel.Own)) || // Login user is from Operating company ((m_v.OperatorID == currentUser.AccountID && readLevel == Util.AccessLevel.Own)) || // Admin user readLevel == Util.AccessLevel.All ) select new MonitorView { Id = m.Id, IMONo = m.IMO_No, TimeStamp = SqlFunctions.DateAdd("second", offset, m.TimeStamp).Value, TimeStampDateOnly = DbFunctions.TruncateTime(SqlFunctions.DateAdd("second", offset, m.TimeStamp).Value), VesselName = m_v.VesselName, SerialNo = m.SerialNo, EngineID = m_e.Id, //!= null? m_e.Id.ToString() : "", EngineModelID = m_e.EngineModelID, ModelName = m_ml.Name, ChannelNo = m.ChannelNo, Value = m.Value, DisplayUnit = m_ch.DisplayUnit, IncomingChannelName = m.ChannelDescription, ChannelName = m_ch.Name, ChartType = m_ct.Name, Processed = m.Processed, DashboardDisplay = m_ch.DashboardDisplay }).ToListAsync <MonitorView>(); MonitorView mMin = monitorings.OrderBy(m => m.TimeStampDateOnly).FirstOrDefault(); MonitorView mMax = monitorings.OrderByDescending(m => m.TimeStampDateOnly).FirstOrDefault(); if (mMax != null && mMin != null && mMax.TimeStampDateOnly.HasValue && mMin.TimeStampDateOnly.HasValue) { MonitorView mvMin = new MonitorView() { Id = mMin.Id, IMONo = mMin.IMONo, TimeStamp = fromDate.AddSeconds(offset), TimeStampDateOnly = fromDate.AddSeconds(offset).Date, VesselName = mMin.VesselName, SerialNo = mMin.SerialNo, EngineID = mMin.Id, EngineModelID = mMin.EngineModelID, ModelName = mMin.ModelName, ChannelNo = mMin.ChannelNo, Value = "0", DisplayUnit = mMin.DisplayUnit, IncomingChannelName = mMin.IncomingChannelName, ChannelName = mMin.ChannelName, ChartType = mMin.ChartType, Processed = mMin.Processed, DashboardDisplay = mMin.DashboardDisplay }; if (mMin.TimeStampDateOnly != mvMin.TimeStampDateOnly) { monitorings.Add(mvMin); } MonitorView mvMax = new MonitorView() { Id = mMax.Id, IMONo = mMax.IMONo, TimeStamp = toDate.AddSeconds(offset), TimeStampDateOnly = toDate.AddSeconds(offset).Date, VesselName = mMax.VesselName, SerialNo = mMax.SerialNo, EngineID = mMax.Id, EngineModelID = mMax.EngineModelID, ModelName = mMax.ModelName, ChannelNo = mMax.ChannelNo, Value = "0", DisplayUnit = mMax.DisplayUnit, IncomingChannelName = mMax.IncomingChannelName, ChannelName = mMax.ChannelName, ChartType = mMax.ChartType, Processed = mMax.Processed, DashboardDisplay = mMax.DashboardDisplay }; if (mMax.TimeStampDateOnly != mvMax.TimeStampDateOnly) { monitorings.Add(mvMax); } } return(Ok(monitorings)); }
/// <summary> /// Gets the summary data. /// </summary> private void GetSummaryData() { var midnightToday = RockDateTime.Today.AddDays(1); SummaryState = new List <ConnectionTypeSummary>(); var rockContext = new RockContext(); var connectionOpportunityService = new ConnectionOpportunityService(rockContext); var followingService = new FollowingService(rockContext); var opportunityEntityTypeId = EntityTypeCache.Get <ConnectionOpportunity>().Id; var followedOpportunityIds = followingService.Queryable() .AsNoTracking() .Where(f => f.PersonAliasId == CurrentPersonAliasId && f.EntityTypeId == opportunityEntityTypeId && string.IsNullOrEmpty(f.PurposeKey)) .Select(f => f.EntityId) .ToList(); var opportunityQuery = connectionOpportunityService.Queryable() .AsNoTracking() .Where(co => co.IsActive && co.ConnectionType.IsActive); var typeFilter = GetAttributeValue(AttributeKey.ConnectionTypes).SplitDelimitedValues().AsGuidList(); if (typeFilter.Any()) { opportunityQuery = opportunityQuery.Where(o => typeFilter.Contains(o.ConnectionType.Guid)); } var selfAssignedOpportunities = new List <int>(); var isSelfAssignedOpportunitiesQueried = false; var opportunities = opportunityQuery.ToList(); // Loop through opportunities foreach (var opportunity in opportunities) { // Check to see if person can edit the opportunity because of edit rights to this block or edit rights to // the opportunity bool canEdit = UserCanEdit || opportunity.IsAuthorized(Authorization.EDIT, CurrentPerson); bool campusSpecificConnector = false; var campusIds = new List <int>(); if (CurrentPersonId.HasValue) { // Check to see if person belongs to any connector group that is not campus specific if (!canEdit) { canEdit = opportunity .ConnectionOpportunityConnectorGroups .Any(g => !g.CampusId.HasValue && g.ConnectorGroup != null && g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value)); } // If user is not yet authorized to edit the opportunity, check to see if they are a member of one of the // campus-specific connector groups for the opportunity, and note the campus if (!canEdit) { foreach (var groupCampus in opportunity .ConnectionOpportunityConnectorGroups .Where(g => g.CampusId.HasValue && g.ConnectorGroup != null && g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value))) { campusSpecificConnector = true; canEdit = true; campusIds.Add(groupCampus.CampusId.Value); } } } if (opportunity.ConnectionType.EnableRequestSecurity && !isSelfAssignedOpportunitiesQueried) { isSelfAssignedOpportunitiesQueried = true; selfAssignedOpportunities = new ConnectionRequestService(rockContext) .Queryable() .Where(a => a.ConnectorPersonAlias.PersonId == CurrentPersonId.Value) .Select(a => a.ConnectionOpportunityId) .Distinct() .ToList(); } var canView = opportunity.IsAuthorized(Authorization.VIEW, CurrentPerson) || (opportunity.ConnectionType.EnableRequestSecurity && selfAssignedOpportunities.Contains(opportunity.Id)); // Is user is authorized to view this opportunity type... if (canView) { // Check if the opportunity's type has been added to summary yet, and if not, add it var connectionTypeSummary = SummaryState.Where(c => c.Id == opportunity.ConnectionTypeId).FirstOrDefault(); if (connectionTypeSummary == null) { connectionTypeSummary = new ConnectionTypeSummary { Id = opportunity.ConnectionTypeId, Name = opportunity.ConnectionType.Name, EnableRequestSecurity = opportunity.ConnectionType.EnableRequestSecurity, ConnectionRequestDetailPageId = opportunity.ConnectionType.ConnectionRequestDetailPageId, ConnectionRequestDetailPageRouteId = opportunity.ConnectionType.ConnectionRequestDetailPageRouteId, Opportunities = new List <OpportunitySummary>(), IconMarkup = opportunity.ConnectionType.IconCssClass.IsNullOrWhiteSpace() ? string.Empty : $@"<i class=""{opportunity.ConnectionType.IconCssClass}""></i>", Order = opportunity.ConnectionType.Order }; SummaryState.Add(connectionTypeSummary); } // get list of idle requests (no activity in past X days) var connectionRequestsQry = new ConnectionRequestService(rockContext).Queryable().Where(a => a.ConnectionOpportunityId == opportunity.Id); var currentDateTime = RockDateTime.Now; int activeRequestCount = connectionRequestsQry .Where(cr => cr.ConnectionState == ConnectionState.Active || (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < midnightToday) ) .Count(); // only show if the opportunity is active and there are active requests if (opportunity.IsActive || (!opportunity.IsActive && activeRequestCount > 0)) { // idle count is: // (the request is active OR future follow-up who's time has come) // AND // (where the activity is more than DaysUntilRequestIdle days old OR no activity but created more than DaysUntilRequestIdle days ago) List <int> idleConnectionRequests = connectionRequestsQry .Where(cr => ( cr.ConnectionState == ConnectionState.Active || (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < midnightToday) ) && ( (cr.ConnectionRequestActivities.Any() && cr.ConnectionRequestActivities.Max(ra => ra.CreatedDateTime) < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) || (!cr.ConnectionRequestActivities.Any() && cr.CreatedDateTime < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) ) ) .Select(a => a.Id).ToList(); // get list of requests that have a status that is considered critical. List <int> criticalConnectionRequests = connectionRequestsQry .Where(r => r.ConnectionStatus.IsCritical && ( r.ConnectionState == ConnectionState.Active || (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < midnightToday) ) ) .Select(a => a.Id).ToList(); // Add the opportunity var opportunitySummary = new OpportunitySummary { Id = opportunity.Id, Order = opportunity.Order, Name = opportunity.Name, IsActive = opportunity.IsActive, IconCssClass = opportunity.IconCssClass, IdleConnectionRequests = idleConnectionRequests, CriticalConnectionRequests = criticalConnectionRequests, DaysUntilRequestIdle = opportunity.ConnectionType.DaysUntilRequestIdle, CanEdit = canEdit, IsFollowed = followedOpportunityIds.Contains(opportunity.Id) }; // If the user is limited requests with specific campus(es) set the list, otherwise leave it to be null opportunitySummary.CampusSpecificConnector = campusSpecificConnector; opportunitySummary.ConnectorCampusIds = campusIds.Distinct().ToList(); connectionTypeSummary.Opportunities.Add(opportunitySummary); } } } // Get a list of all the authorized opportunity ids var allOpportunities = SummaryState.SelectMany(s => s.Opportunities).Select(o => o.Id).Distinct().ToList(); // Get all the active and past-due future followup request ids, and include the campus id and personid of connector var activeRequestsQry = new ConnectionRequestService(rockContext) .Queryable().AsNoTracking() .Where(r => allOpportunities.Contains(r.ConnectionOpportunityId) && (r.ConnectionState == ConnectionState.Active || (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < midnightToday))) .Select(r => new { r.Id, r.ConnectionOpportunityId, r.CampusId, ConnectorPersonId = r.ConnectorPersonAlias != null ? r.ConnectorPersonAlias.PersonId : -1 }); var activeRequests = activeRequestsQry.ToList(); // Based on the active requests, set additional properties for each opportunity foreach (var opportunity in SummaryState.SelectMany(s => s.Opportunities)) { // Get the active requests for this opportunity that user is authorized to view (based on campus connector) var opportunityRequests = activeRequests .Where(r => r.ConnectionOpportunityId == opportunity.Id && ( !opportunity.CampusSpecificConnector || (r.CampusId.HasValue && opportunity.ConnectorCampusIds.Contains(r.CampusId.Value)) )) .ToList(); // The active requests assigned to the current person opportunity.AssignedToYouConnectionRequests = opportunityRequests.Where(r => r.ConnectorPersonId == CurrentPersonId).Select(a => a.Id).ToList(); // The active requests that are unassigned opportunity.UnassignedConnectionRequests = opportunityRequests.Where(r => r.ConnectorPersonId == -1).Select(a => a.Id).ToList(); // Flag indicating if current user is connector for any of the active types opportunity.HasActiveRequestsForConnector = opportunityRequests.Any(r => r.ConnectorPersonId == CurrentPersonId); // Total number of requests for opportunity/campus/connector opportunity.TotalRequests = opportunityRequests.Count(); } //Set the Idle tooltip var connectionTypes = opportunities.Where(o => allOpportunities.Contains(o.Id)).Select(o => o.ConnectionType).Distinct().ToList(); StringBuilder sb = new StringBuilder(); if (connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().Count() == 1) { sb.Append(String.Format("Idle (no activity in {0} days)", connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().First())); } else { sb.Append("Idle (no activity in several days)<br/><ul class='list-unstyled'>"); foreach (var connectionType in connectionTypes) { sb.Append(String.Format("<li>{0}: {1} days</li>", connectionType.Name, connectionType.DaysUntilRequestIdle)); } sb.Append("</ul>"); } var statusTemplate = GetAttributeValue(AttributeKey.StatusTemplate); var statusMergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage); statusMergeFields.Add("ConnectionOpportunities", allOpportunities); statusMergeFields.Add("ConnectionTypes", connectionTypes); statusMergeFields.Add("IdleTooltip", sb.ToString().EncodeHtml()); lStatusBarContent.Text = statusTemplate.ResolveMergeFields(statusMergeFields); BindSummaryData(); }
public ActionResult Usuarios() { if (User == null || User.GetType().ToString() == "System.Security.Principal.GenericPrincipal") { return(RedirectToAction("Index", "Home")); } ViewBag.Menu = ClasesVarias.GetMenuUsuario(); ViewBag.Title = Resources.UsuarioSeguridadResource.UsuariosPageTitle; ViewBag.PageHeader = Resources.UsuarioSeguridadResource.UsuariosHeaderPage; List <UsuarioViewModel> data = new List <UsuarioViewModel>(); string _Culture = Thread.CurrentThread.CurrentCulture.ToString(); using (SeguricelEntities db = new SeguricelEntities()) { data = (from d in db.Usuario let fce = SqlFunctions.DateAdd("hh", User.HoursTimeZone, SqlFunctions.DateAdd("mi", User.MinutesTimeZone, d.FechaCambioEstatus)) let fuc = SqlFunctions.DateAdd("hh", User.HoursTimeZone, SqlFunctions.DateAdd("mi", User.MinutesTimeZone, d.FechaUltimaConexion)) where d.IdTipoUsuario > (User.IdTipoUsuario == 1 ? 0 : 1) select new UsuarioViewModel { ConfirmPasswordUsuario = d.ClaveUsuario, EmailUsuario = d.Email, Estado = d.IdEstadoUsuario, EstadoUsuario = db.EstadoUsuario.Where(x => x.Culture == _Culture && x.IdEstadoUsuario == d.IdEstadoUsuario).FirstOrDefault().Nombre, FechaCambioEstado = (DateTime)fce, FechaUltimaConexion = (DateTime)fuc, Id = d.IdUsuario, IdTipoUsuario = d.IdTipoUsuario, NivelUsuario = db.TipoUsuario.Where(x => x.Culture == _Culture && x.IdTipoUsuario == d.IdTipoUsuario).FirstOrDefault().Nombre, Nombre = d.Nombre, PasswordUsuario = d.ClaveUsuario }).ToList(); } return(View(data)); }