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