一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值)。
特别适用于订单历史记录、重要财务记录、审批流记录
表设计:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
表设计字段:
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,
};
调用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }