读取系统中的dll文件和xml文件,识别为对应的数据字典

后端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using Abp.Application.Services.Dto;
using Abp.Collections.Extensions;
using Abp.Domain.Entities;
using Abp.Domain.Entities.Auditing;
using Abp.UI;
using BM.ERP.Sys.DatabaseTables.Dto;
using BM.ERP.Sys.Notices;

namespace BM.ERP.Sys.DatabaseTables
{
public class DatabaseTableAppService: ERPAppServiceBase,IDatabaseTableAppService
{
/// <summary>
/// 查询列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<PagedResultDto<DatabaseTableDto>> GetAll(GetAllInput input)
{
List<DatabaseTableDto> allTables = new List<DatabaseTableDto>();
allTables = GetAllTables(allTables);
var list = allTables.WhereIf(!string.IsNullOrEmpty(input.TName), p => !string.IsNullOrEmpty(p.TName) && p.TName.ToUpper().Contains(input.TName.ToUpper()))
.WhereIf(!string.IsNullOrEmpty(input.TRemark), p => !string.IsNullOrEmpty(p.TRemark) && p.TRemark.ToUpper().Contains(input.TRemark.ToUpper()))
.ToList();
var count = list.Count();
var dtos = list.OrderBy(p=>p.TName).Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
if (dtos != null)
{
return new PagedResultDto<DatabaseTableDto>(count, dtos);
}
else
{
return new PagedResultDto<DatabaseTableDto>(0, new List<DatabaseTableDto>());
}
}


/// <summary>
/// 查询列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<PagedResultDto<GetDetailsDatabaseTableDto>> GetDetails(GetDetailsInput input)
{
List<DatabaseTableDto> allTables = new List<DatabaseTableDto>();
allTables = GetAllTables(allTables);

List<GetDetailsDatabaseTableDto> allTableDetails = new List<GetDetailsDatabaseTableDto>();
foreach (var table in allTables)
{
foreach (var detail in table.PTables)
{
allTableDetails.Add(new GetDetailsDatabaseTableDto()
{
PName = detail.PName,
PRemark=detail.PRemark,
PAllName=detail.PAllName,
TName=table.TName,
TRemark=table.TRemark,
TAllName=table.TAllName,
PType=detail.PType,
PISNull=detail.PISNull,
PMaxLength=detail.PMaxLength
});
}
}

var list = allTableDetails.WhereIf(!string.IsNullOrEmpty(input.TName), p => !string.IsNullOrEmpty(p.TName)&& p.TName.ToUpper() == input.TName.ToUpper())
.WhereIf(!string.IsNullOrEmpty(input.TRemark), p => !string.IsNullOrEmpty(p.TRemark) && p.TRemark.ToUpper().Contains(input.TRemark.ToUpper()))
.WhereIf(!string.IsNullOrEmpty(input.PName), p => !string.IsNullOrEmpty(p.PName) && p.PName.ToUpper().Contains(input.PName.ToUpper()))
.WhereIf(!string.IsNullOrEmpty(input.PRemark), p => !string.IsNullOrEmpty(p.PRemark) && p.PRemark.ToUpper().Contains(input.PRemark.ToUpper()))
.ToList();
var count = list.Count();
var dtos = list.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
if (dtos != null)
{
return new PagedResultDto<GetDetailsDatabaseTableDto>(count, dtos);
}
else
{
return new PagedResultDto<GetDetailsDatabaseTableDto>(0, new List<GetDetailsDatabaseTableDto>());
}
}
public List<DatabaseTableDto> GetAllTables(List<DatabaseTableDto> allTables) {
var types = Assembly.Load("BM.ERP.Core").GetTypes();
foreach (var type in types)
{
if (HasImplementedRawGeneric(type, typeof(Entity<>)))
{
DatabaseTableDto tables = new DatabaseTableDto()
{
TName = type.Name,
PTables = new List<DataTableProperty>()
};
PropertyInfo[] properties = type.GetProperties();
foreach (var property in properties)
{

StringLengthAttribute IsStringLengthAtt = (StringLengthAttribute)property.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault();
var IsRequired = property.GetCustomAttributes(typeof(RequiredAttribute), false).Any();
tables.PTables.Add(new DataTableProperty()
{
PName = property.Name,
PType = GetType( property.PropertyType.FullName.ToString()),
PISNull= !IsRequired,
PMaxLength=IsStringLengthAtt==null?null: IsStringLengthAtt.MaximumLength.ToString()
});

}
allTables.Add(tables);
}
}

allTables = GetXMLInfo(allTables);
return allTables;
}
public string GetType(string fullType)
{
if (fullType == null)
{
return fullType;
}
else if (fullType.ToUpper().Contains("DATETIME"))
{
return "DateTime";
}
else if (fullType.ToUpper().Contains("STRING"))
{
return "String";
}
else if (fullType.ToUpper().Contains("BOOLEAN"))
{
return "Boolean";
}
else if (fullType.ToUpper().Contains("INT"))
{
return "Int";
}
else if (fullType.ToUpper().Contains("GUID"))
{
return "Guid";
}
else if (fullType.ToUpper().Contains("SINGLE"))
{
return "Single";
}
else if (fullType.ToUpper().Contains("DOUBLE"))
{
return "Double";
}
else if (fullType.ToUpper().Contains("LIST"))
{
return "List";
}
else if (fullType.ToUpper().Contains("COLLECTION"))
{
return "Collection";
}
else if (fullType.ToUpper().Contains("DECIMAL"))
{
return "Decimal";
}
else
{
return fullType;
}
}
/// <summary>
/// 判断指定的类型 <paramref name="type"/> 是否是指定泛型类型的子类型,或实现了指定泛型接口。
/// </summary>
/// <param name="type">需要测试的类型。</param>
/// <param name="generic">泛型接口类型,传入 typeof(IXxx&lt;&gt;)</param>
/// <returns>如果是泛型接口的子类型,则返回 true,否则返回 false。</returns>
public static bool HasImplementedRawGeneric( Type type, Type generic)
{
if (type == null) throw new ArgumentNullException(nameof(type));
if (generic == null) throw new ArgumentNullException(nameof(generic));

// 测试接口。
var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
if (isTheRawGenericType) return true;

// 测试类型。
while (type != null && type != typeof(object))
{
isTheRawGenericType = IsTheRawGenericType(type);
if (isTheRawGenericType) return true;
type = type.BaseType;
}

// 没有找到任何匹配的接口或类型。
return false;

// 测试某个类型是否是指定的原始接口。
bool IsTheRawGenericType(Type test)
=> generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test);
}
/// <summary>
/// 获取对应的注释
/// </summary>
/// <param name="allTables"></param>
/// <returns></returns>
public List<DatabaseTableDto> GetXMLInfo(List<DatabaseTableDto> allTables)
{
try
{
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var fileNamePath = "bin\\BM.ERP.Core.xml";
var filePath = Path.Combine(baseDirectory, fileNamePath);

if (!File.Exists(filePath))
{
throw new UserFriendlyException("未找到相关文件");
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
XmlNode root = xmlDoc.SelectSingleNode("doc").SelectSingleNode("members");
//获取到所有<users>的子节点
XmlNodeList nodeList = root.SelectNodes("member");

//遍历所有子节点
foreach (XmlNode xmlNode in nodeList)
{
var name = xmlNode.Attributes["name"].Value;
var realName = name.Substring(name.LastIndexOf(".") + 1);//表名
var table = allTables.FirstOrDefault(p => p.TName == realName);
if (table!=null&&table.TName == realName && name.Contains("T:BM.ERP"))
{
XmlNode child = xmlNode.SelectSingleNode("summary");
if (child == null)
{
continue;
}
table.TRemark = child.InnerText;
table.TAllName = name.Substring(name.IndexOf(":") + 1);
}
if (name.Contains("P:BM.ERP"))
{
var tab = allTables.Where(p => p.TAllName!=null&& name.Contains(p.TAllName)).FirstOrDefault();
if (tab != null)
{
XmlNode child = xmlNode.SelectSingleNode("summary");
if (child == null)
{
continue;
}
var pTab = tab.PTables.Where(p => p.PName == name.Substring(name.LastIndexOf(".") + 1)).FirstOrDefault();
if (pTab != null)
{
pTab.PRemark = child.InnerText;
pTab.PAllName = name.Substring(name.IndexOf(":") + 1);
}
}
}

}

}
catch (System.Exception e)
{
return new List<DatabaseTableDto>();
}

return allTables;
}

}
}

前端:

<div ng-controller="app.sys.views.databaseTables.treeIndex as vm">
<div ng-include="'/App/common/views/layout/content-header.cshtml'"></div>
<div class="content" >
<div class="row">
<div class="col-sm-4">
<div class="box box-primary" busy-if="vm.loading">
<div class="box-header with-border">
<i class="fa fa-sitemap"></i>
<h3 class="box-title">数据字典</h3>
<form class="form-inline " role="form" ng-submit="vm.loadData()" >
<div class="pull-right">
<div class="form-group">
<div class="input-group">
<input class="form-control" type="text" placeholder="表名"
ng-model="vm.requestParams.tName">
</div>
</div>
<div class="form-group">
<div class="input-group">
<button type="submit" class="btn btn-warning" uib-tooltip="搜索">
<i class="fa fa-search"></i>
</button>
</div>
</div>
</div>
</form>
</div>

@*<div class="box-body">
<div class="tree"></div>
</div>*@
<div class="list-group">
<div ng-repeat="item in vm.entity.items" class="list-group-item" ng-class="{active:item.ishighlight==true}" ng-click="vm.members.getGridData(item.tName)">
<h5 class="list-group-item-heading">{{item.tName}}</h5>
<p class="list-group-item-text"> {{item.tRemark}}</p>
</div>
</div>
</div>
</div>
<div class="col-sm-8">
<div class="box" busy-if="vm.loading">
<div class="box-header with-border">
<div class="row">
<div class="col-md-12">
<i class="fa fa-list"></i>
<h3 class="box-title">属性</h3>
<div class="pull-right form-inline">
<div class="form-group">
字段:
<input type="text" class="form-control input-sm" style="width:100px"
ng-model=" vm.members.requestParams.pName"
placeholder="字段">
</div>
<div class="form-group">
说明:
<input type="text" class="form-control input-sm" style="width:100px"
ng-model=" vm.members.requestParams.pRemark"
placeholder="说明">
</div>
<div class="form-group">
<button type="submit" ng-click="vm.members.getGridData(vm.name)" class="btn btn-warning btn-sm" uib-tooltip="点击搜索">
<i class="fa fa-fw fa-search"></i>搜索
</button>
</div>
<div class="form-group">
<button type="submit" ng-click="vm.members.getGridData(null)" class="btn btn-warning btn-sm" uib-tooltip="点击搜索">
<i class="fa fa-fw fa-search"></i>全库搜索
</button>
</div>
</div>
</div>
</div>
</div>
<div class="box-body no-padding">
<div ui-grid="vm.members.gridOptions" ui-grid-pagination ui-grid-resize-columns ui-grid-selection ui-grid-auto-resize ui-grid-auto-height></div>
</div>
</div>
</div>
</div>
</div>
</div>

 

js:

(function () {
angular.module('app').controller('app.sys.views.databaseTables.treeIndex', [
'$scope', 'uiGridConstants', '$q', 'abp.services.app.databaseTable',
function ($scope, uiGridConstants, $q, databaseTableService) {
var vm = this;

vm.initializing = true;//初始化中
vm.name = null;

//查询条件
vm.requestParams = {
filter: '',
skipCount: 0,
maxResultCount: 9000,
sorting: null
};
vm.entity = { items :[] }

//加载数据
vm.loadData = function () {
vm.loading = true;
var s = databaseTableService.getAll(vm.requestParams).then(function (result) {
vm.entity.items = result.data.items;
}).finally(function () {
vm.loading = false;
});
return s;
}
vm.members = new function () {
var _this = this;
this.loading = false;

//获取列表请求参数
this.requestParams = {
id: null,
skipCount: 0,
maxResultCount: app.consts.grid.defaultPageSize,
sorting: null
};

//表格配置
this.gridOptions = {
enableHorizontalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
enableVerticalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
paginationPageSizes: app.consts.grid.defaultPageSizes,
paginationPageSize: app.consts.grid.defaultPageSize,
enableRowHeaderSelection: true, //是否显示选中checkbox框 ,默认为true
enableRowSelection: true, // 行选择是否可用,默认为true;
useExternalPagination: true,
useExternalSorting: true,
//enableGridMenu: true,//是否显示表格 菜单
appScopeProvider: vm,
minRowsToShow: 1,
//列配置
columnDefs: [
{
name: '字段',
field: 'pName',
width: 200
},
{
name: '说明',
field: 'pRemark',
width: 200,
},
{
name: '类型',
field: 'pType',
width: 100
},

{
name: '最大长度',
field: 'pMaxLength',
width: 100
},
{
name: '允许Null值',
field: 'pisNull',
width: 100,
cellTemplate:
'<div class=\"ui-grid-cell-contents\">' +
'<span class="label label-primary" title="含有作废人员工资" ng-show="row.entity.pisNull">√</span>' +
'</div>'
},
{
name: '所属表',
field: 'tName',
width: 200
},
{
name: '所属表描述',
field: 'tRemark',
width: 200
}
]
,
onRegisterApi: function (gridApi) {
$scope.gridApi = gridApi;
//排序事件
$scope.gridApi.core.on.sortChanged($scope, function (grid, sortColumns) {
if (!sortColumns.length || !sortColumns[0].field) {
vm.members.requestParams.sorting = null;
} else {
vm.members.requestParams.sorting = sortColumns[0].field + ' ' + sortColumns[0].sort.direction;
}

_this.getGridData(vm.members.requestParams.tName);

});
//翻页事件
gridApi.pagination.on.paginationChanged($scope, function (pageNumber, pageSize) {
vm.members.requestParams.skipCount = (pageNumber - 1) * pageSize;
vm.members.requestParams.maxResultCount = pageSize;

_this.getGridData(vm.members.requestParams.tName);
});
}
,
data: []
};

//查询
this.getGridData = function (tName) {
for (var i = 0; i < vm.entity.items.length; i++){
if (vm.entity.items[i].tName == tName) {
vm.entity.items[i].ishighlight = true;
}
else {
vm.entity.items[i].ishighlight = false;
}
}
vm.members.requestParams.tName = tName;
if (vm.members.requestParams.tName != null) {
vm.name = vm.members.requestParams.tName;
}
_this.loading = true;
var s = databaseTableService.getDetails(_this.requestParams).then(function (result) {
_this.gridOptions.totalItems = result.data.totalCount;
_this.gridOptions.data = result.data.items;
}).finally(function () {
_this.loading = false;
});
};

}

vm.loadData();
}
]);
})();

posted @ 2020-05-18 16:22  紫心落  阅读(315)  评论(0编辑  收藏  举报