LiftContext.cs 7.7 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary.lift
{
    public class LiftContext
    {
        /// <summary>
        /// 所有电梯
        /// </summary>
        static Dictionary<string, LiftStatus> lifts = new Dictionary<string, LiftStatus>();
        public static void Init()
        {
            string[] names = Common.AppConfigHelper.GetValue(Common.SettingString.Lift_Names).Split(',');
            foreach (var item in names)
            {
                lifts.Add(item, new LiftStatus());
            }
            Common.LogUtil.info($"加载电梯信息完成:{string.Join(",", names)}");
        }
        /// <summary>
        /// 电梯是否开门
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool IsDoorOpen(string liftId, int floor)
        {
            LiftStatus liftStatus = GetLiftStatus(liftId);
            if (liftStatus.door.Equals("opened") && liftStatus.floor.Equals(floor))
                return true;
            return false;
        }
        /// <summary>
        /// 电梯关门
        /// </summary>
        /// <param name="liftId"></param>
        //public static void CloseDoor(string liftId,AgvInfo agvInfo)
        //{
        //  bool rtn=  HttpManager.CloseDoor(new service.model.DoorInfo() { liftId=liftId,sourceClient=agvInfo.Client,sourceFloor=agvInfo.Scope.Floor});
        //    Common.LogUtil.info($"{agvInfo.Name} 关门 {rtn}");
        //}
        /// <summary>
        /// 请求使用电梯
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="missionInfo"></param>
        /// <param name="isback">是否是返回</param>
        public static bool Request(service.model.MissionInfo missionInfo, AgvInfo agvInfo, bool isback = false)
        {
            service.model.SendInInfo info;
            bool rtn=false;
            if (isback)//返回
            {
                if (!AGVManager.GetsysClientBy(missionInfo.sourceFloor, missionInfo.liftName, out string destclient))
                {
                    Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
                    return false;
                }
                info = new service.model.SendInInfo()
                {
                    liftId = missionInfo.liftName,
                    destinationFloor = missionInfo.sourceFloor,
                    destinationPoint = missionInfo.sourcePoint,
                    destinationClient = destclient,
                    sourceFloor = missionInfo.destinationFloor,
                    sourceClient = agvInfo.Client
                };
               rtn= HttpManager.RequestSendIn(info);
                if (rtn)
                    HttpManager.AGVCall(new service.model.DoorInfo { liftId= missionInfo.liftName, sourceClient=agvInfo.Client, sourceFloor=missionInfo.destinationFloor});
            }
            else
            {
                if (!AGVManager.GetsysClientBy(missionInfo.destinationFloor, missionInfo.liftName, out string destclient))
                {
                    Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
                    return false;
                }
                info = new service.model.SendInInfo()
                {
                    liftId = missionInfo.liftName,
                    sourceClient = agvInfo.Client,
                    sourceFloor = missionInfo.sourceFloor,
                    sourcePoint = missionInfo.sourcePoint,
                    destinationClient = destclient,
                    destinationFloor = missionInfo.destinationFloor,
                    destinationPoint = missionInfo.destinationPoint,
                };
                rtn = HttpManager.RequestSendIn(info);
                if (rtn)
                    HttpManager.AGVCall(new service.model.DoorInfo { liftId = missionInfo.liftName, sourceClient = agvInfo.Client, sourceFloor = missionInfo.sourceFloor });
            }
            return rtn;
        }
        /// <summary>
        /// AGV离开
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="agvInfo"></param>
        /// <returns></returns> 
        public static bool AGVLeave(string liftId, AgvInfo agvInfo)
        {
            bool rtn = HttpManager.AGVLeave(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
            Common.LogUtil.info($"{agvInfo.Name} 离开 {rtn}");
            return rtn;
        }
        /// <summary>
        /// AGV呼叫
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="agvInfo"></param>
        /// <returns></returns>
        public static bool AGVCall(string liftId, AgvInfo agvInfo)
        {
            bool rtn = HttpManager.AGVCall(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
            Common.LogUtil.info($"{agvInfo.Name} 呼叫 {rtn}");
            return rtn;
        }

        /// <summary>
        /// 检查离开信号发送情况
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool CheckAgvLeaveSig(string liftId)
        {
            if (!lifts[liftId].door.Equals("opened"))
                return true;
            return false;
        }
        /// <summary>
        /// 运行到指定楼层
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="floor"></param>
        //public static void RunTo(string liftId,int floor)
        //{
        //}
        /// <summary>
        /// 有架子需要离开电梯
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool HasShelfNeedLeave(string liftId, string client, out LiftStatus liftStatus)
        {
            liftStatus = GetLiftStatus(liftId);
            if (liftStatus.destinationClient.Equals(client))
                return true;
            return false;
        }
        /// <summary>
        /// 检查该任务agv是否获得电梯控制权
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="missionId"></param>
        /// <returns></returns>
        public static bool CheckIfRequestOk(string liftId, service.model.MissionInfo mission)
        {
            LiftStatus liftStatus = GetLiftStatus(liftId);
            if (liftStatus.missionId.Equals(mission.missionId))
                return true;
            return false;
        }
        /// <summary>
        /// 获取电梯状态
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        static LiftStatus GetLiftStatus(string liftId)
        {
            if (lifts.ContainsKey(liftId))
            {
                return lifts[liftId];
            }
            else
                return new LiftStatus();
        }
        public static string[] GetLiftNames()
        {
            return lifts.Keys.ToArray();
        }
        public static void UpdateStatus(ClientStatus status)
        {
            try
            {
                LiftStatus lift = HttpManager.UpdateStatusToLift(status);
                if (lift != null)
                {
                    lifts[status.liftId] = lift;
                }
            }
            catch (Exception e)
            {
                Common.LogUtil.error($"上报状态给电梯失败:{status.ToString()}", e);
            }
        }

    }
}