zhuangpei-mesbackend/ZR.Service/MES/andon/AndonDataAnalysisServcie.cs
qianhao.xu d6e82d3bdc 785
2024-06-20 17:18:18 +08:00

210 lines
8.2 KiB
C#

using Infrastructure.Attribute;
using JinianNet.JNTemplate.Dynamic;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using ZR.Model.MES.andon;
using ZR.Model.MES.andon.Dto;
using ZR.Model.MES.dev;
using ZR.Service.MES.andon.IService;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ZR.Service.MES.andon
{
[AppService(ServiceType = typeof(IAndonDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)]
public class AndonDataAnalysisServcie : BaseService<AndonFaultRecord>, IAndonDataAnalysisServcie
{
/// <summary>
/// 1.获取安灯报警类型字典
/// </summary>
/// <returns></returns>
public List<AndonFaultDict> GetListFault()
{
return Context.Queryable<AndonFaultDict>().Where(it => it.Status == 1).ToList();
}
/// <summary>
/// 获取各异常时长占比饼图
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<AbnormalDurationRatioResult> AbnormalDurationRatio(AndonAnalysisQueryDto query)
{
List<AbnormalDurationRatioResult> abnormalDurationRatioResults = new List<AbnormalDurationRatioResult>();
var predicate = Expressionable.Create<AndonFaultRecord>()
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
List<AndonFaultRecord> InitData = Context.Queryable<AndonFaultRecord>().Where(predicate.ToExpression()).ToList();
//获取全部异常
List<AndonFaultDict> AllAndonFaultDict = Context.Queryable<AndonFaultDict>().Where(it => it.Status == 1).ToList();
if (InitData.Count > 0)
{
foreach (var fault in AllAndonFaultDict)
{
AbnormalDurationRatioResult result_Item = new AbnormalDurationRatioResult();
result_Item.Name = fault.Name;
result_Item.value = InitData.Where(it => it.FaultDict == fault.Name).Sum(it => it.Duration).ToString();
ItemStyle_ itemStyle = new ItemStyle_();
itemStyle.color = fault.color;
result_Item.itemStyle = itemStyle;
abnormalDurationRatioResults.Add(result_Item);
}
}
return abnormalDurationRatioResults;
}
/// <summary>
/// 获取异常数量汇总比例分析饼图
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<AbnormalDurationRatioResult> AbnormalNumDurationRatio(AndonAnalysisQueryDto query)
{
List<AbnormalDurationRatioResult> abnormalDurationRatioResults = new List<AbnormalDurationRatioResult>();
var predicate = Expressionable.Create<AndonFaultRecord>()
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
List<AndonFaultRecord> InitData = Context.Queryable<AndonFaultRecord>().Where(predicate.ToExpression()).ToList();
//获取全部异常
List<AndonFaultDict> AllAndonFaultDict = Context.Queryable<AndonFaultDict>().Where(it => it.Status == 1).ToList();
if (InitData.Count > 0)
{
foreach (var fault in AllAndonFaultDict)
{
AbnormalDurationRatioResult result_Item = new AbnormalDurationRatioResult();
result_Item.Name = fault.Name;
result_Item.value = InitData.Where(it => it.FaultDict == fault.Name).Count().ToString();
ItemStyle_ itemStyle = new ItemStyle_();
itemStyle.color = fault.color;
result_Item.itemStyle = itemStyle;
abnormalDurationRatioResults.Add(result_Item);
}
}
return abnormalDurationRatioResults;
}
/// <summary>
/// 获取异常情况柱状图
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public ExceptionDistributionResult ExceptionDistribution(AndonAnalysisQueryDto query)
{
ExceptionDistributionResult exceptionDistributionResult = new ExceptionDistributionResult();
var predicate = Expressionable.Create<AndonFaultRecord>()
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
List<AndonFaultRecord> InitData = Context.Queryable<AndonFaultRecord>().Where(predicate.ToExpression()).ToList();
List<DateTime> Xdata = GetOccupiedDates(query.DateTimeRange[0], query.DateTimeRange[1]);
exceptionDistributionResult.xData = Xdata.Select(it => it.ToString()).ToArray();
SeriesData_ EveTIME = new SeriesData_();
EveTIME.Name = "异常时长";
EveTIME.Type = "bar";
EveTIME.YAxisIndex = 0;
EveTIME.ShowBackground = true;
if (Xdata.Count > 0)
{
decimal[] Data= new decimal[Xdata.Count];
foreach (var xdata in Xdata)
{
DateTime midnight = GetMidnightTime(xdata);
DateTime noon = GetNoonTime(xdata);
var temp= InitData.Where(it => it.StartTime >= midnight && it.StartTime <= noon).Sum(it => it.Duration);
Data[Xdata.IndexOf(xdata)] = Math.Round(temp.Value, 2);
exceptionDistributionResult.ExceptionTimeTotal = exceptionDistributionResult.ExceptionTimeTotal+ Data[Xdata.IndexOf(xdata)];
}
EveTIME.Data = Data;
}
SeriesData_ EveTNUM = new SeriesData_();
EveTNUM.Name = "异常次数";
EveTNUM.Type = "bar";
EveTNUM.YAxisIndex = 1;
EveTNUM.ShowBackground = true;
if (Xdata.Count > 0)
{
decimal[] Data = new decimal[Xdata.Count];
foreach (var xdata in Xdata)
{
DateTime midnight = GetMidnightTime(xdata);
DateTime noon = GetNoonTime(xdata);
decimal temp= InitData.Where(it => it.StartTime >= midnight && it.StartTime <= noon).Count();
Data[Xdata.IndexOf(xdata)] = temp;
exceptionDistributionResult.ExceptionNumTotal = exceptionDistributionResult.ExceptionNumTotal+Data[Xdata.IndexOf(xdata)];
}
EveTNUM.Data = Data;
}
exceptionDistributionResult.seriesData = new SeriesData_[] { EveTIME, EveTNUM };
return exceptionDistributionResult;
}
private static List<DateTime> GetOccupiedDates(DateTime startDate, DateTime endDate)
{
List<DateTime> occupiedDates = new List<DateTime>();
DateTime currentDate = startDate;
while (currentDate <= endDate)
{
occupiedDates.Add(currentDate);
currentDate = currentDate.AddDays(1);
}
return occupiedDates;
}
private static DateTime GetMidnightTime(DateTime inputTime)
{
return new DateTime(inputTime.Year, inputTime.Month, inputTime.Day, 0, 0, 0);
}
private static DateTime GetNoonTime(DateTime inputTime)
{
return new DateTime(inputTime.Year, inputTime.Month, inputTime.Day, 23, 59, 59);
}
}
}