You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

943 lines
64 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using System.Transactions;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
/// <summary>
/// 五楼AGV调度
/// </summary>
public class FiveFloorAGV
{
private readonly IHost _host;
private readonly BasePlcpoint LineSignal;
int FloorNo { get; set; }
int agvID = 28;
public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor)
{
this._host = host;
FloorNo = floor;
this.LineSignal = StaticData.BasePlcpointList.First(t => t.plcpointNo == "linesignal05");
}
/// <summary>
/// 启动上件扫描监听
/// </summary>
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<DefaultDbContext>();
List<int?> 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 = dbContext.BaseEquip.First(t => t.objid == 5);
if (lineEquip.equipStatus == 0)
{
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(StaticData.PlcDic[0].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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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<Position>
{
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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
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<WcsCmdLog>(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 = StaticData.PlcDic[0].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 = StaticData.PlcDic[0].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<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发继续任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv继续任务" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
wcsCmd.cmdStatus = 4;
item.taskStatus = 4;
dbContext.Update(wcsCmd);
dbContext.Update(item);
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)
{
Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + wcsCmd.currPointNo + "," + wcsCmd.nextPointNo);
LogManager.Info("五楼Agv完成任务成功" + wcsCmd.ToJsonString());
if (item.taskType == 66)//移库
{
try
{
var wmsRawStock = dbContext.WmsRawStock.Where(t => t.locationCode == item.endPointNo).FirstOrDefault();
if (wmsRawStock != null)
{
wmsRawStock.locationCode = item.endPointNo;
dbContext.Update(wmsRawStock);
}
else
{
var wmsProductStock = dbContext.WmsProductStock.FirstOrDefault(t => t.locationCode == item.currPointNo);
if (wmsProductStock != null)
{
wmsProductStock.locationCode = item.currPointNo;
dbContext.Update(wmsProductStock);
}
}
dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).Update(t => new WmsBaseLocation
{
outstockFlag = "0",
locationStatus = "1",
containerCode = null,
updateTime = DateTime.Now
});
dbContext.WmsBaseLocation.Where(t => t.locationId == item.endPointId).Update(t => new WmsBaseLocation
{
instockFlag = "0",
locationStatus = "1",
containerCode = item.containerNo,
updateTime = DateTime.Now
});
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.SaveChanges();
}
catch (Exception ex)
{
LogManager.Error(ex);
}
}
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 (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty)
{
wmsProductOutstock.endTime = DateTime.Now;
wmsProductOutstock.executeStatus = "2";
}
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.currPointId && t.warehouseFloor == 5);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = null;
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<WcsTask>(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();
dbContext.Remove(item);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.WcsCmd.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 == 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.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 == null ? 0 : 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<WcsTask>(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<WcsTaskLog>(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 = mesBaseBarcodeInfo.saleOrderId == null ? 0 : mesBaseBarcodeInfo.saleOrderId,
safeFlag = mesBaseBarcodeInfo.safeFlag,
supplierId = mesBaseBarcodeInfo.manufacturerId,
materialId = mesBasePalletInfo.materialId,
qualityStatus = "0",
rawStockId = StaticData.SnowId.NextId(),
completeFlag = "1",
instockBatch = mesBaseBarcodeInfo.barcodeInfo,
updateBy = "WCS",
updateDate = DateTime.Now,
warehouseId = 511
};
BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == 5);
lineEquip.equipStatus = 0;
dbContext.Update(lineEquip);
dbContext.Add(wmsRawStock);
dbContext.Update(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)
{
if (ex is PlcException)
{
try
{
foreach (var item in StaticData.PlcDic)
{
if (item.Value.IP == ex.Message)
{
StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot);
StaticData.PlcDic[item.Key].Open();
}
}
}
catch
{
}
}
LogManager.Error(ex);
}
finally
{
Thread.Sleep(1000);
}
}
}
}
}