This commit is contained in:
2025-09-21 13:52:18 +08:00
8 changed files with 594 additions and 97 deletions

View File

@@ -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
{
/// <summary>
/// 获取Echarts图表
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
EchartsOptions GetQualificationRateEcharts(FQCQualityQuery query);
}
}

View File

@@ -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<WmMaterial>
{
/// <summary>
/// 分页获取合格率报表

View File

@@ -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<EchartsOptions>, 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<string>()
},
YAxis = new EchartsYAxis // 初始化Y轴数值轴显示百分比
{
Type = "value",
Min = "0",
Max = "100",
},
Series = new List<EchartsSeries>()
};
// 获取零件列表和对应的合格率数据
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);
}
}
/// ======================================= 嵌入方法 =============================
/// <summary>
/// 获取Echarts图表数据
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<EchartsSeriesData> GetQualificationRateSeriesData(FQCQualityQuery query)
{
List<EchartsSeriesData> seriesDataList = new();
var materialList = GetPartRateList(query);
foreach (var material in materialList)
{
seriesDataList.Add(new EchartsSeriesData
{
Name = material.Description,
Value = material.QualifiedRate
});
}
return seriesDataList;
}
/// <summary>
/// 获取零件合格率
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<QualificationRateEchartsDTO> GetPartRateList(FQCQualityQuery query)
{
// 获取零件列表
var materialList = Context.Queryable<WmMaterial>()
.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<QualificationRateEchartsDTO> GetPartRateData(List<QualificationRateEchartsDTO> 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<QcQualityStatisticsFirst>()
.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<WmGp12QualityStatistics>()
.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<QcGp12ServiceStatistics>()
.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<WmGp12QualityStatistics>()
.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<QcGp12ServiceStatistics>()
.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<WmPolishQualityStatistics>()
.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<WmPolishWorkQualityStatistics>()
.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<WmPolishQualityStatistics>()
.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<WmPolishWorkQualityStatistics>()
.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);
}
}
}

View File

@@ -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<QcQualityStatisticsFirst>, IQualificationRateReportService
public class QualificationRateReportService : BaseService<WmMaterial>, IQualificationRateReportService
{
// 获取合格率报告
public PagedInfo<QualificationRateReportDTO> GetQualificationRateReport(QualificationRateReportQueryDTO parms)
{
throw new global::System.NotImplementedException();
// 获取物料清单
var materialPage = Context.Queryable<WmMaterial>()
.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<QcQualityStatisticsFirst>()
.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<WmGp12QualityStatistics>()
.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<QcGp12ServiceStatistics>()
.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<WmGp12QualityStatistics>()
.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<QcGp12ServiceStatistics>()
.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<WmPolishQualityStatistics>()
.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<WmPolishWorkQualityStatistics>()
.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<WmPolishQualityStatistics>()
.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<WmPolishWorkQualityStatistics>()
.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)}%";
}
}
}
}