RobotSubTask.cs 3.31 KB
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Rcs.Domain.Entities.DomainEvents.RobotSubTask;

namespace Rcs.Domain.Entities;

/// <summary>
/// 子任务实体类
/// @author zzy
/// </summary>
[Table("robot_sub_tasks")]
public partial class RobotSubTask : Entity
{
    /// <summary>
    /// 子任务ID
    /// </summary>
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column("sub_task_id")]
    public Guid SubTaskId { get; set; }

    /// <summary>
    /// 父任务ID(外键)
    /// </summary>
    [Required]
    [Column("task_id")]
    public Guid TaskId { get; set; }

    /// <summary>
    /// 机器人ID(外键)
    /// </summary>
    [Column("robot_id")]
    public Guid? RobotId { get; set; }

    /// <summary>
    /// 起点NodeID(外键)
    /// </summary>
    [Required]
    [Column("begin_node_id")]
    public Guid BeginNodeId { get; set; }

    /// <summary>
    /// 终点NodeID(外键)
    /// </summary>
    [Required]
    [Column("end_node_id")]
    public Guid EndNodeId { get; set; }

    /// <summary>
    /// 执行顺序
    /// </summary>
    [Required]
    [Column("sequence")]
    public int Sequence { get; set; }

    /// <summary>
    /// 子任务状态
    /// </summary>
    [Column("status")]
    public TaskStatus Status { get; set; }

    /// <summary>
    /// 执行次数(用于VDA5050协议OrderUpdateId)
    /// 每次发送订单时递增,记录该子任务已下发的次数
    /// @author zzy
    /// </summary>
    [Required]
    [Column("execution_count")]
    public int ExecutionCount { get; set; } = 0;

    /// <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 外键 => 导航属性,ManyToOne/OneToOne

    /// <summary>
    /// 父任务导航属性
    /// </summary>
    [ForeignKey(nameof(TaskId))]
    public virtual RobotTask? Task { get; set; }

    /// <summary>
    /// 机器人导航属性
    /// </summary>
    [ForeignKey(nameof(RobotId))]
    public virtual Robot? Robot { get; set; }

    /// <summary>
    /// 起点Node导航属性
    /// </summary>
    [ForeignKey(nameof(BeginNodeId))]
    public virtual MapNode? BeginNode { get; set; }

    /// <summary>
    /// 终点Node导航属性
    /// </summary>
    [ForeignKey(nameof(EndNodeId))]
    public virtual MapNode? EndNode { get; set; }

    #endregion
    /// <summary>
    /// 跳过子任务
    /// @author zzy
    /// </summary>
    public void Skip()
    {
        Status = TaskStatus.Completed;
        UpdatedAt = DateTime.Now;
        AddDomainEvent(new SubTaskSkippedDomainEvent(SubTaskId, TaskId));
    }

    /// <summary>
    /// 重新执行子任务
    /// @author zzy
    /// </summary>
    public void Retry()
    {
        Status = TaskStatus.Pending;
        UpdatedAt = DateTime.Now;
        AddDomainEvent(new SubTaskRetryDomainEvent(SubTaskId, TaskId));
    }
    /// <summary>
    /// 执行子任务
    /// @author zzy
    /// </summary>
    public void Start()
    {
        Status = TaskStatus.InProgress;
        UpdatedAt = DateTime.Now;
    }
}