Files
RBMESAPICore/Controllers/Interface/KDCloudHttpClient.cs
yuyubohh e8494ba988 qqq
2025-09-09 22:41:29 +08:00

237 lines
9.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Kingdee.CDP.WebApi.SDK;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RB_MES_API.Context;
using RB_MES_API.Models.Cloud;
using RB_MES_API.Models.Pangu;
using RB_MES_APICore.Models.Cloud;
using System.Drawing;
using System.Net;
using System.Text;
namespace RB_MES_API.Controllers
{
/// <summary>
/// 金蝶云API接口实现
/// </summary>
public class KDCloudHttpClient : IKDCloudHttpClient
{
private readonly IHttpClientFactory _httpClient;
/// <summary>
/// Cookie保证登录后所有访问持有一个Cookie
/// </summary>
public static CookieContainer cookie = new CookieContainer();
/// <summary>
/// 构造
/// </summary>
/// <param name="httpClient"></param>
public KDCloudHttpClient(IHttpClientFactory httpClient)
{
_httpClient = httpClient;
}
/// <summary>
/// Cloud身份认证
/// </summary>
/// <returns></returns>
public async Task<bool> LoginErp()
{
string result = string.Empty;
try
{
string acctid = ApiSettingsHelper.GetConfig("X-KDApi-AcctID");
string username = LocalStaticRequest.GetSystemProfile(4, "TokenUserName");
string passod = LocalStaticRequest.GetSystemProfile(4, "TokenPWD");
int lcid = 0;
int.TryParse(ApiSettingsHelper.GetConfig("X-KDApi-LCID"), out lcid);
string apiurl = ApiSettingsHelper.GetConfig("X-KDApi-ServerUrl");
//var tmpPwd = AESHelp.Encrypt("Aa123456..");
//passod = tmpPwd;
List<object> Parameters = new List<object>
{
acctid,//帐套Id
username,//用户名
AESHelp.Decrypt(passod),//密码 //必须先通过解密
lcid
};
string _myurl = apiurl + "Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc"; //登录地址
string content = JsonConvert.SerializeObject(Parameters);
JObject jObj = new JObject
{
{ "format", 1 },
{ "useragent", "ApiClient" },
{ "rid", Guid.NewGuid().ToString().GetHashCode().ToString() },
{ "parameters", content },
{ "timestamp", DateTime.Now },
{ "v", "1.0" }
};
string sContent = jObj.ToString();
StringContent scontent = new StringContent(sContent, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _httpClient.CreateClient("enpower").PostAsync(_myurl, scontent);
result = await response.Content.ReadAsStringAsync();
if (result.StartsWith("MsgCode:"))
{
var resultJObject = JObject.Parse(result);
var loginstatus = resultJObject.SelectToken("$..MsgCode");
if (loginstatus != null)
{
if (loginstatus.Value<int>() == 1)
{
return false;
}
}
}
Uri uri = new Uri(_myurl);
cookie.SetCookies(uri, JObject.Parse(result)["KDSVCSessionId"].ToString());
int status = await Task.FromResult(JObject.Parse(result)["LoginResultType"]!.Value<int>());
LocalStaticRequest.Islogin = status == 1 || status == 5 ? true : false; //如果账号不是administrator就只能==1
}
catch (Exception ex)
{
LocalStaticRequest.Islogin = false;
LogHelper.WriteLog(string.Format("Cloud身份认证的LoginErp发生错误{0}", string.IsNullOrEmpty(result) ? ex.Message : result));
}
return LocalStaticRequest.Islogin;
}
/// <inheritdoc/>
public async Task<string> AsyncClientRequest(string myurl, string content)
{
string result = string.Empty;
try
{
JObject jObj = new JObject
{
{ "format", 1 },
{ "useragent", "ApiClient" },
{ "rid", Guid.NewGuid().ToString().GetHashCode().ToString() },
{ "parameters", content },
{ "timestamp", DateTime.Now },
{ "v", "1.0" }
};
string sContent = jObj.ToString();
StringContent scontent = new StringContent(sContent, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _httpClient.CreateClient("enpower").PostAsync(myurl, scontent);
result = await response.Content.ReadAsStringAsync();
if (result.StartsWith("MsgCode:"))
{
var resultJObject = JObject.Parse(result);
var loginstatus = resultJObject.SelectToken("$..MsgCode");
if (loginstatus != null)
{
if (loginstatus.Value<int>() == 1)
{
result = "-1";
LocalStaticRequest.Islogin = false;
}
}
}
result = await Task.FromResult(ValidateResult(result));
}
catch (Exception e)
{
LocalStaticRequest.Islogin = false;
LogHelper.WriteLog(string.Format("HttpClient访问.NET CORE推荐使用的AsyncClientRequest发生错误{0}", string.IsNullOrEmpty(result) ? e.Message : result));
}
return result;
}
private static string ValidateResult(string responseText)
{
try
{
if (responseText.StartsWith("response_error:"))
{
return responseText.TrimStart("response_error:".ToCharArray());
}
}
catch (Exception)
{
throw;
}
return responseText;
}
/// <summary>
/// 向MES系统推送数据
/// </summary>
/// <param name="inputdata">推送的JSON文本</param>
/// <returns></returns>
public async Task<PanguBreakJson> PushMesData(string inputdata)
{
PanguBreakJson breadJson = new PanguBreakJson() { Status = false };
//string mesurl = _config.GetConnectionString("MesUrl");
string mesurl = ApiSettingsHelper.GetConfig("MesUrl");
mesurl += mesurl.Substring(mesurl.Length - 1, 1) == "/" ? "" : "/"; //如果最后一个字符不是"/"就添加上去
mesurl += "updateimsdata";
HttpWebRequest reqest = (HttpWebRequest)WebRequest.Create(mesurl);
reqest.Timeout = 20 * 60 * 1000;
reqest.Method = "POST";
reqest.ContentType = "application/json";
try
{
byte[] bytes = Encoding.UTF8.GetBytes(inputdata);
reqest.ContentLength = bytes.Length;
string result = string.Empty;
reqest.GetRequestStream().Write(bytes, 0, bytes.Length);
HttpWebResponse webResponse = (HttpWebResponse)await reqest.GetResponseAsync();
//读取返回数据
StreamReader streamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
result = streamReader.ReadToEnd();
streamReader.Dispose();
webResponse.Dispose();
breadJson = JsonConvert.DeserializeObject<PanguBreakJson>(result);
}
catch (Exception ex)
{
breadJson.Message = ex.Message;
}
return breadJson;
}
/// <inheritdoc/>
public string SDKBillQuery(BillQuery query)
{
string json = JsonConvert.SerializeObject(query);
return LocalStaticRequest.cloudApi.BillQuery(json);
}
public string SDKBatchSaveRequest(string formid, string data)
{
return LocalStaticRequest.cloudApi.BatchSave(formid, data);
}
public bool SDKRequestStatus(string resultJson)
{
var resultJObject = JObject.Parse(resultJson);
var queryNode = resultJObject.SelectToken("$..IsSuccess"); //这里使用的是JsonPatch是否异常固定在这个位置
if (queryNode == null)
{
return true;
}
var isSuccess = queryNode.Value<bool>();
return isSuccess;
}
public bool SDKBillQueryStatus(string resultJson)
{
bool isSuccess = false;
if (string.IsNullOrEmpty(resultJson)) return isSuccess;
try
{
JArray jArray = (JArray)JsonConvert.DeserializeObject(resultJson.ToString());
if (jArray != null && jArray.Count > 0)
{
isSuccess = true;
}
}
catch (Exception)
{
}
return isSuccess;
}
}
}