From 4d7af5bedfb6c1105ace9aab9eccb75a04f1e2a6 Mon Sep 17 00:00:00 2001 From: yubaolee Date: Wed, 25 Aug 2021 01:42:37 +0800 Subject: [PATCH] =?UTF-8?q?fix=20issue=20#I42IFB=20=E8=8E=B7=E5=8F=96Oracl?= =?UTF-8?q?e=E7=BB=93=E6=9E=84=E5=BC=82=E5=B8=B8=20fix=20issue=20#I462OD?= =?UTF-8?q?=20JSON=E8=A7=A3=E6=9E=90=E5=BC=82=E5=B8=B8=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=BB=E8=A1=A8ParentId=EF=BC=8C=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0=E4=B8=BB=E3=80=81=E4=BB=8E?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=20=E5=8F=AF=E4=BB=A5=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=8E=A7=E5=88=B6=E5=A4=8D=E6=9D=82=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=BC=96=E8=BE=91=E6=9D=83=E9=99=90=EF=BC=8C?= =?UTF-8?q?=E9=87=87=E7=94=A8=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E7=9A=84?= =?UTF-8?q?=E8=A1=A8=E5=AE=9A=E4=B9=89=E6=9D=A5=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthStrategies/AuthStrategyContext.cs | 18 ++++- .../AuthStrategies/NormalAuthStrategy.cs | 18 +++++ .../AuthStrategies/SystemAuthStrategy.cs | 5 ++ OpenAuth.App/Base/TableData.cs | 12 +++- OpenAuth.App/BuilderTable/BuilderTableApp.cs | 43 +++++++++--- .../Request/AddOrUpdateBuilderTableReq.cs | 11 +++ OpenAuth.App/DbExtension.cs | 70 +++++++++++++++++-- .../Response/FlowVerificationResp.cs | 10 ++- OpenAuth.App/Interface/IAuthStrategy.cs | 9 +++ .../WmsInbound/WmsInboundOrderDtblApp.cs | 13 ++-- .../WmsInbound/WmsInboundOrderTblApp.cs | 16 +++-- OpenAuth.Repository/Domain/BuilderTable.cs | 19 +++++ 12 files changed, 217 insertions(+), 27 deletions(-) diff --git a/OpenAuth.App/AuthStrategies/AuthStrategyContext.cs b/OpenAuth.App/AuthStrategies/AuthStrategyContext.cs index c96cd17f..ad79ce67 100644 --- a/OpenAuth.App/AuthStrategies/AuthStrategyContext.cs +++ b/OpenAuth.App/AuthStrategies/AuthStrategyContext.cs @@ -15,6 +15,7 @@ // // *********************************************************************** +using System; using System.Collections.Generic; using Infrastructure; using OpenAuth.App.Response; @@ -62,11 +63,26 @@ namespace OpenAuth.App { get { return _strategy.Orgs; } } - + /// + /// 获取角色可以访问的字段信息,只是单纯的获取数据库 + /// + /// + /// + [Obsolete("请使用GetTableColumns代替")] public List GetProperties(string moduleCode) { return _strategy.GetProperties(moduleCode); } + + /// + /// 获取角色可以访问的字段信息 + /// + /// + /// + public List GetTableColumns(string moduleCode) + { + return _strategy.GetTableColumns(moduleCode); + } } diff --git a/OpenAuth.App/AuthStrategies/NormalAuthStrategy.cs b/OpenAuth.App/AuthStrategies/NormalAuthStrategy.cs index dad26d38..106a9a9d 100644 --- a/OpenAuth.App/AuthStrategies/NormalAuthStrategy.cs +++ b/OpenAuth.App/AuthStrategies/NormalAuthStrategy.cs @@ -141,6 +141,24 @@ namespace OpenAuth.App return allprops.Where(u => props.Contains(u.Key)).ToList(); } + public List GetTableColumns(string moduleCode) + { + var allprops = UnitWork.Find(u => u.TableName.ToLower() == moduleCode.ToLower()); + + //如果是系统模块,直接返回所有字段。防止开发者把模块配置成系统模块,还在外层调用loginContext.GetProperties("xxxx"); + bool? isSysModule = UnitWork.FirstOrDefault(u => u.Code == moduleCode)?.IsSys; + if (isSysModule!= null && isSysModule.Value) + { + return allprops.ToList(); + } + + var props =UnitWork.Find(u => + u.Key == Define.ROLEDATAPROPERTY && _userRoleIds.Contains(u.FirstId) && u.SecondId == moduleCode) + .Select(u => u.ThirdId); + + return allprops.Where(u => props.Contains(u.ColumnName)).ToList(); + } + //用户角色 public NormalAuthStrategy(IUnitWork unitWork, IRepository repository, DbExtension dbExtension) : base(unitWork, repository,null) diff --git a/OpenAuth.App/AuthStrategies/SystemAuthStrategy.cs b/OpenAuth.App/AuthStrategies/SystemAuthStrategy.cs index c0a3165b..05f637ef 100644 --- a/OpenAuth.App/AuthStrategies/SystemAuthStrategy.cs +++ b/OpenAuth.App/AuthStrategies/SystemAuthStrategy.cs @@ -97,6 +97,11 @@ namespace OpenAuth.App return _dbExtension.GetProperties(moduleCode); } + public List GetTableColumns(string moduleCode) + { + return UnitWork.Find(u => u.TableName.ToLower() == moduleCode.ToLower()).ToList(); + } + public SystemAuthStrategy(IUnitWork unitWork, IRepository repository, DbExtension dbExtension) : base(unitWork, repository, null) { diff --git a/OpenAuth.App/Base/TableData.cs b/OpenAuth.App/Base/TableData.cs index 63f6e171..ef814b70 100644 --- a/OpenAuth.App/Base/TableData.cs +++ b/OpenAuth.App/Base/TableData.cs @@ -12,8 +12,10 @@ // layui datatable数据返回 // *********************************************************************** +using System; using System.Collections.Generic; using Infrastructure; +using OpenAuth.Repository.Domain; namespace OpenAuth.App.Response { @@ -37,9 +39,16 @@ namespace OpenAuth.App.Response public int count { get; set; } /// - /// 返回的列表头信息 + /// 返回的列表头信息(已过时,请使用columnFields代替) /// + [Obsolete("请使用ColumnFields以获得更丰富的配置信息")] public List columnHeaders; + + /// + /// 返回的表格列定义 + /// 该属性基于代码生成使用的列定义 + /// + public List columnFields; /// /// 数据内容 @@ -51,6 +60,7 @@ namespace OpenAuth.App.Response code = 200; msg = "加载成功"; columnHeaders = new List(); + columnFields = new List(); } } } \ No newline at end of file diff --git a/OpenAuth.App/BuilderTable/BuilderTableApp.cs b/OpenAuth.App/BuilderTable/BuilderTableApp.cs index 4d445044..0a595a42 100644 --- a/OpenAuth.App/BuilderTable/BuilderTableApp.cs +++ b/OpenAuth.App/BuilderTable/BuilderTableApp.cs @@ -117,16 +117,35 @@ namespace OpenAuth.App throw new Exception("命名空间不能为空"); } - var columns = _dbExtension.GetDbTableStructure(req.TableName); - if (!columns.Any()) - { - throw new Exception($"未能找到{req.TableName}表结构定义"); - } + var obj = AddTableAndColumns(req.MapTo()); - var obj = req.MapTo(); + //创建子表 + if (!string.IsNullOrEmpty(req.DetailTableName)) + { + AddTableAndColumns(new BuilderTable + { + TableName = req.DetailTableName, + ParentTableId = obj.Id, + Namespace = "OpenAuth.Repository.Domain", + ModuleName = req.DetailTableName, + Folder = req.Folder, + TypeId = req.TypeId, + TypeName = req.TypeName + }); + } + + UnitWork.Save(); + return obj.Id; + } + + /// + /// 添加表结构及字段结构记录 + /// + private BuilderTable AddTableAndColumns(BuilderTable obj) + { if (string.IsNullOrEmpty(obj.ClassName)) obj.ClassName = obj.TableName; if (string.IsNullOrEmpty(obj.ModuleCode)) obj.ModuleCode = obj.TableName; - + //todo:补充或调整自己需要的字段 obj.CreateTime = DateTime.Now; var user = _auth.GetCurrentUser().User; @@ -134,6 +153,11 @@ namespace OpenAuth.App obj.CreateUserName = user.Name; UnitWork.Add(obj); + var columns = _dbExtension.GetDbTableStructure(obj.TableName); + if (!columns.Any()) + { + throw new Exception($"未能找到{obj.TableName}表结构定义"); + } foreach (var column in columns) { var builderColumn = new BuilderTableColumn @@ -160,8 +184,7 @@ namespace OpenAuth.App UnitWork.Add(builderColumn); } - UnitWork.Save(); - return obj.Id; + return obj; } public void Update(AddOrUpdateBuilderTableReq obj) @@ -181,6 +204,8 @@ namespace OpenAuth.App Options = obj.Options, TypeId = obj.TypeId, TypeName = obj.TypeName, + IsDynamicHeader = obj.IsDynamicHeader, + ForeignKey = obj.ForeignKey, UpdateTime = DateTime.Now, UpdateUserId = user.Id, UpdateUserName = user.Name diff --git a/OpenAuth.App/BuilderTable/Request/AddOrUpdateBuilderTableReq.cs b/OpenAuth.App/BuilderTable/Request/AddOrUpdateBuilderTableReq.cs index baa39c61..94f79a00 100644 --- a/OpenAuth.App/BuilderTable/Request/AddOrUpdateBuilderTableReq.cs +++ b/OpenAuth.App/BuilderTable/Request/AddOrUpdateBuilderTableReq.cs @@ -74,5 +74,16 @@ namespace OpenAuth.App.Request /// 分类名称 /// public string TypeName { get; set; } + + /// + /// 是否动态加载表头信息 + /// + public bool IsDynamicHeader { get; set; } + + + /// + /// 子表外键 + /// + public string ForeignKey { get; set; } } } \ No newline at end of file diff --git a/OpenAuth.App/DbExtension.cs b/OpenAuth.App/DbExtension.cs index 46392a79..a53331cd 100644 --- a/OpenAuth.App/DbExtension.cs +++ b/OpenAuth.App/DbExtension.cs @@ -114,17 +114,79 @@ namespace OpenAuth.App { return GetMySqlStructure(tableName); } - else + else if (dbtype == Define.DBTYPE_SQLSERVER) { return GetSqlServerStructure(tableName); } + else + { + return GetOracleStructure(tableName); + } } - + + /// + /// 获取Oracle表结构 + /// + private IList GetOracleStructure(string tableName) + { + var sql = $@" +select utc.column_name as COLUMNNAME, + utc.data_type COLUMNTYPE, + utc.data_length MaxLength, + CASE utc.nullable WHEN 'N' THEN 0 ELSE 1 END IsNull, + utc.data_default DEFAULTVAL, + ucc.comments ""COMMENT"", + UTC.table_name TABLENAME, + CASE UTC.COLUMN_NAME + WHEN (select col.column_name + from user_constraints con, + user_cons_columns col + where con.constraint_name = col.constraint_name + and con.constraint_type = 'P' + and col.table_name = '{ tableName}') THEN 1 + ELSE 0 END AS IsKey, + CASE + WHEN data_type IN ('BIT', 'BOOL') THEN + 'bool' + WHEN data_type in ('SMALLINT') THEN 'short' + WHEN data_type in ('TINYINT') THEN 'bool' + WHEN data_type IN ('NUMBER', 'CHAR', 'INT', 'Year') THEN + 'int' + WHEN data_type in ('BIGINT') THEN + 'bigint' + WHEN data_type IN ('FLOAT', 'DOUBLE', 'DECIMAL') THEN + 'decimal' + WHEN data_type IN + ('CHAR', 'VARCHAR', 'TINY TEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TINYBLOB', 'BLOB', + 'MEDIUMBLOB', 'LONGBLOB', 'Time') THEN + 'string' + WHEN data_type IN ('Date', 'DateTime', 'TIMESTAMP(6)') THEN + 'DateTime' + ELSE 'string' + END AS EntityType + from user_tab_columns utc, + user_col_comments ucc + where utc.table_name = ucc.table_name + and utc.column_name = ucc.column_name + and utc.table_name = '{ tableName}' + order by column_id; "; + + foreach (var context in _contexts) + { + var columns = context.Query().FromSqlRaw(sql); + var columnList = columns?.ToList(); + if (columnList != null && columnList.Any()) + { + return columnList; + } + } + + return new List(); + } + /// /// 获取Mysql表结构信息 /// - /// - /// private IList GetMySqlStructure(string tableName) { var sql = $@"SELECT DISTINCT diff --git a/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs b/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs index c54c9869..00a0527d 100644 --- a/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs +++ b/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs @@ -17,7 +17,15 @@ namespace OpenAuth.App.Response /// public string FrmHtml { - get { return FormUtil.GetHtml(this.FrmContentData, this.FrmContentParse, this.FrmData, "",this.CanWriteFormItemIds); } + get + { + if (this.FrmType != 0) //只有开原版动态表单才需要转换 + { + return string.Empty; + } + + return FormUtil.GetHtml(this.FrmContentData, this.FrmContentParse, this.FrmData, "",this.CanWriteFormItemIds); + } } /// diff --git a/OpenAuth.App/Interface/IAuthStrategy.cs b/OpenAuth.App/Interface/IAuthStrategy.cs index 94e5952c..9177240b 100644 --- a/OpenAuth.App/Interface/IAuthStrategy.cs +++ b/OpenAuth.App/Interface/IAuthStrategy.cs @@ -15,6 +15,7 @@ // *********************************************************************** +using System; using System.Collections.Generic; using Infrastructure; using OpenAuth.App.Response; @@ -44,7 +45,15 @@ namespace OpenAuth.App /// /// /// + [Obsolete("请使用GetTableColumns代替")] List GetProperties(string moduleCode); + /// + /// 获取角色可以访问的字段信息 + /// + /// + /// + List GetTableColumns(string moduleCode); + } } \ No newline at end of file diff --git a/OpenAuth.App/WmsInbound/WmsInboundOrderDtblApp.cs b/OpenAuth.App/WmsInbound/WmsInboundOrderDtblApp.cs index 80f8c8e2..58c5345a 100644 --- a/OpenAuth.App/WmsInbound/WmsInboundOrderDtblApp.cs +++ b/OpenAuth.App/WmsInbound/WmsInboundOrderDtblApp.cs @@ -29,10 +29,11 @@ namespace OpenAuth.App throw new CommonException("登录已过期", Define.INVALID_TOKEN); } - //todo:普通账号如何分配明细的字段????先写死😰 - - var properties = _dbExtension.GetProperties("WmsInboundOrderDtbl"); - + var properties = loginContext.GetTableColumns("WmsInboundOrderDtbl"); + if (properties == null || properties.Count == 0) + { + throw new Exception("请在代码生成界面配置WmsInboundOrderDtbl表的字段属性"); + } var result = new TableData(); var objs = UnitWork.Find(null); if (!string.IsNullOrEmpty(request.InboundOrderId)) @@ -45,8 +46,8 @@ namespace OpenAuth.App objs = objs.Where(u => u.GoodsId.Contains(request.key)); } - var propertyStr = string.Join(',', properties.Select(u => u.Key)); - result.columnHeaders = properties; + var propertyStr = string.Join(',', properties.Select(u => u.ColumnName)); + result.columnFields = properties; result.data = objs.OrderBy(u => u.Id) .Skip((request.page - 1) * request.limit) .Take(request.limit).Select($"new ({propertyStr})"); diff --git a/OpenAuth.App/WmsInbound/WmsInboundOrderTblApp.cs b/OpenAuth.App/WmsInbound/WmsInboundOrderTblApp.cs index 88edc936..0b4e3b7b 100644 --- a/OpenAuth.App/WmsInbound/WmsInboundOrderTblApp.cs +++ b/OpenAuth.App/WmsInbound/WmsInboundOrderTblApp.cs @@ -29,22 +29,28 @@ namespace OpenAuth.App } var properties = loginContext.GetProperties("WmsInboundOrderTbl"); - if (properties == null || properties.Count == 0) { throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置"); } - - + + var columns = loginContext.GetTableColumns("WmsInboundOrderTbl"); + if (columns == null || columns.Count == 0) + { + throw new Exception("请在代码生成界面配置WmsInboundOrderTbl表的字段属性"); + } + var result = new TableData(); + + result.columnHeaders = properties; + result.columnFields = columns; + var objs = GetDataPrivilege("u"); if (!string.IsNullOrEmpty(request.key)) { objs = objs.Where(u => u.Id.Contains(request.key)); } - var propertyStr = string.Join(',', properties.Select(u => u.Key)); - result.columnHeaders = properties; result.data = objs.OrderBy(u => u.Id) .Skip((request.page - 1) * request.limit) .Take(request.limit).Select($"new ({propertyStr})"); diff --git a/OpenAuth.Repository/Domain/BuilderTable.cs b/OpenAuth.Repository/Domain/BuilderTable.cs index 25204304..79461dc4 100644 --- a/OpenAuth.Repository/Domain/BuilderTable.cs +++ b/OpenAuth.Repository/Domain/BuilderTable.cs @@ -138,5 +138,24 @@ namespace OpenAuth.Repository.Domain /// [Description("创建人姓名")] public string CreateUserName { get; set; } + + /// + /// 是否动态加载表头信息 + /// + [Description("是否动态加载表头信息")] + public bool IsDynamicHeader { get; set; } + + + /// + /// 字表外键 + /// + [Description("字表外键")] + public string ForeignKey { get; set; } + + /// + /// 主表ID,如果为空表示为主表 + /// + [Description("主表ID,如果为空表示为主表")] + public string ParentTableId { get; set; } } } \ No newline at end of file