@@ -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 < string , object > _elevatorMap = new Dictionary < string , object > ( ) ;
public Func < string , Task > AddUnExecuteTask { get ; set ; }
public WareHouseService ( ISqlSugarRepository < WmsInstockH > 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 > ( ) = = EnumSysStatus . 正 常 状 态 & & runStatus . ToEnum < EnumRunStatus > ( ) = = 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 > ( ) ! = 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 < WmsElevatorUnexecute > ( ) . 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 < AgvRequestConfig > ( ) ;
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
}
}
/// <summary>
/// 呼梯操作
/// </summary>
/// <param name="endLocCodes"></param>
/// <returns></returns>
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 > ( ) ! = 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 < WmsElevatorUnexecute > ( ) . 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 > ( ) = = EnumSysStatus . 正 常 状 态 & & runStatus . ToEnum < EnumRunStatus > ( ) = = EnumRunStatus . 停 梯 )
{
await _elevatorControlService . CallLift ( devName , 5 , CancellationToken . None ) ;
}
}
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
await _db . Insertable ( elevatorQueueItem ) . ExecuteCommandAsync ( ) ;
}
}
}
catch ( Exception ex )
{
Log . Error ( "呼梯操作错误" , ex ) ;
throw ;
}
}
/// <summary>
/// Agv调度
/// </summary>
/// <param name="disTasks"></param>
/// <param name="token"></param>
/// <returns></returns>
private async Task AgvDispatch ( Dictionary < string , List < dynamic > > taskChainCodeDic , CancellationToken token )
private async Task AgvDispatch ( List < WmsDistaskH > disTasks , CancellationToken token )
{
//调用AGV创建任务链接口
var requestCfg = App . Configuration . Build < AgvRequestConfig > ( ) ;
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 = ( in t) EnumTaskChainType . AGV ;
reqBody . sequential = false ;
reqBody . taskChainPriority = 0 ;
reqBody . taskList = v ;
Log . Information ( $"请求参数:{JsonConvert.SerializeObject(reqBody)}" ) ;
var respBody = await HttpClientHelper . PostStreamAsync ( url , reqB ody , token ) ;
Log . Information ( $"调用Agv接口响应结果:{respBody}" ) ;
var requestCfg = App . Configuration . Build < AgvRequestConfig > ( ) ;
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_c ode ,
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 ;
}
}