| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 | using Aitex.Core.RT.Log;using Aitex.Core.Util;using MECF.Framework.Common.DBCore;using MECF.Framework.Common.ProcessCell;using System;using System.Collections.Generic;namespace MECF.Framework.Common.ToolLayout{    public class ReservoirUsageManager : Singleton<ReservoirUsageManager>    {        #region 内部变量        /// <summary>        /// Reservoir电量字典        /// </summary>        private Dictionary<string, ReservoirUsage> _reservoirUsageDictionary = new Dictionary<string, ReservoirUsage>();        /// <summary>        /// Reservoir 锁字典        /// </summary>        private Dictionary<string, object> _reservoirLockDictionary = new Dictionary<string, object>();        #endregion        /// <summary>        /// 初始化        /// </summary>        public void Initialize()        {            List<ReservoirUsage> reservoirUsages = ReservoirUsageRecorder.GetAllReservoirUsages();            foreach (var item in reservoirUsages)            {                _reservoirUsageDictionary[item.ReservoirName] = item;            }            List<string> installedReservoirs = ReservoirItemManager.Instance.InstalledModules;            foreach (string item in installedReservoirs)            {                _reservoirLockDictionary[item] = new object();            }        }        /// <summary>        /// 更新Reservoir的用量        /// </summary>        /// <param name="metalName"></param>        /// <param name="usage"></param>        public void UpdateReservoirUsage(string reservoirName, double anodeAUsage, double anodeBUsage, int waferCount)        {            if (!_reservoirLockDictionary.ContainsKey(reservoirName))            {                LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");                return;            }            lock (_reservoirLockDictionary[reservoirName])            {                bool isAdd = false;                ReservoirUsage reservoirUsage = null;                if (!_reservoirUsageDictionary.ContainsKey(reservoirName))                {                    reservoirUsage = new ReservoirUsage();                    reservoirUsage.ReservoirName = reservoirName;                    _reservoirUsageDictionary[reservoirName] = reservoirUsage;                    isAdd = true;                }                else                {                    reservoirUsage = _reservoirUsageDictionary[reservoirName];                }                reservoirUsage.TotalUsage += anodeAUsage + anodeBUsage;                reservoirUsage.BathUsage += anodeAUsage + anodeBUsage;                reservoirUsage.AnodeUsage += anodeAUsage + anodeBUsage;                reservoirUsage.MembranceUsage += anodeAUsage + anodeBUsage;                reservoirUsage.TotalWafers += waferCount;                DateTime now = DateTime.Now;                if (isAdd)                {                    reservoirUsage.BathUsageDays = 0;                    reservoirUsage.BathResetTime = now;                    ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);                }                else                {                    int days = (int)Math.Floor(now.Subtract(reservoirUsage.BathResetTime).TotalDays);                    if (days >= reservoirUsage.BathUsageDays)                    {                        reservoirUsage.BathUsageDays = days;                    }                    ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);                }            }        }        /// <summary>        /// 在PMCounter页面手动修改值        /// </summary>        /// <param name="metalName"></param>        public void UpdateReservoirUsageByManualOperation(string reservoirName, string CounterName, string NewValue)        {            if (_reservoirUsageDictionary.ContainsKey(reservoirName))            {                switch (CounterName)                {                    case "Total Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].TotalUsage = double.Parse(NewValue); break;                    case "Bath Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].BathUsage = double.Parse(NewValue); break;                    case "Anolyte Bath Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].AnodeUsage = double.Parse(NewValue); break;                    case "Bath Usage(Days)":                        _reservoirUsageDictionary[reservoirName].BathUsageDays = int.Parse(NewValue);                        _reservoirUsageDictionary[reservoirName].BathResetTime = DateTime.Now;                        break;                    case "Membrane Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].MembranceUsage = double.Parse(NewValue); break;                    case "Total Wafers":                        _reservoirUsageDictionary[reservoirName].TotalWafers = int.Parse(NewValue); break;                    case "CMM Anode Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].CMMAnodeUsage = double.Parse(NewValue); break;                    case "CMM Cathode Usage(AHr)":                        _reservoirUsageDictionary[reservoirName].CMMMembranceUsage = double.Parse(NewValue); break;                }                ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, _reservoirUsageDictionary[reservoirName]);            }        }        /// <summary>        /// 获取Reservoir用量        /// </summary>        /// <param name="metalName"></param>        /// <returns></returns>        public ReservoirUsage GetReservoirUsage(string reservoirName)        {            return _reservoirUsageDictionary.ContainsKey(reservoirName) ? _reservoirUsageDictionary[reservoirName] : null;        }        /// <summary>        /// 更新CMMPowerUsage        /// </summary>        /// <param name="reservoirName"></param>        /// <param name="cmmUsage"></param>        public void UpdateReservoirCMMUsage(string reservoirName, double cmmUsage)        {            if (!_reservoirLockDictionary.ContainsKey(reservoirName))            {                LOG.WriteLog(eEvent.WARN_RESERVOIR, reservoirName, $"reservoir {reservoirName} usage has no locker");                return;            }            lock (_reservoirLockDictionary[reservoirName])            {                bool isAdd = false;                ReservoirUsage reservoirUsage = null;                if (!_reservoirUsageDictionary.ContainsKey(reservoirName))                {                    reservoirUsage = new ReservoirUsage();                    reservoirUsage.ReservoirName = reservoirName;                    _reservoirUsageDictionary[reservoirName] = reservoirUsage;                    isAdd = true;                }                else                {                    reservoirUsage = _reservoirUsageDictionary[reservoirName];                }                reservoirUsage.CMMAnodeUsage += cmmUsage;                reservoirUsage.CMMMembranceUsage += cmmUsage;                DateTime now = DateTime.Now;                if (isAdd)                {                    reservoirUsage.BathUsageDays = 0;                    reservoirUsage.BathResetTime = now;                    ReservoirUsageRecorder.AddReservoirUsage(reservoirUsage);                }                else                {                    ReservoirUsageRecorder.UpdateReservoirUsageData(reservoirName, reservoirUsage);                }            }        }    }}
 |