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"); 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 }) .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 }) .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.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.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; } } }