using System.Diagnostics.CodeAnalysis;
using System.Dynamic;
using DingTalk.Api.Request;
using JNPF;
using JNPF.Common.Extension;
using JNPF.Common.Manager;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Tnb.Common.Extension;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities.Configs;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
///
/// 电梯控制业务服务类
///
public class ElevatorControlService : BaseWareHouseService, IElevatorControlService
{
private readonly ElevatorControlConfiguration _elevatorCtlCfg = new();
private readonly BackgroundService _agvHeartbeatMonitor;
private static readonly Dictionary> _fetchStartedStausValue = new();
private readonly bool isFrontDoorBit = false; //是否到前门位
private readonly IServiceProvider _sp;
private readonly BackgroundService _backgudSvc;
private readonly ICacheManager _cacheMgr;
public ElevatorControlService(IServiceProvider sp, BackgroundService bgSvc, ICacheManager cacheMgr)
{
_elevatorCtlCfg = App.Configuration.Build();
_sp = sp;
_backgudSvc = bgSvc;
_cacheMgr = cacheMgr;
}
///
/// 呼梯测试
///
///
[HttpPost, AllowAnonymous]
public async Task CallLiftTest()
{
bool isSuccefuly = false;
//var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
//(int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, tags, CancellationToken.None);
////判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
//if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 &&
// agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态)
//{
// if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持)
// {
// _ = await SendOpenCloseCmd(devName, (int)EnumAgvControl.前门关门);
// }
// dynamic result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到指定楼层
// if (!string.IsNullOrEmpty(result))
// {
// JObject jo = JObject.Parse(result);_
// isSuccefuly = jo?.Value("Result")?.Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false;
// }
//}
var value = "";
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
try
{
var statusMap = await RedisHelper.HGetAllAsync("Elevator3");
foreach (var tag in tags)
{
if (statusMap.ContainsKey(tag))
{
var cacheItem = statusMap[tag];
var jo = JObject.Parse(cacheItem);
var v = jo.Value("V");
}
}
//value = await _cacheMgr.GetAsync("Elevator3");
}
catch (Exception ex)
{
throw;
}
return isSuccefuly;
}
///
/// 三楼电梯操作流程
///
///
[HttpPost]
public dynamic ThreeFloorElevatorFlow()
{
//test by close door
//_agvHeartbeatMonitor.StartAsync(CancellationToken.None);
//await SendOpenCloseCmd(4);
//await SetAgvControlStatus(1);
//监听电梯门是否为关闭的状态
//var dataStatus = 0;
//do
//{
// dataStatus = await GetTagAsync("DoorStatus");
//} while (dataStatus != 4);
//if (dataStatus == 4)
//{
// //根据状态确认关闭后,向电梯发送指令从1~3楼 //FloorExecute 楼层触发
// await WriteTagAsync("FloorExecute", 1);
// //获取电梯到达3楼的到位信号
// (_, int runStatus, int floorNo) = (-1, -1, -1);
// do
// {
// var multi = await GetElevatorStatus(CancellationToken.None);
// runStatus = multi.sysStatus; floorNo = multi.floorNo;
// } while (runStatus != 0 && floorNo != 3);
// // 控制电梯到达指定楼层默认开门的行为,改为默认不开门 条件:Agv 到达3楼开门位时,为true
// if (true)//3楼Agv到达开门位后,向电梯发送开门指令, 默认true 当前
// {
// //向电梯发送前门开门指令
// await SendOpenCloseCmd(3);
// //获取门状态 是否为 开门到位保持
// var doorStatus = await GetTagAsync("DoorStatus");
// if (doorStatus == 3) //开门到位保持状态
// {
// //通知Agv进入电梯,取货
// //向电梯发送关门指令
// await SendOpenCloseCmd(4);
// doorStatus = await GetTagAsync("DoorStatus");
// if (doorStatus == 4) //门状态,为关门到位保持
// {
// //解锁,Agv状态,将其至为
// var agvStatus = await GetTagAsync("AGVStatus");
// if (agvStatus != 2)
// {
// await SetAgvControlStatus(0);
// }
// }
// }
// }
//}
return Task.FromResult(0);
}
private Task