using System.Linq;
using DOAN.Model.MES.bigscreen.Dto;
using DOAN.Model.MES.dev;
using DOAN.Model.mes.echarts;
using DOAN.Model.MES.product;
using DOAN.Service.MES.bigScreen.IService;
using Infrastructure;
using Infrastructure.Attribute;
using Mapster;
namespace DOAN.Service.MES.bigScreen;
///
/// 生产大屏
///
[AppService(ServiceType = typeof(IProductBigScreenService), ServiceLifetime = LifeTime.Transient)]
public class ProductBigScreenService : BaseService, IProductBigScreenService
{
///
///
///
public ProductBigScreenMoudle01Dto GetMoudle01()
{
var now = DateTime.Now.ToLocalTime().Date;
var startOfWeek = GetStartOfWeek(now);
var endOfWeek = startOfWeek.AddDays(6);
var moudle01 = new ProductBigScreenMoudle01Dto();
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 WorkOrderBigScreenDto()
{
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 WorkOrderBigScreenDto()
{
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;
}
}