MesApiClient.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using LocalhostMES.Core;
  2. using LocalhostMES.DataBase;
  3. using LocalhostMES.Models;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Net.Http;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace LocalhostMES.Api.Services
  12. {
  13. /// <summary>
  14. /// 调用厂级 MOM/MES HTTP 接口;本地网关 URL 与云端 URL 均在此封装。
  15. /// </summary>
  16. public class MesApiClient : IDisposable
  17. {
  18. private readonly HttpClient _httpClient;
  19. private readonly string _baseUrl;
  20. private readonly string _appKey;
  21. private readonly string _token;
  22. public MesApiClient(string baseUrl, string appKey = "test-app-key", string token = "test-token-123")
  23. {
  24. _baseUrl = baseUrl?.TrimEnd('/') ?? "";
  25. _appKey = appKey;
  26. _token = token;
  27. _httpClient = new HttpClient
  28. {
  29. Timeout = TimeSpan.FromSeconds(60)
  30. };
  31. }
  32. #region 2.1 厂级MES下发工单信息
  33. public async Task<ApiResponse<bool>> SendWorkOrderAsync(WorkOrderRequest request)
  34. {
  35. var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
  36. var response = await _httpClient.PostAsync($"{_baseUrl}/api/mes/receiveWorkOrder", content);
  37. return await ParseResponseAsync<ApiResponse<bool>>(response);
  38. }
  39. public async Task<ApiResponse<List<WorkOrderInfo>>> GetWorkOrdersAsync()
  40. {
  41. var response = await _httpClient.GetAsync($"{_baseUrl}/api/mes/getWorkOrders");
  42. return await ParseResponseAsync<ApiResponse<List<WorkOrderInfo>>>(response);
  43. }
  44. #endregion
  45. #region 2.2 SN打印请求
  46. public async Task<ApiResponse<SnPrintResponseData>> RequestSnPrintAsync(SnPrintRequest request)
  47. {
  48. var requestJson = JsonConvert.SerializeObject(request);
  49. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  50. var requestMessage = new HttpRequestMessage(HttpMethod.Post, MesMomHttpEndpoints.BatterySnPrint)
  51. {
  52. Content = content
  53. };
  54. requestMessage.Headers.Add("app-key", _appKey);
  55. requestMessage.Headers.Add("token", _token);
  56. var response = await _httpClient.SendAsync(requestMessage);
  57. ApiResponse<SnPrintResponseData> res = await ParseResponseAsync<ApiResponse<SnPrintResponseData>>(response);
  58. var inSn = new List<SnInfo>();
  59. if (res.data != null)
  60. {
  61. for (int i = 0; i < res.data.Sn.Count; i++)
  62. {
  63. inSn.Add(new SnInfo
  64. {
  65. WorkOrderNo = res.data.WorkOrderNo,
  66. Sn = res.data.Sn[i].Sn,
  67. GenerateTime = DateTime.Now,
  68. IsUsed = false,
  69. PrintType = "0"
  70. });
  71. }
  72. }
  73. if (inSn.Count != 0)
  74. {
  75. if (DatabaseHelper.InsertSnInfos(inSn))
  76. {
  77. return res;
  78. }
  79. res.success = false;
  80. res.msg = "SN插入数据库错误";
  81. }
  82. return res;
  83. }
  84. public async Task<ApiResponse<List<SnInfo>>> GetSnsAsync(string workOrderNo)
  85. {
  86. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getSns/{workOrderNo}");
  87. requestMessage.Headers.Add("app-key", _appKey);
  88. requestMessage.Headers.Add("token", _token);
  89. var response = await _httpClient.SendAsync(requestMessage);
  90. return await ParseResponseAsync<ApiResponse<List<SnInfo>>>(response);
  91. }
  92. #endregion
  93. #region 2.3 接收SN和关键件
  94. public async Task<ApiResponse<bool?>> SendSnComponentAsync(SnKeyComponentRequest request)
  95. {
  96. var requestJson = JsonConvert.SerializeObject(request);
  97. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  98. var requestMessage = new HttpRequestMessage(HttpMethod.Post, MesMomHttpEndpoints.ReceiveSnKeyComponent)
  99. {
  100. Content = content
  101. };
  102. requestMessage.Headers.Add("app-key", _appKey);
  103. requestMessage.Headers.Add("token", _token);
  104. var response = await _httpClient.SendAsync(requestMessage);
  105. return await ParseResponseAsync<ApiResponse<bool?>>(response);
  106. }
  107. public async Task<ApiResponse<List<BindRecord>>> GetBindRecordsAsync()
  108. {
  109. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getBindRecords");
  110. requestMessage.Headers.Add("app-key", _appKey);
  111. requestMessage.Headers.Add("token", _token);
  112. var response = await _httpClient.SendAsync(requestMessage);
  113. return await ParseResponseAsync<ApiResponse<List<BindRecord>>>(response);
  114. }
  115. #endregion
  116. #region 2.4 接收工件加工参数
  117. public async Task<ApiResponse<bool?>> SendProcessParametersAsync(ProcessParameterRequest request)
  118. {
  119. request.messageTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  120. var requestJson = JsonConvert.SerializeObject(request);
  121. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  122. LogHelper.WriteLogInfo(requestJson);
  123. var requestMessage = new HttpRequestMessage(HttpMethod.Post, MesMomHttpEndpoints.ManualSave)
  124. {
  125. Content = content
  126. };
  127. requestMessage.Headers.Add("app-key", _appKey);
  128. requestMessage.Headers.Add("token", _token);
  129. var response = await _httpClient.SendAsync(requestMessage);
  130. return await ParseResponseAsync<ApiResponse<bool?>>(response);
  131. }
  132. public async Task<ApiResponse<List<ProcessRecord>>> GetProcessRecordsAsync()
  133. {
  134. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getProcessRecords");
  135. requestMessage.Headers.Add("app-key", _appKey);
  136. requestMessage.Headers.Add("token", _token);
  137. var response = await _httpClient.SendAsync(requestMessage);
  138. return await ParseResponseAsync<ApiResponse<List<ProcessRecord>>>(response);
  139. }
  140. #endregion
  141. private async Task<T> ParseResponseAsync<T>(HttpResponseMessage response) where T : class
  142. {
  143. if (response.IsSuccessStatusCode)
  144. {
  145. var json = await response.Content.ReadAsStringAsync();
  146. var jObject = JObject.Parse(json);
  147. LogHelper.WriteLogInfo(json);
  148. if (jObject.ContainsKey("data"))
  149. {
  150. if (jObject["data"].ToString() == "null" || jObject["data"].ToString().Length == 0)
  151. {
  152. jObject["data"] = "true";
  153. }
  154. }
  155. string newJsonString = jObject.ToString();
  156. return JsonConvert.DeserializeObject<T>(newJsonString);
  157. }
  158. var errorJson = await response.Content.ReadAsStringAsync();
  159. try
  160. {
  161. var jObject = JObject.Parse(errorJson);
  162. if (jObject.ContainsKey("data"))
  163. {
  164. if (jObject["data"].ToString() == "null" || jObject["data"].ToString().Length == 0)
  165. {
  166. jObject["data"] = "false";
  167. }
  168. }
  169. string newJsonString = jObject.ToString();
  170. return JsonConvert.DeserializeObject<T>(newJsonString);
  171. }
  172. catch
  173. {
  174. throw new HttpRequestException($"请求失败: {response.StatusCode}");
  175. }
  176. }
  177. public void Dispose()
  178. {
  179. _httpClient?.Dispose();
  180. GC.SuppressFinalize(this);
  181. }
  182. }
  183. }