using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; 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 FiveFloorBearAgv { private readonly LoggerUtils _logger = new LoggerUtils(); private readonly IHost _host; int FloorNo { get; set; } int agvID = 10; public FiveFloorBearAgv(IHost host, int floor) { this._host = host; FloorNo = floor; } /// /// 启动上件扫描监听 /// public void StartPoint() { Thread FlowPointThread = new(MonitorInLocatorPoint); FlowPointThread.IsBackground = true; FlowPointThread.Name = "FiveFloorBearAgv"; FlowPointThread.Start(); Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功"); _logger.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.IsDelete == 0 || t.IsDelete == null) .Where(t => t.nextPointId == agvID) .OrderBy(t => t.createTime).ToList(); foreach (var item in taskList)//出库 { if (item.taskStatus == 0)//下发任务 { BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.currPointId); BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId); BaseDictionary baseDictionary = dbContext.BaseDictionary.First(t => t.objid == item.taskType); var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), positionCodePath = new List { new () { positionCode=startEquip.agvPositionCode, type=baseDictionary.agvType }, new () { positionCode=endEquip.agvPositionCode, type=baseDictionary.agvType } }, 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.code == "0") { _logger.Info("五楼背负式AGV线程下发任务" + agvTask.ToJsonString()); Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程下发任务" + startEquip.agvPositionCode + "," + endEquip.agvPositionCode); item.taskCode = reponseMessage.data; item.taskStatus = 1; dbContext.Update(item); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 }); dbContext.SaveChanges(); } else { _logger.Info("下发小车任务失败" + result); } } else { //if (item.useFlag == 1)//接料位-工位默认为1,工位到接料位需Mes通知 { { if (item.taskStatus == 4)//通知捡料完成 { var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = item.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 == "成功") { _logger.Info("五楼背负式AGV线程完成任务" + item.objid); Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); item.taskStatus = 5; dbContext.Update(item); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 5 }); } } else if (item.taskStatus == 7)//通知拿料完成 { _logger.Info("五楼背负式AGV线程完成任务" + item.objid); Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + item.currPointNo + "," + item.endPointNo); var agvTask = new RequestAGVTaskDto { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = item.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 == "成功") { if (item.taskType == 48) { WmsRawReturn? wmsRawReturn = dbContext.WmsRawReturn.Where(t => t.rawReturnId == item.orderId).FirstOrDefault(); if (wmsRawReturn != null) { wmsRawReturn.executeStatus = "2"; dbContext.Update(wmsRawReturn); } } dbContext.Remove(item); dbContext.SaveChanges(); dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 }); } } } } } break; } } catch (Exception ex) { _logger.Error(ex.Message + "\n" + ex.StackTrace); } finally { Thread.Sleep(1000); } } } } }