From 3c043d53de1e4dfc569fd2f1f16eb5b149222f88 Mon Sep 17 00:00:00 2001 From: "821644@qq.com" <821644@qq.com> Date: Mon, 13 Apr 2026 12:02:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0ProductionService=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E7=BB=9F=E8=AE=A1=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ProductionService使用IProductionRepository和IDeviceRepository实现 - 实现GetProductionSummaryAsync、GetProductionStatisticsAsync等方法 - 实现GetTodayProductionAsync、GetDeviceProductionForDateAsync等 - 实现GetProductionProgramsAsync、GetProgramProductionAsync等 - 修正所有模型属性匹配 - dotnet build 0 Error --- Haoliang.Core/Services/StubServices.cs | 142 +++++++++++++++++++++++-- 1 file changed, 134 insertions(+), 8 deletions(-) diff --git a/Haoliang.Core/Services/StubServices.cs b/Haoliang.Core/Services/StubServices.cs index adce68a..fe4e41a 100644 --- a/Haoliang.Core/Services/StubServices.cs +++ b/Haoliang.Core/Services/StubServices.cs @@ -238,18 +238,144 @@ namespace Haoliang.Core.Services #region ========== 生产统计服务 ========== public class ProductionService : IProductionService { - public Task GetProductionSummaryAsync(DateTime date) => Task.FromResult(null); - public Task GetProductionStatisticsAsync(DateTime date) => Task.FromResult(null); - public Task GetTodayProductionAsync(int deviceId) => Task.FromResult(null); - public Task GetProductionStatisticsAsync(int deviceId, DateTime date) => Task.FromResult(null); - public Task GetQualityRateAsync(int deviceId, DateTime date) => Task.FromResult(0m); + private readonly IProductionRepository _productionRepository; + private readonly IDeviceRepository _deviceRepository; + + public ProductionService(IProductionRepository productionRepository, IDeviceRepository deviceRepository) + { + _productionRepository = productionRepository; + _deviceRepository = deviceRepository; + } + + public async Task GetProductionSummaryAsync(DateTime date) + { + var records = await _productionRepository.FindAsync(p => p.ProductionDate.Date == date.Date); + var recordList = records.ToList(); + + return new ProductionSummary + { + SummaryId = 1, + ProductionDate = date, + DeviceId = 0, + DeviceName = "All Devices", + TotalQuantity = recordList.Sum(r => r.Quantity), + ProgramCount = recordList.Select(r => r.NCProgram).Distinct().Count(), + QualityRate = recordList.Any() ? (decimal)recordList.Average(r => r.QualityRate) : 0 + }; + } + + public async Task GetProductionStatisticsAsync(DateTime date) + { + var records = await _productionRepository.FindAsync(p => p.ProductionDate.Date == date.Date); + var recordList = records.ToList(); + var devices = await _deviceRepository.GetAllAsync(); + + return new ProductionStatistics + { + Date = date, + TotalDevices = devices.Count(), + ActiveDevices = recordList.Select(r => r.DeviceId).Distinct().Count(), + TotalProduction = recordList.Sum(r => r.Quantity), + AverageProduction = recordList.Any() ? (decimal)recordList.Average(r => r.Quantity) : 0, + TotalPrograms = recordList.Select(r => r.NCProgram).Distinct().Count(), + QualityRate = recordList.Any() ? (decimal)recordList.Average(r => r.QualityRate) : 0, + ProductionByDevice = recordList.GroupBy(r => r.DeviceId.ToString()) + .ToDictionary(g => g.Key, g => g.Sum(r => r.Quantity)), + ProductionByProgram = recordList.GroupBy(r => r.NCProgram) + .ToDictionary(g => g.Key, g => g.Sum(r => r.Quantity)) + }; + } + + public async Task GetTodayProductionAsync(int deviceId) + { + return await GetDeviceProductionForDateAsync(deviceId, DateTime.Today); + } + + public async Task GetProductionStatisticsAsync(int deviceId, DateTime date) + { + var record = await GetDeviceProductionForDateAsync(deviceId, date); + if (record == null) + { + return new ProductionStatistics + { + Date = date, + TotalDevices = 1, + ActiveDevices = 0, + TotalProduction = 0, + QualityRate = 0 + }; + } + + return new ProductionStatistics + { + Date = date, + TotalDevices = 1, + ActiveDevices = 1, + TotalProduction = record.Quantity + }; + } + + public async Task GetQualityRateAsync(int deviceId, DateTime date) + { + var records = await _productionRepository.FindAsync(p => + p.DeviceId == deviceId && p.ProductionDate.Date == date.Date); + var recordList = records.ToList(); + return recordList.Any() ? (decimal)recordList.Average(r => r.QualityRate) : 0; + } + public Task CalculateAllProductionAsync() => Task.CompletedTask; public Task CalculateProductionAsync(int deviceId) => Task.CompletedTask; - public Task> GetProductionProgramsAsync(DateTime date) => Task.FromResult>(new List()); - public Task GetProgramProductionAsync(string programName, DateTime date) => Task.FromResult(null); + + public async Task> GetProductionProgramsAsync(DateTime date) + { + var records = await _productionRepository.FindAsync(p => p.ProductionDate.Date == date.Date); + return records.Select(r => r.NCProgram).Where(p => !string.IsNullOrEmpty(p)).Distinct(); + } + + public async Task GetProgramProductionAsync(string programName, DateTime date) + { + var records = await _productionRepository.FindAsync(p => + p.NCProgram == programName && p.ProductionDate.Date == date.Date); + + var recordList = records.ToList(); + return new ProgramProductionSummary + { + Id = 0, + NCProgram = programName, + ProductionDate = date, + TotalQuantity = recordList.Sum(r => r.Quantity), + ValidQuantity = (int)recordList.Sum(r => r.Quantity * r.QualityRate / 100), + InvalidQuantity = (int)recordList.Sum(r => r.Quantity * (100 - r.QualityRate) / 100), + QualityRate = recordList.Any() ? (decimal)recordList.Average(r => r.QualityRate) : 0 + }; + } + public Task ExportProductionDataAsync(DateTime startDate, DateTime endDate) => Task.FromResult(null); public Task ArchiveProductionDataAsync(int daysToKeep = 90) => Task.CompletedTask; - public Task GetDeviceProductionForDateAsync(int deviceId, DateTime date) => Task.FromResult(null); + + public async Task GetDeviceProductionForDateAsync(int deviceId, DateTime date) + { + var records = await _productionRepository.FindAsync(p => + p.DeviceId == deviceId && p.ProductionDate.Date == date.Date); + + var recordList = records.ToList(); + if (!recordList.Any()) + return null; + + var device = await _deviceRepository.GetByIdAsync(deviceId); + + return new ProductionRecord + { + RecordId = recordList.First().Id, + DeviceId = deviceId, + DeviceName = device?.DeviceName ?? "Unknown", + ProgramName = recordList.First().NCProgram, + Quantity = recordList.Sum(r => r.Quantity), + ProductionDate = date, + IsCompleted = true, + CreatedAt = DateTime.Now + }; + } } public class ProductionScheduler : IProductionScheduler