using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library.Mapper; using Khd.Core.Wcs.Global; using Masuit.Tools; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 五楼AGV调度 /// public class FiveFloorAGV { private readonly IHost _host; private readonly Plc.S7.Plc _plc; private readonly BasePlcpoint LineSignal; int FloorNo { get; set; } int agvID = 28; public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor) { this._host = host; this._plc = plc; FloorNo = floor; this.LineSignal = StaticData.BasePlcpointList.First(t => t.plcpointNo == "linesignal05"); } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread FlowPointThread = new(MonitorInLocatorPoint); FlowPointThread.Start(); Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功"); LogManager.Info("五楼AGV上件扫描监听启动成功"); } public void MonitorInLocatorPoint() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List taskType = new() { 1, 3, 5, 7 }; BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == agvID); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var taskList = dbContext.WcsTask .Where(t => t.useFlag == 1) .Where(t => t.nextPointId == agvID).OrderBy(t => t.createTime).ToList(); foreach (var item in taskList) { if (taskList.Where(t => t.taskStatus > 0).Where(t => t.objid != item.objid).Any()) { LogManager.Info($"5楼AGV线程:有其他任务正在执行,跳过当前任务{item.objid}"); continue; } if (item.taskStatus == 0)//下发任务 { BaseDictionary baseDictionary = StaticData.BaseDictionary.First(t => t.objid == item.taskType); if (item.taskType == 38)//出库任务 { BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 5); bool canSend = dbContext.WcsTask.Where(t => t.nextPointId == lineEquip.objid && t.taskStatus > 0).Any(); if (lineEquip.equipStatus == 1) { LogManager.Info("五楼AGV:接驳位有任务,无法下发出库任务"); continue; } if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1 && !canSend) { Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货,无法下发Agv出库任务"); continue; } WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = item.endPointId, nextPointNo = nextEquip.agvPositionCode, }; RequestAGVTaskDto agvTask = new() { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; lineEquip.equipStatus = 1; dbContext.Update(lineEquip); dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 33)//原材料到背板安装 { BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 30); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = endEquip.objid, nextPointNo = endEquip.agvPositionCode, }; RequestAGVTaskDto agvTask = new() { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 34)//背板安装到半成品 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 30); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = currentEquip.agvPositionCode, nextPointId = item.endPointId, nextPointNo = wmsBaseLocation.agvPositionCode, }; var agvTask = new RequestAGVTaskDto { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2", }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 46)//原材料到拆分区 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 29); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = wmsBaseLocation.agvPositionCode, nextPointId = 29, nextPointNo = currentEquip.agvPositionCode, }; RequestAGVTaskDto agvTask = new() { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 28)//拆分区返库 { BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 29); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = currentEquip.agvPositionCode, nextPointId = item.endPointId, nextPointNo = wmsBaseLocation.agvPositionCode, }; RequestAGVTaskDto agvTask = new() { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new() { positionCode = wcsCmd.currPointNo, type = "00" }, new() { positionCode = wcsCmd.nextPointNo, type = "00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2" }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 47)//原材料入库 { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 5); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); WcsCmd wcsCmd = new WcsCmd { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = startEquip.objid, currPointNo = startEquip.agvPositionCode, nextPointId = item.endPointId, nextPointNo = wmsBaseLocation.agvPositionCode, }; var agvTask = new RequestAGVTaskDto { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2", }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } else if (item.taskType == 66)//移库 { WmsBaseLocation fromBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); WmsBaseLocation toBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); WcsCmd wcsCmd = new() { objid = StaticData.SnowId.NextId(), cmdStatus = 0, taskId = item.objid, useFlag = 1, cmdType = item.taskType, containerNo = item.containerNo, createTime = DateTime.Now, createBy = FloorNo + "楼AGV", currPointId = item.currPointId, currPointNo = fromBaseLocation.agvPositionCode, nextPointId = item.endPointId, nextPointNo = toBaseLocation.agvPositionCode, }; var agvTask = new RequestAGVTaskDto { reqCode = wcsCmd.objid.ToString(), positionCodePath = new List { new () { positionCode=wcsCmd.currPointNo, type="00" }, new () { positionCode=wcsCmd.nextPointNo, type="00" } }, taskTyp = baseDictionary.dicValue, ctnrTyp = "2", }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message); var reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发任务成功:" + message); wcsCmd.taskCode = reponseMessage.data; wcsCmd.cmdStatus = 1; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); WcsCmdLog wcsCmdLog = CoreMapper.Map(wcsCmd); dbContext.Add(wcsCmdLog); dbContext.Add(wcsCmd); dbContext.SaveChanges(); } else { LogManager.Info("五楼Agv下发任务失败" + item.taskType + message); } } } else { WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid); if (wcsCmd != null) { if (wcsCmd.cmdStatus == 3) { if (item.currPointId == 5) { var lineSignalValue = this._plc.Read(LineSignal.plcpointAddress); if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 0) { Console.WriteLine(DateTime.Now + ":五楼Agv:接驳位为空,无法取货"); LogManager.Info("五楼Agv:接驳位为空,无法取货"); continue; } } else if (item.endPointId == 5) { var lineSignalValue = this._plc.Read(LineSignal.plcpointAddress); if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 1) { Console.WriteLine(DateTime.Now + ":五楼Agv:接驳位有货,无法送货"); LogManager.Info("五楼Agv:接驳位有货,无法送货"); continue; } } var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = wcsCmd.taskCode }; string message = JsonConvert.SerializeObject(agvTask); string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/continueTask", message); ReponseMessage? reponseMessage = JsonConvert.DeserializeObject(result); if (reponseMessage != null && reponseMessage.message == "成功") { LogManager.Info("五楼Agv下发继续任务成功:" + message); wcsCmd.cmdStatus = 4; dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 }); dbContext.Update(wcsCmd); dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 }); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 }); dbContext.SaveChanges(); } } else if (wcsCmd.cmdStatus == 5) { LogManager.Info("五楼叉车线程完成任务" + wcsCmd.objid); Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo); LogManager.Info("五楼Agv完成任务成功:" + wcsCmd.ToJsonString()); if (item.taskType == 66)//移库 { WmsBaseLocation fromBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); WmsBaseLocation toBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); fromBaseLocation.outstockFlag = "0"; fromBaseLocation.locationStatus = "1"; fromBaseLocation.containerCode = null; fromBaseLocation.updateTime = DateTime.Now; toBaseLocation.instockFlag = "0"; toBaseLocation.locationStatus = "1"; toBaseLocation.containerCode = item.containerNo; toBaseLocation.updateTime = DateTime.Now; var wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == fromBaseLocation.locationCode).FirstOrDefault(); if (wmsRawStock != null) { wmsRawStock.locationCode = toBaseLocation.locationCode; dbContext.Update(wmsRawStock); } else { var wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode); if (wmsProductStock != null) { wmsProductStock.locationCode = toBaseLocation.locationCode; dbContext.Update(wmsProductStock); } } dbContext.Remove(wcsCmd); dbContext.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 6 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 }); dbContext.Update(fromBaseLocation); dbContext.Update(toBaseLocation); dbContext.SaveChanges(); } else if (item.taskType == 38)//出库 { var wmsProductOutstockDetails = dbContext.WmsProductOutstockDetail.Where(t => t.productOutstockId == item.orderId); var wmsProductOutstockDetail = wmsProductOutstockDetails.FirstOrDefault(t => t.executeStatus == "1" && t.locationCode == item.currPointNo); var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.productOutstockId == item.orderId); if (wmsProductOutstockDetail != null && wmsProductOutstock != null) { wmsProductOutstockDetail.executeStatus = "2"; dbContext.Update(wmsProductOutstockDetail); if (!wmsProductOutstockDetails.Any(t => t.executeStatus != "2")) { wmsProductOutstock.executeStatus = "2"; dbContext.Update(wmsProductOutstock); } BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 5); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation .First(t => t.locationId == item.endPointId && t.warehouseFloor == 5); wmsBaseLocation.outstockFlag = "0"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = ""; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; dbContext.Update(wmsBaseLocation); dbContext.WmsProductStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete(); BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5); WcsTask newTask = CoreMapper.Map(item); newTask.createTime = DateTime.Now; newTask.nextPointId = floorLineEquip.objid; newTask.nextPointNo = floorLineEquip.equipNo; newTask.fromFloorNo = 5; newTask.floorNo = 1; newTask.taskStatus = 6; newTask.objid = StaticData.SnowId.NextId(); lineEquip.equipStatus = 0; dbContext.Update(lineEquip); dbContext.Add(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(wcsTaskLog); dbContext.Remove(item); dbContext.WcsCmd.Remove(wcsCmd); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6, nextPointId = floorLineEquip.objid, nextPointNo = floorLineEquip.equipNo, fromFloorNo = 5, floorNo = 1 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } } else if (item.taskType == 33)//原材料到背板安装 { WmsRawOutstock? wmsRawOutstock = dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); if (wmsRawOutstock != null) { WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.Where(t => t.rawOutstockId == wmsRawOutstock.rawOutstockId && t.executeStatus == "1").FirstOrDefault(); if (wmsRawOutstockDetail != null) { wmsRawOutstockDetail.executeStatus = "2"; wmsRawOutstock.executeStatus = "2"; WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.outstockFlag = "0"; wmsBaseLocation.containerCode = ""; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; dbContext.Update(wmsRawOutstock); dbContext.Update(wmsRawOutstockDetail); dbContext.Update(wmsBaseLocation); dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete(); dbContext.WcsCmd.Remove(wcsCmd); dbContext.WcsTask.Remove(item); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } } } else if (item.taskType == 34)//半成品入库 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.instockFlag = "0"; wmsBaseLocation.containerCode = item.containerNo; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; var mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == item.containerNo).FirstOrDefault(); var wmsProductInstock = dbContext.WmsProductInstock .Where(t => t.palletInfoCode == item.containerNo) .Where(t => t.executeStatus == "1" && t.productType == "2" && t.warehouseFloor == 5) .FirstOrDefault(); if (mesBasePalletInfo != null && wmsProductInstock != null) { WmsProductInstockDetail? wmsProductInstockDetail = dbContext.WmsProductInstockDetail.Where(t => t.productInstockId == wmsProductInstock.productInstockId).FirstOrDefault(); if (wmsProductInstockDetail != null) { wmsProductInstock.executeStatus = "2"; dbContext.Update(wmsProductInstock); WmsProductStock wmsProductStock = new WmsProductStock() { productId = wmsProductInstock.productId, activeFlag = "1", updateBy = "WCS", updateDate = DateTime.Now, saleorderCode = wmsProductInstock.saleorderCode, saleOrderId = wmsProductInstock.SaleOrderId, stockType = "2", productStockId = wmsProductInstock.productInstockId, qualityStatus = "0", createBy = "WCS", createDate = DateTime.Now, locationCode = wmsBaseLocation.locationCode, warehouseFloor = 5, totalAmount = 1, instockDate = DateTime.Now, productBatch = mesBasePalletInfo.materialBarcode, palletInfoCode = mesBasePalletInfo.palletInfoCode, frozenAmount = 0, occupyAmount = 0, planCode = wmsProductInstock.planCode, planDetailCode = wmsProductInstock.planDetailCode, warehouseId = 512 }; BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); wmsProductInstockDetail.executeStatus = "2"; startEquip.emptyCount = 0; dbContext.Update(wmsProductInstockDetail); dbContext.Update(startEquip); dbContext.Add(wmsProductStock); dbContext.Update(wmsBaseLocation); dbContext.WcsCmd.Remove(wcsCmd); dbContext.WcsTask.Remove(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); dbContext.SaveChanges(); } } } else if (item.taskType == 46)//该任务结束后,立刻生成一个新的返库任务,但是是否使用标志未0,等待mes通知 { var wmsRawOutStock = dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.Where(t => t.rawOutstockId == item.orderId).FirstOrDefault(); if (wmsRawOutStock != null && wmsRawOutstockDetail != null) { wmsRawOutstockDetail.executeStatus = "2"; wmsRawOutStock.executeStatus = "2"; dbContext.Update(wmsRawOutStock); dbContext.Update(wmsRawOutstockDetail); WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId); wmsBaseLocation.outstockFlag = "0"; wmsBaseLocation.instockFlag = "1"; wmsBaseLocation.locationStatus = "2"; wmsBaseLocation.containerCode = null; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; WmsRawStock? wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).FirstOrDefault(); if (wmsRawStock != null) { wmsRawStock.completeFlag = "0"; wmsRawStock.updateDate = DateTime.Now; wmsRawStock.updateBy = "WCS"; dbContext.Update(wmsRawStock); dbContext.Update(wmsBaseLocation); if (wmsBaseLocation.locDeep == 1) { int? locRow = 0; if (wmsBaseLocation.locRow % 2 == 1) { locRow = wmsBaseLocation.locRow + 1; } else { locRow = wmsBaseLocation.locRow - 1; } WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) .Where(t => t.locColumn == wmsBaseLocation.locColumn) .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) .FirstOrDefault(); if (deepWmsLocation != null) { deepWmsLocation.instockFlag = "1"; deepWmsLocation.locationStatus = "2"; dbContext.Update(deepWmsLocation); } } WcsTask newTask = CoreMapper.Map(item); newTask.objid = StaticData.SnowId.NextId(); var currPointId = item.currPointId; var currPointNo = item.currPointNo; newTask.currPointId = item.endPointId; newTask.currPointNo = item.endPointNo; newTask.endPointId = item.currPointId; newTask.endPointNo = item.currPointNo; newTask.createTime = DateTime.Now; newTask.taskType = 28; newTask.taskStatus = 0; newTask.useFlag = 0; dbContext.Remove(item); dbContext.Remove(wcsCmd); WcsTaskLog wcsTaskLog = CoreMapper.Map(newTask); dbContext.Add(newTask); dbContext.Add(wcsTaskLog); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } } } else if (item.taskType == 28)//柜体拆分到原材料 { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.instockFlag = "0"; wmsBaseLocation.containerCode = item.containerNo; wmsBaseLocation.updateTime = DateTime.Now; wmsBaseLocation.updateBy = "WCS"; wmsBaseLocation.returnFlag = "1"; var wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode); if (wmsRawStock != null) { wmsRawStock.completeFlag = "0"; wmsRawStock.updateDate = DateTime.Now; wmsRawStock.updateBy = "WCS"; BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); startEquip.emptyCount = 0; dbContext.Update(startEquip); dbContext.Update(wmsRawStock); dbContext.Update(wmsBaseLocation); if (wmsBaseLocation.locDeep == 1) { int? locRow = 0; if (wmsBaseLocation.locRow % 2 == 1) { locRow = wmsBaseLocation.locRow + 1; } else { locRow = wmsBaseLocation.locRow - 1; } WmsBaseLocation? deepWmsLocation = dbContext.WmsBaseLocation.Where(t => t.locRow == locRow) .Where(t => t.locColumn == wmsBaseLocation.locColumn) .Where(t => t.warehouseId == wmsBaseLocation.warehouseId) .FirstOrDefault(); if (deepWmsLocation != null) { deepWmsLocation.instockFlag = "0"; deepWmsLocation.locationStatus = "1"; dbContext.Update(deepWmsLocation); } } dbContext.Remove(item); dbContext.Remove(wcsCmd); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); } } else if (item.taskType == 47) { WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId); wmsBaseLocation.instockFlag = "0"; wmsBaseLocation.locationStatus = "1"; wmsBaseLocation.containerCode = item.containerNo; var mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == item.containerNo); if (mesBasePalletInfo != null) { var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode); if (mesBaseBarcodeInfo != null) { WmsRawStock wmsRawStock = new() { palletInfoCode = mesBasePalletInfo.palletInfoCode, activeFlag = "1", createBy = "WCS", createDate = DateTime.Now, frozenAmount = 0, instockDate = DateTime.Now, locationCode = wmsBaseLocation.locationCode, occupyAmount = 0, warehouseFloor = 5, stockType = "1", totalAmount = 1, saleOrderId = 0, supplierId = mesBaseBarcodeInfo.manufacturerId, materialId = mesBasePalletInfo.materialId, qualityStatus = "0", rawStockId = StaticData.SnowId.NextId(), completeFlag = "1", instockBatch = mesBaseBarcodeInfo.batchCode, updateBy = "WCS", updateDate = DateTime.Now, warehouseId = 511 }; dbContext.Add(wmsRawStock); dbContext.Add(wmsBaseLocation); dbContext.Remove(item); dbContext.Remove(wcsCmd); dbContext.SaveChanges(); dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 }); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); } } } } } } break; } } catch (Exception ex) { LogManager.Error(ex); } finally { Thread.Sleep(1000); } } } } }