using Rhea.Common; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; namespace Tiger.Business.DbCache { /// /// 不良代码数据库数据缓存 /// public class MesDefectCache : IMesDefectCache { #region Variables private WhileThread AutoUpdateThread; private DateTime LastUpdateTime = DateTime.MinValue; #endregion #region Propertys public string Id { get; set; } = Guid.NewGuid().ToString("N"); public string Tag { get; set; } = "MesDefectCache"; public string Name { get; set; } = "MesDefectCache"; public bool IsRunning { get; set; } private List _groups = new(); public List Groups { get { Update(); return _groups; } set => _groups = value; } private List _defects = new(); public List Defects { get { Update(); return _defects; } set => _defects = value; } public BAS_DEFECT this[string code, string group = null] { get { Update(); return _defects.FirstOrDefault(q => q.DFT_CODE == code && (group.IsNullOrEmpty() || q.DFTG_CODE == group)); } } #endregion #region Functions /// /// 启动自动更新缓存 /// public void Start() { try { AutoUpdateThread = new(AutoUpdate); AutoUpdateThread.Start(); Logger.Default.Info("Start MesDefect Cache Auto Update Thread"); } catch (System.Exception ex) { Logger.Default.Fatal(ex, "Start MesDefect Cache Auto Update Thread Exception"); } } /// /// 关闭自动更新缓存 /// public void Stop() { try { AutoUpdateThread?.Stop(); Logger.Console.Info("Stop MesDefect Cache Auto Update Thread"); } catch (System.Exception ex) { Logger.Console.Fatal(ex, "Stop MesDefect Cache Auto Update Thread Exception"); } } /// /// 更新数据缓存 /// public void Update() { var lastUpdate = Biz.Db.Queryable().Max(q => q.UPDATE_TIME); if (LastUpdateTime < lastUpdate) { _groups = Biz.Db.Queryable().IncludesAllFirstLayer().ToList(); var defectList = new List(); foreach (var group in _groups) { defectList.AddRange(group.Defects); } _defects = defectList; LastUpdateTime = defectList.Max(q => q.UPDATE_TIME); Logger.Console.Info($"Get MesDefect successful, total {Defects.Count} params in {Groups.Count} groups, last update time is {LastUpdateTime:yyyy-MM-dd HH:mm:ss}"); } } /// /// 自动更新 /// private void AutoUpdate() { try { Update(); } catch (System.Exception ex) { Logger.Console.Fatal(ex, "MesDefect Cache Auto Update Exception"); LastUpdateTime = DateTime.MinValue; } //休眠30分钟 Thread.Sleep(30 * 60 * 1000);// } #endregion } }