using Hotline.Enterprise; using Hotline.Share.Dtos; using RestSharp; using System.Collections; using System.Text; using Hotline.Share.Dtos.Enterprise; using XF.Domain.Cache; using XF.Domain.Exceptions; namespace Hotline.YbEnterprise.Sdk { public class EnterpriseService : IEnterpriseService { private readonly RestClient _client; private readonly EnterpriseConfig _config; public EnterpriseService(EnterpriseConfig config) { _client = new RestClient(); _config = config; } /// /// 获取企业列表 /// /// /// /// /// /// public async Task GetEnterpriseList(string name = "", int current = 1, int size = 10, CancellationToken cancellationToken =default, ITypedCache cacheResponse = default) { var request = new EnterpriseListRequest { EnterpriseName = name, Current = current, Size = size }; var token = await cacheResponse.GetAsync("EnterpriseResponse", cancellationToken); if (token == null || (token != null && token.EndTime > DateTime.Now)) { token = await GetTokenAsync(cancellationToken); token.EndTime = DateTime.Now.AddMinutes(45); await cacheResponse.SetAsync("EnterpriseResponse",token, cancellationToken: cancellationToken); } var path = _config.AddressUrl + "platform/12345/selectEnterpriseList"; var rest = new RestRequest(path, Method.Post); rest.AddHeader("content-type", "application/json"); rest.AddHeader("Blade-Auth", token.TokenType + " " + token.AccessToken); var res = await ExecuteAsync(path, Method.Post, request, rest, cancellationToken); return res == null? null: res.data; } /// /// 获取TOKEN /// /// /// /// public async Task GetTokenAsync(CancellationToken cancellationToken) { string authorization = _config.ClientId + ":" + _config.ClientSecret; authorization = Encoder.Base64Code(authorization); authorization = authorization.Replace("@", "="); var path = _config.AddressUrl + "blade-auth/oauth/getAccessToken"; var rest = new RestRequest(path, Method.Post); rest.AddHeader("content-type", "application/json"); rest.AddHeader("Authorization", "Basic " + authorization); rest.AddHeader("Tenant-Id", _config.TenantId); var res = await ExecuteAsync(path, Method.Post,"", rest, cancellationToken); if (res is null) throw new UserFriendlyException("获取token请求失败"); if (!res.success) throw new UserFriendlyException("获取token请求失败"); return res.data; } public async Task ExecuteAsync(string path, Method httpMethod, TRequest request, RestRequest restRequest = null, CancellationToken cancellationToken = default) where TRequest : class { var req = new RestRequest(path, httpMethod); if (httpMethod is Method.Get) { req.AddObject(request); } else { req.AddJsonBody(request); } try { var response = await _client.ExecuteAsync(req, cancellationToken); return response.Data; } catch (Exception e) { throw new HttpRequestException($"企业服务数据错误,Error: {e.Message}"); } } public static class Encoder { /// /// 对string 进行 Base64 编码 /// /// string 参数 /// Base64 编码 public static string Base64Code(string strMessage) { bool flag = string.IsNullOrEmpty(strMessage); string result; if (flag) { result = ""; } else { char[] array = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '=' }; byte b = 0; ArrayList arrayList = new ArrayList(Encoding.Default.GetBytes(strMessage)); int count = arrayList.Count; int num = count / 3; int num2 = count % 3; bool flag2 = num2 > 0; if (flag2) { for (int i = 0; i < 3 - num2; i++) { arrayList.Add(b); } num++; } StringBuilder stringBuilder = new StringBuilder(num * 4); for (int i = 0; i < num; i++) { byte[] array2 = new byte[] { (byte)arrayList[i * 3], (byte)arrayList[i * 3 + 1], (byte)arrayList[i * 3 + 2] }; int[] array3 = new int[4]; array3[0] = array2[0] >> 2; array3[1] = ((int)(array2[0] & 3) << 4 ^ array2[1] >> 4); bool flag3 = !array2[1].Equals(b); if (flag3) { array3[2] = ((int)(array2[1] & 15) << 2 ^ array2[2] >> 6); } else { array3[2] = 64; } bool flag4 = !array2[2].Equals(b); if (flag4) { array3[3] = (int)(array2[2] & 63); } else { array3[3] = 64; } stringBuilder.Append(array[array3[0]]); stringBuilder.Append(array[array3[1]]); stringBuilder.Append(array[array3[2]]); stringBuilder.Append(array[array3[3]]); } string text = stringBuilder.ToString(); text = text.Replace("=", "@"); text = text.Replace("+", "%2B"); result = text; } return result; } } } }