using Newtonsoft.Json; using System.Data.SqlClient; using System.Dynamic; using System.Net; using System.Net.Cache; using System.Text; namespace Gs.Toolbox; public class InterfaceUtil { /// /// /// /// json参数 /// /// /// /// 如果为2,则是更新工单状态 /// 如果成功返回日志guid,否则返回串 public static (int, string) HttpPostErp(string param, string edtUserGuid = "", string abtGuid = "", string hNo = "", int urlType = 0) { int _rtn = 0; //日志详细,发送的时候,记录日志,存储过程调用的时候,再累加上mes业务的操作结果 System.Text.StringBuilder sbLog = new System.Text.StringBuilder(); sbLog.Append(DateTime.Now.ToString() + "开始发送"); string strLogGuid = Guid.NewGuid().ToString(); string url = AppSettingsHelper.getValueByKey("TestErpUrl"); if (urlType == 2) { url = AppSettingsHelper.getValueByKey("TestErpUrl2"); } else if (urlType == 3) { url = AppSettingsHelper.getValueByKey("TestErpUrl3"); } else if (urlType == 4) { url = AppSettingsHelper.getValueByKey("TestErpUrl4"); } else if (urlType == 5) { url = AppSettingsHelper.getValueByKey("TestErpUrl5"); } else if (urlType == 6) { url = AppSettingsHelper.getValueByKey("TestErpUrl6"); } else if (urlType == 101) { url = AppSettingsHelper.getValueByKey("TestErpUrl101"); } HttpWebRequest request = null; StreamWriter requestStream = null; WebResponse response = null; string responseStr = ""; try { request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json"; request.Accept = "*/*"; //request.Timeout = 150000; request.AllowAutoRedirect = false; request.ServicePoint.Expect100Continue = false; HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); request.CachePolicy = noCachePolicy; requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close(); response = request.GetResponse(); if (response != null) { var reader = new StreamReader(response.GetResponseStream(),Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } // LogHelper.Debug(url, "HttpPostErp response:" + param + ",response:" + responseStr.ToString()); } catch (Exception ex) { LogHelper.Debug(url, "HttpPostErp response:" + param + ",ex:" + ex.Message); responseStr = ex.Message; _rtn = -1; } finally { request = null; requestStream = null; response = null; } //{"msg":"操作成功","code":200,"data":{"number":"CGSL168397","code":"200","id":"268781"}} if (_rtn != -1) { try { Result _result = JsonConvert.DeserializeObject(responseStr); // 【优先判断】data.code(ERP真正的处理结果) if (_result?.data != null && "200".Equals(_result.data.code)) { _rtn = 1; LogHelper.Debug(url, $"ERP处理成功,data.code=200, number={_result.data.number}, id={_result.data.id}"); } // 【降级判断】如果data为空,则判断外层code(兼容旧接口) /* else if (_result != null && "200".Equals(_result.code)) { _rtn = 1; LogHelper.Debug(url, $"ERP外层返回成功,code=200(无data层,可能是旧接口)"); }*/ else { _rtn = -1; string errorMsg = _result?.data?.code != null ? $"ERP处理失败,data.code={_result.data.code}" : $"ERP处理失败,外层code={_result?.code}"; LogHelper.Debug(url, errorMsg + $", msg={_result?.msg}, responseStr={responseStr}"); } } catch (Exception ex) { _rtn = -1; LogHelper.Debug(url, $"ERP返回数据解析失败:{ex.Message}, responseStr={responseStr}"); } } sbLog.Append("," + DateTime.Now.ToString() + "结束发送"); if (_rtn > 0) sbLog.Append(",发送成功"); else sbLog.Append(",发送失败,mes退出操作"); try { SqlParameter[] parameters = { new("@edtUserGuid", edtUserGuid), new("@abtGuid", abtGuid), new("@abtTable", ""), new("@detail", sbLog.ToString()), new("@hNo", hNo), new("@RtnLogGuid", strLogGuid), new("@SendJson", param), new("@RtnJson", responseStr), new("@isSuccess", (_rtn>0?1:0)), new("@isErp", 1), }; DbHelperSQL.RunProcedure("[prc_log_create]", parameters); } catch (Exception ex) { LogHelper.Debug(url, "HttpPostErp 写入日志表" + ex.Message); } return (_rtn, (_rtn > 0 ? strLogGuid : responseStr)); } } //{"msg":"操作成功","code":200,"data":{"number":"CGSL168397","code":"200","id":"268781"}} public class Result { /// /// 200成功,否则失败(外层code) /// public string? msg { get; set; } public string? code { get; set; } /// /// data层,包含真正的ERP处理结果 /// public ErpData? data { get; set; } } /// /// ERP返回的data层数据结构 /// public class ErpData { /// /// ERP单据编号 /// public string? number { get; set; } /// /// ERP处理结果代码("200"成功) /// public string? code { get; set; } /// /// ERP单据ID /// public string? id { get; set; } }