shgx_tz_mom/ZR.Service/mes/qc/qualificationRateReport/QualificationRateEchartsService.cs
2025-09-17 15:57:46 +08:00

233 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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