MesApiClient.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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.Linq;
  9. using System.Net.Http;
  10. using System.Runtime.InteropServices;
  11. using System.Text;
  12. using System.Text.Json.Nodes;
  13. using System.Threading.Tasks;
  14. namespace LocalhostMES.Controller
  15. {
  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;
  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. // 2.1.2 Headers - 免TOKEN写入
  36. var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
  37. var response = await _httpClient.PostAsync($"{_baseUrl}/api/mes/receiveWorkOrder", content);//http://192.168.1.26:5000/api/mes/receiveWorkOrder
  38. return await ParseResponseAsync<ApiResponse<bool>>(response);
  39. }
  40. public async Task<ApiResponse<List<WorkOrderInfo>>> GetWorkOrdersAsync()
  41. {
  42. var response = await _httpClient.GetAsync($"{_baseUrl}/api/mes/getWorkOrders");
  43. return await ParseResponseAsync<ApiResponse<List<WorkOrderInfo>>>(response);
  44. }
  45. #endregion
  46. #region 2.2 SN打印请求
  47. public async Task<ApiResponse<SnPrintResponseData>> RequestSnPrintAsync(SnPrintRequest request)
  48. {
  49. // 2.2.2 Headers - 需要token
  50. var requestJson = JsonConvert.SerializeObject(request);
  51. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  52. var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/battery/sn/print \r\n")
  53. {
  54. Content = content
  55. };
  56. requestMessage.Headers.Add("app-key", _appKey);
  57. requestMessage.Headers.Add("token", _token);
  58. var response = await _httpClient.SendAsync(requestMessage);
  59. ApiResponse<SnPrintResponseData> res = await ParseResponseAsync<ApiResponse<SnPrintResponseData>>(response);
  60. List<SnInfo> inSn = new List<SnInfo>();
  61. if (res.data != null)
  62. {
  63. for (int i = 0; i < res.data.Sn.Count; i++)
  64. {
  65. inSn.Add(new SnInfo()
  66. {
  67. WorkOrderNo = res.data.WorkOrderNo,
  68. Sn = res.data.Sn[i].Sn,
  69. GenerateTime = DateTime.Now,
  70. IsUsed = false,
  71. PrintType = "0"
  72. });
  73. }
  74. }
  75. if (inSn.Count != 0)
  76. {
  77. if (DatabaseHelper.InsertSnInfos(inSn))
  78. {
  79. return res;
  80. }
  81. else
  82. {
  83. res.success = false;
  84. res.msg = "SN插入数据库错误";
  85. }
  86. }
  87. return res;
  88. }
  89. public async Task<ApiResponse<List<SnInfo>>> GetSnsAsync(string workOrderNo)
  90. {
  91. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getSns/{workOrderNo}");
  92. requestMessage.Headers.Add("app-key", _appKey);
  93. requestMessage.Headers.Add("token", _token);
  94. var response = await _httpClient.SendAsync(requestMessage);
  95. return await ParseResponseAsync<ApiResponse<List<SnInfo>>>(response);
  96. }
  97. #endregion
  98. #region 2.3 接收SN和关键件
  99. public async Task<ApiResponse<bool?>> SendSnComponentAsync(SnKeyComponentRequest request)
  100. {
  101. var requestJson = JsonConvert.SerializeObject(request);
  102. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  103. var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/task/receive/sn/keyComponent " )
  104. {
  105. Content = content
  106. };
  107. requestMessage.Headers.Add("app-key", _appKey);
  108. requestMessage.Headers.Add("token", _token);
  109. var response = await _httpClient.SendAsync(requestMessage);
  110. return await ParseResponseAsync<ApiResponse<bool?>>(response);
  111. }
  112. public async Task<ApiResponse<List<BindRecord>>> GetBindRecordsAsync()
  113. {
  114. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getBindRecords");
  115. requestMessage.Headers.Add("app-key", _appKey);
  116. requestMessage.Headers.Add("token", _token);
  117. var response = await _httpClient.SendAsync(requestMessage);
  118. return await ParseResponseAsync<ApiResponse<List<BindRecord>>>(response);
  119. }
  120. #endregion
  121. #region 2.4 接收工件加工参数
  122. public async Task<ApiResponse<bool?>> SendProcessParametersAsync(ProcessParameterRequest request)
  123. {
  124. request.messageTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  125. var requestJson = JsonConvert.SerializeObject(request);
  126. var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
  127. LogHelper.WriteLogInfo(requestJson);
  128. var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://mom-jh-annex-api.leapmotor.com/app-mom-mes/api/task/receive/manualSave ")
  129. {
  130. Content = content
  131. };
  132. requestMessage.Headers.Add("app-key", _appKey);
  133. requestMessage.Headers.Add("token", _token);
  134. var response = await _httpClient.SendAsync(requestMessage);
  135. return await ParseResponseAsync<ApiResponse<bool?>>(response);
  136. }
  137. public async Task<ApiResponse<List<ProcessRecord>>> GetProcessRecordsAsync()
  138. {
  139. var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"{_baseUrl}/api/mes/getProcessRecords");
  140. requestMessage.Headers.Add("app-key", _appKey);
  141. requestMessage.Headers.Add("token", _token);
  142. var response = await _httpClient.SendAsync(requestMessage);
  143. return await ParseResponseAsync<ApiResponse<List<ProcessRecord>>>(response);
  144. }
  145. #endregion
  146. #region 辅助方法
  147. private async Task<T> ParseResponseAsync<T>(HttpResponseMessage response) where T : class
  148. {
  149. if ( response.IsSuccessStatusCode)
  150. {
  151. var json = await response.Content.ReadAsStringAsync();
  152. var jObject = JObject.Parse(json);
  153. LogHelper.WriteLogInfo(json);
  154. if (jObject.ContainsKey("data"))
  155. {
  156. string str = jObject["data"].ToString();
  157. if (jObject["data"].ToString() == "null"|| jObject["data"].ToString().Length==0)
  158. {
  159. // 添加新属性
  160. jObject["data"] = "true";
  161. }
  162. }
  163. // 将JObject转换回字符串
  164. string newJsonString = jObject.ToString();
  165. return JsonConvert.DeserializeObject<T>(newJsonString);
  166. }
  167. else
  168. {
  169. var errorJson = await response.Content.ReadAsStringAsync();
  170. try
  171. {
  172. var jObject = JObject.Parse(errorJson);
  173. if (jObject.ContainsKey("data"))
  174. {
  175. if (jObject["data"].ToString() == "null" || jObject["data"].ToString().Length == 0)
  176. {
  177. // 添加新属性
  178. jObject["data"] = "false";
  179. }
  180. }
  181. // 将JObject转换回字符串
  182. string newJsonString = jObject.ToString();
  183. return JsonConvert.DeserializeObject<T>(newJsonString);
  184. }
  185. catch
  186. {
  187. throw new HttpRequestException($"请求失败: {response.StatusCode}");
  188. }
  189. }
  190. }
  191. public void Dispose()
  192. {
  193. _httpClient?.Dispose();
  194. GC.SuppressFinalize(this);
  195. }
  196. #endregion
  197. }
  198. }