using Attribute; using Dto; using Vo; using Model; using Model.Base; using Repository; using Service; using Microsoft.AspNetCore.Mvc; using Common; using Dto.Client; using Infrastructure; using Feign; namespace Services { /// /// api接口Service业务层处理 /// [AppService(ServiceType = typeof(IApiInfoService), ServiceLifetime = LifeTime.Transient)] public class ApiInfoService : BaseService, IApiInfoService { /// /// api接口-列表 /// /// 请求参数 /// api接口列表 public PagedInfo List([FromQuery] PagerInfo page, [FromQuery] ApiInfoListDto parm) { //开始拼装查询条件 var predicate = Expressionable.Create(); predicate = predicate.AndIF(parm.groupId > 0, m => m.groupId == parm.groupId); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.apiName), m => m.apiName.Contains(parm.apiName)); var response = Queryable() .Where(predicate.ToExpression()) .OrderByDescending(m => m.id) .Includes(m => m.apiGroupJoin) .ToPage(page); return response; } /// /// api接口-列表 /// /// 请求参数 /// api接口列表 public List ApiList([FromBody] ApiInfoDto param, List groups) { List groupSubs = RedisServer.Cache.LRange("appapiinfosub:" + param.groupKind + ":" + param.projectId, 0, -1).ToList(); if (groupSubs.Count <= 0) { List ids = groups.Select(m => m.id).ToList(); groupSubs = GetList(m => ids.Contains(m.groupId)).ToList(); RedisServer.Cache.LPush("appapiinfosub:" + param.groupKind + ":" + param.projectId, groupSubs.ToArray()); } return groupSubs; } /// /// 列表属性结构-适配后台的tree-select /// /// 列表 // public List getTreeList(List groups) // { // List result = new List(); // foreach(var sub in groups) // { // TreeVo item = new TreeVo(); // item.label = sub.groupRemark; // item.value = sub.groupName; // var list2 = GetList(m => m.groupId == sub.id); // if(list2.Count > 0) // { // item.children = new List(); // foreach(var sub2 in list2) // { // TreeVo item2 = new TreeVo(); // item2.label = sub2.apiName; // item2.value = sub2.apiKey; // item.children.Add(item2); // } // } // result.Add(item); // } // return result; // } /// /// 通知-同步接口数据 /// /// 请求参数 /// 通知-同步接口数据 public void notice([FromBody] Dto.Client.NoticeInfoDto param, int groupId, int groupProject, int groupKind) { string ApiRouter = param.apiRouter; string ApiPort = param.apiPort; string ApiHost = param.apiHost; string ApiKey = param.apiKey; string ApiName = param.apiName; string ApiMethod = param.apiMethod; ApiInfo apiInfo = GetFirst(m => m.groupId == groupId && m.apiKey == ApiKey && m.version == groupProject); if (apiInfo == null) { Add(new ApiInfo() { createDate = DateTime.Now, apiKey = string.Concat(ApiKey[..1].ToLower(), ApiKey.AsSpan(1)), apiRouter = ApiRouter, apiPort = int.Parse(Function.CheckInt(ApiPort)), apiHost = ApiHost, apiName = ApiName, apiMethod = ApiMethod, groupId = groupId, version = groupProject, }); if (groupKind == 1) { string ApiPath = param.apiPath; string ApiEnName = param.apiEnName; string module = ApiPath.Split('/')[1]; string rootPath = ApiPath.Split('/')[2]; IAdmin.sycnMenu(new AddMenuFromApiDto() { module = module, apiEnName = ApiEnName, apiPath = ApiPath, apiName = ApiName, rootPath = rootPath, }); } } else { apiInfo.apiRouter = ApiRouter; apiInfo.apiPort = int.Parse(Function.CheckInt(ApiPort)); apiInfo.apiHost = ApiHost; apiInfo.apiName = ApiName; apiInfo.apiMethod = ApiMethod; Update(apiInfo, true); } } /// /// 通知-同步接口数据 /// /// 请求参数 /// 通知-同步接口数据 public void noticeAll([FromBody] List param) { var apiGroupService = App.GetService(); foreach (NoticeGroupDto data in param) { int groupId = apiGroupService.notice(data); List apiLists = data.child; foreach (NoticeInfoDto apiList in apiLists) { notice(apiList, groupId, data.groupProject, data.groupKind); } RedisServer.Cache.Del(new string[] { "appapigroup:" + data.groupKind + ":" + data.groupProject, "appapiinfo:" + data.groupKind + ":" + data.groupProject, "appapiinfosub:" + data.groupKind + ":" + data.groupProject }); } } /// /// 获取接口数据 /// /// 请求参数 /// 获取接口数据 public Dictionary apiInfoList([FromBody] ApiInfoDto param, List groups, List groupSubs) { Dictionary obj = new Dictionary(); Dictionary groupobj = new Dictionary(); if (param.groups.Count > 0) { foreach (ApiInfoSubDto sub in param.groups) { string name = sub.name; int version = sub.version; groupobj.Add(name, version); } } foreach (var group in groups) { int curVersion = int.Parse(Function.CheckInt(group.groupVersion)); if (groupobj.Any(m => m.Key == group.groupName && m.Value < curVersion)) { Dictionary groupData = new Dictionary(); var apis = groupSubs.Where(m => m.groupId == group.id && m.version == param.projectId).ToList(); foreach (var api in apis) { Dictionary apiData = new Dictionary(); string url = api.apiHost; if (api.apiPort != 80 && api.apiPort != 443) { url += ":" + api.apiPort; } url += api.apiRouter; apiData.Add("name", api.apiName); apiData.Add("url", url); apiData.Add("method", api.apiMethod); groupData.Add(api.apiKey, apiData); } groupData.Add("groupVersion", group.groupVersion); groupData.Add("groupInfo", group.groupRemark); obj.Add(group.groupName, groupData); } } return obj; } } }