using Aliyun.OSS; using DOAN.Model.Dto; using DOAN.Model.mes.echarts; using DOAN.Model.MES.andon; using DOAN.Model.MES.andon.Dto; using DOAN.Model.MES.base_; using DOAN.Model.MES.dev; using DOAN.Repository; using DOAN.Service.MES.BI.IService; using DOAN.Service.MES.BI.IService; using Infrastructure.Attribute; using Mapster; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DOAN.Service.MES.BI { [AppService(ServiceType = typeof(IAndonDataAnalysisService), ServiceLifetime = LifeTime.Transient)] public class AndonDataAnalysisService : BaseService, IAndonDataAnalysisService { /// /// 获取今天的异常记录 /// /// public List QueryTodayAndonFaultRecord() { var predicate = Expressionable.Create() .And(it => it.CreatedTime >= DateTime.Now.Date) .Or(it => it.Status == 0) ; var response = Queryable() .Where(predicate.ToExpression()) .ToList().Adapt>(); if (response.Count > 0) { foreach (var item in response) { if (item.Duration <= 0) { item.Duration = (decimal)Math.Round((DateTime.Now - item.StartTime.Value).TotalMinutes, 2); } } } return response; } /// /// 本月异常次数占比统计 /// /// public List AbnormalDurationRatio() { List abnormalDurationRatioResults = new List(); // 获取当前日期和时间 DateTime now = DateTime.Now; // 获取本月的最开始时间(本月的第一天的午夜时间) DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0); var predicate = Expressionable.Create() .And(it => it.StartTime >= firstDayOfMonth); 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 EchartsOptions ShutdownBar() { EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle { Text = "本月异常停机时间统计", SubText = "本月异常停机时间统计" }; // 获取当前日期和时间 DateTime now = DateTime.Now; // 获取本月的最开始时间(本月的第一天的午夜时间) DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0); // 获取本月的最后一天 DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1); // 创建一个列表来存储本月的每一天 List daysOfMonth = new List(); // 循环从本月的第一天到最后一天,并将每一天添加到列表中 for (DateTime date = firstDayOfMonth; date <= lastDayOfMonth; date = date.AddDays(1)) { daysOfMonth.Add(date.ToString("MM-dd")); } List echartsOptionsSeries = new List(); EchartsXAxis XAxis = new EchartsXAxis(); XAxis.Data = daysOfMonth; echartsOptions.XAxis = XAxis; #region 折线图 EchartsSeries seriesLine = new EchartsSeries(); seriesLine.Name = "累计停机时间"; seriesLine.Type = "line"; List seriesLine_data = null; var result = Context.Queryable() .Where(x => x.CreatedTime >= firstDayOfMonth && x.CreatedTime <= lastDayOfMonth) .GroupBy(x => x.CreatedTime.Value.Date) // 按日期分组 .Select(x => new { Date = x.CreatedTime.Value.Date, TotalDuration = SqlFunc.AggregateSum(x.Duration) // 计算每日累计的 Duration }) .ToList(); // 如果某天没有数据,填充默认值 var allDaysInMonth = Enumerable.Range(0, (lastDayOfMonth - firstDayOfMonth).Days + 1) .Select(offset => firstDayOfMonth.AddDays(offset).Date) .ToList(); seriesLine_data = allDaysInMonth .GroupJoin(result, date => date, summary => summary.Date, (date, summaries) => new EchartsSeriesData { Name = date.ToString("MM-dd"), Value = summaries.FirstOrDefault()?.TotalDuration ?? 0 }) .OrderBy(x => x.Name) .ToList(); seriesLine.Data = seriesLine_data; echartsOptionsSeries.Add(seriesLine); #endregion #region 柱状图 //获取故障字典 List andonFaults = Context.Queryable().ToList(); foreach (var andonFault in andonFaults) { EchartsSeries seriesBar = new EchartsSeries(); seriesBar.Name = andonFault.Name + "停机时间"; seriesBar.Type = "bar"; List seriesLine_data_bar = null; var result01 = Context.Queryable() .Where(x => x.CreatedTime >= firstDayOfMonth && x.CreatedTime <= lastDayOfMonth) .Where(x => x.FaultDict == andonFault.Name) .GroupBy(x => x.CreatedTime.Value.Date) // 按日期分组 .Select(x => new { Date = x.CreatedTime.Value.Date, TotalDuration = SqlFunc.AggregateSum(x.Duration) // 计算每日累计的 Duration }) .ToList(); // 如果某天没有数据,填充默认值 var allDaysInMonth01 = Enumerable.Range(0, (lastDayOfMonth - firstDayOfMonth).Days + 1) .Select(offset => firstDayOfMonth.AddDays(offset).Date) .ToList(); seriesLine_data_bar = allDaysInMonth .GroupJoin(result01, date => date, summary => summary.Date, (date, summaries) => new EchartsSeriesData { Name = date.ToString("MM-dd"), Value = summaries.FirstOrDefault()?.TotalDuration ?? 0 }) .OrderBy(x => x.Name) .ToList(); seriesBar.Data = seriesLine_data_bar; echartsOptionsSeries.Add(seriesBar); } #endregion echartsOptions.Series = echartsOptionsSeries; return echartsOptions; } /// /// 当前各产线实时状态 /// /// public Dictionary LineRealTimeStatus() { return Context.Queryable() .LeftJoin((r, a) => r.Code == a.LineCode && a.Status == 1) .GroupBy((r, a) => r.Code) .Select((r, a) => new { Code = r.Code, IsAndonFaultRecordNotNull = SqlFunc.AggregateCount(a) > 0 }) .MergeTable() .OrderBy(x => x.Code) .ToList() // 将查询结果转换为列表 .ToDictionary( x => x.Code, // 字典的 key 是 r.Code x => x.IsAndonFaultRecordNotNull // 字典的 value 是判断 a 是否为空 ); } /// /// 本月各组异常时间统计 /// /// public EchartsOptions MonthLineShutDown() { EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle { Text = "本月各组异常时间统计", SubText = "本月各组异常时间统计" }; // X轴 EchartsXAxis echartsXAxis = new EchartsXAxis(); //系列 EchartsSeries echartsSeries = new EchartsSeries(); echartsSeries.Name = "各组异常时间"; echartsSeries.Type = "bar"; List seriesData = new List(); Context.Queryable().GroupBy(it => it.LineCode) .Select(it => new { LineCode = it.LineCode, TotalDuration = SqlFunc.AggregateSum(it.Duration) }).MergeTable().OrderByDescending(it => it.TotalDuration) .ForEach(it => { seriesData.Add(new EchartsSeriesData { Name = it.LineCode, Value = it.TotalDuration ?? 0 }); }); echartsSeries.Data = seriesData; echartsXAxis.Data = seriesData.Select(it => it.Name).ToList(); echartsOptions.XAxis = echartsXAxis; echartsOptions.Series = new List { echartsSeries }; return echartsOptions; } } }