using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using JNPF;
using JNPF.Common.Extension;
using JNPF.DependencyInjection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using MimeKit.Cryptography;
using Newtonsoft.Json.Linq;
using Tnb.Common.Extension;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Configs;
using Tnb.WarehouseMgr.Entities.Consts;
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 Dictionary> _fetchStartedStausValue = new();
private bool isFrontDoorBit = false; //是否到前门位
public ElevatorControlService()
{
_elevatorCtlCfg = App.Configuration.Build();
//_agvHeartbeatMonitor = agvHeartbeatMonitorService;
}
///
/// 呼梯测试
///
///
[HttpPost]
public async Task CallLiftTest(string devName, int floor)
{
var isSuccefuly = false;
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, CancellationToken.None);
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 &&
agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态)
{
if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持)
{
await SendOpenCloseCmd(devName, (int)EnumAgvControl.前门关门);
}
var 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;
}
}
return isSuccefuly;
}
///
/// 三楼电梯操作流程
///
///
[HttpPost]
public async Task 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