using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Zxd.Domain.Dto.Resource; namespace Zxd.Domain { public class ScreenRecordDomain : IScreenRecordDomain { private readonly IBaseRepository _repository; public ScreenRecordDomain(IBaseRepository repository) { _repository = repository; } public async Task ScreenRecord(ScreenRecord postData) { Log.Information("ScreenRecord:" + postData.ToJson()); if (string.IsNullOrWhiteSpace(postData.MasterId)) throw new Exception("主控ID不能为空"); if (string.IsNullOrWhiteSpace(postData.MasterIP)) throw new Exception("主控IP不能为空"); if (string.IsNullOrWhiteSpace(postData.SlaveId)) throw new Exception("被控ID不能为空"); if (string.IsNullOrWhiteSpace(postData.SlaveIP)) throw new Exception("被控IP不能为空"); postData.CTime = DateTime.Now; int maxRetryCount = 3; int retryCount = 0; try { var screenRecord = await _repository.GetRepository().FirstOrDefaultAsync(x => x.MasterDeviceCode == postData.MasterDeviceCode && x.SlaveDeviceCode == postData.SlaveDeviceCode && x.InitConnectTime == postData.InitConnectTime); if (screenRecord != null) { screenRecord.RealEndTime = postData.RealEndTime; await _repository.GetRepository().UpdateAsync(screenRecord, x => new { x.RealEndTime }); } else { var result = await _repository.GetRepository().InsertAsync(postData); } return true; } catch (Exception ex) { Log.Error($"ScreenRecordERR:{postData.ToJson()}reason:{ex.Message}"); return false; //await Task.Delay(500); } return true; /*while (retryCount < maxRetryCount) { try { var screenRecord = await _repository.GetRepository().FirstOrDefaultAsync(x => x.MasterDeviceCode == postData.MasterDeviceCode && x.SlaveDeviceCode == postData.SlaveDeviceCode && x.InitConnectTime == postData.InitConnectTime); if (screenRecord != null) { screenRecord.RealEndTime = postData.RealEndTime; await _repository.GetRepository().UpdateAsync(screenRecord, x => new { x.RealEndTime }); } else { var result = await _repository.GetRepository().InsertAsync(postData); } return true; } catch (Exception ex) { Log.Information($"录屏数据传入出错。参数:{postData.ToJson()}。原因:{ex.Message}"); retryCount++; await Task.Delay(500); } } throw new Exception("存储失败");*/ } public async Task FileRecord(ScreenRecordFile postData) { if (string.IsNullOrWhiteSpace(postData.MasterDeviceCode)) throw new Exception("主控Code不能为空"); if (string.IsNullOrWhiteSpace(postData.SlaveDeviceCode)) throw new Exception("被控Code不能为空"); if (!postData.InitConnectTime.HasValue) throw new Exception("连接时长不能为空"); if (string.IsNullOrWhiteSpace(postData.FileUrl)) throw new Exception("文件路径不能为空"); var screenRecord = await _repository.GetRepository().FirstOrDefaultAsync(x => x.MasterDeviceCode == postData.MasterDeviceCode && x.SlaveDeviceCode == postData.SlaveDeviceCode && x.InitConnectTime == postData.InitConnectTime); if (screenRecord == null) throw new Exception("录屏数据不存在"); screenRecord.FileUrl = postData.FileUrl; screenRecord.UTime = DateTime.Now; await _repository.GetRepository().UpdateAsync(screenRecord); return true; } /// /// 获取录屏列表接口 /// /// /// public async Task> GetScreenRecordList(ScreenRecordRequest postData) { var result = new List(); var query = _repository.GetRepository().Query() .Select(x => new ScreenRecordResponse { Id = x.id, MasterUserName = x.MasterId, SlaveUserName = x.SlaveId, InitConnectTime = x.InitConnectTime, RealStartTime = x.RealStartTime, RealEndTime = x.RealEndTime, FileUrl = x.FileUrl }); var employees = from a in _repository.GetRepository().Query() join b in _repository.GetRepository().Query() on a.employee_id equals b.eid select new { Eid = a.employee_id, Name = a.employee_name, UserName = b.appusername, AppId = a.appid }; query = query.If(postData.InitConnectStartTime.HasValue, x => x.Where(y => y.InitConnectTime >= postData.InitConnectStartTime.Value)) .If(postData.InitConnectEndTime.HasValue, x => x.Where(y => y.InitConnectTime <= postData.InitConnectEndTime.Value.AddDays(1))); //录屏主控人或被控人都可以是员工或客户 //因此筛选条件需要判断主控人与被控人一起判断 if (!string.IsNullOrWhiteSpace(postData.AppId)) { var userNames = employees.Where(x => x.AppId == postData.AppId).Select(x => x.UserName).ToList(); query = query.Where(x => userNames.Contains(x.MasterUserName) || userNames.Contains(x.SlaveUserName)); } if (postData.Eid.HasValue) { var userNames = employees.Where(x => x.Eid == postData.Eid).Select(x => x.UserName).ToList(); query = query.If(postData.Type == (int)ScreenRecordType.主控人, x => x.Where(y => userNames.Contains(y.MasterUserName))) .If(postData.Type == (int)ScreenRecordType.被控人, x => x.Where(y => userNames.Contains(y.SlaveUserName))) .If(!postData.Type.HasValue, x => x.Where(y => userNames.Contains(y.MasterUserName) || userNames.Contains(y.SlaveUserName))); } if (!string.IsNullOrWhiteSpace(postData.Name)) { var userNames = await _repository.GetRepository().Query().Where(x => x.CNAME == postData.Name).Select(x => x.SOFTUSERNAME).ToListAsync(); query = query.If(postData.Type == (int)ScreenRecordType.主控人, x => x.Where(y => userNames.Contains(y.MasterUserName))) .If(postData.Type == (int)ScreenRecordType.被控人, x => x.Where(y => userNames.Contains(y.SlaveUserName))) .If(!postData.Type.HasValue, x => x.Where(y => userNames.Contains(y.MasterUserName) || userNames.Contains(y.SlaveUserName))); } if (!string.IsNullOrWhiteSpace(postData.UserName)) { query = query.If(postData.Type == (int)ScreenRecordType.主控人, x => x.Where(y => y.MasterUserName == postData.UserName)) .If(postData.Type == (int)ScreenRecordType.被控人, x => x.Where(y => y.SlaveUserName == postData.UserName)) .If(!postData.Type.HasValue, x => x.Where(y => y.MasterUserName == postData.UserName || y.SlaveUserName == postData.UserName)); } if (!string.IsNullOrWhiteSpace(postData.ResId)) { var userNames = await _repository.GetRepository().Query().Where(x => x.RESID == postData.ResId).Select(x => x.USERNAME).ToListAsync(); query = query.If(postData.Type == (int)ScreenRecordType.主控人, x => x.Where(y => userNames.Contains(y.MasterUserName))) .If(postData.Type == (int)ScreenRecordType.被控人, x => x.Where(y => userNames.Contains(y.SlaveUserName))) .If(!postData.Type.HasValue, x => x.Where(y => userNames.Contains(y.MasterUserName) || userNames.Contains(y.SlaveUserName))); } var total = await query.CountAsync(); result = await query .OrderByDescending(x => x.Id) .Skip((postData.PageIndex - 1) * postData.PageSize) .Take(postData.PageSize) .ToListAsync(); if (result != null && result.Any()) { var userNames = result.Select(x => x.MasterUserName).ToList(); userNames.AddRange(result.Select(x => x.SlaveUserName).ToList()); userNames = userNames.Distinct().ToList(); var softUsers = await _repository.GetRepository().Query().Where(x => userNames.Contains(x.USERNAME)).ToListAsync(); var employee = employees.Where(x => userNames.Contains(x.UserName)).ToList(); var orders = await _repository.GetRepository().Query().Where(x => userNames.Contains(x.SOFTUSERNAME) && x.ISTEST == 0 && !string.IsNullOrWhiteSpace(x.CNAME)) .OrderByDescending(x => x.CTIME).Select(x => new { Cname = x.CNAME, USERNAME = x.SOFTUSERNAME }).ToListAsync(); foreach (var item in result) { item.MasterResId = softUsers.FirstOrDefault(x => x.USERNAME == item.MasterUserName)?.RESID; item.SlaveResId = softUsers.FirstOrDefault(x => x.USERNAME == item.SlaveUserName)?.RESID; item.MasterUmid = softUsers.FirstOrDefault(x => x.USERNAME == item.MasterUserName)?.UMID; item.SlaveUmid = softUsers.FirstOrDefault(x => x.USERNAME == item.SlaveUserName)?.UMID; item.MasterName = orders.FirstOrDefault(x => x.USERNAME == item.MasterUserName)?.Cname; item.SlaveName = orders.FirstOrDefault(x => x.USERNAME == item.SlaveUserName)?.Cname; var time = item.RealEndTime - item.RealStartTime; item.RealLongTime = time.HasValue ? $"{(int)time.Value.TotalMinutes}min{time.Value.TotalSeconds % 60}ss" : string.Empty; var masterEmployee = employee.FirstOrDefault(x => x.UserName == item.MasterUserName); var slaveEmployee = employee.FirstOrDefault(x => x.UserName == item.SlaveUserName); item.MasterEid = masterEmployee?.Eid; item.MasterEidStr = masterEmployee != null ? $"{masterEmployee?.Eid}-{masterEmployee?.Name}" : string.Empty; //item.MasterName = masterEmployee?.Name; item.SlaveEid = slaveEmployee?.Eid; item.SlaveEidStr = slaveEmployee != null ? $"{slaveEmployee?.Eid}-{slaveEmployee?.Name}" : string.Empty; //item.SlaveName = slaveEmployee?.Name; } } return new PageResult(postData.PageIndex, postData.PageSize, total, result); } } }