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); } } }