You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
6.7 KiB
C#

using EntrustSettle.Common;
using EntrustSettle.Common.Caches;
using EntrustSettle.Common.Const;
using EntrustSettle.IServices;
using EntrustSettle.Model;
using EntrustSettle.Model.Dtos;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using ILogger = Microsoft.Extensions.Logging.ILogger;
namespace EntrustSettle.Services
{
public class HYDService : IHYDService
{
private readonly ICaching caching;
private readonly ILogger logger;
private readonly IRestClient client;
public HYDService(ICaching caching,
ILoggerFactory logFactory,
[FromKeyedServices(HttpEnum.Hyd)] IRestClient client)
{
this.caching = caching;
this.client = client;
logger = logFactory.CreateLogger("BigDataLogger");
}
public async Task<long> Submit(HydSubmitDto submitDto)
{
string token = await GetToken();
var url = AppSettings.app("Apis", "Hyd", "SubmitUrl");
var customer = AppSettings.app("Apis", "Hyd", "CUSTOMER");
var headers = new Dictionary<string, string>()
{
{ "PDK", token },
{ "CUSTOMER", customer }
};
var request = new RestRequest(url);
request.AddHeaders(headers);
request.AddJsonBody(submitDto);
var resp = await client.ExecutePostAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达下单接口", client, request, resp);
if (resp.IsSuccessful)
{
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code").ObjToInt();
if (code == 200)
{
var bsno = jobj.GetValue("data").ObjToLong();
return bsno;
}
else
{
if (code > 400 && code < 500)
{
await caching.DelCacheKeyAsync(CacheConst.HydAccessToken);
}
}
}
throw new Exception("调用海运达下单接口失败");
}
public async Task<List<HydQueryResultDto>> Query(string mblno)
{
string token = await GetToken();
var url = AppSettings.app("Apis", "Hyd", "QueryUrl");
var customer = AppSettings.app("Apis", "Hyd", "CUSTOMER");
var headers = new Dictionary<string, string>()
{
{ "PDK", token },
{ "CUSTOMER", customer }
};
string[] param = [mblno];
var request = new RestRequest(url);
request.AddHeaders(headers);
request.AddJsonBody(param);
var resp = await client.ExecuteGetAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达状态查询接口", client, request, resp);
if (resp.IsSuccessful)
{
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code").ObjToInt();
if (code == 200)
{
var result = JsonConvert.DeserializeObject<List<HydQueryResultDto>>(jobj.GetValue("rows").ToString());
return result;
}
else
{
if (code > 400 && code < 500)
{
await caching.DelCacheKeyAsync(CacheConst.HydAccessToken);
}
}
}
throw new Exception("调用海运达状态查询接口失败");
}
public async Task<bool> FeedBack(List<HydFeedbackDto> hydFeedbackDtoList)
{
string token = await GetToken();
var url = AppSettings.app("Apis", "Hyd", "FeedbackUrl");
var customer = AppSettings.app("Apis", "Hyd", "CUSTOMER");
var headers = new Dictionary<string, string>()
{
{ "PDK", token },
{ "CUSTOMER", customer }
};
foreach (var item in hydFeedbackDtoList)
{
var request = new RestRequest(url);
request.AddHeaders(headers);
request.AddJsonBody(item);
var resp = await client.ExecutePostAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达反馈接口", client, request, resp);
if (resp.IsSuccessful)
{
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code").ObjToInt();
if (code == 200)
{
continue;
}
else
{
if (code > 400 && code < 500)
{
await caching.DelCacheKeyAsync(CacheConst.HydAccessToken);
}
var msg = jobj.GetValue("msg").ToString();
}
}
throw new Exception("调用海运达反馈接口失败");
}
return true;
}
private async Task<string> GetToken()
{
var token = await caching.GetAsync<string>(CacheConst.HydAccessToken);
if (!string.IsNullOrEmpty(token))
{
return token;
}
var url = AppSettings.app("Apis", "Hyd", "LoginUrl");
var request = new RestRequest(url);
var body = new
{
username = AppSettings.app("Apis", "Hyd", "username"),
password = AppSettings.app("Apis", "Hyd", "password")
};
request.AddJsonBody(body);
var resp = await client.ExecutePostAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达登录接口", client, request, resp);
if (resp.IsSuccessful)
{
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code");
if (code.ObjToInt() == 200)
{
token = jobj.GetValue("token").ToString();
await caching.SetAsync(CacheConst.HydAccessToken, token, TimeSpan.FromHours(3));
return token;
}
}
throw new Exception("调用海运达登录接口失败");
}
}
}