233 lines
11 KiB
C#
233 lines
11 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|