|
@@ -1,5 +1,10 @@
|
|
|
using Dm;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using OASystem.Domain;
|
|
|
+using OASystem.Domain.Dtos.SmallFun;
|
|
|
using OASystem.Domain.ViewModels.JuHeExchangeRate;
|
|
|
+using OASystem.Domain.ViewModels.SmallFun;
|
|
|
+using System.DirectoryServices.Protocols;
|
|
|
using System.Net.Http;
|
|
|
using System.Net.Http.Json;
|
|
|
using System.Text.Json;
|
|
@@ -25,44 +30,265 @@ namespace OASystem.API.OAMethodLib.JuHeAPI
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 汇率转换
|
|
|
+ /// 获取汇率
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
- /// <exception cref="NotImplementedException"></exception>
|
|
|
public async Task<JuHeAPIResult> GetExchangeRateAsync()
|
|
|
{
|
|
|
- var result = new JuHeAPIResult() { Resultcode = "10000",Reason="未知错误" };
|
|
|
+ var result = new JuHeAPIResult() { Resultcode = "-2",Reason="未知错误" };
|
|
|
|
|
|
- string url = string.Format("/finance/exchange/rmbquot");
|
|
|
+ string rateDataString = await RedisRepository.RedisFactory
|
|
|
+ .CreateRedisRepository()
|
|
|
+ .StringGetAsync<string>("JuHeApiExchangeRate");//string 取
|
|
|
|
|
|
- try
|
|
|
+ if (string.IsNullOrEmpty(rateDataString))
|
|
|
{
|
|
|
- var exchangeReq = await _httpClient.PostAsync(url,
|
|
|
- new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
|
|
|
- {
|
|
|
+ #region 请求接口并存入缓存
|
|
|
+ string url = string.Format("/finance/exchange/rmbquot");
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var exchangeReq = await _httpClient.PostAsync(url,
|
|
|
+ new FormUrlEncodedContent(new List<KeyValuePair<string, string>>()
|
|
|
+ {
|
|
|
new KeyValuePair<string, string>("key",_appKey),//你申请的key
|
|
|
new KeyValuePair<string, string>("type","0"), //两种格式(0或者1,默认为0)
|
|
|
new KeyValuePair<string, string>("bank","3") //(0:工商银行,1:招商银行,2:建设银行,3:中国银行,
|
|
|
//4:交通银行,5:农业银行,默认为:0)
|
|
|
- }));
|
|
|
- if (exchangeReq.IsSuccessStatusCode)
|
|
|
+ }));
|
|
|
+ if (exchangeReq.IsSuccessStatusCode)
|
|
|
+ {
|
|
|
+ var stringResponse = await exchangeReq.Content.ReadAsStringAsync();
|
|
|
+
|
|
|
+ result = System.Text.Json.JsonSerializer.Deserialize<JuHeAPIResult>(stringResponse,
|
|
|
+ new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
|
|
|
+
|
|
|
+ if (result.Resultcode == "200")
|
|
|
+ {
|
|
|
+ List<ExchangeRateModel> rateList = new List<ExchangeRateModel>();
|
|
|
+
|
|
|
+ #region 处理数据类型
|
|
|
+ JArray jar = JArray.Parse(result.Result.ToJson());
|
|
|
+ for (int i = 0; i < jar.Count; i++)
|
|
|
+ {
|
|
|
+ JObject j = JObject.Parse(jar[i].ToString());
|
|
|
+ for (int x = 1; x < j.Count + 1; x++)
|
|
|
+ {
|
|
|
+ string rateName = "data" + x;
|
|
|
+ string rateDataStr = j[rateName].ToString();
|
|
|
+ if (!string.IsNullOrEmpty(rateDataStr))
|
|
|
+ {
|
|
|
+ ExchangeRateModel exchangeRate = JsonConvert.DeserializeObject<ExchangeRateModel>(rateDataStr);
|
|
|
+ rateList.Add(exchangeRate);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+ TimeSpan ts = DateTime.Now.AddMinutes(120) - DateTime.Now; //设置redis 过期时间 120分钟
|
|
|
+ await RedisRepository
|
|
|
+ .RedisFactory
|
|
|
+ .CreateRedisRepository()
|
|
|
+ .StringSetAsync<string>("JuHeApiExchangeRate", rateList.ToJson(), ts);//string 存
|
|
|
+
|
|
|
+ result.Result = rateList;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.Reason = string.Format("聚合APIError[Error_Code:{0} Resultcode:{1} Msg:{2}]",
|
|
|
+ result.Error_code, result.Resultcode, result.Result);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.Reason = "汇率接口请求失败!";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
- var stringResponse = await exchangeReq.Content.ReadAsStringAsync();
|
|
|
+ result.Reason = ex.Message;
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.Resultcode = "200";
|
|
|
+ result.Result = JsonConvert.DeserializeObject<List<ExchangeRateModel>>(rateDataString);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取汇率 Single
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="currencyCode">币种code</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<Result> GetSingleRateAsync(string currencyCode)
|
|
|
+ {
|
|
|
+
|
|
|
+ var result = new Result() { Code = -2, Msg = "未知错误" };
|
|
|
+ if (currencyCode.ToUpper() == "CNY" )
|
|
|
+ {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- result = System.Text.Json.JsonSerializer.Deserialize<JuHeAPIResult>(stringResponse,
|
|
|
- new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
|
|
|
+ var resultData = await GetExchangeRateAsync();
|
|
|
+ var rateCurrencyData = AppSettingsHelper.Get<RateCurrencyModel>("RateCurrency");
|
|
|
+ var currencyModel = rateCurrencyData.Where(a => a.CurrencyCode == currencyCode).FirstOrDefault();
|
|
|
+ if (currencyModel != null)
|
|
|
+ {
|
|
|
+ if (resultData.Resultcode == "200")
|
|
|
+ {
|
|
|
+ if (resultData.Result != null)
|
|
|
+ {
|
|
|
+ result.Code = 0;
|
|
|
+ result.Data = ((List<ExchangeRateModel>)resultData.Result).Where(a => a.Name == currencyModel.CurrencyName).FirstOrDefault();
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- result.Reason = "汇率接口请求失败!";
|
|
|
+ result.Msg = resultData.Reason;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取汇率转换结果
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<Result> GetExchangeRateAsync(ExchangeRateDto dto)
|
|
|
+ {
|
|
|
+ var result = new Result() { Code = -2, Msg = "未知错误" };
|
|
|
+
|
|
|
+ var rateCurrencyData = AppSettingsHelper.Get<RateCurrencyModel>("RateCurrency");
|
|
|
+
|
|
|
+ if (dto.CurrencyCodePer.ToUpper() == "CNY")
|
|
|
+ {
|
|
|
+ var currencyModelSuf = rateCurrencyData.Where(a => a.CurrencyCode == dto.CurrencyCodeSuf).FirstOrDefault();
|
|
|
+ if (currencyModelSuf == null)
|
|
|
+ {
|
|
|
+ result.Msg = "转换后币种未找到!";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ var rateModelSuf = await GetSingleRateAsync(currencyModelSuf.CurrencyCode);
|
|
|
+ if (rateModelSuf.Code != 0)
|
|
|
+ {
|
|
|
+ result.Msg = rateModelSuf.Msg;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (string.IsNullOrEmpty(rateModelSuf.Data.FSellPri))
|
|
|
+ {
|
|
|
+ result.Msg = string.Format("{0}({1})暂无汇率!", currencyModelSuf.CurrencyName, currencyModelSuf.CurrencyCode);
|
|
|
+ return result;
|
|
|
}
|
|
|
+
|
|
|
+ decimal moneySuf = Convert.ToDecimal(rateModelSuf.Data.FSellPri) / 100 ; //fSellPri
|
|
|
+ decimal settlementMoney = dto.Money / moneySuf;
|
|
|
+ var rateView = new ExchangeRateView {
|
|
|
+ CurrencyCodePre = dto.CurrencyCodePer,
|
|
|
+ CurrencyNamePre = "人民币",
|
|
|
+ MoneyPre = dto.Money,
|
|
|
+ CurrencyCodeSuf = dto.CurrencyCodeSuf,
|
|
|
+ CurrencyNameSuf = currencyModelSuf.CurrencyName,
|
|
|
+ MoneySuf = CommonFun.CutDecimalWithN( settlementMoney,4),
|
|
|
+ UpdateTime = string.Format("{0} {1}", rateModelSuf.Data.Date, rateModelSuf.Data.Time)
|
|
|
+ };
|
|
|
+
|
|
|
+ result.Code = 0;
|
|
|
+ result.Msg = "成功!";
|
|
|
+ result.Data = rateView;
|
|
|
+ return result;
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+ else
|
|
|
{
|
|
|
- result.Reason = ex.Message;
|
|
|
+ var currencyModelPre = rateCurrencyData.Where(a => a.CurrencyCode == dto.CurrencyCodePer).FirstOrDefault();
|
|
|
+
|
|
|
+ if (currencyModelPre == null)
|
|
|
+ {
|
|
|
+ result.Msg = "转换前币种未找到!";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ var rateModelPre = await GetSingleRateAsync(currencyModelPre.CurrencyCode);
|
|
|
+ if (rateModelPre.Code != 0)
|
|
|
+ {
|
|
|
+ result.Msg = rateModelPre.Msg;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (string.IsNullOrEmpty(rateModelPre.Data.FSellPri))
|
|
|
+ {
|
|
|
+ result.Msg = string.Format("{0}({1})暂无汇率!", currencyModelPre.CurrencyName, currencyModelPre.CurrencyCode);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ decimal moneyPre = (Convert.ToDecimal(rateModelPre.Data.FSellPri) / 100) * dto.Money; //fSellPri
|
|
|
+
|
|
|
+ if (dto.CurrencyCodeSuf.ToUpper() == "CNY")
|
|
|
+ {
|
|
|
+ var rateView = new ExchangeRateView
|
|
|
+ {
|
|
|
+ CurrencyCodePre = dto.CurrencyCodePer,
|
|
|
+ CurrencyNamePre = currencyModelPre.CurrencyName,
|
|
|
+ MoneyPre = dto.Money,
|
|
|
+ CurrencyCodeSuf = "CNY",
|
|
|
+ CurrencyNameSuf = "人民币",
|
|
|
+ MoneySuf = CommonFun.CutDecimalWithN(moneyPre, 4),
|
|
|
+ UpdateTime = string.Format("{0} {1}", rateModelPre.Data.Date, rateModelPre.Data.Time)
|
|
|
+ };
|
|
|
+
|
|
|
+ result.Code = 0;
|
|
|
+ result.Msg = "成功!";
|
|
|
+ result.Data = rateView;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var currencyModelSuf = rateCurrencyData.Where(a => a.CurrencyCode == dto.CurrencyCodeSuf).FirstOrDefault();
|
|
|
+
|
|
|
+ if (currencyModelSuf == null)
|
|
|
+ {
|
|
|
+ result.Msg = "转换后币种未找到!";
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ var rateModelSuf = await GetSingleRateAsync(currencyModelSuf.CurrencyCode);
|
|
|
+ if (rateModelSuf.Code != 0)
|
|
|
+ {
|
|
|
+ result.Msg = rateModelSuf.Msg;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (string.IsNullOrEmpty(rateModelSuf.Data.FSellPri))
|
|
|
+ {
|
|
|
+ result.Msg = string.Format("{0}({1})暂无汇率!", currencyModelSuf.CurrencyName, currencyModelSuf.CurrencyCode);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ decimal moneySuf = Convert.ToDecimal(rateModelSuf.Data.FSellPri) / 100; //fSellPri
|
|
|
+
|
|
|
+ decimal settlementMoney = moneyPre / moneySuf;
|
|
|
+ var rateView = new ExchangeRateView
|
|
|
+ {
|
|
|
+ CurrencyCodePre = dto.CurrencyCodePer,
|
|
|
+ CurrencyNamePre = currencyModelPre.CurrencyName,
|
|
|
+ MoneyPre = dto.Money,
|
|
|
+ CurrencyCodeSuf = dto.CurrencyCodeSuf,
|
|
|
+ CurrencyNameSuf = currencyModelSuf.CurrencyName,
|
|
|
+ MoneySuf = CommonFun.CutDecimalWithN(settlementMoney, 4),
|
|
|
+ UpdateTime = string.Format("{0} {1}", rateModelSuf.Data.Date, rateModelSuf.Data.Time)
|
|
|
+ };
|
|
|
+
|
|
|
+ result.Code = 0;
|
|
|
+ result.Msg = "成功!";
|
|
|
+ result.Data = rateView;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|