using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace JY.MES.FMS { public class MesHelper_EVE { /// /// 接口地址 /// public string UserVerifyUrl = "http://10.6.1.155/core/api/public/equipment/base/user/login/verify"; //public static string InboundUrl = "http://10.6.1.155/core/api/public/in/station/process/true"; //public string OutboundUrl = "http://10.6.1.155/core/api/public/out/station/process/true"; public string ProductParamUrl = "http://10.6.1.155/core/api/public/product/process/param/result"; public string EquipmentStatusUrl = "http://10.6.1.155/core/api/public/eve/pm/eqm/run/status/operation"; public string AlarmStatusUrl = "http://10.6.1.155/core/api/public/equipment/alarm/currency"; public string GetRecipeUrl = "http://10.6.1.155/core/api/public/param/set/request"; public string UnloadRecipeUrl = "http://10.6.1.155/core/api/public/api/public/param/setting/change"; public string 电芯入站 = "http://192.168.1.11:30030/fms/restful/api/v3/process/CheckMaterialStatus"; public string 电芯出站 = "http://192.168.1.11:30030/fms/restful/api/v3/process/MaterialEX"; public string 设备状态 = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceStatus"; public string 报警 = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceError"; public static string InboundUrl = "http://192.168.1.11:30030/fms/restful/api/v3/process/CheckMaterialStatus"; public static string OutboundUrl = "http://192.168.1.11:30030/fms/restful/api/v3/process/MaterialEX"; public static string StatusUrl = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceStatus"; public static string AlarmUrl = "http://192.168.1.11:30030/fms/restful/api/v3/device/uploadDeviceError"; public static string MateriallnStationeUrl = "http://192.168.1.11:30030/fms/restful/api/v3/inventory/materiallnStatione"; /// /// 超时 /// public int _TimeOut = 3000; /// /// 凭证 /// //public Credentials Credentials { get; set; } MesRequestAndRespondParam mrrp = new MesRequestAndRespondParam(); /// /// 初始标记为false(离线文件标记) /// public static bool WriteState { get; set; } = false; public static List listSource = new List(); ///// ///// 提交登录窗口填写的信息,登录MES ///// ///// ///// //public MesRespondParam.MesResult MesPost(T t, int Type) where T : class //{ // var Start = DateTime.Now; // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); // try // { // //等待7秒,如果超过7秒未收到MES返回消息,视为超时 // new Task(() => // { // if ((DateTime.Now - Start).TotalMilliseconds > 7000) // { // _mesResult.code = "-9999"; // _mesResult.message = "交互超时"; // _mesResult.success = false; // } // }).Start(); // var json = JsonHelper.SerializeObject(t); // if (Type == 0) // { // Addlo.WriteEorr($@"【向服务端发送信息】: {Convert.ToString(json)}", "测试日志", "入站服务端数据", Type: "UTF-8"); // } // else // { // SysLog.WriteEorr($@"【向服务端发送信息】: {Convert.ToString(json)}", "测试日志", "出站服务端数据", Type: "UTF-8"); // } // string jsnstr = PostWebRequest(Type == 0 ? 电芯入站 : 电芯出站, json, Type == 0 ? "入站" : "出站"); //request.GetJsonResponse(UserVerifyUrl, JsonHelper.SerializeObject(mParam)); // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // if (Type == 0) // { // SysLog.WriteEorr($@"【接收服务端返回信息】: {Convert.ToString(jsnstr)}", "测试日志", "入站服务端数据", Type: "UTF-8"); // } // else // { // SysLog.WriteEorr($@"【接收服务端返回信息】: {Convert.ToString(jsnstr)}", "测试日志", "出站服务端数据", Type: "UTF-8"); // } // } // catch (Exception ex) // { // _mesResult.code = "-404"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} /// /// 容量分档 /// /// /// public static MesReturnParam.MesResult FMS_MateriallnStatione(FMS_Materialln mParam) { MesReturnParam.MesResult _mesResult = new FMS.MesReturnParam.MesResult(); try { string jsnstr = PostWebRequest(MateriallnStationeUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); } catch (Exception ex) { _mesResult.statusCode = -9999; _mesResult.statusMessage = ex.Message; } return _mesResult; } /// /// 产品进站 /// /// /// public static MesReturnParam.MesResult MES_Inbound(FMS_In mParam) { MesReturnParam.MesResult _mesResult = new FMS.MesReturnParam.MesResult(); try { string jsnstr = PostWebRequest(InboundUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); } catch (Exception ex) { _mesResult.statusCode = -9999; _mesResult.statusMessage = ex.Message; } return _mesResult; } /// /// 产品出站 /// /// /// public static MesRequestAndRespondParam.MesRespondParam.MesResult MES_Outbound(FMS_Out mParam) { MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); string jsnstr = PostWebRequest(OutboundUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); try { if (jsnstr.Contains("【链接异常】")) { //异常视为离线,如果离线,则将数据保存到本地 SaveOutlineData(jsnstr); } _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); } catch (Exception ex) { _mesResult.statusCode = -9999; _mesResult.statusMessage = ex.Message; } return _mesResult; } /// /// 设备状态上传MES /// /// /// public static MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond MES_Status(FMS_Status mParam) { //string jsnstr = PostHelper.HttpPostJsonAPI1(StatusUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); //return Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond _mesResult = new MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond(); try { string jsnstr = PostWebRequest(StatusUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); } catch (Exception ex) { _mesResult.code = "-9999"; _mesResult.message = ex.Message; _mesResult.success = "失败"; _mesResult.category = ""; } return _mesResult; } /// /// 报警上传MES /// /// /// public static MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond MES_Alarm(FMS_Alarm mParam) { //string jsnstr = PostHelper.HttpPostJsonAPI1(AlarmUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); //return Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond _mesResult = new MesRequestAndRespondParam.MesRespondParam.GetRecipeRespond(); try { string jsnstr = PostWebRequest(AlarmUrl, Newtonsoft.Json.JsonConvert.SerializeObject(mParam)); _mesResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jsnstr); } catch (Exception ex) { _mesResult.code = "-9999"; _mesResult.message = ex.Message; _mesResult.success = "失败"; _mesResult.category = ""; } return _mesResult; } ///// ///// 加工参数采集 ///// ///// ///// //public MesRequestAndRespondParam.MesRespondParam.MesResult MES_ProductParaColloctUniversal(MesRequestAndRespondParam.MesRequestParam.ProductDataRequest mParam) //{ // MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); // string jsnstPostWebRequestr = (ProductParamUrl, JsonHelper.SerializeObject(mParam)); // try // { // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} /// /// 加工参数采集(手动或离线传入上传内容) /// /// /// //public MesRequestAndRespondParam.MesRespondParam.MesResult MES_ProductParaColloctUniversal(string JsString) //{ // MesRequestAndRespondParam.MesRespondParam.MesResult _mesResult = new MesRequestAndRespondParam.MesRespondParam.MesResult(); // try // { // string jsnstr = JsString; // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} ///// ///// 设备状态采集 ///// ///// ///// //public MesRespondParam.MesResult MES_EquipStatusCollect(MesRequestParam.EquipStatusRequest mParam) //{ // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); // try // { // string jsnstr = PostWebRequest(EquipmentStatusUrl, JsonHelper.SerializeObject(mParam)); // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} ///// ///// 设备报警采集 ///// ///// ///// //public MesRespondParam.MesResult MES_Alarm(MesRequestParam.AlarmRequest mParam) //{ // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); // try // { // string jsnstr = PostWebRequest(AlarmStatusUrl, JsonHelper.SerializeObject(mParam)); // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} /// /// 配方修改上传 /// /// /// //public MesRespondParam.MesResult MES_UploadRecipe(MesRequestParam.SetRecipeRequest mParam) //{ // MesRespondParam.MesResult _mesResult = new MesRespondParam.MesResult(); // try // { // string jsnstr = PostWebRequest(UnloadRecipeUrl, JsonHelper.SerializeObject(mParam)); // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} ///// ///// 配方下载 ///// ///// ///// //public MesRespondParam.GetRecipeRespond MES_GetRecipe(MesRequestParam.GetRecipeRequest mParam) //{ // MesRespondParam.GetRecipeRespond _mesResult = new MesRespondParam.GetRecipeRespond(); // try // { // string jsnstr = PostWebRequest(GetRecipeUrl, JsonHelper.SerializeObject(mParam)); // _mesResult = JsonHelper.DeserializeJsonToObject(jsnstr); // } // catch (Exception ex) // { // _mesResult.code = "-9999"; // _mesResult.message = ex.Message; // _mesResult.success = false; // } // return _mesResult; //} #region 公共 /// /// Post数据接口 /// /// 接口地址 /// 提交json数据 /// 编码方式(Encoding.UTF8) /// public static string PostWebRequest(string postUrl, string paramData, string SockAction = "") { string responseContent = string.Empty; try { string TypeName = string.Empty; if (SockAction.Contains("入站")) { TypeName = "入站操作"; } else { TypeName = "出站操作"; } byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化 HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl)); //webReq.Timeout = _TimeOut; webReq.Method = "POST"; webReq.ContentType = "application/json;charset=UTF-8"; //webReq.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; //webReq.ContentLength = byteArray.Length; if (SockAction.Length > 0) webReq.Headers.Add("SOAPAction", SockAction); //if (this.Credentials != null) { //(2)设置Headers Authorization webReq.Headers.Add("Authorization", "Basic " /*+ Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Credentials.UserName}:{Credentials.Password}"))*/); } //webReq.CookieContainer = new CookieContainer(); //webReq.ContentType = "application/json;"; ////(1)设置请求Credentials //CredentialCache credentialCache = new CredentialCache(); //credentialCache.Add(new Uri("接口地址"), "Basic", new NetworkCredential("用户名", "密码")); //webReq.Credentials = credentialCache; using (Stream reqStream = webReq.GetRequestStream()) { StreamWriter mySwrite = new StreamWriter(reqStream, Encoding.GetEncoding("UTF-8")); mySwrite.Write(paramData);//写入参数 mySwrite.Close(); } using (HttpWebResponse response = (HttpWebResponse)webReq.GetResponse()) { var code = response.StatusCode.ToString(); //在这里对接收到的页面内容进行处理 using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"))) { responseContent = sr.ReadToEnd().ToString(); } } } catch (WebException ex) { //SysLog.WriteEorr("【操作异常】:" + ex.Message.ToString() + "---------" + ex.StackTrace.ToString(), "测试日志", "服务端数据"); return ex.Message + "【链接异常】"; } //catch ( Exception ex) //{ // return "连接远程服务器出错"; ; //} return responseContent; } /// /// /// /// 目标url /// 要发送的post字符串 /// 接收后返回值 public string PostXML(string url, string strPost) { string result = string.Empty; //生成文件流 byte[] buffer = Encoding.UTF8.GetBytes(strPost); //向流中写字符串 StreamWriter mywriter = null; //根据url创建请求对象 HttpWebRequest objrequest = (HttpWebRequest)WebRequest.Create(url); //设置发送方式 objrequest.Method = "POST"; //提交长度 objrequest.ContentLength = buffer.Length; //发送内容格式 objrequest.ContentType = "text/xml;charset=UTF-8"; objrequest.Timeout = _TimeOut; try { mywriter = new StreamWriter(objrequest.GetRequestStream()); mywriter.Write(strPost); mywriter.Close(); HttpWebResponse objresponse; try { //读取服务器返回信息 objresponse = (HttpWebResponse)objrequest.GetResponse(); } catch (WebException EX) { objresponse = (HttpWebResponse)EX.Response; } using (StreamReader sr = new StreamReader(objresponse.GetResponseStream())) { result = sr.ReadToEnd(); sr.Close(); } } catch (Exception ex) { result = "发送文件流失败!"; } return result; } #endregion /// /// 当MES离线时,保存上传数据(MrLin) /// /// private static void SaveOutlineData(string requestJson) { //每次创建一个新的文件文本 string logSite = $@"D:\MESData\ErrData{DateTime.Now.ToString("ffffff")}.txt"; try { WriteState = false; //防止重复数据存入本地的判断 if (!listSource.Contains(requestJson)) { //SysLog.WriteContext(requestJson, logSite); //写入记录之后将数据存入到本地结合,防止重复数据存入到本地文件 listSource.Add(requestJson); } //文件写完标记 WriteState = true; } catch (Exception err) { //string str = SysLog.ReadContext(logSite) + "\r\n" + ""; WriteState = true; } } } }