using Application.Interface; using Application.PdaDto; using Jc.SnowId; using Microsoft.Extensions.DependencyInjection; using Serilog; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto.taskType; using SlnMesnac.Model.dto.webapi; using SlnMesnac.Serilog; using SqlSugar; using System.Collections.Generic; using System.Net; using System.Text.Json; namespace Application { public class WcsTaskApplication : IWcsTaskApplication { private static readonly JcSnowId _snowId = new JcSnowId(); private readonly SerilogHelper _logger; private ISqlSugarClient? sqlSugarClient; public WcsTaskApplication(IServiceProvider serviceProvider, ISqlSugarClient _sqlSugarClient) { _logger = serviceProvider.GetRequiredService(); sqlSugarClient = _sqlSugarClient; // sqlSugarClient = serviceProvider.GetRequiredService(); } /// /// 接收agv接收任务通知接口 //in : 小料箱到达起点接驳位里面,agv通知wcs,请求退出接驳位 //start 取完料开始前往终点 //wait: agv到达等待点,通知wcs判断能否进接驳位 //out: 小料箱到达终点接驳位里面,agv通知wcs,请求退出接驳位 //end:任务结束 /// /// /// public ReponseagvCallbackDto AgvCallback(agvCallbackDto agvCallbackDto) { ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto(); try { WcsTask? wcsTask = sqlSugarClient.Queryable().First(t => t.TaskCode == agvCallbackDto.taskCode); WcsTaskLog? wcsTaskLog = null; if (wcsTask != null) { wcsTaskLog = sqlSugarClient.Queryable().First(t => t.Id == wcsTask.Id); } sqlSugarClient.AsTenant().BeginTran(); if (wcsTask != null) { //任务赋值执行agv字段 wcsTask.NextPointNo = agvCallbackDto.robotCode; if (wcsTaskLog != null) { wcsTaskLog.NextPointNo = agvCallbackDto.robotCode; } //待取货 if (agvCallbackDto.method.ToLower() == "in") { if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask || wcsTask.TaskType == StaticTaskType.DeliverTonerTask) { wcsTask.TaskStatus = 2; sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = wcsTask.TaskStatus; sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); } } reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } //起点取完 if (agvCallbackDto.method.ToLower() == "start") { if (wcsTask.TaskType == StaticTaskType.SupplyEmptyPalletTask || wcsTask.TaskType == StaticTaskType.TransferMaterialBoxTask || wcsTask.TaskType == StaticTaskType.MoveLocationTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask || wcsTask.TaskType == StaticTaskType.ExceptionTask) { wcsTask.TaskStatus = 2; } else if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask || wcsTask.TaskType == StaticTaskType.DeliverTonerTask) { wcsTask.TaskStatus = 4; } sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = wcsTask.TaskStatus; sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); } reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } if (agvCallbackDto.method.ToLower() == "wait") { if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask) { wcsTask.TaskStatus = 6; } else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask) { wcsTask.TaskStatus = 4; } sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = wcsTask.TaskStatus; sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); } reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } if (agvCallbackDto.method.ToLower() == "out") { if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask) { wcsTask.TaskStatus = 8; } else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask) { wcsTask.TaskStatus = 6; } sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = wcsTask.TaskStatus; sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); } reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } //放货完成 if (agvCallbackDto.method.ToLower() == "end") { if (wcsTask.TaskType == StaticTaskType.SupplyEmptyPalletTask || wcsTask.TaskType == StaticTaskType.TransferMaterialBoxTask || wcsTask.TaskType == StaticTaskType.MoveLocationTask || wcsTask.TaskType == StaticTaskType.ExceptionTask) { wcsTask.TaskStatus = 4; } else if (wcsTask.TaskType == StaticTaskType.TransferMaterialMetrologyRoomBoxTask || wcsTask.TaskType == StaticTaskType.SupplySmallPalletTask) { wcsTask.TaskStatus = 10; } else if (wcsTask.TaskType == StaticTaskType.SupplySmallPalletFromTonerTask || wcsTask.TaskType == StaticTaskType.EmptyReturnFromTonerTask) { wcsTask.TaskStatus = 8; } else if (wcsTask.TaskType == StaticTaskType.DeliverTonerTask) { wcsTask.TaskStatus = 6; } sqlSugarClient.Updateable(wcsTask).ExecuteCommand(); if (wcsTaskLog != null) { wcsTaskLog.TaskStatus = wcsTask.TaskStatus; sqlSugarClient.Updateable(wcsTaskLog).ExecuteCommand(); } reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } } else { reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = "未找到当前任务"; } } catch (Exception ex) { sqlSugarClient!.AsTenant().CommitTran(); _logger.Error(ex.Message); reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = ex.Message; } sqlSugarClient!.AsTenant().CommitTran(); //返回请求 reponseagvCallbackDto.reqCode = reponseagvCallbackDto.reqCode; return reponseagvCallbackDto; } /// /// MES核减条码数量通知 /// /// /// //public ReponseagvCallbackDto MesReduction(MesRequest mesRequest) //{ // ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto(); // try // { // WmsPalletInfo? palletInfo = sqlSugarClient.Queryable().First(t => t.Barcode == mesRequest.barcode); // if (palletInfo != null) // { // sqlSugarClient.Deleteable(palletInfo).ExecuteCommand(); // reponseagvCallbackDto.code = "200"; // reponseagvCallbackDto.message = "核减成功"; // } // else // { // reponseagvCallbackDto.code = "301"; // reponseagvCallbackDto.message = "核减失败:未找到条码库存"; // } // } // catch (Exception ex) // { // //sqlSugarClient!.AsTenant().CommitTran(); // _logger.Error(ex.Message); // reponseagvCallbackDto.code = "301"; // reponseagvCallbackDto.message = "核减失败:" + ex.Message; // } // reponseagvCallbackDto.reqCode = mesRequest.reqCode; // return reponseagvCallbackDto; //} /// /// 根据库位编号获取托盘编号及库存信息 /// public PadResponse GetLocationInfo(List locationCodes) { PadResponse padResponse = new PadResponse(); try { List wmsBaseLocations = sqlSugarClient.Queryable().Where(t => locationCodes.Contains(t.LocationCode)).ToList(); List locationInfos = new List(); foreach (string locationCode in locationCodes) { WmsBaseLocation? location = wmsBaseLocations.FirstOrDefault(x => x.LocationCode == locationCode); if (location != null && !string.IsNullOrEmpty(location.ContainerCode)) { WmsPalletInfo wmsPalletInfo = sqlSugarClient.Queryable().Where(t => t.PalletInfoCode == location.ContainerCode).First(); LocationInfo locationInfo = new LocationInfo(); locationInfo.LocationCode = locationCode; locationInfo.PalletInfoCode = wmsPalletInfo.PalletInfoCode; locationInfo.Amount = wmsPalletInfo.Amount; locationInfos.Add(locationInfo); } else { LocationInfo locationInfo = new LocationInfo(); locationInfo.LocationCode = locationCode; locationInfo.PalletInfoCode = ""; locationInfo.Amount = 0; locationInfos.Add(locationInfo); } } padResponse.code = "200"; padResponse.message = "成功"; padResponse.data = locationInfos; } catch (Exception ex) { _logger.Error(ex.Message); padResponse.code = "301"; padResponse.message = "获取信息失败:" + ex.Message; } return padResponse; } /// ///根据托盘号托盘解绑 /// /// public PadResponse UnBindPalletInfo(string palletInfoCode) { PadResponse padResponse = new PadResponse(); try { WmsPalletInfo? wmsPalletInfo = sqlSugarClient.Queryable().Where(t => t.PalletInfoCode == palletInfoCode).First(); if (wmsPalletInfo != null) { wmsPalletInfo.Amount = 0; wmsPalletInfo.TonerFlag = 0; int result = sqlSugarClient.Updateable(wmsPalletInfo).ExecuteCommand(); if (result > 0) { padResponse.code = "200"; padResponse.message = "成功"; } else { padResponse.code = "301"; padResponse.message = "失败"; } } else { padResponse.code = "301"; padResponse.message = "未查询到该托盘信息"; } } catch (Exception ex) { _logger.Error(ex.Message); padResponse.code = "301"; padResponse.message = "失败:" + ex.Message; } return padResponse; } /// ///pad获取指定机台的RFID设备状态 /// /// public PadResponse GetRfidInfo(string machineCode) { PadResponse padResponse = new PadResponse(); try { List list = sqlSugarClient.Queryable().Where(t => t.MachineCode == machineCode).ToList(); if (list != null && list.Count > 0) { padResponse.code = "200"; padResponse.message = "成功"; padResponse.data = list; } else { padResponse.code = "301"; padResponse.message = "未查询到该机台的RFID设备信息"; } } catch (Exception ex) { _logger.Error(ex.Message); padResponse.code = "301"; padResponse.message = "失败:" + ex.Message; } return padResponse; } /// ///pad获取所有机台库存列表信息 /// /// public PadResponse GetAllMachineInfos() { PadResponse padResponse = new PadResponse(); try { List Locationlist = sqlSugarClient.Queryable() .LeftJoin((wbi,wpi) => wbi.ContainerCode == wpi.PalletInfoCode) .Select((wbi, wpi) => new WmsBaseLocation { AgvPositionCode = wbi.AgvPositionCode, LocationStatus = wbi.LocationStatus, Amount = wpi.Amount, }).ToList(); //List locationInfos = new List(); //foreach (var location in Locationlist) //{ // if (location != null) // { // WmsPalletInfo wmsPalletInfo = sqlSugarClient.Queryable().Where(t => t.PalletInfoCode == location.ContainerCode).First(); // AllLocationInfo locationInfo = new AllLocationInfo(); // locationInfo.LocationCode = location.AgvPositionCode; // locationInfo.Amount = wmsPalletInfo.Amount; // locationInfo.LocationStatus = location.LocationStatus; // locationInfos.Add(locationInfo); // } // else // { // AllLocationInfo locationInfo = new AllLocationInfo(); // locationInfo.LocationCode = ""; // locationInfo.Amount = 0; // locationInfo.LocationStatus = 0; // locationInfos.Add(locationInfo); // } //} padResponse.code = "200"; padResponse.message = "成功"; padResponse.data = Locationlist; } catch (Exception ex) { _logger.Error(ex.Message); padResponse.code = "301"; padResponse.message = "失败:" + ex.Message; } return padResponse; } /// ///指定机台优先级接口:加急/不加急 ///priority:0-不加急 1-加急 /// /// //public PadResponse SetPriorityByMachineCode(string machineCode, int priority) //{ // PadResponse response = new PadResponse(); // try // { // WmsMachineInfo? machineInfo = sqlSugarClient.Queryable().First(t => t.MachineCode == machineCode); // if (priority != 0 && priority != 1) // { // response.code = "301"; // response.message = "优先级设置失败:优先级必须为0或1"; // } // else if (machineInfo != null) // { // machineInfo.Priority = priority; // int rowsAffected = sqlSugarClient.Updateable(machineInfo).UpdateColumns(it => new { it.Priority }).ExecuteCommand(); // if (rowsAffected > 0) // { // response.code = "200"; // response.message = "优先级设置成功"; // } // else // { // response.code = "301"; // response.message = "优先级设置失败:更新数据库异常"; // } // } // else // { // response.code = "301"; // response.message = "优先级设置失败:未找到机台信息"; // } // } // catch (Exception ex) // { // //sqlSugarClient!.AsTenant().CommitTran(); // _logger.Error(ex.Message); // response.code = "301"; // response.message = "优先级设置失败:" + ex.Message; // } // return response; //} /// /// 4楼到5楼原材料入口继续 /// /// /// //public AgvCompeletedResponse TaskContinue(TaskContinue taskContinue) //{ // AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse(); // try // { // _dbContext.ChangeTracker.Clear(); // var wcsTask = _dbContext.WcsTask // .Where(t => t.taskType == 47) // .Where(t => t.containerNo == taskContinue.palletInfoCode) // .FirstOrDefault(); // if (wcsTask != null) // { // wcsTask.useFlag = 1; // _dbContext.Update(wcsTask); // _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(a => new WcsTaskLog { useFlag = 1 }); // _dbContext.SaveChanges(); // compeletedResponse.code = "0"; // compeletedResponse.message = "成功"; // } // else // { // compeletedResponse.code = "1"; // compeletedResponse.message = "未找到当前任务"; // } // } // catch (Exception ex) // { // LogManager.Error(ex); // compeletedResponse.code = "1"; // compeletedResponse.message = ex.Message; // } // return compeletedResponse; // return null; //} } }