using JY.Inspection.Common; using JY.MES; using JY.MES.Entity; using JY.MES.Enum; using JY.MES.Exceptions; using JY.MES.MES; using JY.Model; using JY.Utility; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using NPOI.OpenXmlFormats.Spreadsheet; using Org.BouncyCastle.Ocsp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; namespace JY.Inspection.Mes { public interface IMes { /// /// 分档查询 /// /// /// /// MesResponse GetMesIn(string code, string code2); /// /// 结果加工参数 /// /// /// MesCallResult ProductResultParameters(BlankingData m); /// /// 产品进站(包装) /// /// /// RespArrivalStation PostProductArrivalStationData(ReqArrivalStation req); /// /// 产品出站(包装) /// /// /// RespExitStation PostProductExitStationData(ReqExitStation req); MesCallResult LoginMes(ReqLoginMes req); // 上传设备状态信息 MesCallResult UpEquipStatus(ReqEquipStatus req); // 上传设备报警信息 MesCallResult UpAlarmData(ReqAlarm req); // TODO 能耗 void UpEnergyDataMqtt(List dataList); // TODO 设备打标 } public class MESDataCombin : IMes { #region 1、 分档查询 public MesResponse GetMesIn(string code, string code2) { MesResponse mesResponse = new MesResponse(); DateTime nowTime = DateTime.Now; string josnTxtMsg = string.Empty; string BarCode = ""; try { if (code.Contains("ERROR")) { BarCode = code2; } else { BarCode = code; } GradingParam gradingParam = new GradingParam { siteCode = Global.systemConfig.siteCode, lineCode = Global.systemConfig.lineCode, userName = Global.systemConfig.userName, equipCode = Global.systemConfig.equipCode, recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), qty = 1, containerCode = "", materialCode = Global.systemConfig.materialCode, materiallotCodeList = new List() { BarCode } }; string p = JsonHelper.Serialize(gradingParam); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI(Global.systemConfig.GradingMesUrl, p, Global.systemConfig.MesRequestTime); sw.Stop(); var res = JsonConvert.DeserializeObject(mesRes); josnTxtMsg = $"{nowTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}:调用电芯分档查询接口:{Global.systemConfig.GradingMesUrl},请求数据为:{p},\n{nowTime.AddMilliseconds(sw.ElapsedMilliseconds).ToString("yyyy-MM-dd HH:mm:ss.fff")}:接口耗时:{sw.ElapsedMilliseconds}ms,返回结果:{mesRes}"; TxtHelper.WriteTxt($@"D:\APILog\MesLogs\{nowTime.ToString("yyyyMMdd")}\调用电芯分档查询接口\{nowTime.ToString("HH")}.txt", josnTxtMsg);//前面是路径,后面是数据 mesResponse.success = res.success; mesResponse.message = res.message; mesResponse.error = res.error; if (!res.success) { mesResponse.message = res.message; mesResponse.error = res.error; } else { try { if (res.rows != null && res.rows.Count > 0) { List rowsls = new List(); MesResponse.rowsListItem rows = new MesResponse.rowsListItem(); rows.identification = res.rows[0].identification; rows.level = res.rows[0].level; rows.passage = res.rows[0].passage; rows.rank = res.rows[0].rank; rows.message = res.rows[0].message; rowsls.Add(rows); mesResponse.rows = rowsls; } } catch (Exception ex) { } } } catch (Exception ex) { mesResponse.success = false; mesResponse.error = 9; mesResponse.message = "电芯分档查询异常:" + ex.Message; } return mesResponse; } #endregion #region 2、结果加工参数 public MesCallResult ProductResultParameters(BlankingData m) { MesCallResult resp = new MesCallResult(); DateTime nowTime = DateTime.Now; string josnTxtMsg = string.Empty; try { ProductResultParameters prp = new ProductResultParameters(); prp.equipNum = Global.systemConfig.equipCode; prp.type = "DD"; Payload pl = new Payload(); pl.siteCode = Global.systemConfig.siteCode; pl.lineCode = Global.systemConfig.lineCode; pl.userName = Global.systemConfig.userName; pl.materialCode = Global.systemConfig.materialCode; pl.carCode = ""; pl.collection = "JS"; pl.recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); pl.qty = 1; pl.containerCode = ""; IdentificationItem iil = new IdentificationItem(); if (m.DepartureBarCode.Contains("ERROR")) iil.identification = m.ArrivalBarCode; else iil.identification = m.DepartureBarCode; iil.qualityStatus = m.Result == "OK" ? "Y" : "N"; pl.identification = iil; List tdvls = new List(); TagDataVOListItem tag1; // 结果采集项 var otherCfgList = Global.systemConfig.CollectItemCfgList .Where(it => it.IsEnable && !string.IsNullOrEmpty(it.HCPropName)).ToList(); foreach (var item in otherCfgList) { // 判断m中的属性名是否存在it.HCPropName // 如果存在生成TagDataVoListItem var prop = m.GetType().GetProperty(item.HCPropName); if (prop != null) { tdvls.Add(new TagDataVOListItem() { tagCode = item.MesItemCode, tagValue = prop.GetValue(m)?.ToString(), tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = item.MesItemName }); } } #region 手动赋值 tdvls.Add(new TagDataVOListItem() { tagCode = "VIM_OPERATION_PROCESS", tagValue = "外观检", tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "工艺流程" }); tdvls.Add(new TagDataVOListItem() { tagCode = "VIM_MODEL", tagValue = Global.systemConfig.productType, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "型号" }); tdvls.Add(new TagDataVOListItem() { tagCode = "VIM_RETEST_MARK", tagValue = m.IsRepeat ? "1" : "0", tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "复测标记" }); tdvls.Add(new TagDataVOListItem() { tagCode = "VIM_RETEST_TIME", tagValue = m.OutTime, tagTime = m.OutTime, tagCalculateResult = "Y", tagRemark = "复测时间" }); #endregion pl.tagDataVOList = tdvls; prp.payload = JsonHelper.Serialize(pl); string p = JsonHelper.Serialize(prp); var sw = new Stopwatch(); sw.Start(); resp = MESApiHelper.HttpPostJsonAPI(Global.systemConfig.ResultProcessMesUrl, p, Global.systemConfig.MesRequestTime); sw.Stop(); if (resp?.OriResponse != null && resp?.OriResponse.Success != true) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.BusinessError; resp.ErrorMessage = resp?.OriResponse?.Message ?? "MES业务处理失败, 错误消息为空"; } new MesLog().LogProductResult(nowTime, p, resp.OriRespJsonStr, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.ClientError; resp.ErrorMessage = "结果加工参数上传异常:" + ex.Message; } return resp; } #endregion public RespArrivalStation PostProductArrivalStationData(ReqArrivalStation req) { if (req == null) { throw new ArgumentNullException("入站数据为空"); } DateTime currentTime = DateTime.Now; string reqUrl = Global.systemConfig.StationArrivalUrl; RespArrivalStation resp = new RespArrivalStation(); try { string reqJsonStr = JsonHelper.Serialize(req); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI( reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime ); sw.Stop(); resp = JsonConvert.DeserializeObject(mesRes); new MesLog().LogArrivalStation(currentTime, reqJsonStr, mesRes, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.Success = false; resp.Message = "入站数据上传异常:" + ex.Message; } return resp; } public RespExitStation PostProductExitStationData(ReqExitStation req) { if (req == null) { throw new ArgumentNullException("出站请求数据为空"); } DateTime currentTime = DateTime.Now; string reqUrl = Global.systemConfig.StationExitUrl; RespExitStation resp = new RespExitStation(); try { string reqJsonStr = JsonHelper.Serialize(req); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI( reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime ); sw.Stop(); resp = JsonConvert.DeserializeObject(mesRes); new MesLog().LogExitStation(currentTime, reqJsonStr, mesRes, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.Success = false; resp.Message = "出站数据上传异常:" + ex.Message; } return resp; } public MesCallResult LoginMes(ReqLoginMes req) { if (req == null) { throw new ArgumentNullException("MES员工登录请求信息为空"); } // MES登录请求地址 DateTime currentTime = DateTime.Now; string reqUrl = Global.systemConfig.LoginMesUrl; MesCallResult resp = new MesCallResult(); try { string reqJsonStr = JsonHelper.Serialize(req); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI( reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime ); resp = MESApiHelper.HttpPostJsonAPI(reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime); sw.Stop(); if (resp?.OriResponse != null && resp?.OriResponse.Success != true) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.BusinessError; resp.ErrorMessage = resp?.OriResponse?.Message ?? "MES业务处理失败, 错误消息为空"; } new MesLog().LogLoginMes(currentTime, reqJsonStr, resp.OriRespJsonStr, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.ClientError; resp.ErrorMessage = "获取MES员工登录信息异常:" + ex.Message; } return resp; } // TODO 能耗定时上传 public void UpEnergyDataMqtt(List dataList) { if (dataList == null || dataList.Count == 0) { return; } string topic = $"EVE/{Global.systemConfig.siteCode}/EQP/{Global.systemConfig.equipCode}"; CmdEnergyData cmd = new CmdEnergyData() { // TODO BU编码 Bu_id = string.Empty, // TODO 区域简称 District_id = string.Empty, Factory_id = Global.systemConfig.siteCode, Production_line_id = Global.systemConfig.lineCode, Production_processes_id = string.Empty, Work_center_id = string.Empty, Station_id = string.Empty, Device_name = Global.systemConfig.equipCode, }; string[] dataNameArr = new string[] { "相电压UA", "相电压UB","相电压UC","线电压UAB","线电压UBC","线电压UAC","电流IA","电流IB", "电流IC","A相有功功率","B相有功功率","C相有功功率","总有功功率" }; for (int i = 0; i < dataList.Count; i++) { cmd.Taglist.Add(new CollectionItem() { Equipment_Code = Global.systemConfig.equipCode, EMeter_Name = dataNameArr[i], EMeter_Value = dataList[i] }); } string payload = JsonHelper.Serialize(cmd); MqttSingleton.Instance.SendAsync(topic, payload).ConfigureAwait(false); } public MesCallResult UpAlarmData(ReqAlarm req) { if (req == null) { throw new ArgumentNullException("MES报警请求信息为空"); } // MES登录请求地址 DateTime currentTime = DateTime.Now; // 报警URL string reqUrl = Global.systemConfig.EquipAlarmUrl; MesCallResult resp = new MesCallResult(); try { string reqJsonStr = JsonHelper.Serialize(req); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI( reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime ); resp = MESApiHelper.HttpPostJsonAPI(reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime); sw.Stop(); if (resp?.OriResponse != null && resp?.OriResponse.Success != true) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.BusinessError; resp.ErrorMessage = resp?.OriResponse?.Message ?? "MES业务处理失败, 错误消息为空"; } new MesLog().LogEqupAlarmInfo(currentTime, reqJsonStr, resp.OriRespJsonStr, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.ClientError; resp.ErrorMessage = "上传设备报警信息异常:" + ex.Message; } return resp; } public MesCallResult UpEquipStatus(ReqEquipStatus req) { if (req == null) { throw new ArgumentNullException("MES设备状态信息为空"); } // MES登录请求地址 DateTime currentTime = DateTime.Now; // 设备状态URL string reqUrl = Global.systemConfig.EquipStatusUrl; MesCallResult resp = new MesCallResult(); try { string reqJsonStr = JsonHelper.Serialize(req); var sw = new Stopwatch(); sw.Start(); string mesRes = MESApiHelper.HttpPostJsonAPI( reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime ); resp = MESApiHelper.HttpPostJsonAPI(reqUrl, reqJsonStr, Global.systemConfig.MesRequestTime); sw.Stop(); if (resp?.OriResponse != null && resp?.OriResponse.Success != true) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.BusinessError; resp.ErrorMessage = resp?.OriResponse?.Message ?? "MES业务处理失败, 错误消息为空"; } new MesLog().LogEqupStatus(currentTime, reqJsonStr, resp.OriRespJsonStr, sw.ElapsedMilliseconds); } catch (Exception ex) { resp.IsSuccess = false; resp.ErrorType = MesErrorType.ClientError; resp.ErrorMessage = "上传设备状态信息异常:" + ex.Message; } return resp; } } }