using HH.WCS.Mobox3.YNJT_BZP.core; using HH.WCS.Mobox3.YNJT_BZP.device; using HH.WCS.Mobox3.YNJT_BZP.models; using HH.WCS.Mobox3.YNJT_BZP.process; using HH.WCS.Mobox3.YNJT_BZP.util; using HH.WCS.Mobox3.YNJT_BZP.wms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NLog.Fluent; using SqlSugar; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; using System.Threading; using System.Web.UI; using static HH.WCS.Mobox3.YNJT_BZP.api.ApiModel; using static HH.WCS.Mobox3.YNJT_BZP.api.OtherModel; using static HH.WCS.Mobox3.YNJT_BZP.api.WmsController; namespace HH.WCS.Mobox3.YNJT_BZP.api { /// /// api接口辅助类 /// public class ApiHelper { static ApiHelper() { } /// /// 1.创建入库任务 /// public static ReturnResult createInOrder(CreateInOrderModel model) { ReturnResult result = new ReturnResult(); try { if (model.taskType == "机台半制品入库" || model.taskType == "成型机余料回库") { var itemInfos = model.itemInfo; if (itemInfos == null || itemInfos.Count == 0) { result.ResultCode = 1; result.ResultMsg = "物料信息不能为空"; return result; } else { foreach (var item in itemInfos) { // 将MES的物料状态转化成WMS可识别的物料状态 if (item.jdge == "" || item.jdge == null) { item.jdge = "OK"; } else if(item.jdge != "OK") { item.jdge = "HOLD"; } // 计算生效时间、失效时间 var overage = WMSHelper.getOverage(item.bc_entried); if (overage != null) { DateTime txndate = DateTime.Parse(item.txndate); DateTime minTime = txndate.AddHours(overage.MINHOUR); DateTime maxTime = txndate.AddDays(overage.OVERAGE); item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss"); item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); } else { result.ResultCode = 1; result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}"; return result; } } } } var container = ContainerHelper.GetCntr(model.trayCode); if (container != null) { // 胎圈容器入库需检测母拖是否存在 if (container.N_TYPE == 6) { if (!WMSHelper.CheckBaseTrayNum()) { result.ResultCode = 1; result.ResultMsg = $"库内母拖不足,请尽快补充"; return result; } } } else { result.ResultCode = 1; result.ResultMsg = $"系统未查询到容器:{model.trayCode},请先在系统进行配置"; return result; } Location startLoc = LocationHelper.GetLoc(model.startLoc); Location middleLoc = null; if (Settings.getAgvWaitLoc().Count > 0) { middleLoc = LocationHelper.GetLoc(Settings.getAgvWaitLoc()[0]); } Location endLoc = new Location() { S_CODE = "虚拟货位", S_AREA_CODE = "虚拟库区" }; if (startLoc != null) { if (startLoc.N_LOCK_STATE != 0) { var wcsTask = WCSHelper.GetTaskByStartAndEnd(startLoc.S_CODE); if (wcsTask != null) { result.ResultCode = 1; result.ResultMsg = "开始货位已存在任务,请勿重复下发任务"; return result; } } var wmsTask = new WMSTask() { S_CNTR_CODE = model.trayCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = model.taskType, S_OP_DEF_CODE = model.taskNo, S_OP_DEF_NAME = "半制品/余料/空托下发入库任务", N_PRIORITY = model.priority, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = wmsTask.S_CNTR_CODE, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = middleLoc.S_CODE, S_END_AREA = middleLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "AGV", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); // 记录入库的物料信息 ItemHelper.addCntrItem(model.trayCode, model.itemInfo); } } } else { result.ResultCode = 1; result.ResultMsg = "开始货位不存在,请检查开始货位编码是否正确"; } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 2.空托出库 /// /// /// public static ReturnResult emptyTrayOutOrder(EmptyTrayOutOrderModel model) { ReturnResult result = new ReturnResult(); try { Location startLoc = WMSHelper.GetEmptyTrayStartLoc(model.trayType); Location middleLoc = null; string cntrCode = ""; string descCntrCode = ""; if (startLoc != null) { // 查询货位容器编码 、目标容器编码 var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE); if (locCntrRels.Count > 0) { foreach (var item in locCntrRels) { var container = ContainerHelper.GetCntr(item.S_CNTR_CODE); if (model.trayType == container.N_TYPE) { descCntrCode = item.S_CNTR_CODE; } cntrCode = cntrCode + "," + item.S_CNTR_CODE; } cntrCode = cntrCode.Substring(1, cntrCode.Length - 1); } var locCodes = Settings.getAgvJBLocList(1, startLoc.N_ROADWAY, 2); if (locCodes.Count > 0) { middleLoc = LocationHelper.GetLoc(locCodes[0]); } } Location endLoc = LocationHelper.GetLoc(model.endLoc); if (endLoc == null) { result.ResultCode = 1; result.ResultMsg = "WMS系统没有该货位,请检查终点货位编码是否正确"; return result; } if (startLoc != null) { var wmsTask = new WMSTask() { S_CNTR_CODE = descCntrCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "空托出库任务", S_OP_DEF_CODE = model.taskNo, S_OP_DEF_NAME = "空托出库任务", N_PRIORITY = model.priority, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段出库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = middleLoc.S_CODE, S_END_AREA = middleLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask) ) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } else { result.ResultCode = 1; result.ResultMsg = "库内没有查到空托盘"; } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 3.创建出库任务 /// /// /// public static ReturnResult createOutOrder(CreateOutOrderModel model) { ReturnResult result = new ReturnResult(); try { Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode); Location middleLoc = null; string descCntrCode = ""; string cntrCode = ""; if (startLoc != null) { // 查询接驳位 var locCodes = Settings.getAgvJBLocList(1, startLoc.N_ROADWAY, 2); if (locCodes.Count > 0) { middleLoc = LocationHelper.GetLoc(locCodes[0]); } // 查询货位容器编码 、目标容器编码 var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE); if (locCntrRels.Count > 0) { foreach (var item in locCntrRels) { var cntrItemRels = ContainerHelper.GetCntrItemRel(item.S_CNTR_CODE); if (cntrItemRels.Count > 0) { descCntrCode = cntrItemRels[0].S_CNTR_CODE; } cntrCode = cntrCode + "," + item.S_CNTR_CODE; } cntrCode = cntrCode.Substring(1, cntrCode.Length - 1); } } else { result.ResultCode = 1; result.ResultMsg = "库内没有满足条件的物料"; return result; } Location endLoc = LocationHelper.GetLoc(model.endLoc); if (endLoc != null) { var wmsTask = new WMSTask() { S_CNTR_CODE = descCntrCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "成型机叫料出库任务", S_OP_DEF_CODE = model.taskNo, S_OP_DEF_NAME = "成型机叫料出库任务", N_PRIORITY = model.priority, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段出库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = middleLoc.S_CODE, S_END_AREA = middleLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 4.创建人工入库任务 /// /// /// public static ReturnResult manualStorage(CreateInOrderModel model) { ReturnResult result = new ReturnResult(); try { if(model.itemInfo != null && model.itemInfo.Count > 0) { foreach (var item in model.itemInfo) { // 将MES的物料状态转化成WMS可识别的物料状态 if (item.jdge == "" || item.jdge == null) { item.jdge = "OK"; } else if (item.jdge != "OK") { item.jdge = "HOLD"; } var overage = WMSHelper.getOverage(item.bc_entried); if (overage != null && overage.OVERAGE != 0) { DateTime txndate = DateTime.Parse(item.txndate); DateTime minTime = txndate.AddHours(overage.MINHOUR); DateTime maxTime = txndate.AddDays(overage.OVERAGE); item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss"); item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); } else { result.ResultCode = 1; result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}"; return result; } } } var container = ContainerHelper.GetCntr(model.trayCode); if (container != null) { Location startLoc = LocationHelper.GetLoc(model.startLoc); Location endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, model.startLoc, 2); if (endLoc != null) { string cntrCode = model.trayCode; var locCntrRels = LocationHelper.GetLocCntr(model.startLoc); if (locCntrRels.Count > 0) { cntrCode = cntrCode + "," + locCntrRels[0].S_CNTR_CODE; } var wmsTask = new WMSTask() { S_CNTR_CODE = model.trayCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "人工入库任务", S_OP_DEF_CODE = model.taskNo, S_OP_DEF_NAME = "人工入库任务", N_PRIORITY = model.priority, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); // 记录入库的物料信息 ItemHelper.addCntrItem(model.trayCode, model.itemInfo); } } } else { result.ResultCode = 1; result.ResultMsg = "没有空余的货位"; } } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 5.创建人工出库任务 /// /// /// public static ReturnResult manualDelivery(CreateOutOrderModel model) { ReturnResult result = new ReturnResult(); try { Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode,model.trayCode , model.endLoc); Location endLoc = LocationHelper.GetLoc(model.endLoc); if (startLoc != null) { string descCntrCode = ""; string cntrCode = ""; var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE); if (locCntrRels.Count > 0) { foreach (var item in locCntrRels) { var cntrItemRels = ContainerHelper.GetCntrItemRel(item.S_CNTR_CODE); if (cntrItemRels.Count > 0) { descCntrCode = cntrItemRels[0].S_CNTR_CODE; } cntrCode = cntrCode + ","+ item.S_CNTR_CODE; } cntrCode = cntrCode.Substring(1, cntrCode.Length-1); } var wmsTask = new WMSTask() { S_CNTR_CODE = descCntrCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "人工出库任务", S_OP_DEF_CODE = model.taskNo, S_OP_DEF_NAME = "人工出库任务", N_PRIORITY = model.priority, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WMS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } else { result.ResultCode = 1; result.ResultMsg = "库内没有满足条件的物料"; } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 6.母拖入库任务 /// /// /// /// public static ReturnResult baseTrayInStock(string loc, string taskNo ) { LogHelper.Info("【母拖入库任务】开始下发母拖入库任务", "WMS"); ReturnResult result = new ReturnResult(); try { Location startLoc = LocationHelper.GetLoc(loc); Location endLoc = WMSHelper.GetInstockEndLoc(0, loc, 2); if (endLoc != null && startLoc != null) { string trayCode = null; var locCntrRels = LocationHelper.GetLocCntrRel(loc); if (locCntrRels.Count > 0) { var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE); if (container.N_TYPE == 0) { trayCode = container.S_CODE; } } else { trayCode = ContainerHelper.GenerateCntrNo(); ContainerHelper.AddCntr(trayCode, 0); } if (trayCode != null) { var wmsTask = new WMSTask() { S_CNTR_CODE = trayCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "母拖入库任务", S_OP_DEF_CODE = taskNo, S_OP_DEF_NAME = "母拖入库任务", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = wmsTask.S_CNTR_CODE, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } } else { result.ResultCode = 1; result.ResultMsg = "没有空余的货位"; } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 6.1.母拖入库任务 /// /// /// /// public static ReturnResult baseTrayInStockAgv(string loc, string wmsTaskNo) { ReturnResult result = new ReturnResult(); try { var cst = WCSHelper.GetTaskByStart(loc); if (cst == null) { Location startLoc = LocationHelper.GetLoc(loc); Location endLoc = LocationHelper.GetLoc(Settings.baseTrayInBufferLoc); if (!(endLoc != null && endLoc.N_CURRENT_NUM == 0)) { endLoc = WMSHelper.GetInstockEndLoc(0, loc, 2); } if (endLoc != null && startLoc != null) { string trayCode = null; var locCntrRels = LocationHelper.GetLocCntrRel(loc); if (locCntrRels.Count > 0) { var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE); if (container.N_TYPE == 0) { trayCode = container.S_CODE; } } else { trayCode = ContainerHelper.GenerateCntrNo(); ContainerHelper.AddCntr(trayCode, 0); } if (trayCode != null) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_CODE = wmsTaskNo, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = trayCode, S_TYPE = "母拖入库任务", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); } } } else { result.ResultCode = 1; result.ResultMsg = "没有空余的货位"; } } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 7.母拖出库任务 /// /// /// /// public static ReturnResult baseTrayOutStock(string loc ,string taskNo ,int exclude = 1) { LogHelper.Info("【母拖出库任务】开始下发母拖出库任务", "WMS"); ReturnResult result = new ReturnResult(); try { Location startLoc = WMSHelper.GetEmptyTrayStartLoc(0, exclude); Location endLoc = LocationHelper.GetLoc(loc); var agvJBLoc = Settings.getAgvJBLoc(loc); if (startLoc != null) { string trayCode = null; var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); if (locCntrRels.Count == 1) { trayCode = locCntrRels[0].S_CNTR_CODE; } if (trayCode != null) { var wmsTask = new WMSTask() { S_CNTR_CODE = trayCode, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "母拖出库任务", S_OP_DEF_CODE = taskNo, S_OP_DEF_NAME = "母拖出库任务", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = wmsTask.S_CNTR_CODE, S_TYPE = wmsTask.S_TYPE + "-1", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } } else { result.ResultCode = 1; result.ResultMsg = "没有空余的母拖"; LogHelper.Info("【母拖出库任务】库内没有空余的母拖", "WMS"); } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 7.1.母拖出库任务(AGV) /// /// /// /// public static ReturnResult baseTrayOutStockAgv(string loc, string wmsTaskNo) { ReturnResult result = new ReturnResult(); try { var cst = WCSHelper.GetTaskByEnd(loc); if (cst == null) { Location startLoc = WMSHelper.GetEmptyTrayStartLoc(0, 0); Location endLoc = LocationHelper.GetLoc(loc); if (startLoc != null) { string trayCode = null; var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); if (locCntrRels.Count == 1) { trayCode = locCntrRels[0].S_CNTR_CODE; } if (trayCode != null) { // 创建入库任务 WCSTask wcsTask = new WCSTask() { S_OP_CODE = wmsTaskNo, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = trayCode, S_TYPE = "母拖出库任务", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 1, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); } } } else { result.ResultCode = 1; result.ResultMsg = "没有空余的母拖"; } } } catch (Exception ex) { result.ResultCode = 1; result.ResultMsg = "WMS内部错误,请联系开发人员排查"; LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS"); } return result; } /// /// 任务状态回报 /// 任务状态 1:开始/执行中;完成;3:准备取货;4:取货完成;5:准备卸货;6:卸货完成;7:异常取消;8:强制完成 /// 1.根据任务状态回报更新货位状态、任务状态 /// 2.更新任务中间表状态 /// 4.更新出库任务中间表状态 /// /// /// public static ReturnResult taskStatusFeedback(TaskStatusFeedbackModel model) { ReturnResult responseResult = new ReturnResult(); WCSTask cst = WCSHelper.GetTask(model.taskNo); if (cst != null) { bool isExist = WCSHelper.CheckActionRecordExist(cst.S_CODE, model.status); if (!isExist) { WMSTask mst = WMSHelper.GetWmsTask(cst.S_OP_CODE); if (mst != null) { switch (model.status) { case 1: WCSHelper.Begin(cst); break; case 2: WCSHelper.End(cst); break; case 3: WCSHelper.UpdateStatus(cst, "准备取货"); break; case 4: WCSHelper.UpdateStatus(cst, "取货完成"); TaskProcess.OperateStatus(cst, 4); break; case 5: WCSHelper.UpdateStatus(cst, "准备卸货"); break; case 6: WCSHelper.UpdateStatus(cst, "卸货完成"); TaskProcess.OperateStatus(cst, 6); break; case 7: WCSHelper.UpdateStatus(cst, "异常取消"); TaskProcess.OperateStatus(cst, 7); mst.N_B_STATE = 3; WMSHelper.UpdateTaskState(mst); break; case 8: WCSHelper.UpdateStatus(cst, "强制完成"); WCSHelper.End(cst); break; } // 添加WCS动作记录 WCSHelper.AddActionRecord(model.taskNo, model.status, model.deviceNo, model.loc); if (model.status == 2 || model.status == 8) { if (mst != null) { if(mst.N_B_STATE != 2) { // 创建下个任务 if (cst.S_TYPE.Contains("出库") && !cst.S_TYPE.Contains("母拖") && !cst.S_TYPE.Contains("人工")) { WCSCore.createLastTask(cst.S_END_LOC, mst, 2); } } } } } } } return responseResult; } /// /// 读码反馈 /// /// /// public static ReturnResult readCodeFeedback(ReadCodeFeedbackModel model) { ReturnResult responseResult = new ReturnResult(); var locCntrRels = LocationHelper.GetLocCntr(model.locCode); if (locCntrRels.Count > 0) { foreach (var locCntr in locCntrRels) { var container = ContainerHelper.GetCntr(locCntr.S_CNTR_CODE); if (container != null && container.N_TYPE != 0) { var mst = WMSHelper.GetWmsTaskByCntr(locCntr.S_CNTR_CODE); if (mst != null) { int actType = 1; if (locCntr.S_CNTR_CODE == model.trayCode) { if (mst.S_END_LOC == "虚拟货位") { // 获取入库终点 var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, model.locCode, 1); if (endLoc != null) { mst.S_END_LOC = endLoc.S_CODE; mst.S_END_AREA = endLoc.S_AREA_CODE; } else { LogHelper.Info("【WCS读码反馈】,没有获取到终点货位,可能立库没有空余货位", "WMS"); responseResult.ResultCode = 1; responseResult.ResultMsg = "没有获取到终点货位,可能立库没有空余货位"; return responseResult; } } } else { LogHelper.Info($"【WCS读码反馈】,托盘码匹配失败,反馈托盘码:{model.trayCode} ,货位{model.locCode}托盘码:{locCntr.S_CNTR_CODE}", "WMS"); // 获取入库终点 var endLoc = WMSHelper.getErrorBufferAreaLoc(); if (endLoc != null) { actType = 2; LocationHelper.UnLockLoc(mst.S_END_LOC); mst.S_END_LOC = endLoc.S_CODE; mst.S_END_AREA = endLoc.S_AREA_CODE; } else { LogHelper.Info("【WCS读码反馈】,没有获取到缓存货位", "WMS"); responseResult.ResultCode = 1; responseResult.ResultMsg = "没有获取到缓存货位"; return responseResult; } } // 创建下个任务 if (mst.S_END_LOC != "虚拟货位") { WMSHelper.UpdateTaskEnd(mst); WCSCore.createLastTask(model.locCode, mst, actType); } } else { LogHelper.Info($"【WCS读码反馈】,容器:{model.trayCode}没有查询到执行中任务", "WMS"); } } } } return responseResult; } /// /// 同步物料信息 /// /// /// public static ReturnResult synMatlInformation(List matls) { ReturnResult responseResult = new ReturnResult(); List itemBarcodeInfos = new List(); CultureInfo enGB = new CultureInfo("en-GB"); foreach (MatlInformation matl in matls) { ItemBarcodeInfo itemBarcodeInfo = new ItemBarcodeInfo() { S_ITEM = matl.item, S_BC_ENTRIED = matl.bc_entried, S_MCN = matl.mcn, S_OPR = matl.opr, TXNDATE = DateTime.Parse(matl.txndate, enGB) , S_SHIFT = matl.shift, N_QTY = matl.qty, N_STOCK = matl.stock, S_LOKASI = matl.lokasi, S_SARANA = matl.sarana, BOM1 = matl.bom1, BOM2 = matl.bom2, BOM3 = matl.bom3, S_FOVRAGE = matl.fovrage, S_JDGE = matl.jdge, LAST_MODIFY_TIME = matl.last_modify_time }; itemBarcodeInfos.Add(itemBarcodeInfo); } var bo = WMSHelper.batchAddItemBarcodeInfo(itemBarcodeInfos); if (!bo) { responseResult.ResultCode = 1; responseResult.ResultMsg = "同步物料条码信息失败"; } return responseResult; } /// /// 同步物料状态信息 /// /// /// public static ReturnResult synUpdateMatlStatus(List updateMatlStatuses) { ReturnResult responseResult = new ReturnResult(); var bo = WMSHelper.batchUpdateItemStatus(updateMatlStatuses); if (!bo) { responseResult.ResultCode = 1; responseResult.ResultMsg = "同步物料状态信息失败"; } return responseResult; } /// /// 同步更新物料存放时间配置信息 /// /// /// public static ReturnResult synUpdateMatlTimeConfig(List overages) { ReturnResult responseResult = new ReturnResult(); if (overages != null && overages.Count > 0) { List overageList = new List(); foreach (var item in overages) { Overage overage = new Overage { MCNGRP = item.mcngrp, ITEMPATT = item.itempatt, OVERAGE = item.overage, MINHOUR = float.Parse(item.minhour.ToString()), FLAG_STS = item.flag_sts, RECID = item.recid, }; overageList.Add(overage); } var bo = WMSHelper.batchUpdateMatlTimeConfig(overageList); if (!bo) { responseResult.ResultCode = 1; responseResult.ResultMsg = "同步物料状态信息失败"; } } return responseResult; } /// /// 记录数据同步时间 /// /// /// public static ReturnResult recordDataSynTime(RecordDataSynTimeModel model) { ReturnResult responseResult = new ReturnResult(); SynDataTimeRecord record = new SynDataTimeRecord() { S_SYN_TIME = model.sysTime, N_SYN_NUM = model.synNum, RECORD_TABLE = model.recordTable }; var bo = WMSHelper.addSynDataTimeReord(record); if (!bo) { responseResult.ResultCode = 1; responseResult.ResultMsg = "记录数据同步时间失败"; } return responseResult; } /// /// 查询上一次的数据同步时间 /// /// /// public static ReturnResult findLastDataSynTime(string recordTable) { ReturnResult responseResult = new ReturnResult(); var synDataTime = WMSHelper.getLastDataSynTime(recordTable); if (synDataTime != null) { Dictionary map = new Dictionary(); map.Add("S_SYN_TIME", synDataTime.S_SYN_TIME); map.Add("RECORD_TABLE", synDataTime.RECORD_TABLE); responseResult.data = map; } return responseResult; } /// /// 查询班次 /// /// /// public static string getShift(TimeSpan time) { TimeSpan shiftI_Start = new TimeSpan(07, 00, 0); // 07:00:00 TimeSpan shiftI_End = new TimeSpan(14, 59, 59); // 14:59:59 TimeSpan shiftII_Start = new TimeSpan(15, 00, 0); // 15:00:00 TimeSpan shiftII_End = new TimeSpan(22, 59, 59); // 22:59:59 TimeSpan shiftIII_Start = new TimeSpan(23, 00, 0); // 23:00:00 TimeSpan shiftIII_End = new TimeSpan(06, 59, 59); // 06:59:59 // 判断是否在 Shift III(跨天需特殊处理) bool isShiftIII = time >= shiftIII_Start || time <= shiftIII_End; // 返回结果 if (time >= shiftI_Start && time <= shiftI_End) return "I"; else if (time >= shiftII_Start && time <= shiftII_End) return "II"; else if (isShiftIII) return "III"; else return "No shift"; // 理论上不会触发 } /// /// 任务状态反馈模型 /// public class TaskStatusFeedbackModel { public string taskNo { get; set; } // 任务号 public string subTaskNo { get; set; } // 子任务号 public int status { get; set; } // 任务状态 1:开始/执行中;2:完成;3:准备取货;4:取货完成;5:准备卸货;6:卸货完成;7:异常取消;8:强制完成 public string deviceNo { get; set; } // 设备号 public string errCode { get; set; } // 异常代码 0.无异常 1.设备故障码、2.rfid校验失败、3.取货无货、4.放货有货 public string loc { get; set; } // 当前货位 } /// /// 读码反馈模型 /// public class ReadCodeFeedbackModel { public string trayCode { get; set; } // 容器号 public string locCode { get; set; } // 当前货位 } public class BaseTrayOutInStockModel { public string locCode { get; set; } // 货位编码 public string taskNo { get; set; } // 任务号 public string taskType { get; set; } // 任务类型 1.入库 2.出库 } public class CreateOutOrderModel { public string taskNo { get; set; } // 任务号 public string trayCode { get; set; } // 任务号 public string itemCode { get; set; } // 物料编码 public string endLoc { get; set; } // 终点货位 public int priority { get; set; } = 0; // 优先级 默认0 } public class EmptyTrayOutOrderModel { public string taskNo { get; set; } // 任务号 public int trayType { get; set; } // 托盘类型 public string endLoc { get; set; } // 终点货位 public int priority { get; set; } = 0; // 优先级 默认0 } public class CreateInOrderModel { public string taskNo { get; set; } // 任务号 public string startLoc { get; set; } // 起点货位 public string taskType { get; set; } // 任务类型 入库回库类型,1:机台半制品入库,2:成型机余料回库,3:成型机空托回库 public string trayCode { get; set; } // 托盘号 public int priority { get; set; } = 0;// 优先级 默认传0 public List itemInfo { get; set; } } public class GTItemInfo { public string item { get; set; } // 物品代码 public string bc_entried { get; set; } // 条形码编号 public string mcn { get; set; } // 机器代码编号 public string opr { get; set; } // 操作员 public string txndate { get; set; } // 生产时间 public string shift { get; set; } // 工作班次 public int qty { get; set; } // 产品数量 public string sarana { get; set; } // 产品材料的托盘/盒/推车/货车ID public string fovrage { get; set; } // 是否过期的状态 Y=过期,N=未过期 public string jdge { get; set; } // 质量状态 OK=产品合格,NG=产品不合格,HLM=产品待定 public string effective_time { get; set; } // 生效时间 (yyyy-MM-dd HH:mm:ss) public string expiration_time { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss) } public class CodeInfo { /// /// 生产订单内码 /// public string FInterID { get; set; } /// /// 生产订单编号 /// public string FSourceNo { get; set; } /// /// 批号 /// public string FGMPBatchNo { get; set; } public string FState { get; set; } /// /// 物料编码(内码就是编码) /// public string Fitemid_XK { get; set; } /// /// 分录id /// public string Fentryid { get; set; } } public class NoteInfo : CodeInfo { public string WmsBillNo { get; set; } } } }