using HH.WCS.JunzhouNongfu.device; using HH.WCS.Mobox3.TSSG.device; using HH.WCS.Mobox3.TSSG.dispatch; using HH.WCS.Mobox3.TSSG.models; using HH.WCS.Mobox3.TSSG.process; using HH.WCS.Mobox3.TSSG.util; using HH.WCS.Mobox3.TSSG.wms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Threading.Tasks; using static HH.WCS.Mobox3.TSSG.api.ApiModel; namespace HH.WCS.Mobox3.TSSG.core { internal class WCSCore { public static void OperateAgvTaskStatus(AgvTaskState model) { if (string.IsNullOrEmpty(model.No)) { var alertorDevice = Settings.alertorLightInfos.Where(a => a.deviceNo == int.Parse(model.LockNo)).FirstOrDefault(); if (model.State == 1023) { var result = HH.WCS.Mobox3.TSSG.device.TcpClient.SendHexOnce(alertorDevice.address, 502, alertorDevice.turnLight); LogHelper.Info("modbus 返回信号:" + result, "TSSG"); } if (model.State == 1025) { var result = HH.WCS.Mobox3.TSSG.device.TcpClient.SendHexOnce(alertorDevice.address, 502, alertorDevice.offLight); LogHelper.Info("modbus 返回信号:" + result, "TSSG"); } } else { var TN_Task = WCSHelper.GetTask(model.No); if (TN_Task != null) { bool isExist = WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, model.State); if (!isExist) { if (model.State <= 7) { var deviceInfo = Settings.getDeviceInfo(TN_Task.S_START_LOC); //有任务号请求 switch (model.State) { case 1: if (!model.ForkliftNo.Equals("0")) { TN_Task.S_EQ_NO = model.ForkliftNo; } WCSHelper.Begin(TN_Task); break; #region MyRegion case 3: WCSHelper.UpdateStatus(TN_Task, "开始取货"); if (deviceInfo != null) { string hexString = "3F 00 11 0D 0A"; byte[] before = hexString .Split(' ') .Select(s => Convert.ToByte(s, 16)) // 使用基数16转换 .ToArray(); TcpServer.TcpServerSend(deviceInfo.address, before); } break; case 4: WCSHelper.UpdateStatus(TN_Task, "取货完成"); TaskProcess.OperateStatus(TN_Task, 4); if (deviceInfo != null) { string hexString = "3F 00 10 0D 0A"; byte[] back = hexString .Split(' ') .Select(s => Convert.ToByte(s, 16)) // 使用基数16转换 .ToArray(); TcpServer.TcpServerSend(deviceInfo.address, back); } break; case 5: WCSHelper.UpdateStatus(TN_Task, "开始卸货"); WCSHelper.UpdateStatus(TN_Task, "卸货完成"); TaskProcess.OperateStatus(TN_Task, 6); if (TN_Task.S_OP_NAME == "移库单移库") { var startLoc = LocationHelper.GetLoc(TN_Task.S_START_LOC); var endLoc = LocationHelper.GetLoc(TN_Task.S_END_LOC); TN_YiKuDetail detail = new TN_YiKuDetail() { S_NO = TN_Task.S_OP_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_START_ROW = startLoc.N_ROW, S_END_AREA = endLoc.S_AREA_CODE, S_END_ROW = endLoc.N_ROW }; WMSHelper.updateShiftOrderDetail(detail); } WCSHelper.End(TN_Task); break; case 6: break; #endregion case 2: // 修改工单状态 /* WCSHelper.UpdateWorkOrderStatus(TN_Task.S_OP_CODE, "已完成");*/ break; case 7: //判断是否收到过强制取消,有就不做任何处理 if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17)) { TaskProcess.OperateStatus(TN_Task, 7); WCSHelper.Cancel(TN_Task); } break; } WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); //调用第三方接口(如果有)TaskProcess.ReportStatus } else { //安全请求等 TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData ); } } } } } /// /// 任务分发,根据调度类型发给不同的调度系统 /// internal static void Dispatch() { var db = new SqlHelper().GetInstance(); //查询任务 //获取所有等待的任务 var list = WCSHelper.GetWaitingTaskList(); if (list.Count > 0) { foreach (var task in list) { if (!TaskProcess.Intercept(task)) { //使用自定义任务推送 TaskProcess.SendTask(task); } } } } /// /// 杭奥堆垛机信号反馈 /// /// internal static void OperateHATaskStatus(HanAo.TaskStateInfoModel model) { var wcsTask = WCSHelper.GetTask(model.requestPk); if (wcsTask != null) { if (model.code == "0") { // if (wcsTask.S_TYPE == "堆垛机入库") { //终点托盘绑定 if (LocationHelper.BindingLoc(wcsTask.S_END_LOC, new List { wcsTask.S_CNTR_CODE })) { //修改托盘状态为可用,增加库存量表,后面分拣出可以计算到 ContainerHelper.Enable(wcsTask.S_CNTR_CODE, wcsTask.S_END_LOC); } } else if (wcsTask.S_TYPE == "堆垛机出库") { //起点托盘解绑 LocationHelper.UnBindingLoc(wcsTask.S_START_LOC, new List { wcsTask.S_CNTR_CODE }); } //标记任务完成 //标记作业完成 wcsTask.N_B_STATE = 3; WCSHelper.UpdateStatus(wcsTask); var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE); if (wmsTask != null) { wmsTask.N_B_STATE = 2; WMSHelper.UpdateTaskState(wmsTask); } } } } } }