using LocalhostMES.Core;
using LocalhostMES.DataBase;
using LocalhostMES.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace LocalhostMES.Api.Services
{
///
/// 调用厂级 MOM/MES HTTP 接口;本地网关 URL 与云端 URL 均在此封装。
///
public class MesApiClient : IDisposable
{
private readonly HttpClient _httpClient;
private readonly string _baseUrl;
private readonly string _appKey;
private readonly string _token;
private MesMomHttpEndpoints mesMom;
public MesApiClient(string baseUrl, string appKey = "test-app-key", string token = "test-token-123")
{
_baseUrl = baseUrl?.TrimEnd('/') ?? "";
_appKey = appKey;
_token = token;
_httpClient = new HttpClient
{
Timeout = TimeSpan.FromSeconds(60)
};
mesMom=new MesMomHttpEndpoints();
mesMom.SetUrl();
if ( ConfigurationManager.AppSettings[ "IsMesTest" ] == "1" )
{
mesMom.SetTest();
}
}
#region 2.1 厂级MES下发工单信息
public async Task> SendWorkOrderAsync(WorkOrderRequest request)
{
var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync($"{_baseUrl}/api/mes/receiveWorkOrder", content);
return await ParseResponseAsync>(response);
}
public async Task>> GetWorkOrdersAsync()
{
var response = await _httpClient.GetAsync($"{_baseUrl}/api/mes/getWorkOrders");
return await ParseResponseAsync>>(response);
}
#endregion
#region 2.2 SN打印请求
public async Task> RequestSnPrintAsync(SnPrintRequest request)
{
var requestJson = JsonConvert.SerializeObject(request);
var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
var requestMessage = new HttpRequestMessage(HttpMethod.Post, mesMom.BatterySnPrint)
{
Content = content
};
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
ApiResponse res = await ParseResponseAsync>(response);
var inSn = new List();
if (res.data != null)
{
for (int i = 0; i < res.data.Sn.Count; i++)
{
inSn.Add(new SnInfo
{
WorkOrderNo = res.data.WorkOrderNo,
Sn = res.data.Sn[i].Sn,
GenerateTime = DateTime.Now,
IsUsed = false,
PrintType = "0"
});
}
}
if (inSn.Count != 0)
{
if (DatabaseHelper.InsertSnInfos(inSn))
{
return res;
}
res.success = false;
res.msg = "SN插入数据库错误";
}
return res;
}
public async Task>> GetSnsAsync(string workOrderNo)
{
var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getSns/{workOrderNo}");
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
return await ParseResponseAsync>>(response);
}
#endregion
#region 2.3 接收SN和关键件
public async Task> SendSnComponentAsync(SnKeyComponentRequest request)
{
var requestJson = JsonConvert.SerializeObject(request);
var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
var requestMessage = new HttpRequestMessage(HttpMethod.Post, mesMom.ReceiveSnKeyComponent)
{
Content = content
};
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
return await ParseResponseAsync>(response);
}
public async Task>> GetBindRecordsAsync()
{
var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getBindRecords");
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
return await ParseResponseAsync>>(response);
}
#endregion
#region 2.4 接收工件加工参数
public async Task> SendProcessParametersAsync(ProcessParameterRequest request)
{
request.messageTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var requestJson = JsonConvert.SerializeObject(request);
var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
LogHelper.WriteLogInfo(requestJson);
var requestMessage = new HttpRequestMessage(HttpMethod.Post, mesMom.ManualSave)
{
Content = content
};
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
return await ParseResponseAsync>(response);
}
public async Task>> GetProcessRecordsAsync()
{
var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getProcessRecords");
requestMessage.Headers.Add("app-key", _appKey);
requestMessage.Headers.Add("token", _token);
var response = await _httpClient.SendAsync(requestMessage);
return await ParseResponseAsync>>(response);
}
#endregion
private async Task ParseResponseAsync(HttpResponseMessage response) where T : class
{
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
var jObject = JObject.Parse(json);
LogHelper.WriteLogInfo(json);
if (jObject.ContainsKey("data"))
{
if (jObject["data"].ToString() == "null" || jObject["data"].ToString().Length == 0)
{
jObject["data"] = "true";
}
}
string newJsonString = jObject.ToString();
return JsonConvert.DeserializeObject(newJsonString);
}
var errorJson = await response.Content.ReadAsStringAsync();
try
{
var jObject = JObject.Parse(errorJson);
if (jObject.ContainsKey("data"))
{
if (jObject["data"].ToString() == "null" || jObject["data"].ToString().Length == 0)
{
jObject["data"] = "false";
}
}
string newJsonString = jObject.ToString();
return JsonConvert.DeserializeObject(newJsonString);
}
catch
{
throw new HttpRequestException($"请求失败: {response.StatusCode}");
}
}
public void Dispose()
{
_httpClient?.Dispose();
GC.SuppressFinalize(this);
}
}
}