TrayManager.cs 7.3 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace OnlineStore.DeviceLibrary
{
    public class TrayManager
    {
        /// <summary>
        /// 托盘集合,key=托盘编号,value=托盘详细信息
        /// </summary>
        private static ConcurrentDictionary<int, TrayInfo> TrayInfoMap = new ConcurrentDictionary<int, TrayInfo>();

        /// <summary>
        /// 最大托盘号,必须按照顺序从1到6走过
        /// </summary>
        internal static int MaxTrayNum = 0;
        /// <summary>
        /// 托盘错误消息
        /// </summary>
        public static string TrayErrorMsg = "";
        /// <summary>
        /// 盘错乱的StoreID
        /// </summary>
        public static int ErrorDeviceId = -1;

        static TrayManager()
        {
        }
        public static List<TrayInfo> getTrayList()
        {
            return new List<TrayInfo>(TrayInfoMap.Values);
        }
         
        internal static bool TrayIsFull(int trayNum)
        {
            if (TrayInfoMap.ContainsKey(trayNum))
            {
                return TrayInfoMap[trayNum].IsFull;
            }
            return false;
        }

        public static TrayInfo GetTrayInfo(int trayNum)
        {
            if (TrayInfoMap.ContainsKey(trayNum))
            {
                return TrayInfoMap[trayNum];
            }
            TrayInfo tray = new TrayInfo(trayNum, false, 0);

            return tray;
        }
        /// <summary>
        /// 获取已在托盘的,指定虚拟料架号剩余任务
        /// </summary>
        /// <param name="lastXuniRfid"></param>
        /// <returns></returns>
        internal static int GetOutTaskByRfid(string lastXuniRfid)
        {
            List<TrayInfo> alltray = new List<TrayInfo>(TrayInfoMap.Values);
            int count = (from m in alltray where m.IsFull && m.InOrOutStore.Equals(2) && m.InoutPar.rfid.Equals(lastXuniRfid) select m).Count();
            return count;
        }

        public static void UpdateTrayInfo(int trayNum, bool isFull = false, int inOrOut = 0, InOutParam param = null, string ngMsg = "")
        {
            if (TrayInfoMap.ContainsKey(trayNum))
            {
                TrayInfoMap[trayNum].IsFull = isFull;
                TrayInfoMap[trayNum].InOrOutStore = inOrOut;
                TrayInfoMap[trayNum].LastUpdateTime = DateTime.Now;
                if (param == null)
                {
                    param = new InOutParam();
                }
                TrayInfoMap[trayNum].InoutPar = param;
                TrayInfoMap[trayNum].ShowMsg = ngMsg;
            }
            else
            {
                TrayInfo fixture = new TrayInfo(trayNum, isFull, inOrOut, param, ngMsg);
                TrayInfoMap.TryAdd(trayNum, fixture);
            }
            SaveMapToFile();
        }

        public static void UpdateInStoreNG(int trayNum, bool isNg, string msg)
        {
            LogUtil.info("更新托盘【" + trayNum + "】InStoreNG=【" + isNg + "】NgMsg=【" + msg + "】");
            if (TrayInfoMap.ContainsKey(trayNum))
            {
                TrayInfoMap[trayNum].InoutPar.InStoreNg = isNg;
                TrayInfoMap[trayNum].ShowMsg = msg;
                TrayInfoMap[trayNum].LastUpdateTime = DateTime.Now;

                SaveMapToFile();
            }
        }

        /// <summary>
        /// 是否还有有料仓的盘
        /// </summary> 
        internal static bool IsHasFullTray()
        {
            foreach (int key in TrayInfoMap.Keys)
            {
                if (TrayInfoMap[key].IsFull)
                {
                    return true;
                }
            }
            return false;
        }

        public static bool NeedCheckTray = ConfigAppSettings.GetIntValue(Setting_Init.NeedCheckTray).Equals(1);
        internal static bool CheckIsRightNum(int trayNum, int preTrayNum, bool isCanUpdateMax = true)
        {
            if (!NeedCheckTray)
            {
                return true;
            }
            int defNext = preTrayNum + 1;
            if (preTrayNum.Equals(0) || MaxTrayNum.Equals(0) || trayNum.Equals(defNext))
            {
                if (isCanUpdateMax && trayNum > MaxTrayNum)
                {
                    MaxTrayNum = trayNum;
                    LogUtil.info("更新MaxTrayNum=" + preTrayNum);
                }
                return true;
            }
            else if (trayNum.Equals(1) && preTrayNum >= MaxTrayNum)
            {
                return true;
            }
            return false;
        }
        internal static bool RightTrayCode(int trayNum, int preTrayNum, bool isCanUpdateMax = true)
        {
            return true;
            return CheckIsRightNum(trayNum, preTrayNum, isCanUpdateMax);
        }

        internal static void UpdateTrayNumError(int errorStoreID, string errorMsg)
        {
            TrayErrorMsg = errorMsg;
            ErrorDeviceId = errorStoreID;
        }

        public static void ClearTrayInfo()
        {
            LogUtil.info("-------------------点击:清空托盘。清空前打印托盘信息:");
            List<TrayInfo> tray = TrayManager.getTrayList();
            foreach (TrayInfo t in tray)
            {
                LogUtil.info(t.ToStr());
            }
            TrayInfoMap = new ConcurrentDictionary<int, TrayInfo>();
            LogUtil.info("-------------------点击:清空托盘。托盘内容已清空");
        }


        private static string FilePath = "";
        public static void InitFileData()
        {
            TrayInfoMap = new ConcurrentDictionary<int, TrayInfo>();
            FilePath = Application.StartupPath + ConfigAppSettings.GetValue(Setting_Init.ConfigPath_TrayList);
            if (File.Exists(FilePath))
            {
                LogUtil.info("开始加载文件缓存托盘:" + FilePath);
                string[] lines = FileEncoding.GetFileLines(FilePath);
                foreach (string line in lines)
                {
                    TrayInfo tray = JsonHelper.DeserializeJsonToObject<TrayInfo>(line);
                    if (tray != null && tray.TrayNum > 0 && tray.IsFull)
                    {
                        LogUtil.info("加载到缓存托盘:" + tray.ToStr());
                        TrayInfoMap.TryAdd(tray.TrayNum, tray);
                    }
                }
                LogUtil.info("托盘加载完成");
            }
        }

        public static void SaveMapToFile()
        {
            try
            {
                List<TrayInfo> trayList = new List<TrayInfo>();
                List<string> lineList = new List<string>();
                foreach (TrayInfo tray in trayList)
                {
                    string line = JsonHelper.SerializeObject(tray);
                    if (!string.IsNullOrEmpty(line))
                    {
                        lineList.Add(line);
                    }
                }
                FileEncoding.WritteFile(FilePath, lineList.ToArray()); 
            }
            catch (Exception ex)
            {
                LogUtil.error("SaveTrayToFile出错:" + ex.ToString());
            }
        }

    }
}