ApiInfoService.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using Attribute;
  2. using Dto;
  3. using Vo;
  4. using Model;
  5. using Model.Base;
  6. using Repository;
  7. using Service;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Common;
  10. using Dto.Client;
  11. using Infrastructure;
  12. using Feign;
  13. namespace Services
  14. {
  15. /// <summary>
  16. /// api接口Service业务层处理
  17. /// </summary>
  18. [AppService(ServiceType = typeof(IApiInfoService), ServiceLifetime = LifeTime.Transient)]
  19. public class ApiInfoService : BaseService<ApiInfo>, IApiInfoService
  20. {
  21. /// <summary>
  22. /// api接口-列表
  23. /// </summary>
  24. /// <param name="parm">请求参数</param>
  25. /// <returns>api接口列表</returns>
  26. public PagedInfo<ApiInfoListVo> List([FromQuery] PagerInfo page, [FromQuery] ApiInfoListDto parm)
  27. {
  28. //开始拼装查询条件
  29. var predicate = Expressionable.Create<ApiInfo>();
  30. predicate = predicate.AndIF(parm.groupId > 0, m => m.groupId == parm.groupId);
  31. predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.apiName), m => m.apiName.Contains(parm.apiName));
  32. var response = Queryable()
  33. .Where(predicate.ToExpression())
  34. .OrderByDescending(m => m.id)
  35. .Includes(m => m.apiGroupJoin)
  36. .ToPage<ApiInfo, ApiInfoListVo>(page);
  37. return response;
  38. }
  39. /// <summary>
  40. /// api接口-列表
  41. /// </summary>
  42. /// <param name="parm">请求参数</param>
  43. /// <returns>api接口列表</returns>
  44. public List<ApiInfo> ApiList([FromBody] ApiInfoDto param, List<ApiGroup> groups)
  45. {
  46. List<ApiInfo> groupSubs = RedisServer.Cache.LRange<ApiInfo>("appapiinfosub:" + param.groupKind + ":" + param.projectId, 0, -1).ToList();
  47. if (groupSubs.Count <= 0)
  48. {
  49. List<int> ids = groups.Select(m => m.id).ToList();
  50. groupSubs = GetList(m => ids.Contains(m.groupId)).ToList();
  51. RedisServer.Cache.LPush("appapiinfosub:" + param.groupKind + ":" + param.projectId, groupSubs.ToArray());
  52. }
  53. return groupSubs;
  54. }
  55. /// <summary>
  56. /// 列表属性结构-适配后台的tree-select
  57. /// </summary>
  58. /// <returns>列表</returns>
  59. // public List<TreeVo> getTreeList(List<ApiGroup> groups)
  60. // {
  61. // List<TreeVo> result = new List<TreeVo>();
  62. // foreach(var sub in groups)
  63. // {
  64. // TreeVo item = new TreeVo();
  65. // item.label = sub.groupRemark;
  66. // item.value = sub.groupName;
  67. // var list2 = GetList(m => m.groupId == sub.id);
  68. // if(list2.Count > 0)
  69. // {
  70. // item.children = new List<TreeVo>();
  71. // foreach(var sub2 in list2)
  72. // {
  73. // TreeVo item2 = new TreeVo();
  74. // item2.label = sub2.apiName;
  75. // item2.value = sub2.apiKey;
  76. // item.children.Add(item2);
  77. // }
  78. // }
  79. // result.Add(item);
  80. // }
  81. // return result;
  82. // }
  83. /// <summary>
  84. /// 通知-同步接口数据
  85. /// </summary>
  86. /// <param name="parm">请求参数</param>
  87. /// <returns>通知-同步接口数据</returns>
  88. public void notice([FromBody] Dto.Client.NoticeInfoDto param, int groupId, int groupProject, int groupKind)
  89. {
  90. string ApiRouter = param.apiRouter;
  91. string ApiPort = param.apiPort;
  92. string ApiHost = param.apiHost;
  93. string ApiKey = param.apiKey;
  94. string ApiName = param.apiName;
  95. string ApiMethod = param.apiMethod;
  96. ApiInfo apiInfo = GetFirst(m => m.groupId == groupId && m.apiKey == ApiKey && m.version == groupProject);
  97. if (apiInfo == null)
  98. {
  99. Add(new ApiInfo()
  100. {
  101. createDate = DateTime.Now,
  102. apiKey = string.Concat(ApiKey[..1].ToLower(), ApiKey.AsSpan(1)),
  103. apiRouter = ApiRouter,
  104. apiPort = int.Parse(Function.CheckInt(ApiPort)),
  105. apiHost = ApiHost,
  106. apiName = ApiName,
  107. apiMethod = ApiMethod,
  108. groupId = groupId,
  109. version = groupProject,
  110. });
  111. if (groupKind == 1)
  112. {
  113. string ApiPath = param.apiPath;
  114. string ApiEnName = param.apiEnName;
  115. string module = ApiPath.Split('/')[1];
  116. string rootPath = ApiPath.Split('/')[2];
  117. IAdmin.sycnMenu(new AddMenuFromApiDto()
  118. {
  119. module = module,
  120. apiEnName = ApiEnName,
  121. apiPath = ApiPath,
  122. apiName = ApiName,
  123. rootPath = rootPath,
  124. });
  125. }
  126. }
  127. else
  128. {
  129. apiInfo.apiRouter = ApiRouter;
  130. apiInfo.apiPort = int.Parse(Function.CheckInt(ApiPort));
  131. apiInfo.apiHost = ApiHost;
  132. apiInfo.apiName = ApiName;
  133. apiInfo.apiMethod = ApiMethod;
  134. Update(apiInfo, true);
  135. }
  136. }
  137. /// <summary>
  138. /// 通知-同步接口数据
  139. /// </summary>
  140. /// <param name="parm">请求参数</param>
  141. /// <returns>通知-同步接口数据</returns>
  142. public void noticeAll([FromBody] List<NoticeGroupDto> param)
  143. {
  144. var apiGroupService = App.GetService<IApiGroupService>();
  145. foreach (NoticeGroupDto data in param)
  146. {
  147. int groupId = apiGroupService.notice(data);
  148. List<NoticeInfoDto> apiLists = data.child;
  149. foreach (NoticeInfoDto apiList in apiLists)
  150. {
  151. notice(apiList, groupId, data.groupProject, data.groupKind);
  152. }
  153. RedisServer.Cache.Del(new string[] { "appapigroup:" + data.groupKind + ":" + data.groupProject, "appapiinfo:" + data.groupKind + ":" + data.groupProject, "appapiinfosub:" + data.groupKind + ":" + data.groupProject });
  154. }
  155. }
  156. /// <summary>
  157. /// 获取接口数据
  158. /// </summary>
  159. /// <param name="parm">请求参数</param>
  160. /// <returns>获取接口数据</returns>
  161. public Dictionary<string, object> apiInfoList([FromBody] ApiInfoDto param, List<ApiGroup> groups, List<ApiInfo> groupSubs)
  162. {
  163. Dictionary<string, object> obj = new Dictionary<string, object>();
  164. Dictionary<string, int> groupobj = new Dictionary<string, int>();
  165. if (param.groups.Count > 0)
  166. {
  167. foreach (ApiInfoSubDto sub in param.groups)
  168. {
  169. string name = sub.name;
  170. int version = sub.version;
  171. groupobj.Add(name, version);
  172. }
  173. }
  174. foreach (var group in groups)
  175. {
  176. int curVersion = int.Parse(Function.CheckInt(group.groupVersion));
  177. if (groupobj.Any(m => m.Key == group.groupName && m.Value < curVersion))
  178. {
  179. Dictionary<string, object> groupData = new Dictionary<string, object>();
  180. var apis = groupSubs.Where(m => m.groupId == group.id && m.version == param.projectId).ToList();
  181. foreach (var api in apis)
  182. {
  183. Dictionary<string, object> apiData = new Dictionary<string, object>();
  184. string url = api.apiHost;
  185. if (api.apiPort != 80 && api.apiPort != 443)
  186. {
  187. url += ":" + api.apiPort;
  188. }
  189. url += api.apiRouter;
  190. apiData.Add("name", api.apiName);
  191. apiData.Add("url", url);
  192. apiData.Add("method", api.apiMethod);
  193. groupData.Add(api.apiKey, apiData);
  194. }
  195. groupData.Add("groupVersion", group.groupVersion);
  196. groupData.Add("groupInfo", group.groupRemark);
  197. obj.Add(group.groupName, groupData);
  198. }
  199. }
  200. return obj;
  201. }
  202. }
  203. }