diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index 76fe5635..f0e7460f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -71,6 +71,6 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// /// Task TaskExecuteAfter(TaskExecuteAfterUpInput input); - + Func AddUnExecuteTask { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index 288d066f..48105be6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -54,6 +54,8 @@ namespace Tnb.WarehouseMgr private static Dictionary _storeMap = new(StringComparer.OrdinalIgnoreCase); public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); private readonly ChannelWriter _channelWriter; + + public BaseWareHouseService(ChannelWriter? channelWriter = default) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index a65c163d..ae168134 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -254,6 +254,11 @@ namespace Tnb.WarehouseMgr { 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); + } } } } @@ -284,8 +289,9 @@ namespace Tnb.WarehouseMgr } } } - catch (Exception) + catch (Exception ex) { + Log.Error("任务状态上报出现错误", ex); return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 0c8e93ab..6377a6a9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -4,45 +4,25 @@ using System.Diagnostics; using System.Dynamic; using System.Linq; using System.Linq.Expressions; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Text; -using System.Text.Encodings.Web; -using System.Threading.Tasks; -using Aliyun.Credentials.Http; -using Aop.Api.Domain; -using Aspose.Cells.Drawing; using JNPF; -using JNPF.Common.Const; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Manager; using JNPF.Common.Security; -using JNPF.DependencyInjection; -using JNPF.DynamicApiController; -using JNPF.Extras.CollectiveOAuth.Config; using JNPF.FriendlyException; using JNPF.Logging; -using JNPF.Systems.Entitys.Dto.Module; using JNPF.Systems.Interfaces.System; using Mapster; -using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis; using Newtonsoft.Json; -using Polly.Timeout; -using Senparc.NeuChar.Helpers; -using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen; -using Spire.Pdf.Widget; +//using NPOI.SS.Formula.Functions; using SqlSugar; -using Swashbuckle.AspNetCore.SwaggerGen; using Tnb.BasicData.Entities; -using Tnb.BasicData.Entities.Enums; using Tnb.Common.Extension; using Tnb.Common.Utils; -using Tnb.ProductionMgr.Entities.Dto.PrdManage; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Attributes; using Tnb.WarehouseMgr.Entities.Configs; @@ -51,7 +31,6 @@ using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; -using Tnb.WarehouseMgr.Entities.Exceptions; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr @@ -68,7 +47,7 @@ namespace Tnb.WarehouseMgr private readonly ICacheManager _cacheManager; private readonly IElevatorControlService _elevatorControlService; private static Dictionary _elevatorMap = new Dictionary(); - + public Func AddUnExecuteTask { get; set; } public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService) @@ -79,6 +58,14 @@ namespace Tnb.WarehouseMgr _userManager = userManager; _cacheManager = cacheManager; _elevatorControlService = elevatorControlService; + AddUnExecuteTask = async code => + { + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(code, CancellationToken.None); + if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯) + { + await _elevatorControlService.CallLift(code, 5, CancellationToken.None); + } + }; } @@ -360,65 +347,11 @@ namespace Tnb.WarehouseMgr var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList(); if (endLocCodes?.Count > 0) { - var item = endLocCodes.FirstOrDefault(); - if (_elevatorMap.ContainsKey(item.device_id)) - { - var devName = _elevatorMap[item.device_id].ToString(); - var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl); - //判断当前设备是否为运行状态,不是则进入Agv电梯控制状态 - if (agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态) - { - await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); - } - } - foreach (var (_, devId, disTaskId) in endLocCodes) - { - WmsElevatorUnexecute elevatorQueueItem = new() - { - distask_id = disTaskId, - elevator_id = devId, - elevator_code = _elevatorMap[devId].ToString(), - floor = 5, //5代表4楼 - task_status = "待执行", - create_id = _userManager.UserId, - create_time = DateTime.Now - }; - var elevatorQueue = await _db.Queryable().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync(); - if (_elevatorMap.ContainsKey(devId) && (elevatorQueue.IsNull() || elevatorQueue.Count < 1)) - { - var devName = _elevatorMap[devId].ToString(); - elevatorQueueItem.task_status = "执行中"; - await _elevatorControlService.CallLift(devName, 5, CancellationToken.None); - } - - //如果当前电梯有任务在做,将当前呼梯任务放入待执行队列 - await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync(); - } + await CallingLanding(endLocCodes); } //调用AGV创建任务链接口 - var requestCfg = App.Configuration.Build(); - var url = requestCfg.AgvRequestUrls.CreateTaskChainUrl; - var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!) - .ToDictionary(x => x.Key, x => x.Select(it => new - { - taskCode = it.bill_code, - sourceName = it.startpoint_code, - targetName = it.endpoint_code, - containerCode = it.carry_code, - })); - Log.Information($"请求地址:{url}"); - foreach (var (k, v) in taskChainCodeDic) - { - dynamic reqBody = new ExpandoObject(); - reqBody.taskChainCode = k; - reqBody.type = (int)EnumTaskChainType.AGV; - reqBody.sequential = false; - reqBody.taskChainPriority = 0; - reqBody.taskList = v; - Log.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}"); - var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, agvCts.Token); - Log.Information($"调用Agv接口响应结果:{respBody}"); - } + await AgvDispatch(disTasks, agvCts.Token); + } } catch (Exception ex) when (ex is HttpRequestException hReqEx) @@ -437,36 +370,101 @@ namespace Tnb.WarehouseMgr } } /// + /// 呼梯操作 + /// + /// + /// + private async Task CallingLanding(List<(string endlocation_code, string device_id, string id)> endLocCodes) + { + try + { + var item = endLocCodes.FirstOrDefault(); + if (_elevatorMap.ContainsKey(item.device_id)) + { + var devName = _elevatorMap[item.device_id].ToString(); + var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl); + //判断当前设备是否为运行状态,不是则进入Agv电梯控制状态 + if (agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态) + { + await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); + } + } + { + foreach (var (_, devId, disTaskId) in endLocCodes) + { + WmsElevatorUnexecute elevatorQueueItem = new() + { + distask_id = disTaskId, + elevator_id = devId, + elevator_code = _elevatorMap[devId].ToString(), + floor = 5, //5代表4楼 + task_status = "待执行", + create_id = _userManager.UserId, + create_time = DateTime.Now + }; + var elevatorQueue = await _db.Queryable().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync(); + if (_elevatorMap.ContainsKey(devId) && (elevatorQueue.IsNull() || elevatorQueue.Count < 1)) + { + var devName = _elevatorMap[devId].ToString(); + elevatorQueueItem.task_status = "执行中"; + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None); + if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯) + { + await _elevatorControlService.CallLift(devName, 5, CancellationToken.None); + } + } + + //如果当前电梯有任务在做,将当前呼梯任务放入待执行队列 + await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync(); + } + } + + } + catch (Exception ex) + { + Log.Error("呼梯操作错误", ex); + throw; + } + } + /// /// Agv调度 /// /// /// /// - private async Task AgvDispatch(Dictionary> taskChainCodeDic, CancellationToken token) + private async Task AgvDispatch(List disTasks, CancellationToken token) { //调用AGV创建任务链接口 - var requestCfg = App.Configuration.Build(); - var url = requestCfg.AgvRequestUrls.CreateTaskChainUrl; - //var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!) - // .ToDictionary(x => x.Key, x => x.Select(it => new - // { - // taskCode = it.bill_code, - // sourceName = it.startpoint_code, - // targetName = it.endpoint_code, - // containerCode = it.carry_code, - // })); - Log.Information($"请求地址:{url}"); - foreach (var (k, v) in taskChainCodeDic) + try { - dynamic reqBody = new ExpandoObject(); - reqBody.taskChainCode = k; - reqBody.type = (int)EnumTaskChainType.AGV; - reqBody.sequential = false; - reqBody.taskChainPriority = 0; - reqBody.taskList = v; - Log.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}"); - var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); - Log.Information($"调用Agv接口响应结果:{respBody}"); + var requestCfg = App.Configuration.Build(); + var url = requestCfg.AgvRequestUrls.CreateTaskChainUrl; + var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!) + .ToDictionary(x => x.Key, x => x.Select(it => new + { + taskCode = it.bill_code, + sourceName = it.startpoint_code, + targetName = it.endpoint_code, + containerCode = it.carry_code, + })); + Log.Information($"请求地址:{url}"); + foreach (var (k, v) in taskChainCodeDic) + { + dynamic reqBody = new ExpandoObject(); + reqBody.taskChainCode = k; + reqBody.type = (int)EnumTaskChainType.AGV; + reqBody.sequential = false; + reqBody.taskChainPriority = 0; + reqBody.taskList = v; + Log.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}"); + var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); + Log.Information($"调用Agv接口响应结果:{respBody}"); + } + } + catch (Exception ex) + { + Log.Error("agv调度失败异常", ex); + throw; } } diff --git a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json index aeadd7ea..847490c1 100644 --- a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json +++ b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json @@ -4,6 +4,9 @@ "DBType": "PostgreSQL", //MySql;SqlServer;Oracle;PostgreSQL;Dm;Kdbndp;Sqlite; "Host": "localhost", "Port": "5432", + //"DBName": "tianyi_db", + //"UserName": "postgres", + //"Password": "pass@word123", "DBName": "tianyi_bas", "UserName": "totong", "Password": "IPANyxGSKxIXg0dBM", diff --git a/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj b/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj index 61fcc8dc..d32c2319 100644 --- a/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj +++ b/apihost/Tnb.API.Entry/Tnb.API.Entry.csproj @@ -63,4 +63,10 @@ + + + PreserveNewest + + + \ No newline at end of file