public void Update(CoinSnapshotData data) { this.Speed = data.Speed; this.MainCoinMiningCount = data.MainCoinMiningCount; this.MainCoinOnlineCount = data.MainCoinOnlineCount; this.Timestamp = data.Timestamp; }
private CoinSnapshotDataViewModels() { if (WpfUtil.IsInDesignMode) { return; } foreach (var coinVm in AppRoot.CoinVms.AllCoins) { _dicByCoinCode.Add(coinVm.Code, new CoinSnapshotDataViewModel(CoinSnapshotData.CreateEmpty(coinVm.Code))); } }
private void Snapshot(List <ClientCoinSnapshotData> clientCoinSpeedList, DateTime timestamp) { InitOnece(); Dictionary <string, List <ClientCoinSnapshotData> > clientCoinSpeedDic = clientCoinSpeedList.GroupBy(a => a.CoinCode).ToDictionary(a => a.Key, a => a.ToList()); List <CoinSnapshotData> data = new List <CoinSnapshotData>(); lock (_locker) { foreach (var item in clientCoinSpeedDic) { Dictionary <Guid, ClientCoinSnapshotData> dic = new Dictionary <Guid, ClientCoinSnapshotData>(); foreach (var clientCoinSnapshotData in item.Value) { if (!dic.ContainsKey(clientCoinSnapshotData.ClientId)) { dic.Add(clientCoinSnapshotData.ClientId, clientCoinSnapshotData); } else { dic[clientCoinSnapshotData.ClientId] = clientCoinSnapshotData; } } long speed = dic.Values.Sum(a => a.Speed); int shareDelta = dic.Values.Sum(a => a.ShareDelta); CoinSnapshotData snapshotdData = new CoinSnapshotData { Id = ObjectId.NewObjectId(), CoinCode = item.Key, MainCoinMiningCount = _root.ClientSet.CountMainCoinMining(item.Key), MainCoinOnlineCount = _root.ClientSet.CountMainCoinOnline(item.Key), DualCoinMiningCount = _root.ClientSet.CountDualCoinMining(item.Key), DualCoinOnlineCount = _root.ClientSet.CountDualCoinOnline(item.Key), Timestamp = timestamp, ShareDelta = shareDelta, Speed = speed }; data.Add(snapshotdData); } _dataList.AddRange(data); DateTime time = timestamp.AddMinutes(-20); List <CoinSnapshotData> toRemoves = _dataList.Where(a => a.Timestamp < time).ToList(); foreach (var item in toRemoves) { _dataList.Remove(item); } } if (data.Count > 0) { using (LiteDatabase db = HostRoot.CreateReportDb()) { var col = db.GetCollection <CoinSnapshotData>(); col.Insert(data); } Global.Logger.InfoDebugLine("拍摄快照" + data.Count + "张,快照时间戳:" + timestamp.ToString("yyyy-MM-dd HH:mm:ss fff")); } }
private CoinSnapshotDataViewModels() { if (WpfUtil.IsInDesignMode) { return; } #if DEBUG NTStopwatch.Start(); #endif foreach (var coinVm in AppRoot.CoinVms.AllCoins) { _dicByCoinCode.Add(coinVm.Code, new CoinSnapshotDataViewModel(CoinSnapshotData.CreateEmpty(coinVm.Code))); } #if DEBUG var elapsedMilliseconds = NTStopwatch.Stop(); if (elapsedMilliseconds.ElapsedMilliseconds > NTStopwatch.ElapsedMilliseconds) { Write.DevTimeSpan($"耗时{elapsedMilliseconds} {this.GetType().Name}.ctor"); } #endif }
/// <summary> /// /// </summary> private void Snapshot(DateTime now) { InitOnece(); try { int onlineCount = 0; int miningCount = 0; Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>(); foreach (var clientData in _root.ClientSet.AsEnumerable()) { if (HostRoot.Instance.HostConfig.IsPull) { if (clientData.ModifiedOn.AddSeconds(15) < now) { continue; } } else { if (clientData.ModifiedOn.AddSeconds(130) < now) { continue; } } onlineCount++; if (string.IsNullOrEmpty(clientData.MainCoinCode)) { continue; } if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData)) { mainCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.MainCoinCode }; dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData); } if (clientData.IsMining) { miningCount++; mainCoinSnapshotData.MainCoinMiningCount += 1; mainCoinSnapshotData.Speed += clientData.MainCoinSpeed; mainCoinSnapshotData.ShareDelta += clientData.GetMainCoinShareDelta(HostRoot.Instance.HostConfig.IsPull); mainCoinSnapshotData.RejectShareDelta += clientData.GetMainCoinRejectShareDelta(HostRoot.Instance.HostConfig.IsPull); } mainCoinSnapshotData.MainCoinOnlineCount += 1; if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled) { if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData)) { dualCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.DualCoinCode }; dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData); } if (clientData.IsMining) { dualCoinSnapshotData.DualCoinMiningCount += 1; dualCoinSnapshotData.Speed += clientData.DualCoinSpeed; dualCoinSnapshotData.ShareDelta += clientData.GetDualCoinShareDelta(HostRoot.Instance.HostConfig.IsPull); dualCoinSnapshotData.RejectShareDelta += clientData.GetDualCoinRejectShareDelta(HostRoot.Instance.HostConfig.IsPull); } dualCoinSnapshotData.DualCoinOnlineCount += 1; } } HostRoot.ClientCount.Update(onlineCount, miningCount); if (dicByCoinCode.Count > 0) { _dataList.AddRange(dicByCoinCode.Values); using (LiteDatabase db = HostRoot.CreateReportDb()) { var col = db.GetCollection <CoinSnapshotData>(); col.Insert(dicByCoinCode.Values); } Write.DevDebug("拍摄快照" + dicByCoinCode.Count + "张,快照时间戳:" + now.ToString("yyyy-MM-dd HH:mm:ss fff")); } } catch (Exception e) { Logger.ErrorDebugLine(e); } }
/// <summary> /// /// </summary> /// <param name="user">传null表示是内网群控调用</param> /// <param name="query"></param> /// <param name="total"></param> /// <param name="coinSnapshots"></param> /// <param name="onlineCount"></param> /// <param name="miningCount"></param> /// <returns></returns> public List <ClientData> QueryClients( IUser user, QueryClientsRequest query, out int total, out CoinSnapshotData[] coinSnapshots, out int onlineCount, out int miningCount) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); coinSnapshots = new CoinSnapshotData[0]; onlineCount = 0; miningCount = 0; if (!IsReadied || query == null) { total = 0; return(new List <ClientData>()); } List <ClientData> list = new List <ClientData>(); ClientData[] data = null; bool isIntranet = user == null; if (isIntranet) { data = _dicByObjectId.Values.ToArray(); } else if (user.IsAdmin()) { data = _dicByObjectId.Values.ToArray(); } else { string loginName = user.LoginName; if (string.IsNullOrEmpty(loginName)) { total = 0; return(new List <ClientData>()); } if (!_clientDatasByLoginName.TryGetValue(loginName, out ClientDatas clientDatas)) { clientDatas = new ClientDatas(loginName, _dicByObjectId.Values.Where(a => a.LoginName == loginName).ToList()); _clientDatasByLoginName[loginName] = clientDatas; } data = clientDatas.Datas; } bool isFilterByGroup = query.GroupId.HasValue && query.GroupId.Value != Guid.Empty; bool isFilterByMinerIp = !string.IsNullOrEmpty(query.MinerIp); bool isFilterByMinerName = !string.IsNullOrEmpty(query.MinerName); bool isFilterByVersion = !string.IsNullOrEmpty(query.Version); bool isFilterByWork = query.WorkId.HasValue && query.WorkId.Value != Guid.Empty; bool isFilterByCoin = !isFilterByWork && !string.IsNullOrEmpty(query.Coin); bool isFilterByPool = !isFilterByWork && !string.IsNullOrEmpty(query.Pool); bool isFilterByWallet = !isFilterByWork && !string.IsNullOrEmpty(query.Wallet); bool isFilterByKernel = !isFilterByWork && !string.IsNullOrEmpty(query.Kernel); bool isFilterByGpuType = query.GpuType != GpuType.Empty; bool isFilterByGpuName = !string.IsNullOrEmpty(query.GpuName); bool isFilterByGpuDriver = !string.IsNullOrEmpty(query.GpuDriver); for (int i = 0; i < data.Length; i++) { var item = data[i]; bool isInclude = true; if (isInclude && isFilterByGroup) { isInclude = item.GroupId == query.GroupId.Value; } if (isInclude) { switch (query.MineState) { case MineStatus.All: break; case MineStatus.Mining: isInclude = item.IsMining == true; break; case MineStatus.UnMining: isInclude = item.IsMining == false; break; default: break; } } if (isInclude && isFilterByMinerIp) { isInclude = !string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp); if (!isInclude) { if (query.MinerIp.IndexOf(':') != -1) { isInclude = query.MinerIp.Equals(item.MinerIp); } else if (!string.IsNullOrEmpty(item.MinerIp)) { // MinerIp可能带有端口号 int index = item.MinerIp.IndexOf(':'); string minerIp = item.MinerIp; if (index != -1) { minerIp = minerIp.Substring(0, index); } isInclude = query.MinerIp.Equals(minerIp); } } } if (isInclude && isFilterByMinerName) { isInclude = (!string.IsNullOrEmpty(item.MinerName) && item.MinerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1) || (!string.IsNullOrEmpty(item.WorkerName) && item.WorkerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1); } if (isInclude && isFilterByVersion) { isInclude = !string.IsNullOrEmpty(item.Version) && item.Version.Contains(query.Version); } if (isInclude) { if (isFilterByWork) { isInclude = item.WorkId == query.WorkId.Value; } else { if (isInclude && isFilterByCoin) { isInclude = query.Coin.Equals(item.MainCoinCode) || query.Coin.Equals(item.DualCoinCode); } if (isInclude && isFilterByPool) { isInclude = query.Pool.Equals(item.MainCoinPool) || query.Pool.Equals(item.DualCoinPool); } if (isInclude && isFilterByWallet) { isInclude = query.Wallet.Equals(item.MainCoinWallet) || query.Wallet.Equals(item.DualCoinWallet); } if (isInclude && isFilterByKernel) { isInclude = !string.IsNullOrEmpty(item.Kernel) && item.Kernel.IgnoreCaseContains(query.Kernel); } } } if (isInclude && isFilterByGpuType) { isInclude = item.GpuType == query.GpuType; } if (isInclude && isFilterByGpuName) { isInclude = !string.IsNullOrEmpty(item.GpuInfo) && item.GpuInfo.IgnoreCaseContains(query.GpuName); } if (isInclude && isFilterByGpuDriver) { isInclude = !string.IsNullOrEmpty(item.GpuDriver) && item.GpuDriver.IgnoreCaseContains(query.GpuDriver); } if (isInclude) { list.Add(item); } } total = list.Count(); list.Sort(new ClientDataComparer(query.SortDirection, query.SortField)); coinSnapshots = VirtualRoot.CreateCoinSnapshots(_isPull, DateTime.Now, data, out onlineCount, out miningCount).ToArray(); var results = list.Take(query).ToList(); DateTime time = DateTime.Now.AddSeconds(_isPull ? -20 : -180); // 一定时间未上报算力视为0算力 foreach (var clientData in results) { if (clientData.MinerActiveOn < time) { clientData.DualCoinSpeed = 0; clientData.MainCoinSpeed = 0; } } stopwatch.Stop(); _queryClientsMilliseconds.Enqueue(stopwatch.ElapsedMilliseconds); while (_queryClientsMilliseconds.Count > 100) { _queryClientsMilliseconds.Dequeue(); } return(results); }
private void RefreshTotalSpeedChart(int limit) { //NTMinerRoot.Current.DebugLine($"获取总算力数据,范围{leftTime} - {rightTime}"); RpcRoot.Server.ControlCenterService.GetLatestSnapshotsAsync( limit, (response, exception) => { if (response == null) { return; } if (!response.IsSuccess()) { Write.UserFail(response.ReadMessage(exception)); return; } UIThread.Execute(() => { bool isOnlyOne = limit == 1; Vm.TotalMiningCount = response.TotalMiningCount; Vm.TotalOnlineCount = response.TotalOnlineCount; foreach (var chartVm in Vm.ChartVms) { var list = response.Data.Where(a => a.CoinCode == chartVm.CoinVm.Code).ToList(); if (list.Count == 0) { list.Add(new CoinSnapshotData { CoinCode = chartVm.CoinVm.Code, DualCoinOnlineCount = 0, DualCoinMiningCount = 0, MainCoinOnlineCount = 0, MainCoinMiningCount = 0, RejectShareDelta = 0, ShareDelta = 0, Speed = 0, Timestamp = DateTime.Now.AddSeconds(-5) }); } CoinSnapshotData one = null; if (isOnlyOne) { one = list.Last(); } else { list = list.OrderBy(a => a.Timestamp).ToList(); } CoinSnapshotData latestData = list.Last(); chartVm.SnapshotDataVm.Update(latestData); foreach (var riser in chartVm.Series) { if (riser.Title == "speed") { if (list.Count > 0) { if (isOnlyOne) { riser.Values.Add(new MeasureModel() { DateTime = one.Timestamp, Value = one.Speed }); } else { foreach (var item in list) { riser.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.Speed }); } } } } else if (riser.Title == "onlineCount") { if (isOnlyOne) { riser.Values.Add(new MeasureModel() { DateTime = one.Timestamp, Value = one.MainCoinOnlineCount + one.DualCoinOnlineCount }); } else { foreach (var item in list) { riser.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinOnlineCount + item.DualCoinOnlineCount }); } } } else if (riser.Title == "miningCount") { if (isOnlyOne) { riser.Values.Add(new MeasureModel() { DateTime = one.Timestamp, Value = one.MainCoinMiningCount + one.DualCoinMiningCount }); } else { foreach (var item in list) { riser.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinMiningCount + item.DualCoinMiningCount }); } } } else if (riser.Title == "rejectShare") { if (isOnlyOne) { riser.Values.Add(new MeasureModel() { DateTime = one.Timestamp, Value = one.RejectShareDelta }); } else { foreach (var item in list) { riser.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.RejectShareDelta }); } } } else if (riser.Title == "acceptShare") { if (isOnlyOne) { riser.Values.Add(new MeasureModel() { DateTime = one.Timestamp, Value = one.ShareDelta }); } else { foreach (var item in list) { riser.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.ShareDelta }); } } } } DateTime now = DateTime.Now.AddSeconds(10); foreach (var riser in chartVm.Series) { IChartValues valuesTotal = riser.Values; if (valuesTotal.Count > 0 && ((MeasureModel)valuesTotal[0]).DateTime.AddMinutes(NTMinerRoot.SpeedHistoryLengthByMinute) < now) { valuesTotal.RemoveAt(0); } } chartVm.SetAxisLimits(now); } }); }); }
public CoinSnapshotDataViewModel(CoinSnapshotData data) { _data = data; }
private void RefreshTotalSpeedChart(int limit) { //NTMinerRoot.Current.DebugLine($"获取总算力数据,范围{leftTime} - {rightTime}"); var coinCodes = NTMinerRoot.Current.CoinSet.Select(a => a.Code).ToList(); Server.ControlCenterService.GetLatestSnapshots( limit, coinCodes, (response) => { if (response == null) { return; } Execute.OnUIThread(() => { bool isOnlyOne = limit == 1; Vm.TotalMiningCount = response.TotalMiningCount; Vm.TotalOnlineCount = response.TotalOnlineCount; //NTMinerRoot.Current.DebugLine($"获取了{data.Count}条"); foreach (var chartVm in Vm.TotalVms) { var list = response.Data.Where(a => a.CoinCode == chartVm.CoinVm.Code).ToList(); if (list.Count != 0) { list = list.OrderBy(a => a.Timestamp).ToList(); CoinSnapshotData latestData = list.Last(); chartVm.SnapshotDataVm.Update(latestData); foreach (var seriy in chartVm.Series) { if (seriy.Title == "speed") { if (list.Count > 0) { if (isOnlyOne) { var item = list.Last(); seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.Speed }); } else { foreach (var item in list) { seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.Speed }); } } } } else if (seriy.Title == "onlineCount") { if (isOnlyOne) { var item = list.Last(); seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinOnlineCount + item.DualCoinOnlineCount }); } else { foreach (var item in list) { seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinOnlineCount + item.DualCoinOnlineCount }); } } } else if (seriy.Title == "miningCount") { if (isOnlyOne) { var item = list.Last(); seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinMiningCount + item.DualCoinMiningCount }); } else { foreach (var item in list) { seriy.Values.Add(new MeasureModel() { DateTime = item.Timestamp, Value = item.MainCoinMiningCount + item.DualCoinMiningCount }); } } } } } DateTime now = DateTime.Now; foreach (var seriy in chartVm.Series) { IChartValues valuesTotal = seriy.Values; if (valuesTotal.Count > 0 && ((MeasureModel)valuesTotal[0]).DateTime.AddMinutes(NTMinerRoot.Current.SpeedHistoryLengthByMinute) < now) { valuesTotal.RemoveAt(0); } } } }); }); }
public static ICollection <CoinSnapshotData> CreateCoinSnapshots(bool isPull, DateTime now, ClientData[] data, out int onlineCount, out int miningCount) { onlineCount = 0; miningCount = 0; Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>(); foreach (var clientData in data) { if (isPull) { if (clientData.MinerActiveOn.AddSeconds(15) < now) { if (clientData.IsMining) { clientData.IsMining = false; } continue; } } else { if (clientData.MinerActiveOn.AddSeconds(130) < now) { if (clientData.IsMining) { clientData.IsMining = false; } continue; } } onlineCount++; if (string.IsNullOrEmpty(clientData.MainCoinCode)) { continue; } if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData)) { mainCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.MainCoinCode }; dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData); } if (clientData.IsMining) { miningCount++; mainCoinSnapshotData.MainCoinMiningCount += 1; // TODO:考虑是否应该针对每一个币种配置一个最大正常算力 if ("ETH".Equals(clientData.MainCoinCode, StringComparison.OrdinalIgnoreCase)) { if (clientData.MainCoinSpeed < 2 * NTKeyword.DoubleG) { mainCoinSnapshotData.Speed += clientData.MainCoinSpeed; } } else { mainCoinSnapshotData.Speed += clientData.MainCoinSpeed; } } mainCoinSnapshotData.MainCoinOnlineCount += 1; if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled) { if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData)) { dualCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.DualCoinCode }; dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData); } if (clientData.IsMining) { // TODO:考虑是否应该针对每一个币种配置一个最大正常算力 if ("ETH".Equals(clientData.DualCoinCode, StringComparison.OrdinalIgnoreCase)) { if (clientData.DualCoinSpeed < 2 * NTKeyword.DoubleG) { dualCoinSnapshotData.Speed += clientData.DualCoinSpeed; } } else { dualCoinSnapshotData.Speed += clientData.DualCoinSpeed; } } } } return(dicByCoinCode.Values); }
public static ICollection <CoinSnapshotData> CreateCoinSnapshots(bool isPull, DateTime now, IEnumerable <ClientData> data, out int onlineCount, out int miningCount) { onlineCount = 0; miningCount = 0; Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>(); foreach (var clientData in data) { if (isPull) { if (clientData.MinerActiveOn.AddSeconds(15) < now) { continue; } } else { if (clientData.MinerActiveOn.AddSeconds(130) < now) { continue; } } onlineCount++; if (string.IsNullOrEmpty(clientData.MainCoinCode)) { continue; } if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData)) { mainCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.MainCoinCode }; dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData); } if (clientData.IsMining) { miningCount++; mainCoinSnapshotData.MainCoinMiningCount += 1; mainCoinSnapshotData.Speed += clientData.MainCoinSpeed; mainCoinSnapshotData.ShareDelta += clientData.GetMainCoinShareDelta(isPull); mainCoinSnapshotData.RejectShareDelta += clientData.GetMainCoinRejectShareDelta(isPull); } mainCoinSnapshotData.MainCoinOnlineCount += 1; if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled) { if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData)) { dualCoinSnapshotData = new CoinSnapshotData() { Timestamp = now, CoinCode = clientData.DualCoinCode }; dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData); } if (clientData.IsMining) { dualCoinSnapshotData.DualCoinMiningCount += 1; dualCoinSnapshotData.Speed += clientData.DualCoinSpeed; dualCoinSnapshotData.ShareDelta += clientData.GetDualCoinShareDelta(isPull); dualCoinSnapshotData.RejectShareDelta += clientData.GetDualCoinRejectShareDelta(isPull); } dualCoinSnapshotData.DualCoinOnlineCount += 1; } } return(dicByCoinCode.Values); }
public List <ClientData> QueryClients( IUser user, QueryClientsRequest query, out int total, out CoinSnapshotData[] coinSnapshots, out int onlineCount, out int miningCount) { coinSnapshots = new CoinSnapshotData[0]; onlineCount = 0; miningCount = 0; if (!IsReadied) { total = 0; return(new List <ClientData>()); } List <ClientData> list = new List <ClientData>(); var data = _dicByObjectId.Values.ToArray(); bool isFilterByUser = user != null && !string.IsNullOrEmpty(user.LoginName) && !user.IsAdmin(); bool isFilterByGroup = query.GroupId.HasValue && query.GroupId.Value != Guid.Empty; bool isFilterByMinerIp = !string.IsNullOrEmpty(query.MinerIp); bool isFilterByMinerName = !string.IsNullOrEmpty(query.MinerName); bool isFilterByVersion = !string.IsNullOrEmpty(query.Version); bool isFilterByWork = query.WorkId.HasValue && query.WorkId.Value != Guid.Empty; bool isFilterByCoin = !isFilterByWork && !string.IsNullOrEmpty(query.Coin); bool isFilterByPool = !isFilterByWork && !string.IsNullOrEmpty(query.Pool); bool isFilterByWallet = !isFilterByWork && !string.IsNullOrEmpty(query.Wallet); bool isFilterByKernel = !isFilterByWork && !string.IsNullOrEmpty(query.Kernel); bool isFilterByGpuType = query.GpuType != GpuType.Empty; bool isFilterByGpuName = !string.IsNullOrEmpty(query.GpuName); bool isFilterByGpuDriver = !string.IsNullOrEmpty(query.GpuDriver); for (int i = 0; i < data.Length; i++) { var item = data[i]; bool isInclude = true; if (isInclude && isFilterByUser) { isInclude = user.LoginName.Equals(item.LoginName); } if (isInclude && isFilterByGroup) { isInclude = item.GroupId == query.GroupId.Value; } if (isInclude) { switch (query.MineState) { case MineStatus.All: break; case MineStatus.Mining: isInclude = item.IsMining == true; break; case MineStatus.UnMining: isInclude = item.IsMining == false; break; default: break; } } if (isInclude && isFilterByMinerIp) { isInclude = query.MinerIp.Equals(item.MinerIp) || (!string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp)); } if (isInclude && isFilterByMinerName) { isInclude = (!string.IsNullOrEmpty(item.MinerName) && item.MinerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1) || (!string.IsNullOrEmpty(item.WorkerName) && item.WorkerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1); } if (isInclude && isFilterByVersion) { isInclude = !string.IsNullOrEmpty(item.Version) && item.Version.Contains(query.Version); } if (isInclude) { if (isFilterByWork) { isInclude = item.WorkId == query.WorkId.Value; } else { if (isInclude && isFilterByCoin) { isInclude = query.Coin.Equals(item.MainCoinCode) || query.Coin.Equals(item.DualCoinCode); } if (isInclude && isFilterByPool) { isInclude = query.Pool.Equals(item.MainCoinPool) || query.Pool.Equals(item.DualCoinPool); } if (isInclude && isFilterByWallet) { isInclude = query.Wallet.Equals(item.MainCoinWallet) || query.Wallet.Equals(item.DualCoinWallet); } if (isInclude && isFilterByKernel) { isInclude = !string.IsNullOrEmpty(item.Kernel) && item.Kernel.IgnoreCaseContains(query.Kernel); } } } if (isInclude && isFilterByGpuType) { isInclude = item.GpuType == query.GpuType; } if (isInclude && isFilterByGpuName) { isInclude = !string.IsNullOrEmpty(item.GpuInfo) && item.GpuInfo.IgnoreCaseContains(query.GpuName); } if (isInclude && isFilterByGpuDriver) { isInclude = !string.IsNullOrEmpty(item.GpuDriver) && item.GpuDriver.IgnoreCaseContains(query.GpuDriver); } if (isInclude) { list.Add(item); } } total = list.Count(); list.Sort(new ClientDataComparer(query.SortDirection, query.SortField)); ClientData[] items = (user == null || user.IsAdmin()) ? data : data.Where(a => a.LoginName == user.LoginName).ToArray(); coinSnapshots = VirtualRoot.CreateCoinSnapshots(_isPull, DateTime.Now, items, out onlineCount, out miningCount).ToArray(); var results = list.Take(query).ToList(); DateTime time = DateTime.Now.AddSeconds(_isPull ? -20 : -180); // 一定时间未上报算力视为0算力 foreach (var clientData in results) { if (clientData.MinerActiveOn < time) { clientData.DualCoinSpeed = 0; clientData.MainCoinSpeed = 0; } } return(results); }