You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
17 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using AutoMapper.Internal.Mappers;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Volo.Abp.Application.Services;
  9. using Volo.Abp.Domain.Repositories;
  10. using Volo.Abp.Identity;
  11. using Volo.Abp;
  12. using Shentun.Peis.Models;
  13. using Microsoft.AspNetCore.Authorization;
  14. using NPOI.SS.UserModel;
  15. using System.Reflection;
  16. using NUglify.JavaScript.Syntax;
  17. using System.Collections;
  18. using System.Linq.Dynamic.Core;
  19. using SqlSugar;
  20. using Volo.Abp.Application.Dtos;
  21. using Volo.Abp.Users;
  22. using Volo.Abp.ObjectMapping;
  23. using Microsoft.Extensions.Configuration;
  24. using System.IO;
  25. using Shentun.Peis.HelperDto;
  26. using Shentun.Peis.PlugIns;
  27. using Volo.Abp.Threading;
  28. namespace Shentun.Peis.ColumnReferences
  29. {
  30. /// <summary>
  31. /// 字段对照主表
  32. /// </summary>
  33. [ApiExplorerSettings(GroupName = "Work")]
  34. [Authorize]
  35. public class ColumnReferenceAppService : ApplicationService
  36. {
  37. private readonly IRepository<ColumnReference, Guid> _repository;
  38. private readonly IRepository<ColumnReferenceCode, Guid> _columnReferenceCodeRepository;
  39. private readonly IRepository<ColumnReferenceInterface, Guid> _columnReferenceInterfaceRepository;
  40. private readonly ColumnReferenceManager _manager;
  41. private readonly CacheService _cacheService;
  42. private readonly IRepository<IdentityUser, Guid> _userRepository;
  43. public ColumnReferenceAppService(
  44. IRepository<ColumnReference, Guid> repository,
  45. ColumnReferenceManager manager,
  46. CacheService cacheService,
  47. IRepository<IdentityUser, Guid> userRepository,
  48. IRepository<ColumnReferenceCode, Guid> columnReferenceCodeRepository,
  49. IRepository<ColumnReferenceInterface, Guid> columnReferenceInterfaceRepository
  50. )
  51. {
  52. _repository = repository;
  53. _manager = manager;
  54. _cacheService = cacheService;
  55. _userRepository = userRepository;
  56. _columnReferenceCodeRepository = columnReferenceCodeRepository;
  57. _columnReferenceInterfaceRepository = columnReferenceInterfaceRepository;
  58. }
  59. /// <summary>
  60. /// 根据ID查实体内容
  61. /// </summary>
  62. /// <param name="id"></param>
  63. /// <returns></returns>
  64. [HttpPost("api/app/ColumnReference/Get")]
  65. public async Task<ColumnReferenceDto> GetAsync(Guid id)
  66. {
  67. var entity = await _repository.GetAsync(id);
  68. var entityDto = ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  69. entityDto.CreatorName = _cacheService.GetUserNameAsync(entityDto.CreatorId).Result;
  70. entityDto.LastModifierName = _cacheService.GetUserNameAsync(entityDto.LastModifierId).Result;
  71. return entityDto;
  72. }
  73. /// <summary>
  74. /// 查询列表
  75. /// </summary>
  76. /// <returns></returns>
  77. [HttpPost("api/app/ColumnReference/GetList")]
  78. public async Task<List<ColumnReferenceDto>> GetListAsync()
  79. {
  80. var userQueryable = await _userRepository.GetQueryableAsync();
  81. var entlist = (from a in await _repository.GetQueryableAsync()
  82. join b in userQueryable on a.CreatorId equals b.Id into bb
  83. from ab in bb.DefaultIfEmpty()
  84. join c in userQueryable on a.LastModifierId equals c.Id into cc
  85. from ac in cc.DefaultIfEmpty()
  86. select new
  87. {
  88. a,
  89. CreatorName = ab != null ? ab.UserName : "",
  90. LastModifierName = ac != null ? ac.UserName : ""
  91. })
  92. .Select(s => new ColumnReferenceDto
  93. {
  94. CreationTime = s.a.CreationTime,
  95. CreatorId = s.a.CreatorId,
  96. LastModifierId = s.a.LastModifierId,
  97. Id = s.a.Id,
  98. DisplayOrder = s.a.DisplayOrder,
  99. DisplayName = s.a.DisplayName,
  100. ParmValue = s.a.ParmValue,
  101. LastModificationTime = s.a.LastModificationTime,
  102. CreatorName = s.CreatorName,
  103. LastModifierName = s.LastModifierName
  104. }).OrderBy(o => o.DisplayOrder).ToList();
  105. return entlist;
  106. }
  107. /// <summary>
  108. /// 创建
  109. /// </summary>
  110. /// <param name="input"></param>
  111. /// <returns></returns>
  112. [HttpPost("api/app/ColumnReference/Create")]
  113. public async Task<ColumnReferenceDto> CreateAsync(CreateColumnReferenceDto input)
  114. {
  115. var createEntity = ObjectMapper.Map<CreateColumnReferenceDto, ColumnReference>(input);
  116. var entity = await _manager.CreateAsync(createEntity);
  117. entity = await _repository.InsertAsync(entity);
  118. var dto = ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  119. return dto;
  120. }
  121. /// <summary>
  122. /// 修改
  123. /// </summary>
  124. /// <param name="input"></param>
  125. /// <returns></returns>
  126. [HttpPost("api/app/ColumnReference/Update")]
  127. public async Task<ColumnReferenceDto> UpdateAsync(UpdateColumnReferenceDto input)
  128. {
  129. var entity = await _repository.GetAsync(input.Id);
  130. var sourceEntity = ObjectMapper.Map<UpdateColumnReferenceDto, ColumnReference>(input);
  131. await _manager.UpdateAsync(sourceEntity, entity);
  132. entity = await _repository.UpdateAsync(entity);
  133. return ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  134. }
  135. /// <summary>
  136. /// 删除
  137. /// </summary>
  138. /// <param name="id"></param>
  139. /// <returns></returns>
  140. [HttpPost("api/app/ColumnReference/Delete")]
  141. public async Task DeleteAsync(Guid id)
  142. {
  143. var entity = await _repository.GetAsync(id);
  144. await _manager.CheckAndDeleteAsync(entity);
  145. }
  146. /// <summary>
  147. /// 修改排序 置顶,置底
  148. /// </summary>
  149. /// <param name="id">需要修改的ID</param>
  150. /// <param name="SortType">修改方式:1 置顶 2 置底</param>
  151. /// <returns></returns>
  152. [HttpPost("api/app/ColumnReference/UpdateManySort")]
  153. public async Task UpdateManySortAsync(Guid id, int SortType)
  154. {
  155. await _manager.UpdateManySortAsync(id, SortType);
  156. }
  157. /// <summary>
  158. /// 修改排序 拖拽
  159. /// </summary>
  160. /// <param name="input"></param>
  161. /// <returns></returns>
  162. [HttpPost("api/app/ColumnReference/UpdateSortMany")]
  163. public async Task UpdateSortManyAsync(UpdateSortManyDto input)
  164. {
  165. await _manager.UpdateSortManyAsync(input);
  166. }
  167. /// <summary>
  168. ///获取字段对照本系统所有列名
  169. /// </summary>
  170. /// <param name="input"></param>
  171. /// <returns></returns>
  172. [HttpPost("api/app/ColumnReference/GetAppColumnNames")]
  173. public async Task<List<string>> GetAppColumnNamesAsync(ColumnReferenceIdInputDto input)
  174. {
  175. var entity = await _repository.GetAsync(input.Id);
  176. var parmValue = entity.ParmValue;
  177. var configurationBuilder = new ConfigurationBuilder()
  178. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  179. var config = configurationBuilder.Build();
  180. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  181. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  182. object objectValue = await InvokeAsync(assemblyName, className, parmValue, "GetAppColumnNames");
  183. List<string> list = new List<string>();
  184. if (objectValue is IEnumerable enumerableObject)
  185. {
  186. list = enumerableObject.Cast<string>().ToList();
  187. }
  188. return list;
  189. }
  190. public async Task<string> GetAppFilterColumnName(ColumnReferenceIdInputDto input)
  191. {
  192. return null;
  193. }
  194. /// <summary>
  195. ///获取字段对照第三方系统所有列名
  196. /// </summary>
  197. /// <param name="input"></param>
  198. /// <returns></returns>
  199. [HttpPost("api/app/ColumnReference/GetInterfaceColumnNames")]
  200. public async Task<List<string>> GetInterfaceColumnNamesAsync(ColumnReferenceIdInputDto input)
  201. {
  202. var entity = await _repository.GetAsync(input.Id);
  203. var parmValue = entity.ParmValue;
  204. var configurationBuilder = new ConfigurationBuilder()
  205. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  206. var config = configurationBuilder.Build();
  207. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  208. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  209. object objectValue = await InvokeAsync(assemblyName, className, parmValue, "GetInterfaceColumnNames");
  210. List<string> list = new List<string>();
  211. if (objectValue is IEnumerable enumerableObject)
  212. {
  213. list = enumerableObject.Cast<string>().ToList();
  214. }
  215. return list;
  216. }
  217. /// <summary>
  218. ///获取字段对照本系统所有数据
  219. /// </summary>
  220. /// <param name="input"></param>
  221. /// <returns></returns>
  222. [HttpPost("api/app/ColumnReference/GetAppCodeValues")]
  223. public async Task<List<ColumnReferenceCodeValue>> GetAppCodeValuesAsync(ColumnReferenceIdInputDto input)
  224. {
  225. //var columnReferenceCodes = await _columnReferenceCodeRepository.GetListAsync(o => o.CodeValue == input.Id.ToString());
  226. var entity = await _repository.GetAsync(input.Id);
  227. var parmValue = entity.ParmValue;
  228. var configurationBuilder = new ConfigurationBuilder()
  229. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  230. var config = configurationBuilder.Build();
  231. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  232. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  233. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetAppCodeValuesAsync");
  234. return list;
  235. }
  236. public async Task<List<ColumnReferenceFilterCodeValue>> GetAppFilterCodeValues(ColumnReferenceIdInputDto input)
  237. {
  238. return null;
  239. }
  240. /// <summary>
  241. ///获取字段对照第三方系统所有数据
  242. /// </summary>
  243. /// <param name="input"></param>
  244. /// <returns></returns>
  245. [HttpPost("api/app/ColumnReference/GetInterfaceCodeValues")]
  246. public async Task<List<ColumnReferenceCodeValue>> GetInterfaceCodeValuesAsync(ColumnReferenceIdInputDto input)
  247. {
  248. var entity = await _repository.GetAsync(input.Id);
  249. var parmValue = entity.ParmValue;
  250. var configurationBuilder = new ConfigurationBuilder()
  251. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  252. var config = configurationBuilder.Build();
  253. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  254. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  255. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync");
  256. return list;
  257. }
  258. /// <summary>
  259. /// 通过本系统编码获取第三方系统编码
  260. /// </summary>
  261. /// <param name="input"></param>
  262. /// <returns></returns>
  263. [HttpPost("api/app/ColumnReference/GetInterfaceCodeValuesByAppCode")]
  264. public async Task<List<ColumnReferenceInterfaceCodeValueDto>> GetInterfaceCodeValuesByAppCode(ColumnReferenceInterfaceCodeValuesInputDto input)
  265. {
  266. var columnReferenceCode = await _columnReferenceCodeRepository.FirstOrDefaultAsync(o => o.CodeValue == input.Code);
  267. if(columnReferenceCode == null)
  268. {
  269. return null;
  270. }
  271. var items = await _columnReferenceInterfaceRepository.GetListAsync(o => o.ColumnReferenceCodeId == columnReferenceCode.Id);
  272. var entity = await _repository.GetAsync(input.ColumnReferenceId);
  273. var parmValue = entity.ParmValue;
  274. var configurationBuilder = new ConfigurationBuilder()
  275. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  276. var config = configurationBuilder.Build();
  277. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  278. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  279. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync");
  280. var result = new List<ColumnReferenceInterfaceCodeValueDto>();
  281. foreach ( var item in items)
  282. {
  283. var columnReferenceInterfaceCodeValueDto = new ColumnReferenceInterfaceCodeValueDto()
  284. {
  285. CodeValue = item.InterfaceCodeValue,
  286. };
  287. var interfaceItem = list.Where(o => o.Code == item.InterfaceCodeValue).FirstOrDefault();
  288. if(interfaceItem != null)
  289. {
  290. columnReferenceInterfaceCodeValueDto.DisplayName = interfaceItem.DisplayName;
  291. }
  292. result.Add(columnReferenceInterfaceCodeValueDto);
  293. }
  294. return result;
  295. }
  296. public async Task<List<ColumnReferenceCodeValue>> GetColumnReferenceInterfaceCodeValues(ColumnReferenceIdInputDto input)
  297. {
  298. return null;
  299. }
  300. public async Task CreateColumnReferenceValue(CreateColumnReferenceValue input)
  301. {
  302. }
  303. private async Task<object> InvokeAsync(string assemblyName, string className,string classConstructorArg, string methodName, object[] args = null)
  304. {
  305. Assembly assembly = Assembly.Load(assemblyName);
  306. Type type = assembly.GetType(className);
  307. // 创建类的实例
  308. object instance = Activator.CreateInstance(type, classConstructorArg);
  309. // 获取方法信息
  310. MethodInfo method = type.GetMethod(methodName);
  311. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  312. object returnValue;
  313. var isAsync = (method.ReturnType == typeof(Task) ||
  314. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  315. if (isAsync)
  316. {
  317. // 使用反射调用方法
  318. //object returnValue = method.Invoke(instance, args);
  319. returnValue = await(Task<object>)method.Invoke(instance, args);
  320. }
  321. else
  322. {
  323. returnValue = method.Invoke(instance, args);
  324. }
  325. return returnValue;
  326. }
  327. private async Task<List<ColumnReferenceCodeValue>> InvokeListAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null)
  328. {
  329. Assembly assembly = Assembly.Load(assemblyName);
  330. Type type = assembly.GetType(className);
  331. // 创建类的实例
  332. object instance = Activator.CreateInstance(type, classConstructorArg);
  333. // 获取方法信息
  334. MethodInfo method = type.GetMethod(methodName);
  335. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  336. List<ColumnReferenceCodeValue> returnValue;
  337. var isAsync = (method.ReturnType == typeof(Task) ||
  338. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  339. if (isAsync)
  340. {
  341. // 使用反射调用方法
  342. //object returnValue = method.Invoke(instance, args);
  343. returnValue = await (Task<List<ColumnReferenceCodeValue>>)method.Invoke(instance, args);
  344. }
  345. else
  346. {
  347. returnValue = (List<ColumnReferenceCodeValue>)method.Invoke(instance, args);
  348. }
  349. return returnValue;
  350. }
  351. }
  352. }