using Jc.SnowId; using Khd.Core.Application.Interface; using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Masuit.Tools; using Masuit.Tools.Logging; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using System; using System.Linq; using Z.EntityFramework.Plus; namespace Khd.Core.Application { public class WcsTaskApplication : IWcsTaskApplication { private readonly DefaultDbContext _dbContext; private readonly static JcSnowId _snowId = new JcSnowId(); public WcsTaskApplication(IServiceProvider serviceProvider) { _dbContext = serviceProvider.GetService(); } public WcsTask Get(int id) { var entity = _dbContext.WcsTask .Where(c => 1 == 1) .FirstOrDefault(); return entity; } public WcsTask Add(WcsTask model) { var entity = _dbContext.Add(model); _dbContext.SaveChanges(); return entity.Entity; } public WcsTask Update(WcsTask model) { var list = _dbContext.WcsTask.Where(t => t.objid == model.objid).Update(a => model); return model; } /// /// 接收agv接收任务通知接口 /// /// /// public ReponseagvCallbackDto AgvCallback(agvCallbackDto agvCallbackDto) { ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto(); try { _dbContext.ChangeTracker.Clear(); WcsTask wcsTask = _dbContext.WcsTask.FirstOrDefault(t => t.taskCode == agvCallbackDto.taskCode); if (wcsTask != null) { //start 开始 end结束 continue继续 //待取货 if (agvCallbackDto.method.ToLower() == "start") { wcsTask.taskStatus = 2; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } if (agvCallbackDto.method.ToLower() == "con") { wcsTask.taskStatus = 4; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } //已取货待放货 if (agvCallbackDto.method.ToLower() == "continue") { wcsTask.taskStatus = 3; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } //放货完成 if (agvCallbackDto.method.ToLower() == "end") { if (wcsTask.nextPointId != 10) { wcsTask.taskStatus = 5; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 5 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } else { wcsTask.taskStatus = 6; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 6 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } } } else { reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = "未找到当前任务"; } } catch (Exception ex) { LogManager.Error(ex); reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = ex.Message; } //返回请求 reponseagvCallbackDto.reqCode = reponseagvCallbackDto.reqCode; return reponseagvCallbackDto; } /// /// 入库完成 /// /// public string InWare(long taskId) { return ""; } /// /// 出库完成 /// /// public string OutWare(long taskId) { return ""; } /// /// 背负式Agv通知完成 /// /// /// public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest) { AgvCompeletedResponse agvCompeletedResponse = new AgvCompeletedResponse(); try { _dbContext.ChangeTracker.Clear(); BaseEquip baseEquip = _dbContext.BaseEquip.FirstOrDefault(t => t.equipNo == agvCompeletedRequest.endStationCode); if (baseEquip != null) { var wcsTask = _dbContext.WcsTask .Where(t => (t.taskType == 32 || t.taskType == 48) && (t.endPointId == baseEquip.objid || t.currPointId == baseEquip.objid)) .OrderBy(t => t.createTime) .FirstOrDefault(); if (wcsTask != null) { LogManager.Info($"agvComplete接口找到任务:{wcsTask.ToJsonString()}"); if (wcsTask.taskType != 48 && wcsTask.taskStatus != 0) { wcsTask.taskStatus = 7; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 7 }); _dbContext.SaveChanges(); agvCompeletedResponse.code = "0"; agvCompeletedResponse.message = "成功"; LogManager.Info($"agvComplete更新任务状态7{wcsTask.ToJsonString()}"); } else if (wcsTask.taskStatus != 0) { wcsTask.taskStatus = 4; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 7 }); _dbContext.SaveChanges(); agvCompeletedResponse.code = "0"; agvCompeletedResponse.message = "成功"; } else { agvCompeletedResponse.code = "1"; agvCompeletedResponse.message = "未找到当前任务"; } } else { agvCompeletedResponse.code = "1"; agvCompeletedResponse.message = "未找到当前任务"; } } else { agvCompeletedResponse.code = "1"; agvCompeletedResponse.message = "未找到当前工位"; } } catch (Exception ex) { LogManager.Error(ex); agvCompeletedResponse.code = "1"; agvCompeletedResponse.message = ex.Message; } return agvCompeletedResponse; } /// /// 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; } /// /// 柜体拆分区通知返库 /// /// /// public AgvCompeletedResponse TaskReturn(TaskReturn taskReturn) { AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse(); try { _dbContext.ChangeTracker.Clear(); WcsTask wcsTask = _dbContext.WcsTask .Where(t => t.taskType == 28) .Where(t => t.endPointNo == taskReturn.endStationCode) .FirstOrDefault(); if (wcsTask != null) { wcsTask.useFlag = 1; _dbContext.Update(wcsTask); _dbContext.WcsTask.Where(t => t.objid == wcsTask.objid).Update(a => new WcsTask { 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; } public ReponseagvCallbackDto AgvCallback2(agvCallbackDto agvCallbackDto) { ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto(); try { _dbContext.ChangeTracker.Clear(); WcsTask wcsTask = _dbContext.WcsTask.FirstOrDefault(t => t.taskCode == agvCallbackDto.taskCode); if (wcsTask != null) { //start 开始 end结束 continue继续 //待取货 if (agvCallbackDto.method.ToLower() == "start") { wcsTask.taskStatus = 2; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } if (agvCallbackDto.method.ToLower() == "con") { wcsTask.taskStatus = 4; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } //已取货待放货 if (agvCallbackDto.method.ToLower() == "continue") { if (wcsTask.taskStatus > 3) { wcsTask.taskStatus = 5; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 5 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } else { wcsTask.taskStatus = 3; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } } //放货完成 if (agvCallbackDto.method.ToLower() == "end") { wcsTask.taskStatus = 7; _dbContext.Update(wcsTask); _dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 7 }); _dbContext.SaveChanges(); reponseagvCallbackDto.code = "0"; reponseagvCallbackDto.message = "成功"; } } } catch (Exception ex) { LogManager.Error(ex); reponseagvCallbackDto.code = "1"; reponseagvCallbackDto.message = ex.Message; } //返回请求 reponseagvCallbackDto.reqCode = reponseagvCallbackDto.reqCode; return reponseagvCallbackDto; } public ReponseMessage CallMaterial(CallMaterial callMaterial) { ReponseMessage reponseMessage = new ReponseMessage(); try { _dbContext.ChangeTracker.Clear(); WmsRawOutstock wmsRawOutstock = _dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == Convert.ToInt64(callMaterial.rawOutstockId)); if (wmsRawOutstock != null) { bool hasTask = _dbContext.WcsTask.Where(t => t.currPointId == 31 || t.endPointId == 31).Any(); var taskManual = _dbContext.WcsTaskManual.Where(t => t.taskType == 999).FirstOrDefault(); if (hasTask) { reponseMessage.code = "1"; reponseMessage.message = "当前有任务,请等待任务完成后再申请"; } else { if(taskManual == null) { BaseEquip endEquip = _dbContext.BaseEquip.First(t => t.objid == 31); BaseEquip baseEquip = _dbContext.BaseEquip.First(t => t.objid == 9); WcsTaskManual wcsTaskManual = new WcsTaskManual(); wcsTaskManual.taskType = 999; wcsTaskManual.objid = _snowId.NextId(); wcsTaskManual.startPointNo = callMaterial.locationCode; wcsTaskManual.orderId = Convert.ToInt64(callMaterial.rawOutstockId); _dbContext.Add(wcsTaskManual); _dbContext.SaveChanges(); reponseMessage.code = "0"; reponseMessage.message = "成功"; } else { taskManual.startPointNo = callMaterial.locationCode; taskManual.updateTime = DateTime.Now; _dbContext.WcsTaskManual.Update(taskManual); _dbContext.SaveChanges(); reponseMessage.code = "0"; reponseMessage.message = "修改成功"; } } } else { reponseMessage.code = "1"; reponseMessage.message = "未找到当前申请单的任务"; } } catch (Exception ex) { reponseMessage.code = "1"; reponseMessage.message = ex.Message; LogManager.Error(ex); } return reponseMessage; } public ReponseMessage AGVTaskComplete() { ReponseMessage reponseMessage = new ReponseMessage(); try { _dbContext.ChangeTracker.Clear(); bool hasTask = _dbContext.WcsTask.Where(t => t.taskType == 41).Any(); if (!hasTask) { reponseMessage.code = "0"; reponseMessage.message = "成功"; } else { reponseMessage.code = "1"; reponseMessage.message = "当前不可翻转"; } } catch (Exception ex) { reponseMessage.code = "1"; reponseMessage.message = ex.Message; LogManager.Error(ex); } return reponseMessage; } public ReponseMessage CallAgvStopOrStart(CallAgvStopOrStart agvStopOrStart) { try { string Ip = "172.16.12.24"; int Port = 8182; if (agvStopOrStart.Meth.ToLower() == "stop") { var AgvMessage = new { reqCode = _snowId.NextId().ToString(), robots = new string[] { agvStopOrStart.AgvCode } }; string result = HttpHelper.SendPostMessage(Ip, Port, "rcms/services/rest/hikRpcService/stopRobot", AgvMessage.ToJsonString()); ReponseMessage reponseMessage = JsonConvert.DeserializeObject(result); return reponseMessage; } else if (agvStopOrStart.Meth.ToLower() == "start") { var AgvMessage = new { reqCode = _snowId.NextId().ToString(), robots = new string[] { agvStopOrStart.AgvCode } }; string result = HttpHelper.SendPostMessage(Ip, Port, "rcms/services/rest/hikRpcService/resumeRobot", AgvMessage.ToJsonString()); ReponseMessage reponseMessage = JsonConvert.DeserializeObject(result); return reponseMessage; } else { return new ReponseMessage() { code = "1", message = "传入Meth不正确" }; } } catch { return new ReponseMessage() { code = "1", message = "调用失败" }; } } /// /// 取消预调度 /// /// public ReponseMessage CancelPreScheduling() { try { _dbContext.ChangeTracker.Clear(); var baseEquip = _dbContext.BaseEquip.FirstOrDefault(x => x.objid == 11); var executeTask = new { reqCode = new JcSnowId().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); ReponseMessage reponseMessage = JsonConvert.DeserializeObject(executeResult); return reponseMessage; } catch (Exception ex) { return new ReponseMessage() { code = "1", message = "调用失败" }; } } } }