using System.Net; using System.Text; using Dlhis.Entity.Basic.Entity; using Dlhis.Jip.Api.ClientHandlers; using Dlhis.Jip.Api.Dto; using Dlhis.Jip.Api.Responses; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Newtonsoft.Json; namespace Dlhis.Basic.Organization.Services.Implements; public class JinkoSapService : IJinkoSapService { private readonly IDbContext _dbContext; private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; private readonly IHttpClientFactory _httpClientFactory; public JinkoSapService(IHttpClientFactory httpClientFactory, IDbContext dbContext, IServiceProvider serviceProvider, ILogger logger) { _dbContext = dbContext; _serviceProvider = serviceProvider; _logger = logger; _httpClientFactory = httpClientFactory; } private async Task GetHttpClientAsync() { var token = await new JipTokenHandler().GetTokenAsync(_serviceProvider); var httpClient = _httpClientFactory.CreateClient(); httpClient.BaseAddress = new Uri("http://jip.jinkosolar.com"); httpClient.Timeout = TimeSpan.FromMinutes(30); httpClient.DefaultRequestHeaders.Add("Authorization", token); return httpClient; } public async Task GetSapOrganizationsAsync() { //const string apiUrl = "/RESTAdapter/Rest/EHR_ORGANIZATION/"; var httpClient = await GetHttpClientAsync(); var response = await httpClient.PostAsync("/JIP/HCM/HCM_SYN_01", new StringContent("{}", Encoding.UTF8, "application/json")); response.EnsureSuccessStatusCode(); string responseJson = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(responseJson); return result; } public async Task GetPositionsAsync() { //const string apiUrl = "/RESTAdapter/Rest/EHR_POSITION/"; var httpClient = await GetHttpClientAsync(); var response = await httpClient.PostAsync("/JIP/HCM/HCM_SYN_02", new StringContent("{}", Encoding.UTF8, "application/json")); response.EnsureSuccessStatusCode(); string responseJson = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(responseJson); return result; } public async Task GetPersonsByWerkAsync(string werk) { //const string apiUrl = "/RESTAdapter/Rest/EHR_PERSONNEL/"; var httpClient = await GetHttpClientAsync(); var werkInfo = await _dbContext.Queryable() .Where(x => x.Enable) .Where(x => x.Werk == werk) .SingleAsync(); var body = new { //I_ALLINFO = "X", //I_DATE = DateTime.Today.ToString("yyyy-MM-dd"),//开始日期 T_WERKS = new { item = new List { new { WERKS = werkInfo.Werk } } }, T_PERSON = Array.Empty(), T_PNO = Array.Empty(), }; var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("/JIP/HCM/HCM_SYN_03_IAM", content); if (response.StatusCode != HttpStatusCode.OK) { _logger.LogError("获取{Werk}人事范围数据异常:{error}", werk, await response.Content.ReadAsStringAsync()); response.EnsureSuccessStatusCode(); } var jsonResponse = await response.Content.ReadAsStringAsync(); var personResp = JsonConvert.DeserializeObject(jsonResponse); List persons = new(); if (personResp?.Persons?.Any() == true) { persons.AddRange(personResp.Persons); } return new SapPersonResponse() { Persons = persons }; } public async Task GetPersonsByCodeAsync(string code) { //const string apiUrl = "/RESTAdapter/Rest/EHR_PERSONNEL/"; var httpClient = await GetHttpClientAsync(); var body = new { //I_ALLINFO = "X", T_WERKS = Array.Empty(), T_PERSON = Array.Empty(), T_PNO = new { item = new List { new { ZWORKCODE = code } } }, }; var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("/JIP/HCM/HCM_SYN_03_IAM", content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); var personResp = JsonConvert.DeserializeObject(jsonResponse); List persons = new(); if (personResp?.Persons?.Any() == true) { persons.AddRange(personResp.Persons); } return new SapPersonResponse { Persons = persons }; } }