#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;
}
}
}