using DOAN.Model.MES.product; using DOAN.Service.MES.product.IService; using Infrastructure.Attribute; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DOAN.Service.MES.SmartScreen.Product.IService; using DOAN.Model.MES.SmartScreen.Product; using DOAN.Model.MES.SmartScreen; using Microsoft.Data.SqlClient; using DOAN.Model.MES.base_; using MathNet.Numerics; using System.Data; using NPOI.SS.Formula.Atp; namespace DOAN.Service.MES.SmartScreen.Product { /// /// 生产智慧屏 /// [AppService(ServiceType = typeof(IProductSmartScreenService), ServiceLifetime = LifeTime.Transient)] public class ProductSmartScreenService : BaseService, IProductSmartScreenService { /// /// 数字翻牌器 /// /// public DigitalTurntableModel DigitalTurntable() { DigitalTurntableModel digital=new DigitalTurntableModel(); digital.WorkorderQuantity = Context.Queryable().Where(it=>it.WorkorderDate==DateTime.Today).Count(); digital.FinishedWorkorderQuantity=Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today) .Where(it=>it.Status==2) .Count(); digital.UnFinishedWorkorderQuantity = Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today) .Where(it => it.Status <2) .Count(); digital.ProductionPlanQuantity = Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today).Sum(it=>it.PlanNum??0); digital.ProductionFinishQuantity = Context.Queryable().Where(it => it.JobDateTime >= DateTime.Today && it.JobDateTime < DateTime.Today.AddDays(1)) .Where(it => it.ProcessId == 90).Sum(it => it.FinishNum??0); digital.GroupQuantity=Context.Queryable().Where(it => it.WorkorderDate == DateTime.Today).Select(it=>it.GroupCode).Distinct().Count(); return digital; } public EchartsOptions BarProcessProductStatistic() { EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle("今日各工序产量统计", "今日各工序产量统计"); EchartsXAxis xAxis = new EchartsXAxis(); xAxis.Data = Context.Queryable().LeftJoin((r, p) => r.FkWorkProcesses == p.Id) .Where((r, p) => p.Status == 1 && r.FkWorkRoute == 32) .OrderBy((r, p) => p.Id) .Select((r, p) => p.Name) .ToList(); echartsOptions.XAxis=xAxis; //获取各个工序今日累计报工值 EchartsSeries echartsSeries = new EchartsSeries(); echartsSeries.Name = "今日各个工序累计报工数"; List Data = Context.Queryable() .LeftJoin((it,w)=>it.ProcessId==w.Id) .Where((it, w) =>w.Status==1&& it.JobDateTime >= DateTime.Today && it.JobDateTime <= DateTime.Today.AddDays(1)) .GroupBy((it, w) => new {it.ProcessId,w.Name}) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value=SqlFunc.AggregateSum(it.FinishNum??0) }).ToList(); echartsSeries.Data = Data; echartsOptions.Series.Add(echartsSeries); //获取各个工序今日累计计划值 EchartsSeries echartsSeries2 = new EchartsSeries(); echartsSeries2.Name = "今日各个工序累计计划数"; List Data2 = Context.Queryable() .LeftJoin((it, w) => it.ProcessId == w.Id) .Where((it, w) => w.Status == 1 && it.JobDateTime >= DateTime.Today && it.JobDateTime <= DateTime.Today.AddDays(1)) .GroupBy((it, w) => new { it.ProcessId, w.Name }) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value = SqlFunc.AggregateSum(it.PlanNum ?? 0) }).ToList(); echartsSeries2.Data = Data2; echartsOptions.Series.Add(echartsSeries2); return echartsOptions; } public EchartsOptions BarProcessProductStatisticWeek() { // 获取当前时间 DateTime now = DateTime.Now; // 计算到本周一需要减去的天数 int daysToSubtract = ((int)now.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7; // 获取本周一的日期 DateTime mondayMorning = now.AddDays(-daysToSubtract).Date; // .Date将时间设置为00:00:00 // 获取本周日午夜(实际上是下周一开始时间) DateTime sundayMidnight = mondayMorning.AddDays(7); EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle("本周各工序产量统计", "本周各工序产量统计"); EchartsXAxis xAxis = new EchartsXAxis(); xAxis.Data = Context.Queryable().LeftJoin((r, p) => r.FkWorkProcesses == p.Id) .Where((r, p) => r.FkWorkRoute == 32) .OrderBy((r, p) => p.Id) .Select((r, p) => p.Name) .ToList(); echartsOptions.XAxis = xAxis; //获取各个工序今日累计报工值 EchartsSeries echartsSeries = new EchartsSeries(); echartsSeries.Name = "本周各个工序累计报工数"; List Data = Context.Queryable() .LeftJoin((it, w) => it.ProcessId == w.Id) .Where((it, w) => w.Status == 1 && it.JobDateTime >= mondayMorning && it.JobDateTime <= sundayMidnight) .GroupBy((it, w) => new { it.ProcessId, w.Name }) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value = SqlFunc.AggregateSum(it.FinishNum ?? 0) }).ToList(); echartsSeries.Data = Data; echartsOptions.Series.Add(echartsSeries); //获取各个工序今日累计计划值 EchartsSeries echartsSeries2 = new EchartsSeries(); echartsSeries2.Name = "本周各个工序累计计划数"; List Data2 = Context.Queryable() .LeftJoin((it, w) => it.ProcessId == w.Id) .Where((it, w) => w.Status == 1 && it.JobDateTime >= mondayMorning && it.JobDateTime <= sundayMidnight) .GroupBy((it, w) => new { it.ProcessId, w.Name }) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value = SqlFunc.AggregateSum(it.PlanNum ?? 0) }).ToList(); echartsSeries2.Data = Data2; echartsOptions.Series.Add(echartsSeries2); return echartsOptions; } public EchartsOptions BarProcessProductStatisticMonth() { // 获取当前日期时间 DateTime now = DateTime.Now; // 获取本月第一天的日期时间(凌晨) DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0); // 获取本月最后一天的日期时间(午夜) int daysInMonth = DateTime.DaysInMonth(now.Year, now.Month); DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, daysInMonth, 23, 59, 59); EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle("本月各工序产量统计", "本月各工序产量统计"); EchartsXAxis xAxis = new EchartsXAxis(); xAxis.Data = Context.Queryable().LeftJoin((r, p) => r.FkWorkProcesses == p.Id) .Where((r, p) => p.Status == 1 && r.FkWorkRoute == 32) .OrderBy((r, p) => p.Id) .Select((r, p) => p.Name) .ToList(); echartsOptions.XAxis = xAxis; //获取各个工序今日累计报工值 EchartsSeries echartsSeries = new EchartsSeries(); echartsSeries.Name = "本月各个工序今日累计报工数"; List Data = Context.Queryable() .LeftJoin((it, w) => it.ProcessId == w.Id) .Where((it, w) => w.Status == 1 && it.JobDateTime >= firstDayOfMonth && it.JobDateTime <= lastDayOfMonth) .GroupBy((it, w) => new { it.ProcessId, w.Name }) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value = SqlFunc.AggregateSum(it.FinishNum ?? 0) }).ToList(); echartsSeries.Data = Data; echartsOptions.Series.Add(echartsSeries); //获取各个工序今日累计计划值 EchartsSeries echartsSeries2 = new EchartsSeries(); echartsSeries2.Name = "本月各个工序今日累计计划数"; List Data2 = Context.Queryable() .LeftJoin((it, w) => it.ProcessId == w.Id) .Where((it, w) => w.Status == 1 && it.JobDateTime >= firstDayOfMonth && it.JobDateTime <= lastDayOfMonth) .GroupBy((it, w) => new { it.ProcessId, w.Name }) .Select((it, w) => new EchartsSeriesData() { Name = w.Name, Value = SqlFunc.AggregateSum(it.PlanNum ?? 0) }).ToList(); echartsSeries2.Data = Data2; echartsOptions.Series.Add(echartsSeries2); return echartsOptions; } /// /// 本月每天产量 /// /// public EchartsOptions OutputOfCurrentmonth() { // 获取当前日期 DateTime today = DateTime.Today; // 获取当前月的第一天 DateTime firstDayOfMonth = new DateTime(today.Year, today.Month, 1); // 获取当前月的最后一天 DateTime lastDayOfMonth = new DateTime(today.Year, today.Month, DateTime.DaysInMonth(today.Year, today.Month)); EchartsOptions echartsOptions = new EchartsOptions(); EchartsTitle Title = new EchartsTitle("本月每天产量", "本月每天产量"); echartsOptions.Title = Title; // 横坐标 EchartsXAxis xAxis = new EchartsXAxis(); List xData = new List(); DateTime index = firstDayOfMonth; do { xData.Add(index.ToString("MM-dd")); index = index.AddDays(1); } while (index < lastDayOfMonth.AddDays(1)); xAxis.Data = xData; echartsOptions.XAxis = xAxis; //折线系列 EchartsSeries LineSeries = new EchartsSeries(); LineSeries.Name = "本月每天产量"; LineSeries.Type = "line"; var result = Context.Queryable() .LeftJoin((w, r) => w.Workorder == r.Workorder) .Where((w, r) => w.Status == 1 && w.WorkorderDate >= firstDayOfMonth && w.WorkorderDate <= lastDayOfMonth) .GroupBy((w, r) => w.WorkorderDate) .Select((w, r) => new EchartsSeriesData() { Name = w.WorkorderDate.Value.ToString("MM-dd"), Value = SqlFunc.AggregateSum(r.FinishNum ?? 0) }).ToList(); List LineSeriesData = new List(); foreach (var item in xData) { LineSeriesData.Add(new EchartsSeriesData() { Name = item, Value = result.Where(it => it.Name == item).Select(it => it.Value).FirstOrDefault(), }); } LineSeries.Data = LineSeriesData; echartsOptions.Series = new List() { LineSeries }; // 各个组的产量系列 string[] groupArray = Context.Queryable().Where(it => it.Status == 1).OrderBy(it => it.Id).Select(it => it.GroupCode) .ToArray(); if (groupArray.Length > 0) { var GroupresultList = Context.Queryable() .LeftJoin((w, r) => w.Workorder == r.Workorder) .Where((w, r) => groupArray.Contains(w.GroupCode)) .Where((w, r) => w.Status == 1 && w.WorkorderDate >= firstDayOfMonth && w.WorkorderDate <= lastDayOfMonth) .GroupBy((w, r) => new { w.GroupCode, w.WorkorderDate }) .Select((w, r) => new { groupCode = w.GroupCode, Name = w.WorkorderDate.Value.ToString("MM-dd"), Value = SqlFunc.AggregateSum(r.FinishNum ?? 0) }).ToList(); foreach (var group in groupArray) { EchartsSeries groupSeries = new EchartsSeries(); groupSeries.Name = group + "组"; groupSeries.Type = "bar"; List LineSeriesData01 = new List(); foreach (var item in xData) { LineSeriesData01.Add(new EchartsSeriesData() { Name = item, Value = GroupresultList.Where(it => it.Name == item).Where(it => it.groupCode == group).Select(it => it.Value).FirstOrDefault(), }); } groupSeries.Data = LineSeriesData01; echartsOptions.Series.Add(groupSeries); } } return echartsOptions; } public EchartsOptions AccumulatedReport() { EchartsOptions echartsOptions = new EchartsOptions(); echartsOptions.Title = new EchartsTitle("今日各工序实时累计完工数折线图", "今日各工序实时累计完工数折线图"); //1.查询各个工序 int[] processArray= Context.Queryable() .Where(it => it.JobDateTime > DateTime.Today && it.JobDateTime < DateTime.Today.AddDays(1)) .OrderBy(it => it.ProcessId) .Select(it => it.ProcessId) .Distinct() .ToArray(); //1 X轴 List DateTimeArray= new List(); // 定义起始时间和结束时间 DateTime startTime = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 8, 0, 0); DateTime endTime = startTime.AddHours(13); // 8 AM + 12 hours = 8 PM // 使用循环生成每10分钟的时间戳 for (DateTime currentTime = startTime; currentTime <= endTime; currentTime = currentTime.AddMinutes(10)) { DateTimeArray.Add(currentTime); } List DateTimeArrayString = DateTimeArray.Select(it => it.ToString("HH:mm")).ToList(); echartsOptions.XAxis = new EchartsXAxis() { Data = DateTimeArrayString }; //2 系列值-这组 今日实时累计完成数(每10分钟) for (int i=0;i().Where(it => it.Id == processArray[i]).Select(it => it.Name).First(); EchartsSeries echartsSeries = new EchartsSeries(); echartsSeries.Name = ProcessName + "工序今日实时累计完成数(每10分钟)"; echartsSeries.Type = "line"; List echartsSeriesDatas = new List(); string sql = "SELECT" + " FROM_UNIXTIME( FLOOR( UNIX_TIMESTAMP( job_datetime ) / 600 ) * 600 ) AS time_period," + " SUM( finish_num ) AS count " + " FROM" + " pro_reportwork " + " WHERE" + " DATE(job_datetime) = CURDATE() AND @process_id=process_id " + " GROUP BY" + " FLOOR( UNIX_TIMESTAMP( job_datetime ) / 600 )" + " ORDER BY" + " time_period"; DataTable result = Context.Ado.GetDataTable(sql, new { process_id = processArray[i], }); int sum = 0; foreach (DataRow row in result.Rows) { // DateTime value =(DateTime)row["time_period"]; DateTime value = row["time_period"] != DBNull.Value ? Convert.ToDateTime(row["time_period"]) : DateTime.MinValue; int count = Convert.ToInt32(row["count"]); sum = sum + count; EchartsSeriesData echartsSeriesData = new EchartsSeriesData() { Name = value.ToString("HH:mm"), Value = sum }; echartsSeriesDatas.Add(echartsSeriesData); } // 和X轴一 一对应 int currentNum = Array.IndexOf(DateTimeArrayString.ToArray(), echartsSeriesDatas.Select(it => it.Name).LastOrDefault()); for (int j = 0; j < currentNum; j++) { int point = 0; foreach (var item in echartsSeriesDatas) { if (item.Name == DateTimeArrayString[j]) { continue; } point++; } if (point == echartsSeriesDatas.Count()) { // 获取前一个时间段产量 decimal productNum = 0; if (j >= 1) { productNum = echartsSeriesDatas.Where(it => it.Name == DateTimeArrayString[j - 1]).Select(it => it.Value).FirstOrDefault(); } else { productNum = 0; } echartsSeriesDatas.Add(new EchartsSeriesData() { Name = DateTimeArrayString[j], Value = productNum }); } } echartsSeries.Data = echartsSeriesDatas.OrderBy(it => it.Name).ToList(); echartsOptions.Series.Add(echartsSeries); } return echartsOptions; } } }