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 DOAN.Model.Dto; using DOAN.Model; using DOAN.Model.MES.andon; using DOAN.Model.MES.andon.Dto; using DOAN.Model.MES.dev; using DOAN.Repository; using DOAN.Service.MES.andon.IService; using static System.Runtime.InteropServices.JavaScript.JSType; using System.Security.Claims; namespace DOAN.Service.MES.andon { [AppService(ServiceType = typeof(IAndonDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)] public class AndonDataAnalysisServcie : BaseService, IAndonDataAnalysisServcie { /// /// 查询故障记录表列表 今日全部 和以前未签到异常 /// /// /// public PagedInfo GetList(AndonFaultRecordQueryDto parm) { var predicate = Expressionable.Create() .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(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).TotalMinutes,2); } } } return response; } /// /// 1.获取安灯报警类型字典 /// /// public List GetListFault() { return Context.Queryable().Where(it => it.Status == 1).ToList(); } /// /// 获取各异常时长占比饼图 /// /// /// public List AbnormalDurationRatio(AndonAnalysisQueryDto query) { List abnormalDurationRatioResults = new List(); var predicate = Expressionable.Create() .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 InitData = Context.Queryable().Where(predicate.ToExpression()).ToList(); //获取全部异常 List AllAndonFaultDict = Context.Queryable().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; } /// /// 获取异常数量汇总比例分析饼图 /// /// /// public List AbnormalNumDurationRatio(AndonAnalysisQueryDto query) { List abnormalDurationRatioResults = new List(); var predicate = Expressionable.Create() .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 InitData = Context.Queryable().Where(predicate.ToExpression()).ToList(); //获取全部异常 List AllAndonFaultDict = Context.Queryable().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; } /// /// 获取异常情况柱状图 /// /// /// public ExceptionDistributionResult ExceptionDistribution(AndonAnalysisQueryDto query) { ExceptionDistributionResult exceptionDistributionResult = new ExceptionDistributionResult(); var predicate = Expressionable.Create() .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 InitData = Context.Queryable().Where(predicate.ToExpression()).ToList(); List 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 GetOccupiedDates(DateTime startDate, DateTime endDate) { List occupiedDates = new List(); 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); } } }