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.

793 lines
46 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 Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
/// <summary>
/// 五楼CTU调度
/// </summary>
public class FiveFloorCTU
{
List<BasePlcpoint> ScanPoint { get; set; }//点位信息
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint isarrive;
private readonly BasePlcpoint isput;
private readonly BasePlcpoint canReceive;
private readonly BasePlcpoint ReceiveMaterial;
private readonly BasePlcpoint CtuLineWaring;
int FloorNo { get; set; }
int CTUID = 11;
public FiveFloorCTU(IHost host, Plc.S7.Plc plc, int floor)
{
this._host = host;
FloorNo = floor;
this.LineRFID = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID5001");
this.isarrive = StaticData.BasePlcpointList.First(t => t.plcpointNo == "isarrive");
this.isput = StaticData.BasePlcpointList.First(t => t.plcpointNo == "isput");
this.canReceive = StaticData.BasePlcpointList.First(t => t.plcpointNo == "canReceive");
this.ReceiveMaterial = StaticData.BasePlcpointList.First(t => t.plcpointNo == "ReceiveMaterial");
this.CtuLineWaring = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTULineWaring");
}
/// <summary>
/// 启动上件扫描监听
/// </summary>
public void StartPoint()
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start();
Thread FlowCTUInWareThread = new Thread(MonitorInWare);
FlowCTUInWareThread.Start();
Thread HeartThread = new Thread(HeartLogic);
HeartThread.Start();
Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动");
LogManager.Info("五楼CTU上件扫描监听启动");
}
private void HeartLogic(object? obj)
{
BasePlcpoint heartPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart");
bool flag = true;
while (true)
{
try
{
flag = !flag;
StaticData.PlcDic[1].WriteToPoint(heartPoint.plcpointAddress, flag.ToString(), heartPoint.plcpointLength.ToString());
}
catch
{
try
{
StaticData.PlcDic[1] = new Plc.S7.Plc(StaticData.PlcDic[1].CPU, StaticData.PlcDic[1].IP, StaticData.PlcDic[1].Port, StaticData.PlcDic[1].Rack, StaticData.PlcDic[1].Slot);
StaticData.PlcDic[1].Open();
}
catch
{
}
}
Thread.Sleep(1000);
}
}
private void MonitorInWare(object? obj)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
//bool IsStart = false;
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var rfid = StaticData.PlcDic[1].ReadRFID(LineRFID.plcpointAddress);
var isArrive = StaticData.PlcDic[1].Read(isarrive.plcpointAddress);
var receiveMaterial = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress);
var waring = StaticData.PlcDic[1].Read(CtuLineWaring.plcpointAddress);
if (rfid != null && isArrive != null && receiveMaterial != null && Convert.ToInt32(receiveMaterial) == 1 && Convert.ToInt32(isArrive) == 1)
{
if (Convert.ToBoolean(waring))
{
StaticData.PlcDic[1].WriteToPoint(CtuLineWaring.plcpointAddress, "false", CtuLineWaring.plcpointLength.ToString());
}
rfid = rfid[rfid.IndexOf('C')..];
WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid);
if (task == null)
{
//根据rfid找到库位
//生成入库任务
var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid);
if (wmsBaseLocation != null)
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
if (wmsBaseLocation != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
nextPointId = ctuEquip.objid,
nextPointNo = ctuEquip.equipNo,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.agvPositionCode,
taskType = 29,
taskStatus = 0,
useFlag = 1,
floorNo = 5,
containerNo = rfid.ToString(),
equipmentNo = baseEquip.equipNo,
createBy = FloorNo + "楼CTU",
createTime = DateTime.Now,
};
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
wmsBaseLocation.updateTime = DateTime.Now;
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
else
{
if (task.taskType == 30)
{
dbContext.WcsTask.Where(t => t.objid == task.objid).Delete();
//根据rfid找到库位
//生成入库任务
var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid);
if (wmsBaseLocation != null)
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
if (wmsBaseLocation != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
nextPointId = ctuEquip.objid,
useFlag = 1,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.agvPositionCode,
taskType = 29,
taskStatus = 0,
floorNo = 5,
containerNo = rfid.ToString(),
equipmentNo = baseEquip.equipNo,
createBy = FloorNo + "楼CTU",
createTime = DateTime.Now,
};
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
wmsBaseLocation.updateTime = DateTime.Now;
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
else if (task.taskType == 100)
{
dbContext.WcsTask.Where(t => t.objid == task.objid).Delete();
//根据rfid找到库位
//生成入库任务
var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid);
if (wmsBaseLocation != null)
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
if (wmsBaseLocation != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
nextPointId = ctuEquip.objid,
useFlag = 1,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.agvPositionCode,
taskType = 29,
taskStatus = 0,
floorNo = 5,
containerNo = rfid.ToString(),
equipmentNo = baseEquip.equipNo,
createBy = FloorNo + "楼CTU",
createTime = DateTime.Now,
};
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
wmsBaseLocation.updateTime = DateTime.Now;
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
}
}
else if (Convert.ToInt32(receiveMaterial) == 1 && Convert.ToInt32(isArrive) == 1 && string.IsNullOrEmpty(rfid))
{
if (!Convert.ToBoolean(waring))
{
StaticData.PlcDic[1].WriteToPoint(CtuLineWaring.plcpointAddress, "true", CtuLineWaring.plcpointLength.ToString());
}
}
else if (receiveMaterial != null && Convert.ToInt32(receiveMaterial) == 1)
{
//Task.Run(() =>
//{
// var receiveMaterial2 = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress);
// while (receiveMaterial2 != null && Convert.ToInt32(receiveMaterial2) == 1)
// {
// receiveMaterial2 = StaticData.PlcDic[1].Read(ReceiveMaterial.plcpointAddress);
// lock (SystemData.outStockLock)
// {
// WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
// bool haveTask = dbContext.WcsTask.Where(t => t.nextPointId == 11).Any();
// if (!haveTask && wcsOutstockLock.boxStatus == 1)
// {
// wcsOutstockLock.boxStatus = 0;
// wcsOutstockLock.qty = 0;
// dbContext.Update(wcsOutstockLock);
// dbContext.SaveChanges();
// }
// }
// Thread.Sleep(3000);
// }
//});
}
}
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);
}
Thread.Sleep(1000);
}
}
/// <summary>
/// 预执行任务下发
/// </summary>
//private void CtuWaitLogic()
//{
// BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID);
// BaseEquip Fl051 = StaticData.BaseEquip.First(t => t.objid == 19);//入库输送线
// while (true)
// {
// try
// {
// while (isWait)
// {
// var waitTask = new
// {
// reqCode = StaticData.SnowId.NextId().ToString(),
// positionCode = "CTU_IN",
// nextTask = 1200
// };
// string waitMessage = JsonConvert.SerializeObject(waitTask);
// string waitResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", waitMessage);
// var waitReponse = JsonConvert.DeserializeObject<ReponseMessage>(waitResult);
// if (waitReponse != null && waitReponse.code == "0")
// {
// isSendWait = true;
// }
// else
// {
// LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
// }
// Thread.Sleep(1000 * 60 * 10);//每10分钟重新下发预执行任务
// }
// isSendWait = false;
// }
// catch (Exception ex)
// {
// LogManager.Error(ex);
// }
// Thread.Sleep(3000);
// }
//}
private bool CtuWaitLogic()
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID);
BaseEquip Fl051 = StaticData.BaseEquip.First(t => t.objid == 19);//入库输送线
try
{
var waitTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCode = "CTU_IN",
nextTask = 120
};
string waitMessage = JsonConvert.SerializeObject(waitTask);
string waitResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", waitMessage);
var waitReponse = JsonConvert.DeserializeObject<ReponseMessage>(waitResult);
if (waitReponse != null && waitReponse.code == "0")
{
return true;
}
else
{
LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
}
}
catch (Exception ex)
{
LogManager.Error(ex);
return false;
}
return false;
}
/// <summary>
/// 监控上件扫描点位
/// </summary>
public void MonitorInLocatorPoint()
{
List<int?> taskType = new() { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var taskList = dbContext.WcsTask
.Where(t => t.useFlag == 1)
.Where(t => t.nextPointId == CTUID).OrderByDescending(t => t.ud1).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼CTU无任务");
}
foreach (var item in taskList)
{
if (item.taskStatus == 0)//CTU会同时生成多个任务生成就下发
{
if (item.taskType == 30)//出库任务
{
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId);
var 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 + "楼CTU",
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
taskCode = null
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new()
{
positionCode = wcsCmd.currPointNo,
type = "05"//05库位
},
new()
{
positionCode = wcsCmd.nextPointNo,
type = "00"//设备
},
},
ctnrTyp = "1",
taskTyp = "F504"
};
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.code == "0")
{
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.WcsCmd.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU下发出库任务失败" + reponseMessage?.message);
}
}
else if (item.taskType == 29)//入库任务
{
bool haveOut = taskList.Where(t => t.taskType == 30).Where(t => t.taskStatus != 6).Any();
if (!haveOut && CtuWaitLogic())
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
var 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 + "楼CTU",
nextPointId = wmsBaseLocation.locationId,
nextPointNo = wmsBaseLocation.agvPositionCode,
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
};
var agvTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new()
{
positionCode = wcsCmd.currPointNo,
type = "05"//设备
},
new()
{
positionCode = wcsCmd.nextPointNo,
type = "05"//库位
},
},
ctnrTyp = "1",
taskTyp = "F503"
};
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.code == "0")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Update(item);
dbContext.Add(wcsCmd);
int ctuTaskCount = dbContext.WcsTask.Where(t => t.taskType == 29).Count();
lock (SystemData.outStockLock)
{
WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
if (ctuTaskCount >= 6 || wcsOutstockLock.qty == ctuTaskCount)//如果CTU当前任务数量很多取消预执行任务
{
ExecuteInTask(baseEquip);
wcsOutstockLock.qty = 0;
wcsOutstockLock.boxStatus = 0;
dbContext.Update(wcsOutstockLock);
//isWait = false;
}
}
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU下发入库任务失败" + reponseMessage?.message);
}
}
}
else if (item.taskType == 100)//盘库
{
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId);
var 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 + "楼CTU",
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
taskCode = null
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new()
{
positionCode = wcsCmd.currPointNo,
type = "05"
},
new()
{
positionCode = wcsCmd.nextPointNo,
type = "00"
},
},
ctnrTyp = "1",
taskTyp = "F504"
};
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.code == "0")
{
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.WcsCmd.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU下发出库任务失败" + reponseMessage?.message);
}
}
}
else
{
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid);
if (wcsCmd != null)
{
if (wcsCmd.cmdStatus == 3)
{
if (item.taskType == 30 || item.taskType == 100)
{
var canOut = StaticData.PlcDic[1].Read(isput.plcpointAddress);
if (canOut != null && Convert.ToInt64(canOut) == 0)
{
var agvTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode,
type = 2
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":五楼CTU线程继续任务" + item.currPointId + "," + item.endPointNo);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 });
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
{
LogManager.Info("CTU第一次下发继续任务失败" + reponseMessage?.message);
}
}
}
if (item.taskType == 29)
{
var agvTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode,
type = 1
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼CTU线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":五楼CTU线程下发任务" + item.currPointId + "," + item.endPointNo);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 });
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
{
LogManager.Info("CTU第二次下发继续任务失败" + reponseMessage?.message);
}
}
}
else if (wcsCmd.cmdStatus == 5)
{
LogManager.Info("五楼CTU线程完成任务" + wcsCmd.objid);
Console.WriteLine(DateTime.Now + ":五楼CTU线程完成任务" + wcsCmd.objid);
if (item.taskType == 30)//出库任务
{
WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.taskCode == item.objid.ToString());
if (wmsRawOutstockDetail != null)
{
wmsRawOutstockDetail.executeStatus = "2";
wmsRawOutstockDetail.updateDate = DateTime.Now;
dbContext.Update(wmsRawOutstockDetail);
}
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.currPointId && t.warehouseFloor == 5);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.WmsRawOutstockDetail.Where(t => t.locationCode == wmsBaseLocation.locationCode).Update(t => new WmsRawOutstockDetail { executeStatus = "2" });
dbContext.Remove(wcsCmd);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 });
dbContext.SaveChanges();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
int wcsTaskCount = dbContext.WcsTask.Where(t => t.taskType == 30 && t.taskStatus != 6).Count();
if (wcsTaskCount == 0)
{
StaticData.PlcDic[1].WriteToPoint(this.canReceive.plcpointAddress, "1", this.canReceive.plcpointLength?.ToString());
}
}
else if (item.taskType == 29)//入库任务
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.endPointId && t.warehouseFloor == 5);
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.ContainerStatus = "1";
dbContext.Update(wmsBaseLocation);
dbContext.Remove(wcsCmd);
dbContext.Remove(item);
dbContext.SaveChanges();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
lock (SystemData.outStockLock)
{
WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
wcsOutstockLock.qty = 0;
wcsOutstockLock.boxStatus = 0;
dbContext.Update(wcsOutstockLock);
dbContext.SaveChanges();
}
}
else if (item.taskType == 100)//出库任务
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.currPointId && t.warehouseFloor == 5);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Remove(wcsCmd);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 });
dbContext.SaveChanges();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
int wcsTaskCount = dbContext.WcsTask.Where(t => (t.taskType == 30 || t.taskType == 100) && t.taskStatus != 6).Count();
if (wcsTaskCount == 0)
{
StaticData.PlcDic[1].WriteToPoint(this.canReceive.plcpointAddress, "1", this.canReceive.plcpointLength?.ToString());
}
}
}
}
}
}
}
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);
}
}
}
/// <summary>
/// 通知CTU取消预执行任务
/// </summary>
/// <param name="baseEquip"></param>
/// <param name="wcsCmd"></param>
private void ExecuteInTask(BaseEquip baseEquip)
{
//while (isWait)
{
var executeTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCode = "CTU_IN",
nextTask = -1
};
string executeMessage = JsonConvert.SerializeObject(executeTask);
string executeResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", executeMessage);
var executeReponse = JsonConvert.DeserializeObject<ReponseMessage>(executeResult);
if (executeReponse != null && executeReponse.code == "0")
{
LogManager.Info("下发CTU执行入库任务成功");
}
else
{
LogManager.Info("下发CTU执行入库任务失败");
Console.WriteLine($"{DateTime.Now}:下发CTU执行入库任务失败" + executeReponse?.message);
ExecuteInTask(baseEquip);
Thread.Sleep(1000);
}
}
}
}
}