#region using System; using System.Data; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.DataAccess; using CSFrameworkV5.Interfaces; using CSFrameworkV5.Models; using CSFrameworkV5.WebRef.CommonService; #endregion namespace CSFrameworkV5.Business { /// /// 修改数据历史记录日志-修改数据日志 /// public class LogEditHistory { private static IBridge_EditLogHistory _MyBridge; /// /// 静态构造器 /// static LogEditHistory() { if (BridgeFactory.IsADODirect) _MyBridge = new dalEditLogHistory(Loginer.CurrentUser); if (BridgeFactory.IsWCFBridge) _MyBridge = new WCF_EditLogHistory(); if (_MyBridge == null) throw new CustomException(BridgeFactory.UNKNOW_BRIDGE_TYPE); } /// /// 比较新/旧数据,有变动数据自动生成对应的日志. /// /// 当前数据表 /// 当前数据表的日志配置字段 /// 当前数据表的主键字段名 /// private static DataSet DoCompareTable(DataTable originalData, string[] tracedFields, string summaryTableName, string keyFieldName) { //取表结构,sys_Log, sys_LogDtl var ds = _MyBridge.SearchLog("-", "-", "", DateTime.MinValue, DateTime.MinValue); object A; object B; string T1; string T2; var logID = Guid.NewGuid().ToStringEx().Replace("-", "").ToLower(); #region 循环原始数据比较修改后的数据 foreach (DataRow row in originalData.Rows) { if (row.RowState == DataRowState.Deleted) continue; //已经删除,不写入日志 if (row.RowState == DataRowState.Added) continue; //新增记录,不写入日志 //生成主表数据 var R = ds.Tables[sys_Log.__TableName].Rows.Add(); R[sys_Log.GUID32] = logID; R[sys_Log.LogDate] = DateTime.Now; R[sys_Log.LogUser] = Loginer.CurrentUser.AccountName; //当前登录用户 R[sys_Log.OPType] = LogDataType.LogEdit; //新增或修改 R[sys_Log.TableName] = summaryTableName; R[sys_Log.DocNo] = ConvertEx.ToString(row[keyFieldName]); R[sys_Log.MACD] = NetTools.GetLocalMac(); //获取MAC地址 //生成明细表数据 foreach (var fieldName in tracedFields) { if (originalData.Columns[fieldName] == null) continue; A = row[fieldName, DataRowVersion.Original]; //旧值 B = row[fieldName, DataRowVersion.Current]; //新值 if (originalData.Columns[fieldName].DataType == typeof(DateTime)) { T1 = A == DBNull.Value ? "" : ConvertEx.ToDateTimeEx(A) .ToString("yyyy-MM-dd HH:mm:ss"); T2 = B == DBNull.Value ? "" : ConvertEx.ToDateTimeEx(B) .ToString("yyyy-MM-dd HH:mm:ss"); } else { T1 = ConvertEx.ToString(A); //旧值 T2 = ConvertEx.ToString(B); //新值 } if (T1 != T2) { var R1 = ds.Tables[sys_LogDtl.__TableName].Rows.Add(); R1[sys_LogDtl.GUID32] = logID; R1[sys_LogDtl.TableName] = originalData.TableName; R1[sys_LogDtl.FieldName] = fieldName; R1[sys_LogDtl.OldValue] = ConvertEx.StrLeft(T1, 250); R1[sys_LogDtl.NewValue] = ConvertEx.StrLeft(T2, 250); } } } #endregion if (ds.Tables[sys_LogDtl.__TableName].Rows.Count > 0) return ds; return null; } /// /// 获取指定表跟踪的字段列表 /// /// 表名 public static DataTable GetLogFieldDef(string tableName) { return _MyBridge.GetLogFieldDef(tableName); } /// /// 获取指定表跟踪的字段列表 /// /// 表名 /// public static string[] GetTracedFields(string tableName) { var tracedFields = GetLogFieldDef(tableName); var fields = new string[tracedFields.Rows.Count]; for (var i = 0; i <= tracedFields.Rows.Count - 1; i++) fields[i] = tracedFields.Rows[i]["FieldName"].ToStringEx(); return fields; } /// /// 保存需要生成日志的字段数据 /// public static bool SaveFieldDef(DataTable data) { return _MyBridge.SaveFieldDef(data); } /// /// 搜索系统日志数据 /// /// 用户 /// 数据表名 /// 日志日期:由 /// 日志日期:至 /// public static DataSet SearchLog(string logUser, string tableName, string keyValue, DateTime dateFrom, DateTime dateTo) { return _MyBridge.SearchLog(logUser, tableName, keyValue, dateFrom, dateTo); } /// /// 保存资料表修改日志 /// /// 当前数据表 /// 当前数据表的主键字段名 public static bool WriteLog(DataTable originalData, string summaryTableName, string keyFieldName) { try { var result = false; var tracedFields = GetTracedFields(originalData.TableName); if (tracedFields.Length > 0) { var data = DoCompareTable(originalData, tracedFields, summaryTableName, keyFieldName); if (data != null && data.Tables.Count > 0) result = _MyBridge.SaveLog(data); } return result; } catch { return false; } } /// /// 保存资料表修改日志 /// /// 当前数据表 /// 当前数据表的主键字段名 /// public static bool WriteLog(DataSet originalData, string summaryTableName, string keyFieldName) { foreach (DataTable dt in originalData.Tables) WriteLog(dt, summaryTableName, keyFieldName); return true; } } }