RobotCacheLocation.cs 5.17 KB
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Rcs.Domain.Entities;

/// <summary>
/// Robot缓存储位实体(多储位CTU)
/// </summary>
[Table("robot_cache_locations")]
public class RobotCacheLocation : Entity
{
    /// <summary>
    /// 主键ID
    /// </summary>
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("id")]
    public Guid CacheLocationId { get; set; }

    /// <summary>
    /// RobotId(外键,一对一关系)
    /// </summary>
    [Required]
    [Column("robot_id")]
    public Guid RobotId { get; set; }

    /// <summary>
    /// 储位编码
    /// </summary>
    [Required]
    [Column("location_code")]
    [MaxLength(100)]
    public string LocationCode { get; set; }

    /// <summary>
    /// 储位排(排数)
    /// </summary>
    [Required]
    [Column("row")]
    public int Row { get; set; }

    /// <summary>
    /// 储位列(列数)
    /// </summary>
    [Required]
    [Column("column")]
    public int Column { get; set; }

    /// <summary>
    /// 储位层(层数)
    /// </summary>
    [Required]
    [Column("level")]
    public int Level { get; set; }

    /// <summary>
    /// 容器ID
    /// </summary>
    [Column("container_id")]
    [MaxLength(100)]
    public string? ContainerId { get; set; }

    /// <summary>
    /// 物料编码
    /// </summary>
    [Column("material_code")]
    [MaxLength(100)]
    public string? MaterialCode { get; set; }

    /// <summary>
    /// 物料名称
    /// </summary>
    [Column("material_name")]
    [MaxLength(200)]
    public string? MaterialName { get; set; }

    /// <summary>
    /// 数量
    /// </summary>
    [Column("quantity")]
    public double? Quantity { get; set; }

    /// <summary>
    /// 重量(kg)
    /// </summary>
    [Column("weight")]
    public double? Weight { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    [Column("remark")]
    [MaxLength(500)]
    public string? Remark { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    [Column("created_at", TypeName = "timestamp")]
    public DateTime? CreatedAt { get; set; }

    /// <summary>
    /// 更新时间
    /// </summary>
    [Column("updated_at", TypeName = "timestamp")]
    public DateTime? UpdatedAt { get; set; }

    #region 导航属性

    /// <summary>
    /// 关联的Robot(一对一)
    /// </summary>
    public virtual Robot? Robot { get; set; }

    #endregion

    #region 领域方法

    /// <summary>
    /// 创建新的缓存储位(工厂方法)
    /// </summary>
    /// <param name="robotId">机器人ID</param>
    /// <param name="locationCode">储位编码</param>
    /// <param name="row">储位排</param>
    /// <param name="column">储位列</param>
    /// <param name="level">储位层</param>
    /// <param name="remark">备注</param>
    /// <returns>新的缓存储位实例</returns>
    public static RobotCacheLocation Create(
        Guid robotId,
        string locationCode,
        int row,
        int column,
        int level,
        string? remark = null)
    {
        if (robotId == Guid.Empty)
            throw new ArgumentException("机器人ID不能为空", nameof(robotId));

        if (string.IsNullOrWhiteSpace(locationCode))
            throw new ArgumentException("储位编码不能为空", nameof(locationCode));

        if (row < 0)
            throw new ArgumentException("储位排必须大于或等于0", nameof(row));

        if (column < 0)
            throw new ArgumentException("储位列必须大于或等于0", nameof(column));

        if (level < 0)
            throw new ArgumentException("储位层必须大于或等于0", nameof(level));

        var cacheLocation = new RobotCacheLocation
        {
            CacheLocationId = Guid.NewGuid(),
            RobotId = robotId,
            LocationCode = locationCode,
            Row = row,
            Column = column,
            Level = level,
            Remark = remark,
            CreatedAt = DateTime.Now,
            UpdatedAt = DateTime.Now
        };

        return cacheLocation;
    }

    /// <summary>
    /// 更新储位信息
    /// </summary>
    /// <param name="locationCode">储位编码</param>
    /// <param name="row">储位排</param>
    /// <param name="column">储位列</param>
    /// <param name="level">储位层</param>
    /// <param name="remark">备注</param>
    public void UpdateInfo(string locationCode, int row, int column, int level, string? remark = null)
    {
        if (string.IsNullOrWhiteSpace(locationCode))
            throw new ArgumentException("储位编码不能为空", nameof(locationCode));

        if (row < 0)
            throw new ArgumentException("储位排必须大于或等于0", nameof(row));

        if (column < 0)
            throw new ArgumentException("储位列必须大于或等于0", nameof(column));

        if (level < 0)
            throw new ArgumentException("储位层必须大于或等于0", nameof(level));

        LocationCode = locationCode;
        Row = row;
        Column = column;
        Level = level;
        Remark = remark;
        UpdatedAt = DateTime.Now;
    }

    #endregion
}