From 593230d2ea9185261b2a2e413ec09cce0100fbd6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=99=93=E4=B8=9C?= <17363321594@163.com>
Date: Wed, 17 Sep 2025 15:57:46 +0800
Subject: [PATCH] =?UTF-8?q?=E5=90=88=E6=A0=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../QualificationRateEchartsController.cs | 47 ++++
.../QualificationRateReportController.cs | 4 +-
.../QualificationRateEchartsDTO.cs | 99 ++++++++
.../QualificationRateReportDTO.cs | 137 ++++-------
.../IQualificationRateEchartsService.cs | 22 ++
.../IQualificationRateReportService.cs | 3 +-
.../QualificationRateEchartsService.cs | 232 ++++++++++++++++++
.../QualificationRateReportService.cs | 147 ++++++++++-
8 files changed, 594 insertions(+), 97 deletions(-)
create mode 100644 ZR.Admin.WebApi/Controllers/mes/qc/FQC/qualificationRateReport/QualificationRateEchartsController.cs
create mode 100644 ZR.Model/MES/qc/DTO/qualificationRateReport/QualificationRateEchartsDTO.cs
create mode 100644 ZR.Service/mes/qc/IService/qualificationRateReport/IQualificationRateEchartsService.cs
create mode 100644 ZR.Service/mes/qc/qualificationRateReport/QualificationRateEchartsService.cs
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