[improv]优化Packet.ToArray性能问题
大石头 authored at 2024-09-11 09:04:36 大石头 committed at 2024-09-11 09:10:28
7.47 KiB
X
using System;
using System.Collections.Generic;
using NewLife;
using NewLife.Data;
using XCode.Cache;

namespace XCode.Membership
{
    /// <summary>日志</summary>
    public partial class Log : Entity<Log>
    {
        #region 对象操作
        static Log()
        {
            Meta.Table.DataTable.InsertOnly = true;
            //Meta.Factory.FullInsert = false;

            Meta.Modules.Add<TimeModule>();
            Meta.Modules.Add<UserModule>();
            Meta.Modules.Add<IPModule>();

#if !DEBUG
            // 关闭SQL日志
            NewLife.Threading.ThreadPoolX.QueueUserWorkItem(() => { Meta.Session.Dal.Db.ShowSQL = false; });
#endif
        }

        /// <summary>已重载。记录当前管理员</summary>
        /// <param name="isNew"></param>
        public override void Valid(Boolean isNew)
        {
            base.Valid(isNew);

            if (isNew)
            {
                // 自动设置当前登录用户
                if (!IsDirty(__.UserName)) UserName = ManageProvider.Provider?.Current + "";
            }

            // 处理过长的备注
            if (!Remark.IsNullOrEmpty() && Remark.Length > 500)
            {
                Remark = Remark.Substring(0, 500);
            }

            // 时间
            if (isNew && CreateTime.Year < 2000 && !IsDirty(__.CreateTime)) CreateTime = DateTime.Now;
        }

        /// <summary></summary>
        /// <returns></returns>
        protected override Int32 OnUpdate() => throw new Exception("禁止修改日志!");

        /// <summary></summary>
        /// <returns></returns>
        protected override Int32 OnDelete() => throw new Exception("禁止删除日志!");
        #endregion

        #region 扩展属性
        #endregion

        #region 扩展查询
        /// <summary>查询</summary>
        /// <param name="key"></param>
        /// <param name="userid"></param>
        /// <param name="category"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        [Obsolete]
        public static IList<Log> Search(String key, Int32 userid, String category, DateTime start, DateTime end, PageParameter p)
        {
            var exp = new WhereExpression();
            //if (!key.IsNullOrEmpty()) exp &= (_.Action == key | _.Remark.Contains(key));
            if (!category.IsNullOrEmpty() && category != "全部") exp &= _.Category == category;
            if (userid > 0) exp &= _.CreateUserID == userid;

            // 主键带有时间戳
            var snow = Meta.Factory.Snow;
            if (snow != null)
                exp &= _.ID.Between(start, end, snow);
            else
                exp &= _.CreateTime.Between(start, end);

            // 先精确查询,再模糊
            if (!key.IsNullOrEmpty())
            {
                var list = FindAll(exp & _.Action == key, p);
                if (list.Count > 0) return list;

                exp &= _.Action.Contains(key) | _.Remark.Contains(key);
            }

            return FindAll(exp, p);
        }

        /// <summary>查询</summary>
        /// <param name="category"></param>
        /// <param name="action"></param>
        /// <param name="success"></param>
        /// <param name="userid"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="key"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        [Obsolete]
        public static IList<Log> Search(String category, String action, Boolean? success, Int32 userid, DateTime start, DateTime end, String key, PageParameter p)
        {
            var exp = new WhereExpression();

            if (!category.IsNullOrEmpty() && category != "全部") exp &= _.Category == category;
            if (!action.IsNullOrEmpty() && action != "全部") exp &= _.Action == action;
            if (success != null) exp &= _.Success == success;
            if (userid > 0) exp &= _.CreateUserID == userid;

            // 主键带有时间戳
            var snow = Meta.Factory.Snow;
            if (snow != null)
                exp &= _.ID.Between(start, end, snow);
            else
                exp &= _.CreateTime.Between(start, end);

            if (!key.IsNullOrEmpty()) exp &= _.Remark.Contains(key);

            return FindAll(exp, p);
        }

        /// <summary>查询</summary>
        /// <param name="category"></param>
        /// <param name="action"></param>
        /// <param name="linkId"></param>
        /// <param name="success"></param>
        /// <param name="userid"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="key"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        public static IList<Log> Search(String category, String action, Int32 linkId, Boolean? success, Int32 userid, DateTime start, DateTime end, String key, PageParameter p)
        {
            var exp = new WhereExpression();

            if (!category.IsNullOrEmpty() && category != "全部") exp &= _.Category == category;
            if (!action.IsNullOrEmpty() && action != "全部") exp &= _.Action == action;
            if (linkId > 0) exp &= _.LinkID == linkId;
            if (success != null) exp &= _.Success == success;
            if (userid > 0) exp &= _.CreateUserID == userid;

            // 主键带有时间戳
            var snow = Meta.Factory.Snow;
            if (snow != null)
                exp &= _.ID.Between(start, end, snow);
            else
                exp &= _.CreateTime.Between(start, end);

            if (!key.IsNullOrEmpty()) exp &= _.Remark.Contains(key);

            return FindAll(exp, p);
        }
        #endregion

        #region 扩展操作
        // Select Count(ID) as ID,Category From Log Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By ID Desc limit 20
        static readonly FieldCache<Log> CategoryCache = new(__.Category)
        {
            Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
        };

        /// <summary>获取所有类别名称,最近30天</summary>
        /// <returns></returns>
        public static IDictionary<String, String> FindAllCategoryName() => CategoryCache.FindAllName();

        static readonly FieldCache<Log> ActionCache = new(__.Action)
        {
            Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
        };

        /// <summary>获取所有操作名称,最近30天</summary>
        /// <returns></returns>
        public static IDictionary<String, String> FindAllActionName() => ActionCache.FindAllName();
        #endregion

        #region 业务
        /// <summary>已重载。</summary>
        /// <returns></returns>
        public override String ToString() => $"{Category} {Action} {UserName} {CreateTime:yyyy-MM-dd HH:mm:ss} {Remark}";
        #endregion
    }

    /// <summary>日志接口</summary>
    public partial interface ILog
    {
        /// <summary>保存</summary>
        /// <returns></returns>
        Int32 Save();

        /// <summary>异步保存</summary>
        /// <param name="msDelay">延迟保存的时间。默认0ms近实时保存</param>
        /// <returns></returns>
        Boolean SaveAsync(Int32 msDelay = 0);
    }
}