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.wms; using ZR.Repository; using ZR.Service.mes.IService; namespace ZR.Service.mes.qc { [AppService(ServiceType = typeof(IQualificationRateReportService), ServiceLifetime = LifeTime.Transient)] public class QualificationRateReportService : BaseService, IQualificationRateReportService { // 获取合格率报告 public PagedInfo GetQualificationRateReport(QualificationRateReportQueryDTO parms) { // 获取物料清单 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)}%"; } } }