1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
#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;
        }
    }
}