refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
19.19 KiB
RainbowBridge
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 Rainbow.Entity;

/// <summary>网口小时统计。从InterfaceStat按小时汇总,含速率峰值和掉线次数。用于日报和小时级趋势分析</summary>
[Serializable]
[DataObject]
[Description("网口小时统计。从InterfaceStat按小时汇总,含速率峰值和掉线次数。用于日报和小时级趋势分析")]
[BindIndex("IU_InterfaceHourStat_InterfaceName_StatHour", true, "InterfaceName,StatHour")]
[BindTable("InterfaceHourStat", Description = "网口小时统计。从InterfaceStat按小时汇总,含速率峰值和掉线次数。用于日报和小时级趋势分析", ConnName = "RainbowStat", DbType = DatabaseType.None)]
public partial class InterfaceHourStat
{
    #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 String? _InterfaceName;
    /// <summary>网口名</summary>
    [DisplayName("网口名")]
    [Description("网口名")]
    [DataObjectField(false, false, true, 20)]
    [BindColumn("InterfaceName", "网口名", "")]
    public String? InterfaceName { get => _InterfaceName; set { if (OnPropertyChanging("InterfaceName", value)) { _InterfaceName = value; OnPropertyChanged("InterfaceName"); } } }

    private DateTime _StatHour;
    /// <summary>统计小时。如2026-07-02 14:00:00</summary>
    [DisplayName("统计小时")]
    [Description("统计小时。如2026-07-02 14:00:00")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("StatHour", "统计小时。如2026-07-02 14:00:00", "")]
    public DateTime StatHour { get => _StatHour; set { if (OnPropertyChanging("StatHour", value)) { _StatHour = value; OnPropertyChanged("StatHour"); } } }

    private Int64 _RxBytes;
    /// <summary>小时接收字节合计。SUM(InterfaceStat.RxBytes)</summary>
    [DisplayName("小时接收字节合计")]
    [Description("小时接收字节合计。SUM(InterfaceStat.RxBytes)")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxBytes", "小时接收字节合计。SUM(InterfaceStat.RxBytes)", "")]
    public Int64 RxBytes { get => _RxBytes; set { if (OnPropertyChanging("RxBytes", value)) { _RxBytes = value; OnPropertyChanged("RxBytes"); } } }

    private Int64 _RxPackets;
    /// <summary>小时接收包合计</summary>
    [DisplayName("小时接收包合计")]
    [Description("小时接收包合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxPackets", "小时接收包合计", "")]
    public Int64 RxPackets { get => _RxPackets; set { if (OnPropertyChanging("RxPackets", value)) { _RxPackets = value; OnPropertyChanged("RxPackets"); } } }

    private Int64 _RxBytesMax;
    /// <summary>分钟接收峰值。字节/秒。定位带宽瓶颈精确发生的分钟。峰值接近线路带宽→需扩容或QoS限速</summary>
    [DisplayName("分钟接收峰值")]
    [Description("分钟接收峰值。字节/秒。定位带宽瓶颈精确发生的分钟。峰值接近线路带宽→需扩容或QoS限速")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxBytesMax", "分钟接收峰值。字节/秒。定位带宽瓶颈精确发生的分钟。峰值接近线路带宽→需扩容或QoS限速", "")]
    public Int64 RxBytesMax { get => _RxBytesMax; set { if (OnPropertyChanging("RxBytesMax", value)) { _RxBytesMax = value; OnPropertyChanged("RxBytesMax"); } } }

    private Int64 _RxPacketsMax;
    /// <summary>分钟接收包峰值。小包PPS过高→可能DDoS攻击</summary>
    [DisplayName("分钟接收包峰值")]
    [Description("分钟接收包峰值。小包PPS过高→可能DDoS攻击")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxPacketsMax", "分钟接收包峰值。小包PPS过高→可能DDoS攻击", "")]
    public Int64 RxPacketsMax { get => _RxPacketsMax; set { if (OnPropertyChanging("RxPacketsMax", value)) { _RxPacketsMax = value; OnPropertyChanged("RxPacketsMax"); } } }

    private Int64 _RxErrors;
    /// <summary>接收错误合计。>0→该小时内有硬件异常</summary>
    [DisplayName("接收错误合计")]
    [Description("接收错误合计。>0→该小时内有硬件异常")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxErrors", "接收错误合计。>0→该小时内有硬件异常", "")]
    public Int64 RxErrors { get => _RxErrors; set { if (OnPropertyChanging("RxErrors", value)) { _RxErrors = value; OnPropertyChanged("RxErrors"); } } }

    private Int64 _RxDropped;
    /// <summary>接收丢包合计。>0→该小时内有拥塞</summary>
    [DisplayName("接收丢包合计")]
    [Description("接收丢包合计。>0→该小时内有拥塞")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxDropped", "接收丢包合计。>0→该小时内有拥塞", "")]
    public Int64 RxDropped { get => _RxDropped; set { if (OnPropertyChanging("RxDropped", value)) { _RxDropped = value; OnPropertyChanged("RxDropped"); } } }

    private Int64 _TxBytes;
    /// <summary>小时发送字节合计</summary>
    [DisplayName("小时发送字节合计")]
    [Description("小时发送字节合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxBytes", "小时发送字节合计", "")]
    public Int64 TxBytes { get => _TxBytes; set { if (OnPropertyChanging("TxBytes", value)) { _TxBytes = value; OnPropertyChanged("TxBytes"); } } }

    private Int64 _TxPackets;
    /// <summary>小时发送包合计</summary>
    [DisplayName("小时发送包合计")]
    [Description("小时发送包合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxPackets", "小时发送包合计", "")]
    public Int64 TxPackets { get => _TxPackets; set { if (OnPropertyChanging("TxPackets", value)) { _TxPackets = value; OnPropertyChanged("TxPackets"); } } }

    private Int64 _TxBytesMax;
    /// <summary>分钟发送峰值。字节/秒</summary>
    [DisplayName("分钟发送峰值")]
    [Description("分钟发送峰值。字节/秒")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxBytesMax", "分钟发送峰值。字节/秒", "")]
    public Int64 TxBytesMax { get => _TxBytesMax; set { if (OnPropertyChanging("TxBytesMax", value)) { _TxBytesMax = value; OnPropertyChanged("TxBytesMax"); } } }

    private Int64 _TxPacketsMax;
    /// <summary>分钟发送包峰值</summary>
    [DisplayName("分钟发送包峰值")]
    [Description("分钟发送包峰值")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxPacketsMax", "分钟发送包峰值", "")]
    public Int64 TxPacketsMax { get => _TxPacketsMax; set { if (OnPropertyChanging("TxPacketsMax", value)) { _TxPacketsMax = value; OnPropertyChanged("TxPacketsMax"); } } }

    private Int64 _TxErrors;
    /// <summary>发送错误合计</summary>
    [DisplayName("发送错误合计")]
    [Description("发送错误合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxErrors", "发送错误合计", "")]
    public Int64 TxErrors { get => _TxErrors; set { if (OnPropertyChanging("TxErrors", value)) { _TxErrors = value; OnPropertyChanged("TxErrors"); } } }

    private Int64 _TxDropped;
    /// <summary>发送丢包合计</summary>
    [DisplayName("发送丢包合计")]
    [Description("发送丢包合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxDropped", "发送丢包合计", "")]
    public Int64 TxDropped { get => _TxDropped; set { if (OnPropertyChanging("TxDropped", value)) { _TxDropped = value; OnPropertyChanged("TxDropped"); } } }

    private Int64 _TxCarrier;
    /// <summary>载波丢失次数。>0→该小时内有物理断网</summary>
    [DisplayName("载波丢失次数")]
    [Description("载波丢失次数。>0→该小时内有物理断网")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TxCarrier", "载波丢失次数。>0→该小时内有物理断网", "")]
    public Int64 TxCarrier { get => _TxCarrier; set { if (OnPropertyChanging("TxCarrier", value)) { _TxCarrier = value; OnPropertyChanged("TxCarrier"); } } }

    private Int64 _RxMulticast;
    /// <summary>组播包合计</summary>
    [DisplayName("组播包合计")]
    [Description("组播包合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxMulticast", "组播包合计", "")]
    public Int64 RxMulticast { get => _RxMulticast; set { if (OnPropertyChanging("RxMulticast", value)) { _RxMulticast = value; OnPropertyChanged("RxMulticast"); } } }

    private Int32 _OfflineCount;
    /// <summary>掉线次数。该小时内网口down/up次数。>3次→链路不稳定,需检查网线/光模块/对端交换机</summary>
    [DisplayName("掉线次数")]
    [Description("掉线次数。该小时内网口down/up次数。>3次→链路不稳定,需检查网线/光模块/对端交换机")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("OfflineCount", "掉线次数。该小时内网口down/up次数。>3次→链路不稳定,需检查网线/光模块/对端交换机", "")]
    public Int32 OfflineCount { get => _OfflineCount; set { if (OnPropertyChanging("OfflineCount", value)) { _OfflineCount = value; OnPropertyChanged("OfflineCount"); } } }

    private DateTime _CreateTime;
    /// <summary>创建时间</summary>
    [Category("扩展")]
    [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,
            "InterfaceName" => _InterfaceName,
            "StatHour" => _StatHour,
            "RxBytes" => _RxBytes,
            "RxPackets" => _RxPackets,
            "RxBytesMax" => _RxBytesMax,
            "RxPacketsMax" => _RxPacketsMax,
            "RxErrors" => _RxErrors,
            "RxDropped" => _RxDropped,
            "TxBytes" => _TxBytes,
            "TxPackets" => _TxPackets,
            "TxBytesMax" => _TxBytesMax,
            "TxPacketsMax" => _TxPacketsMax,
            "TxErrors" => _TxErrors,
            "TxDropped" => _TxDropped,
            "TxCarrier" => _TxCarrier,
            "RxMulticast" => _RxMulticast,
            "OfflineCount" => _OfflineCount,
            "CreateTime" => _CreateTime,
            _ => base[name]
        };
        set
        {
            switch (name)
            {
                case "Id": _Id = value.ToInt(); break;
                case "InterfaceName": _InterfaceName = Convert.ToString(value); break;
                case "StatHour": _StatHour = value.ToDateTime(); break;
                case "RxBytes": _RxBytes = value.ToLong(); break;
                case "RxPackets": _RxPackets = value.ToLong(); break;
                case "RxBytesMax": _RxBytesMax = value.ToLong(); break;
                case "RxPacketsMax": _RxPacketsMax = value.ToLong(); break;
                case "RxErrors": _RxErrors = value.ToLong(); break;
                case "RxDropped": _RxDropped = value.ToLong(); break;
                case "TxBytes": _TxBytes = value.ToLong(); break;
                case "TxPackets": _TxPackets = value.ToLong(); break;
                case "TxBytesMax": _TxBytesMax = value.ToLong(); break;
                case "TxPacketsMax": _TxPacketsMax = value.ToLong(); break;
                case "TxErrors": _TxErrors = value.ToLong(); break;
                case "TxDropped": _TxDropped = value.ToLong(); break;
                case "TxCarrier": _TxCarrier = value.ToLong(); break;
                case "RxMulticast": _RxMulticast = value.ToLong(); break;
                case "OfflineCount": _OfflineCount = value.ToInt(); break;
                case "CreateTime": _CreateTime = value.ToDateTime(); break;
                default: base[name] = value; break;
            }
        }
    }
    #endregion

    #region 关联映射
    #endregion

    #region 扩展查询
    /// <summary>根据编号查找</summary>
    /// <param name="id">编号</param>
    /// <returns>实体对象</returns>
    public static InterfaceHourStat? 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);
    }
    #endregion

    #region 高级查询
    /// <summary>高级查询</summary>
    /// <param name="interfaceName">网口名</param>
    /// <param name="start">统计小时开始</param>
    /// <param name="end">统计小时结束</param>
    /// <param name="key">关键字</param>
    /// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
    /// <returns>实体列表</returns>
    public static IList<InterfaceHourStat> Search(String? interfaceName, DateTime start, DateTime end, String key, PageParameter page)
    {
        var exp = new WhereExpression();

        if (!interfaceName.IsNullOrEmpty()) exp &= _.InterfaceName == interfaceName;
        exp &= _.StatHour.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>网口名</summary>
        public static readonly Field InterfaceName = FindByName("InterfaceName");

        /// <summary>统计小时。如2026-07-02 14:00:00</summary>
        public static readonly Field StatHour = FindByName("StatHour");

        /// <summary>小时接收字节合计。SUM(InterfaceStat.RxBytes)</summary>
        public static readonly Field RxBytes = FindByName("RxBytes");

        /// <summary>小时接收包合计</summary>
        public static readonly Field RxPackets = FindByName("RxPackets");

        /// <summary>分钟接收峰值。字节/秒。定位带宽瓶颈精确发生的分钟。峰值接近线路带宽→需扩容或QoS限速</summary>
        public static readonly Field RxBytesMax = FindByName("RxBytesMax");

        /// <summary>分钟接收包峰值。小包PPS过高→可能DDoS攻击</summary>
        public static readonly Field RxPacketsMax = FindByName("RxPacketsMax");

        /// <summary>接收错误合计。>0→该小时内有硬件异常</summary>
        public static readonly Field RxErrors = FindByName("RxErrors");

        /// <summary>接收丢包合计。>0→该小时内有拥塞</summary>
        public static readonly Field RxDropped = FindByName("RxDropped");

        /// <summary>小时发送字节合计</summary>
        public static readonly Field TxBytes = FindByName("TxBytes");

        /// <summary>小时发送包合计</summary>
        public static readonly Field TxPackets = FindByName("TxPackets");

        /// <summary>分钟发送峰值。字节/秒</summary>
        public static readonly Field TxBytesMax = FindByName("TxBytesMax");

        /// <summary>分钟发送包峰值</summary>
        public static readonly Field TxPacketsMax = FindByName("TxPacketsMax");

        /// <summary>发送错误合计</summary>
        public static readonly Field TxErrors = FindByName("TxErrors");

        /// <summary>发送丢包合计</summary>
        public static readonly Field TxDropped = FindByName("TxDropped");

        /// <summary>载波丢失次数。>0→该小时内有物理断网</summary>
        public static readonly Field TxCarrier = FindByName("TxCarrier");

        /// <summary>组播包合计</summary>
        public static readonly Field RxMulticast = FindByName("RxMulticast");

        /// <summary>掉线次数。该小时内网口down/up次数。>3次→链路不稳定,需检查网线/光模块/对端交换机</summary>
        public static readonly Field OfflineCount = FindByName("OfflineCount");

        /// <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>网口名</summary>
        public const String InterfaceName = "InterfaceName";

        /// <summary>统计小时。如2026-07-02 14:00:00</summary>
        public const String StatHour = "StatHour";

        /// <summary>小时接收字节合计。SUM(InterfaceStat.RxBytes)</summary>
        public const String RxBytes = "RxBytes";

        /// <summary>小时接收包合计</summary>
        public const String RxPackets = "RxPackets";

        /// <summary>分钟接收峰值。字节/秒。定位带宽瓶颈精确发生的分钟。峰值接近线路带宽→需扩容或QoS限速</summary>
        public const String RxBytesMax = "RxBytesMax";

        /// <summary>分钟接收包峰值。小包PPS过高→可能DDoS攻击</summary>
        public const String RxPacketsMax = "RxPacketsMax";

        /// <summary>接收错误合计。>0→该小时内有硬件异常</summary>
        public const String RxErrors = "RxErrors";

        /// <summary>接收丢包合计。>0→该小时内有拥塞</summary>
        public const String RxDropped = "RxDropped";

        /// <summary>小时发送字节合计</summary>
        public const String TxBytes = "TxBytes";

        /// <summary>小时发送包合计</summary>
        public const String TxPackets = "TxPackets";

        /// <summary>分钟发送峰值。字节/秒</summary>
        public const String TxBytesMax = "TxBytesMax";

        /// <summary>分钟发送包峰值</summary>
        public const String TxPacketsMax = "TxPacketsMax";

        /// <summary>发送错误合计</summary>
        public const String TxErrors = "TxErrors";

        /// <summary>发送丢包合计</summary>
        public const String TxDropped = "TxDropped";

        /// <summary>载波丢失次数。>0→该小时内有物理断网</summary>
        public const String TxCarrier = "TxCarrier";

        /// <summary>组播包合计</summary>
        public const String RxMulticast = "RxMulticast";

        /// <summary>掉线次数。该小时内网口down/up次数。>3次→链路不稳定,需检查网线/光模块/对端交换机</summary>
        public const String OfflineCount = "OfflineCount";

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