TrayManager.cs 6.2 KB
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    public partial class TrayManager
    {
        public static Dictionary<string,TrayInfo> Traylist = new Dictionary<string,TrayInfo>();
        /// <summary>
        /// 处理更新托盘信息
        /// </summary>
        /// <param name="rfid"></param>
        /// <param name="addr"></param>
        /// <param name="trayInfo"></param>
        /// <returns>是否放行 放行true, 拦截false</returns>
        public static bool Process(string rfid, int addr, out TrayInfo trayInfo) {
            lock (Traylist)
            {
                LogUtil.info($"处理RFID:{rfid},地址{addr},设备:{AddrDesc[addr]}");
                if (!Traylist.ContainsKey(rfid))
                {
                    Traylist.Add(rfid, new TrayInfo());
                    Traylist[rfid].RFID = rfid;
                }
                Traylist[rfid].LastUpdateTime = DateTime.Now;
                Traylist[rfid].LastAddr = addr;
                Traylist[rfid].Destination = TrayManager.AddrDesc[Traylist[rfid].DestinationAddr];
                Traylist[rfid].LastPosition = TrayManager.AddrDesc[Traylist[rfid].LastAddr];

                trayInfo = Traylist[rfid];
                Statistics();
            }
            return true;
        }
        /// <summary>
        /// 空托盘数量
        /// </summary>
        public static int EmptyCount;
        /// <summary>
        /// 入库托盘数量
        /// </summary>
        public static int InStoreCount;
        /// <summary>
        /// 出库托盘数量
        /// </summary>
        public static int OutStoreCount;
        /// <summary>
        /// 离线托盘数量
        /// </summary>
        public static int OfflineCount;
        public static int TotalCount{ get => EmptyCount + InStoreCount + OutStoreCount; }

        static DateTime lastrefresh;
        public static void Statistics() {
            EmptyCount = 0;
            InStoreCount = 0;
            OutStoreCount = 0;
            OfflineCount = 0;
            lastrefresh = DateTime.Now;
            Traylist.Values.ToList().ForEach(ti=> {
                if ((lastrefresh - ti.LastUpdateTime).TotalSeconds > 10)
                {
                    ti.isOnline = false;
                    OfflineCount++;
                }
                if (ti.HasLoad) {
                    if (ti.Direction == DirectionE.In)
                        InStoreCount++;
                    else
                        OutStoreCount++;
                } else {
                    EmptyCount++;
                }            
            });
        }
    }

    public class TrayInfo {
        string _rfid;
        public string RFID { get => _rfid; set {
                try
                {
                    var ss = Enum.GetNames(typeof(TrayTypeE));
                    TrayType = (TrayTypeE)Enum.Parse(typeof(TrayTypeE), ss.ToList().Find(s => value.StartsWith(s)));
                    _rfid = value;
                }
                catch (Exception ex) {
                    LogUtil.error($"获取RFID的类型时出错:{value}");
                }
            }
        }
        public string Destination;
        public int DestinationAddr=-1;
        public int LastAddr=-1;
        public string LastPosition;
        public bool HasLoad { get => LoadType == LoadTypeE.None; }
        public LoadTypeE LoadType = LoadTypeE.None;
        public TrayTypeE TrayType;
        public DateTime LastUpdateTime;
        public ReelParam ReelParam;
        public DirectionE Direction { get => (Destination == "AMH-ML5-1" || Destination == "AMH-ML5-2") ? DirectionE.Out : DirectionE.In; }
        public bool isOnline = true;
    }
    public enum LoadTypeE {
        None,
        MTP2,    //流水线治具托盘
        MTP1,    //流水线料盘托盘
        S007,    //料串
        M03,    //Tray料格
        M02,    //PCB料格
        M01,    //PizzaBOX料格
        M04,    //ShoeBOX料格
    }
    public enum TrayTypeE
    {
        C01,    //PCB治具
        C02,    //Pizza治具
        C03,    //Tray治具
        C04,    //ShoeBOX治具
    }
    public enum DirectionE
    {
        In,Out
    }
    public partial class TrayManager
    {
        public static Dictionary<LoadTypeE, string> LoadTypeDesc = new Dictionary<LoadTypeE, string>();
        public static Dictionary<TrayTypeE, string> TrayTypeDesc = new Dictionary<TrayTypeE, string>();
        public static Dictionary<int, string> AddrDesc = new Dictionary<int, string>();
        static TrayManager() {
            LoadTypeDesc.Add(LoadTypeE.None, crc.GetString("Res0002","空"));
            LoadTypeDesc.Add(LoadTypeE.MTP2, crc.GetString("Res0003","流水线治具托盘"));
            LoadTypeDesc.Add(LoadTypeE.MTP1, crc.GetString("Res0004","流水线料盘托盘"));
            LoadTypeDesc.Add(LoadTypeE.S007, crc.GetString("Res0005","料串"));
            LoadTypeDesc.Add(LoadTypeE.M03, crc.GetString("Res0006","Tray料格"));
            LoadTypeDesc.Add(LoadTypeE.M02, crc.GetString("Res0007","PCB料格"));
            LoadTypeDesc.Add(LoadTypeE.M01, crc.GetString("Res0008","PizzaBOX料格"));
            LoadTypeDesc.Add(LoadTypeE.M04, crc.GetString("Res0009","ShoeBOX料格"));
            TrayTypeDesc.Add(TrayTypeE.C01, crc.GetString("Res0010","PCB治具"));
            TrayTypeDesc.Add(TrayTypeE.C02, crc.GetString("Res0011","Pizza治具"));
            TrayTypeDesc.Add(TrayTypeE.C03, crc.GetString("Res0012","Tray治具"));
            TrayTypeDesc.Add(TrayTypeE.C04, crc.GetString("Res0013","ShoeBOX治具"));

        }
        public static void Init(Dictionary<string, DeviceGroup> deviceGroup) {
            foreach (var dg in deviceGroup) {
                AddrDesc.Add(-1, crc.GetString("Res0014","未知"));
                if (dg.Value.addr_2 >= 0)
                {
                    AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName + "-1");
                    AddrDesc.Add(dg.Value.addr_2, dg.Value.GroupName + "-2");
                }
                else {
                    AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName);
                }
            }
        }
    }
}