refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
16.53 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>成员小时统计。从MemberStat按小时汇总。用于成员日报和行为趋势</summary>
[Serializable]
[DataObject]
[Description("成员小时统计。从MemberStat按小时汇总。用于成员日报和行为趋势")]
[BindIndex("IU_MemberHourStat_MemberId_StatHour", true, "MemberId,StatHour")]
[BindTable("MemberHourStat", Description = "成员小时统计。从MemberStat按小时汇总。用于成员日报和行为趋势", ConnName = "RainbowStat", DbType = DatabaseType.None)]
public partial class MemberHourStat
{
    #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 _MemberId;
    /// <summary>关联成员</summary>
    [DisplayName("关联成员")]
    [Description("关联成员")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("MemberId", "关联成员", "")]
    public Int32 MemberId { get => _MemberId; set { if (OnPropertyChanging("MemberId", value)) { _MemberId = value; OnPropertyChanged("MemberId"); } } }

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

    private Int32 _DeviceCount;
    /// <summary>平均在线设备数</summary>
    [DisplayName("平均在线设备数")]
    [Description("平均在线设备数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("DeviceCount", "平均在线设备数", "")]
    public Int32 DeviceCount { get => _DeviceCount; set { if (OnPropertyChanging("DeviceCount", value)) { _DeviceCount = value; OnPropertyChanged("DeviceCount"); } } }

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

    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 _RxBytesMax;
    /// <summary>分钟接收峰值。定位该成员带宽消耗最大的时刻</summary>
    [DisplayName("分钟接收峰值")]
    [Description("分钟接收峰值。定位该成员带宽消耗最大的时刻")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("RxBytesMax", "分钟接收峰值。定位该成员带宽消耗最大的时刻", "")]
    public Int64 RxBytesMax { get => _RxBytesMax; set { if (OnPropertyChanging("RxBytesMax", value)) { _RxBytesMax = value; OnPropertyChanged("RxBytesMax"); } } }

    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 Int32 _TotalConns;
    /// <summary>最大连接数</summary>
    [DisplayName("最大连接数")]
    [Description("最大连接数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TotalConns", "最大连接数", "")]
    public Int32 TotalConns { get => _TotalConns; set { if (OnPropertyChanging("TotalConns", value)) { _TotalConns = value; OnPropertyChanged("TotalConns"); } } }

    private Int32 _TcpRetrans;
    /// <summary>TCP重传合计</summary>
    [DisplayName("TCP重传合计")]
    [Description("TCP重传合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("TcpRetrans", "TCP重传合计", "")]
    public Int32 TcpRetrans { get => _TcpRetrans; set { if (OnPropertyChanging("TcpRetrans", value)) { _TcpRetrans = value; OnPropertyChanged("TcpRetrans"); } } }

    private Int32 _AvgRttMin;
    /// <summary>最小时延</summary>
    [DisplayName("最小时延")]
    [Description("最小时延")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("AvgRttMin", "最小时延", "")]
    public Int32 AvgRttMin { get => _AvgRttMin; set { if (OnPropertyChanging("AvgRttMin", value)) { _AvgRttMin = value; OnPropertyChanged("AvgRttMin"); } } }

    private Int32 _AvgRttMax;
    /// <summary>最大时延。抖动=Max-Min>100ms→VoIP/游戏体验差</summary>
    [DisplayName("最大时延")]
    [Description("最大时延。抖动=Max-Min>100ms→VoIP/游戏体验差")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("AvgRttMax", "最大时延。抖动=Max-Min>100ms→VoIP/游戏体验差", "")]
    public Int32 AvgRttMax { get => _AvgRttMax; set { if (OnPropertyChanging("AvgRttMax", value)) { _AvgRttMax = value; OnPropertyChanged("AvgRttMax"); } } }

    private Int32 _BlockedCount;
    /// <summary>防火墙拦截合计</summary>
    [DisplayName("防火墙拦截合计")]
    [Description("防火墙拦截合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("BlockedCount", "防火墙拦截合计", "")]
    public Int32 BlockedCount { get => _BlockedCount; set { if (OnPropertyChanging("BlockedCount", value)) { _BlockedCount = value; OnPropertyChanged("BlockedCount"); } } }

    private Int32 _DnsQueries;
    /// <summary>DNS查询合计</summary>
    [DisplayName("DNS查询合计")]
    [Description("DNS查询合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("DnsQueries", "DNS查询合计", "")]
    public Int32 DnsQueries { get => _DnsQueries; set { if (OnPropertyChanging("DnsQueries", value)) { _DnsQueries = value; OnPropertyChanged("DnsQueries"); } } }

    private Int32 _OnlineSeconds;
    /// <summary>小时在线秒数。反映该成员用网时长。异常短→可能外出或断网</summary>
    [DisplayName("小时在线秒数")]
    [Description("小时在线秒数。反映该成员用网时长。异常短→可能外出或断网")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("OnlineSeconds", "小时在线秒数。反映该成员用网时长。异常短→可能外出或断网", "", ItemType = "TimeSpan")]
    public Int32 OnlineSeconds { get => _OnlineSeconds; set { if (OnPropertyChanging("OnlineSeconds", value)) { _OnlineSeconds = value; OnPropertyChanged("OnlineSeconds"); } } }

    private Int32 _OfflineCount;
    /// <summary>掉线次数合计</summary>
    [DisplayName("掉线次数合计")]
    [Description("掉线次数合计")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("OfflineCount", "掉线次数合计", "")]
    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,
            "MemberId" => _MemberId,
            "StatHour" => _StatHour,
            "DeviceCount" => _DeviceCount,
            "RxBytes" => _RxBytes,
            "TxBytes" => _TxBytes,
            "RxBytesMax" => _RxBytesMax,
            "TxBytesMax" => _TxBytesMax,
            "TotalConns" => _TotalConns,
            "TcpRetrans" => _TcpRetrans,
            "AvgRttMin" => _AvgRttMin,
            "AvgRttMax" => _AvgRttMax,
            "BlockedCount" => _BlockedCount,
            "DnsQueries" => _DnsQueries,
            "OnlineSeconds" => _OnlineSeconds,
            "OfflineCount" => _OfflineCount,
            "CreateTime" => _CreateTime,
            _ => base[name]
        };
        set
        {
            switch (name)
            {
                case "Id": _Id = value.ToInt(); break;
                case "MemberId": _MemberId = value.ToInt(); break;
                case "StatHour": _StatHour = value.ToDateTime(); break;
                case "DeviceCount": _DeviceCount = value.ToInt(); break;
                case "RxBytes": _RxBytes = value.ToLong(); break;
                case "TxBytes": _TxBytes = value.ToLong(); break;
                case "RxBytesMax": _RxBytesMax = value.ToLong(); break;
                case "TxBytesMax": _TxBytesMax = value.ToLong(); break;
                case "TotalConns": _TotalConns = value.ToInt(); break;
                case "TcpRetrans": _TcpRetrans = value.ToInt(); break;
                case "AvgRttMin": _AvgRttMin = value.ToInt(); break;
                case "AvgRttMax": _AvgRttMax = value.ToInt(); break;
                case "BlockedCount": _BlockedCount = value.ToInt(); break;
                case "DnsQueries": _DnsQueries = value.ToInt(); break;
                case "OnlineSeconds": _OnlineSeconds = value.ToInt(); break;
                case "OfflineCount": _OfflineCount = value.ToInt(); break;
                case "CreateTime": _CreateTime = value.ToDateTime(); break;
                default: base[name] = value; break;
            }
        }
    }
    #endregion

    #region 关联映射
    /// <summary>关联成员</summary>
    [XmlIgnore, IgnoreDataMember, ScriptIgnore]
    public Member? Member => Extends.Get(nameof(Member), k => Member.FindById(MemberId));

    /// <summary>关联成员</summary>
    [Map(nameof(MemberId), typeof(Member), "Id")]
    public String? MemberName => Member?.Name;

    #endregion

    #region 扩展查询
    /// <summary>根据编号查找</summary>
    /// <param name="id">编号</param>
    /// <returns>实体对象</returns>
    public static MemberHourStat? 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="memberId">关联成员</param>
    /// <param name="start">统计小时开始</param>
    /// <param name="end">统计小时结束</param>
    /// <param name="key">关键字</param>
    /// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
    /// <returns>实体列表</returns>
    public static IList<MemberHourStat> Search(Int32 memberId, DateTime start, DateTime end, String key, PageParameter page)
    {
        var exp = new WhereExpression();

        if (memberId >= 0) exp &= _.MemberId == memberId;
        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 MemberId = FindByName("MemberId");

        /// <summary>统计小时</summary>
        public static readonly Field StatHour = FindByName("StatHour");

        /// <summary>平均在线设备数</summary>
        public static readonly Field DeviceCount = FindByName("DeviceCount");

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

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

        /// <summary>分钟接收峰值。定位该成员带宽消耗最大的时刻</summary>
        public static readonly Field RxBytesMax = FindByName("RxBytesMax");

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

        /// <summary>最大连接数</summary>
        public static readonly Field TotalConns = FindByName("TotalConns");

        /// <summary>TCP重传合计</summary>
        public static readonly Field TcpRetrans = FindByName("TcpRetrans");

        /// <summary>最小时延</summary>
        public static readonly Field AvgRttMin = FindByName("AvgRttMin");

        /// <summary>最大时延。抖动=Max-Min>100ms→VoIP/游戏体验差</summary>
        public static readonly Field AvgRttMax = FindByName("AvgRttMax");

        /// <summary>防火墙拦截合计</summary>
        public static readonly Field BlockedCount = FindByName("BlockedCount");

        /// <summary>DNS查询合计</summary>
        public static readonly Field DnsQueries = FindByName("DnsQueries");

        /// <summary>小时在线秒数。反映该成员用网时长。异常短→可能外出或断网</summary>
        public static readonly Field OnlineSeconds = FindByName("OnlineSeconds");

        /// <summary>掉线次数合计</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 MemberId = "MemberId";

        /// <summary>统计小时</summary>
        public const String StatHour = "StatHour";

        /// <summary>平均在线设备数</summary>
        public const String DeviceCount = "DeviceCount";

        /// <summary>小时接收字节合计</summary>
        public const String RxBytes = "RxBytes";

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

        /// <summary>分钟接收峰值。定位该成员带宽消耗最大的时刻</summary>
        public const String RxBytesMax = "RxBytesMax";

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

        /// <summary>最大连接数</summary>
        public const String TotalConns = "TotalConns";

        /// <summary>TCP重传合计</summary>
        public const String TcpRetrans = "TcpRetrans";

        /// <summary>最小时延</summary>
        public const String AvgRttMin = "AvgRttMin";

        /// <summary>最大时延。抖动=Max-Min>100ms→VoIP/游戏体验差</summary>
        public const String AvgRttMax = "AvgRttMax";

        /// <summary>防火墙拦截合计</summary>
        public const String BlockedCount = "BlockedCount";

        /// <summary>DNS查询合计</summary>
        public const String DnsQueries = "DnsQueries";

        /// <summary>小时在线秒数。反映该成员用网时长。异常短→可能外出或断网</summary>
        public const String OnlineSeconds = "OnlineSeconds";

        /// <summary>掉线次数合计</summary>
        public const String OfflineCount = "OfflineCount";

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