ChargingPileConfiguration.cs 4.81 KB
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

namespace Rcs.Infrastructure.DB.Configuration.Domain
{
    /// <summary>
    /// 充电桩 EF Core 配置。
    /// </summary>
    public class ChargingPileConfiguration : IEntityTypeConfiguration<ChargingPile>
    {
        public void Configure(EntityTypeBuilder<ChargingPile> builder)
        {
            builder.ToTable("charging_piles");

            builder.HasKey(e => e.PileId);

            builder.Property(e => e.PileId)
                .HasColumnName("pile_id")
                .ValueGeneratedNever();

            builder.Property(e => e.PileCode)
                .HasColumnName("pile_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.PileName)
                .HasColumnName("pile_name")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.IpAddress)
                .HasColumnName("ip_address")
                .HasMaxLength(45)
                .HasDefaultValue(string.Empty);

            builder.Property(e => e.Port)
                .HasColumnName("port")
                .HasDefaultValue(0);

            builder.Property(e => e.MinChargingMinutes)
                .HasColumnName("min_charging_minutes")
                .HasDefaultValue(10);

            builder.Property(e => e.FullChargeThreshold)
                .HasColumnName("full_charge_threshold")
                .HasPrecision(5, 2)
                .HasDefaultValue(90m);

            builder.Property(e => e.SupportedRobotModels)
                .HasColumnName("supported_robot_models")
                .HasColumnType("jsonb")
                .HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<string>>(v, (JsonSerializerOptions?)null) ?? new List<string>());

            builder.Property(e => e.BoundRobotIds)
                .HasColumnName("bound_robot_ids")
                .HasColumnType("jsonb")
                .HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<Guid>>(v, (JsonSerializerOptions?)null) ?? new List<Guid>());

            builder.Property(e => e.CurrentChargingRobotId)
                .HasColumnName("current_charging_robot_id");

            builder.Property(e => e.MapNodeId)
                .HasColumnName("map_node_id");

            builder.Property(e => e.AutoStartThreshold)
                .HasColumnName("auto_start_threshold")
                .HasPrecision(5, 2)
                .HasDefaultValue(30m);

            builder.Property(e => e.ResumeThreshold)
                .HasColumnName("resume_threshold")
                .HasPrecision(5, 2)
                .HasDefaultValue(60m);

            builder.Property(e => e.MaxChargingMinutes)
                .HasColumnName("max_charging_minutes")
                .HasDefaultValue(120);

            builder.Property(e => e.QueueTimeoutMinutes)
                .HasColumnName("queue_timeout_minutes")
                .HasDefaultValue(30);

            builder.Property(e => e.Priority)
                .HasColumnName("priority")
                .HasDefaultValue(100);

            builder.Property(e => e.AllowTaskInterrupt)
                .HasColumnName("allow_task_interrupt")
                .HasDefaultValue(true);

            builder.Property(e => e.IsActive)
                .HasColumnName("is_active")
                .HasDefaultValue(true);

            builder.Property(e => e.CreatedAt)
                .HasColumnName("created_at")
                .HasColumnType("timestamp without time zone");

            builder.Property(e => e.UpdatedAt)
                .HasColumnName("updated_at")
                .HasColumnType("timestamp without time zone");

            builder.HasIndex(e => e.PileCode)
                .HasDatabaseName("idx_charging_pile_code")
                .IsUnique();

            builder.HasIndex(e => new { e.IpAddress, e.Port })
                .HasDatabaseName("idx_charging_pile_ip_port")
                .IsUnique();

            builder.HasIndex(e => e.MapNodeId)
                .HasDatabaseName("idx_charging_pile_map_node_id");

            builder.HasIndex(e => e.CurrentChargingRobotId)
                .HasDatabaseName("idx_charging_pile_current_charging_robot_id");

            builder.HasOne(e => e.MapNode)
                .WithMany()
                .HasForeignKey(e => e.MapNodeId)
                .OnDelete(DeleteBehavior.SetNull);

            builder.HasOne(e => e.CurrentChargingRobot)
                .WithMany()
                .HasForeignKey(e => e.CurrentChargingRobotId)
                .OnDelete(DeleteBehavior.SetNull);
        }
    }
}