一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值

一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值)。 

特别适用于订单历史记录、重要财务记录、审批流记录

表设计:

  1 namespace Business.OperateLog
  2 {
  3     /// <summary>
  4     /// 公共系统操作日志记录类
  5     /// 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值)
  6     /// </summary>
  7     public class CommonOperateLog
  8     {
  9         /// <summary>
 10         /// 操作表表名
 11         /// </summary>
 12         public string TableName { get; private set; }
 13 
 14         /// <summary>
 15         /// 操作表主键
 16         /// </summary>
 17         public long TableKeyId { get; private set; }
 18 
 19         /// <summary>
 20         /// 操作类型
 21         /// </summary>
 22         public OperateType Type { get; private set; }
 23 
 24         /// <summary>
 25         /// 备注
 26         /// </summary>
 27         public string Remark { get;private set; }
 28 
 29         /// <summary>
 30         /// 操作者id
 31         /// </summary>
 32         public long UserId { get; private set; }
 33 
 34         /// <summary>
 35         /// 操作者姓名
 36         /// </summary>
 37         public string UserName { get; private set; }
 38 
 39         /// <summary>
 40         /// 字段新旧值修改详细日志
 41         /// </summary>
 42         public List<FieldUpdateLogContent> FieldUpdateLogContents { get; private set; }
 43 
 44 
 45         /// <summary>
 46         /// 构造
 47         /// </summary>
 48         public CommonOperateLog(string tableName, long tableKeyId, OperateType type, string remark = "", long userId = 0, string userName = "")
 49         {
 50             TableName = tableName;
 51             TableKeyId = tableKeyId;
 52             Type = type;
 53             Remark = remark ?? string.Empty;
 54             UserId = userId;
 55             UserName = userName ?? string.Empty;
 56             FieldUpdateLogContents = new List<FieldUpdateLogContent>();
 57         }
 58 
 59         /// <summary>
 60         /// 添加字段新旧值修改详细日志
 61         /// </summary>
 62         public List<FieldUpdateLogContent> AddLog(FieldUpdateLogContent log)
 63         {
 64             FieldUpdateLogContents.Add(log);
 65             return FieldUpdateLogContents;
 66         }
 67 
 68         /// <summary>
 69         /// 保存修改历史
 70         /// </summary>
 71         public void SaveOperationLog()
 72         {
 73             ThreadPool.QueueUserWorkItem(t =>   //使用线程异步保存,加速执行速度
 74             {
 75                 //插入操作日志表
 76                 var model = new OperationLogModel
 77                 {
 78                     TableName = TableName,
 79                     TableKeyId = TableKeyId,
 80                     Type = Type.GetHashCode(),
 81                     Content = JsonConvert.SerializeObject(FieldUpdateLogContents).AbbreviateString(1990),
 82                     Creator = CommonHelper.GetUserOperator(UserId.ToString(),UserName),
 83                     CreateTime = DateTime.Now,
 84                     IsDel = BooleanEnum.No.GetHashCode(),
 85                     Remark = Remark,
 86                 };
 87                 if (!CommonDAL.Add(model))
 88                     LogFactory.GetLogger("SkyLog").Error(new Exception("保存详细修改历史失败"), "保存详细修改历史失败", "SaveOperationLog", TableName,
 89                         null, "", "", TableKeyId.ToString());
 90             });
 91         }
 92     }
 93 
 94 
 95     /// <summary>
 96     /// 字段新旧值修改详细日志
 97     /// </summary>
 98     public class FieldUpdateLogContent
 99     {
100         /// <summary>
101         /// 字段英文名,一般就是表的列名
102         /// </summary>
103         public string EnName { get; private set; }
104 
105         /// <summary>
106         /// 字段中文名,一般就是表的中文描述名
107         /// </summary>
108         public string CNName { get; private set; }
109 
110         /// <summary>
111         /// 旧值
112         /// </summary>
113         public string OldValue { get; private set; }
114 
115         /// <summary>
116         /// 新值
117         /// </summary>
118         public string NewValue { get; private set; }
119 
120 
121         /// <summary>
122         /// 构造
123         /// </summary>
124         public FieldUpdateLogContent(string enName,string cnName,string oldValue,string newValue)
125         {
126             EnName = enName;
127             CNName = cnName;
128             OldValue = oldValue;
129             NewValue = newValue;
130         }
131     }
132 
133 
134     /// <summary>
135     /// 操作类型
136     /// </summary>
137     public enum OperateType
138     {
139         [Description("新增")]
140         Add = 0,
141 
142         [Description("更新")]
143         Update = 1,
144 
145         [Description("逻辑删除")]
146         Remove = 2,
147     }
148 }
View Code

表设计字段:

var model = new OperationLogModel
{
TableName = TableName,
TableKeyId = TableKeyId,
Type = Type.GetHashCode(),
Content = JsonConvert.SerializeObject(FieldUpdateLogContents).AbbreviateString(1990),
Creator = CommonHelper.GetUserOperator(UserId.ToString(),UserName),
CreateTime = DateTime.Now,
IsDel = BooleanEnum.No.GetHashCode(),
Remark = Remark,
};

调用:

1  public ContentResult OperateLog()
2         {
3             var operateLog = new CommonOperateLog("TableName", 1, OperateType.Add, "remark", CurrentUser.UserId, CurrentUser.UserName);
4             operateLog.AddLog(new FieldUpdateLogContent("Name", "学生姓名", "钮林华", "钮林华22"));
5             operateLog.AddLog(new FieldUpdateLogContent("CityId", "城市id", "101", "102"));
6             operateLog.SaveOperationLog();
7             return new ContentResult { Content = operateLog.ToJson() };
8         }
View Code
原文地址:https://www.cnblogs.com/nlh774/p/6986148.html