using DevExpress.Mvvm; using DevExpress.Utils.DirectXPaint; using DevExpress.Xpo; using DevExpress.XtraDiagram.Base; using Ips.Library.Basic; using Ips.Library.Entity; using Ips.Sps.TskResults.Poses; using Ips.Sps.Tsks; using Ips.Sps.Tsks.Commands; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Sps.Store { public class PosStore { public static readonly PosStore Default = new PosStore(); public PosStore() { _posManager = PosManager.Default; QueryModel = new PosQueryModel() { TskId = TskManager.Default.SelectTskId, SigId = TskManager.Default.SelectSigId, LastHours = 1, ShowNotValidPoint = false }; ResigiterRecvMsg(); } public event EventHandler ListFilterChanged; PosManager _posManager; public PosQueryModel QueryModel { get; private set; } private static readonly object obj = new object(); private BindingList _posList = new BindingList(); public BindingList List => _posList; public IEnumerable FilterPosIds { get; private set; } private long _gridSelectPosId; public long GridSelectPosId => _gridSelectPosId; private long _mapSelectPosId; public long MapSeLectPosId => _mapSelectPosId; private string _msgToken; public void GetAll() { lock (obj) { var list = _posManager.GetAll(QueryModel); _posList.Clear(); foreach (var item in list) { _posList.Add(item); } } } public void Insert(IEnumerable posList) { if (posList.IsNullOrEmpty()) return; lock (obj) { var posIds = posList.Select(m => m.Id).ToArray(); var posQuery = _posManager.GetSession().Query().Where(m => posIds.Contains(m.Id)); var _list = _posManager.CreateFilter(posQuery, QueryModel).ToList(); foreach (var posItem in _list) { //_posList.Insert(0, posItem); _posList.Add(posItem); } } } public void Delete(int[] idxs) { var posIds = new long[idxs.Length]; lock (obj) { Array.Sort(idxs); for (int i = idxs.Length - 1; i >= 0; i--) { var idx = idxs[i]; if (idx < 0) continue; var pos = _posList[idx]; _posList.RemoveAt(idx); posIds[i] = pos.Id; } } _posManager.DeleteByIds(posIds); } public void UseMirr(int[] idxs) { var posIds = new long[idxs.Length]; lock (obj) { for (int i = 0; i < idxs.Length; i++) { var idx = idxs[i]; var pos = _posList[idx]; pos.UseMirrPos(); _posList.ResetItem(idx); posIds[i] = pos.Id; } } _posManager.DeleteByIds(posIds); } public void SetValid(int[] idxs, bool isvalid) { var posIds = new long[idxs.Length]; lock (obj) { for (int i = 0; i < idxs.Length; i++) { var idx = idxs[i]; var pos = _posList[idx]; pos.IsValid = isvalid; _posList.ResetItem(idx); posIds[i] = pos.Id; } } _posManager.GetSession().ExecuteNonQuery($"update pos set isvalid={isvalid} where id in ({string.Join(',', posIds)})"); } public void SetGridSelectPosId(long posId) { _gridSelectPosId = posId; Messenger.Default.Send(new PosSelectedChangedMessage(posId), "list"); } public void ShowPosListByIds(IEnumerable posIds) { FilterPosIds = posIds; ListFilterChanged.InvokeSafely(this); } public void SetMapSelectPosId(long posId) { _mapSelectPosId = posId; Messenger.Default.Send(new PosSelectedChangedMessage(posId), "map"); } private void ResigiterRecvMsg() { Messenger.Default.Register(this, TskSelectChanged); } private void TskSelectChanged(TskSelectedMessage msg) { QueryModel.TskId = msg.TskId; QueryModel.SigId = msg.SigId; string msgToken = ""; if (QueryModel.SigId > 0) { msgToken = $"{QueryModel.TskId}_{QueryModel.SigId}"; } else if (QueryModel.TskId > 0) { msgToken = $"{QueryModel.TskId}"; } Messenger.Default.Unregister(this, _msgToken, OnPosListChanged); GetAll(); Messenger.Default.Register(this, msgToken, OnPosListChanged); _msgToken = msgToken; } private void OnPosListChanged(PosListChangedMessage msg) { switch (msg.ChangeType) { case DataChangeType.Insert: Insert(msg.PosList); break; case DataChangeType.Update: break; case DataChangeType.Delete: break; } } } }