#region
using System;
using System.Data;
using CSFrameworkV5.Business.BLL_Permission;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
using CSFrameworkV5.DataAccess;
using CSFrameworkV5.Interfaces;
#endregion
namespace CSFrameworkV5.Business
{
/// *************************************************************************/
/// *
/// * 文件名 :bllBaseDataDict.cs
/// * 程序说明 : 数据字典业务逻辑层基类
/// * 原创作者 :www.csframework.com
/// *
/// * Copyright 2006-2021 C/S框架网 www.csframework.com
/// **************************************************************************/
///
/// 数据字典业务逻辑层基类
///
public class bllBaseDataDict : bllBase
{
///
/// 本次操作的数据(仅一条记录),当前绑定输入框的数据
///
protected DataTable _DataBinder;
///
/// 数据字典连接数据层的接口,派生类必须实例化对象!
///
protected IBridge_DataDict _DataDictBridge;
///
/// 主键字段名
///
protected string _KeyFieldName = string.Empty;
///
/// 数据字典(在表格内显示)
///
protected DataTable _SummaryTable;
///
/// 数据表名
///
protected string _SummaryTableName = string.Empty;
///
/// 标记是否保存数据操作日志
///
protected bool _WriteDataLog = false;
///
/// 绑定输入组件的数据源对象(DataTable),该表只有一条记录,用于数据修改页面的数据绑定。
///
public DataTable DataBinder => _DataBinder;
///
/// 当前绑定数据源的资料行
///
public DataRow DataBinderRow
{
get
{
if (_DataBinder != null && _DataBinder.Rows.Count > 0)
return _DataBinder.Rows[0];
return null;
}
}
public IBridge_DataDict DataDictBridge
{
get => _DataDictBridge;
set => _DataDictBridge = value;
}
///
/// 主键字段名
///
public string KeyFieldName => _KeyFieldName;
///
/// 最后保存生成的主键
///
public string LastGeneratedKey { get; set; }
///
/// 字典数据表,表格的数据源
///
public DataTable SummaryTable => _SummaryTable;
///
/// 主表名称
///
public string SummaryTableName => _SummaryTableName;
///
/// 检查主键是否存在
///
/// 主键值
///
public virtual bool CheckNoExists(string keyValue)
{
return _DataDictBridge.CheckNoExists(keyValue);
}
///
/// 检查某个字段的值是否存在
///
/// 字段名称
/// 值
///
public virtual bool CheckNoExists(string keyFieldName, string keyValue)
{
return _DataDictBridge.CheckNoExists(keyFieldName, keyValue);
}
///
/// 创建用于绑定输入控件的数据源,基于性能优化,首先克隆缓存表,然后插入一条空记录作为新增状态下的数据源。
/// 若缓存表无数据,只能从数据库取空表,然后插入一条空记录作为新增状态下的数据源。
/// 若提供sourceRow参数,获取其主键,然后从数据库获取最新数据作为查看或修改状态下的数据源。
///
/// 主表表格当前记录
public virtual void CreateDataBinder(DataRow sourceRow)
{
if (sourceRow == null)
{
if (_SummaryTable != null)
{
_DataBinder = _SummaryTable.Clone();
_DataBinder.Rows.Add(_DataBinder.NewRow()); //插入一条空记录
}
else
{
_DataBinder = GetDataByKey("-"); //从数据库取空表
_DataBinder.Rows.Add(_DataBinder.NewRow()); //插入一条空记录
}
}
else
{
var key = ConvertEx.ToString(sourceRow[_KeyFieldName]); //获取主键
_DataBinder = GetDataByKey(key); //从数据库获取最新数据
}
}
///
/// 删除一条记录
///
/// 主键值
///
public virtual bool Delete(string keyValue)
{
return _DataDictBridge.Delete(keyValue);
}
///
/// 获取指定主键的数据字典
///
/// 主键值
///
public virtual DataTable GetDataByKey(string keyValue)
{
return _DataDictBridge.GetDataByKey(keyValue);
}
///
/// 根据表名取资料表
///
/// 表名,如:tb_Customer
///
public static DataTable GetDataDictByTableName(string tableName)
{
var bridge =
BridgeFactory.CreateDataDictBridge(tableName,
Loginer.CurrentUser.DBID);
return bridge.GetDataDictByTableName(tableName);
}
public static DataTable GetDataDictBySql(string tableName)
{
var bridge =
BridgeFactory.CreateDataDictBridge(tableName,
Loginer.CurrentUser.DBID);
return bridge.GetDataDictBySql(tableName);
}
///
/// 获取数据字典参考数据,派生类必须重写GetLookupData方法
///
///
public virtual DataTable GetLookupData()
{
return _DataDictBridge.GetLookupData();
}
///
/// 获取数据字典
///
/// 是否覆盖(重写)当前操作的数据字典(_SummaryTable)
///
public virtual DataTable GetSummaryData(bool resetCurrent)
{
var data = _DataDictBridge.GetSummaryData();
SetDefault(data);
if (resetCurrent) _SummaryTable = data;
return data;
}
///
/// 比较当前用户与制单人是否一致,或者是上级关系
///
/// 业务主表的当前记录
///
public virtual bool IsOwnerChange(DataRow summaryRow)
{
//管理员可修改
if (Loginer.CurrentUser.IsAdmin()) return true;
//无此字段,可修改
if (summaryRow.Table.Columns[CommonFields.CreatedBy] == null)
return true;
var user =
ConvertEx.ToString(summaryRow[CommonFields.CreatedBy]); //取制单人
//比较当前用户与制单人是否一致
var isSelf = user.ToUpper() ==
Loginer.CurrentUser.Account.ToUpper();
if (isSelf) return true; //本人
var isOwner =
new bllPermission().IsOwner(user, Loginer.CurrentUser.Account);
return isOwner; //是否上级
}
///
/// 设置缺省值
///
/// 数据表
protected virtual void SetDefault(DataTable data)
{
}
///
/// 批量提交多表数据
///
/// 数据集
///
public virtual bool Update(DataSet batchData)
{
//更新公共数据
foreach (DataTable dt in batchData.Tables)
UpdateDetailCommonValue(dt);
//调用数据层的方法提交数据
var result = _DataDictBridge.Update(batchData);
LastGeneratedKey = _DataDictBridge.LastGeneratedKey;
//如启用日志功能记录本次修改
if (_WriteDataLog && result &&
batchData.Tables[_SummaryTableName] != null)
LogEditHistory.WriteLog(batchData.Tables[_SummaryTableName],
_SummaryTableName, _KeyFieldName); //保存修改日志
return result;
}
///
/// 外部通用方法,根据该表的模型提交数据
///
/// 数据
/// Model类,指定Dataset其中一个表的Model即可,如:typeof(tb_Customer)
///
public static bool Update(DataTable data, Type ORM_Model)
{
var bridge = BridgeFactory.CreateDataDictBridge(ORM_Model);
var ds = new DataSet();
ds.Tables.Add(data.Copy());
return bridge.Update(ds);
}
///
/// 提交数据
///
/// 单个或多个数据表
///
public virtual bool Update(DataTable data)
{
//创建一个副本用于保存
var ds = new DataSet();
ds.Tables.Add(data.Copy());
//更新通用字段的数据
foreach (DataTable dt in ds.Tables) UpdateDetailCommonValue(dt);
//调用数据层的方法提交数据
var result = _DataDictBridge.Update(ds);
//如启用日志功能记录本次修改
if (_WriteDataLog && result)
LogEditHistory.WriteLog(data, _SummaryTableName,
_KeyFieldName); //保存修改日志
return result;
}
///
/// 保存单表数据(当前操作的数据),预设保存方法。
///
/// 本次操作状态(新增/修改)
///
public virtual bool Update()
{
_DataBinder.Rows[0].EndEdit();
return Update(_DataBinder.Copy());
}
///
/// 更新公共字段的数据
///
protected virtual void UpdateDetailCommonValue(DataTable detail)
{
var d = _DataDictBridge.GetServerTime();
foreach (DataRow row in detail.Rows)
{
if (row.RowState == DataRowState.Deleted) continue;
//新增状态,更新4个通用字段的值,创建人和日期,最后修改人和日期
if (row.RowState == DataRowState.Added)
{
if (detail.Columns[CommonFields.CreatedBy] != null)
row[CommonFields.CreatedBy] =
Loginer.CurrentUser.Account;
if (detail.Columns[CommonFields.CreationDate] != null)
row[CommonFields.CreationDate] = d;
if (detail.Columns[CommonFields.LastUpdatedBy] != null)
row[CommonFields.LastUpdatedBy] =
Loginer.CurrentUser.Account;
if (detail.Columns[CommonFields.LastUpdateDate] != null)
row[CommonFields.LastUpdateDate] = d;
}
//修改状态,更新最后修改人和日期
if (row.RowState == DataRowState.Modified)
{
if (detail.Columns[CommonFields.LastUpdatedBy] != null)
row[CommonFields.LastUpdatedBy] =
Loginer.CurrentUser.Account;
if (detail.Columns[CommonFields.LastUpdateDate] != null)
row[CommonFields.LastUpdateDate] = d;
}
}
}
///
/// 保存数据字典,返回由后台自动生成的主键。
///
/// 本次操作状态(新增/修改)
/// 返回结果
public virtual SaveResultEx UpdateEx()
{
_DataBinder.Rows[0].EndEdit();
//创建一个副本用于保存
var data = new DataSet();
data.Tables.Add(_DataBinder.Copy());
//更新公共字段的数据
foreach (DataTable dt in data.Tables) UpdateDetailCommonValue(dt);
//调用数据层的方法提交数据
var result = _DataDictBridge.UpdateEx(data);
//如启用日志功能记录本次修改
if (_WriteDataLog && result.Success)
LogEditHistory.WriteLog(_DataBinder, _SummaryTableName,
_KeyFieldName); //保存修改日志
return result;
}
public virtual SaveResultEx UpdateEx(DataSet data)
{
//更新公共字段的数据
foreach (DataTable dt in data.Tables) UpdateDetailCommonValue(dt);
//调用数据层的方法提交数据
var result = _DataDictBridge.UpdateEx(data);
//如启用日志功能记录本次修改
if (_WriteDataLog && result.Success)
LogEditHistory.WriteLog(_DataBinder, _SummaryTableName,
_KeyFieldName); //保存修改日志
return result;
}
}
}