LiftContext.cs 7.1 KB

using DeviceLibrary.Models;
using DeviceLibrary.Models.Service.Request;
using DeviceLibrary.Models.Service.Response;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace DeviceLibrary.Context
{
    public class LiftContext
    {
        static List<LiftInfo> elevatorInfos;

        public static void Init()
        {
            string[] lifts = Common.AppConfigHelper.GetValue(Common.SettingString.Lift_Ids).Split(',');
            string buff = Common.AppConfigHelper.GetValue(Common.SettingString.Lift_Buffs);
            elevatorInfos = Common.JsonHelper.DeserializeJsonToList<LiftInfo>(buff);
            if (elevatorInfos == null)
            {
                elevatorInfos = new List<LiftInfo>();
                foreach (var item in lifts)
                {
                    elevatorInfos.Add(new LiftInfo(item));
                }
            }
            else
            {
                if (!lifts.Length.Equals(elevatorInfos.Count))
                {
                    elevatorInfos = new List<LiftInfo>();
                    foreach (var item in lifts)
                    {
                        elevatorInfos.Add(new LiftInfo(item));
                    }
                }
                else
                {
                    foreach (var item in lifts)
                    {
                        LiftInfo liftInfo = elevatorInfos.Find(s => s.liftId.Equals(item));
                        if (liftInfo == null)
                        {
                            elevatorInfos = new List<LiftInfo>();
                            foreach (var lift in lifts)
                            {
                                elevatorInfos.Add(new LiftInfo(lift));
                            }
                            break;
                        }
                    }
                }

            }
        }
        public static string ToListInfos()
        {
            StringBuilder sb = new StringBuilder();
            foreach (var item in elevatorInfos)
            {
                sb.Append(Common.JsonHelper.SerializeObject(item));
                sb.Append("\r\n");
                sb.Append(item.OccupiedInfo());
                sb.Append("\r\n");
                sb.Append("\r\n");
            }
            return sb.ToString();
        }
        static object savelock = new object();
        /// <summary>
        /// 保存所有电梯状态
        /// </summary>
        static void SaveLiftInfo()
        {
            if (Monitor.TryEnter(savelock, 1000))
            {
                try
                {
                    Common.AppConfigHelper.SaveValue(Common.SettingString.Lift_Buffs, Common.JsonHelper.SerializeObject(elevatorInfos));
                }
                catch (Exception e)
                {
                    Common.LogUtil.error("SaveLiftInfo", e);
                }
                finally
                {
                    Monitor.Exit(savelock);
                }
            }
            else
            {
                Common.LogUtil.error($"SaveLiftInfo Fail:{Common.JsonHelper.SerializeObject(elevatorInfos)}");
            }
        }
        /// <summary>
        /// 请求电梯
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool RequestSendIn(SendInInfo lift, out string msg)
        {
            msg = "ok";
            if (elevatorInfos.Count == 0)
            {
                msg = "系统未添加电梯信息";
                return false;
            }
            LiftInfo elevatorInfo = elevatorInfos.Find(s => s.liftId.Equals(lift.liftId));
            if (elevatorInfo == null)
            {
                msg = $"系统不存在该电梯标识:{lift.liftId}";
                return false;
            }
            bool rtn = elevatorInfo.RequestUse(lift, out msg);
            SaveLiftInfo();
            return rtn;
        }

        /// <summary>
        /// 更新客户端使用电梯信息
        /// </summary>
        /// <param name="clientStatus"></param>
        /// <param name="msg"></param>
        public static void UpdateClient(ClientStatus clientStatus, out string msg)
        {
            msg = "ok";
            if (elevatorInfos.Count == 0)
            {
                msg = "系统未添加电梯信息";
                return;
            }
            LiftInfo elevatorInfo = elevatorInfos.Find(s => s.liftId.Equals(clientStatus.liftId));
            if (elevatorInfo == null)
            {
                msg = $"系统不存在该电梯标识:{clientStatus.liftId}";
                return;
            }
            elevatorInfo.UpdateClient(clientStatus);
        }

        /// <summary>
        /// 获取电梯状态
        /// </summary>
        /// <param name="clientStatus"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static Status GetLiftStatus(ClientStatus clientStatus, out string msg)
        {
            msg = "ok";
            if (elevatorInfos.Count == 0)
            {
                msg = "系统未添加电梯信息";
                return new Status();
            }
            LiftInfo elevatorInfo = elevatorInfos.Find(s => s.liftId.Equals(clientStatus.liftId));
            if (elevatorInfo == null)
            {
                msg = $"系统不存在该电梯标识:{clientStatus.liftId}";
                return new Status();
            }
            return elevatorInfo.Status;
        }

        /// <summary>
        /// 小车离开
        /// </summary>
        /// <param name="doorInfo"></param>
        /// <param name="msg"></param>
        public static void AGVLeave(DoorInfo doorInfo, out string msg)
        {
            msg = "ok";
            if (elevatorInfos.Count == 0)
            {
                msg = "系统未添加电梯信息";
                return;
            }
            LiftInfo elevatorInfo = elevatorInfos.Find(s => s.liftId.Equals(doorInfo.liftId));
            if (elevatorInfo == null)
            {
                msg = $"系统不存在该电梯标识:{doorInfo.liftId}";
                return;
            }
            bool rtn = elevatorInfo.AGVLeave(doorInfo);
            msg = rtn ? "ok" : "fail, " + elevatorInfo.OccupiedInfo();
            SaveLiftInfo();
        }

        /// <summary>
        /// 小车呼叫
        /// </summary>
        /// <param name="doorInfo"></param>
        /// <param name="msg"></param>
        public static void AGVCall(DoorInfo doorInfo, out string msg)
        {
            msg = "ok";
            if (elevatorInfos.Count == 0)
            {
                msg = "系统未添加电梯信息";
                return;
            }
            LiftInfo elevatorInfo = elevatorInfos.Find(s => s.liftId.Equals(doorInfo.liftId));
            if (elevatorInfo == null)
            {
                msg = $"系统不存在该电梯标识:{doorInfo.liftId}";
                return;
            }
            bool rtn = elevatorInfo.AGVCall(doorInfo);
            msg = rtn ? "ok" : "fail, " + elevatorInfo.OccupiedInfo();
            SaveLiftInfo();
        }

    }
}