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