using System.Net.WebSockets; using System.Text; using Hopetry.App.SugarModel.CommonModel; using Infrastructure; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.Const; using OpenAuth.App.Interface; using OpenAuth.App.ServiceApp.FireManagement.Request; using OpenAuth.App.ServiceApp.FireManagement.Response; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using OpenAuth.Repository.Domain.FireManagement; using SqlSugar; using Yitter.IdGenerator; namespace OpenAuth.App.ServiceApp.FireManagement { public class FireManagementApp : SqlSugarBaseApp { private ClientWebSocket _socket; private IConfiguration _configuration; public FireManagementApp(IConfiguration configuration, ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth) { _auth = auth; _configuration = configuration; } /// /// 下发防火线索任务 /// /// /// public async Task> IssuedFireClueTask(FmFireclueTask info) { using (var db = base.UnitWork.CreateContext()) { info.Id = YitIdHelper.NextId(); info.State = (int)TaskState.待接收; info.TaskTime = DateTime.Now; info.IsDelete = false; await db.FmFireclueTask.InsertAsync(info); List fftuList = new List(); if (info.RecipientUsers == null || info.RecipientUsers.Count == 0) { var userList = await db.User.AsQueryable().Where(r => r.Status == 0).ToListAsync(); userList.ForEach(user => { FmFireTaskUser fftu = new FmFireTaskUser { Id = YitIdHelper.NextId(), UserId = user.Id.ToString(), TaskId = info.Id, ReceiveTime = DateTime.Now, State = (int)TaskState.待接收 }; fftuList.Add(fftu); }); } else { info.RecipientUsers.ForEach(user => { FmFireTaskUser fftu = new FmFireTaskUser { Id = YitIdHelper.NextId(), UserId = user, TaskId = info.Id, ReceiveTime = DateTime.Now, State = (int)TaskState.待接收 }; fftuList.Add(fftu); }); } await db.FmFireTaskUser.InsertRangeAsync(fftuList); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } /// /// 查询下发人员 /// /// /// public async Task>> LoadFireClueUser(string username, string unitname) { using (var db = base.UnitWork.CreateContext()) { var users = await db.User.AsQueryable() .WhereIF(!string.IsNullOrEmpty(username), r => r.Name.Contains(username)) .WhereIF(!string.IsNullOrEmpty(unitname), r => r.UnitName.Contains(username)) .Where(r => r.Status == 0) .Select(r => new SysUserResp { Id = r.Id, Name = r.Name }).ToListAsync(); return new Response> { Result = users }; } } /// /// 查询任务列表 /// /// public async Task>> GetTaskList() { using (var db = base.UnitWork.CreateContext()) { var tasks = await db.FmFireclueTask.AsQueryable() .Where(r => r.IsDelete == false) .ToListAsync(); return new Response> { Result = tasks }; } } /// /// 查询人员单位信息 /// /// public async Task>> GetUserUnit() { using (var db = base.UnitWork.CreateContext()) { var userunit = await db.FmUserUnit.AsQueryable().ToListAsync(); return new Response> { Result = userunit }; } } #region 单位管理 //添加人员单位 public async Task> AddUserUnit(FmUserUnit info) { using (var db = base.UnitWork.CreateContext()) { info.Id = YitIdHelper.NextId(); await db.FmUserUnit.InsertAsync(info); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } //编辑人员单位 public async Task> EditUserUnit(FmUserUnit info) { using (var db = base.UnitWork.CreateContext()) { await db.FmUserUnit.UpdateAsync(info); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } //获取单个人员单位 public async Task> LoadUserUnitById(long id) { using (var db = base.UnitWork.CreateContext()) { var info = await db.FmUserUnit.AsQueryable().FirstAsync(r => r.Id == id); return new Response { Result = info }; } } //删除人员单位 public async Task> DeleteUserUnit(long id) { using (var db = base.UnitWork.CreateContext()) { await db.FmUserUnit.DeleteAsync(r => r.Id == id); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } public Response FireUserUnitUpload(IFormFileCollection formFiles) { var user = _auth.GetCurrentUser().User; IFormFile file = formFiles[0]; Response response = new Response(); try { //存储文件到服务器 if (file != null) { if (file.FileName.IndexOf(".xls") > 0 || file.FileName.IndexOf(".xlsx") > 0) { //数据库导入 IWorkbook workbook = null; if (file.FileName.IndexOf(".xlsx") > 0) { using (var stream = file.OpenReadStream()) { workbook = new XSSFWorkbook(stream);//excel的版本2007 } } else if (file.FileName.IndexOf(".xls") > 0) { using (var stream = file.OpenReadStream()) { workbook = new HSSFWorkbook(stream);//excel的版本2003 } } ISheet sheet; sheet = workbook.GetSheetAt(0); List fulist = new List(); if (sheet != null) { IRow firstRow = sheet.GetRow(0); string name = firstRow.GetCell(0).ToString(); //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = 1; i <= rowCount; i++) { IRow row = sheet.GetRow(i); if (row == null || string.IsNullOrEmpty(row.GetCell(0).ToString())) continue; FmUserUnit fu = new FmUserUnit(); fu.Id = YitIdHelper.NextId(); fu.UnitName = row.GetCell(1).ToString(); fu.UnitType = row.GetCell(2).ToString(); fu.Description = row.GetCell(3).ToString(); fu.CreateTime = DateTime.Now; fu.CreateUserId = user.Id.ToString(); fulist.Add(fu); } } using (var db = base.UnitWork.CreateContext()) { db.FmUserUnit.InsertRange(fulist); if (db.Commit()) { return new Response { Result = true, Message = "导入成功" }; } else { return new Response { Result = false, Message = "导入失败" }; } } } else { response.Result = false; response.Message = "上传文件类型错误,请上传Excel文件"; response.Code = 300; } } } catch (Exception ex) { response.Result = false; response.Code = 400; response.Message = "上传文件类型错误"; } return response; } #endregion #region 火情线索 public async Task> AddFireClueInfo(FmFireclueInfo info) { using (var db = base.UnitWork.CreateContext()) { info.Id = YitIdHelper.NextId(); info.State = (int)State.上报; info.ReportTime = DateTime.Now; var exitinfo = db.FmFireclueInfo.AsQueryable().Where(a => a.ReportTime.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")).Count(); info.ClueNo = "H" + DateTime.Now.ToString("yyyyMMdd") + (exitinfo == 0 ? "01" : "0" + (exitinfo + 1)); await db.FmFireclueInfo.InsertAsync(info); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } /// /// 查询火情线索 /// /// /// public async Task> LoadClueInfoById(long id) { using (var db = base.UnitWork.CreateContext()) { var info = await db.FmFireclueInfo.AsQueryable() .FirstAsync(r => r.Id == id); return new Response { Result = info }; } } public async Task> LoadClueWithInfoById(long id) { using (var db = base.UnitWork.CreateContext()) { var clueInfo = await db.FmFireclueInfo.AsQueryable() .FirstAsync(r => r.Id == id); //查找摄像头 var sqlStr = $@"select ""Id"",""Name"",""SerialNumber"" from fm_camera where ST_DWithin(ST_GeographyFromText('POINT({clueInfo.Lng} {clueInfo.Lat})'), ST_GeographyFromText('POINT('||""Lng""||' '||""Lat""||')'),1000)=true"; var cameraInfo = await db.Db.Ado.GetDataTableAsync(sqlStr); var endInfo = new { clueInfo, cameraInfo, }; return new Response { Result = endInfo }; } } //查询火情线索列表 public async Task>> GetFireClueList() { using (var db = base.UnitWork.CreateContext()) { var list = await db.FmFireclueInfo.AsQueryable().Where(r => r.State == 1).ToListAsync(); return new Response> { Result = list }; } } //按月统计火情线索 public async Task>> GetFireClueStatistics(int type) { using (var db = base.UnitWork.CreateContext()) { if (type == 1) { DateTime firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var list = await db.FmFireclueInfo.AsQueryable() //.Where(r => r.State == 1) .Where(r => r.ReportTime >= firstDayOfMonth) .GroupBy(r => new { r.ReportTime.Day }) .Select(r => new FireInfoForChart { DateTime = r.ReportTime.Day.ToString() + "日", Count = SqlFunc.AggregateCount(r.Id) }).ToListAsync(); return new Response> { Result = list }; } else { DateTime firstDayOfYear = new DateTime(DateTime.Now.Year, 1, 1); var list = await db.FmFireclueInfo.AsQueryable() //.Where(r => r.State == 1) .Where(r => r.ReportTime >= firstDayOfYear) .GroupBy(r => new { r.ReportTime.Month }) .Select(r => new FireInfoForChart { DateTime = r.ReportTime.Month.ToString() + "月", Count = SqlFunc.AggregateCount(r.Id) }).ToListAsync(); return new Response> { Result = list }; } } } public async Task>> GetFireClueStatisticsByState(int type) { using (var db = base.UnitWork.CreateContext()) { if (type == 1) { DateTime firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfMonth) .GroupBy(r => new { r.ReportTime.Day }) .Select(r => new FireInfoStateForChart { DateTime = r.ReportTime.Day.ToString() + "日", TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)), UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } else if (type == 2) { DateTime firstDayOfYear = new DateTime(DateTime.Now.Year, 1, 1); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfYear) .GroupBy(r => new { r.ReportTime.Month }) .Select(r => new FireInfoStateForChart { DateTime = r.ReportTime.Month.ToString() + "月", TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)), UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } else { DateTime firstDayOfYear = DateTime.Now.AddYears(-3); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfYear) .GroupBy(r => new { r.ReportTime.Year }) .Select(r => new FireInfoStateForChart { DateTime = r.ReportTime.Year.ToString() + "年", TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)), UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } } } public async Task>> GetFireClueStatisticsByDegreeType(int type) { using (var db = base.UnitWork.CreateContext()) { if (type == 1) { DateTime firstDayOfMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfMonth) .GroupBy(r => new { r.ReportTime.Day }) .Select(r => new FireInfoDegreeForChart { DateTime = r.ReportTime.Day.ToString() + "日", ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)), LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } else if (type == 2) { DateTime firstDayOfYear = new DateTime(DateTime.Now.Year, 1, 1); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfYear) .GroupBy(r => new { r.ReportTime.Month }) .Select(r => new FireInfoDegreeForChart { DateTime = r.ReportTime.Month.ToString() + "月", ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)), LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } else { DateTime firstDayOfYear = DateTime.Now.AddYears(-3); var list = await db.FmFireclueInfo.AsQueryable() .Where(r => r.ReportTime >= firstDayOfYear) .GroupBy(r => new { r.ReportTime.Year }) .Select(r => new FireInfoDegreeForChart { DateTime = r.ReportTime.Year.ToString() + "年", ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)), LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0)) }).ToListAsync(); return new Response> { Result = list }; } } } #endregion /// /// 在线情况 /// /// /// public async Task>> GetPointUserOnLine(UserOnLineReq pageReq) { using (var db = base.UnitWork.CreateContext()) { RefAsync totalNumber = 0; var user = _auth.GetCurrentUser().User; int level = 0; //该用户下包含所有部门 var orgid = _auth.GetCurrentUser().Orgs; level = orgid.Min(r => r.Level); var chileorglist = new List(); if (level != 0 && user.Id != -1) { foreach (var item in orgid.Where(r => r.Level < 3)) { var chileorg = (await db.SysOrg.AsQueryable().ToChildListAsync(it => it.ParentId, item)).Select(it => it.Id).ToList(); chileorglist.AddRange(chileorg); } } var userInfoQuery = db.User.AsQueryable() .LeftJoin((a, b) => a.Id == b.CreateId) .LeftJoin((a, b, c) => a.Id == c.UserId) .Where((a, b, c) => a.Status == 0) .WhereIF(level != 0, (a, b, c) => chileorglist.Contains(c.UserId)); var userinfo = await userInfoQuery .Select((a, b, c) => new UserOnLineResp { CreateId = a.Id, Name = a.Name, Lat = b.Lat, Lng = b.Lng, CreateTime = b.CreateTime, Phone = a.Account, State = b.CreateTime.AddMinutes(2) > DateTime.Now ? "在线" : "离线", IsIn = b.Intype, OnLineTime = SqlFunc.DateDiff(DateType.Minute, b.CreateTime, DateTime.Now), TownName = SqlFunc.Subqueryable() .Where(sf => sf.UserId == a.Id) .LeftJoin((sf, gs) => sf.OrgId == gs.Id) .LeftJoin((sf, gs, t) => gs.ParentId == t.Id) .SelectStringJoin((sf, gs, t) => gs.Name, ",") }) .MergeTable() .Distinct() .WhereIF(!string.IsNullOrEmpty(pageReq.townname), it => it.TownName.Contains(pageReq.townname)) .WhereIF(pageReq.isonline != "全部", it => it.State == pageReq.isonline) .OrderByDescending(it => it.CreateTime) .ToPageListAsync(pageReq.page, pageReq.limit, totalNumber); var onlineCount = await userInfoQuery .Where((a, b, c) => b.CreateTime.AddMinutes(2) > DateTime.Now) .Select(a => a.Id) .Distinct() .CountAsync(); // 离线人数 var offlineCount = totalNumber - onlineCount; var enddata = new { userinfo, online = onlineCount, offline = offlineCount, }; return new Response> { Result = new PageInfo { Items = enddata, Total = totalNumber } }; } } /// /// 添加实时坐标 /// /// /// public async Task> AddPointAsync(FmUserPoint userPoint) { var respose = new Response(); using var db = Repository.AsSugarClient(); if (userPoint != null) { userPoint.Id = YitIdHelper.NextId(); userPoint.CreateTime = DateTime.Now; var userPointHistory = userPoint.MapTo(); var oldInfo = await db.Queryable() .Where(r => r.CreateId == userPoint.CreateId) .FirstAsync(); //上线弹窗 第一次上报或者上线时间不超过2分钟 if (oldInfo == null || (oldInfo != null && oldInfo.CreateTime.AddMinutes(2) < DateTime.Now)) { var user = await db.Queryable().Where(r => r.Id == userPoint.CreateId) .FirstAsync(); if (user != null) { await db.Insertable(new FmOnOffLine { Id = YitIdHelper.NextId(), IdentifyId = user.Id, OnOffTime = DateTime.Now, Name = user.Name, Type = true }).ExecuteCommandAsync(); WebSocketModel wsModel1 = new WebSocketModel { Module = "上线", Data = user.Name }; sendsocket(wsModel1); } } if (oldInfo != null) { oldInfo.Lat = userPoint.Lat; oldInfo.Lng = userPoint.Lng; oldInfo.CreateTime = userPoint.CreateTime; oldInfo.Intype = userPoint.Intype; await db.Updateable(oldInfo).ExecuteCommandAsync(); } else { await db.Insertable(userPoint).ExecuteCommandAsync(); } await db.Insertable(userPointHistory).SplitTable().ExecuteCommandAsync(); respose.Code = 200; respose.Result = true; respose.Message = "添加成功"; } else { respose.Code = 500; respose.Result = false; respose.Message = "添加失败"; } return respose; } public async Task sendsocket(WebSocketModel wsModel1) { try { if (_socket == null || _socket.State != WebSocketState.Open) { string ws = _configuration.GetSection("WebSocket").Value; _socket = new ClientWebSocket(); await _socket.ConnectAsync(new Uri(ws), CancellationToken.None); } byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(wsModel1)); await _socket.SendAsync(new ArraySegment(data), WebSocketMessageType.Text, true, CancellationToken.None); await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing connection", CancellationToken.None); } catch (Exception ex) { } } } }