using Hanhe.iWCS.Common; using Hanhe.iWCS.DeviceDriver; using Hanhe.iWCS.MData; using Hanhe.iWCS.Model; using MongoDB.Driver; using MongoDB.Driver.Builders; using System; using System.Collections.Generic; using Newtonsoft.Json; using Hanhe.iWCS.Business; using Hanhe.iWCS.ZheJiangHuaKaiModel; using HH.AMS.WebApi.Models; using HH.AMS.WebApi.Controllers; namespace Hanhe.iWCS.ZheJiangHuaKaiProtocol { public class WmsHelper { private static WebApiHelper helper = new WebApiHelper(); public static void WMSTaskFeedBack(string taskNo, int state) { HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS); string msg = string.Empty; if (hao != null) { TN_I_TASK_MST task = null; try { IMongoQuery query = Query.EQ("CN_S_TASK_NO", taskNo); task = MongoDBSingleton.Instance.FindOne(query, typeof(TN_I_TASK_MST).Name); } catch (Exception e) { CMMLog.Error(e.Message, e); } //任务回报API调用 if (task != null) { if (task.CN_S_STATUS != "删除中" && state == 7) { var query = Query.And(Query.EQ("CN_S_TASK_NO", task.CN_S_TASK_NO), Query.EQ("CN_S_ACTION_CODE", 4)); TN_I_TASK_DTL_ACTION_TrackLog trackLogCommand = MongoDBSingleton.Instance.FindOne(query, typeof(TN_I_TASK_DTL_ACTION_TrackLog).Name); if (trackLogCommand == null) { state = 12;//没有取货完成说明是空取 } CMMLog.Error(string.Format("【反馈WMS任务状态】异常取消,任务号={0},来源号={1}", task.CN_S_TASK_NO, task.CN_S_SOURCE_NO)); } string msgData = "{\"taskNo\":\"" + task.CN_S_SOURCE_NO + "\",\"stateNo\":\"" + state + "\",\"taskType\":\"转运\"}"; string reqStr = "任务号=" + task.CN_S_SOURCE_NO + ";状态=" + state; string feedback = ""; try { //Console.WriteLine(hao.WebUrl + "ExecuteState"); feedback = helper.WebPost(hao.WebUrl + "ExecuteState", msgData); //feedback = hao._WebApiClientInstance.GetWebRequest(hao.WebUrl + "ExecuteState", msgData, "application/json"); if (!string.IsNullOrEmpty(feedback)) { Console.WriteLine(feedback); //var DynamicObject = JsonConvert.DeserializeObject(feedback); //var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' '); //if (DynamicObject.success.ToString() == "True") { // string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用成功\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; // AMSLoggerAPI.RequestInterfaceLog(errData); // msg = "【反馈WMS任务状态-" + state + "】调用成功!调用WebUrl=" + hao.WebUrl + "ExecuteState;输入参数=" + msgData + ";任务号=" + taskNo; //} //else { // string errMsg = DynamicObject.errCode + "-" + DynamicObject.errMsg; // string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; // AMSLoggerAPI.RequestInterfaceLog(errData); // msg = "【反馈WMS任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "wmsapi/ExecuteState;输入参数=" + msgData + ";任务号=" + taskNo; //} } else { string errMsg = "参数反馈空值"; string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + feedback + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; msg = "【反馈WMS任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "wmsapi/ExecuteState;输入参数=" + msgData + ";任务号=" + taskNo; } } catch (Exception e) { CMMLog.Error(string.Format("【反馈WMS任务状态】异常{0}", e.Message), e); } } else { msg = string.Format("无法通知WMS,任务{0}不存在!", taskNo); } } else { msg = string.Format("调用wms失败,ams工作中心没有设置!"); } CMMLog.Info(msg); } public static void WMSFeedBackBySourceNo(string sourceNo, int state) { HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS); string msg = string.Empty; if (hao != null) { string msgData = "{\"taskNo\":\"" + sourceNo + "\",\"stateNo\":\"" + state + "\",\"taskType\":\"转运\"}"; string reqStr = "任务号=" + sourceNo + ";状态=" + state; string feedback = ""; try { feedback = hao._WebApiClientInstance.GetWebRequest(hao.WebUrl + "wmsapi/ExecuteState", msgData, "application/json"); if (!string.IsNullOrEmpty(feedback)) { Console.WriteLine(feedback); var DynamicObject = JsonConvert.DeserializeObject(feedback); var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' '); if (DynamicObject.success.ToString() == "True") { string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用成功\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; msg = "【反馈WMS任务状态-" + state + "】调用成功!调用WebUrl=" + hao.WebUrl + "wmsapi/ExecuteState;输入参数=" + msgData + ";任务来源号=" + sourceNo; } else { string errMsg = DynamicObject.errCode + "-" + DynamicObject.errMsg; string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; msg = "【反馈WMS任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "wmsapi/ExecuteState;输入参数=" + msgData + ";任务来源号=" + sourceNo; } } else { string errMsg = "参数反馈空值"; string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + feedback + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "ExecuteState\"}"; msg = "【反馈WMS任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "wmsapi/ExecuteState;输入参数=" + msgData + ";任务来源号=" + sourceNo; } } catch (Exception e) { CMMLog.Error(string.Format("【反馈WMS任务状态】异常{0}", e.Message), e); } } else { msg = string.Format("调用wms失败,ams工作中心没有设置!"); } CMMLog.Info(msg); } public class WMSResponseModel { //{"success":false,"errCode":null,"errMsg":"算法返回结果库存不足","okList":[],"failList":[{"index":0,"errCode":null,"errMsg":"算法返回结果库存不足"}],"tasks":[]} public bool success { get; set; } public string errMsg { get; set; } public string errCode { get; set; } //public OKInfo[] tasks { get; set; } //public FailInfo[] failList { get; set; } public OKInfo[] okList { get; set; } public class FailInfo { public int index { get; set; } public string errCode { get; set; } public string errMsg { get; set; } } public class OKInfo { public string taskNo { get; set; } public string startStock { get; set; } public string startArea { get; set; } public string startBit { get; set; } public string endStock { get; set; } public string endArea { get; set; } public string endBit { get; set; } /// /// 是否需要打包(Y/N) /// public string CN_C_IS_LOT_OU { get; set; } /// /// 是否尾托散托 /// public string lastTrayAlarm { get; set; } /// /// 是否扫码异常 /// public string scanAlarm { get; set; } /// /// 未扫描到/与工单不符 /// public string scanAlarmMsg { get; set; } } } public class ItemData { public string itemCode { get; set; } public string itemState { get; set; } public string qty { get; set; } public string itemFeature { get; set; } public string ProductionDate { get; set; } } public static void Check() { string feedback = "{\"success\":false,\"errCode\":null,\"errMsg\":\"算法返回结果库存不足\",\"okList\":[],\"failList\":[{\"index\":0,\"errCode\":null,\"errMsg\":\"算法返回结果库存不足\"}],\"tasks\":[]}"; var wmsResponse = JsonConvert.DeserializeObject(feedback); } #region 新版 public static string WMSIn(string startBit, string ProduceLine, string isTransport, string taskType, string itemCode,string isRian,string needAlarm, ref string taskNo) { string result = ""; HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS); string msg = ""; if (hao != null) { //http://192.168.1.199:9001/api/wmsapi/InWorkArea WMSInModel model = new WMSInModel(); model.startBit = startBit;//起点位置 model.produceLine = ProduceLine;//产线 model.isTransport = isTransport;//是否转运 model.taskType = taskType;//任务类型 model.isRian = isRian;//是否雨天(Y/N) model.needCreateAMSTask = "Y"; model.data = new List(); model.trayCode = ""; model.needAlarm = needAlarm;//是否需要报警 model.priority = 1; ItemData item = new ItemData(); item.itemCode = itemCode; item.itemFeature = ""; item.ProductionDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); item.itemState = ""; item.qty = ""; model.data.Add(item);// = itemCode;//物料编码 string msgData = JsonConvert.SerializeObject(new List() { model }); string reqStr = "起点=" + startBit; string feedback = ""; try { //hao.WebUrl = "http://192.168.1.199:9001/api/"; feedback = helper.WebPost(hao.WebUrl + "WmsApi/InWorkArea", msgData); //feedback = hao._WebApiClientInstance.HttpWebApi(hao.WebUrl + "wmsapi/InWorkArea", msgData, "application/json"); if (!string.IsNullOrEmpty(feedback)) { //CMMLog.Debug(feedback); //"{\"Success\":false,\"ErrCode\":null,\"ErrMsg\":\"\",\"OkList\":[],\"FailList\":[{\"Index\":0,\"ErrCode\":null,\"ErrMsg\":\"未找到aaa位置的所属仓库\"}],\"Tasks\":[]}" //var wmsResponse = JsonConvert.DeserializeObject(feedback); var wmsResponse = JsonConvert.DeserializeObject(JsonConvert.DeserializeObject(feedback)); var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' '); if (wmsResponse.success == true) { string info = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用成功\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "InWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(info); var ok = wmsResponse.okList[0]; result = ok.endBit; taskNo = ok.taskNo; msg = "【调用wms获取入库货位】成功!返回结果=" + result + ";调用WebUrl=" + hao.WebUrl + "InWorkArea;输入参数=" + msgData; } else { //如果失败需要记录报警信息 var ok = wmsResponse.okList[0]; if(ok.lastTrayAlarm=="Y")//是否尾托散托(Y/N) { TN_ErrorInfo EI=new TN_ErrorInfo() { startBit=startBit, ProductionLine=ProduceLine, isTransport=isTransport, taskType=taskType, Type=1,//尾托报警 Content = "扫码异常", CreateDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; HuaKaiApiController.ErrorInfo_Add(EI); } if (ok.scanAlarm == "Y")//是否扫码异常(Y/N) { string MSG = ok.scanAlarmMsg;// 未扫描到/与工单不符 TN_ErrorInfo EI = new TN_ErrorInfo() { startBit = startBit, ProductionLine = ProduceLine, isTransport = isTransport, taskType = taskType, Type = 2,//扫码异常报警 Content = MSG, CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; HuaKaiApiController.ErrorInfo_Add(EI); } string errMsg = wmsResponse.errCode + "-" + wmsResponse.errMsg; string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "InWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(errData); msg = "【调用wms获取入库货位】失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "InWorkArea;输入参数=" + msgData; } } else { string errMsg = "参数反馈空值"; string info = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + errMsg + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "InWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(info); msg = "【调用wms获取入库货位】失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "InWorkArea;输入参数=" + msgData; } } catch (Exception e) { CMMLog.Error(string.Format("【调用wms获取入库货位失败】异常{0}", e.Message), e); } } else { msg = string.Format("调用wms失败,ams工作中心没有设置!"); } CMMLog.Info(msg); Console.WriteLine(msg); return result; } public static string WMSOut(string endBit, string itemCode, ref string taskNo) { string result = ""; HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS); string msg = ""; if (hao != null) { //http://192.168.1.199:9001/api/wmsapi/InWorkArea WMSOutModel model = new WMSOutModel(); model.endBit = endBit; model.data = new List(); string msgData = JsonConvert.SerializeObject(new List() { model }); string reqStr = "结束点=" + endBit; string feedback = ""; try { //hao.WebUrl = "http://192.168.1.199:9001/api/"; feedback = helper.WebPost(hao.WebUrl + "OutWorkArea", msgData); if (!string.IsNullOrEmpty(feedback)) { //CMMLog.Debug(feedback); //{"success":false,"errCode":null,"errMsg":"算法返回结果库存不足","okList":[],"failList":[{"index":0,"errCode":null,"errMsg":"算法返回结果库存不足"}],"tasks":[]}" var wmsResponse = JsonConvert.DeserializeObject(JsonConvert.DeserializeObject(feedback)); //var wmsResponse = JsonConvert.DeserializeObject(feedback); var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' '); if (wmsResponse.success == true) { string info = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用成功\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "OutWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(info); var ok = wmsResponse.okList[0]; result = ok.startBit; taskNo = ok.taskNo; msg = "【调用wms获取出库货位】成功!返回结果=" + result + ";调用WebUrl=" + hao.WebUrl + "OutWorkArea;输入参数=" + msgData; } else { string errMsg = wmsResponse.errCode + "-" + wmsResponse.errMsg; string errData = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + res + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "OutWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(errData); msg = "【调用wms获取出库货位】失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "OutWorkArea;输入参数=" + msgData; } } else { string errMsg = "参数反馈空值"; string info = "{\"CN_S_INTERFACE\":\"WMS接口\",\"CN_S_INTERFACE_NOTE\":\"调用失败\",\"CN_S_REQUEST\":\"" + reqStr + "\",\"CN_S_RESPONSE\":\"" + errMsg + "\",\"CN_S_ADDRESS\":\"" + hao._WebApiClientInstance.WebApiUrl + "OutWorkArea\"}"; //AMSLoggerAPI.RequestInterfaceLog(info); msg = "【调用wms获取出库货位】失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + "OutWorkArea;输入参数=" + msgData; } } catch (Exception e) { CMMLog.Error(string.Format("【调用wms获取出库货位失败】异常{0}", e.Message), e); } } else { msg = string.Format("调用wms失败,ams工作中心没有设置!"); } CMMLog.Info(msg); Console.WriteLine(msg); return result; } /// /// 汉和WMS任务回报 /// /// 系统驱动 /// 任务号 /// 任务状态 /// 任务类型 public static bool HHWMSTaskFeedBack(HardwareAccessObject hao, string taskNo, string state, string taskType) { bool bResult = false; string msg = string.Empty; //任务回报API调用 string msgData = "{\"taskNo\":\"" + taskNo + "\",\"stateNo\":\"" + state + "\"}"; string reqStr = "任务号=" + taskNo + ";状态=" + state; string feedback = hao._WebApiClientInstance.GetWebRequest(hao.WebUrl + "WmsApi/ExecuteState", msgData, "application/json"); if (!string.IsNullOrEmpty(feedback)) { var DynamicObject = JsonConvert.DeserializeObject(feedback); if (DynamicObject.success.ToString() == "True") { bResult = true; msg = "【汉和WMS反馈任务状态-" + state + "】调用成功!调用WebUrl=" + hao.WebUrl + ";输入参数=" + msgData; } else { string errMsg = DynamicObject.errCode + "-" + DynamicObject.errMsg; msg = "【汉和WMS反馈任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + ";输入参数=" + msgData; } } else { string errMsg = "参数反馈空值"; msg = "【汉和WMS反馈任务状态-" + state + "】调用失败!错误原因=" + errMsg + ";调用WebUrl=" + hao.WebUrl + ";输入参数=" + msgData; } Console.WriteLine(msg); CMMLog.Info(msg); return bResult; } public class WMSInModel { public string trayCode { get; set; } public string needCreateAMSTask { get; set; } public string startBit { get; set; }//起点位置 public string produceLine { get; set; }//产线 public string isTransport { get; set; }//是否转运Y/N public string taskType { get; set; }//AMS中任务类型 public string isRian { get; set; }//是否雨天(Y/N) public string needAlarm { get; set; }//是否需要报警(Y/N) public int priority { get; set; }//优先级 public string projectCode { get; set; } public List data { get; set; } public string locationGear { get; set; } } public class WMSOutModel { public string trayCode { get; set; } public string endBit { get; set; } public string projectCode { get; set; } public List data { get; set; } } #endregion } }