Exemple #1
0
        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();
        }
Exemple #2
0
        /// <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();
        }
Exemple #5
0
 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");
     }
 }
Exemple #6
0
        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();
        }
Exemple #8
0
        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));
        }