diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateEchartsController.cs b/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateEchartsController.cs new file mode 100644 index 00000000..20d92886 --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateEchartsController.cs @@ -0,0 +1,47 @@ +using Microsoft.AspNetCore.Mvc; +using ZR.Model.mes.echarts; +using ZR.Model.MES.DTO; +using ZR.Service.mes.IService; +using ZR.Service.mes.qc; +using ZR.Service.mes.qc.IService.qualificationRateReport; + +namespace ZR.Admin.WebApi.Controllers.mes.qc.FQC.qualificationRateReport +{ + [Route("mes/qc/FQC/QualificationRateEcharts")] + public class QualificationRateEchartsController : BaseController + { + private readonly IQualificationRateEchartsService qualificationRateEchartsService; + + public QualificationRateEchartsController( + IQualificationRateEchartsService qualificationRateEchartsService + ) + { + this.qualificationRateEchartsService = qualificationRateEchartsService; + } + + /// + /// 获取合格率Echarts数据 + /// + /// 查询值 + /// QcCommonFqcBoardDto 看板数据 + [HttpPost("GetQualificationRateEcharts")] + public IActionResult GetQualificationRateEcharts( + [FromBody] FQCQualityQuery query + ) + { + try + { + var result = qualificationRateEchartsService.GetQualificationRateEcharts(query); + if (result == null) + { + return ToResponse(new ApiResult(500, "获取数据列表异常-01:返回值为空", result)); + } + return ToResponse(new ApiResult(200, "ok", result)); + } + catch (Exception ex) + { + return ToResponse(new ApiResult(500, ex.Message, ex.Message)); + } + } + } +} diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateReportController.cs b/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateReportController.cs index b6e9c1e6..20ad082e 100644 --- a/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateReportController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateReportController.cs @@ -23,8 +23,8 @@ namespace ZR.Admin.WebApi.Controllers.mes.qu /// /// 查询值 /// QcCommonFqcBoardDto 看板数据 - [HttpPost("getWorkOrderFqcTableData")] - public IActionResult GetWorkOrderFqcTableData( + [HttpPost("GetQualificationRateReport")] + public IActionResult GetQualificationRateReport( [FromBody] QualificationRateReportQueryDTO query ) { diff --git a/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateEchartsDTO.cs b/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateEchartsDTO.cs new file mode 100644 index 00000000..7474c86b --- /dev/null +++ b/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateEchartsDTO.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ZR.Model.MES.qc.DTO.qualificationRateReport +{ + public class QualificationRateEchartsDTO + { + /// + /// 序号 + /// + [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] + public string Id { get; set; } + + /// + /// 零件号 + /// + public string PartNumber { get; set; } + + /// + /// 零件描述 + /// + public string Description { get; set; } + + /// + /// 总投入数 + /// + public int? AllRequireNumber { get; set; } + + /// + /// 总合格数 + /// + public int? AllQualifiedNumber { get; set; } + + /// + /// 总合格率 + /// + public decimal QualifiedRate { get; set; } + + /// + /// 下线投入数 + /// + public int? FirstRequireNumber { get; set; } + + /// + /// 下线合格数 + /// + public int? FirstQualifiedNumber { get; set; } + + /// + /// 下线合格率 + /// + public decimal FirstQualifiedRate { get; set; } + + /// + /// GP12投入数 + /// + public int? GP12RequireNumber { get; set; } + + /// + /// GP12合格数 + /// + public int? GP12QualifiedNumber { get; set; } + + /// + /// GP12合格率 + /// + public decimal GP12QualifiedRate { get; set; } + + /// + /// 后道投入数 + /// + public int? PolishRequireNumber { get; set; } + + /// + /// 后道合格数 + /// + public int? PolishQualifiedNumber { get; set; } + + /// + /// 后道合格率 + /// + public decimal PolishQualifiedRate { get; set; } + + /// + /// 开始时间 + /// + [SugarColumn(ColumnName = "start_time")] + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + [SugarColumn(ColumnName = "end_time")] + public DateTime? EndTime { get; set; } + } +} diff --git a/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateReportDTO.cs b/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateReportDTO.cs index 08040c90..ae54f555 100644 --- a/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateReportDTO.cs +++ b/ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateReportDTO.cs @@ -1,7 +1,11 @@ -namespace ZR.Model.MES.DTO -{ +using ZR.Model.MES.wms; - public class QualificationRateReportQueryDTO +namespace ZR.Model.MES.DTO +{ + /// + /// 质量统计查询条件 + /// + public class QualificationRateReportQueryDTO : PagerInfo { /// /// 零件号 @@ -21,7 +25,7 @@ public DateTime? EndTime { get; set; } } - public class QualificationRateReportDTO + public class QualificationRateReportDTO : PagerInfo { /// /// 序号 @@ -29,11 +33,6 @@ [SugarColumn(IsPrimaryKey = true, IsIdentity = false)] public string Id { get; set; } - /// - /// 工单号 - /// - public string WorkOrder { get; set; } - /// /// 零件号 /// @@ -55,115 +54,77 @@ public string Color { get; set; } /// - /// 班组 + /// 总投入数 /// - public string Team { get; set; } + public int? AllRequireNumber { get; set; } /// - /// 站点号 + /// 总合格数 /// - public string SiteNo { get; set; } + public int? AllQualifiedNumber { get; set; } /// - /// 串口号 + /// 总合格率 /// - public string ComNo { get; set; } + public string QualifiedRate { get; set; } /// - /// 是否一次合格 + /// 下线投入数 /// - public int? IsOnetime { get; set; } + public int? FirstRequireNumber { get; set; } /// - /// 是否返工件 + /// 下线合格数 /// - public int? IsBack { get; set; } + public int? FirstQualifiedNumber { get; set; } /// - /// 是否抛光件 + /// 下线合格率 /// - public int? IsPolish { get; set; } + public string FirstQualifiedRate { get; set; } /// - /// 是否外部件 + /// GP12投入数 /// - public int? IsOut { get; set; } + public int? GP12RequireNumber { get; set; } + + /// + /// GP12合格数 + /// + public int? GP12QualifiedNumber { get; set; } + + /// + /// GP12合格率 + /// + public string GP12QualifiedRate { get; set; } + + /// + /// 后道投入数 + /// + public int? PolishRequireNumber { get; set; } + + /// + /// 后道合格数 + /// + public int? PolishQualifiedNumber { get; set; } + + /// + /// 后道合格率 + /// + public string PolishQualifiedRate { get; set; } /// /// 开始时间 /// + [SugarColumn(ColumnName = "start_time")] public DateTime? StartTime { get; set; } /// /// 结束时间 /// + [SugarColumn(ColumnName = "end_time")] public DateTime? EndTime { get; set; } - /// - /// 箱标签记录 - /// - public string Label { get; set; } - - /// - /// 投入数 - /// - public int? RequireNumber { get; set; } - - /// - /// 合格数 - /// - public int? QualifiedNumber { get; set; } - - /// - /// 合格率 - /// - public string QualifiedRate { get; set; } - - /// - /// 抛光数 - /// - public int? PolishNumber { get; set; } - - /// - /// 打磨数 - /// - public int? DamoNumber { get; set; } - - /// - /// 报废数 - /// - public int? BaofeiNumber { get; set; } - - /// - /// 同组标识 - /// - public string GroupCode { get; set; } - - /// - /// 同组顺序 - /// - public int? GroupSort { get; set; } - - /// - /// 同组缺陷记录 - /// - public string GroupDefectJson { get; set; } - - /// - /// 系统类别 - /// - public string Type { get; set; } - - /// - /// 系统状态 - /// - public string Status { get; set; } - - /// - /// 系统备注 - /// - public string Remark { get; set; } - /// /// 创建人 /// diff --git a/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateEchartsService.cs b/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateEchartsService.cs new file mode 100644 index 00000000..393a8202 --- /dev/null +++ b/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateEchartsService.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ZR.Model; +using ZR.Model.mes.echarts; +using ZR.Model.MES.DTO; +using ZR.Model.MES.wms; + +namespace ZR.Service.mes.qc.IService.qualificationRateReport +{ + public interface IQualificationRateEchartsService + { + /// + /// 获取Echarts图表 + /// + /// + /// + EchartsOptions GetQualificationRateEcharts(FQCQualityQuery query); + } +} diff --git a/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateReportService.cs b/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateReportService.cs index 89df91ce..6ef58063 100644 --- a/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateReportService.cs +++ b/ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateReportService.cs @@ -1,10 +1,11 @@  using ZR.Model; using ZR.Model.MES.DTO; +using ZR.Model.MES.wms; namespace ZR.Service.mes.IService { - public interface IQualificationRateReportService + public interface IQualificationRateReportService : IBaseService { /// /// 分页获取合格率报表 diff --git a/ZR.Service/mes/qc/qualificationRateReport/QualificationRateEchartsService.cs b/ZR.Service/mes/qc/qualificationRateReport/QualificationRateEchartsService.cs new file mode 100644 index 00000000..4087f39a --- /dev/null +++ b/ZR.Service/mes/qc/qualificationRateReport/QualificationRateEchartsService.cs @@ -0,0 +1,232 @@ +using Infrastructure.Attribute; +using Infrastructure.Extensions; +using SqlSugar; +using System; +using System.Linq; +using ZR.Model.Business; +using ZR.Model.mes.echarts; +using ZR.Model.MES.qc; +using ZR.Model.MES.qc.DTO.qualificationRateReport; +using ZR.Model.MES.wms; +using ZR.Service.mes.qc.IService.qualificationRateReport; + +namespace ZR.Service.mes.qc.qualificationRateReport +{ + [AppService(ServiceType = typeof(IQualificationRateEchartsService), ServiceLifetime = LifeTime.Transient)] + public class QualificationRateEchartsService : BaseService, IQualificationRateEchartsService + { + public EchartsOptions GetQualificationRateEcharts(FQCQualityQuery query) + { + try + { + EchartsOptions echartsOptions = new() + { + Title = new EchartsTitle + { + Text = "零件合格率表", + SubText = $"时间范围:{query.StartTime:yyyy-MM-dd} 至 {query.EndTime:yyyy-MM-dd}" + }, + XAxis = new EchartsXAxis // 初始化X轴 + { + Type = "category", // 类目轴(零件名称) + Data = new List() + }, + YAxis = new EchartsYAxis // 初始化Y轴(数值轴,显示百分比) + { + Type = "value", + Min = "0", + Max = "100", + }, + Series = new List() + }; + + // 获取零件列表和对应的合格率数据 + var materialList = GetPartRateList(query); + + // 填充X轴数据(零件描述,与Series数据对应) + echartsOptions.XAxis.Data = materialList.Select(m => m.Description).ToList(); + + // 填充数据系列 + EchartsSeries series = new() + { + Name = "零件合格率", + Type = "bar", + Data = GetQualificationRateSeriesData(query) + }; + + echartsOptions.Series.Add(series); + return echartsOptions; + } + catch (Exception e) + { + throw new Exception(e.Message); + } + } + + /// ======================================= 嵌入方法 ============================= + + /// + /// 获取Echarts图表数据 + /// + /// + /// + public List GetQualificationRateSeriesData(FQCQualityQuery query) + { + List seriesDataList = new(); + var materialList = GetPartRateList(query); + foreach (var material in materialList) + { + seriesDataList.Add(new EchartsSeriesData + { + Name = material.Description, + Value = material.QualifiedRate + }); + } + return seriesDataList; + } + + /// + /// 获取零件合格率 + /// + /// + /// + public List GetPartRateList(FQCQualityQuery query) + { + // 获取零件列表 + var materialList = Context.Queryable() + .WhereIF(!string.IsNullOrEmpty(query.Partnumber), m => m.Partnumber.Contains(query.Partnumber)) + .Select(m => new QualificationRateEchartsDTO + { + Id = m.Id, + PartNumber = m.Partnumber, + Description = m.Description, + FirstQualifiedRate = 0, + FirstRequireNumber = 0, + FirstQualifiedNumber = 0, + GP12QualifiedRate = 0, + GP12RequireNumber = 0, + GP12QualifiedNumber = 0, + PolishQualifiedRate = 0, + PolishRequireNumber = 0, + PolishQualifiedNumber = 0, + QualifiedRate = 0, + AllRequireNumber = 0, + AllQualifiedNumber = 0 + }) + .ToList(); + // 计算每个零件合格率 + var partRateList = GetPartRateData(materialList, query); + return partRateList; + } + + // 计算每个零件合格率 + public List GetPartRateData(List materialList, FQCQualityQuery query) + { + // 遍历零件,计算合格率 + for (int i = 0; i < materialList.Count; i++) + { + // 计算各环节合格率,并返回合格数、投入数 + var item = materialList[i]; + var firstData = GetFirstRateAndData(item.PartNumber, query); + var gp12Data = GetGP12RateAndData(item.PartNumber, query); + var polishData = GetPolishRateAndData(item.PartNumber, query); + + // 赋值各环节合格率 + item.FirstQualifiedRate = (decimal)firstData[2]; + item.FirstQualifiedNumber = firstData[0].ParseToInt(); + item.FirstRequireNumber = (int)firstData[1]; + item.GP12QualifiedRate = (decimal)gp12Data[2]; + item.GP12QualifiedNumber = (int)gp12Data[0]; + item.GP12RequireNumber = (int)gp12Data[1]; + item.PolishQualifiedRate = (decimal)polishData[2]; + item.PolishQualifiedNumber = (int)polishData[0]; + item.PolishRequireNumber = (int)polishData[1]; + + // 汇总计算总合格率 + int totalQualified = (int)firstData[0] + (int)gp12Data[0] + (int)polishData[0]; + int totalRequire = (int)firstData[1] + (int)gp12Data[1] + (int)polishData[1]; + item.QualifiedRate = CalculateSingleRate(totalQualified, totalRequire); + item.AllQualifiedNumber = totalQualified; + item.AllRequireNumber = totalRequire; + } + return materialList; + } + + // 成品入库 + private object[] GetFirstRateAndData(string Partnumber, FQCQualityQuery query) + { + var stats = Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.FinishedPartNumber == Partnumber && m.Remark == "抛光") + .Select(m => new + { + Req = SqlFunc.AggregateSum(m.RequireNumber) ?? 0, + Qua = SqlFunc.AggregateSum(m.QualifiedNumber) ?? 0 + }) + .ToList(); + var statsList = stats.FirstOrDefault() ?? new { Req = 0, Qua = 0 }; + return new object[] { statsList.Qua, statsList.Req, CalculateSingleRate(statsList.Qua, statsList.Req) }; + } + + // GP12 + private object[] GetGP12RateAndData(string Partnumber, FQCQualityQuery query) + { + var sumReq = Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.RequireNumber) ?? 0 + + Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.PartNumber == Partnumber && m.GroupSort == 1) + .Sum(m => m.RequireNumber) ?? 0; + + var sumQua = Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.QualifiedNumber) ?? 0 + + Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.PartNumber == Partnumber && m.GroupSort == 1) + .Sum(m => m.QualifiedNumber) ?? 0; + return new object[] { sumQua, sumReq, CalculateSingleRate(sumQua, sumReq) }; + } + + // 后道检验 + private object[] GetPolishRateAndData(string Partnumber, FQCQualityQuery query) + { + var sumReq = Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.RequireNumber) ?? 0 + + Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber).Sum(m => m.RequireNumber) ?? 0; + + var sumQua = Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.QualifiedNumber) ?? 0 + + Context.Queryable() + .WhereIF(query.StartTime > DateTime.MinValue, m => m.StartTime >= query.StartTime) + .WhereIF(query.EndTime > DateTime.MinValue, m => m.EndTime <= query.EndTime) + .Where(m => m.Partnumber == Partnumber).Sum(m => m.QualifiedNumber) ?? 0; + + return new object[] { sumQua, sumReq, CalculateSingleRate(sumQua, sumReq) }; + } + + // 通用计算方法 + private decimal CalculateSingleRate(int qualified, int require) + { + if (require == 0 || qualified == 0) return 0; + return Math.Round((decimal)qualified / require * 100, 2); + } + } +} diff --git a/ZR.Service/mes/qc/qualificationRateReport/QualificationRateReportService.cs b/ZR.Service/mes/qc/qualificationRateReport/QualificationRateReportService.cs index 5e436837..a5b8936e 100644 --- a/ZR.Service/mes/qc/qualificationRateReport/QualificationRateReportService.cs +++ b/ZR.Service/mes/qc/qualificationRateReport/QualificationRateReportService.cs @@ -1,20 +1,155 @@ -using Infrastructure.Attribute; +using Aliyun.OSS; +using Infrastructure.Attribute; +using Infrastructure.Extensions; +using Mapster.Utils; using SqlSugar; +using SqlSugar.Extensions; +using System; +using System.Linq; +using System.Security.AccessControl; using ZR.Model; +using ZR.Model.Business; using ZR.Model.MES.DTO; using ZR.Model.MES.qc; -using ZR.Model.MES.qu; +using ZR.Model.MES.wms; +using ZR.Repository; using ZR.Service.mes.IService; -using ZR.Service.mes.qc.IService; namespace ZR.Service.mes.qc { [AppService(ServiceType = typeof(IQualificationRateReportService), ServiceLifetime = LifeTime.Transient)] - public class QualificationRateReportService : BaseService, IQualificationRateReportService + public class QualificationRateReportService : BaseService, IQualificationRateReportService { + // 获取合格率报告 public PagedInfo GetQualificationRateReport(QualificationRateReportQueryDTO parms) { - throw new global::System.NotImplementedException(); + // 获取物料清单 + var materialPage = Context.Queryable() + .WhereIF(!string.IsNullOrEmpty(parms.PartNumber), m => m.Partnumber.Contains(parms.PartNumber)) + .Select(m => new QualificationRateReportDTO + { + Id = m.Id, + PartNumber = m.Partnumber, + Description = m.Description, + Specification = m.Specification, + Color = m.Color, + FirstQualifiedRate = "", + FirstRequireNumber = 0, + FirstQualifiedNumber = 0, + GP12QualifiedRate = "", + GP12RequireNumber = 0, + GP12QualifiedNumber = 0, + PolishQualifiedRate = "", + PolishRequireNumber = 0, + PolishQualifiedNumber = 0, + QualifiedRate = "", + AllRequireNumber = 0, + AllQualifiedNumber = 0 + }) + .ToPage(parms); + + // 遍历每个零件,计算各环节+总合格率 + foreach (var item in materialPage.Result) + { + // 计算各环节合格率,并返回合格数、投入数 + var firstData = GetFirstRateAndData(item.PartNumber, parms); + var gp12Data = GetGP12RateAndData(item.PartNumber, parms); + var polishData = GetPolishRateAndData(item.PartNumber, parms); + + // 赋值各环节合格率 + item.FirstQualifiedRate = firstData[2].ToString(); + item.FirstQualifiedNumber = firstData[0].ParseToInt(); + item.FirstRequireNumber = (int)firstData[1]; + item.GP12QualifiedRate = gp12Data[2].ToString(); + item.GP12QualifiedNumber = (int)gp12Data[0]; + item.GP12RequireNumber = (int)gp12Data[1]; + item.PolishQualifiedRate = polishData[2].ToString(); + item.PolishQualifiedNumber = (int)polishData[0]; + item.PolishRequireNumber = (int)polishData[1]; + + // 汇总计算总合格率 + int totalQualified = (int)firstData[0] + (int)gp12Data[0] + (int)polishData[0]; + int totalRequire = (int)firstData[1] + (int)gp12Data[1] + (int)polishData[1]; + item.QualifiedRate = CalculateSingleRate(totalQualified, totalRequire); + item.AllQualifiedNumber = totalQualified; + item.AllRequireNumber = totalRequire; + } + return materialPage; + } + + // 成品入库 + private object[] GetFirstRateAndData(string Partnumber, QualificationRateReportQueryDTO parms) + { + var stats = Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime>=parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.FinishedPartNumber == Partnumber && m.Remark == "抛光") + .Select(m => new + { + Req = SqlFunc.AggregateSum(m.RequireNumber) ?? 0, + Qua = SqlFunc.AggregateSum(m.QualifiedNumber) ?? 0 + }) + .ToList(); + var statsList = stats.FirstOrDefault() ?? new { Req = 0, Qua = 0 }; + return new object[] { statsList.Qua, statsList.Req, CalculateSingleRate(statsList.Qua, statsList.Req) }; + } + + // GP12 + private object[] GetGP12RateAndData(string Partnumber, QualificationRateReportQueryDTO parms) + { + var sumReq = Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.RequireNumber) ?? 0 + + Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.PartNumber == Partnumber && m.GroupSort == 1) + .Sum(m => m.RequireNumber) ?? 0; + + var sumQua = Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.QualifiedNumber) ?? 0 + + Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.PartNumber == Partnumber && m.GroupSort == 1) + .Sum(m => m.QualifiedNumber) ?? 0; + return new object[] { sumQua, sumReq, CalculateSingleRate(sumQua, sumReq) }; + } + + // 后道检验 + private object[] GetPolishRateAndData(string Partnumber, QualificationRateReportQueryDTO parms) + { + var sumReq = Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.Partnumber == Partnumber) + .Sum(m => m.RequireNumber) ?? 0 + + Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime) + .Where(m => m.Partnumber == Partnumber).Sum(m => m.RequireNumber) ?? 0; + + var sumQua = Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime).Where(m => m.Partnumber == Partnumber) + .Sum(m => m.QualifiedNumber) ?? 0 + + Context.Queryable() + .WhereIF(parms.StartTime > DateTime.MinValue, m => m.StartTime >= parms.StartTime) + .WhereIF(parms.EndTime > DateTime.MinValue, m => m.EndTime <= parms.EndTime).Where(m => m.Partnumber == Partnumber).Sum(m => m.QualifiedNumber) ?? 0; + + return new object[] { sumQua, sumReq, CalculateSingleRate(sumQua, sumReq) }; + } + + // 通用计算方法 + private string CalculateSingleRate(int qualified, int require) + { + if (require == 0 || qualified == 0) return "0%"; + return $"{Math.Round((double)qualified / require * 100, 2)}%"; } } -} +} \ No newline at end of file