Files
jinko.yikatong/Src/Dlhis.Basic/Common/Message/Services/Implements/JinkoApiService.cs

156 lines
5.4 KiB
C#

using System.Text;
using Dlhis.Basic.Common.ApiLog.Services;
using Dlhis.Basic.Common.Message.Requests;
using Dlhis.Basic.Common.Message.Responses;
using Dlhis.Entity.Common.Enums;
using Kurisu.AspNetCore.Utils.Extensions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Dlhis.Basic.Common.Message.Services.Implements;
public class JinkoApiService : IJinkoApiService
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IServiceProvider _serviceProvider;
private const string _agentId = "2984453842";
private const string _appKey = "dingppvj6wvtgbagwpsw";
private const string _appSecret = "k9mxYwilZgQiuhV_RVYRueoIAWHCQWrUdhbj6DAmiEiqMzSQE4igt0kAj97rmLaS";
public JinkoApiService(IHttpClientFactory httpClientFactory, IServiceProvider serviceProvider)
{
_httpClientFactory = httpClientFactory;
_serviceProvider = serviceProvider;
}
public async Task SendWorkMessageAsync(DingTalkWorkMessageRequest request)
{
request.Content.IsEmpty().ThrowIfTrue("发送内容不能为空");
var users = await GetJinkoOaInfoByWorkCodes(request.WorkCodes);
var userIds = users.Select(x => x.Id).Join(",");
(userIds.Length > 100).ThrowIfTrue("超出消息接受人数,length > 100");
var body = new
{
agent_id = _agentId,
userid_list = userIds,
msg = new
{
msgtype = "text",
text = new
{
content = request.Content
}
}
}.ToJson();
await CommonRequestAsync(body);
}
public async Task SendWorkMessageByWorkGridAsync(DingTalkWorkMessageRequest request)
{
await SendWorkMessageAsync(request);
using var scope = _serviceProvider.CreateScope();
var ol = scope.ServiceProvider.GetService<IOperateLog>();
await ol.LogAsync(OperateLogType.WorkGrid, $"dingtalk消息推送:{request.ToJson()}");
}
public async Task SendMessageUrlAsync(DingTalkMessageUrlRequest request)
{
request.Title.IsEmpty().ThrowIfTrue("发送标题不能为空");
request.Text.IsEmpty().ThrowIfTrue("发送内容不能为空");
request.UserCode.IsEmpty().ThrowIfTrue("发送用户不能为空");
request.MessageUrl.IsEmpty().ThrowIfTrue("消息链接不能为空");
request.PicUrl.IsEmpty().ThrowIfTrue("图片链接不能为空");
var users = await GetJinkoOaInfoByWorkCodes(new List<string> { request.UserCode });
var userIds = users.Select(x => x.Id).Join(",");
var body = new
{
agent_id = _agentId,
userid_list = userIds,
msg = new
{
msgtype = "link",
link = new
{
messageUrl = request.MessageUrl,
picUrl = request.PicUrl,
title = request.Title,
text = request.Text
}
}
}.ToJson();
await CommonRequestAsync(body);
}
private async Task CommonRequestAsync(string body)
{
#if !DEBUG
var token = await GetTokenAsync();
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();
var jObject = JObject.Parse(jsonResponse);
(jObject.Value<string>("errcode") == "0").ThrowIfFalse(jObject.Value<string>("errmsg"));
#endif
}
private async Task<string> GetTokenAsync()
{
var token = string.Empty;
if (!token.IsEmpty())
{
return token;
}
var httpClient = _httpClientFactory.CreateClient("jinko.httpclient");
var form = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "appkey", _appKey },
{ "appsecret", _appSecret }
});
//eg: appkey=dingumelppews6rah7x9&appsecret=nsWfJTVjYesHVzrLiP-t1TQqMQvC1L_kZNfXfnIyzcXK4pCTfKprkjZcxAbsDR_l
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;
}
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;
}
}