Files
2026-06-08 10:59:21 +08:00

211 lines
9.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Newtonsoft.Json;
using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WebApi.Helpers;
using WebApi.Models;
namespace WebApiCall
{
/// <summary>
/// WMS WebApi调用类
/// </summary>
public class AGVWebApiCall
{
private static readonly HttpClient httpClient;
static AGVWebApiCall()
{
httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromSeconds(20); // 设置超时时间为20秒
}
/// <summary>
/// MES叫料接口 - 同步版本返回bool结果
/// </summary>
/// <param name="storageCode">叫料位置(库位号)</param>
/// <param name="goodsCode">物料号(型号)</param>
/// <returns>是否成功</returns>
public static bool MES_To_AGV_CallGoods(string storageCode, string goodsCode)
{
try
{
var task = MES_To_AGV_CallGoods_Async(storageCode, goodsCode);
task.Wait(); // 同步等待异步任务完成
return task.Result;
}
catch (Exception err)
{
string errorMsg = $"叫料同步调用异常 - 库位: {storageCode}, 物料号: {goodsCode}, 异常: {err.Message}";
LogHelper.ShowMsg(errorMsg);
Console.WriteLine($"错误: {MethodBase.GetCurrentMethod().Name} - {errorMsg}");
return false;
}
}
/// <summary>
/// MES叫料接口 - 内部异步实现
/// </summary>
private static async Task<bool> MES_To_AGV_CallGoods_Async(string storageCode, string goodsCode)
{
int AID = -1;
try
{
string WMSIPPort = ConfigurationManager.AppSettings["AGVIPPort"];
string url = $"http://{WMSIPPort}/wms/apiForThirdPartySys/callGoods";
var requestData = new MES_To_AGV_CallGoods_Req
{
storageCode = storageCode,
goodsCode = goodsCode
};
string json = JsonConvert.SerializeObject(requestData);
LogHelper.ShowMsg($"发起叫料请求 - 库位: {storageCode}, 物料号: {goodsCode} -> Send【{url}】{json}");
AID = LogHelper.SaveWebApiReqLogo(url, json);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(url, content);
var responseContent = await response.Content.ReadAsStringAsync();
LogHelper.ShowMsg($"叫料响应 - 库位: {storageCode}, 物料号: {goodsCode} -> Response【{url}】{responseContent}");
if (response.IsSuccessStatusCode)
{
// 解析WMS响应
var wmsResponse = JsonConvert.DeserializeObject<WmsApiResponse>(responseContent);
if (wmsResponse != null && wmsResponse.code == 200)
{
LogHelper.ShowMsg($"叫料成功 - 库位: {storageCode}, 物料号: {goodsCode}, 响应消息: {wmsResponse.msg}");
LogHelper.SaveWebApiResLogo(AID, JsonConvert.SerializeObject(wmsResponse));
return true;
}
else
{
LogHelper.ShowMsg($"叫料失败 - 库位: {storageCode}, 物料号: {goodsCode}, 错误信息: {wmsResponse?.msg ?? ""}");
LogHelper.SaveWebApiResLogo(AID, JsonConvert.SerializeObject(wmsResponse));
return false;
}
}
else
{
string msg = $"叫料HTTP请求失败 - 库位: {storageCode}, 物料号: {goodsCode}, 状态码: {response.StatusCode}, 响应: {responseContent}";
LogHelper.ShowMsg(msg);
LogHelper.SaveWebApiResLogo(AID, msg);
return false;
}
}
catch (Exception err)
{
string errorMsg = $"叫料异常 - 库位: {storageCode}, 物料号: {goodsCode}, 异常详情: {err.Message}";
LogHelper.ShowMsg(errorMsg);
Console.WriteLine($"错误: {MethodBase.GetCurrentMethod().Name} - {errorMsg}");
if (AID > 0)
{
LogHelper.SaveWebApiResLogo(AID, errorMsg);
}
return false;
}
}
/// <summary>
/// MES退料接口 - 同步版本返回bool结果
/// </summary>
/// <param name="storageCode">退料位置(库位号)</param>
/// <param name="goodsCode">物料号(型号)</param>
/// <param name="isEmpty">是否为空 0.空托 1.余料</param>
/// <returns>是否成功</returns>
public static bool MES_To_AGV_ReturnGoods(string storageCode, string goodsCode, int isEmpty)
{
try
{
var task = MES_To_AGV_ReturnGoods_Async(storageCode, goodsCode, isEmpty);
task.Wait(); // 同步等待异步任务完成
return task.Result;
}
catch (Exception err)
{
string emptyTypeDesc = isEmpty == 0 ? "空托" : "余料";
string errorMsg = $"退料同步调用异常 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}), 异常: {err.Message}";
LogHelper.ShowMsg(errorMsg);
Console.WriteLine($"错误: {MethodBase.GetCurrentMethod().Name} - {errorMsg}");
return false;
}
}
/// <summary>
/// MES退料接口 - 内部异步实现
/// </summary>
private static async Task<bool> MES_To_AGV_ReturnGoods_Async(string storageCode, string goodsCode, int isEmpty)
{
int AID = -1;
try
{
string emptyTypeDesc = isEmpty == 0 ? "空托" : "余料";
string WMSIPPort = ConfigurationManager.AppSettings["AGVIPPort"];
string url = $"http://{WMSIPPort}/wms/apiForThirdPartySys/returnGoods";
var requestData = new MES_To_AGV_ReturnGoods_Req
{
storageCode = storageCode,
goodsCode = goodsCode,
isEmpty = isEmpty
};
string json = JsonConvert.SerializeObject(requestData);
LogHelper.ShowMsg($"发起退料请求 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}) -> Send【{url}】{json}");
AID = LogHelper.SaveWebApiReqLogo(url, json);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(url, content);
var responseContent = await response.Content.ReadAsStringAsync();
LogHelper.ShowMsg($"退料响应 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}) -> Response【{url}】{responseContent}");
if (response.IsSuccessStatusCode)
{
// 解析WMS响应
var wmsResponse = JsonConvert.DeserializeObject<WmsApiResponse>(responseContent);
if (wmsResponse != null && wmsResponse.code == 200)
{
LogHelper.ShowMsg($"退料成功 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}), 响应消息: {wmsResponse.msg}");
LogHelper.SaveWebApiResLogo(AID, JsonConvert.SerializeObject(wmsResponse));
return true;
}
else
{
LogHelper.ShowMsg($"退料失败 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}), 错误信息: {wmsResponse?.msg ?? ""}");
LogHelper.SaveWebApiResLogo(AID, JsonConvert.SerializeObject(wmsResponse));
return false;
}
}
else
{
string msg = $"退料HTTP请求失败 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}), 状态码: {response.StatusCode}, 响应: {responseContent}";
LogHelper.ShowMsg(msg);
LogHelper.SaveWebApiResLogo(AID, msg);
return false;
}
}
catch (Exception err)
{
string emptyTypeDesc = isEmpty == 0 ? "空托" : "余料";
string errorMsg = $"退料异常 - 库位: {storageCode}, 物料号: {goodsCode}, 类型: {emptyTypeDesc}({isEmpty}), 异常详情: {err.Message}";
LogHelper.ShowMsg(errorMsg);
Console.WriteLine($"错误: {MethodBase.GetCurrentMethod().Name} - {errorMsg}");
if (AID > 0)
{
LogHelper.SaveWebApiResLogo(AID, errorMsg);
}
return false;
}
}
}
}