zhuangpei-mesbackend/ZR.Service/MES/andon/AndonDataAnalysisServcie.cs
2024-06-26 13:47:34 +08:00

264 lines
10 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.Dto;
using ZR.Model;
using ZR.Model.MES.andon;
using ZR.Model.MES.andon.Dto;
using ZR.Model.MES.dev;
using ZR.Repository;
using ZR.Service.MES.andon.IService;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Security.Claims;
namespace ZR.Service.MES.andon
{
[AppService(ServiceType = typeof(IAndonDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)]
public class AndonDataAnalysisServcie : BaseService<AndonFaultRecord>, IAndonDataAnalysisServcie
{
/// <summary>
/// 查询故障记录表列表 今日全部 和以前未签到异常
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<AndonFaultRecordDto> GetList(AndonFaultRecordQueryDto parm)
{
var predicate = Expressionable.Create<AndonFaultRecord>()
.AndIF(parm.DateTimeRange.Count() == 2 && parm.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= parm.DateTimeRange[0])
.AndIF(parm.DateTimeRange.Count() == 2 && parm.DateTimeRange[1] > DateTime.MinValue, it => it.StartTime <= parm.DateTimeRange[1])
.OrIF(parm.DateTimeRange.Count() == 2 , it => it.StartTime < parm.DateTimeRange[0] && it.Status == 1)
;
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage<AndonFaultRecord, AndonFaultRecordDto>(parm);
if (response.Result.Count > 0)
{
foreach (var item in response.Result)
{
if (item.Duration <= 0)
{
item.Duration= (decimal)Math.Round((DateTime.Now-item.StartTime.Value).TotalHours,2);
}
}
}
return response;
}
/// <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;
}
SeriesData_ ResponseTime = new SeriesData_();
ResponseTime.Name = "响应时间";
ResponseTime.Type = "line";
ResponseTime.YAxisIndex = 2;
ResponseTime.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).Sum(it=>it.Duration).Value;
Data[Xdata.IndexOf(xdata)] = Math.Round(temp, 2);
}
ResponseTime.Data = Data;
}
exceptionDistributionResult.seriesData = new SeriesData_[] { EveTIME, EveTNUM, ResponseTime };
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);
}
}
}