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