using LocalhostMES.Core; using LocalhostMES.DataBase; using LocalhostMES.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Runtime.InteropServices; using System.Text; using System.Text.Json.Nodes; using System.Threading.Tasks; namespace LocalhostMES.Controller { public class MesApiClient : IDisposable { private readonly HttpClient _httpClient; private readonly string _baseUrl; private readonly string _appKey; private readonly string _token; public MesApiClient(string baseUrl, string appKey = "test-app-key", string token = "test-token-123") { _baseUrl = baseUrl; _appKey = appKey; _token = token; _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(60) }; } #region 2.1 厂级MES下发工单信息 public async Task> SendWorkOrderAsync(WorkOrderRequest request) { // 2.1.2 Headers - 免TOKEN写入 var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync($"{_baseUrl}/api/mes/receiveWorkOrder", content);//http://192.168.1.26:5000/api/mes/receiveWorkOrder 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) { // 2.2.2 Headers - 需要token var requestJson = JsonConvert.SerializeObject(request); var content = new StringContent(requestJson, Encoding.UTF8, "application/json"); var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/battery/sn/print \r\n") { Content = content }; requestMessage.Headers.Add("app-key", _appKey); requestMessage.Headers.Add("token", _token); var response = await _httpClient.SendAsync(requestMessage); ApiResponse res = await ParseResponseAsync>(response); List 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; } else { 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, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/task/receive/sn/keyComponent " ) { 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) { var requestJson = JsonConvert.SerializeObject(request); var content = new StringContent(requestJson, Encoding.UTF8, "application/json"); var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/task/receive/manualSave ") { Content = content }; requestMessage.Headers.Add("app-key", _appKey); requestMessage.Headers.Add("token", _token); var response = await _httpClient.SendAsync(requestMessage); LogHelper.WriteLogInfo(requestMessage.ToString()); 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 #region 辅助方法 private async Task ParseResponseAsync(HttpResponseMessage response) where T : class { LogHelper.WriteLogInfo(response.ToString()); if ( response.IsSuccessStatusCode) { var json = await response.Content.ReadAsStringAsync(); var jObject = JObject.Parse(json); if (jObject.ContainsKey("data")) { string str = jObject["data"].ToString(); if (jObject["data"].ToString() == "null"|| jObject["data"].ToString().Length==0) { // 添加新属性 jObject["data"] = "true"; } } // 将JObject转换回字符串 string newJsonString = jObject.ToString(); return JsonConvert.DeserializeObject(newJsonString); } else { 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"; } } // 将JObject转换回字符串 string newJsonString = jObject.ToString(); return JsonConvert.DeserializeObject(newJsonString); } catch { throw new HttpRequestException($"请求失败: {response.StatusCode}"); } } } public void Dispose() { _httpClient?.Dispose(); GC.SuppressFinalize(this); } #endregion } }