using Microsoft.AspNetCore.Mvc; using System.Net; using System.Net.Http.Headers; using Microsoft.Extensions.Hosting.Internal; using Microsoft.AspNetCore.Http.Extensions; using IStation.Untity; using Furion.DynamicApiController; using System.ComponentModel.DataAnnotations; using Mapster; using IStation.Calculation; using IStation.Model; namespace IStation.Application { /// /// RunSpan /// [Route("Run/RunSpan")] [ApiDescriptionSettings("Run", Name = "运行区间", Order = 800)] public class RunSpan_Controller : IDynamicApiController { /// /// 通过日期获取泵站下运行区间信息 /// [Route("GetItemsByStationIDOfDay@V1.0")] [HttpGet] public List GetItemsByStationIDOfDay ( [Required, Range(1, long.MaxValue, ErrorMessage = "CorpID 必须大于0")] long CorpID, [Required, Range(1, long.MaxValue, ErrorMessage = "StationID 必须大于0")] long StationID, [Required] DateTime Day ) { var station = new Service.Station().GetByID(CorpID, StationID); if (station == null) { return default; } var group_list = new Service.MonitorPointGroup().GetByBelongTypeAndBelongID(CorpID, IStation.ObjectType.Station, StationID); if (group_list == null || group_list.Count < 1) { return default; } group_list = group_list.Where(x => x.Flags != null && x.Flags.Contains(LogicFlags.机泵)) .OrderBy(x => x.ParentIds == null ? 0 : x.ParentIds.Count).ThenBy(x => x.SortCode).ToList(); if (group_list == null || group_list.Count < 1) { return default; } var monitor_list = new Service.MonitorPoint() .GetExSignalWithSignalTypeByBelongTypeAndBelongID (CorpID, IStation.ObjectType.Station, StationID, Model.eMonitorType.General, Model.Monitor.eCronType.Real); var vm_list = new List(); foreach (var group in group_list) { var vm_item = new MonitorRunSpanItem(); vm_item.CorpID = group.CorpID; vm_item.ObjectType = IStation.ObjectType.MonitorPointGroup; vm_item.ObjectID = group.ID; vm_item.ObjectName = group.Name; vm_item.Spans = new List(); vm_list.Add(vm_item); var monitor_run_list = monitor_list?.Where(x =>x.GroupID==group.ID&& x.SignalList.First().SignalType.Identifier == IStation.SignalType.运行状态).ToList(); var monitor_run_default = monitor_run_list?.Find(x => x.Flags != null && x.Flags.Contains(LogicFlags.默认)); if (monitor_run_default == null) monitor_run_default = monitor_run_list?.FirstOrDefault(); List record_list = null; if (monitor_run_default != null) { record_list = new Service.MonitorRealRecord() .GetContentBySignalIDOfDay(monitor_run_default.CorpID, monitor_run_default.ID, monitor_run_default.SignalList.First().ID, Day); } if (record_list == null || record_list.Count < 1) { var vm_span = new MonitorRunSpan(); vm_span.RunStatus = IStation.RunStatus.Shut; vm_span.StartTime = Day.Date; var end_time = Day.Date.AddDays(1); if (end_time > DateTime.Now) end_time = DateTime.Now; vm_span.EndTime = end_time; vm_span.Duration = (end_time - Day.Date).TotalSeconds; vm_item.Spans.Add(vm_span); continue; } foreach (var record in record_list) { var run_status = 0; if (double.TryParse(record.DataValue, out double data_value)) { run_status = data_value > 0 ? 1 : 0; } var vm_span = vm_item.Spans.LastOrDefault(); if (vm_span == null) { vm_span = new MonitorRunSpan(); vm_span.RunStatus = run_status; vm_span.StartTime = record.DataTime; vm_item.Spans.Add(vm_span); } if (run_status == vm_span.RunStatus) { var end_time = record.DataTime; if (end_time > Day.Date.AddDays(1)) end_time = Day.Date.AddDays(1); vm_span.EndTime = end_time; vm_span.Duration = (end_time - vm_span.StartTime).TotalSeconds; } else { vm_span.EndTime = record.DataTime; var vm_span_next = new MonitorRunSpan(); vm_span_next.RunStatus = run_status; vm_span_next.StartTime = record.DataTime; var end_time = record.DataTime; if (end_time > Day.Date.AddDays(1)) end_time = Day.Date.AddDays(1); vm_span_next.EndTime = end_time; vm_span_next.Duration += (end_time - record.DataTime).TotalSeconds; vm_item.Spans.Add(vm_span_next); } } } return vm_list; } /// /// 通过日期获取泵站下运行区间Kpi信息 /// [Route("GetKpiInfoByStationIDOfDay")] [HttpGet] public MonitorRunSpanKpiInfo GetKpiInfoByStationIDOfDay ( [Required, Range(1, long.MaxValue, ErrorMessage = "CorpID 必须大于0")] long CorpID, [Required, Range(1, long.MaxValue, ErrorMessage = "StationID 必须大于0")] long StationID, [Required] DateTime Day, int KpiCount = 2 ) { var station = new Service.Station().GetByID(CorpID, StationID); if (station == null) { return default; } var group_list = new Service.MonitorPointGroup().GetByBelongTypeAndBelongID(CorpID, IStation.ObjectType.Station, StationID); group_list = group_list?.Where(x => x.Flags != null && x.Flags.Contains(LogicFlags.机泵)) .OrderBy(x => x.ParentIds == null ? 0 : x.ParentIds.Count).ThenBy(x => x.SortCode).ToList(); var monitor_list = new Service.MonitorPoint() .GetExSignalWithSignalTypeByBelongTypeAndBelongID (CorpID, IStation.ObjectType.Station, StationID, Model.eMonitorType.General, Model.Monitor.eCronType.Real); var service_record = new Service.MonitorRealRecord(); var vm = new MonitorRunSpanKpiInfo(); vm.CorpID = station.CorpID; vm.ObjectType = IStation.ObjectType.Station; vm.ObjectID = station.ID; vm.ObjectName = station.Name; vm.KpiItems = new List(); vm.SpanItems = new List(); var monitor_kpi_list = monitor_list?.Where(x => x.Flags != null && x.Flags.Contains(LogicFlags.KPI)) .OrderBy(x => x.ImportanceIndex == null ? int.MaxValue : x.ImportanceIndex.Value).ToList(); if (monitor_kpi_list != null) { var take_count = monitor_kpi_list.Count > KpiCount ? KpiCount : monitor_kpi_list.Count; monitor_kpi_list = monitor_kpi_list.Take(take_count).ToList(); foreach (var monitor_kpi in monitor_kpi_list) { var vm_item = new MonitorKpiRecordListItem(); vm_item.CorpID = monitor_kpi.CorpID; vm_item.MonitorPointID = monitor_kpi.ID; vm_item.SignalID = monitor_kpi.SignalList.First().ID; vm_item.Name = monitor_kpi.Name; vm_item.Unit = monitor_kpi.SignalList.First().SignalType.GetEnUnitName(); vm_item.Records = service_record.GetContentBySignalIDOfDay(monitor_kpi.CorpID, monitor_kpi.ID, monitor_kpi.SignalList.First().ID, Day) ?.Select(x => new MonitorKpiRecordContent(x)).ToList(); vm.KpiItems.Add(vm_item); } } if (group_list != null && group_list.Count > 0) { foreach (var group in group_list) { var vm_item = new MonitorRunSpanItem(); vm_item.CorpID = group.CorpID; vm_item.ObjectType = IStation.ObjectType.MonitorPointGroup; vm_item.ObjectID = group.ID; vm_item.ObjectName = group.Name; vm_item.Spans = new List(); vm.SpanItems.Add(vm_item); var monitor_run_list = monitor_list?.Where(x =>x.GroupID==group.ID && x.SignalList.First().SignalType.Identifier == IStation.SignalType.运行状态).ToList(); var monitor_run_default = monitor_run_list?.Find(x => x.Flags != null && x.Flags.Contains(LogicFlags.默认)); if (monitor_run_default == null) monitor_run_default = monitor_run_list?.FirstOrDefault(); List record_list = null; if (monitor_run_default != null) { record_list = service_record.GetContentBySignalIDOfDay(monitor_run_default.CorpID, monitor_run_default.ID, monitor_run_default.SignalList.First().ID, Day); } if (record_list == null || record_list.Count < 1) { var vm_span = new MonitorRunSpan(); vm_span.RunStatus = IStation.RunStatus.Shut; vm_span.StartTime = Day.Date; var end_time = Day.Date.AddDays(1); if (end_time > DateTime.Now) end_time = DateTime.Now; vm_span.EndTime = end_time; vm_span.Duration = (end_time - Day.Date).TotalSeconds; vm_item.Spans.Add(vm_span); continue; } foreach (var record in record_list) { var run_status = 0; if (double.TryParse(record.DataValue, out double data_value)) { run_status = data_value > 0 ? 1 : 0; } var vm_span = vm_item.Spans.LastOrDefault(); if (vm_span == null) { vm_span = new MonitorRunSpan(); vm_span.RunStatus = run_status; vm_span.StartTime = record.DataTime; vm_item.Spans.Add(vm_span); } if (run_status == vm_span.RunStatus) { var end_time = record.DataTime; if (end_time > Day.Date.AddDays(1)) end_time = Day.Date.AddDays(1); vm_span.EndTime = end_time; vm_span.Duration = (end_time - vm_span.StartTime).TotalSeconds; } else { vm_span.EndTime = record.DataTime; var vm_span_next = new MonitorRunSpan(); vm_span_next.RunStatus = run_status; vm_span_next.StartTime = record.DataTime; var end_time = record.DataTime; if (end_time > Day.Date.AddDays(1)) end_time = Day.Date.AddDays(1); vm_span_next.EndTime = end_time; vm_span_next.Duration += (end_time - record.DataTime).TotalSeconds; vm_item.Spans.Add(vm_span_next); } } } } return vm; } } }