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.

241 lines
9.0 KiB
C#

using EntrustSettle.Common;
using EntrustSettle.Common.Caches;
using EntrustSettle.Common.Const;
using EntrustSettle.IServices;
using EntrustSettle.Model;
using EntrustSettle.Model.Dtos;
8 months ago
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
8 months ago
using NLog;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
8 months ago
using ILogger = Microsoft.Extensions.Logging.ILogger;
namespace EntrustSettle.Services
{
public class HYDService : IHYDService
{
private const string HYD_LOGIN_ERROR_MSG1 = "重新登录";
private const string HYD_LOGIN_ERROR_MSG2 = "token";
private readonly ICaching caching;
8 months ago
private readonly ILogger logger;
private readonly IRestClient client;
8 months ago
public HYDService(ICaching caching,
7 months ago
//ILoggerFactory logFactory,
ILogger<HYDService> logger,
8 months ago
[FromKeyedServices(HttpEnum.Hyd)] IRestClient client)
{
this.caching = caching;
8 months ago
this.client = client;
7 months ago
//logger = logFactory.CreateLogger("BigDataLogger");
this.logger = logger;
}
public async Task<long> Submit(HydSubmitDto submitDto, bool isRetry = true)
{
7 months ago
try
{
7 months ago
string token = await GetToken();
7 months ago
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.PostAsync(request); // 以Execute开头的方法不会引发异常
7 months ago
logger.LogRestSharp("海运达下单接口", client, request, resp);
8 months ago
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code").ObjToInt();
if (code == 200)
8 months ago
{
var bsno = jobj.GetValue("data").ObjToLong();
return bsno;
}
else
{
var msg = jobj.GetValue("msg").ToString();
if ((code > 400 && code < 500) || msg.Contains(HYD_LOGIN_ERROR_MSG1) || msg.Contains(HYD_LOGIN_ERROR_MSG2))
7 months ago
{
await caching.RemoveAsync(CacheConst.HydAccessToken);
5 months ago
if (isRetry)
{
return await Submit(submitDto, false);
}
8 months ago
}
5 months ago
throw new Exception($"code:{code},msg:{msg}");
}
7 months ago
}
catch (Exception ex)
{
5 months ago
throw new Exception($"下单或开发票失败,原因:{DealExMessage(ex?.Message)}");
}
}
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];
8 months ago
var request = new RestRequest(url);
request.AddHeaders(headers);
request.AddJsonBody(param);
8 months ago
var resp = await client.ExecuteGetAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达状态查询接口", client, request, resp);
if (resp.IsSuccessful)
{
8 months ago
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
{
8 months ago
if (code > 400 && code < 500)
{
await caching.DelCacheKeyAsync(CacheConst.HydAccessToken);
}
}
}
7 months ago
throw new Exception("调用外部状态查询接口失败");
}
5 months ago
public async Task<bool> FeedBack(List<HydFeedbackDto> hydFeedbackDtoList, bool isRetry = true)
{
7 months ago
try
{
7 months ago
string token = await GetToken();
7 months ago
var url = AppSettings.app("Apis", "Hyd", "FeedbackUrl");
var customer = AppSettings.app("Apis", "Hyd", "CUSTOMER");
var headers = new Dictionary<string, string>()
{
7 months ago
{ "PDK", token },
{ "CUSTOMER", customer }
};
foreach (var item in hydFeedbackDtoList)
{
var request = new RestRequest(url);
request.AddHeaders(headers);
request.AddJsonBody(item);
var resp = await client.PostAsync(request); // 以Execute开头的方法不会引发异常
7 months ago
logger.LogRestSharp("海运达反馈接口", client, request, resp);
//var jobj = JObject.Parse("{\"msg\":\"token格式/信息有误,或账号已在其他系统登录,请重新登录\",\"code\":500}");
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code").ObjToInt();
if (code == 200)
8 months ago
{
continue;
}
else
{
var msg = jobj.GetValue("msg").ToString();
if ((code > 400 && code < 500) || msg.Contains(HYD_LOGIN_ERROR_MSG1) || msg.Contains(HYD_LOGIN_ERROR_MSG2))
7 months ago
{
await caching.RemoveAsync(CacheConst.HydAccessToken);
5 months ago
if (isRetry)
{
return await FeedBack(hydFeedbackDtoList, false);
}
8 months ago
}
throw new Exception($"code:{code},msg:{msg}");
}
}
7 months ago
return true;
}
catch (Exception ex)
{
6 months ago
throw new Exception($"反馈失败,原因:{DealExMessage(ex?.Message)}");
7 months ago
}
}
private async Task<string> GetToken()
{
try
{
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.PostAsync(request); // 以Execute开头的方法不会引发异常
logger.LogRestSharp("海运达登录接口", client, request, resp);
8 months ago
var jobj = JObject.Parse(resp.Content);
var code = jobj.GetValue("code");
if (code.ObjToInt() == 200)
{
token = jobj.GetValue("token").ToString();
5 months ago
await caching.SetAsync(CacheConst.HydAccessToken, token, TimeSpan.FromSeconds(AppSettings.app("Apis", "Hyd", "TokenCacheTime").ObjToInt()));
8 months ago
return token;
}
else
{
var msg = jobj.GetValue("msg");
throw new Exception($"code:{code},msg:{msg}");
}
}
catch (Exception ex)
{
6 months ago
throw new Exception($"调用外部登录接口时发生异常({DealExMessage(ex?.Message)}");
}
}
string DealExMessage(string msg)
{
if (msg == null)
{
return null;
}
// 添加判断,防止暴露海运达的接口地址给使用方
if (msg.Contains("不知道这样的主机"))
{
return "无法连接到外部主机请检查连接状态如果当前为测试环境请检查VPN";
}
else
{
return $"{msg.Replace("sdlandsea", "").Replace("sdland-sea", "").Replace("", "")}";
}
}
}
}