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;
}
}
}