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
{
///
/// WMS WebApi调用类
///
public class AGVWebApiCall
{
private static readonly HttpClient httpClient;
static AGVWebApiCall()
{
httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromSeconds(20); // 设置超时时间为20秒
}
///
/// MES叫料接口 - 同步版本,返回bool结果
///
/// 叫料位置(库位号)
/// 物料号(型号)
/// 是否成功
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;
}
}
///
/// MES叫料接口 - 内部异步实现
///
private static async Task 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(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;
}
}
///
/// MES退料接口 - 同步版本,返回bool结果
///
/// 退料位置(库位号)
/// 物料号(型号)
/// 是否为空 0.空托 1.余料
/// 是否成功
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;
}
}
///
/// MES退料接口 - 内部异步实现
///
private static async Task 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(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;
}
}
}
}