using HanHe.Message; using HH.WCS.Mobox3.ZhongCeJinTan.dispatch; using HH.WCS.ZhongCeJinTan.api; using HH.WCS.ZhongCeJinTan.process; using HH.WCS.ZhongCeJinTan.util; using HH.WCS.ZhongCeJinTan.wms; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Ocsp; using S7.Net.Types; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web.Services.Description; using Top.Api; using static HH.WCS.ZhongCeJinTan.api.ApiModel; using static HH.WCS.ZhongCeJinTan.wms.WcsModel; namespace HH.WCS.ZhongCeJinTan.dispatch { /// /// wcs任务相关 /// internal class WcsTask { private static readonly HttpHelper apiHelper = new HttpHelper(); private static readonly string baseUrl = Settings.WcsApiAddres; /// /// 生成任务 /// /// /// public static bool WcsTaskEntity(WMSTask mst, CntrItemRel Item = null) { string Type = ""; string TrayType = ""; string Traycode = mst.S_CNTR_CODE; var isFu = "0"; var cntr = ContainerHelper.GetCntr(Traycode); if (cntr!=null) { if (cntr.N_DETAIL_COUNT>0) { isFu = "1"; } } var workFlow = TaskHelper.selectWorkFlowByType(mst.N_TYPE.ToString(), mst.TOOLSTYPE); if (workFlow != null) { if (workFlow.INOROUT.Contains("入库")) { Type = "1"; } if (workFlow.INOROUT.Contains("出库")) { Type = "2"; var count = TaskHelper.GetConnectionTask(mst.S_END_LOC); if (count>=2) { return false; } } } if (mst.S_CNTR_CODE.Contains("KJZ")) { TrayType = "KJZ"; } var interact = new { requestPk = mst.S_CODE,//任务号 contNo = Traycode,//托盘号 contType = TrayType,//托盘类型 trkType = Type,//任务类型 trkPrty = mst.N_PRIORITY,//任务优先级 frmPos = mst.S_START_LOC,//起始位置 toPos = mst.S_END_LOC,//目的地 isFull = isFu,//空托 满托 groupNo = Item?.S_ITEM_NAME,//搬送组号 clientCode = "WMS",//操作人 operationTime = DateTime.Now.ToString()//操作时间 }; LogHelper.Info("Wcs立库下发任务 地址信息:" + baseUrl + "receive", "立库下发任务"); LogHelper.Info("Wcs立库下发任务 参数信息:" + JsonConvert.SerializeObject(interact), "立库下发任务"); var result = apiHelper.Post(baseUrl + "receive", JsonConvert.SerializeObject(interact)); LogHelper.Info("Wcs立库下发任务 返回信息:" + JsonConvert.SerializeObject(result), "立库下发任务"); if (!string.IsNullOrEmpty(result)) { var res = JsonConvert.DeserializeObject(result); if (res.code == "0") { TaskHelper.UpdateStatus(mst, "已推送"); return true; } else { return false; } } else { LogHelper.Info("Wcs立库下发任务 返回信息为空", "立库下发任务"); return false; } } /// /// 取消任务 /// /// public static bool WcsCancellTask(WMSTask mst) { var interact = new { requestPk = mst.S_CODE,//请求pk contNo = mst.S_CNTR_CODE,//托盘号 clientCode = "", reqTime = DateTime.Now.ToString()//操作时间 }; LogHelper.Info("Wcs立库取消任务 地址信息:" + baseUrl + "cancel", "立库取消任务"); LogHelper.Info("Wcs立库取消任务 参数信息:" + JsonConvert.SerializeObject(interact), "立库取消任务"); var result = apiHelper.Post(baseUrl + "cancel", JsonConvert.SerializeObject(interact)); LogHelper.Info("Wcs立库取消任务 返回信息:" + JsonConvert.SerializeObject(result), "立库取消任务"); if (!string.IsNullOrEmpty(result)) { var res = JsonConvert.DeserializeObject(result); if (res.code == "0") { return true; } else { return false; } } else { LogHelper.Info("Wcs立库取消任务 返回信息为空", "立库取消任务"); return false; } } /// /// 输送线是否有货查询 /// /// public static bool WcsCvstate(WMSTask aloneWcsTask) { if (!aloneWcsTask.S_TYPE.Contains("出库")) { return false; } var safety = Settings.safetyLocations.Where(a => a.Area.Contains(aloneWcsTask.S_START_AREA)).FirstOrDefault(); if (safety==null) { return false; } if (safety.type!=1) { return false; } var interact = new { requestPk = aloneWcsTask.S_CODE,//请求编号 clientCode = "WMS",// 操作人 如WMS/MES等 stnNo = aloneWcsTask.S_START_LOC,//接驳位 reqTime = DateTime.Now.ToString()//操作时间 }; LogHelper.Info("Wcs立库输送线是否有货 地址信息:" + baseUrl + "CV-state", "立库"); LogHelper.Info("Wcs立库输送线是否有货 参数信息:" + JsonConvert.SerializeObject(interact), "立库"); var result = apiHelper.Post(baseUrl + "CV-state", JsonConvert.SerializeObject(interact)); LogHelper.Info("Wcs立库输送线是否有货 返回信息:" + JsonConvert.SerializeObject(result), "立库"); if (!string.IsNullOrEmpty(result)) { var res = JsonConvert.DeserializeObject(result); if (res.status == "1") { return true; } else { return false; } } else { LogHelper.Info("Wcs立库输送线是否有货 返回信息为空", "立库"); return false; } } /// /// Wcs任务下发 /// /// /// internal static WcsWarningReurn ZcWcsInWorkArea(WcsOperateTaskParme1 model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { var taskNo = ""; if (string.IsNullOrEmpty(model.requestPk)) { LogHelper.Info("任务号为空", "Wcs下发任务"); throw new Exception("任务号为空"); } else { taskNo = model.requestPk; } if (model.noticeType == "0" || model.noticeType == "6") { if (string.IsNullOrEmpty(model.contNo) ) { LogHelper.Info("contNo和curPos不能为空", "Wcs下发任务"); throw new Exception("contNo和curPos不能为空"); } } if (string.IsNullOrEmpty(model.curPos)) { LogHelper.Info("curPos不能为空", "Wcs下发任务"); throw new Exception("curPos不能为空"); } if (addWcsTask(model)) { result.msg = "Wcs下发任务成功"; result.code = "0"; result.requestPk = model.requestPk; } else { result.msg = "Wcs下发任务失败"; result.code = "1"; result.requestPk = model.requestPk; } return result; } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs下发任务异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs下发任务异常" + ex.Message, "Wcs下发任务"); return result; } } /// /// Wcs满托入和空托出 /// internal static bool addWcsTask(WcsOperateTaskParme1 model) { //作业流程 WorkFlow workFlow =null; var item = new MesReturnItem(); switch (model.noticeType) { //满托入 case "0": var url = Settings.MesGetItemApi; var interact = new { tagno = model.contNo//托盘RFID芯片编号 }; LogHelper.Info("Mes获取物料 地址信息:" + url, "Wcs下发任务"); LogHelper.Info("Mes获取物料 参数信息:" + JsonConvert.SerializeObject(interact), "Wcs下发任务"); var res = apiHelper.Post(url, JsonConvert.SerializeObject(interact)); LogHelper.Info("Mes获取物料 返回信息:" + JsonConvert.SerializeObject(res), "Wcs下发任务"); if (!string.IsNullOrEmpty(res)) { var res1 = JsonConvert.DeserializeObject(res); if (res1.flag) { if (res1.obj.Count > 0) { item = res1.obj[0]; } else { LogHelper.Info("Mes获取物料 返回List错误", "Wcs下发任务"); throw new Exception("Mes获取物料 返回List错误"); } } else { LogHelper.Info("Mes获取物料 返回失败" + res1.message, "Wcs下发任务"); throw new Exception("Mes获取物料 返回失败" + res1.message); } } else { LogHelper.Info("Mes获取物料 返回信息为空", "Wcs下发任务"); throw new Exception("Mes获取物料 返回信息为空"); } //查找起点 var start1 = LocationHelper.GetLoc(model.curPos); LogHelper.Info($"ZcWcsInWorkArea入库任务下发起点信息" + JsonConvert.SerializeObject(start1), "Wcs下发任务"); if (start1 == null || start1.S_LOCK_STATE != "无") { LogHelper.Info($"ZcWcsInWorkArea入库任务下发失败,起点:{model.curPos},没找到或有锁", "Wcs下发任务"); throw new Exception($"起点:{model.curPos},没找到或有锁"); } workFlow = TaskHelper.selectWorkFlowByStratArea(model.noticeType, start1.S_AREA_CODE); if (workFlow == null) { LogHelper.Info($"ZCSendTask入库任务下发失败,noticeType:{model.noticeType},没找到对应作业流程", "Wcs下发任务"); throw new Exception($"noticeType:{model.noticeType},没找到对应作业流程"); } else { LogHelper.Info($"入库作业流程信息" + JsonConvert.SerializeObject(workFlow), "Wcs下发任务"); } //查找终点 var endList1 = LocationHelper.GetAllLocList1(workFlow.ENDAREA); if (string.IsNullOrEmpty(model.code)) { LogHelper.Info($"ZcWcsInWorkArea入库任务下发失败,code为空", "Wcs下发任务"); throw new Exception($"code为空"); } Location end1 = null; //rfid异常,去异常库区 if (model.code == "1" || model.contNo == "99") { var endList2 = LocationHelper.GetAllLocList1(workFlow.ERRORAREA); end1 = LocationHelper.FindEndcolByLoc(endList2, workFlow.ERRORAREA); LogHelper.Info($"ZcWcsInWorkArea一段任务入异常库区终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务"); if (end1 == null) { LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs下发任务"); throw new Exception($"终点库区{workFlow.ERRORAREA},没找到终点"); } } else { end1 = LocationHelper.FindEndcolByLoc(endList1, workFlow.ENDAREA); LogHelper.Info($"ZcWcsInWorkArea一段任务入三层货架终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务"); if (end1 == null) { LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ENDAREA},没找到终点", "Wcs下发任务"); throw new Exception($"终点库区{workFlow.ENDAREA},没找到终点"); } } LogHelper.Info($"ZcWcsInWorkArea任务下发终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务"); //添加托盘 异常托盘不添加 if (!(model.code == "1" || model.contNo == "99")) { //添加托盘物料关联表 CntrItemRel rel = new CntrItemRel(); rel.S_CNTR_CODE = model.contNo; rel.PRODUCTIONDATE = DateTime.Parse(item.wrkdatetime); rel.S_ITEM_CODE = item.recipe; rel.F_SUM_QTY = item.zl; rel.TurnCardNum = item.tmh; rel.facnm = item.facnm; rel.cdrub = item.cdrub; rel.mchid = item.mchid; rel.wdate = item.wdate; rel.wsht = item.wsht; rel.strbat = item.strbat; rel.endbat = item.endbat; rel.planno = item.planno; rel.stage = item.stage; rel.grd = item.grd; ContainerHelper.CreateCntrItem(rel); Container cntr1 = new Container(); cntr1.S_CODE = model.contNo; cntr1.C_ENABLE = "Y"; cntr1.N_DETAIL_COUNT = 1; cntr1.S_TYPE = ""; ContainerHelper.CreateCntr(cntr1); } //起点终点查找成功,创建作业 var taskType1 = int.Parse(workFlow.FLOWCODE); var operation1 = new WmsWork { // 作业号 S_CODE = model.requestPk, // 作业类型 N_TYPE = taskType1, // 作业类型 S_TYPE = workFlow.FLOWNAME, // 起点货位 S_START_LOC = start1.S_CODE, // 起点库区编码 S_START_AREA = start1.S_AREA_CODE, //接驳位 CONNECTION = "", // 终点货位 S_END_LOC = end1.S_CODE, // 终点库区编码 S_END_AREA = end1.S_AREA_CODE, // 容器编码 S_CNTR_CODE = model.contNo, // 作业定义名称 S_OP_DEF_NAME = workFlow.FLOWNAME, //优先级 N_PRIORITY = 1, //工装类型 TOOLSTYPE = "", //起点库区名称 S_START_AREA_NAME = start1.S_AREA_Name, //终点库区名称 S_END_AREA_NAME= end1.S_AREA_Name, //接驳位库区名称 CONNECTION_AREA = "" }; //创建作业 if (WMSHelper.CreateWmsWork(operation1)) { LogHelper.Info($"ZcWcsInWorkArea入库作业创建成功{operation1.S_CODE}", "Wcs下发任务"); return true; } break; //空托出 case "5": //查找给定终点 var end = LocationHelper.GetLoc(model.curPos); LogHelper.Info($"ZcWcsInWorkArea出库任务下发终点信息" + JsonConvert.SerializeObject(end), "Wcs下发任务"); if (end == null || end.S_LOCK_STATE != "无") { LogHelper.Info($"ZcWcsInWorkArea出库任务下发失败,终点:{model.curPos},没找到或有锁", "Wcs下发任务"); throw new Exception($"终点:{model.curPos},没找到或有锁"); } workFlow = TaskHelper.selectWorkFlowByType(model.noticeType); if (workFlow == null) { LogHelper.Info($"ZCSendTask出库任务下发失败,noticeType:{model.noticeType},没找到对应作业流程", "Wcs下发任务"); throw new Exception($"noticeType:{model.noticeType},没找到对应作业流程"); } else { LogHelper.Info($"出库作业流程信息" + JsonConvert.SerializeObject(workFlow), "Wcs下发任务"); } //查找起点 var strrtList = LocationHelper.GetAllLocList2(workFlow.STARTAREA); Location start = null; //寻找货架空托,优先空托 start = LocationHelper.FindStartcolByHjArea(strrtList, workFlow.STARTAREA); LogHelper.Info($"ZcWcsInWorkArea出库任务下发空托起点信息" + JsonConvert.SerializeObject(start), "Wcs下发任务"); //没有空托找空架子 if (start == null) { start = LocationHelper.FindStartcolByHjAreaKjz(strrtList, workFlow.STARTAREA); } LogHelper.Info($"ZcWcsInWorkArea出库任务下发空架子起点信息" + JsonConvert.SerializeObject(start), "Wcs下发任务"); if (start == null) { LogHelper.Info($"ZcWcsInWorkArea出库任务下发失败,起点库区{workFlow.STARTAREA},没找到起点", "Wcs下发任务"); throw new Exception($"起点库区{workFlow.STARTAREA},没找到起点"); } //获取托盘码 var cntrCode = LocationHelper.GetLocCntrCode(start.S_CODE); //起点终点查找成功,创建作业 var taskType = int.Parse(workFlow.FLOWCODE); var operation = new WmsWork { // 作业号 S_CODE = model.requestPk, // 作业类型 N_TYPE = taskType, // 作业类型 S_TYPE = workFlow.FLOWNAME, // 起点货位 S_START_LOC = start.S_CODE, // 起点库区编码 S_START_AREA = start.S_AREA_CODE, //接驳位 CONNECTION = "", // 终点货位 S_END_LOC = end.S_CODE, // 终点库区编码 S_END_AREA = end.S_AREA_CODE, // 容器编码 S_CNTR_CODE = cntrCode, // 作业定义名称 S_OP_DEF_NAME = workFlow.FLOWNAME, //优先级 N_PRIORITY = 1, //工装类型 TOOLSTYPE = "" , //起点库区名称 S_START_AREA_NAME = start.S_AREA_Name, //终点库区名称 S_END_AREA_NAME = end.S_AREA_Name, //接驳位库区名称 CONNECTION_AREA = "" }; //创建作业 if (WMSHelper.CreateWmsWork(operation)) { LogHelper.Info($"ZcWcsInWorkArea出库作业创建成功{operation.S_CODE}", "Wcs下发任务"); return true; } break; //空拖入 case "6": break; //空架子入 case "7": break; default: break; } return false; } ///// /// Wcs任务执行通知 /// internal static WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { var taskNo = ""; if (string.IsNullOrEmpty(model.requestPk)) { LogHelper.Info("任务号为空", "Wcs任务执行通知"); throw new Exception("任务号为空"); } else { taskNo = model.requestPk; } var transportTask = newDb.Queryable().Where(e => e.S_CODE == taskNo && e.S_SCHEDULE_TYPE.Contains("wcs"))?.First(); if (transportTask == null) { LogHelper.Info($"未查询到{taskNo}对应的任务", "Wcs任务执行通知"); throw new Exception("未查询到对应的任务"); } TaskHelper.WcsAddActionRecord(model.requestPk, model.noticeType, "WCS"); switch (model.noticeType) { //任务开始 case "1": LogHelper.Info($"任务{taskNo}开始", "Wcs任务执行通知"); TaskHelper.Begin(transportTask); break; //任务完成 case "2": LogHelper.Info($"任务{taskNo}完成", "Wcs任务执行通知"); LocationHelper.UnLockLoc(transportTask.S_START_LOC); TaskProcess.OperateStatus(transportTask, 4); LocationHelper.UnLockLoc(transportTask.S_END_LOC); TaskProcess.OperateStatus(transportTask, 6); TaskHelper.End(transportTask); LocationHelper.CreateUpAndDown(transportTask); break; //任务执行中 case "3": break; //RFID校验上报 case "4": if (string.IsNullOrEmpty(model.code)) { LogHelper.Info($"RFID校验码为空", "Wcs任务执行通知"); throw new Exception("RFID校验码为空"); } else { WcsRfidCheckoutEntitys RfidChek = new WcsRfidCheckoutEntitys(); RfidChek.S_TASK_NO = model.requestPk; RfidChek.S_NEWTRAY_CODE = model.contNo; RfidChek.S_OLDTRAY_CODE = transportTask.S_CNTR_CODE; RfidChek.S_JBWBIT = transportTask.S_START_LOC; if (model.code=="0") { LogHelper.Info($"RFID校验码成功", "Wcs任务执行通知"); RfidChek.S_RESULT = "RFID校验成功"; } if (model.code == "1") { //校验失败 取消立库任务 改agv任务起点终点 LogHelper.Info($"RFID校验失败", "Wcs任务执行通知"); RfidChek.S_RESULT = "RFID校验失败"; if (WcsCancellTask(transportTask)) { ContainerHelper.delCntr(transportTask.S_CNTR_CODE); ContainerHelper.delCntrItem(transportTask.S_CNTR_CODE); TaskHelper.Fail(transportTask); TaskProcess.OperateStatus(transportTask, 7); var agvTask = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv"); if (agvTask == null) { LogHelper.Info($"RFID校验失败,没找到对应{transportTask.S_OP_CODE}的agv任务", "Wcs任务执行通知"); throw new Exception($"RFID校验失败,没找到对应{transportTask.S_OP_CODE }的agv任务"); } var workFlow = TaskHelper.selectWorkFlowByType(agvTask.N_TYPE.ToString(), agvTask.TOOLSTYPE); if (workFlow == null) { LogHelper.Info($"RFID校验失败,没找到对应作业流程", "Wcs任务执行通知"); throw new Exception($"RFID校验失败,没找到对应作业流程"); } //查找终点 var endList = LocationHelper.GetAllLocList1(workFlow.ERRORAREA); //var end = LocationHelper.FindBalanceEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY); var end = LocationHelper.FindEndcolByLoc(endList, workFlow.ERRORAREA); LogHelper.Info($"RFID校验失败下发异常终点信息" + JsonConvert.SerializeObject(end), "Wcs任务执行通知"); if (end == null) { LogHelper.Info($"RFID校验失败下发任务失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs任务执行通知"); throw new Exception($"RFID校验失败终点库区{workFlow.ERRORAREA},没找到终点"); } LocationHelper.LockLoc(end.S_CODE, "入库锁", 1); agvTask.S_START_LOC = agvTask.S_END_LOC; agvTask.S_START_AREA = agvTask.S_END_AREA; agvTask.S_START_AREA_NAME = agvTask.S_END_AREA_NAME; agvTask.S_END_LOC = end.S_CODE; agvTask.S_END_AREA = end.S_AREA_CODE; agvTask.S_END_AREA_NAME = end.S_AREA_Name; agvTask.S_TYPE = workFlow.FLOWNAME; newDb.BeginTran(); var I = newDb.Updateable(agvTask).UpdateColumns(it => new { it.S_START_LOC, it.S_START_AREA,it.S_END_LOC,it.S_END_AREA,it.S_TYPE,it.S_B_STATE, it.S_START_AREA_NAME, it.S_END_AREA_NAME }).ExecuteCommand(); if (I == 0) { throw new Exception("修改任务表失败"); } newDb.CommitTran(); } } newDb.BeginTran(); var R = newDb.Insertable(RfidChek).ExecuteCommand(); if (R == 0) { throw new Exception("添加RFID校验表失败"); } newDb.CommitTran(); } break; //取货完成 case "5": TaskHelper.UpdateStatus(transportTask, "取货完成"); LocationHelper.UnBindingLoc(transportTask.S_START_LOC, transportTask.S_CNTR_CODE.Split(',').ToList()); break; //7取消 case "7": if (transportTask.S_B_STATE=="完成") { throw new Exception($"{transportTask}任务已完成,不允许取消"); } LogHelper.Info($"任务号{transportTask.S_CODE},取消任务成功", "Wcs任务执行通知"); TaskHelper.Fail(transportTask); TaskProcess.OperateStatus(transportTask, 7); if (transportTask.S_TYPE.Contains("出库")) { var agvTask1 = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv"); if (agvTask1 != null) { TaskHelper.Fail(agvTask1); NDCApi.CancelOrder(agvTask1.S_CODE.Trim()); TaskProcess.CacheBitCancelUpdate(agvTask1); } } else { ContainerHelper.delCntr(transportTask.S_CNTR_CODE); ContainerHelper.delCntrItem(transportTask.S_CNTR_CODE); } break; default: break; } result.msg = "通知成功"; result.code = "0"; result.requestPk = model.requestPk; } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs任务执行通知异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs任务执行通知异常" + ex.Message, "Wcs任务执行通知"); return result; } return result; } /// /// Wcs报警上报 /// /// /// internal static WcsWarningReurn WcsTaskProcessing(WcsWarningParme model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { var ghh = $" 任务号:{model.taskNo}\n 库区:{model.areaCode} \n 巷道:{model.roadway}\n 故障内容:{model.remarks} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; var dd = new DingDingHelper(); dd.button1_Click(ghh); newDb.BeginTran(); WcsWarningEntitys aloneWcsTask = new WcsWarningEntitys() { requestPk = model.requestPk, taskNo = model.taskNo, errorDes = model.errorDes, errorNo = model.errorNo, remarks = model.remarks, areaCode = model.areaCode, roadway = model.roadway, reqTime = model.reqTime }; var I = newDb.Insertable(aloneWcsTask).ExecuteCommand(); if (I == 0) { throw new Exception("添加立库报警信息表失败"); } //立库报警修改巷道可用表 //var parme = new WcsRoadwaystateParme(); //parme.requestPk = model.requestPk; //parme.roadWay = model.roadway; //parme.reqTime = model.reqTime; //parme.areaCode = model.areaCode; //WcsRoadwaystate(parme); newDb.CommitTran(); result.code = "0"; result.msg = "成功"; result.requestPk = model.requestPk; LogHelper.Info("Wcs报警上报返回"+ JsonConvert.SerializeObject(result), "报警上报"); return result; } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs报警信息异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs报警信息异常" + ex.Message, "报警上报"); return result; } } public static WcsPositionAvailableReturn WcsPositionAvailable(string S_TASK_NO ,List list) { WcsPositionAvailableReturn entityTwo = new WcsPositionAvailableReturn(); var interact = new { requestPk = S_TASK_NO,//任务号 stnNo = list,//接驳位 operationTime = DateTime.Now.ToString()//操作时间 }; try { LogHelper.Info("查询Wcs立库接驳位 地址信息:" + baseUrl + "positionAvailable", "接驳位"); LogHelper.Info("查询Wcs立库接驳位 参数信息:" + JsonConvert.SerializeObject(interact),"接驳位"); var result = apiHelper.Post(baseUrl + "positionAvailable", JsonConvert.SerializeObject(interact)); LogHelper.Info("查询Wcs立库接驳位 返回信息" + JsonConvert.SerializeObject(result), "接驳位"); if (string.IsNullOrEmpty(result)) { entityTwo.code = "1"; return entityTwo; } var data = JsonConvert.DeserializeObject(result); return data; } catch (Exception ex) { entityTwo.code = "1"; entityTwo.msg = ex.Message; return entityTwo; } } internal static WcsWarningReurn WcsRoadwaystate(WcsRoadwaystateParme model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { if (string.IsNullOrEmpty(model.areaCode)) { throw new Exception("库区禁止为空"); } if (model.roadWay == "0") { throw new Exception("没传巷道号"); } if (string.IsNullOrEmpty(model.status)) { throw new Exception("状态禁止为空"); } if (model.status != "0" && model.status != "1") { throw new Exception($"非法状态码 状态码为 {model.status}"); } var rowdwa = newDb.Queryable().Where(x => x.areaCode == model.areaCode && x.roadWay == model.roadWay).First(); if (rowdwa == null) { //throw new Exception($"巷道表没找到库区是{model.areaCode},巷道是{model.roadWay}的数据"); RoadWayEnable rowdwa1 = new RoadWayEnable() { requestPk = model.requestPk, status = model.status, areaCode = model.areaCode, roadWay = model.roadWay, reqTime = model.reqTime }; newDb.BeginTran(); var I = newDb.Insertable(rowdwa1).ExecuteCommand(); if (I == 0) { throw new Exception("添加巷道可用表失败"); } newDb.CommitTran(); } else { if (rowdwa.status == model.status) { result.code = "0"; result.msg = "成功"; return result; } rowdwa.requestPk = model.requestPk; rowdwa.status = model.status; rowdwa.areaCode = model.areaCode; rowdwa.roadWay = model.roadWay; rowdwa.reqTime = model.reqTime; newDb.BeginTran(); var I = newDb.Updateable(rowdwa).UpdateColumns(it => new { it.requestPk, it.status, it.areaCode, it.roadWay, it.reqTime }).ExecuteCommand(); if (I == 0) { throw new Exception("修改巷道可用表失败"); } newDb.CommitTran(); } result.code = "0"; result.msg = "成功"; result.requestPk = model.requestPk; LogHelper.Info("Wcs巷道可用上报返回" + JsonConvert.SerializeObject(result), "巷道可用上报"); return result; } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs巷道可用上报异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs巷道可用上报异常" + ex.Message, "巷道可用上报"); return result; } } /// /// agv执行通知 /// /// /// /// /// public static bool WcsCallback(WMSTask mst, int state, string forkliftNo = "") { string Type = ""; string bit = ""; var Meshod = ""; var newDb = new SqlHelper().GetInstance(); var tac = newDb.Queryable().Where(a => a.TaskNo == mst.S_CODE && a.Sign == state).ToList(); if (tac.Count() > 0) { LogHelper.Info("查询到安全请求信号记录表已经存在数据,此次信号不下达给立库", "agv执行通知"); return true; } switch (state) { case 1101: Type = "1"; bit = mst.S_START_LOC; Meshod = "AgvRequest"; break; case 1102: Type = "1"; bit = mst.S_START_LOC; Meshod = "Complete"; break; case 1103: Type = "2"; bit = mst.S_END_LOC; Meshod = "AgvRequest"; break; case 1104: Type = "2"; bit = mst.S_END_LOC; Meshod = "Complete"; break; case 7: Type = "5"; if (mst.S_TYPE.Contains("出库")) { bit = mst.S_START_LOC; } else { bit = mst.S_END_LOC; } Meshod = "AgvRequestCancel"; break; } var interact = new { requestPk = mst.S_CODE,//任务号 trkType = Type,//任务类型 method = Meshod,//API名称 stnNo = bit,//目的地站台号 carNo = forkliftNo,// 车号 clientCode = "WMS",//操作人 operationTime = DateTime.Now.ToString()//操作时间 }; LogHelper.Info("agv执行通知 地址信息:" + baseUrl + "agvCallback", "agv执行通知"); LogHelper.Info("agv执行通知 参数信息:" + JsonConvert.SerializeObject(interact), "agv执行通知"); var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact)); LogHelper.Info("agv执行通知 返回信息:" + JsonConvert.SerializeObject(result), "agv执行通知"); if (!string.IsNullOrEmpty(result)) { var res = JsonConvert.DeserializeObject(result); if (res.code == "0") { WcsSafety Sign = new WcsSafety(); Sign.TaskNo = mst.S_CODE; Sign.Sign = state; newDb.BeginTran(); var B = newDb.Insertable(Sign).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); LogHelper.Info("agv执行通知成功:", "agv执行通知"); return true; } else { return false; } } else { LogHelper.Info("agv执行通知成功 返回信息为空", "agv执行通知"); return false; } } /// /// agv开关门执行通知 /// /// /// /// /// public static bool WcsCallback1(WMSTask mst, int state, string forkliftNo = "") { string Type = ""; string bit = ""; var Meshod = ""; var newDb = new SqlHelper().GetInstance(); if (mst.S_TYPE.Contains("入库")) { if (state == 1023) { Meshod = "AgvRequest"; bit = mst.S_END_LOC; Type = "3"; } else{ Meshod = "AgvRequest"; bit = mst.S_END_LOC; Type = "4"; } } else if (mst.S_TYPE.Contains("出库")) { if (state == 1023) { Meshod = "AgvRequest"; bit = mst.S_START_LOC; Type = "3"; } else { Meshod = "AgvRequest"; bit = mst.S_START_LOC; Type = "4"; } } else { LogHelper.Info("除了出入库其余不需要安全请求", "agv执行通知"); return true; } var interact = new { requestPk = mst.S_CODE,//任务号 trkType = Type,//任务类型 method = Meshod,//API名称 stnNo = bit,//目的地站台号 carNo = forkliftNo,// 车号 clientCode = "WMS",//操作人 operationTime = DateTime.Now.ToString()//操作时间 }; LogHelper.Info("agv执行通知 地址信息:" + baseUrl + "agvCallback", "agv执行通知"); LogHelper.Info("agv执行通知 参数信息:" + JsonConvert.SerializeObject(interact), "agv执行通知"); var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact)); LogHelper.Info("agv执行通知 返回信息:" + JsonConvert.SerializeObject(result), "agv执行通知"); if (!string.IsNullOrEmpty(result)) { var res = JsonConvert.DeserializeObject(result); if (res.code == "0") { WcsSafety Sign = new WcsSafety(); Sign.TaskNo = mst.S_CODE; Sign.Sign = state; newDb.BeginTran(); var B = newDb.Insertable(Sign).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); LogHelper.Info("agv执行通知成功:", "agv执行通知"); return true; } else { return false; } } else { LogHelper.Info("agv执行通知成功 返回信息为空", "agv执行通知"); return false; } } /// /// 放货有货 /// /// /// public static WcsWarningReurn ZcInChangeBit(changeBitParme model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { if (string.IsNullOrEmpty(model.taskNo)) { throw new Exception("任务号为空"); } var task = TaskHelper.GetTask(model.taskNo); if (task==null) { throw new Exception($"未查询到任务号{model.taskNo}的任务"); } if (task.S_TYPE.Contains("出库")) { //取货无货 LogHelper.Info($"任务号{task.S_CODE},取货无货,取消任务", "放货有货"); if (WcsCancellTask(task)) { LogHelper.Info($"任务号{task.S_CODE},取消任务成功,起点{task.S_START_LOC}设为异常", "放货有货"); TaskHelper.Fail(task); TaskProcess.OperateStatus(task, 7); LocationHelper.updateLocLock(task.S_START_LOC, 4, "异常锁"); var agvTask = TaskHelper.GetTaskByWorkNo(task.S_OP_CODE, "agv"); if (agvTask != null) { TaskHelper.Fail(agvTask); NDCApi.CancelOrder(agvTask.S_CODE.Trim()); TaskProcess.CacheBitCancelUpdate(agvTask); } } } else { //卸货有货 if (task.S_B_STATE.Contains("完成") || task.S_B_STATE.Contains("取消") || task.S_B_STATE.Contains("失败")) { throw new Exception($"任务号{model.taskNo},任务状态:{task.S_B_STATE},不能改道"); } var endLoc = LocationHelper.GetLocOne(task.S_END_LOC); var end = newDb.Queryable().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.N_ROW && a.N_COL > endLoc.N_COL && a.S_LOCK_STATE == "无" && a.N_CURRENT_NUM == 0 && a.C_ENABLE == "Y").OrderBy(b => b.N_COL).First(); LogHelper.Info($"Wcs放货有货寻找新终点信息" + JsonConvert.SerializeObject(end), "放货有货"); if (end != null) { newDb.BeginTran(); endLoc.N_LOCK_STATE = 4; endLoc.S_LOCK_STATE = "异常锁"; newDb.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand(); task.S_END_LOC = end.S_CODE; newDb.Updateable(task).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand(); newDb.CommitTran(); LocationHelper.LockLoc(end.S_CODE, "入库锁", 1); result.msg = end.S_CODE; result.code = "0"; result.requestPk = model.requestPk; } else { throw new Exception($"未查询到库区{endLoc.S_AREA_CODE}有符合的货位"); } } } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs放货有货异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs放货有货异常" + ex.Message, "放货有货"); return result; } return result; } /// /// agv通知确认 /// /// /// public static WcsWarningReurn agvResponse(agvResponseParme model) { var result = new WcsWarningReurn(); var newDb = new SqlHelper().GetInstance(); try { newDb.BeginTran(); WcsInform aloneWcsTask = new WcsInform() { requestPk = model.requestPk, trkType = model.trkType, isAllow = model.isAllow, stnNo = model.stnNo, carNo = model.carNo, clientCode = model.clientCode, reqTime = model.reqTime }; var I = newDb.Insertable(aloneWcsTask).ExecuteCommand(); if (I == 0) { throw new Exception("添加立库通知确认表失败"); } newDb.CommitTran(); result.code = "0"; result.msg = "成功"; result.requestPk = model.requestPk; LogHelper.Info("Wcs通知确认返回" + JsonConvert.SerializeObject(result), "通知确认"); return result; } catch (Exception ex) { newDb.RollbackTran(); result.msg = "Wcs通知确认异常"; result.code = "1"; result.requestPk = model.requestPk; LogHelper.Info("Wcs通知确认异常" + ex.Message, "通知确认"); return result; } } } /// /// Wcs任务返回 /// public class WcsTaskReturn { public string code { get; set; } public string msg { get; set; } public string requestPk { get; set; } public string status { get; set; } } /// /// mes汇报任务返回 /// public class MesTaskReturn { public string code { get; set; } public string msg { get; set; } public bool success { get; set; } public DataItem lastTime { get; set; } } /// /// Mes接口返回 /// public class MesReturn { /// /// 成功:true,失败:false /// public bool flag { get; set; } /// /// 失败原因 /// public string message { get; set; } /// /// List对象 /// public List obj { get; set; } } /// /// Mes返回物料信息 /// public class MesReturnItem { /// /// 工厂 /// public string facnm { get; set; } /// /// 条码号 /// public string tmh { get; set; } /// /// 配方 /// public string recipe { get; set; } /// /// 胶号 /// public string cdrub { get; set; } /// /// 机台 /// public string mchid { get; set; } /// /// 作业日期 /// public string wdate { get; set; } /// /// 班次 /// public string wsht { get; set; } /// /// 开始车次 /// public string strbat { get; set; } /// /// 结束车次 /// public string endbat { get; set; } /// /// 重量 /// public decimal zl { get; set; } /// /// 生产计划编号 /// public string planno { get; set; } /// /// 托盘RFID芯片 /// public string tagno { get; set; } /// /// 生产时间 /// public string wrkdatetime { get; set; } /// /// 胶料段 /// public string stage { get; set; } /// /// 检验结果 /// public string grd { get; set; } } /// /// Wcs任务返回 /// public class WcsTaskCallBack { public string code { get; set; } public string msg { get; set; } public string requestPk { get; set; } } public class WcsPositionAvailableReturn { public string code { get; set; } public string msg { get; set; } public string requestPk { get; set; } public List available { get; set; } } public class WcsReturnEntityWtp { public string code { get; set; } public string msg { get; set; } public string contNo { get; set; } public string contType { get; set; } public string requestPk { get; set; } } }