using AutoMapper.Internal.Mappers; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp; using Shentun.Peis.Models; using Microsoft.AspNetCore.Authorization; using NPOI.SS.UserModel; using System.Reflection; using NUglify.JavaScript.Syntax; using System.Collections; using System.Linq.Dynamic.Core; using SqlSugar; using Volo.Abp.Application.Dtos; using Volo.Abp.Users; using Volo.Abp.ObjectMapping; using Microsoft.Extensions.Configuration; using System.IO; using Shentun.Peis.HelperDto; using Shentun.Peis.PlugIns; using Volo.Abp.Threading; namespace Shentun.Peis.ColumnReferences { /// /// 字段对照主表 /// [ApiExplorerSettings(GroupName = "Work")] [Authorize] public class ColumnReferenceAppService : ApplicationService { private readonly IRepository _repository; private readonly IRepository _columnReferenceCodeRepository; private readonly IRepository _columnReferenceInterfaceRepository; private readonly ColumnReferenceManager _manager; private readonly CacheService _cacheService; private readonly IRepository _userRepository; public ColumnReferenceAppService( IRepository repository, ColumnReferenceManager manager, CacheService cacheService, IRepository userRepository, IRepository columnReferenceCodeRepository, IRepository columnReferenceInterfaceRepository ) { _repository = repository; _manager = manager; _cacheService = cacheService; _userRepository = userRepository; _columnReferenceCodeRepository = columnReferenceCodeRepository; _columnReferenceInterfaceRepository = columnReferenceInterfaceRepository; } /// /// 根据ID查实体内容 /// /// /// [HttpPost("api/app/ColumnReference/Get")] public async Task GetAsync(Guid id) { var entity = await _repository.GetAsync(id); var entityDto = ObjectMapper.Map(entity); entityDto.CreatorName = _cacheService.GetUserNameAsync(entityDto.CreatorId).Result; entityDto.LastModifierName = _cacheService.GetUserNameAsync(entityDto.LastModifierId).Result; return entityDto; } /// /// 查询列表 /// /// [HttpPost("api/app/ColumnReference/GetList")] public async Task> GetListAsync() { var userQueryable = await _userRepository.GetQueryableAsync(); var entlist = (from a in await _repository.GetQueryableAsync() join b in userQueryable on a.CreatorId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in userQueryable on a.LastModifierId equals c.Id into cc from ac in cc.DefaultIfEmpty() select new { a, CreatorName = ab != null ? ab.UserName : "", LastModifierName = ac != null ? ac.UserName : "" }) .Select(s => new ColumnReferenceDto { CreationTime = s.a.CreationTime, CreatorId = s.a.CreatorId, LastModifierId = s.a.LastModifierId, Id = s.a.Id, DisplayOrder = s.a.DisplayOrder, DisplayName = s.a.DisplayName, ParmValue = s.a.ParmValue, LastModificationTime = s.a.LastModificationTime, CreatorName = s.CreatorName, LastModifierName = s.LastModifierName }).OrderBy(o => o.DisplayOrder).ToList(); return entlist; } /// /// 创建 /// /// /// [HttpPost("api/app/ColumnReference/Create")] public async Task CreateAsync(CreateColumnReferenceDto input) { var createEntity = ObjectMapper.Map(input); var entity = await _manager.CreateAsync(createEntity); entity = await _repository.InsertAsync(entity); var dto = ObjectMapper.Map(entity); return dto; } /// /// 修改 /// /// /// [HttpPost("api/app/ColumnReference/Update")] public async Task UpdateAsync(UpdateColumnReferenceDto input) { var entity = await _repository.GetAsync(input.Id); var sourceEntity = ObjectMapper.Map(input); await _manager.UpdateAsync(sourceEntity, entity); entity = await _repository.UpdateAsync(entity); return ObjectMapper.Map(entity); } /// /// 删除 /// /// /// [HttpPost("api/app/ColumnReference/Delete")] public async Task DeleteAsync(Guid id) { var entity = await _repository.GetAsync(id); await _manager.CheckAndDeleteAsync(entity); } /// /// 修改排序 置顶,置底 /// /// 需要修改的ID /// 修改方式:1 置顶 2 置底 /// [HttpPost("api/app/ColumnReference/UpdateManySort")] public async Task UpdateManySortAsync(Guid id, int SortType) { await _manager.UpdateManySortAsync(id, SortType); } /// /// 修改排序 拖拽 /// /// /// [HttpPost("api/app/ColumnReference/UpdateSortMany")] public async Task UpdateSortManyAsync(UpdateSortManyDto input) { await _manager.UpdateSortManyAsync(input); } /// ///获取字段对照本系统所有列名 /// /// /// [HttpPost("api/app/ColumnReference/GetAppColumnNames")] public async Task> GetAppColumnNamesAsync(ColumnReferenceIdInputDto input) { var entity = await _repository.GetAsync(input.Id); var parmValue = entity.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; object objectValue = await InvokeAsync(assemblyName, className, parmValue, "GetAppColumnNames"); List list = new List(); if (objectValue is IEnumerable enumerableObject) { list = enumerableObject.Cast().ToList(); } return list; } public async Task GetAppFilterColumnName(ColumnReferenceIdInputDto input) { return null; } /// ///获取字段对照第三方系统所有列名 /// /// /// [HttpPost("api/app/ColumnReference/GetInterfaceColumnNames")] public async Task> GetInterfaceColumnNamesAsync(ColumnReferenceIdInputDto input) { var entity = await _repository.GetAsync(input.Id); var parmValue = entity.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; object objectValue = await InvokeAsync(assemblyName, className, parmValue, "GetInterfaceColumnNames"); List list = new List(); if (objectValue is IEnumerable enumerableObject) { list = enumerableObject.Cast().ToList(); } return list; } /// ///获取字段对照本系统所有数据 /// /// /// [HttpPost("api/app/ColumnReference/GetAppCodeValues")] public async Task> GetAppCodeValuesAsync(ColumnReferenceIdInputDto input) { //var columnReferenceCodes = await _columnReferenceCodeRepository.GetListAsync(o => o.CodeValue == input.Id.ToString()); var entity = await _repository.GetAsync(input.Id); var parmValue = entity.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; var list = await InvokeListAsync(assemblyName, className, parmValue, "GetAppCodeValuesAsync"); return list; } public async Task> GetAppFilterCodeValues(ColumnReferenceIdInputDto input) { return null; } /// ///获取字段对照第三方系统所有数据 /// /// /// [HttpPost("api/app/ColumnReference/GetInterfaceCodeValues")] public async Task> GetInterfaceCodeValuesAsync(ColumnReferenceIdInputDto input) { var entity = await _repository.GetAsync(input.Id); var parmValue = entity.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync"); return list; } /// /// 通过本系统编码获取第三方系统编码 /// /// /// [HttpPost("api/app/ColumnReference/GetInterfaceCodeValuesByAppCode")] public async Task> GetInterfaceCodeValuesByAppCode(ColumnReferenceInterfaceCodeValuesInputDto input) { var columnReferenceCode = await _columnReferenceCodeRepository.FirstOrDefaultAsync(o => o.CodeValue == input.Code); if(columnReferenceCode == null) { return null; } var items = await _columnReferenceInterfaceRepository.GetListAsync(o => o.ColumnReferenceCodeId == columnReferenceCode.Id); var entity = await _repository.GetAsync(input.ColumnReferenceId); var parmValue = entity.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync"); var result = new List(); foreach ( var item in items) { var columnReferenceInterfaceCodeValueDto = new ColumnReferenceInterfaceCodeValueDto() { CodeValue = item.InterfaceCodeValue, }; var interfaceItem = list.Where(o => o.Code == item.InterfaceCodeValue).FirstOrDefault(); if(interfaceItem != null) { columnReferenceInterfaceCodeValueDto.DisplayName = interfaceItem.DisplayName; } result.Add(columnReferenceInterfaceCodeValueDto); } return result; } public async Task> GetColumnReferenceInterfaceCodeValues(ColumnReferenceIdInputDto input) { return null; } public async Task CreateColumnReferenceValue(CreateColumnReferenceValue input) { } private async Task InvokeAsync(string assemblyName, string className,string classConstructorArg, string methodName, object[] args = null) { Assembly assembly = Assembly.Load(assemblyName); Type type = assembly.GetType(className); // 创建类的实例 object instance = Activator.CreateInstance(type, classConstructorArg); // 获取方法信息 MethodInfo method = type.GetMethod(methodName); // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 } object returnValue; var isAsync = (method.ReturnType == typeof(Task) || (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>))); if (isAsync) { // 使用反射调用方法 //object returnValue = method.Invoke(instance, args); returnValue = await(Task)method.Invoke(instance, args); } else { returnValue = method.Invoke(instance, args); } return returnValue; } private async Task> InvokeListAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null) { Assembly assembly = Assembly.Load(assemblyName); Type type = assembly.GetType(className); // 创建类的实例 object instance = Activator.CreateInstance(type, classConstructorArg); // 获取方法信息 MethodInfo method = type.GetMethod(methodName); // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 } List returnValue; var isAsync = (method.ReturnType == typeof(Task) || (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>))); if (isAsync) { // 使用反射调用方法 //object returnValue = method.Invoke(instance, args); returnValue = await (Task>)method.Invoke(instance, args); } else { returnValue = (List)method.Invoke(instance, args); } return returnValue; } } }