102 lines
3.6 KiB
C#
102 lines
3.6 KiB
C#
using System.Text;
|
|
using Dlhis.Message.Options;
|
|
using Kurisu.AspNetCore.Utils.Extensions;
|
|
using Microsoft.Extensions.Options;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace Dlhis.Message.Services;
|
|
|
|
public class JinkoApiService : IJinkoApiService
|
|
{
|
|
private readonly IHttpClientFactory _httpClientFactory;
|
|
private readonly DingTalkOption _dingTalkOption;
|
|
|
|
public JinkoApiService(IHttpClientFactory httpClientFactory, IOptions<DingTalkOption> options)
|
|
{
|
|
_httpClientFactory = httpClientFactory;
|
|
_dingTalkOption = options.Value;
|
|
}
|
|
|
|
private async Task<string> GetTokenAsync()
|
|
{
|
|
var token = string.Empty;
|
|
if (string.IsNullOrEmpty(token))
|
|
{
|
|
var httpClient = _httpClientFactory.CreateClient("jinko.httpclient");
|
|
|
|
var form = new FormUrlEncodedContent(new Dictionary<string, string>
|
|
{
|
|
{ "appkey", _dingTalkOption.AppKey },
|
|
{ "appsecret", _dingTalkOption.AppSecret }
|
|
});
|
|
|
|
var response = await httpClient.GetStringAsync($"/gettoken?{await form.ReadAsStringAsync()}");
|
|
var jObj = JObject.Parse(response);
|
|
(jObj.Value<string>("errcode") == "0").ThrowIfFalse(jObj.Value<string>("errmsg"));
|
|
|
|
token = jObj.Value<string>("access_token");
|
|
}
|
|
|
|
return token;
|
|
}
|
|
|
|
|
|
public async Task SendWorkMessageAsync(JinkoSendWorkMessageRequest request)
|
|
{
|
|
request.Content.IsEmpty().ThrowIfTrue("发送内容不能为空");
|
|
var token = await GetTokenAsync();
|
|
|
|
var users = await GetJinkoOaInfoByWorkCodes(request.WorkCodes);
|
|
var userStringIds = string.Join(",", users.Select(x => x.Id));
|
|
(userStringIds.Length > 100).ThrowIfTrue("超出消息接受人数,length > 100");
|
|
|
|
var body = new
|
|
{
|
|
agent_id = _dingTalkOption.AgentId,
|
|
userid_list = userStringIds,
|
|
msg = new
|
|
{
|
|
msgtype = "text",
|
|
text = new
|
|
{
|
|
content = request.Content
|
|
},
|
|
},
|
|
}.ToJson();
|
|
|
|
var httpClient = _httpClientFactory.CreateClient("jinko.httpclient");
|
|
var url = $"/topapi/message/corpconversation/asyncsend_v2?access_token={token}";
|
|
var content = new StringContent(body, Encoding.UTF8, "application/json");
|
|
|
|
var response = await httpClient.PostAsync(url, content);
|
|
var jsonResponse = await response.Content.ReadAsStringAsync();
|
|
|
|
//_logger.LogInformation("请求参数:{Request} \r\n 钉钉请求参数:{DingTalkRequest} \r\n 钉钉响应:{DingTalkResponse}", JsonConvert.SerializeObject(request), body, jsonResponse);
|
|
|
|
var jObj = JObject.Parse(jsonResponse);
|
|
(jObj.Value<string>("errcode") == "0").ThrowIfFalse(jObj.Value<string>("errmsg"));
|
|
}
|
|
|
|
|
|
private async Task<List<JinkoOaInfo>> GetJinkoOaInfoByWorkCodes(List<string> codes)
|
|
{
|
|
var httpClient = _httpClientFactory.CreateClient("jinko.oa");
|
|
|
|
var body = new
|
|
{
|
|
token = "TTMlaplWIEjmJHiVShWybekyyNnJXDHD",
|
|
type = "workCode",
|
|
workCode = string.Join(",", codes)
|
|
}.ToJson();
|
|
|
|
var content = new StringContent(body, Encoding.UTF8, "application/json");
|
|
var response = await httpClient.PostAsync("http://oa.jinkosolar.com/api/commonRequestService/getUserByWorkCode/v2", content);
|
|
var responseJson = await response.Content.ReadAsStringAsync();
|
|
|
|
var oaInfo = JsonConvert.DeserializeObject<JinkoOaResponse<JinkoData<List<JinkoOaInfo>>>>(responseJson);
|
|
(oaInfo.Code == 200).ThrowIfFalse(oaInfo.Message);
|
|
|
|
return oaInfo.Result.Data;
|
|
}
|
|
} |