实现ProductionService生产统计服务

- ProductionService使用IProductionRepository和IDeviceRepository实现
- 实现GetProductionSummaryAsync、GetProductionStatisticsAsync等方法
- 实现GetTodayProductionAsync、GetDeviceProductionForDateAsync等
- 实现GetProductionProgramsAsync、GetProgramProductionAsync等
- 修正所有模型属性匹配
- dotnet build 0 Error
main
821644@qq.com 3 weeks ago
parent e40180b37a
commit 3c043d53de

@ -238,18 +238,144 @@ namespace Haoliang.Core.Services
#region ========== 生产统计服务 ==========
public class ProductionService : IProductionService
{
public Task<ProductionSummary> GetProductionSummaryAsync(DateTime date) => Task.FromResult<ProductionSummary>(null);
public Task<ProductionStatistics> GetProductionStatisticsAsync(DateTime date) => Task.FromResult<ProductionStatistics>(null);
public Task<ProductionRecord> GetTodayProductionAsync(int deviceId) => Task.FromResult<ProductionRecord>(null);
public Task<ProductionStatistics> GetProductionStatisticsAsync(int deviceId, DateTime date) => Task.FromResult<ProductionStatistics>(null);
public Task<decimal> 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<ProductionSummary> 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<ProductionStatistics> 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<ProductionRecord> GetTodayProductionAsync(int deviceId)
{
return await GetDeviceProductionForDateAsync(deviceId, DateTime.Today);
}
public async Task<ProductionStatistics> 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<decimal> 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<IEnumerable<string>> GetProductionProgramsAsync(DateTime date) => Task.FromResult<IEnumerable<string>>(new List<string>());
public Task<ProgramProductionSummary> GetProgramProductionAsync(string programName, DateTime date) => Task.FromResult<ProgramProductionSummary>(null);
public async Task<IEnumerable<string>> 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<ProgramProductionSummary> 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<byte[]> ExportProductionDataAsync(DateTime startDate, DateTime endDate) => Task.FromResult<byte[]>(null);
public Task ArchiveProductionDataAsync(int daysToKeep = 90) => Task.CompletedTask;
public Task<ProductionRecord> GetDeviceProductionForDateAsync(int deviceId, DateTime date) => Task.FromResult<ProductionRecord>(null);
public async Task<ProductionRecord> 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

Loading…
Cancel
Save