using DOAN.Model.MES.order;
using DOAN.Model.MES.product;
using DOAN.Model.MES.quality.FQC;
using DOAN.Model.MES.SmartScreen;
using DOAN.Model.MES.SmartScreen.Quality.Dto;
using DOAN.Service.MES.SmartScreen.Order.IService;
using DOAN.Service.MES.SmartScreen.Quality.IService;
using Infrastructure.Attribute;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DOAN.Service.MES.SmartScreen.Quality
{
///
/// 质量大屏Service业务层处理
///
[AppService(ServiceType = typeof(IQualitySmartService), ServiceLifetime = LifeTime.Transient)]
public class QualitySmartService : BaseService, IQualitySmartService
{
public QualityScreenHeadDto GetQualityScreenHead()
{
QualityScreenHeadDto qualityScreenHeadDto = new QualityScreenHeadDto();
// 当前日期
DateTime now = DateTime.Now;
// 当前月份的第一天 00:00:00
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
// 当前月份的最后一天 23:59:59
DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, 1)
.AddMonths(1)
.AddSeconds(-1);
// 计算本周周一(第一天)
int daysUntilMonday = ((int)now.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7;
DateTime startOfWeek = now.AddDays(-daysUntilMonday);
// 计算本周周日(最后一天)23:59:59
DateTime endOfWeek = startOfWeek.AddDays(6).Date
.AddHours(23)
.AddMinutes(59)
.AddSeconds(59);
var response = Queryable().ToList();
List proWorkorders = Context.Queryable().ToList();
List proWorkordersMonth = proWorkorders.Where(o=>o.WorkorderDate>= firstDayOfMonth&& o.WorkorderDate<= lastDayOfMonth).ToList();
List proWorkordersWeek = proWorkorders.Where(o => o.WorkorderDate >= startOfWeek && o.WorkorderDate <= endOfWeek).ToList();
List proWorkordersUpperMonth = proWorkorders.Where(o => o.WorkorderDate >= firstDayOfMonth.AddMonths(-1) && o.WorkorderDate <= lastDayOfMonth.AddMonths(-1)).ToList();
List proWorkordersUpperWeek = proWorkorders.Where(o => o.WorkorderDate >= startOfWeek.AddDays(-7) && o.WorkorderDate <= endOfWeek.AddDays(-7)).ToList();
qualityScreenHeadDto.MonthFQC = response.Where(o => o.CheckDatetime >= firstDayOfMonth && o.CheckDatetime <= lastDayOfMonth).Sum(o => o.Number);
qualityScreenHeadDto.WeekFQC = response.Where(o => o.CheckDatetime >= startOfWeek && o.CheckDatetime <= endOfWeek).Sum(o => o.Number);
int? UpperMonthFQC = response.Where(o => o.CheckDatetime >= firstDayOfMonth.AddMonths(-1) && o.CheckDatetime <= lastDayOfMonth.AddMonths(-1)).Sum(o => o.Number);
int? UpperWeekFQC = response.Where(o => o.CheckDatetime >= startOfWeek.AddDays(-7) && o.CheckDatetime <= endOfWeek.AddDays(-7)).Sum(o => o.Number);
double planSumMonth =Convert.ToDouble(proWorkordersMonth.Sum(o => o.PlanNum));
double numeratorMonth = planSumMonth - (double)qualityScreenHeadDto.MonthFQC;
double ratioMonth = numeratorMonth / (double)planSumMonth;
string percentageMonth = ratioMonth.ToString("P2");
qualityScreenHeadDto.MonthPassRate = percentageMonth;
double planSumWeek = Convert.ToDouble(proWorkordersWeek.Sum(o => o.PlanNum));
double numeratorWeek = planSumWeek - (double)qualityScreenHeadDto.WeekFQC;
double ratioWeek = numeratorWeek / (double)planSumWeek;
string percentageWeek = ratioWeek.ToString("P2");
qualityScreenHeadDto.WeekPassRate= percentageWeek;
double planSumUpperMonth = Convert.ToDouble(proWorkordersUpperMonth.Sum(o => o.PlanNum));
double numeratorUpperMonth = planSumUpperMonth - (double)qualityScreenHeadDto.MonthFQC;
double ratioUpperMonth = numeratorUpperMonth / (double)planSumUpperMonth;
//string percentageUpperMonth = ratioUpperMonth.ToString("P2");
//qualityScreenHeadDto.MonthPassRate = percentageMonth;
double planSumUpperWeek = Convert.ToDouble(proWorkordersUpperWeek.Sum(o => o.PlanNum));
double numeratorUpperWeek = planSumUpperWeek - (double)qualityScreenHeadDto.WeekFQC;
double ratioUpperWeek = numeratorUpperWeek / (double)planSumUpperWeek;
//string percentageWeek = ratioWeek.ToString("P2");
//qualityScreenHeadDto.WeekPassRate = percentageWeek;
qualityScreenHeadDto.OnYearMonthPassRate = (ratioMonth - ratioUpperMonth).ToString("P2");
qualityScreenHeadDto.OnYearWeekPassRate = (ratioWeek - ratioUpperWeek).ToString("P2");
qualityScreenHeadDto.MonthTotalNum = planSumMonth;
qualityScreenHeadDto.WeekTotalNum = planSumWeek;
return qualityScreenHeadDto;
}
public List GetQualitySmartScreenForWeek()
{
// 获取当前日期
DateTime now = DateTime.Now;
// 计算本周周一(第一天)
int daysUntilMonday = ((int)now.DayOfWeek - (int)DayOfWeek.Monday + 7) % 7;
DateTime startOfWeek = now.AddDays(-daysUntilMonday);
// 计算本周周日(最后一天)23:59:59
DateTime endOfWeek = startOfWeek.AddDays(6).Date
.AddHours(23)
.AddMinutes(59)
.AddSeconds(59);
// 使用 SqlSugar 进行联表查询和分组统计
var result = Context.Queryable()
.Where(defect => defect.CheckDatetime >= startOfWeek && defect.CheckDatetime <= endOfWeek)
.GroupBy(defect => new { defect.DefectCode })
.OrderBy(defect => new { defect.DefectCode })
.Select(defect => new EchartsSeriesData
{
Name = defect.DefectName,
Value = Convert.ToDecimal(SqlFunc.AggregateSum(defect.Number))
})
.ToList();
return result;
}
public List GetQualitySmartScreenForMonth()
{
// 获取当前日期
DateTime now = DateTime.Now;
// 当前月份的第一天 00:00:00
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
// 当前月份的最后一天 23:59:59
DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, 1)
.AddMonths(1)
.AddSeconds(-1);
// 使用 SqlSugar 进行联表查询和分组统计
var result = Context.Queryable()
.Where(defect => defect.CheckDatetime >= firstDayOfMonth && defect.CheckDatetime <= lastDayOfMonth)
.GroupBy(defect => new { defect.DefectCode })
.OrderBy(defect => new { defect.DefectCode })
.Select(defect => new EchartsSeriesData
{
Name = defect.DefectName,
Value = Convert.ToDecimal(SqlFunc.AggregateSum(defect.Number))
})
.ToList();
return result;
}
public EchartsOptions GetQualitySmartScreenForBarChart()
{
// 获取当前日期
DateTime now = DateTime.Now;
// 当前月份的第一天 00:00:00
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
// 当前月份的最后一天 23:59:59
DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, 1)
.AddMonths(1)
.AddSeconds(-1);
// 创建字符串集合存储日期
List dateList = new List();
// 遍历从第一天到最后一天的日期
for (DateTime date = firstDayOfMonth; date <= lastDayOfMonth; date = date.AddDays(1))
{
dateList.Add(date); // 使用标准日期格式
}
EchartsOptions echartsOptions = new EchartsOptions();
EchartsXAxis echartsXAxis = new EchartsXAxis();
List dateStringList= new List();
foreach (var date in dateList)
{
dateStringList.Add(date.ToString("MM-dd"));
}
echartsXAxis.Data = dateStringList;
echartsOptions.XAxis = echartsXAxis;
List echartsSeriesList = new List();
// 使用 SqlSugar 进行联表查询和分组统计
List qcFinishedproductDefectCollections = Context.Queryable()
.Where(defect => defect.CheckDatetime >= firstDayOfMonth && defect.CheckDatetime <= lastDayOfMonth).ToList();
List classname = qcFinishedproductDefectCollections.OrderBy(o=>o.DefectCode).Select(o => o.DefectName).Distinct().ToList();
foreach (var classitem in classname)
{
EchartsSeries echartsSeries = new EchartsSeries();
echartsSeries.Name = classitem;
List echartsSeriesDatas = new List();
foreach (var dateitem in dateList)
{
DateTime startOfDay = dateitem.Date;
DateTime endOfDay = startOfDay.AddDays(1).AddSeconds(-1);
EchartsSeriesData echartsSeriesData = new EchartsSeriesData();
echartsSeriesData.Name = dateitem.ToString("MM-dd");
echartsSeriesData.Value =Convert.ToDecimal(qcFinishedproductDefectCollections.Where(o=>o.DefectName==classitem&&o.CheckDatetime >= startOfDay && o.CheckDatetime<= endOfDay).Sum(o=>o.Number));
echartsSeriesDatas.Add(echartsSeriesData);
}
echartsSeries.Data = echartsSeriesDatas;
echartsSeriesList.Add(echartsSeries);
}
echartsOptions.Series = echartsSeriesList;
return echartsOptions;
}
public EchartsOptions GetQualitySmartScreenForLineChart()
{
// 获取当前日期
DateTime now = DateTime.Now;
// 当前月份的第一天 00:00:00
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
// 当前月份的最后一天 23:59:59
DateTime lastDayOfMonth = new DateTime(now.Year, now.Month, 1)
.AddMonths(1)
.AddSeconds(-1);
// 创建字符串集合存储日期
List dateList = new List();
// 遍历从第一天到最后一天的日期
for (DateTime date = firstDayOfMonth; date <= lastDayOfMonth; date = date.AddDays(1))
{
dateList.Add(date); // 使用标准日期格式
}
List proWorkorders = Context.Queryable().Where(o => o.WorkorderDate >= firstDayOfMonth && o.WorkorderDate <= lastDayOfMonth).ToList();
EchartsOptions echartsOptions = new EchartsOptions();
EchartsXAxis echartsXAxis = new EchartsXAxis();
List dateStringList = new List();
foreach (var date in dateList)
{
dateStringList.Add(date.ToString("MM-dd"));
}
echartsXAxis.Data = dateStringList;
echartsOptions.XAxis = echartsXAxis;
List echartsSeriesList = new List();
// 使用 SqlSugar 进行联表查询和分组统计
List qcFinishedproductDefectCollections = Context.Queryable()
.Where(defect => defect.CheckDatetime >= firstDayOfMonth && defect.CheckDatetime <= lastDayOfMonth).ToList();
List classname = qcFinishedproductDefectCollections.OrderBy(o => o.DefectCode).Select(o => o.DefectName).Distinct().ToList();
foreach (var classitem in classname)
{
EchartsSeries echartsSeries = new EchartsSeries();
echartsSeries.Name = classitem;
List echartsSeriesDatas = new List();
foreach (var dateitem in dateList)
{
DateTime startOfDay = dateitem.Date;
DateTime endOfDay = startOfDay.AddDays(1).AddSeconds(-1);
decimal plannum =Convert.ToDecimal(proWorkorders.Where(o => o.WorkorderDate >= startOfDay && o.WorkorderDate <= endOfDay).Sum(o=>o.PlanNum));
decimal nopassnum= Convert.ToDecimal(qcFinishedproductDefectCollections.Where(o => o.DefectName == classitem && o.CheckDatetime >= startOfDay && o.CheckDatetime <= endOfDay).Sum(o => o.Number));
decimal passnum = plannum - nopassnum;
EchartsSeriesData echartsSeriesData = new EchartsSeriesData();
echartsSeriesData.Name = dateitem.ToString("MM-dd");
if (plannum==0)
{
echartsSeriesData.Value =0;
}
else
{
echartsSeriesData.Value = passnum / plannum;
}
echartsSeriesDatas.Add(echartsSeriesData);
}
echartsSeries.Data = echartsSeriesDatas;
echartsSeriesList.Add(echartsSeries);
}
echartsOptions.Series = echartsSeriesList;
return echartsOptions;
}
}
}