|
|
|
|
@ -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
|
|
|
|
|
|