You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
8.9 KiB
C#

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Haoliang.Models.Production;
using Haoliang.Data.Repositories;
namespace Haoliang.Data.Repositories
{
public interface IProductionRepository : IRepository<ProductionRecord>
{
Task<IEnumerable<ProductionRecord>> GetByDeviceAndDateAsync(int deviceId, DateTime date);
Task<IEnumerable<ProductionRecord>> GetByDeviceAndProgramAsync(int deviceId, string ncProgram);
Task<IEnumerable<ProductionRecord>> GetByDateRangeAsync(DateTime startDate, DateTime endDate);
Task<ProductionRecord> GetLatestProductionAsync(int deviceId, string ncProgram);
Task<int> GetTodayProductionAsync(int deviceId);
Task<int> GetProductionByDateAsync(int deviceId, DateTime date);
Task<decimal> GetQualityRateAsync(int deviceId, DateTime date);
Task<bool> HasProductionDataAsync(int deviceId, DateTime date);
}
public class ProductionRepository : Repository<ProductionRecord>, IProductionRepository
{
private readonly CNCDbContext _context;
public ProductionRepository(CNCDbContext context) : base(context)
{
_context = context;
}
public async Task<IEnumerable<ProductionRecord>> GetByDeviceAndDateAsync(int deviceId, DateTime date)
{
return await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.ProductionDate.Date == date.Date)
.OrderBy(pr => pr.NCProgram)
.ThenBy(pr => pr.CreatedAt)
.ToListAsync();
}
public async Task<IEnumerable<ProductionRecord>> GetByDeviceAndProgramAsync(int deviceId, string ncProgram)
{
return await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.NCProgram == ncProgram)
.OrderByDescending(pr => pr.ProductionDate)
.ToListAsync();
}
public async Task<IEnumerable<ProductionRecord>> GetByDateRangeAsync(DateTime startDate, DateTime endDate)
{
return await _context.ProductionRecords
.Where(pr => pr.ProductionDate >= startDate && pr.ProductionDate <= endDate)
.OrderBy(pr => pr.ProductionDate)
.ThenBy(pr => pr.DeviceId)
.ThenBy(pr => pr.NCProgram)
.ToListAsync();
}
public async Task<ProductionRecord> GetLatestProductionAsync(int deviceId, string ncProgram)
{
return await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.NCProgram == ncProgram)
.OrderByDescending(pr => pr.ProductionDate)
.ThenByDescending(pr => pr.CreatedAt)
.FirstOrDefaultAsync();
}
public async Task<int> GetTodayProductionAsync(int deviceId)
{
var today = DateTime.Today;
var productionRecords = await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.ProductionDate == today)
.ToListAsync();
return productionRecords.Sum(pr => pr.Quantity);
}
public async Task<int> GetProductionByDateAsync(int deviceId, DateTime date)
{
var productionRecords = await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.ProductionDate.Date == date.Date)
.ToListAsync();
return productionRecords.Sum(pr => pr.Quantity);
}
public async Task<decimal> GetQualityRateAsync(int deviceId, DateTime date)
{
var productionRecords = await _context.ProductionRecords
.Where(pr => pr.DeviceId == deviceId && pr.ProductionDate.Date == date.Date)
.ToListAsync();
if (productionRecords.Any())
{
var totalQuantity = productionRecords.Sum(pr => pr.Quantity);
var totalValidQuantity = productionRecords.Sum(pr => (int)(pr.Quantity * pr.QualityRate / 100));
return totalQuantity > 0 ? (decimal)totalValidQuantity / totalQuantity * 100 : 100;
}
return 100;
}
public async Task<bool> HasProductionDataAsync(int deviceId, DateTime date)
{
return await _context.ProductionRecords
.AnyAsync(pr => pr.DeviceId == deviceId && pr.ProductionDate.Date == date.Date);
}
}
public interface IProgramProductionSummaryRepository : IRepository<ProgramProductionSummary>
{
Task<ProgramProductionSummary> GetByDeviceProgramDateAsync(int deviceId, string ncProgram, DateTime date);
Task<IEnumerable<ProgramProductionSummary>> GetByDeviceAndDateAsync(int deviceId, DateTime date);
Task<IEnumerable<ProgramProductionSummary>> GetByProgramAndDateRangeAsync(string ncProgram, DateTime startDate, DateTime endDate);
Task<int> GetTotalProductionAsync(int deviceId, DateTime date);
Task<decimal> GetOverallQualityRateAsync(int deviceId, DateTime date);
Task<bool> UpdateSummaryAsync(int deviceId, string ncProgram, DateTime date, int quantity, decimal qualityRate);
}
public class ProgramProductionSummaryRepository : Repository<ProgramProductionSummary>, IProgramProductionSummarySummaryRepository
{
private readonly CNCDbContext _context;
public ProgramProductionSummaryRepository(CNCDbContext context) : base(context)
{
_context = context;
}
public async Task<ProgramProductionSummary> GetByDeviceProgramDateAsync(int deviceId, string ncProgram, DateTime date)
{
return await _context.ProgramProductionSummary
.FirstOrDefaultAsync(pps =>
pps.DeviceId == deviceId &&
pps.NCProgram == ncProgram &&
pps.ProductionDate.Date == date.Date);
}
public async Task<IEnumerable<ProgramProductionSummary>> GetByDeviceAndDateAsync(int deviceId, DateTime date)
{
return await _context.ProgramProductionSummary
.Where(pps => pps.DeviceId == deviceId && pps.ProductionDate.Date == date.Date)
.OrderBy(pps => pps.NCProgram)
.ToListAsync();
}
public async Task<IEnumerable<ProgramProductionSummary>> GetByProgramAndDateRangeAsync(string ncProgram, DateTime startDate, DateTime endDate)
{
return await _context.ProgramProductionSummary
.Where(pps => pps.NCProgram == ncProgram &&
pps.ProductionDate >= startDate &&
pps.ProductionDate <= endDate)
.OrderBy(pps => pps.ProductionDate)
.ThenBy(pps => pps.DeviceId)
.ToListAsync();
}
public async Task<int> GetTotalProductionAsync(int deviceId, DateTime date)
{
var summaries = await GetByDeviceAndDateAsync(deviceId, date);
return summaries.Sum(s => s.TotalQuantity);
}
public async Task<decimal> GetOverallQualityRateAsync(int deviceId, DateTime date)
{
var summaries = await GetByDeviceAndDateAsync(deviceId, date);
if (summaries.Any())
{
var totalQuantity = summaries.Sum(s => s.TotalQuantity);
var totalValidQuantity = summaries.Sum(s => s.ValidQuantity);
return totalQuantity > 0 ? (decimal)totalValidQuantity / totalQuantity * 100 : 100;
}
return 100;
}
public async Task<bool> UpdateSummaryAsync(int deviceId, string ncProgram, DateTime date, int quantity, decimal qualityRate)
{
var summary = await GetByDeviceProgramDateAsync(deviceId, ncProgram, date);
if (summary != null)
{
summary.TotalQuantity += quantity;
summary.ValidQuantity = (int)(summary.TotalQuantity * qualityRate / 100);
summary.InvalidQuantity = summary.TotalQuantity - summary.ValidQuantity;
summary.QualityRate = qualityRate;
summary.UpdatedAt = DateTime.Now;
Update(summary);
}
else
{
summary = new ProgramProductionSummary
{
DeviceId = deviceId,
NCProgram = ncProgram,
ProductionDate = date,
TotalQuantity = quantity,
ValidQuantity = (int)(quantity * qualityRate / 100),
InvalidQuantity = quantity - (int)(quantity * qualityRate / 100),
QualityRate = qualityRate
};
await AddAsync(summary);
}
await SaveAsync();
return true;
}
}
}