212 lines
6.9 KiB
C#
212 lines
6.9 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Net.Http.Headers;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using Dlhis.ScheduledTask.Common.Request;
|
|
using Dlhis.ScheduledTask.Common.Response;
|
|
using Kurisu.AspNetCore.Utils.Extensions;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace Dlhis.ScheduledTask.Common.Services.Implements;
|
|
|
|
public class JinkoJIPService : IJinkoJIPService
|
|
{
|
|
private readonly IHttpClientFactory _httpClientFactory;
|
|
private readonly ILogger<JinkoJIPService> _logger;
|
|
private readonly IConfiguration _configuration;
|
|
|
|
public JinkoJIPService(IHttpClientFactory httpClientFactory, ILogger<JinkoJIPService> logger, IConfiguration configuration)
|
|
{
|
|
_httpClientFactory = httpClientFactory;
|
|
_logger = logger;
|
|
_configuration = configuration;
|
|
}
|
|
|
|
private HttpClient GetHttpClient()
|
|
{
|
|
var httpClient = _httpClientFactory.CreateClient();
|
|
httpClient.BaseAddress = new Uri(_configuration.GetSection("JinkoOptions:Jip:BaseUrl").Value);
|
|
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", IssueToken());
|
|
|
|
return httpClient;
|
|
}
|
|
|
|
public async Task<UploadAttendanceResponse> UploadAttendancesAsync(List<UploadAttendanceRequest> requests)
|
|
{
|
|
var requestUrl = "/JIP/HCM/HCM_SWIPE_DATA_SAVE";
|
|
|
|
var body = new
|
|
{
|
|
T_DATA = requests,
|
|
};
|
|
|
|
var json = body.ToJson();
|
|
|
|
//_logger.LogInformation("上传考勤记录请求:{json}", json);
|
|
|
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
var response = await GetHttpClient().PostAsync(requestUrl, content);
|
|
var responseJson = await response.Content.ReadAsStringAsync();
|
|
|
|
_logger.LogInformation("上传考勤记录响应:{json}", responseJson);
|
|
|
|
try
|
|
{
|
|
return responseJson.ToObject<UploadAttendanceResponse>();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return new UploadAttendanceResponse
|
|
{
|
|
OLX = "99",
|
|
OMS = "接口响应数据异常,无法反序列化"
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
public async Task<string> SyncMealSupplementRecordsAsync(List<SyncMealSupplementRecordRequest> requests)
|
|
{
|
|
var requestUrl = "/JIP/DHR/DHR_DL_CALLBACK";
|
|
|
|
var json = requests.ToJson(Kurisu.AspNetCore.Utils.Extensions.JsonExtensions.DefaultSetting);
|
|
|
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
var response = await GetHttpClient().PostAsync(requestUrl, content);
|
|
var responseJson = await response.Content.ReadAsStringAsync();
|
|
|
|
_logger.LogInformation("餐补状态同步响应:{json}", responseJson);
|
|
|
|
var jobj = JObject.Parse(responseJson);
|
|
if (jobj.TryGetValue("exp", out var exp))
|
|
{
|
|
true.ThrowIfTrue(exp.Value<string>());
|
|
}
|
|
|
|
if (jobj.TryGetValue("message", out var message) && !jobj.ContainsKey("code"))
|
|
{
|
|
true.ThrowIfTrue(message.Value<string>());
|
|
}
|
|
|
|
(jobj.GetValue("code").Value<int>() != 200).ThrowIfTrue(jobj.GetValue("message").Value<string>());
|
|
|
|
return responseJson;
|
|
}
|
|
|
|
|
|
public async Task<SapBusinessTripInfoResponse> GetTravelInfosByDepartmentsAsync(DateTime begin, DateTime end, List<string> departmentNos)
|
|
{
|
|
const string apiUrl = "/JIP/HCM/HCM_TRAVELINFO";
|
|
|
|
var beginDay = begin.ToString("yyyyMMdd");
|
|
var endDay = end.ToString("yyyyMMdd");
|
|
|
|
var d = departmentNos.Select(x => new
|
|
{
|
|
IV_ORGID = x
|
|
});
|
|
|
|
//IV_GONGH IV_ORGID
|
|
//IT_2002GH
|
|
var obj = new
|
|
{
|
|
IV_BEGDA = beginDay,
|
|
IV_ENDDA = endDay,
|
|
IT_2002OR = d
|
|
};
|
|
|
|
var body = obj.ToJson();
|
|
|
|
var content = new StringContent(body, Encoding.UTF8, "application/json");
|
|
var response = await GetHttpClient().PostAsync(apiUrl, content);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var jsonResponse = await response.Content.ReadAsStringAsync();
|
|
return jsonResponse.ToObject<SapBusinessTripInfoResponse>();
|
|
}
|
|
|
|
public async Task<SapBusinessTripInfoResponse> GetTravelInfosByUserCodeAsync(DateTime begin, DateTime end, string userCode)
|
|
{
|
|
const string apiUrl = "/JIP/HCM/HCM_TRAVELINFO";
|
|
|
|
var beginDay = begin.ToString("yyyyMMdd");
|
|
var endDay = end.ToString("yyyyMMdd");
|
|
|
|
//IV_GONGH IV_ORGID
|
|
//IT_2002GH
|
|
var obj = new
|
|
{
|
|
IV_BEGDA = beginDay,
|
|
IV_ENDDA = endDay,
|
|
IT_2002GH = new List<object>
|
|
{
|
|
new
|
|
{
|
|
IV_GONGH = userCode
|
|
}
|
|
}
|
|
};
|
|
|
|
var body = obj.ToJson();
|
|
|
|
var content = new StringContent(body, Encoding.UTF8, "application/json");
|
|
var response = await GetHttpClient().PostAsync(apiUrl, content);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var jsonResponse = await response.Content.ReadAsStringAsync();
|
|
return jsonResponse.ToObject<SapBusinessTripInfoResponse>();
|
|
}
|
|
|
|
public async Task<SapFaceSyncResponse> SyncFaceToSapAsync(string userCode, string base64)
|
|
{
|
|
const string apiUrl = "/JIP/HCM/HCM_I_PHOTO";
|
|
var obj = new
|
|
{
|
|
I_WORKCODE = userCode,
|
|
I_PHOTO_STR = base64
|
|
};
|
|
|
|
var body = obj.ToJson();
|
|
|
|
var content = new StringContent(body, Encoding.UTF8, "application/json");
|
|
var response = await GetHttpClient().PostAsync(apiUrl, content);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var jsonResponse = await response.Content.ReadAsStringAsync();
|
|
return jsonResponse.ToObject<SapFaceSyncResponse>();
|
|
}
|
|
|
|
|
|
public string IssueToken()
|
|
{
|
|
var jwtKey = _configuration.GetSection("JinkoOptions:Jip:Key").Value;
|
|
var jwtSecret = _configuration.GetSection("JinkoOptions:Jip:Secret").Value;
|
|
const int min = 5;
|
|
|
|
var now = DateTime.Now.AddMinutes(-min);
|
|
var expires = DateTime.Now.AddMinutes(min);
|
|
|
|
var claims = new List<Claim>
|
|
{
|
|
new(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(now).ToUnixTimeSeconds()}"),
|
|
new(JwtRegisteredClaimNames.Exp, $"{new DateTimeOffset(expires).ToUnixTimeSeconds()}"),
|
|
new(JwtRegisteredClaimNames.Iss, jwtKey),
|
|
};
|
|
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret));
|
|
var descriptor = new SecurityTokenDescriptor
|
|
{
|
|
Subject = new ClaimsIdentity(claims),
|
|
Issuer = jwtKey,
|
|
IssuedAt = now,
|
|
NotBefore = now,
|
|
Expires = expires,
|
|
SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
|
|
};
|
|
|
|
var jwtHandler = new JwtSecurityTokenHandler();
|
|
var securityToken = jwtHandler.CreateToken(descriptor);
|
|
return jwtHandler.WriteToken(securityToken);
|
|
}
|
|
} |