using DTO; using HKCardOUT.Helper; using HKCardOUT.Logic.Model; using HKCardOUT.Logic.Service; using NStandard; using SqlSugar.DistributedSystem.Snowflake; using Stylet; using StyletIoC; using System; using System.Collections.ObjectModel; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Documents; using UHFHelper; using XExten.Advance.CacheFramework; using XExten.Advance.CacheFramework.RunTimeCache; using XExten.Advance.LinqFramework; namespace HKCardOUT.ViewModels { public class RootViewModel : Conductor { public delegate void ReadCardFunc(DKoutput? input); public event ReadCardFunc ReadFunc; private readonly object locker = new object(); private IContainer Container; public RootViewModel(IContainer Container) { this.Container = Container; MainThread(); } protected override void OnViewLoaded() { System.Timers.Timer timer = new System.Timers.Timer(500); timer.Enabled = true; timer.Elapsed += (s, e) => { Result = new ObservableCollection(this.Container.Get().PullDaySaleLog()); }; timer.Start(); //广告初始化 var Init = DataBus.StoreInfo?.Devices.Join(DataBus.StoreInfo?.Stalls, t => t.GateId, x => x.Id, (t, x) => new AdDTO { Ad = x.Remaek, IsActive = false, Device = t.Name, Stalls = x.Name }).ToList(); if (Init != null) Ad = new ObservableCollection(Init); } #region 属性 ObservableCollection _Result; public ObservableCollection Result { get => _Result; set => SetAndNotify(ref _Result, value); } ObservableCollection _Ad; public ObservableCollection Ad { get => _Ad; set => SetAndNotify(ref _Ad, value); } #endregion #region 方法 private void MainThread() { ReadFunc -= ReadCard; ReadFunc += ReadCard; ThreadManage.GetInstance().StartLong(new Action(() => { try { //1.检测网络上下线 bool network = HKHelpers.GetInstance().GetNetworkState(); if (network != DataBus.NetWordState) { if (network) HandyControl.Controls.Growl.InfoGlobal("网络连接成功"); else HandyControl.Controls.Growl.InfoGlobal("系统已离线,请连接网络!!!"); DataBus.NetWordState = network; } Thread.Sleep(3000); } catch (Exception ex) { HandyControl.Controls.Growl.InfoGlobal(ex.Message); } }), "循环状态监测线程", false); try { // 初始化 串口 UHF_RS485_Helper.GetInstance().Open(new SerialParam { PortName = DataBus.COM, BaudRate = 57600, DataBits = 8 }); } catch (Exception) { HandyControl.Controls.Growl.WarningGlobal("未接入相应设备"); } if (!UHF_RS485_Helper.GetInstance().GetSerialPortState()) HandyControl.Controls.Growl.InfoGlobal("串口打开失败"); DataBus.StoreInfo.Devices.ForEach(item => { System.Timers.Timer timer = new System.Timers.Timer(500); timer.Enabled = true; timer.Elapsed += (sender, eve) => { if (!UHF_RS485_Helper.GetInstance().GetSerialPortState()) return; else { var res = UHF_RS485_Helper.GetInstance().ReadCard(item.Address.AsInt()).Result; if (res != null) { if (!res.ResData.IsMatch(new Regex("0{20}"))) ReadFunc?.Invoke(res); } } }; timer.Start(); }); } #endregion #region 命令 /// /// 广告位置 /// /// public void UpdateAction(AdDTO input) { input.IsActive = !input.IsActive; var SC = System.Windows.Forms.Screen.AllScreens.Count(); if (SC >= 1) { if (input.IsActive) { if (!DataBus.AdStatus.ContainsKey(input.Device)) { var win = new Views.AdWindow(input.Ad); DataBus.AdStatus.Add(input.Device, win); win.Show(); } } else { if (DataBus.AdStatus.ContainsKey(input.Device)) { DataBus.AdStatus[input.Device].Close(); DataBus.AdStatus.Remove(input.Device); } } } } public void ReadCard(DKoutput input) { lock (locker) { Container.Get().DeviceSale(new SaleLog { CardNo = input.ResData.Substring(1, input.ResData.Length - 1), Location = input.Address.AsInt().ToString() }); } } #endregion } }