using DongfangHydro.Dashboard.Api.Domain; using Microsoft.EntityFrameworkCore; namespace DongfangHydro.Dashboard.Api.Data; public sealed class DashboardDbContext(DbContextOptions options) : DbContext(options) { public DbSet ProductionOrders => Set(); public DbSet ProductionNodes => Set(); public DbSet ProductionTrendPoints => Set(); public DbSet RiskEvents => Set(); public DbSet ProductionLines => Set(); public DbSet Partners => Set(); public DbSet MaterialQuotas => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.ToTable("ProductionOrders"); entity.HasKey(order => order.Id); entity.HasIndex(order => order.Code); entity.HasIndex(order => new { order.Status, order.RiskLevel, order.PlannedEnd }); entity.Property(order => order.Code).HasMaxLength(40); entity.Property(order => order.ProductName).HasMaxLength(200); entity.Property(order => order.DataSource).HasMaxLength(32); entity.Property(order => order.SourceDocumentCode).HasMaxLength(80); entity.Property(order => order.ProjectName).HasMaxLength(200); entity.Property(order => order.DrawingProductName).HasMaxLength(240); entity.Property(order => order.SourceFileName).HasMaxLength(260); entity.Property(order => order.SourceFileHash).HasMaxLength(64); entity.HasIndex(order => order.SourceDocumentCode) .IsUnique() .HasFilter("[SourceDocumentCode] <> ''"); entity.Property(order => order.Status).HasMaxLength(32); entity.Property(order => order.RiskLevel).HasMaxLength(32); entity.Property(order => order.LineName).HasMaxLength(80); entity.Property(order => order.Owner).HasMaxLength(80); entity.Property(order => order.ThumbnailKey).HasMaxLength(40); entity.Property(order => order.RowVersion).IsRowVersion(); entity.HasOne() .WithMany() .HasForeignKey(order => order.LineId) .OnDelete(DeleteBehavior.SetNull); }); modelBuilder.Entity(entity => { entity.ToTable("ProductionNodes"); entity.HasKey(node => node.Id); entity.HasIndex(node => new { node.OrderId, node.ParentNodeId, node.SortOrder }); entity.HasIndex(node => new { node.OrderId, node.NodeType, node.RiskLevel, node.Status }); entity.Property(node => node.Code).HasMaxLength(60); entity.Property(node => node.OperationCode).HasMaxLength(60); entity.Property(node => node.MaterialCode).HasMaxLength(80); entity.Property(node => node.Name).HasMaxLength(240); entity.Property(node => node.SourceSequence).HasMaxLength(40); entity.Property(node => node.Specification).HasMaxLength(240); entity.Property(node => node.Material).HasMaxLength(120); entity.Property(node => node.UnitWeight).HasPrecision(18, 4); entity.Property(node => node.TotalWeight).HasPrecision(18, 4); entity.Property(node => node.UnitWeightText).HasMaxLength(80); entity.Property(node => node.TotalWeightText).HasMaxLength(80); entity.Property(node => node.BomQuantity).HasPrecision(18, 4); entity.Property(node => node.BomQuantityText).HasMaxLength(80); entity.Property(node => node.Remark).HasMaxLength(500); entity.Property(node => node.SourceSheet).HasMaxLength(40); entity.Property(node => node.NodeType).HasMaxLength(32); entity.Property(node => node.SupplyType).HasMaxLength(32); entity.Property(node => node.Status).HasMaxLength(32); entity.Property(node => node.RiskLevel).HasMaxLength(32); entity.Property(node => node.DelayReason).HasMaxLength(500); entity.Property(node => node.Owner).HasMaxLength(100); entity.Property(node => node.Vendor).HasMaxLength(120); entity.Property(node => node.StationName).HasMaxLength(120); entity.Property(node => node.VisualKey).HasMaxLength(40); entity.Property(node => node.RowVersion).IsRowVersion(); entity.HasAlternateKey(node => new { node.OrderId, node.Id }); entity.HasOne() .WithMany() .HasForeignKey(node => node.OrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne() .WithMany() .HasForeignKey(node => new { node.OrderId, node.ParentNodeId }) .HasPrincipalKey(node => new { node.OrderId, node.Id }) .OnDelete(DeleteBehavior.Restrict); }); modelBuilder.Entity(entity => { entity.ToTable("ProductionTrendPoints"); entity.HasKey(point => point.Id); entity.HasIndex(point => new { point.OrderId, point.SampleTime }).IsDescending(false, true); entity.HasOne() .WithMany() .HasForeignKey(point => point.OrderId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.ToTable("RiskEvents"); entity.HasKey(riskEvent => riskEvent.Id); entity.HasIndex(riskEvent => new { riskEvent.OrderId, riskEvent.OccurredAt }).IsDescending(false, true); entity.Property(riskEvent => riskEvent.OrderCode).HasMaxLength(40); entity.Property(riskEvent => riskEvent.NodeName).HasMaxLength(240); entity.Property(riskEvent => riskEvent.RiskLevel).HasMaxLength(32); entity.Property(riskEvent => riskEvent.Message).HasMaxLength(500); entity.Property(riskEvent => riskEvent.HandlingStatus).HasMaxLength(32); entity.HasOne() .WithMany() .HasForeignKey(riskEvent => riskEvent.OrderId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne() .WithMany() .HasForeignKey(riskEvent => new { riskEvent.OrderId, riskEvent.NodeId }) .HasPrincipalKey(node => new { node.OrderId, node.Id }) .OnDelete(DeleteBehavior.NoAction); }); modelBuilder.Entity(entity => { entity.ToTable("MaterialQuotas"); entity.HasKey(item => item.Id); entity.HasIndex(item => new { item.OrderId, item.SourceSheet, item.SourceRow }).IsUnique(); entity.HasIndex(item => new { item.OrderId, item.Category, item.MaterialCode }); entity.Property(item => item.Category).HasMaxLength(80); entity.Property(item => item.SourceSequence).HasMaxLength(40); entity.Property(item => item.MaterialCode).HasMaxLength(80); entity.Property(item => item.MaterialName).HasMaxLength(240); entity.Property(item => item.Specification).HasMaxLength(240); entity.Property(item => item.Unit).HasMaxLength(24); entity.Property(item => item.Quantity).HasPrecision(18, 4); entity.Property(item => item.NetWeight).HasPrecision(18, 4); entity.Property(item => item.ConsumptionQuota).HasPrecision(18, 4); entity.Property(item => item.QuantityText).HasMaxLength(80); entity.Property(item => item.NetWeightText).HasMaxLength(80); entity.Property(item => item.ConsumptionQuotaText).HasMaxLength(80); entity.Property(item => item.Brand).HasMaxLength(120); entity.Property(item => item.Remark).HasMaxLength(500); entity.Property(item => item.SourceSheet).HasMaxLength(40); entity.HasOne() .WithMany() .HasForeignKey(item => item.OrderId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(entity => { entity.ToTable("ProductionLines"); entity.HasKey(line => line.Id); entity.HasIndex(line => line.Code).IsUnique(); entity.Property(line => line.Code).HasMaxLength(40); entity.Property(line => line.Name).HasMaxLength(80); entity.Property(line => line.Owner).HasMaxLength(80); }); modelBuilder.Entity(entity => { entity.ToTable("Partners"); entity.HasKey(partner => partner.Id); entity.HasIndex(partner => partner.Code).IsUnique(); entity.Property(partner => partner.Code).HasMaxLength(40); entity.Property(partner => partner.Name).HasMaxLength(120); entity.Property(partner => partner.PartnerType).HasMaxLength(32); entity.Property(partner => partner.ContactName).HasMaxLength(80); entity.Property(partner => partner.ContactPhone).HasMaxLength(32); }); } }