#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
|
/// **************************************************************************/
|
/// <summary>
|
/// 数据字典业务逻辑层基类
|
/// </summary>
|
public class bllBaseDataDict : bllBase
|
{
|
/// <summary>
|
/// 本次操作的数据(仅一条记录),当前绑定输入框的数据
|
/// </summary>
|
protected DataTable _DataBinder;
|
|
/// <summary>
|
/// 数据字典连接数据层的接口,派生类必须实例化对象!
|
/// </summary>
|
protected IBridge_DataDict _DataDictBridge;
|
|
/// <summary>
|
/// 主键字段名
|
/// </summary>
|
protected string _KeyFieldName = string.Empty;
|
|
/// <summary>
|
/// 数据字典(在表格内显示)
|
/// </summary>
|
protected DataTable _SummaryTable;
|
|
/// <summary>
|
/// 数据表名
|
/// </summary>
|
protected string _SummaryTableName = string.Empty;
|
|
/// <summary>
|
/// 标记是否保存数据操作日志
|
/// </summary>
|
protected bool _WriteDataLog = false;
|
|
/// <summary>
|
/// 绑定输入组件的数据源对象(DataTable),该表只有一条记录,用于数据修改页面的数据绑定。
|
/// </summary>
|
public DataTable DataBinder => _DataBinder;
|
|
/// <summary>
|
/// 当前绑定数据源的资料行
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 主键字段名
|
/// </summary>
|
public string KeyFieldName => _KeyFieldName;
|
|
/// <summary>
|
/// 最后保存生成的主键
|
/// </summary>
|
public string LastGeneratedKey { get; set; }
|
|
/// <summary>
|
/// 字典数据表,表格的数据源
|
/// </summary>
|
public DataTable SummaryTable => _SummaryTable;
|
|
|
/// <summary>
|
/// 主表名称
|
/// </summary>
|
public string SummaryTableName => _SummaryTableName;
|
|
/// <summary>
|
/// 检查主键是否存在
|
/// </summary>
|
/// <param name="keyValue">主键值</param>
|
/// <returns></returns>
|
public virtual bool CheckNoExists(string keyValue)
|
{
|
return _DataDictBridge.CheckNoExists(keyValue);
|
}
|
|
/// <summary>
|
/// 检查某个字段的值是否存在
|
/// </summary>
|
/// <param name="keyFieldName">字段名称</param>
|
/// <param name="keyValue">值</param>
|
/// <returns></returns>
|
public virtual bool CheckNoExists(string keyFieldName, string keyValue)
|
{
|
return _DataDictBridge.CheckNoExists(keyFieldName, keyValue);
|
}
|
|
/// <summary>
|
/// 创建用于绑定输入控件的数据源,基于性能优化,首先克隆缓存表,然后插入一条空记录作为新增状态下的数据源。
|
/// 若缓存表无数据,只能从数据库取空表,然后插入一条空记录作为新增状态下的数据源。
|
/// 若提供sourceRow参数,获取其主键,然后从数据库获取最新数据作为查看或修改状态下的数据源。
|
/// </summary>
|
/// <param name="sourceRow">主表表格当前记录</param>
|
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); //从数据库获取最新数据
|
}
|
}
|
|
/// <summary>
|
/// 删除一条记录
|
/// </summary>
|
/// <param name="keyValue">主键值</param>
|
/// <returns></returns>
|
public virtual bool Delete(string keyValue)
|
{
|
return _DataDictBridge.Delete(keyValue);
|
}
|
|
/// <summary>
|
/// 获取指定主键的数据字典
|
/// </summary>
|
/// <param name="keyValue">主键值</param>
|
/// <returns></returns>
|
public virtual DataTable GetDataByKey(string keyValue)
|
{
|
return _DataDictBridge.GetDataByKey(keyValue);
|
}
|
|
/// <summary>
|
/// 根据表名取资料表
|
/// </summary>
|
/// <param name="tableName">表名,如:tb_Customer</param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 获取数据字典参考数据,派生类必须重写GetLookupData方法
|
/// </summary>
|
/// <returns></returns>
|
public virtual DataTable GetLookupData()
|
{
|
return _DataDictBridge.GetLookupData();
|
}
|
|
/// <summary>
|
/// 获取数据字典
|
/// </summary>
|
/// <param name="resetCurrent">是否覆盖(重写)当前操作的数据字典(_SummaryTable)</param>
|
/// <returns></returns>
|
public virtual DataTable GetSummaryData(bool resetCurrent)
|
{
|
var data = _DataDictBridge.GetSummaryData();
|
SetDefault(data);
|
if (resetCurrent) _SummaryTable = data;
|
|
return data;
|
}
|
|
/// <summary>
|
/// 比较当前用户与制单人是否一致,或者是上级关系
|
/// </summary>
|
/// <param name="summaryRow">业务主表的当前记录</param>
|
/// <returns></returns>
|
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; //是否上级
|
}
|
|
/// <summary>
|
/// 设置缺省值
|
/// </summary>
|
/// <param name="data">数据表</param>
|
protected virtual void SetDefault(DataTable data)
|
{
|
}
|
|
/// <summary>
|
/// 批量提交多表数据
|
/// </summary>
|
/// <param name="batchData">数据集</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 外部通用方法,根据该表的模型提交数据
|
/// </summary>
|
/// <param name="data">数据</param>
|
/// <param name="ORM_Model">Model类,指定Dataset其中一个表的Model即可,如:typeof(tb_Customer)</param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 提交数据
|
/// </summary>
|
/// <param name="batchData">单个或多个数据表</param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 保存单表数据(当前操作的数据),预设保存方法。
|
/// </summary>
|
/// <param name="updateType">本次操作状态(新增/修改)</param>
|
/// <returns></returns>
|
public virtual bool Update()
|
{
|
_DataBinder.Rows[0].EndEdit();
|
return Update(_DataBinder.Copy());
|
}
|
|
/// <summary>
|
/// 更新公共字段的数据
|
/// </summary>
|
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;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 保存数据字典,返回由后台自动生成的主键。
|
/// </summary>
|
/// <param name="updateType">本次操作状态(新增/修改)</param>
|
/// <returns>返回结果</returns>
|
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;
|
}
|
}
|
}
|