using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.Extensions; using iWare.Wms.Core; using iWare.Wms.Core.Enum; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace iWare.Wms.Application.Service.Wmsjob.AgvTask { /// /// AGV访问接口 /// [ApiDescriptionSettings("仓库作业", Name = "AgvCallback", Order = 100)] [Route("api/agv/[Controller]")] public class AgvCallbackService : IDynamicApiController, ITransient { private readonly IRepository _wareTask; private readonly IRepository _wareTaskSub; private readonly IRepository _wareDeviceWarning; private readonly IRepository _wareTaskBak; private readonly IRepository _wareTaskSubBak; public AgvCallbackService( IRepository wareTask, IRepository wareTaskSub, IRepository wareDeviceWarning, IRepository wareTaskBak, IRepository wareTaskSubBak ) { _wareTask = wareTask; _wareDeviceWarning = wareDeviceWarning; _wareTaskSub = wareTaskSub; _wareTaskBak = wareTaskBak; _wareTaskSubBak = wareTaskSubBak; } /// /// 分页查询任务管理 /// /// /// [HttpPost("agvCallback")] [AllowAnonymous] public async Task Method([FromBody] AgvCallbackInput input) { AgvCommonResponseDto agvCommonResponseDto = new AgvCommonResponseDto() { code = "0", message = "成功", reqCode = input.reqCode }; List wareTasks = new List(); List wareTaskBaks = new List(); var taskSub = await _wareTaskSub.Where(u => u.AgvTaskCode == input.taskCode).FirstOrDefaultAsync(); if (taskSub == null) { if (input.method == "end") { var taskSubbak = await _wareTaskSubBak.DetachedEntities.Where(u => u.AgvTaskCode == input.taskCode).FirstOrDefaultAsync(); if (taskSubbak != null) { var taskbak = await _wareTaskBak.Where(u => u.Id == taskSubbak.TaskId).FirstOrDefaultAsync(); if (taskbak != null) { taskbak.FinishedTime = DateTimeOffset.Now; wareTaskBaks.Add(taskbak); } } } return agvCommonResponseDto; } switch (input.method) { case "start": taskSub.TaskState = (int)SubTaskStateEnum.执行中; taskSub.AgvCode = input.robotCode; taskSub.AgvTaskCode = input.taskCode; var task = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync(); if (task != null) { task.AgvCode = input.robotCode; wareTasks.Add(task); } break; case "outbin": taskSub.TaskState = (int)SubTaskStateEnum.离开储位; var task1 = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync(); if (task1 != null) { task1.AgvCode = input.robotCode; wareTasks.Add(task1); } break; case "applyIn": taskSub.TaskState = (int)SubTaskStateEnum.请求进; var task2 = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync(); if (task2 != null) { task2.AgvCode = input.robotCode; wareTasks.Add(task2); } break; case "arrived": taskSub.TaskState = (int)SubTaskStateEnum.进到位; break; case "applyOut": taskSub.TaskState = (int)SubTaskStateEnum.请求出; break; case "出到位": taskSub.TaskState = (int)SubTaskStateEnum.出到位; break; case "release": taskSub.TaskState = (int)SubTaskStateEnum.离开; break; case "end": taskSub.TaskState = (int)SubTaskStateEnum.已完成; var isExist = _wareTaskSub.Any(u => u.TaskId == taskSub.TaskId && u.TaskState != (int)SubTaskStateEnum.已完成 && u.Id != taskSub.Id); if (!isExist) { var maintask = _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefault(); if (maintask != null) { maintask.TaskState = TaskStateEnum.已完成; wareTasks.Add(maintask); } } break; case "cancel": taskSub.TaskState = (int)SubTaskStateEnum.已取消; break; } using (var tran = await _wareTaskSub.Database.BeginTransactionAsync()) { try { await _wareTaskSub.UpdateAsync(taskSub); if (wareTasks != null && wareTasks.Count != 0) { await _wareTask.UpdateAsync(wareTasks); } if (wareTaskBaks != null && wareTaskBaks.Count > 0) { await _wareTaskBak.UpdateAsync(wareTaskBaks); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } return agvCommonResponseDto; } /// /// 分页查询任务管理 /// /// /// [HttpPost("agvCallbackService/warnCallback")] [AllowAnonymous] public async Task WarnMethod([FromBody] AgvWarnCallbackDto input) { AgvCommonResponseDto agvCommonResponseDto = new AgvCommonResponseDto() { code = "0", message = "成功", reqCode = input.reqCode }; List update = new List(); List insert = new List(); //查询当前所有AGV报警 var warnlist = await _wareDeviceWarning.Where(u => u.DeviceCode == "1099" && u.Status == 0).ToListAsync(); var strlist = input.data.Select(u => u.warnContent).ToList(); var strlist2 = warnlist.Select(u => u.WarningContent).ToList(); var nowDate = DateTime.Now; var msg = ""; foreach (var item in warnlist) { if (!strlist.Contains(item.WarningContent))//不包含,结束报警 { item.UpdatedTime = nowDate; item.UpdatedUserName = "WMS"; item.Status = 1; //状态(0:新建 1:已处理) item.StatusName = "已处理"; item.CloseContent = "WMS关闭"; item.FinishTime = nowDate; item.OperationRemark = "关闭报警"; GetTimeDiffer(item.CreatedTime.ConvertToDateTime(), nowDate, ref msg); item.DurationTime = msg; update.Add(item); } else//包含,更新报警时间 { item.UpdatedTime = nowDate; update.Add(item); } } foreach (var item in input.data) { if (!strlist2.Contains(item.warnContent)) { WareDeviceWarning request = new WareDeviceWarning(); request.DeviceCode = "1099"; request.DeviceName = "AGV"; request.DeviceType = 3; request.DeviceTypeName = "AGV"; request.WarningDbAddress = item.robotCode; request.WarningCode = item.taskCode; request.WarningContent = item.warnContent; request.WarningTime = item.beginTime; //状态(0:新建 1:已处理) request.Status = 0; request.StatusName = "新建"; request.UpdatedTime = nowDate; request.CreatedTime = nowDate; request.CreatedUserName = "WMS"; request.OperationRemark = "添加"; insert.Add(request); } } using (var tran = await _wareTaskSub.Database.BeginTransactionAsync()) { try { if (update != null && update.Count != 0) { await _wareDeviceWarning.UpdateAsync(update); } if (insert != null && insert.Count > 0) { await _wareDeviceWarning.InsertAsync(insert); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } return agvCommonResponseDto; } [NonAction] public static int GetTimeDiffer(DateTime? startTime, DateTime? endTime, ref string msg) { if (startTime == null || endTime == null) { return 0; } TimeSpan ts = ((DateTime)endTime - (DateTime)startTime); msg = ""; if (ts.Days != 0) { msg += ts.Days + "天"; } if (ts.Hours != 0) { msg += ts.Hours + "小时"; } if (ts.Minutes != 0) { msg += ts.Minutes + "分钟"; } if (ts.Seconds != 0) { msg += ts.Seconds + "秒"; } return (int)ts.TotalSeconds; } } }