using System.Linq; using DOAN.Model.MES.BI.Dto; using DOAN.Model.MES.dev; using DOAN.Model.mes.echarts; using DOAN.Model.MES.exception; using DOAN.Model.MES.product; using DOAN.Service.MES.BI.IService; using Infrastructure; using Infrastructure.Attribute; using Mapster; namespace DOAN.Service.MES.BI; /// /// 生产大屏 /// [AppService(ServiceType = typeof(IProductBIService), ServiceLifetime = LifeTime.Transient)] public class ProductBIService : BaseService, IProductBIService { /// /// /// public ProductBIMoudle01Dto GetMoudle01() { var now = DateTime.Now.ToLocalTime().Date; var startOfWeek = GetStartOfWeek(now); var endOfWeek = startOfWeek.AddDays(6); var moudle01 = new ProductBIMoudle01Dto(); moudle01.TodayOutputQuantity = Context.Queryable().LeftJoin((w, r) => w.Workorder == r.FkWorkorder && w.WorkorderDate == now) .Sum((w, r) => r.FinishedNum ?? 0); moudle01.TodayWorkOrderQuantity = Context.Queryable().Where(it => it.WorkorderDate == now).Count(); moudle01.WeekWorkOrderQuantity = Context.Queryable() .Where(it => it.WorkorderDate >= startOfWeek && it.WorkorderDate <= endOfWeek) .Count(); moudle01.WeekOutputQuantity = Context.Queryable().LeftJoin((w, r) => w.Workorder == r.FkWorkorder && w.WorkorderDate >= startOfWeek && w.WorkorderDate <= endOfWeek) .Sum((w, r) => r.FinishedNum ?? 0); moudle01.TodayExceptionWorkOrderQuantity = Context.Queryable() .Where(it => it.ChangeTime > now && it.ChangeTime < now.AddDays(1)).Count(); moudle01.WeekExceptionWorkOrderQuantity = Context.Queryable() .Where(it => it.ChangeTime > now && it.ChangeTime < now.AddDays(1)).Count(); return moudle01; } public EchartsOptions GetMoudle02() { var LineEchart = new EchartsOptions(); var Title = new EchartsTitle(); Title.Text = "前7日产量趋势图"; Title.SubText = "前7日产量趋势图"; LineEchart.Title = Title; var XAxis = new EchartsXAxis(); // 获取今天的日期 var today = DateTime.Today; // 创建一个数组来存储七天的日期 var dates = new DateTime[7]; // 填充数组 for (var i = 0; i < 7; i++) dates[i] = today.AddDays(-i); // 反转数组,使得日期从最早的开始 Array.Reverse(dates); XAxis.Data = dates.Select(it => it.ToString("yyyy-MM-dd")).ToList(); LineEchart.XAxis = XAxis; var Series = new EchartsSeries(); var SeriesData = Context.Queryable() .LeftJoin((w, r) => w.Workorder == r.FkWorkorder ) .Where((w,r)=>w.WorkorderDate < today.AddDays(1) && w.WorkorderDate > today.AddDays(-6)) .GroupBy((w,r)=>w.WorkorderDate) .Select((w, r) => new EchartsSeriesData { Name = w.WorkorderDate.Value.ToString("yyyy-MM-dd"), Value = r.FinishedNum ?? 0 }).ToList(); Series.Data = SeriesData; Series.Type = "line"; Series.Name = "产量(个)"; LineEchart.Series = new List(){Series}; return LineEchart; } public EchartsOptions GetMoudle03() { var LineEchart = new EchartsOptions(); var Title = new EchartsTitle(); Title.Text = "本周工单趋势图"; Title.SubText = "本周工单趋势图"; LineEchart.Title = Title; var XAxis = new EchartsXAxis(); // 获取今天的日期 var today = DateTime.Today; // 创建一个数组来存储七天的日期 var dates = new DateTime[7]; // 填充数组 for (var i = 0; i < 7; i++) dates[i] = today.AddDays(-i); // 反转数组,使得日期从最早的开始 Array.Reverse(dates); XAxis.Data = dates.Select(it => it.ToString("yyyy-MM-dd")).ToList(); LineEchart.XAxis = XAxis; var Series = new EchartsSeries(); var SeriesData = Context.Queryable() .Where(w=>w.WorkorderDate < today.AddDays(1) && w.WorkorderDate > today.AddDays(-6)) .GroupBy((w)=>w.WorkorderDate) .Select(w => new EchartsSeriesData { Name = w.WorkorderDate.Value.ToString("yyyy-MM-dd"), Value = w.DeliveryNum ?? 0 }).ToList(); Series.Data = SeriesData; Series.Name = "工单(个)"; LineEchart.Series = new List(){Series}; return LineEchart; } public EchartsOptions GetMoudle04() { var LineEchart = new EchartsOptions(); LineEchart.Title = new EchartsTitle("今日超时工单占比", "今日超时工单占比"); // List Series=new List(); EchartsSeries SeriesData = new EchartsSeries(); int OverTimeWorkorder= Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today) .Where(it => it.Status == 3) .Where(it => (it.EndTime.Value - it.StartTime.Value).TotalSeconds > (it.Beat ?? 1 * it.DeliveryNum ?? 1)) .Count(); EchartsSeriesData Series = new EchartsSeriesData(); Series.Name = "超时工单数"; Series.Value = OverTimeWorkorder; int StandrandWorkorder= Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today) .Where(it => it.Status == 3) .Where(it => (it.EndTime.Value - it.StartTime.Value).TotalSeconds <= (it.Beat ?? 1 * it.DeliveryNum ?? 1)) .Count(); EchartsSeriesData Series2 = new EchartsSeriesData(); Series2.Name = "不超时工单数"; Series2.Value = StandrandWorkorder; SeriesData.Data = new List() { Series, Series2 }; SeriesData.Type = "pie"; SeriesData.Name = "工单(个)"; LineEchart.Series= new List(){SeriesData}; return LineEchart; } public EchartsOptions GetMoudle05() { var LineEchart = new EchartsOptions(); LineEchart.Title = new EchartsTitle("前七日工单异常分布占比", "前七日工单异常分布占比"); // List Series=new List(); EchartsSeries SeriesData = new EchartsSeries(); var EchartsSeriesDataList= Context.Queryable().LeftJoin((w, l) => w.Workorder == l.Workorder ) .Where((w,l)=>w.WorkorderDate < DateTime.Today.AddDays(1) && w.WorkorderDate < DateTime.Today.AddDays(-6)) .GroupBy((w, l) => l.Log) .Select((w, l) => new EchartsSeriesData { Name = l.Log, Value = SqlFunc.AggregateCount(l) }).ToList(); SeriesData.Type = "pie"; SeriesData.Data = EchartsSeriesDataList; SeriesData.Name = "工单(个)"; LineEchart.Series= new List(){SeriesData}; return LineEchart; } public List GetMoudle06() { return Context.Queryable().LeftJoin((w, r) => w.Workorder == r.FkWorkorder) .Where((w, r) => w.WorkorderDate == DateTime.Today) .Select((w,r) => new WorkOrderBIDto() { Workorder=w.Workorder, ProductionName=w.ProductionName, ProductionCode=w.ProductionCode, DispatchNum=w.DeliveryNum, FinishedNum=r.FinishedNum, Status=w.Status, }).ToList(); } public List GetMoudle07() { return Context.Queryable() .LeftJoin((w, l) => w.Workorder == l.Workorder &&l.Workorder!=null) .Where((w,l)=>w.WorkorderDate == DateTime.Today&&l.Workorder!=null) .Select((w, l) => l) .MergeTable() .Distinct() .ToList(); } public List GetMoudle08() { return Context.Queryable().LeftJoin((w, r) => w.Workorder == r.FkWorkorder) .Where((w, r) => w.WorkorderDate == DateTime.Today.AddDays(-1)) .Select((w,r) => new WorkOrderBIDto() { Workorder=w.Workorder, ProductionName=w.ProductionName, ProductionCode=w.ProductionCode, DispatchNum=w.DeliveryNum??0, FinishedNum=r.FinishedNum??0, Status=w.Status, }).ToList(); } private static DateTime GetStartOfWeek(DateTime dt) { // 获取本周周一的日期时间,时间为00:00:00 var daysOffset = dt.DayOfWeek - DayOfWeek.Monday; if (daysOffset < 0) daysOffset += 7; // 如果今天是周日,那么偏移量应该是6而不是-1 return dt.AddDays(-daysOffset).Date; } }