Почти доделал
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
using ComputerStoreContracts.BindingModels;
|
||||
using ComputerStoreContracts.StoragesContracts;
|
||||
using ComputerStoreContracts.ViewModels;
|
||||
using ComputerStoreDatabase.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ComputerStoreDatabase.Implementations;
|
||||
|
||||
public class OrderStorageImplementation : IOrderStorageContract
|
||||
{
|
||||
private readonly ComputerStoreDbContext _context;
|
||||
|
||||
public OrderStorageImplementation(ComputerStoreDbContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public List<OrderViewModel> GetFullList() => _context.Orders
|
||||
.Select(o => new OrderViewModel
|
||||
{
|
||||
Id = o.Id,
|
||||
CreatedAt = o.CreatedAt,
|
||||
Status = o.Status,
|
||||
UserId = o.UserID,
|
||||
RequestIds = o.OrderRequests.Select(or => or.RequestId).ToList(),
|
||||
BatchIds = o.OrderBatchesLink.Select(ob => ob.OrderBatchId).ToList()
|
||||
}).ToList();
|
||||
|
||||
public OrderViewModel? GetElement(int id) => _context.Orders
|
||||
.Where(o => o.Id == id)
|
||||
.Select(o => new OrderViewModel
|
||||
{
|
||||
Id = o.Id,
|
||||
CreatedAt = o.CreatedAt,
|
||||
Status = o.Status,
|
||||
UserId = o.UserID,
|
||||
RequestIds = o.OrderRequests.Select(or => or.RequestId).ToList(),
|
||||
BatchIds = o.OrderBatchesLink.Select(ob => ob.OrderBatchId).ToList()
|
||||
}).FirstOrDefault();
|
||||
|
||||
public void Create(OrderCreateBindingModel model)
|
||||
{
|
||||
var order = new Order
|
||||
{
|
||||
Status = model.Status,
|
||||
UserID = model.UserId,
|
||||
OrderRequests = model.RequestIds.Select(r => new OrderRequest
|
||||
{
|
||||
OrderId = model.UserId, // будет обновлено после SaveChanges
|
||||
RequestId = r
|
||||
}).ToList(),
|
||||
OrderBatchesLink = model.BatchIds.Select(b => new OrderOrderBatch
|
||||
{
|
||||
OrderId = model.UserId, // будет обновлено после SaveChanges
|
||||
OrderBatchId = b
|
||||
}).ToList(),
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
};
|
||||
_context.Orders.Add(order);
|
||||
_context.SaveChanges();
|
||||
}
|
||||
|
||||
public void Update(OrderCreateBindingModel model)
|
||||
{
|
||||
var order = _context.Orders
|
||||
.Include(o => o.OrderRequests)
|
||||
.Include(o => o.OrderBatchesLink)
|
||||
.FirstOrDefault(o => o.Id == model.Id);
|
||||
|
||||
if (order == null) throw new Exception("Order not found");
|
||||
|
||||
order.Status = model.Status;
|
||||
order.UserID = model.UserId;
|
||||
|
||||
// Обновление связей
|
||||
var newRequests = model.RequestIds.Except(order.OrderRequests.Select(r => r.RequestId)).ToList();
|
||||
var removedRequests = order.OrderRequests.Where(r => !model.RequestIds.Contains(r.RequestId)).ToList();
|
||||
|
||||
foreach (var id in newRequests)
|
||||
order.OrderRequests.Add(new OrderRequest { OrderId = model.Id, RequestId = id });
|
||||
|
||||
foreach (var req in removedRequests)
|
||||
_context.OrderRequests.Remove(req);
|
||||
|
||||
var newBatches = model.BatchIds.Except(order.OrderBatchesLink.Select(b => b.OrderBatchId)).ToList();
|
||||
var removedBatches = order.OrderBatchesLink.Where(b => !model.BatchIds.Contains(b.OrderBatchId)).ToList();
|
||||
|
||||
foreach (var id in newBatches)
|
||||
order.OrderBatchesLink.Add(new OrderOrderBatch { OrderId = model.Id, OrderBatchId = id });
|
||||
|
||||
foreach (var batch in removedBatches)
|
||||
_context.OrderOrderBatches.Remove(batch);
|
||||
|
||||
_context.SaveChanges();
|
||||
}
|
||||
|
||||
public void Delete(int id)
|
||||
{
|
||||
var order = _context.Orders.Find(id);
|
||||
if (order != null)
|
||||
{
|
||||
_context.Orders.Remove(order);
|
||||
_context.SaveChanges();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<AssemblyViewModel> GetAssembliesByOrders(List<int> orderIds) => _context.Requests
|
||||
.Where(r => orderIds.Contains(r.Id) && r.AssemblyId.HasValue)
|
||||
.Select(r => new AssemblyViewModel
|
||||
{
|
||||
Id = r.Assembly!.Id,
|
||||
Name = r.Assembly.Name,
|
||||
Description = r.Assembly.Description,
|
||||
UserId = r.Assembly.UserId
|
||||
}).ToList();
|
||||
|
||||
public List<OrderReportViewModel> GetOrdersWithDetailsByDateRange(
|
||||
int userId,
|
||||
DateTime start,
|
||||
DateTime end)
|
||||
{
|
||||
return _context.Orders
|
||||
.Where(o => o.UserID == userId && o.CreatedAt >= start.ToUniversalTime() && o.CreatedAt <= end.ToUniversalTime())
|
||||
.SelectMany(o => o.OrderRequests.Select(or => new OrderReportViewModel
|
||||
{
|
||||
OrderId = o.Id,
|
||||
OrderStatus = o.Status,
|
||||
CreatedAt = o.CreatedAt,
|
||||
|
||||
RequestId = or.RequestId,
|
||||
RequestDescription = or.Request.Description,
|
||||
|
||||
ProductId = o.OrderBatchesLink!= null
|
||||
? _context.OrderOrderBatches
|
||||
.Where(ca => ca.OrderId == o.Id)
|
||||
.Select(ca => ca.OrderBatch)
|
||||
.Select(c => c.Product)
|
||||
.Select(pc => pc.Id)
|
||||
.FirstOrDefault()
|
||||
: 0,
|
||||
|
||||
ProductName = o.OrderBatchesLink != null
|
||||
? _context.OrderOrderBatches
|
||||
.Where(ca => ca.OrderId == o.Id)
|
||||
.Select(ca => ca.OrderBatch)
|
||||
.Select(c => c.Product)
|
||||
.Select(pc => pc.Name)
|
||||
.FirstOrDefault() ?? "N/A"
|
||||
: "N/A",
|
||||
|
||||
UserId = o.UserID,
|
||||
UserFIO = o.User.FIO
|
||||
}))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user