Infrastructure/OpenAuth.App/ServiceApp/FireManagement/FireManagementApp.cs

635 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<FmFireclueTask, SugarDbContext>
{
private ClientWebSocket _socket;
private IConfiguration _configuration;
public FireManagementApp( IConfiguration configuration,ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<FmFireclueTask> repository, IAuth auth) : base(unitWork, repository, auth)
{
_auth = auth;
_configuration = configuration;
}
/// <summary>
/// 下发防火线索任务
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<Response<bool>> 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<FmFireTaskUser> fftuList = new List<FmFireTaskUser>();
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<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
/// <summary>
/// 查询下发人员
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
public async Task<Response<List<SysUserResp>>> 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<List<SysUserResp>> { Result = users };
}
}
/// <summary>
/// 查询任务列表
/// </summary>
/// <returns></returns>
public async Task<Response<List<FmFireclueTask>>> GetTaskList()
{
using (var db = base.UnitWork.CreateContext())
{
var tasks = await db.FmFireclueTask.AsQueryable()
.Where(r => r.IsDelete == false)
.ToListAsync();
return new Response<List<FmFireclueTask>> { Result = tasks };
}
}
/// <summary>
/// 查询人员单位信息
/// </summary>
/// <returns></returns>
public async Task<Response<List<FmUserUnit>>> GetUserUnit()
{
using (var db = base.UnitWork.CreateContext())
{
var userunit = await db.FmUserUnit.AsQueryable().ToListAsync();
return new Response<List<FmUserUnit>> { Result = userunit };
}
}
#region 单位管理
//添加人员单位
public async Task<Response<bool>> AddUserUnit(FmUserUnit info)
{
using (var db = base.UnitWork.CreateContext())
{
info.Id = YitIdHelper.NextId();
await db.FmUserUnit.InsertAsync(info);
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
//编辑人员单位
public async Task<Response<bool>> EditUserUnit(FmUserUnit info)
{
using (var db = base.UnitWork.CreateContext())
{
await db.FmUserUnit.UpdateAsync(info);
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
//获取单个人员单位
public async Task<Response<FmUserUnit>> LoadUserUnitById(long id)
{
using (var db = base.UnitWork.CreateContext())
{
var info = await db.FmUserUnit.AsQueryable().FirstAsync(r => r.Id == id);
return new Response<FmUserUnit> { Result = info };
}
}
//删除人员单位
public async Task<Response<bool>> DeleteUserUnit(long id)
{
using (var db = base.UnitWork.CreateContext())
{
await db.FmUserUnit.DeleteAsync(r => r.Id == id);
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
public Response<bool> FireUserUnitUpload(IFormFileCollection formFiles)
{
var user = _auth.GetCurrentUser().User;
IFormFile file = formFiles[0];
Response<bool> response = new Response<bool>();
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<FmUserUnit> fulist = new List<FmUserUnit>();
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<bool> { Result = true, Message = "导入成功" };
}
else
{
return new Response<bool> { 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<Response<bool>> 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<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
/// <summary>
/// 查询火情线索
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Response<FmFireclueInfo>> LoadClueInfoById(long id)
{
using (var db = base.UnitWork.CreateContext())
{
var info = await db.FmFireclueInfo.AsQueryable()
.FirstAsync(r => r.Id == id);
return new Response<FmFireclueInfo> { Result = info };
}
}
//查询火情线索列表
public async Task<Response<List<FmFireclueInfo>>> GetFireClueList()
{
using (var db = base.UnitWork.CreateContext())
{
var list = await db.FmFireclueInfo.AsQueryable().Where(r => r.State == 1).ToListAsync();
return new Response<List<FmFireclueInfo>> { Result = list };
}
}
//按月统计火情线索
public async Task<Response<List<FireInfoForChart>>> 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<List<FireInfoForChart>> { 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<List<FireInfoForChart>> { Result = list };
}
}
}
public async Task<Response<List<FireInfoStateForChart>>> 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<List<FireInfoStateForChart>> { 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<List<FireInfoStateForChart>> { 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<List<FireInfoStateForChart>> { Result = list };
}
}
}
public async Task<Response<List<FireInfoDegreeForChart>>> 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<List<FireInfoDegreeForChart>> { 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<List<FireInfoDegreeForChart>> { 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<List<FireInfoDegreeForChart>> { Result = list };
}
}
}
#endregion
/// <summary>
/// 在线情况
/// </summary>
/// <param name="pageReq"></param>
/// <returns></returns>
public async Task<Response<PageInfo<dynamic>>> GetPointUserOnLine(UserOnLineReq pageReq)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> 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<long>();
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<FmUserPoint>((a, b) => a.Id == b.CreateId)
.LeftJoin<SysUserOrg>((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<SysUserOrg>()
.Where(sf => sf.UserId == a.Id)
.LeftJoin<SysOrg>((sf, gs) => sf.OrgId == gs.Id)
.LeftJoin<SysOrg>((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<PageInfo<dynamic>>
{
Result = new PageInfo<dynamic> { Items = enddata, Total = totalNumber }
};
}
}
/// <summary>
/// 添加实时坐标
/// </summary>
/// <param name="userPoint"></param>
/// <returns></returns>
public async Task<Response<bool>> AddPointAsync(FmUserPoint userPoint)
{
var respose = new Response<bool>();
using var db = Repository.AsSugarClient();
if (userPoint != null)
{
userPoint.Id = YitIdHelper.NextId();
userPoint.CreateTime = DateTime.Now;
var userPointHistory = userPoint.MapTo<FmUserPointHistory>();
var oldinfo = await db.Queryable<FmUserPoint>().Where(r => r.CreateId == userPoint.CreateId)
.FirstAsync();
//上线弹窗
if (oldinfo == null || (oldinfo != null && oldinfo.CreateTime.AddMinutes(2) < DateTime.Now))
{
var user = await db.Queryable<SysUser>().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<byte>(data), WebSocketMessageType.Text,
true, CancellationToken.None);
await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing connection",
CancellationToken.None);
}
catch (Exception ex)
{
}
}
}
}