diff --git a/DOAN.Admin.WebApi/Controllers/MES/quality/Analysis/FinalAnalysisController.cs b/DOAN.Admin.WebApi/Controllers/MES/quality/Analysis/FinalAnalysisController.cs
new file mode 100644
index 0000000..42eb5aa
--- /dev/null
+++ b/DOAN.Admin.WebApi/Controllers/MES/quality/Analysis/FinalAnalysisController.cs
@@ -0,0 +1,40 @@
+using Microsoft.AspNetCore.Mvc;
+using DOAN.Service.MES.quality.Analysis.IService;
+using DOAN.Model.MES.quality.Analysis.Dto;
+using Xunit.Sdk;
+using DOAN.Infrastructure;
+
+namespace DOAN.WebApi.Controllers.MES.quality.Analysis
+{
+ [Route("mes/qualityManagement/Analysis/FinalAnalysis")]
+ public class FinalAnalysisController : BaseController
+ {
+ private readonly IFinalAnalysisService finalAnalysisService;
+ public FinalAnalysisController(IFinalAnalysisService finalAnalysisService)
+ {
+ this.finalAnalysisService = finalAnalysisService;
+
+ }
+
+
+
+ //TODO 成品缺陷统计分析
+ [HttpPost("Pie_final_Analysis")]
+ public IActionResult PieFinalAnalysis([FromBody] FinalAnalysisDto finalAnalysis)
+ {
+ if (finalAnalysis == null) { throw new CustomException("finalAnalysis未空"); }
+
+ finalAnalysis.DateRange[0] = ConvertDateTime.ConvertLocalDate(finalAnalysis.DateRange[0]);
+ finalAnalysis.DateRange[1] = ConvertDateTime.ConvertLocalDate(finalAnalysis.DateRange[1]);
+ if (finalAnalysis.DateRange[0] == DateTime.MinValue || finalAnalysis.DateRange[1] == DateTime.MinValue)
+ {
+ throw new CustomException("时间范围有误");
+ }
+ finalAnalysis.DateRange[1] = finalAnalysis.DateRange[1].AddDays(1);
+ var response = finalAnalysisService.PieFinalAnalysis(finalAnalysis);
+
+ return SUCCESS(response);
+ }
+
+ }
+}
diff --git a/DOAN.Model/MES/quality/Analysis/Dto/FinalAnalysisDto.cs b/DOAN.Model/MES/quality/Analysis/Dto/FinalAnalysisDto.cs
new file mode 100644
index 0000000..f471071
--- /dev/null
+++ b/DOAN.Model/MES/quality/Analysis/Dto/FinalAnalysisDto.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DOAN.Model.MES.quality.Analysis.Dto
+{
+ public class FinalAnalysisDto
+ {
+
+ ///
+ /// 存货编码
+ ///
+
+ public string ProductionCode { get; set; }
+
+ ///
+ /// 产品名称
+ ///
+
+ public string ProductionName { get; set; }
+
+ ///
+ /// 规格型号
+ ///
+
+ public string Specification { get; set; }
+
+ ///
+ /// 日期范围
+ ///
+ public DateTime[] DateRange { get; set; } = new DateTime[2];
+
+ }
+
+ public class ValueName
+ {
+ public string Name { get; set; }
+ public int Value { get; set; }
+
+ }
+
+ public class PieDataDto
+ {
+ public string[] LegendData { get; set; }
+
+
+ public List SeriesData { get; set; }
+ }
+
+
+
+}
diff --git a/DOAN.Service/MES/quality/Analysis/FinalAnalysisService.cs b/DOAN.Service/MES/quality/Analysis/FinalAnalysisService.cs
new file mode 100644
index 0000000..6adbdb3
--- /dev/null
+++ b/DOAN.Service/MES/quality/Analysis/FinalAnalysisService.cs
@@ -0,0 +1,51 @@
+
+using DOAN.Model.MES.andon.Dto;
+using DOAN.Model.MES.product;
+using DOAN.Model.MES.quality.Analysis.Dto;
+using DOAN.Model.MES.quality.FQC;
+using DOAN.Repository;
+using DOAN.Service.MES.quality.Analysis.IService;
+using Infrastructure.Attribute;
+
+namespace DOAN.Service.MES.quality.Analysis
+{
+ ///
+ /// 缺陷类别Service业务层处理
+ ///
+ [AppService(ServiceType = typeof(IFinalAnalysisService), ServiceLifetime = LifeTime.Transient)]
+ public class FinalAnalysisService : BaseService, IFinalAnalysisService
+ {
+ public PieDataDto PieFinalAnalysis(FinalAnalysisDto finalAnalysis)
+ {
+
+
+ // 查找所需工单
+ var proWorkorders = Context.Queryable()
+ .WhereIF(!string.IsNullOrEmpty(finalAnalysis.ProductionCode), it => it.ProductionCode.Contains(finalAnalysis.ProductionCode))
+ .WhereIF(!string.IsNullOrEmpty(finalAnalysis.ProductionName), it => it.ProductionName.Contains(finalAnalysis.ProductionName))
+ .WhereIF(!string.IsNullOrEmpty(finalAnalysis.Specification), it => it.Specification.Contains(finalAnalysis.Specification))
+ .Where(it => it.CreatedTime >= finalAnalysis.DateRange[0] && it.CreatedTime <= finalAnalysis.DateRange[1]);
+
+
+
+ List SeriesData = Context.Queryable(proWorkorders).LeftJoin((p, q) => p.Workorder == q.Workorder)
+ .GroupBy((p, q) => q.DefectCode)
+ .Select((p, q) => new ValueName()
+ {
+ Name = q.DefectCode,
+ Value = SqlFunc.AggregateSum(q.Number ?? 0)
+ }).ToList();
+
+ string[] LegendData = SeriesData.Select(it => it.Name).ToArray();
+
+ PieDataDto pieDataDto = new PieDataDto();
+ pieDataDto.SeriesData = SeriesData;
+ pieDataDto.LegendData = LegendData;
+
+
+ return pieDataDto;
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/DOAN.Service/MES/quality/Analysis/IService/IFinalAnalysisService.cs b/DOAN.Service/MES/quality/Analysis/IService/IFinalAnalysisService.cs
new file mode 100644
index 0000000..8a1cbf4
--- /dev/null
+++ b/DOAN.Service/MES/quality/Analysis/IService/IFinalAnalysisService.cs
@@ -0,0 +1,15 @@
+using DOAN.Model.MES.quality.Analysis.Dto;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DOAN.Service.MES.quality.Analysis.IService
+{
+ public interface IFinalAnalysisService
+ {
+ PieDataDto PieFinalAnalysis(FinalAnalysisDto finalAnalysis);
+ }
+}