#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
|
{
|
/// <summary>
|
/// 修改数据历史记录日志-修改数据日志
|
/// </summary>
|
public class LogEditHistory
|
{
|
private static IBridge_EditLogHistory _MyBridge;
|
|
/// <summary>
|
/// 静态构造器
|
/// </summary>
|
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);
|
}
|
|
/// <summary>
|
/// 比较新/旧数据,有变动数据自动生成对应的日志.
|
/// </summary>
|
/// <param name="originalData">当前数据表</param>
|
/// <param name="tracedFields">当前数据表的日志配置字段</param>
|
/// <param name="keyFieldName">当前数据表的主键字段名</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 获取指定表跟踪的字段列表
|
/// </summary>
|
/// <param name="tableName">表名</param>
|
public static DataTable GetLogFieldDef(string tableName)
|
{
|
return _MyBridge.GetLogFieldDef(tableName);
|
}
|
|
/// <summary>
|
/// 获取指定表跟踪的字段列表
|
/// </summary>
|
/// <param name="tableName">表名</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 保存需要生成日志的字段数据
|
/// </summary>
|
public static bool SaveFieldDef(DataTable data)
|
{
|
return _MyBridge.SaveFieldDef(data);
|
}
|
|
/// <summary>
|
/// 搜索系统日志数据
|
/// </summary>
|
/// <param name="logUser">用户</param>
|
/// <param name="tableName">数据表名</param>
|
/// <param name="dateFrom">日志日期:由</param>
|
/// <param name="dateTo">日志日期:至</param>
|
/// <returns></returns>
|
public static DataSet SearchLog(string logUser, string tableName,
|
string keyValue, DateTime dateFrom,
|
DateTime dateTo)
|
{
|
return _MyBridge.SearchLog(logUser, tableName, keyValue, dateFrom,
|
dateTo);
|
}
|
|
/// <summary>
|
/// 保存资料表修改日志
|
/// </summary>
|
/// <param name="originalData">当前数据表</param>
|
/// <param name="keyFieldName">当前数据表的主键字段名</param>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 保存资料表修改日志
|
/// </summary>
|
/// <param name="originalData">当前数据表</param>
|
/// <param name="keyFieldName">当前数据表的主键字段名</param>
|
/// <returns></returns>
|
public static bool WriteLog(DataSet originalData,
|
string summaryTableName, string keyFieldName)
|
{
|
foreach (DataTable dt in originalData.Tables)
|
WriteLog(dt, summaryTableName, keyFieldName);
|
|
return true;
|
}
|
}
|
}
|