节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
13.68 KiB
Stardust
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using XCode;
using XCode.Cache;
using XCode.Configuration;
using XCode.DataAccessLayer;

namespace Stardust.Data.Deployment;

/// <summary>流水线步骤。一次流水线运行中的单个步骤(Build/Upload/Deploy),记录每一步的执行节点、状态与消息</summary>
[Serializable]
[DataObject]
[Description("流水线步骤。一次流水线运行中的单个步骤(Build/Upload/Deploy),记录每一步的执行节点、状态与消息")]
[BindIndex("IX_AppPipelineStep_RunId_StepIndex", false, "RunId,StepIndex")]
[BindIndex("IX_AppPipelineStep_CommandId", false, "CommandId")]
[BindTable("AppPipelineStep", Description = "流水线步骤。一次流水线运行中的单个步骤(Build/Upload/Deploy),记录每一步的执行节点、状态与消息", ConnName = "Stardust", DbType = DatabaseType.None)]
public partial class AppPipelineStep
{
    #region 属性
    private Int32 _Id;
    /// <summary>编号</summary>
    [DisplayName("编号")]
    [Description("编号")]
    [DataObjectField(true, true, false, 0)]
    [BindColumn("Id", "编号", "")]
    public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } }

    private Int32 _RunId;
    /// <summary>运行。对应AppPipelineRun.Id</summary>
    [DisplayName("运行")]
    [Description("运行。对应AppPipelineRun.Id")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RunId", "运行。对应AppPipelineRun.Id", "")]
    public Int32 RunId { get => _RunId; set { if (OnPropertyChanging("RunId", value)) { _RunId = value; OnPropertyChanged("RunId"); } } }

    private String _StepType;
    /// <summary>步骤类型。Build/Upload/Deploy</summary>
    [DisplayName("步骤类型")]
    [Description("步骤类型。Build/Upload/Deploy")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("StepType", "步骤类型。Build/Upload/Deploy", "")]
    public String StepType { get => _StepType; set { if (OnPropertyChanging("StepType", value)) { _StepType = value; OnPropertyChanged("StepType"); } } }

    private Int32 _StepIndex;
    /// <summary>步骤序号。同一运行内从 0 开始递增</summary>
    [DisplayName("步骤序号")]
    [Description("步骤序号。同一运行内从 0 开始递增")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("StepIndex", "步骤序号。同一运行内从 0 开始递增", "")]
    public Int32 StepIndex { get => _StepIndex; set { if (OnPropertyChanging("StepIndex", value)) { _StepIndex = value; OnPropertyChanged("StepIndex"); } } }

    private Int32 _NodeId;
    /// <summary>节点。执行该步骤的节点</summary>
    [DisplayName("节点")]
    [Description("节点。执行该步骤的节点")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("NodeId", "节点。执行该步骤的节点", "")]
    public Int32 NodeId { get => _NodeId; set { if (OnPropertyChanging("NodeId", value)) { _NodeId = value; OnPropertyChanged("NodeId"); } } }

    private Int32 _CommandId;
    /// <summary>命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新</summary>
    [DisplayName("命令")]
    [Description("命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("CommandId", "命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新", "")]
    public Int32 CommandId { get => _CommandId; set { if (OnPropertyChanging("CommandId", value)) { _CommandId = value; OnPropertyChanged("CommandId"); } } }

    private String _Status;
    /// <summary>状态。Pending/Running/Success/Failed/Skipped</summary>
    [DisplayName("状态")]
    [Description("状态。Pending/Running/Success/Failed/Skipped")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("Status", "状态。Pending/Running/Success/Failed/Skipped", "")]
    public String Status { get => _Status; set { if (OnPropertyChanging("Status", value)) { _Status = value; OnPropertyChanged("Status"); } } }

    private String _Message;
    /// <summary>消息。步骤执行输出与失败原因</summary>
    [DisplayName("消息")]
    [Description("消息。步骤执行输出与失败原因")]
    [DataObjectField(false, false, true, 2000)]
    [BindColumn("Message", "消息。步骤执行输出与失败原因", "")]
    public String Message { get => _Message; set { if (OnPropertyChanging("Message", value)) { _Message = value; OnPropertyChanged("Message"); } } }

    private DateTime _StartedTime;
    /// <summary>开始</summary>
    [DisplayName("开始")]
    [Description("开始")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("StartedTime", "开始", "")]
    public DateTime StartedTime { get => _StartedTime; set { if (OnPropertyChanging("StartedTime", value)) { _StartedTime = value; OnPropertyChanged("StartedTime"); } } }

    private DateTime _FinishedTime;
    /// <summary>完成</summary>
    [DisplayName("完成")]
    [Description("完成")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("FinishedTime", "完成", "")]
    public DateTime FinishedTime { get => _FinishedTime; set { if (OnPropertyChanging("FinishedTime", value)) { _FinishedTime = value; OnPropertyChanged("FinishedTime"); } } }

    private DateTime _CreateTime;
    /// <summary>创建时间</summary>
    [DisplayName("创建时间")]
    [Description("创建时间")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("CreateTime", "创建时间", "")]
    public DateTime CreateTime { get => _CreateTime; set { if (OnPropertyChanging("CreateTime", value)) { _CreateTime = value; OnPropertyChanged("CreateTime"); } } }
    #endregion

    #region 获取/设置 字段值
    /// <summary>获取/设置 字段值</summary>
    /// <param name="name">字段名</param>
    /// <returns></returns>
    public override Object this[String name]
    {
        get => name switch
        {
            "Id" => _Id,
            "RunId" => _RunId,
            "StepType" => _StepType,
            "StepIndex" => _StepIndex,
            "NodeId" => _NodeId,
            "CommandId" => _CommandId,
            "Status" => _Status,
            "Message" => _Message,
            "StartedTime" => _StartedTime,
            "FinishedTime" => _FinishedTime,
            "CreateTime" => _CreateTime,
            _ => base[name]
        };
        set
        {
            switch (name)
            {
                case "Id": _Id = value.ToInt(); break;
                case "RunId": _RunId = value.ToInt(); break;
                case "StepType": _StepType = Convert.ToString(value); break;
                case "StepIndex": _StepIndex = value.ToInt(); break;
                case "NodeId": _NodeId = value.ToInt(); break;
                case "CommandId": _CommandId = value.ToInt(); break;
                case "Status": _Status = Convert.ToString(value); break;
                case "Message": _Message = Convert.ToString(value); break;
                case "StartedTime": _StartedTime = value.ToDateTime(); break;
                case "FinishedTime": _FinishedTime = value.ToDateTime(); break;
                case "CreateTime": _CreateTime = value.ToDateTime(); break;
                default: base[name] = value; break;
            }
        }
    }
    #endregion

    #region 关联映射
    /// <summary>运行</summary>
    [XmlIgnore, IgnoreDataMember, ScriptIgnore]
    public AppPipelineRun Run => Extends.Get(nameof(Run), k => AppPipelineRun.FindById(RunId));

    /// <summary>运行</summary>
    [Map(nameof(RunId), typeof(AppPipelineRun), "Id")]
    public Int32 RunPipelineId => Run != null ? Run.PipelineId : default;

    #endregion

    #region 扩展查询
    /// <summary>根据编号查找</summary>
    /// <param name="id">编号</param>
    /// <returns>实体对象</returns>
    public static AppPipelineStep FindById(Int32 id)
    {
        if (id < 0) return null;

        // 实体缓存
        if (Meta.Session.Count < MaxCacheCount) return Meta.Cache.Find(e => e.Id == id);

        // 单对象缓存
        return Meta.SingleCache[id];

        //return Find(_.Id == id);
    }

    /// <summary>根据运行、步骤序号查找</summary>
    /// <param name="runId">运行</param>
    /// <param name="stepIndex">步骤序号</param>
    /// <returns>实体列表</returns>
    public static IList<AppPipelineStep> FindAllByRunIdAndStepIndex(Int32 runId, Int32 stepIndex)
    {
        if (runId < 0) return [];
        if (stepIndex < 0) return [];

        // 实体缓存
        if (Meta.Session.Count < MaxCacheCount) return Meta.Cache.FindAll(e => e.RunId == runId && e.StepIndex == stepIndex);

        return FindAll(_.RunId == runId & _.StepIndex == stepIndex);
    }

    /// <summary>根据命令查找</summary>
    /// <param name="commandId">命令</param>
    /// <returns>实体列表</returns>
    public static IList<AppPipelineStep> FindAllByCommandId(Int32 commandId)
    {
        if (commandId < 0) return [];

        // 实体缓存
        if (Meta.Session.Count < MaxCacheCount) return Meta.Cache.FindAll(e => e.CommandId == commandId);

        return FindAll(_.CommandId == commandId);
    }
    #endregion

    #region 高级查询
    /// <summary>高级查询</summary>
    /// <param name="runId">运行。对应AppPipelineRun.Id</param>
    /// <param name="stepIndex">步骤序号。同一运行内从 0 开始递增</param>
    /// <param name="commandId">命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新</param>
    /// <param name="start">创建时间开始</param>
    /// <param name="end">创建时间结束</param>
    /// <param name="key">关键字</param>
    /// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
    /// <returns>实体列表</returns>
    public static IList<AppPipelineStep> Search(Int32 runId, Int32 stepIndex, Int32 commandId, DateTime start, DateTime end, String key, PageParameter page)
    {
        var exp = new WhereExpression();

        if (runId >= 0) exp &= _.RunId == runId;
        if (stepIndex >= 0) exp &= _.StepIndex == stepIndex;
        if (commandId >= 0) exp &= _.CommandId == commandId;
        exp &= _.CreateTime.Between(start, end);
        if (!key.IsNullOrEmpty()) exp &= SearchWhereByKeys(key);

        return FindAll(exp, page);
    }
    #endregion

    #region 字段名
    /// <summary>取得流水线步骤字段信息的快捷方式</summary>
    public partial class _
    {
        /// <summary>编号</summary>
        public static readonly Field Id = FindByName("Id");

        /// <summary>运行。对应AppPipelineRun.Id</summary>
        public static readonly Field RunId = FindByName("RunId");

        /// <summary>步骤类型。Build/Upload/Deploy</summary>
        public static readonly Field StepType = FindByName("StepType");

        /// <summary>步骤序号。同一运行内从 0 开始递增</summary>
        public static readonly Field StepIndex = FindByName("StepIndex");

        /// <summary>节点。执行该步骤的节点</summary>
        public static readonly Field NodeId = FindByName("NodeId");

        /// <summary>命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新</summary>
        public static readonly Field CommandId = FindByName("CommandId");

        /// <summary>状态。Pending/Running/Success/Failed/Skipped</summary>
        public static readonly Field Status = FindByName("Status");

        /// <summary>消息。步骤执行输出与失败原因</summary>
        public static readonly Field Message = FindByName("Message");

        /// <summary>开始</summary>
        public static readonly Field StartedTime = FindByName("StartedTime");

        /// <summary>完成</summary>
        public static readonly Field FinishedTime = FindByName("FinishedTime");

        /// <summary>创建时间</summary>
        public static readonly Field CreateTime = FindByName("CreateTime");

        static Field FindByName(String name) => Meta.Table.FindByName(name);
    }

    /// <summary>取得流水线步骤字段名称的快捷方式</summary>
    public partial class __
    {
        /// <summary>编号</summary>
        public const String Id = "Id";

        /// <summary>运行。对应AppPipelineRun.Id</summary>
        public const String RunId = "RunId";

        /// <summary>步骤类型。Build/Upload/Deploy</summary>
        public const String StepType = "StepType";

        /// <summary>步骤序号。同一运行内从 0 开始递增</summary>
        public const String StepIndex = "StepIndex";

        /// <summary>节点。执行该步骤的节点</summary>
        public const String NodeId = "NodeId";

        /// <summary>命令。对应NodeCommand.Id,用于按命令回包事件(CommandReply)精确命中该步骤,驱动状态更新</summary>
        public const String CommandId = "CommandId";

        /// <summary>状态。Pending/Running/Success/Failed/Skipped</summary>
        public const String Status = "Status";

        /// <summary>消息。步骤执行输出与失败原因</summary>
        public const String Message = "Message";

        /// <summary>开始</summary>
        public const String StartedTime = "StartedTime";

        /// <summary>完成</summary>
        public const String FinishedTime = "FinishedTime";

        /// <summary>创建时间</summary>
        public const String CreateTime = "CreateTime";
    }
    #endregion
}