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