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.

455 lines
20 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
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. using Shentun.Peis.ColumnReferenceCodes;
  29. using Shentun.Peis.ColumnReferenceInterfaces;
  30. using Volo.Abp.Domain.Entities;
  31. namespace Shentun.Peis.ColumnReferences
  32. {
  33. /// <summary>
  34. /// 字段对照主表
  35. /// </summary>
  36. [ApiExplorerSettings(GroupName = "Work")]
  37. [Authorize]
  38. public class ColumnReferenceAppService : ApplicationService
  39. {
  40. private readonly IRepository<ColumnReference, Guid> _repository;
  41. private readonly IRepository<ColumnReferenceCode, Guid> _columnReferenceCodeRepository;
  42. private readonly IRepository<ColumnReferenceInterface, Guid> _columnReferenceInterfaceRepository;
  43. private readonly ColumnReferenceManager _manager;
  44. private readonly ColumnReferenceCodeManager _columnReferenceCodeManager;
  45. private readonly ColumnReferenceInterfaceManager _columnReferenceInterfaceManager;
  46. private readonly CacheService _cacheService;
  47. private readonly IRepository<IdentityUser, Guid> _userRepository;
  48. public ColumnReferenceAppService(
  49. IRepository<ColumnReference, Guid> repository,
  50. ColumnReferenceManager manager,
  51. CacheService cacheService,
  52. IRepository<IdentityUser, Guid> userRepository,
  53. IRepository<ColumnReferenceCode, Guid> columnReferenceCodeRepository,
  54. IRepository<ColumnReferenceInterface, Guid> columnReferenceInterfaceRepository,
  55. ColumnReferenceCodeManager columnReferenceCodeManager,
  56. ColumnReferenceInterfaceManager columnReferenceInterfaceManager
  57. )
  58. {
  59. _repository = repository;
  60. _manager = manager;
  61. _cacheService = cacheService;
  62. _userRepository = userRepository;
  63. _columnReferenceCodeRepository = columnReferenceCodeRepository;
  64. _columnReferenceInterfaceRepository = columnReferenceInterfaceRepository;
  65. _columnReferenceCodeManager = columnReferenceCodeManager;
  66. _columnReferenceInterfaceManager = columnReferenceInterfaceManager;
  67. }
  68. /// <summary>
  69. /// 根据ID查实体内容
  70. /// </summary>
  71. /// <param name="id"></param>
  72. /// <returns></returns>
  73. [HttpPost("api/app/ColumnReference/Get")]
  74. public async Task<ColumnReferenceDto> GetAsync(Guid id)
  75. {
  76. var entity = await _repository.GetAsync(id);
  77. var entityDto = ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  78. entityDto.CreatorName = _cacheService.GetUserNameAsync(entityDto.CreatorId).Result;
  79. entityDto.LastModifierName = _cacheService.GetUserNameAsync(entityDto.LastModifierId).Result;
  80. return entityDto;
  81. }
  82. /// <summary>
  83. /// 查询列表
  84. /// </summary>
  85. /// <returns></returns>
  86. [HttpPost("api/app/ColumnReference/GetList")]
  87. public async Task<List<ColumnReferenceDto>> GetListAsync()
  88. {
  89. var userQueryable = await _userRepository.GetQueryableAsync();
  90. var entlist = (from a in await _repository.GetQueryableAsync()
  91. join b in userQueryable on a.CreatorId equals b.Id into bb
  92. from ab in bb.DefaultIfEmpty()
  93. join c in userQueryable on a.LastModifierId equals c.Id into cc
  94. from ac in cc.DefaultIfEmpty()
  95. select new
  96. {
  97. a,
  98. CreatorName = ab != null ? ab.UserName : "",
  99. LastModifierName = ac != null ? ac.UserName : ""
  100. })
  101. .Select(s => new ColumnReferenceDto
  102. {
  103. CreationTime = s.a.CreationTime,
  104. CreatorId = s.a.CreatorId,
  105. LastModifierId = s.a.LastModifierId,
  106. Id = s.a.Id,
  107. DisplayOrder = s.a.DisplayOrder,
  108. DisplayName = s.a.DisplayName,
  109. ParmValue = s.a.ParmValue,
  110. LastModificationTime = s.a.LastModificationTime,
  111. CreatorName = s.CreatorName,
  112. LastModifierName = s.LastModifierName
  113. }).OrderBy(o => o.DisplayOrder).ToList();
  114. return entlist;
  115. }
  116. /// <summary>
  117. /// 创建
  118. /// </summary>
  119. /// <param name="input"></param>
  120. /// <returns></returns>
  121. [HttpPost("api/app/ColumnReference/Create")]
  122. public async Task<ColumnReferenceDto> CreateAsync(CreateColumnReferenceDto input)
  123. {
  124. var createEntity = ObjectMapper.Map<CreateColumnReferenceDto, ColumnReference>(input);
  125. var entity = await _manager.CreateAsync(createEntity);
  126. entity = await _repository.InsertAsync(entity);
  127. var dto = ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  128. return dto;
  129. }
  130. /// <summary>
  131. /// 修改
  132. /// </summary>
  133. /// <param name="input"></param>
  134. /// <returns></returns>
  135. [HttpPost("api/app/ColumnReference/Update")]
  136. public async Task<ColumnReferenceDto> UpdateAsync(UpdateColumnReferenceDto input)
  137. {
  138. var entity = await _repository.GetAsync(input.Id);
  139. var sourceEntity = ObjectMapper.Map<UpdateColumnReferenceDto, ColumnReference>(input);
  140. await _manager.UpdateAsync(sourceEntity, entity);
  141. entity = await _repository.UpdateAsync(entity);
  142. return ObjectMapper.Map<ColumnReference, ColumnReferenceDto>(entity);
  143. }
  144. /// <summary>
  145. /// 删除
  146. /// </summary>
  147. /// <param name="id"></param>
  148. /// <returns></returns>
  149. [HttpPost("api/app/ColumnReference/Delete")]
  150. public async Task DeleteAsync(Guid id)
  151. {
  152. var entity = await _repository.GetAsync(id);
  153. await _manager.CheckAndDeleteAsync(entity);
  154. }
  155. /// <summary>
  156. /// 修改排序 置顶,置底
  157. /// </summary>
  158. /// <param name="id">需要修改的ID</param>
  159. /// <param name="SortType">修改方式:1 置顶 2 置底</param>
  160. /// <returns></returns>
  161. [HttpPost("api/app/ColumnReference/UpdateManySort")]
  162. public async Task UpdateManySortAsync(Guid id, int SortType)
  163. {
  164. await _manager.UpdateManySortAsync(id, SortType);
  165. }
  166. /// <summary>
  167. /// 修改排序 拖拽
  168. /// </summary>
  169. /// <param name="input"></param>
  170. /// <returns></returns>
  171. [HttpPost("api/app/ColumnReference/UpdateSortMany")]
  172. public async Task UpdateSortManyAsync(UpdateSortManyDto input)
  173. {
  174. await _manager.UpdateSortManyAsync(input);
  175. }
  176. /// <summary>
  177. /// 更新字段对照
  178. /// </summary>
  179. /// <param name="input"></param>
  180. /// <returns></returns>
  181. [HttpPost("api/app/ColumnReference/UpdateInterfaceCodeValues")]
  182. public async Task UpdateInterfaceCodeValuesAsync(UpdateColumnReferenceInterfaceDto input)
  183. {
  184. var columnReferenceCode = await _columnReferenceCodeRepository.FindAsync(o => o.ColumnReferenceId == input.ColumnReferenceId &&
  185. o.CodeValue == input.AppCode.CodeValue);
  186. if (columnReferenceCode == null)
  187. {
  188. //新建
  189. columnReferenceCode = await _columnReferenceCodeManager.CreateAsync(new ColumnReferenceCode()
  190. {
  191. ColumnReferenceId = input.ColumnReferenceId,
  192. CodeValue = input.AppCode.CodeValue
  193. });
  194. columnReferenceCode = await _columnReferenceCodeRepository.InsertAsync(columnReferenceCode);
  195. }
  196. else
  197. {
  198. //更新
  199. //先删除所有接口编码
  200. var columnReferenceInterfacs = await _columnReferenceInterfaceRepository.GetListAsync(o => o.ColumnReferenceCodeId == columnReferenceCode.Id);
  201. await _columnReferenceInterfaceRepository.DeleteManyAsync(columnReferenceInterfacs);
  202. }
  203. //插入接口表数据
  204. foreach (var columnReferenceInterfaceDto in input.InterfaceCodes)
  205. {
  206. var columnReferenceInterface = await _columnReferenceInterfaceManager.CreateAsync(new ColumnReferenceInterface()
  207. {
  208. ColumnReferenceCodeId = columnReferenceCode.Id,
  209. InterfaceCodeValue = columnReferenceInterfaceDto.CodeValue
  210. });
  211. await _columnReferenceInterfaceRepository.InsertAsync(columnReferenceInterface);
  212. }
  213. }
  214. /// <summary>
  215. ///获取字段对照本系统所有列名
  216. /// </summary>
  217. /// <param name="input"></param>
  218. /// <returns></returns>
  219. [HttpPost("api/app/ColumnReference/GetAppColumns")]
  220. public async Task<List<ColumnReferenceColumn>> GetAppColumnsAsync(ColumnReferenceIdInputDto input)
  221. {
  222. var entity = await _repository.GetAsync(input.Id);
  223. var parmValue = entity.ParmValue;
  224. var configurationBuilder = new ConfigurationBuilder()
  225. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  226. var config = configurationBuilder.Build();
  227. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  228. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  229. var list = await InvokeColumnsAsync(assemblyName, className, parmValue, "GetAppColumns");
  230. return list;
  231. }
  232. public async Task<string> GetAppFilterColumnName(ColumnReferenceIdInputDto input)
  233. {
  234. return null;
  235. }
  236. /// <summary>
  237. ///获取字段对照第三方系统所有列名
  238. /// </summary>
  239. /// <param name="input"></param>
  240. /// <returns></returns>
  241. [HttpPost("api/app/ColumnReference/GetInterfaceColumns")]
  242. public async Task<List<ColumnReferenceColumn>> GetInterfaceColumnsAsync(ColumnReferenceIdInputDto input)
  243. {
  244. var entity = await _repository.GetAsync(input.Id);
  245. var parmValue = entity.ParmValue;
  246. var configurationBuilder = new ConfigurationBuilder()
  247. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  248. var config = configurationBuilder.Build();
  249. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  250. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  251. var list = await InvokeColumnsAsync(assemblyName, className, parmValue, "GetInterfaceColumns");
  252. return list;
  253. }
  254. /// <summary>
  255. ///获取字段对照本系统所有数据
  256. /// </summary>
  257. /// <param name="input"></param>
  258. /// <returns></returns>
  259. [HttpPost("api/app/ColumnReference/GetAppCodeValues")]
  260. public async Task<List<ColumnReferenceCodeValue>> GetAppCodeValuesAsync(ColumnReferenceIdInputDto input)
  261. {
  262. //var columnReferenceCodes = await _columnReferenceCodeRepository.GetListAsync(o => o.CodeValue == input.Id.ToString());
  263. var entity = await _repository.GetAsync(input.Id);
  264. var parmValue = entity.ParmValue;
  265. var configurationBuilder = new ConfigurationBuilder()
  266. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  267. var config = configurationBuilder.Build();
  268. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  269. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  270. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetAppCodeValuesAsync");
  271. return list;
  272. }
  273. public async Task<List<ColumnReferenceFilterCodeValue>> GetAppFilterCodeValues(ColumnReferenceIdInputDto input)
  274. {
  275. return null;
  276. }
  277. /// <summary>
  278. ///获取字段对照第三方系统所有数据
  279. /// </summary>
  280. /// <param name="input"></param>
  281. /// <returns></returns>
  282. [HttpPost("api/app/ColumnReference/GetInterfaceCodeValues")]
  283. public async Task<List<ColumnReferenceCodeValue>> GetInterfaceCodeValuesAsync(ColumnReferenceIdInputDto input)
  284. {
  285. var entity = await _repository.GetAsync(input.Id);
  286. var parmValue = entity.ParmValue;
  287. var configurationBuilder = new ConfigurationBuilder()
  288. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  289. var config = configurationBuilder.Build();
  290. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  291. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  292. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync");
  293. return list;
  294. }
  295. /// <summary>
  296. /// 通过本系统编码获取第三方系统编码
  297. /// </summary>
  298. /// <param name="input"></param>
  299. /// <returns></returns>
  300. [HttpPost("api/app/ColumnReference/GetInterfaceCodeValuesByAppCode")]
  301. public async Task<List<ColumnReferenceInterfaceCodeValueDto>> GetInterfaceCodeValuesByAppCode(ColumnReferenceInterfaceCodeValuesInputDto input)
  302. {
  303. var columnReferenceCode = await _columnReferenceCodeRepository.FirstOrDefaultAsync(o => o.CodeValue == input.CodeValue);
  304. if(columnReferenceCode == null)
  305. {
  306. return null;
  307. }
  308. var items = await _columnReferenceInterfaceRepository.GetListAsync(o => o.ColumnReferenceCodeId == columnReferenceCode.Id);
  309. var entity = await _repository.GetAsync(input.ColumnReferenceId);
  310. var parmValue = entity.ParmValue;
  311. var configurationBuilder = new ConfigurationBuilder()
  312. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  313. var config = configurationBuilder.Build();
  314. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  315. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  316. var list = await InvokeListAsync(assemblyName, className, parmValue, "GetInterfaceCodeValuesAsync");
  317. var result = new List<ColumnReferenceInterfaceCodeValueDto>();
  318. foreach ( var item in items)
  319. {
  320. var columnReferenceInterfaceCodeValueDto = new ColumnReferenceInterfaceCodeValueDto()
  321. {
  322. CodeValue = item.InterfaceCodeValue,
  323. };
  324. var interfaceItem = list.Where(o => o.CodeValue == item.InterfaceCodeValue).FirstOrDefault();
  325. if(interfaceItem != null)
  326. {
  327. columnReferenceInterfaceCodeValueDto.DisplayName = interfaceItem.DisplayName;
  328. }
  329. result.Add(columnReferenceInterfaceCodeValueDto);
  330. }
  331. return result;
  332. }
  333. public async Task<List<ColumnReferenceCodeValue>> GetColumnReferenceInterfaceCodeValues(ColumnReferenceIdInputDto input)
  334. {
  335. return null;
  336. }
  337. public async Task CreateColumnReferenceValue(CreateColumnReferenceValue input)
  338. {
  339. }
  340. private async Task<object> InvokeAsync(string assemblyName, string className,string classConstructorArg, string methodName, object[] args = null)
  341. {
  342. Assembly assembly = Assembly.Load(assemblyName);
  343. Type type = assembly.GetType(className);
  344. // 创建类的实例
  345. object instance = Activator.CreateInstance(type, classConstructorArg);
  346. // 获取方法信息
  347. MethodInfo method = type.GetMethod(methodName);
  348. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  349. object returnValue;
  350. var isAsync = (method.ReturnType == typeof(Task) ||
  351. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  352. if (isAsync)
  353. {
  354. // 使用反射调用方法
  355. //object returnValue = method.Invoke(instance, args);
  356. returnValue = await(Task<object>)method.Invoke(instance, args);
  357. }
  358. else
  359. {
  360. returnValue = method.Invoke(instance, args);
  361. }
  362. return returnValue;
  363. }
  364. private async Task<List<ColumnReferenceCodeValue>> InvokeListAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null)
  365. {
  366. Assembly assembly = Assembly.Load(assemblyName);
  367. Type type = assembly.GetType(className);
  368. // 创建类的实例
  369. object instance = Activator.CreateInstance(type, classConstructorArg);
  370. // 获取方法信息
  371. MethodInfo method = type.GetMethod(methodName);
  372. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  373. List<ColumnReferenceCodeValue> returnValue;
  374. var isAsync = (method.ReturnType == typeof(Task) ||
  375. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  376. if (isAsync)
  377. {
  378. // 使用反射调用方法
  379. //object returnValue = method.Invoke(instance, args);
  380. returnValue = await (Task<List<ColumnReferenceCodeValue>>)method.Invoke(instance, args);
  381. }
  382. else
  383. {
  384. returnValue = (List<ColumnReferenceCodeValue>)method.Invoke(instance, args);
  385. }
  386. return returnValue;
  387. }
  388. private async Task<List<ColumnReferenceColumn>> InvokeColumnsAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null)
  389. {
  390. Assembly assembly = Assembly.Load(assemblyName);
  391. Type type = assembly.GetType(className);
  392. // 创建类的实例
  393. object instance = Activator.CreateInstance(type, classConstructorArg);
  394. // 获取方法信息
  395. MethodInfo method = type.GetMethod(methodName);
  396. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  397. List<ColumnReferenceColumn> returnValue;
  398. var isAsync = (method.ReturnType == typeof(Task) ||
  399. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  400. if (isAsync)
  401. {
  402. // 使用反射调用方法
  403. //object returnValue = method.Invoke(instance, args);
  404. returnValue = await (Task<List<ColumnReferenceColumn>>)method.Invoke(instance, args);
  405. }
  406. else
  407. {
  408. returnValue = (List<ColumnReferenceColumn>)method.Invoke(instance, args);
  409. }
  410. return returnValue;
  411. }
  412. }
  413. }