using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aliyun.OSS; using JNPF; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Manager; using JNPF.Common.Net; using JNPF.Common.Security; using JNPF.EventBus; using JNPF.EventHandler; using JNPF.FriendlyException; using JNPF.Logging; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.WorkFlow.Entitys.Dto.FlowLaunch; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using NPOI.OpenXmlFormats; using Senparc.NeuChar.ApiHandlers; using SqlSugar; using Tnb.EquipMgr.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { /// /// Wms设备接口提供程序服务类 /// public class DeviceProviderService : BaseWareHouseService { private readonly ISqlSugarClient _db; private readonly IWareHouseService _wareHouseService; private readonly ICacheManager _cacheManager; private readonly IEventPublisher _eventPublisher; private readonly IUserManager _userManager; private readonly IElevatorControlService _elevatorControlService; public DeviceProviderService(ISqlSugarRepository repository, IWareHouseService wareHouseService, ICacheManager cacheManager, IEventPublisher eventPublisher, IUserManager userManger, IElevatorControlService elevatorControlService ) { _db = repository.AsSugarClient(); _wareHouseService = wareHouseService; _cacheManager = cacheManager; _eventPublisher = eventPublisher; _userManager = userManger; _elevatorControlService = elevatorControlService; } /// /// 创建任务链 /// /// [HttpPost, NonUnify] public async Task CreateTaskChain() { return await Task.FromResult(null); } /// /// 取货确认/申请取货 /// /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task LoadConfirm(ConfirmInput input) { try { var elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.startlocation_id) .LeftJoin((a, b, c, d) => c.startlocation_id == d.location_id) .Where((a, b, c, d) => d.point_code == input.sourceName && c.bill_code == input.taskCode) .FirstAsync(); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code, CancellationToken.None); Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum().ToString()},运行状态:{runStatus.ToEnum().ToString()},Agv状态:{agvStatus.ToEnum().ToString()},当前楼层:{floorNo}"); if (floorNo == 3) { if (doorStatus.ToEnum() != EnumDoorStatus.开门到位保持) { await _elevatorControlService.SendOpenCloseCmd(elevator.elevator_code, 3); //发送电梯前门开门指令 } if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 && doorStatus.ToEnum() == EnumDoorStatus.开门到位保持 && floorNo == 3) { elevator.current_floor = floorNo; await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } } catch (Exception) { return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } return await ToApiResult(HttpStatusCode.OK, "未启用"); } /// /// 放货确认/申请放货 /// /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task UnloadConfirm(ConfirmInput input) { try { //根据Agv传递的参数获取,对应的电梯 var elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.startlocation_id) .LeftJoin((a, b, c, d) => c.startlocation_id == d.location_id) .Where((a, b, c, d) => d.point_code == input.sourceName && c.bill_code == input.taskCode) .FirstAsync(); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code, CancellationToken.None); Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum().ToString()},运行状态:{runStatus.ToEnum().ToString()},Agv状态:{agvStatus.ToEnum().ToString()},当前楼层:{floorNo}"); //判断Agv电梯是否进入状态 if (agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态) { await _elevatorControlService.WriteTagAsync(elevator.elevator_code, ElevatorConsts.AGVControl, 1); } //电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态 if (doorStatus.ToEnum() != EnumDoorStatus.开门到位保持) { await _elevatorControlService.SendOpenCloseCmd(elevator.elevator_code, 3); //发送电梯前门开门指令 } if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 && doorStatus.ToEnum() == EnumDoorStatus.开门到位保持 && floorNo == 4) { elevator.current_floor = floorNo; await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } catch (Exception) { return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); throw; } } /// /// 任务链状态上报 /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task TaskChainCallBack(TaskChainCallBackInput input) { try { Log.Information($"任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); switch (input.status) { case "CREATED": break; case "ALLOCATED": break; case "PROCESSING": //if (await _cacheManager.GetAsync($"{input.taskChainCode}") == "任务链状态上报,上报状态PROCESSING") break; if (input.taskChainCode.Trim().IsNullOrEmpty()) break; var disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); var eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); TaskExecuteUpInput taskExecuteUpInput = new() { disTaskIds = disTasks.Select(x => x.id).ToList(), EqpIds = eps.Select(x => x.id).ToList(), }; await _wareHouseService.TaskExecute(taskExecuteUpInput); break; case "CANCELLED": break; case "SUCCEED": break; case "FAILURE": break; case "FINISHED": break; default: break; } //写入redis //await _cacheManager.SetAsync($"{input.taskChainCode}", $"任务链状态上报,上报状态{input.status}"); var opts = App.GetOptions(); UserAgent userAgent = new(App.HttpContext); //写系统日志 await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateOpLog", opts, new SysLogEntity { Id = SnowflakeIdHelper.NextId(), Category = 4, UserId = _userManager.UserId, UserName = _userManager.User.RealName, IPAddress = NetHelper.Ip, RequestURL = App.HttpContext.Request.Path, RequestMethod = App.HttpContext.Request.Method, Json = $"任务链状态上报,任务链编号:{input.taskChainCode},上报状态:{input.status},设备编号:{input.deviceID}", PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue), CreatorTime = DateTime.Now })); } catch (Exception) { return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } return await ToApiResult(HttpStatusCode.OK, "成功"); } /// /// 任务状态上报 /// /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task TaskCallback(TaskCallBackInput input) { Log.Information($"接收参数:{JsonConvert.SerializeObject(input)}"); try { var disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskCode)).ToListAsync(); if (input.action == "LOAD") { TaskExecuteAfterUpInput taskExecuteAfterUpInput = new() { disTaskIds = disTasks.Select(x => x.id).ToList() }; await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput); var elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中"); if (elevatorQueueItem != null) { var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id); if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) { var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus); if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持) { await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令 await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync(); elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "待执行"); if (!elevatorQueueItem?.elevator_code.IsNullOrEmpty() ?? false) { await (_wareHouseService.AddUnExecuteTask?.Invoke(elevatorQueueItem?.elevator_code!) ?? Task.CompletedTask); } } } } } else if (input.action == "UNLOAD") { TaskCompleUpInput taskCompleUpInput = new() { disTaskIds = disTasks.Select(x => x.id).ToList() }; await _wareHouseService.TaskComplate(taskCompleUpInput); } } catch (Exception ex) { Log.Error("任务状态上报出现错误", ex); return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } return await ToApiResult(HttpStatusCode.OK, "成功"); } /// /// 申请进出电梯 /// /// /// [HttpPost, NonUnify, AllowAnonymous] public async Task ElevatorConfirm(ConfirmInput input) { try { var eles = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.startlocation_id) .Where((a, b, c) => c.startlocation_code == input.sourceName && c.bill_code == input.taskCode) .ToListAsync(); } catch (Exception) { return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } return await ToApiResult(HttpStatusCode.OK, "未启用"); } } }