orderpochin

This commit is contained in:
-SSS- 2025-04-22 11:40:40 +03:00
parent 69fe9ea9bc
commit 50e56467d7
32 changed files with 113 additions and 105 deletions

View File

@ -2,7 +2,7 @@ using System;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using demo_hard.Models;
using demo_hard.Model;
namespace demo_hard;

View File

@ -6,7 +6,7 @@ using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Media.Imaging;
using demo_hard.Models;
using demo_hard.Model;
namespace demo_hard;

View File

@ -7,7 +7,7 @@ using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Media;
using Avalonia.Interactivity;
using demo_hard.Models;
using demo_hard.Model;
namespace demo_hard;

View File

@ -2,7 +2,7 @@ using System;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using demo_hard.Models;
using demo_hard.Model;
using Tmds.DBus.Protocol;
namespace demo_hard;

View File

@ -5,7 +5,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using demo_hard.Models;
using demo_hard.Model;
#nullable disable

View File

@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using demo_hard.Models;
using demo_hard.Model;
#nullable disable

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class Client
{

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class Employee
{

View File

@ -1,19 +1,23 @@
using System;
using System.Collections.Generic;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class Order
{
public int OrderId { get; set; }
public string? OrderCode { get; set; }
public TimeOnly? Time { get; set; }
public DateOnly? EndDate { get; set; }
public int? RentTime { get; set; }
public DateOnly? StartDate { get; set; }
public int? ClientId { get; set; }
public string? Status { get; set; }
public virtual ICollection<OrderService> OrderServices { get; set; } = new List<OrderService>();
public virtual ICollection<Service> Services { get; set; } = new List<Service>();
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
namespace demo_hard.Model;
public partial class OrderService
{
public int OrderId { get; set; }
public int ServiceId { get; set; }
public int RentTime { get; set; }
public virtual Order Order { get; set; } = null!;
public virtual Service Service { get; set; } = null!;
}

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class Role
{

View File

@ -1,14 +1,17 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class Service
{
public string? ServiceName { get; set; }
public int? CostPerHour { get; set; }
public string ServiceCode { get; set; } = null!;
public int ServiceId { get; set; }
public virtual ICollection<OrderService> OrderServices { get; set; } = new List<OrderService>();
public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
}
}

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace demo_hard.Models;
namespace demo_hard.Model;
public partial class User15Context : DbContext
{
@ -16,26 +16,29 @@ public partial class User15Context : DbContext
}
public virtual DbSet<Client> Clients { get; set; }
public virtual DbSet<Employee> Employees { get; set; }
public virtual DbSet<Order> Orders { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<Service> Services { get; set; }
public virtual DbSet<OrderService> OrderServices { get; set; }
public virtual DbSet<Role> Roles { get; set; }
public virtual DbSet<Service> Services { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;USERNAME=user15;DATABASE=user15;Password=3XkvwMOb");
}
}
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;USERNAME=user15;DATABASE=user15;Password=3XkvwMOb");
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>(entity =>
{
entity.HasKey(e => e.ClientId).HasName("client_pk");
entity.ToTable("client");
entity.HasIndex(e => e.ClientCode, "client_unique").IsUnique();
entity.Property(e => e.ClientId)
@ -64,6 +67,7 @@ public partial class User15Context : DbContext
modelBuilder.Entity<Employee>(entity =>
{
entity.HasKey(e => e.Id).HasName("employees_pk");
entity.ToTable("employees");
entity.Property(e => e.Id)
@ -93,6 +97,7 @@ public partial class User15Context : DbContext
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(e => e.OrderId).HasName("orders_pk");
entity.ToTable("orders");
entity.Property(e => e.OrderId)
@ -103,21 +108,36 @@ public partial class User15Context : DbContext
entity.Property(e => e.OrderCode)
.HasColumnType("character varying")
.HasColumnName("order_code");
entity.Property(e => e.RentTime).HasColumnName("rent_time");
entity.Property(e => e.StartDate).HasColumnName("start_date");
entity.Property(e => e.Status)
.HasColumnType("character varying")
.HasColumnName("status");
entity.Property(e => e.Time).HasColumnName("time");
});
entity.HasMany(o => o.OrderServices)
.WithOne(os => os.Order)
.HasForeignKey(os => os.OrderId);
modelBuilder.Entity<OrderService>(entity =>
{
entity.HasKey(e => new { e.OrderId, e.ServiceId });
entity.ToTable("order_services");
entity.HasIndex(e => e.ServiceId, "IX_order_services_service_id");
entity.Property(e => e.OrderId).HasColumnName("order_id");
entity.Property(e => e.ServiceId).HasColumnName("service_id");
entity.Property(e => e.RentTime).HasColumnName("rent_time");
entity.HasOne(d => d.Order).WithMany(p => p.OrderServices).HasForeignKey(d => d.OrderId);
entity.HasOne(d => d.Service).WithMany(p => p.OrderServices).HasForeignKey(d => d.ServiceId);
});
modelBuilder.Entity<Role>(entity =>
{
entity.HasNoKey().ToTable("roles");
entity
.HasNoKey()
.ToTable("roles");
entity.Property(e => e.RoleId).HasColumnName("role_id");
entity.Property(e => e.RoleName)
.HasColumnType("character varying")
@ -127,7 +147,9 @@ public partial class User15Context : DbContext
modelBuilder.Entity<Service>(entity =>
{
entity.HasKey(e => e.ServiceId).HasName("services_pk");
entity.ToTable("services");
entity.HasIndex(e => e.ServiceCode, "services_unique").IsUnique();
entity.Property(e => e.ServiceId)
@ -140,34 +162,10 @@ public partial class User15Context : DbContext
entity.Property(e => e.ServiceName)
.HasColumnType("character varying")
.HasColumnName("service_name");
entity.HasMany(s => s.OrderServices)
.WithOne(os => os.Service)
.HasForeignKey(os => os.ServiceId);
});
modelBuilder.Entity<OrderService>(entity =>
{
entity.HasKey(os => new { os.OrderId, os.ServiceId });
entity.ToTable("order_services");
entity.Property(os => os.OrderId).HasColumnName("order_id");
entity.Property(os => os.ServiceId).HasColumnName("service_id");
entity.Property(os => os.RentTime).HasColumnName("rent_time");
entity.HasOne(os => os.Order)
.WithMany(o => o.OrderServices)
.HasForeignKey(os => os.OrderId)
.HasConstraintName("order_services_order_id_fkey");
entity.HasOne(os => os.Service)
.WithMany(s => s.OrderServices)
.HasForeignKey(os => os.ServiceId)
.HasConstraintName("order_services_service_id_fkey");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}

View File

@ -1,12 +0,0 @@
namespace demo_hard.Models;
public class OrderService
{
public int OrderId { get; set; }
public int ServiceId { get; set; }
public int RentTime { get; set; }
public virtual Order Order { get; set; }
public virtual Service Service { get; set; }
}

View File

@ -1,6 +1,7 @@
using System.Collections.Generic;
using Avalonia.Controls;
using Avalonia.Interactivity;
using demo_hard.Models;
using demo_hard.Model;
using System.Linq;
using Microsoft.EntityFrameworkCore;
@ -8,10 +9,10 @@ namespace demo_hard;
public partial class Order : Window
{
private readonly Models.Order _order;
private readonly Model.Order _order;
private readonly User15Context _db = new();
public Order(Models.Order order)
public Order(Model.Order order)
{
InitializeComponent();
_order = order;
@ -21,42 +22,32 @@ public partial class Order : Window
private void LoadOrderData()
{
var client = _db.Clients.FirstOrDefault(c => c.ClientId == _order.ClientId);
var orderServices = _db.OrderServices
.Include(os => os.Service)
.Where(os => os.OrderId == _order.OrderId)
.ToList();
OrderNumber.Text = _order.OrderId.ToString();
ClientName.Text = client?.Fio ?? "Не указан";
OrderDate.Text = $"{_order.StartDate} {_order.Time}";
// Парсим информацию об услугах из OrderCode
var servicesInfo = ParseServicesInfo(_order);
var servicesInfo = CalculateServicesInfo(orderServices);
TotalCost.Text = servicesInfo.totalCost.ToString("C");
StatusText.Text = _order.Status ?? "Новая";
}
private (decimal totalCost, string servicesText) ParseServicesInfo(Models.Order order)
private (decimal totalCost, string servicesText) CalculateServicesInfo(List<OrderService> orderServices)
{
decimal total = 0;
string info = "";
if (!string.IsNullOrEmpty(order.OrderCode))
foreach (var os in orderServices)
{
var parts = order.OrderCode.Split(';');
foreach (var part in parts)
if (os.Service != null)
{
if (string.IsNullOrEmpty(part)) continue;
var serviceParts = part.Split(':');
if (serviceParts.Length == 2 &&
int.TryParse(serviceParts[0], out var serviceId) &&
int.TryParse(serviceParts[1], out var rentTime))
{
var service = _db.Services.Find(serviceId);
if (service != null)
{
var cost = (service.CostPerHour ?? 0) * rentTime;
total += cost;
info += $"{service.ServiceName} - {rentTime} ч ({cost:C})\n";
}
}
decimal cost = (os.Service.CostPerHour ?? 0) * (os.RentTime / 60m);
total += cost;
info += $"{os.Service.ServiceName} - {os.RentTime} мин ({cost:C})\n";
}
}
@ -65,7 +56,11 @@ public partial class Order : Window
private void PrintBarcode_Click(object sender, RoutedEventArgs e)
{
new BarcodeWindow(_order.OrderId, _order.RentTime ?? 1).Show();
int rentTime = _db.OrderServices
.Where(os => os.OrderId == _order.OrderId)
.Max(os => os.RentTime);
new BarcodeWindow(_order.OrderId, rentTime).Show();
Close();
}

View File

@ -3,7 +3,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using demo_hard.Models;
using demo_hard.Model;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
using System.IO;
@ -178,13 +178,12 @@ public partial class SallerWindow : Window, INotifyPropertyChanged, IReactiveObj
try
{
string orderNumber = $"{new Random().Next(10000000, 99999999)}/{DateTime.Now:dd.MM.yyyy}";
Models.Order newOrder = new Models.Order()
Model.Order newOrder = new Model.Order()
{
ClientId = SelectedClient.ClientId,
Time = TimeOnly.FromDateTime(DateTime.Now),
StartDate = DateOnly.FromDateTime(DateTime.Now),
Status = "Новая",
RentTime = SelectedServices.Max(service => service.RentTime),
OrderCode = orderNumber
};
@ -203,7 +202,11 @@ public partial class SallerWindow : Window, INotifyPropertyChanged, IReactiveObj
await _databaseContext.SaveChangesAsync();
GenerateOrderPdfDocument(newOrder);
new BarcodeWindow(newOrder.OrderId, newOrder.RentTime ?? 30).Show();
// Получаем максимальное время аренды из выбранных услуг
int maxRentTime = SelectedServices.Max(s => s.RentTime);
new BarcodeWindow(newOrder.OrderId, maxRentTime).Show();
Close();
}
catch (Exception exception)
@ -212,7 +215,7 @@ public partial class SallerWindow : Window, INotifyPropertyChanged, IReactiveObj
}
}
private void GenerateOrderPdfDocument(Models.Order order)
private void GenerateOrderPdfDocument(Model.Order order)
{
string documentsDirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string pdfFilePath = Path.Combine(documentsDirectoryPath, $"Заказ_{order.OrderCode.Replace("/", "_")}.pdf");

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("demo_hard")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+156a9ed6bb53a76169eafb82e995c01d89a56817")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+69fe9ea9bc91472e247d6c5d565068a4efb0a683")]
[assembly: System.Reflection.AssemblyProductAttribute("demo_hard")]
[assembly: System.Reflection.AssemblyTitleAttribute("demo_hard")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
812ad4f6e1371c563aeffa5b4bf990438482d87b5551f2810d09b0e13e09da16
b558e1c40e2637b7a5437875d3c594c1eda934e9d40f49c41e49dbf89f9df5f0

View File

@ -1 +1 @@
0bbac13ec88c23487d9db86ba7974427e4532f7c392dba1fdea7e096e6b18f90
8a3ffaadb0909b81ef510f10eee5bfc4b36ff8994bac3e39e3d64c1f02f66b23

View File

@ -1 +1 @@
17452753038636502
17453098515261366

View File

@ -1 +1 @@
17452753050856052
17453098574157962