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

2372 lines
97 KiB
C#
Raw Normal View History

2025-11-06 14:14:46 +08:00
using DocumentFormat.OpenXml.EMMA;
2025-04-14 10:16:21 +08:00
using DocumentFormat.OpenXml.Spreadsheet;
2025-03-31 16:40:54 +08:00
using Hopetry.App.SugarModel.CommonModel;
2025-03-21 16:42:48 +08:00
using Infrastructure;
2025-11-06 14:14:46 +08:00
using Infrastructure.Extensions;
2025-11-06 16:46:40 +08:00
using Infrastructure.Utilities;
2025-11-08 13:53:33 +08:00
using Jiguang.JPush;
using Jiguang.JPush.Model;
2025-11-06 16:46:40 +08:00
using Microsoft.AspNetCore.Authorization;
2025-11-08 13:53:33 +08:00
using Microsoft.AspNetCore.Builder.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
2025-11-06 14:14:46 +08:00
using Microsoft.AspNetCore.Mvc.RazorPages;
2025-03-31 16:40:54 +08:00
using Microsoft.Extensions.Configuration;
2025-11-06 16:46:40 +08:00
using Microsoft.Extensions.Options;
2025-03-31 16:40:54 +08:00
using Newtonsoft.Json;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
2025-03-31 16:40:54 +08:00
using OpenAuth.App.BaseApp.Base;
2025-11-06 16:46:40 +08:00
using OpenAuth.App.Common;
2025-03-31 16:40:54 +08:00
using OpenAuth.App.Const;
using OpenAuth.App.Interface;
2025-11-06 14:14:46 +08:00
using OpenAuth.App.Response;
2025-03-31 16:40:54 +08:00
using OpenAuth.App.ServiceApp.FireManagement.Request;
using OpenAuth.App.ServiceApp.FireManagement.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Domain.FireManagement;
2025-11-06 14:14:46 +08:00
using Org.BouncyCastle.Ocsp;
2025-03-31 16:40:54 +08:00
using SqlSugar;
2025-11-06 14:14:46 +08:00
using System.Net.WebSockets;
2025-11-06 16:46:40 +08:00
using System.Security.Cryptography;
2025-11-06 14:14:46 +08:00
using System.Text;
using Hopetry.App.SugarModel.FeiXianModel.YingJingJu;
using Infrastructure.Helpers;
2025-03-31 16:40:54 +08:00
using Yitter.IdGenerator;
2025-11-10 14:35:55 +08:00
using static Org.BouncyCastle.Math.EC.ECCurve;
2026-01-12 10:03:51 +08:00
using DocumentFormat.OpenXml.Wordprocessing;
using Newtonsoft.Json.Linq;
using DocumentFormat.OpenXml.Vml.Wordprocessing;
2025-03-21 16:42:48 +08:00
namespace OpenAuth.App.ServiceApp.FireManagement
{
public class FireManagementApp : SqlSugarBaseApp<FmFireclueTask, SugarDbContext>
{
2025-03-31 16:40:54 +08:00
private ClientWebSocket _socket;
private IConfiguration _configuration;
2025-11-06 16:46:40 +08:00
IOptions<KikvisionConfig> _options;
2026-01-05 11:16:42 +08:00
IOptions<KikvisionConfig2> _options2;
2025-11-08 13:53:33 +08:00
IOptions<JPushClientConfig> _jpoptions;
2026-01-05 11:16:42 +08:00
public FireManagementApp(IConfiguration configuration, IOptions<KikvisionConfig> options, IOptions<KikvisionConfig2> options2,
IOptions<JPushClientConfig> jpoptions, ISugarUnitOfWork<SugarDbContext> unitWork,
2025-03-31 16:40:54 +08:00
ISimpleClient<FmFireclueTask> repository, IAuth auth) : base(unitWork, repository, auth)
2025-03-21 16:42:48 +08:00
{
_auth = auth;
2025-11-06 16:46:40 +08:00
_options = options;
2026-01-05 11:16:42 +08:00
_options2 = options2;
2025-03-31 16:40:54 +08:00
_configuration = configuration;
2025-11-08 13:53:33 +08:00
_jpoptions = jpoptions;
2025-03-21 16:42:48 +08:00
}
2025-03-31 16:40:54 +08:00
2025-03-21 16:42:48 +08:00
/// <summary>
/// 下发防火线索任务
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<Response<bool>> IssuedFireClueTask(FmFireclueTask info)
{
using (var db = base.UnitWork.CreateContext())
{
2025-04-14 10:16:21 +08:00
var userId = _auth.GetCurrentUser().User.Id;
2025-03-21 16:42:48 +08:00
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);
});
}
2025-03-21 16:42:48 +08:00
await db.FmFireTaskUser.InsertRangeAsync(fftuList);
2025-04-14 10:16:21 +08:00
await db.FmFireclueinfoLog.InsertAsync(new FmFireclueinfoLog
{
Id = YitIdHelper.NextId(),
Fireclueid = info.Fireclueid,
2025-04-14 11:13:20 +08:00
Title = "任务下发",
2025-04-14 10:16:21 +08:00
CreateTime = DateTime.Now,
CreateId = userId,
2025-04-14 11:13:20 +08:00
Content = info.Content
2025-04-14 10:16:21 +08:00
});
if (db.Commit())
{
2025-11-08 13:53:33 +08:00
//// websocket 通讯
//WebSocketModel wsModel = new WebSocketModel
//{
// Module = "任务下发",
// Data = info
//};
//SendSocketMessage(wsModel);
JPushInfo("任务下发", info.Id);
2025-04-14 10:16:21 +08:00
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-04-14 10:16:21 +08:00
//删除任务
public async Task<Response<bool>> DeleteTask(long id)
{
using (var db = base.UnitWork.CreateContext())
{
var userId = _auth.GetCurrentUser().User.Id;
var taskinfo = await db.FmFireclueTask.AsQueryable().FirstAsync(r => r.Id == id);
await db.FmFireclueTask.UpdateAsync(r => new FmFireclueTask
{
IsDelete = true
}, r => r.Id == id);
await db.FmFireclueinfoLog.InsertAsync(new FmFireclueinfoLog
{
Id = YitIdHelper.NextId(),
Fireclueid = taskinfo.Fireclueid,
2025-04-14 11:13:20 +08:00
Title = "任务删除",
2025-04-14 10:16:21 +08:00
CreateTime = DateTime.Now,
CreateId = userId,
2025-04-14 11:13:20 +08:00
Content = "删除任务"
2025-04-14 10:16:21 +08:00
});
2025-03-21 16:42:48 +08:00
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-11-09 14:18:47 +08:00
//更新任务状态
public async Task<Response<bool>> ReceiveFireClueTask(long taskid, int state, string recipient)
{
using (var db = base.UnitWork.CreateContext())
{
await db.FmFireTaskUser.UpdateAsync(r => new FmFireTaskUser
{
State = state,
ReceiveTime = DateTime.Now,
}, r => r.TaskId == taskid && r.UserId == recipient);
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-11-10 14:35:55 +08:00
//更新任务图片或者新增线索
public async Task<Response<bool>> ReceiveTaskImage(string info)
{
using (var db = base.UnitWork.CreateContext())
{
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<ReciveTaskInfo>(info);
if (obj != null)
{
var fireInfo = await db.FmFireclueTask.GetFirstAsync(r => r.Id == obj.taskid);
var imagepath = fireInfo.Image == null ? obj.path : fireInfo.Image + "," + obj.path;
await db.FmFireclueTask.UpdateAsync(r => new FmFireclueTask
{
Image = imagepath
}, r => r.Id == obj.taskid);
}
else
{
//新增线索信息
}
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-11-10 14:35:55 +08:00
class ReciveTaskInfo
{
public long taskid { get; set; }
public string path { get; set; }
}
2025-03-21 17:02:41 +08:00
/// <summary>
/// 查询下发人员
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
2025-03-22 08:42:21 +08:00
public async Task<Response<List<SysUserResp>>> LoadFireClueUser(string username, string unitname)
2025-03-21 16:42:48 +08:00
{
using (var db = base.UnitWork.CreateContext())
{
var users = await db.User.AsQueryable()
2025-03-22 08:42:21 +08:00
.WhereIF(!string.IsNullOrEmpty(username), r => r.Name.Contains(username))
.WhereIF(!string.IsNullOrEmpty(unitname), r => r.UnitName.Contains(username))
2025-03-21 17:02:41 +08:00
.Where(r => r.Status == 0)
.Select(r => new SysUserResp
2025-03-21 16:42:48 +08:00
{
Id = r.Id,
Name = r.Name
2025-03-21 17:02:41 +08:00
}).ToListAsync();
2025-03-21 16:42:48 +08:00
return new Response<List<SysUserResp>> { Result = users };
}
}
2026-01-07 11:30:37 +08:00
/// <summary>
/// 查询任务列表--后台使用
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<FmFireclueTask>>>> GetTaskPageList(FireClueTaskReq req)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var tasks = await db.FmFireclueTask.AsQueryable()
2026-01-15 11:38:11 +08:00
.Where(r=>r.IsDelete == false)
2026-01-07 11:30:37 +08:00
.Where(r => r.IsDelete == false)
.WhereIF(req.state!=null,r=>r.State==req.state)
.WhereIF(req.type!=null,r=>r.Type==req.type)
.WhereIF(req.tasktimebegin!=null&&req.tasktimeend!=null,r=>r.TaskTime>=req.tasktimebegin&&r.TaskTime<=req.tasktimeend)
.LeftJoin<FmFireclueInfo>((r,f)=>r.Fireclueid==f.Id)
.WhereIF(!string.IsNullOrEmpty(req.name),(r,f)=>r.Content.Contains(req.name)||f.Describe.Contains(req.name))
.ToPageListAsync(req.page, req.limit, totalNumber);
return new Response<PageInfo<List<FmFireclueTask>>>
{
Result = new PageInfo<List<FmFireclueTask>> { Items = tasks, Total = totalNumber }
};
}
}
2025-03-21 17:02:41 +08:00
/// <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 };
}
}
2025-11-08 15:03:55 +08:00
/// <summary>
/// 任务详情
/// </summary>
/// <param name="id"></param>
/// <param name="userid"></param>
/// <returns></returns>
public async Task<Response<FireClueTaskResp>> LoadFireTaskInfoById(long id, string userid)
{
using (var db = base.UnitWork.CreateContext())
{
var info = await db.FmFireclueTask.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.TaskUser == b.Id.ToString())
.Where((a, b) => a.Id == id)
.Select((a, b) => new FireClueTaskResp()
{
Id = a.Id,
Content = a.Content,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
State = a.State,
TaskUser = a.TaskUser,
TaskTime = a.TaskTime,
CompleteTime = a.CompleteTime,
TaskUserName = b.Name,
Audio = a.Audio,
Image = a.Image,
})
.Mapper(a => a.StateName = ((TaskState)a.State).GetDescription())
2025-11-08 15:03:55 +08:00
.FirstAsync();
var rep = db.FmFireTaskUser.AsQueryable().Where(r => r.UserId == userid && r.TaskId == id).First();
if (rep != null)
{
info.State = rep.State;
info.StateName = ((TaskState)rep.State).GetDescription();
}
2025-11-08 15:03:55 +08:00
return new Response<FireClueTaskResp> { Result = info };
}
}
2025-03-21 17:02:41 +08:00
/// <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 };
}
}
2025-03-27 14:52:07 +08:00
#region 单位管理
2025-03-27 14:52:07 +08:00
//添加人员单位
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 = "操作失败" };
}
}
}
2025-03-27 14:52:07 +08:00
//编辑人员单位
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 = "操作失败" };
}
}
}
2025-03-27 14:52:07 +08:00
//获取单个人员单位
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 };
}
}
2025-03-27 14:52:07 +08:00
//删除人员单位
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();
2025-03-31 16:40:54 +08:00
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;
}
2025-03-27 14:52:07 +08:00
#endregion
2025-03-24 15:08:45 +08:00
#region 火情线索
2025-03-24 15:08:45 +08:00
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;
2025-11-09 10:35:43 +08:00
var today = DateTime.Now.Date;
var tomorrow = today.AddDays(1);
var exitinfo = db.FmFireclueInfo
.AsQueryable()
.Count(a => a.ReportTime >= today && a.ReportTime < tomorrow);
string excount = exitinfo.ToString("D3");
string sourceType = info.SourceType switch
{
1 => "R",
2 => "J",
3 => "W",
4 => "R",
5 => "G",
6 => "Y",
_ => "R"
};
// 生成线索编号
info.ClueNo = $"LH{DateTime.Now:yyyyMMdd}{excount}{sourceType}";
await db.FmFireclueInfo.InsertAsync(info);
await db.FmFireclueinfoLog.InsertAsync(new FmFireclueinfoLog
{
Id = YitIdHelper.NextId(),
Fireclueid = info.Id,
Title = "火情线索上报",
CreateTime = DateTime.Now,
CreateId = info.CreateId,
Content = info.Describe
});
if (db.Commit())
{
JPushInfo("火情信息", 0);
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
public async Task<Response<bool>> AddFireClueInfoGZFK(FmFireclueInfo info)
{
using (var db = base.UnitWork.CreateContext())
{
info.Id = YitIdHelper.NextId();
info.State = (int)State.;
info.ReportTime = DateTime.Now;
var today = DateTime.Now.Date;
var tomorrow = today.AddDays(1);
var exitinfo = db.FmFireclueInfo
.AsQueryable()
.Count(a => a.ReportTime >= today && a.ReportTime < tomorrow);
string excount = exitinfo.ToString("D3");
string sourceType = info.SourceType switch
{
1 => "R",
2 => "J",
3 => "W",
4 => "R",
5 => "G",
2025-11-09 10:35:43 +08:00
6 => "Y",
_ => "R"
};
// 生成线索编号
info.ClueNo = $"LH{DateTime.Now:yyyyMMdd}{excount}{sourceType}";
2025-03-24 15:08:45 +08:00
await db.FmFireclueInfo.InsertAsync(info);
2025-04-14 10:16:21 +08:00
await db.FmFireclueinfoLog.InsertAsync(new FmFireclueinfoLog
{
Id = YitIdHelper.NextId(),
Fireclueid = info.Id,
2025-04-14 11:13:20 +08:00
Title = "火情线索上报",
2025-04-14 10:16:21 +08:00
CreateTime = DateTime.Now,
CreateId = info.CreateId,
2025-04-14 11:13:20 +08:00
Content = info.Describe
2025-04-14 10:16:21 +08:00
});
2025-03-24 15:08:45 +08:00
if (db.Commit())
{
2025-11-09 10:58:29 +08:00
JPushInfo("火情信息", 0);
2025-03-24 15:08:45 +08:00
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-03-24 15:08:45 +08:00
/// <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 };
}
}
2025-04-08 10:48:11 +08:00
2025-04-01 14:32:29 +08:00
public async Task<Response<dynamic>> 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<dynamic> { Result = endInfo };
}
}
2025-03-24 15:08:45 +08:00
//查询火情线索列表
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 };
}
}
2025-04-08 10:48:11 +08:00
2026-01-07 15:57:17 +08:00
/// <summary>
/// 查询火情线索列表--后台使用
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<FmFireclueInfo>>>> GetFireCluePageList(FireClueInfoReq req)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var infos = await db.FmFireclueInfo.AsQueryable()
.WhereIF(req.state != null, r => r.State == req.state)
.WhereIF(req.sourcetype != null, r => r.SourceType == req.sourcetype)
.WhereIF(req.reporttimebegin != null && req.reporttimeend != null, r => r.ReportTime >= req.reporttimebegin && r.ReportTime <= req.reporttimeend)
.WhereIF(!string.IsNullOrEmpty(req.name), r=> r.Describe.Contains(req.name))
.WhereIF(!string.IsNullOrEmpty(req.adress), r=> r.Address.Contains(req.adress))
.ToPageListAsync(req.page, req.limit, totalNumber);
return new Response<PageInfo<List<FmFireclueInfo>>>
{
Result = new PageInfo<List<FmFireclueInfo>> { Items = infos, Total = totalNumber }
};
}
}
2025-04-02 11:35:00 +08:00
/// <summary>
/// 修改火情线索状态
/// </summary>
/// <param name="id"></param>
/// <param name="state"></param>
/// <returns></returns>
public async Task<Response<bool>> UpdatFireState(long id, int state)
{
using (var db = base.UnitWork.CreateContext())
{
var userId = _auth.GetCurrentUser().User.Id;
await db.FmFireclueInfo.UpdateAsync(r => new FmFireclueInfo
{
State = state,
ModifyTime = DateTime.Now,
ModifyId = userId
}, r => r.Id == id);
2025-04-14 10:16:21 +08:00
await db.FmFireclueinfoLog.InsertAsync(new FmFireclueinfoLog
{
Id = YitIdHelper.NextId(),
Fireclueid = id,
2025-04-14 11:13:20 +08:00
Title = "修改火情线索状态",
2025-04-14 10:16:21 +08:00
CreateTime = DateTime.Now,
CreateId = userId,
Content = "火情线索状态变化"
});
2025-04-02 11:35:00 +08:00
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-11-09 10:58:29 +08:00
/// <summary>
/// 添加火情日志
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<Response<bool>> AddFireClueLogInfo(FmFireclueinfoLog info)
{
using (var db = base.UnitWork.CreateContext())
{
var userId = _auth.GetCurrentUser().User.Id;
info.CreateId = userId;
info.CreateTime = DateTime.Now;
2025-11-09 10:58:29 +08:00
await db.FmFireclueinfoLog.InsertAsync(info);
if (db.Commit())
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
2025-03-24 15:08:45 +08:00
//按月统计火情线索
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();
2025-03-24 15:08:45 +08:00
return new Response<List<FireInfoForChart>> { Result = list };
}
}
}
2025-03-25 10:13:47 +08:00
public async Task<Response<List<FireInfoStateForChart>>> GetFireClueStatisticsByState(int type)
{
using (var db = base.UnitWork.CreateContext())
{
2026-01-07 10:15:56 +08:00
//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 };
//}
2025-03-25 10:13:47 +08:00
if (type == 1)
{
2026-01-07 10:15:56 +08:00
// 计算14天的日期范围
DateTime startDate = DateTime.Now.AddDays(-14).Date;
DateTime endDate = DateTime.Now.Date;
// 生成14天的日期列表
var dateRange = Enumerable.Range(0, (endDate - startDate).Days + 1)
.Select(offset => startDate.AddDays(offset))
.Select(date => new
2025-03-25 10:13:47 +08:00
{
2026-01-07 10:15:56 +08:00
Date = date,
DayString = date.Month.ToString() + "." + date.Day.ToString()
})
.ToList();
// 查询实际数据
var dataQuery = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime >= startDate && r.ReportTime <= endDate)
.GroupBy(r => new { r.ReportTime.Date })
.Select(r => new FireInfoState
{
Date = r.ReportTime.Date,
2025-03-25 10:13:47 +08:00
TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)),
UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0))
}).ToListAsync();
2026-01-07 10:15:56 +08:00
// 左连接,确保所有日期都显示
var list = (from date in dateRange
join data in dataQuery on date.Date equals data.Date into gj
from subData in gj.DefaultIfEmpty()
orderby date.Date ascending
select new FireInfoStateForChart
{
DateTime = date.DayString,
TreatedCount = subData?.TreatedCount ?? 0,
UntreatedCount = subData?.UntreatedCount ?? 0
})
.ToList();
2025-03-25 10:13:47 +08:00
return new Response<List<FireInfoStateForChart>> { Result = list };
}
else if (type == 2)
{
2026-01-07 10:15:56 +08:00
// 计算日期范围
var now = DateTime.Now;
var startDate = new DateTime(now.Year, now.Month, 1).AddMonths(-11);
var endDate = new DateTime(now.Year, now.Month, 1).AddMonths(1).AddDays(-1);
// 生成月份列表
var months = Enumerable.Range(0, 12)
.Select(i => new
{
2026-01-07 10:15:56 +08:00
Year = startDate.AddMonths(i).Year,
Month = startDate.AddMonths(i).Month,
Display = FormatMonthDisplay(startDate.AddMonths(i))
})
.ToList();
// 查询数据
var data = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime >= startDate && r.ReportTime <= endDate)
.GroupBy(r => new { r.ReportTime.Year, r.ReportTime.Month })
.Select(r => new
{
Year = r.ReportTime.Year,
Month = r.ReportTime.Month,
TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)),
UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0))
2026-01-07 10:15:56 +08:00
})
.ToListAsync();
// 使用LINQ左连接
var result = (from month in months
join d in data
on new { month.Year, month.Month } equals new { d.Year, d.Month } into gj
from subData in gj.DefaultIfEmpty()
orderby month.Year, month.Month
select new FireInfoStateForChart
{
DateTime = month.Display,
TreatedCount = subData?.TreatedCount ?? 0,
UntreatedCount = subData?.UntreatedCount ?? 0
}).ToList();
return new Response<List<FireInfoStateForChart>> { Result = result };
2025-03-25 10:13:47 +08:00
}
else
{
2026-01-07 10:15:56 +08:00
// 计算统计年份范围
int currentYear = DateTime.Now.Year;
int startYear = currentYear - 5 + 1;
// 生成年份范围
var years = Enumerable.Range(startYear, 5)
.Select(y => y)
.ToList();
// 查询数据
var queryData = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime.Year >= startYear && r.ReportTime.Year <= currentYear)
.GroupBy(r => r.ReportTime.Year)
.Select(r => new
{
2026-01-07 10:15:56 +08:00
Year = r.ReportTime.Year,
TreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State >= 3, 1, 0)),
UntreatedCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.State < 3, 1, 0))
2026-01-07 10:15:56 +08:00
})
.ToListAsync();
// 生成结果,确保所有年份都有数据
var result = new List<FireInfoStateForChart>();
foreach (var year in years)
{
var yearData = queryData.FirstOrDefault(d => d.Year == year);
result.Add(new FireInfoStateForChart
{
DateTime = year.ToString() + "年",
TreatedCount = yearData?.TreatedCount ?? 0,
UntreatedCount = yearData?.UntreatedCount ?? 0
});
}
return new Response<List<FireInfoStateForChart>> { Result = result };
2025-03-25 10:13:47 +08:00
}
}
}
2025-03-25 10:13:47 +08:00
public async Task<Response<List<FireInfoDegreeForChart>>> GetFireClueStatisticsByDegreeType(int type)
{
using (var db = base.UnitWork.CreateContext())
{
if (type == 1)
{
2026-01-07 10:15:56 +08:00
// 计算14天的日期范围
DateTime startDate = DateTime.Now.AddDays(-14).Date;
DateTime endDate = DateTime.Now.Date;
// 生成14天的日期列表
var dateRange = Enumerable.Range(0, (endDate - startDate).Days + 1)
.Select(offset => startDate.AddDays(offset))
.Select(date => new
2025-03-25 10:13:47 +08:00
{
2026-01-07 10:15:56 +08:00
Date = date,
DayString =date.Month.ToString()+"." +date.Day.ToString()
})
.ToList();
// 查询实际数据
var dataQuery = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime >= startDate && r.ReportTime <= endDate)
.GroupBy(r => new { r.ReportTime.Date })
.Select(r => new FireInfoDegree
{
Date = r.ReportTime.Date,
2025-03-25 10:13:47 +08:00
ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)),
LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0))
}).ToListAsync();
2026-01-07 10:15:56 +08:00
// 左连接,确保所有日期都显示
var list = (from date in dateRange
join data in dataQuery on date.Date equals data.Date into gj
from subData in gj.DefaultIfEmpty()
select new FireInfoDegreeForChart
{
DateTime = date.DayString,
ExtraLargeCount = subData?.ExtraLargeCount ?? 0,
LargeCount = subData?.LargeCount ?? 0
})
.OrderBy(x => x.DateTime) // 按日期排序
.ToList();
2025-03-25 10:13:47 +08:00
return new Response<List<FireInfoDegreeForChart>> { Result = list };
}
else if (type == 2)
{
2026-01-07 10:15:56 +08:00
// 计算日期范围
var now = DateTime.Now;
var startDate = new DateTime(now.Year, now.Month, 1).AddMonths(-11);
var endDate = new DateTime(now.Year, now.Month, 1).AddMonths(1).AddDays(-1);
// 生成月份列表
var months = Enumerable.Range(0, 12)
.Select(i => new
{
2026-01-07 10:15:56 +08:00
Year = startDate.AddMonths(i).Year,
Month = startDate.AddMonths(i).Month,
Display = FormatMonthDisplay(startDate.AddMonths(i))
})
.ToList();
// 查询数据
var data = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime >= startDate && r.ReportTime <= endDate)
.GroupBy(r => new { r.ReportTime.Year, r.ReportTime.Month })
.Select(r => new
{
Year = r.ReportTime.Year,
Month = r.ReportTime.Month,
ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)),
LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0))
2026-01-07 10:15:56 +08:00
})
.ToListAsync();
// 使用LINQ左连接
var result = (from month in months
join d in data
on new { month.Year, month.Month } equals new { d.Year, d.Month } into gj
from subData in gj.DefaultIfEmpty()
orderby month.Year, month.Month
select new FireInfoDegreeForChart
{
DateTime = month.Display,
ExtraLargeCount = subData?.ExtraLargeCount ?? 0,
LargeCount = subData?.LargeCount ?? 0
}).ToList();
return new Response<List<FireInfoDegreeForChart>> { Result = result };
2025-03-25 10:13:47 +08:00
}
else
{
2026-01-07 10:15:56 +08:00
// 计算统计年份范围
int currentYear = DateTime.Now.Year;
int startYear = currentYear - 5 + 1;
// 生成年份范围
var years = Enumerable.Range(startYear, 5)
.Select(y => y)
.ToList();
// 查询数据
var queryData = await db.FmFireclueInfo.AsQueryable()
.Where(r => r.ReportTime.Year >= startYear && r.ReportTime.Year <= currentYear)
.GroupBy(r => r.ReportTime.Year)
.Select(r => new
{
2026-01-07 10:15:56 +08:00
Year = r.ReportTime.Year,
ExtraLargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 1, 1, 0)),
LargeCount = SqlFunc.AggregateSum(SqlFunc.IIF(r.DegreeType == 2, 1, 0))
2026-01-07 10:15:56 +08:00
})
.ToListAsync();
// 生成结果,确保所有年份都有数据
var result = new List<FireInfoDegreeForChart>();
foreach (var year in years)
{
var yearData = queryData.FirstOrDefault(d => d.Year == year);
result.Add(new FireInfoDegreeForChart
{
DateTime = year.ToString() + "年",
ExtraLargeCount = yearData?.ExtraLargeCount ?? 0,
LargeCount = yearData?.LargeCount ?? 0
});
}
return new Response<List<FireInfoDegreeForChart>> { Result = result };
2025-03-25 10:13:47 +08:00
}
}
}
2026-01-07 10:15:56 +08:00
// 格式化月份显示
private string FormatMonthDisplay(DateTime date)
{
var currentYear = DateTime.Now.Year;
//if (date.Year == currentYear)
//{
// return $"{date.Month}月";
//}
//else if (date.Year == currentYear - 1)
//{
// return $"去年{date.Month}月";
//}
//else
//{
// return $"{date.Year % 100}年{date.Month}月";
//}
return $"{date.Year % 100}.{date.Month}";
}
2025-04-14 10:16:21 +08:00
//查询火情和任务列表
public async Task<Response<List<FmFireclueinfoLog>>> GetFireClueLog(long id)
{
using (var db = base.UnitWork.CreateContext())
{
var list = await db.FmFireclueinfoLog.AsQueryable()
.Where(r => r.Fireclueid == id)
.OrderByDescending(r => r.CreateTime).ToListAsync();
return new Response<List<FmFireclueinfoLog>> { Result = list };
}
}
2025-03-24 15:08:45 +08:00
#endregion
2025-03-28 16:41:12 +08:00
/// <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;
2025-03-31 14:16:34 +08:00
int level = 0;
2025-03-28 16:41:12 +08:00
//该用户下包含所有部门
var orgid = _auth.GetCurrentUser().Orgs;
2025-03-31 14:16:34 +08:00
level = orgid.Min(r => r.Level);
2025-03-28 16:41:12 +08:00
var chileorglist = new List<long>();
2025-03-31 14:16:34 +08:00
if (level != 0 && user.Id != -1)
2025-03-28 16:41:12 +08:00
{
2025-03-31 14:16:34 +08:00
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();
2025-03-31 14:16:34 +08:00
chileorglist.AddRange(chileorg);
}
2025-04-01 14:32:29 +08:00
}
2025-03-28 16:41:12 +08:00
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));
2025-03-28 16:41:12 +08:00
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)
2025-03-31 16:40:54 +08:00
.LeftJoin<SysOrg>((sf, gs) => sf.OrgId == gs.Id)
2025-03-31 14:16:34 +08:00
.LeftJoin<SysOrg>((sf, gs, t) => gs.ParentId == t.Id)
.SelectStringJoin((sf, gs, t) => gs.Name, ",")
2025-03-28 16:41:12 +08:00
})
.MergeTable()
2025-03-31 16:40:54 +08:00
.Distinct()
2025-03-28 16:41:12 +08:00
.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
2025-03-31 14:16:34 +08:00
.Where((a, b, c) => b.CreateTime.AddMinutes(2) > DateTime.Now)
2025-03-28 16:41:12 +08:00
.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 }
};
}
}
2025-03-31 16:40:54 +08:00
/// <summary>
/// 添加实时坐标
/// </summary>
/// <param name="userPoint"></param>
/// <returns></returns>
public async Task<Response<bool>> AddPointAsync(FmUserPoint userPoint)
{
2025-04-08 10:48:11 +08:00
var response = new Response<bool>();
2025-03-31 16:40:54 +08:00
using var db = Repository.AsSugarClient();
2025-04-01 14:32:29 +08:00
2025-04-08 10:48:11 +08:00
var currentUser = _auth.GetCurrentUser();
userPoint.CreateId = currentUser.User.Id;
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();
2025-04-01 14:32:29 +08:00
2025-04-08 10:48:11 +08:00
//上线弹窗 第一次上报或者上线时间不超过2分钟
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)
2025-03-31 16:40:54 +08:00
{
2025-04-08 10:48:11 +08:00
await db.Insertable(new FmOnOffLine
2025-03-31 16:40:54 +08:00
{
2025-04-08 10:48:11 +08:00
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);
2025-03-31 16:40:54 +08:00
}
2025-04-08 10:48:11 +08:00
}
2025-03-31 16:40:54 +08:00
2025-04-08 10:48:11 +08:00
if (oldInfo != null)
{
oldInfo.Lat = userPoint.Lat;
oldInfo.Lng = userPoint.Lng;
oldInfo.CreateTime = userPoint.CreateTime;
oldInfo.Intype = userPoint.Intype;
await db.Updateable(oldInfo).ExecuteCommandAsync();
2025-03-31 16:40:54 +08:00
}
else
{
2025-04-08 10:48:11 +08:00
await db.Insertable(userPoint).ExecuteCommandAsync();
2025-03-31 16:40:54 +08:00
}
2025-04-08 10:48:11 +08:00
await db.Insertable(userPointHistory).SplitTable().ExecuteCommandAsync();
response.Code = 200;
response.Result = true;
response.Message = "添加成功";
return response;
2025-03-31 16:40:54 +08:00
}
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)
{
}
}
2025-04-01 14:32:29 +08:00
/// <summary>
/// 保存地图标绘
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<bool>> SaveMapPlotting(MapPlottingReq req)
{
var record = req.MapTo<FmMapPlotting>();
record.Id = YitIdHelper.NextId();
using var db = Repository.AsSugarClient();
await db.Insertable(record).IgnoreColumnsNull().ExecuteCommandAsync();
return new Response<bool>()
{
Result = true,
Message = "保存成功",
Code = 200
};
}
public async Task<Response<PageInfo<dynamic>>> GetMapPlotting(PageReq req)
{
using var db = Repository.AsSugarClient();
RefAsync<int> total = 0;
var page = await db.Queryable<FmMapPlotting>()
.OrderByDescending(r => r.CreateTime)
.ToPageListAsync(req.page, req.limit, total);
return new Response<PageInfo<dynamic>>
{
Code = 200,
Message = "查询成功",
Result = new PageInfo<dynamic>
{
Items = page,
Total = total
}
};
}
2025-11-06 14:14:46 +08:00
/// <summary>
/// 查询人员上报的线索
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByUserId(int pageIndex, int state,
int pageSize, string userid)
2025-11-06 14:14:46 +08:00
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> total = 0;
var list = await db.FmFireclueInfo.AsQueryable().Where(a => a.CreateId.ToString() == userid).Select(a =>
new FireClueInfoResp
{
Id = a.Id,
CreateId = a.CreateId.ToString(),
ReportPerson = a.ReportPerson,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
ReportTime = a.ReportTime,
Describe = a.Describe,
SourceType = a.SourceType,
State = a.State,
AreaName = a.AreaName,
ClueNo = a.ClueNo,
}).Mapper(a => a.SourceTypeName = ((SourceType)a.SourceType).GetDescription())
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc).ToPageListAsync(pageIndex, pageSize, total);
2025-11-06 14:14:46 +08:00
return new Response<PageInfo<List<FireClueInfoResp>>>
{
Code = 200,
Message = "查询成功",
Result = new PageInfo<List<FireClueInfoResp>>
{
Items = list,
Total = total
}
};
}
}
2025-11-06 16:42:59 +08:00
private static readonly string baseUrl =
"http://10.176.126.121:8766/liveBroadCast/bd/api/v1/device/liveBroadCast";
2025-11-06 16:46:40 +08:00
private static readonly string sk = "ba98a152296f13c565d2a6dfd219994f"; // 用户的sk
private static readonly string account = "AK202006291525121"; // 用户的ak
2025-11-06 16:46:40 +08:00
public async Task<string> GetFlvUrlAsync(string deviceCode)
{
// 获取当前的时间戳
var requestTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
// 构建请求体
var requestBody = new
{
deviceCode = deviceCode
};
// 序列化请求体
var jsonBody = JsonConvert.SerializeObject(requestBody);
// 计算signature
var signature = CalculateSignature(requestTime, jsonBody);
// 创建 HttpClient 和 HttpRequestMessage
using (var client = new HttpClient())
{
// 创建 HttpRequestMessage 实例
var requestMessage = new HttpRequestMessage(HttpMethod.Post, baseUrl)
{
Content = new StringContent(jsonBody, Encoding.UTF8, "application/json")
};
// 设置请求头(其他类型的请求头设置在这里)
requestMessage.Headers.Add("account", account);
requestMessage.Headers.Add("requestTime", requestTime);
requestMessage.Headers.Add("signature", signature);
// 设置 Content-Type 和 Accept 请求头
requestMessage.Content.Headers.ContentType =
new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
requestMessage.Headers.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
2025-11-06 16:46:40 +08:00
// 发送请求
var response = await client.SendAsync(requestMessage);
if (response.IsSuccessStatusCode)
{
// 解析响应
var responseContent = await response.Content.ReadAsStringAsync();
dynamic responseData = JsonConvert.DeserializeObject(responseContent);
// 检查返回的code是否为0
if (responseData.code == "0")
{
return responseData.data.flvUrl;
}
else
{
throw new Exception($"API error: {responseData.message}");
}
}
else
{
throw new Exception($"HTTP request failed with status code {response.StatusCode}");
}
}
}
private string CalculateSignature(string requestTime, string requestBody)
{
// 按照要求的计算规则计算signature
string dataToSign = account + sk + requestTime + requestBody;
// 使用SHA256算法计算签名
using (SHA256 sha256 = SHA256.Create())
{
byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
2025-11-06 16:46:40 +08:00
public async Task<string> GetLive(string deviceCode)
{
string flvUrl = await GetFlvUrlAsync(deviceCode);
return flvUrl;
}
2025-11-08 13:53:33 +08:00
#region socket
2025-11-08 13:53:33 +08:00
public async Task SendSocketMessage(WebSocketModel wsModel)
{
try
{
using (var webSocket = new System.Net.WebSockets.ClientWebSocket())
{
string ws = _configuration.GetSection("WebSocket").Value;
await webSocket.ConnectAsync(new Uri(ws), CancellationToken.None);
byte[] data = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(wsModel));
await webSocket.SendAsync(new ArraySegment<byte>(data),
System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
await webSocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure,
"Closing connection", CancellationToken.None);
2025-11-08 13:53:33 +08:00
//webSocket.Dispose();
}
}
catch (Exception ex)
{
}
}
/// <summary>
/// 极光推送
/// </summary>
/// <returns></returns>
public string JPushInfo(string info, long infoid)
{
using (var db = base.UnitWork.CreateContext())
{
int type = info == "任务下发" ? 2 : 3;
info = info == "任务下发" ? "有新任务,请注意查收" : "有新火点";
Audience audience = new Audience();
if (infoid != 0)
{
var renwu = db.FmFireTaskUser.AsQueryable().Where(r => r.TaskId == infoid).Select(r => r.UserId)
.ToList();
2025-11-08 13:53:33 +08:00
var users = db.User.AsQueryable().Where(r => renwu.Contains(r.Id.ToString())).ToList();
if (users.Count > 0)
{
audience.Alias = users.Select(a => a.Account).ToList();
}
}
else
{
var users = db.User.AsQueryable().Where(r => r.UnitName != null).ToList();
if (users.Count > 0)
{
audience.Alias = users.Select(a => a.Account).ToList();
}
}
2025-11-08 13:53:33 +08:00
PushPayload pushPayload = new PushPayload()
{
Platform = new List<string> { "android", "ios" },
Audience = audience,
Notification = new Notification
{
Alert = info,
Android = new Android
{
Alert = info,
Title = info,
Priority = 2,
Extras = new Dictionary<string, object>
{
["infoId"] = type,
["type"] = type
}
}
},
};
JPushClient client = new JPushClient(_jpoptions.Value.AppKey, _jpoptions.Value.MasterSecret);
var response = client.SendPush(pushPayload);
return "success";
}
}
2025-11-08 13:53:33 +08:00
#endregion
2025-11-06 16:46:40 +08:00
#region 海康设备
2025-11-06 16:46:40 +08:00
/// <summary>
/// 获取单个设备的视频流
/// </summary>
/// <param name="cameraIndexCode">视频标识</param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public string GetPreviewURLs(string cameraIndexCode, string protocol)
{
HttpUtillib.SetPlatformInfo(_options.Value.AppKey, _options.Value.SecretKey, _options.Value.Url,
_options.Value.Port, true);
2025-11-06 16:46:40 +08:00
var obj = new
{
cameraIndexCode,
streamType = 0,
protocol = protocol,
transmode = 1,
expand = "transcode=0",
streamform = "ps"
};
string body = JsonConvert.SerializeObject(obj);
string uri = "/artemis/api/video/v2/cameras/previewURLs";
byte[] result = HttpUtillib.HttpPost(uri, body, 15, 1);
if (null != result)
{
return Encoding.UTF8.GetString(result);
}
2025-11-06 16:46:40 +08:00
return "fail";
}
2026-01-05 11:16:42 +08:00
/// <summary>
/// 获取单个设备的视频流---海康平台2
/// </summary>
/// <param name="cameraIndexCode">视频标识</param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public string GetPreviewURLs2(string cameraIndexCode, string protocol)
{
HttpUtillib.SetPlatformInfo(_options2.Value.AppKey, _options2.Value.SecretKey, _options2.Value.Url,
_options2.Value.Port, true);
var obj = new
{
cameraIndexCode,
streamType = 0,
protocol = protocol,
transmode = 1,
expand = "transcode=0",
streamform = "ps"
};
string body = JsonConvert.SerializeObject(obj);
string uri = "/artemis/api/video/v2/cameras/previewURLs";
byte[] result = HttpUtillib.HttpPost(uri, body, 15, 1);
2026-01-17 16:13:39 +08:00
if (null != result)
{
return Encoding.UTF8.GetString(result);
}
return "fail";
}
/// <summary>
/// 获取单个设备的视频流--通用
/// </summary>
/// <param name="cameraIndexCode">设备唯一标识吗</param>
/// <param name="url">设备地址192.168.10.163</param>
/// <param name="appkey"></param>
/// <param name="appsecret"></param>
/// <param name="port">设备端口例1443</param>
/// <param name="protocol"></param>
/// <returns></returns>
public string GetPreviewURL(string cameraIndexCode,string url,string appkey,string appsecret,int port, string protocol)
{
HttpUtillib.SetPlatformInfo(appkey, appsecret, url, port, true);
var obj = new
{
cameraIndexCode,
streamType = 0,
protocol = protocol,
transmode = 1,
expand = "transcode=0",
streamform = "ps"
};
string body = JsonConvert.SerializeObject(obj);
string uri = "/artemis/api/video/v2/cameras/previewURLs";
byte[] result = HttpUtillib.HttpPost(uri, body, 15, 1);
2026-01-05 11:16:42 +08:00
if (null != result)
{
return Encoding.UTF8.GetString(result);
}
return "fail";
}
2026-01-12 10:03:51 +08:00
public async Task<Response<dynamic>> ListCameraWithInRange(string lng, string lat, int radius)
{
// '{lng}', '{lat}'
var sql =
@$"WITH reference_point AS ( SELECT ST_SetSRID ( ST_MakePoint ( '{lng}', '{lat}' )::geography, 4326 ) AS geom ) SELECT
l.*
FROM
fm_camera l,
reference_point r
WHERE
ST_DWithin ( ST_SetSRID ( ST_MakePoint ( l.""Lng"" :: FLOAT, l.""Lat"" :: FLOAT )::geography, 4326 ), r.geom, {radius}
)
ORDER BY
ST_Distance ( ST_SetSRID ( ST_MakePoint ( l.""Lng"" :: FLOAT, l.""Lat"" :: FLOAT )::geography, 4326 ), r.geom ) ";
var x = await Repository.AsSugarClient().SqlQueryable<dynamic>(sql).ToListAsync();
return new Response<dynamic>
{
Result = x
};
}
public async Task<Response<dynamic>> ListDaHuaCameraInfo(int pageNum, int pageSize, int isOnline)
{
var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077");
var channelCategoryRequest = new ChannelCategoryRequest
{
pageNum = pageNum,
pageSize = pageSize,
isOnline = 1,
unitTypeList = new List<int> { 1 },
};
Console.WriteLine(JsonConvert.SerializeObject(channelCategoryRequest));
var channelCategoryResponse = await daHuaApi.GetChannelCategoriesAsync(channelCategoryRequest);
if (channelCategoryResponse.success)
{
return new Response<dynamic>
{
Result = channelCategoryResponse.data.pageData
};
}
return new Response<dynamic>
{
Code = channelCategoryResponse.code,
Message = channelCategoryResponse.errMsg
};
}
public async Task<Response<dynamic>> GetDaHuaRtsp(string channelCode, string streamType)
{
var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077");
var request = new RtspPreviewRequest
{
data = new RtspPreviewData
{
channelId = channelCode,
dataType = "1",
streamType = streamType //主码流
}
};
var y = await daHuaApi.StartRtspPreviewAsync(request);
if (y.success)
{
return new Response<dynamic>
{
Result = y.data
};
}
return new Response<dynamic>
{
Code = y.code,
Message = y.errMsg
};
}
/// <summary>
/// 获取设备信息
/// </summary>
/// <param name="county"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public TableData LoadCameraInfo(string county, int pageIndex, int pageSize)
{
TableData data = new TableData();
ConnectionConfig connectionConfig = new ConnectionConfig
{
ConnectionString = "server=10.176.126.121;Port=33066;Database=inspur_ztk;Uid=lyyj;Pwd=Lyyj1024",
DbType = DbType.MySql,
IsAutoCloseConnection = true,
MoreSettings = new ConnMoreSettings()
{
PgSqlIsAutoToLower = false,//增删查改支持驼峰表
}
};
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
int totalCount = 0;
var list = db.Queryable<ztk_jcjk_jkdw>()
.WhereIF(!string.IsNullOrEmpty(county), r => r.qx.Contains(county))
.Select(r => new ztk_jcjk_jkdw()
{
id = r.id.SelectAll(),
})
.ToPageList(pageIndex, pageSize, ref totalCount);
data.data = list;
data.count = totalCount;
data.code = 200;
data.msg = "请求成功";
}
return data;
}
/// <summary>
/// 获取应急局摄像头信息---添加到数据库表
/// </summary>
/// <param name="county"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<Response<bool>> AddCameraInfoYingJi(string county)
{
ConnectionConfig connectionConfig = new ConnectionConfig
{
ConnectionString = "server=10.176.126.121;Port=33066;Database=inspur_ztk;Uid=lyyj;Pwd=Lyyj1024",
DbType = DbType.MySql,
IsAutoCloseConnection = true,
MoreSettings = new ConnMoreSettings()
{
PgSqlIsAutoToLower = false,//增删查改支持驼峰表
}
};
List<FmCamera> fclist=new List<FmCamera>();
using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
{
//var list = db.Queryable<ztk_jcjk_jkdw>()
// .WhereIF(!string.IsNullOrEmpty(county), r => r.qx.Contains(county))
// .Select(r => new ztk_jcjk_jkdw()
// {
// id = r.id.SelectAll(),
// })
// .ToList();
//foreach(var item in list)
//{
// FmCamera fc=new FmCamera();
// fc.Id = Guid.NewGuid().ToString();
// fc.Name = item.jkdmckjg+"_热成像";
// fc.Model = "ShiYingJiReChengXiang";
// fc.Status = item.tyzt; //停用状态
// fc.Manufacturer = "大华";
// fc.SerialNumber = item.jkdgbidzlkjg;
// fc.Ip = "221.2.83.254";
// fc.Channel = 0;
// fc.Lng = item.jd.ToString();
// fc.Lat = item.wd.ToString();
// fc.UpdateTime = DateTime.Now;
// fc.AppKey = null;
// fc.AppSecret = null;
// fc.Port = "7012";
// fc.RegionPathName = item.ssfz;
// fc.CameraType = null;
// fc.SerialNumberRcx = item.jkdgbidzlrcx;
// fclist.Add(fc);
//}
}
using (var db = base.UnitWork.CreateContext())
{
var list = db.FmCamera_yjj.AsQueryable().ToList();
foreach (var item in list)
{
FmCamera fc = new FmCamera();
fc.Id = Guid.NewGuid().ToString();
fc.Name = item.jkdmckjg + "_热成像";
fc.Model = "ShiYingJiReChengXiang";
fc.Status = item.tyzt; //停用状态
fc.Manufacturer = "大华";
fc.SerialNumber = item.jkdgbidzlkjg;
fc.Ip = "221.2.83.254";
fc.Channel = 0;
fc.Lng = item.jd.ToString();
fc.Lat = item.wd.ToString();
fc.UpdateTime = DateTime.Now;
fc.AppKey = null;
fc.AppSecret = null;
fc.Port = "7012";
fc.RegionPathName = item.ssfz;
fc.CameraType = null;
fc.SerialNumberRcx = item.jkdgbidzlrcx;
fclist.Add(fc);
}
var flag= await db.FmCamera.InsertRangeAsync(fclist);
if (db.Commit()&&flag==true)
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
/// <summary>
/// 海康摄像头添加
/// </summary>
/// <param name="ip">海康平台ip</param>
/// <param name="port">海康平台端口</param>
/// <param name="pathid">组织架构路径id</param>
/// <param name="appkey">appkey</param>
/// <param name="appsecret">appsecret</param>
/// <returns></returns>
public async Task<Response<bool>>AddHaiKangCameraInfo(string ip, int port,string pathid,string appkey, string appsecret,int pageno=1,int pagesize=100)
{
// 设置平台信息
HttpUtillib.SetPlatformInfo(appkey, appsecret, ip, port, true);
// 构建请求参数
var obj = new
{
regionIndexCodes = new string[] { pathid }, // 确保是数组格式
isSubRegion = true,
pageNo = pageno,
pageSize = pagesize, // 建议不要设置过大,海康可能有最大限制
orderBy="name",
orderType= "desc"
};
string body = JsonConvert.SerializeObject(obj);
string uri = "/artemis/api/resource/v2/camera/search";
byte[] result = HttpUtillib.HttpPost(uri, body, 15,1);
List<FmCamera> fclist = new List<FmCamera>();
var param = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(result));
var data= param["data"]["list"];
using (var db = base.UnitWork.CreateContext())
{
foreach (var item in data)
{
//string sql = @"select * from fm_camera1 WHERE ""SerialNumber""='" + item["indexCode"] + "'";
//var cam=await Repository.AsSugarClient().SqlQueryable<dynamic>(sql).ToListAsync();
//if (cam.Count>0)
//{
FmCamera fc = new FmCamera();
fc.Id = Guid.NewGuid().ToString();
fc.Name = item["name"].ToString();
var type = item["regionPathName"].ToString();
if (type.IndexOf("林场") > -1)
{
fc.Model = "LinQuSheXiangTou";
}
else
{
if (type.IndexOf("林下") > -1)
{
fc.Model = "ShengTaiLinShiPinJianKong";
}
else
{
if (type.IndexOf("高空瞭望") > -1)
{
fc.Model = "GaoKongLiaoWang";
}
else
{
fc.Model = "ShiPinJianKong";
}
}
}
fc.Status = "0"; //停用状态
fc.Manufacturer = "海康";
fc.SerialNumber = item["indexCode"].ToString();
fc.Ip = ip;
fc.Channel = 0;
fc.Lng = item["longitude"].ToString();
fc.Lat = item["latitude"].ToString();
fc.UpdateTime = Convert.ToDateTime(item["createTime"].ToString());
fc.AppKey = appkey;
fc.AppSecret = appsecret;
fc.Port = port.ToString();
fc.RegionPathName = item["regionPathName"].ToString();
fc.CameraType = Convert.ToInt32(item["cameraType"]);
fc.SerialNumberRcx = null;
fclist.Add(fc);
//}
//else
//{
// continue;
//}
}
var flag = await db.FmCamera.InsertRangeAsync(fclist);
if (db.Commit() && flag == true)
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
public async Task<Response<bool>> AddHaiKangCameraInfoBeiFen(string ip, int port, string pathid, string appkey, string appsecret, int pageno = 1, int pagesize = 100)
{
// 设置平台信息
HttpUtillib.SetPlatformInfo(appkey, appsecret, ip, port, true);
// 构建请求参数
var obj = new
{
regionIndexCodes = new string[] { pathid }, // 确保是数组格式
isSubRegion = true,
pageNo = pageno,
pageSize = pagesize, // 建议不要设置过大,海康可能有最大限制
orderBy = "name",
orderType = "desc"
};
string body = JsonConvert.SerializeObject(obj);
string uri = "/artemis/api/resource/v2/camera/search";
byte[] result = HttpUtillib.HttpPost(uri, body, 15, 1);
List<FmCamera> fclist = new List<FmCamera>();
var param = JsonConvert.DeserializeObject<JObject>(Encoding.UTF8.GetString(result));
var data = param["data"]["list"];
using (var db = base.UnitWork.CreateContext())
{
foreach (var item in data)
{
string sql = @"select * from fm_camera1 WHERE ""SerialNumber""='" + item["indexCode"] + "'";
var cam = await Repository.AsSugarClient().SqlQueryable<dynamic>(sql).ToListAsync();
if (cam.Count > 0)
{
FmCamera fc = new FmCamera();
fc.Id = Guid.NewGuid().ToString();
fc.Name = item["name"].ToString();
var type = item["regionPathName"].ToString();
if (type.IndexOf("林场") > -1)
{
fc.Model = "LinQuSheXiangTou";
}
else
{
if (type.IndexOf("生态林") > -1)
{
fc.Model = "ShengTaiLinShiPinJianKong";
}
else
{
if (type.IndexOf("高空瞭望") > -1)
{
fc.Model = "GaoKongLiaoWang";
}
else
{
fc.Model = "ShiPinJianKong";
}
}
}
fc.Status = "0"; //停用状态
fc.Manufacturer = "海康";
fc.SerialNumber = item["indexCode"].ToString();
fc.Ip = ip;
fc.Channel = 0;
fc.Lng = item["longitude"].ToString();
fc.Lat = item["latitude"].ToString();
fc.UpdateTime = Convert.ToDateTime(item["createTime"].ToString());
fc.AppKey = appkey;
fc.AppSecret = appsecret;
fc.Port = port.ToString();
fc.RegionPathName = item["regionPathName"].ToString();
fc.CameraType = Convert.ToInt32(item["cameraType"]);
fc.SerialNumberRcx = null;
fclist.Add(fc);
}
else
{
continue;
}
}
var flag = await db.FmCamera.InsertRangeAsync(fclist);
if (db.Commit() && flag == true)
{
return new Response<bool> { Result = true, Message = "操作成功" };
}
else
{
return new Response<bool> { Result = false, Message = "操作失败" };
}
}
}
/// <summary>
/// 查询摄像头信息--后台使用
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<FmCamera>>>> GetCameraInfoPageList(FmCameraReq req)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var infos = await db.FmCamera.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(req.name), r => r.Name.Contains(req.name))
.WhereIF(!string.IsNullOrEmpty(req.model), r => r.Model==req.model)
.WhereIF(!string.IsNullOrEmpty(req.manufacturer), r => r.Manufacturer.Contains(req.manufacturer))
.WhereIF(!string.IsNullOrEmpty(req.serialnumber), r => r.SerialNumber.Contains(req.serialnumber))
.ToPageListAsync(req.page, req.limit, totalNumber);
return new Response<PageInfo<List<FmCamera>>>
{
Result = new PageInfo<List<FmCamera>> { Items = infos, Total = totalNumber }
};
}
}
2025-11-06 16:46:40 +08:00
#endregion
2025-11-06 17:01:34 +08:00
#region 人员类型统计
2025-11-06 16:42:59 +08:00
/// <summary>
/// 人员类型统计
/// </summary>
/// <returns></returns>
public async Task<Response<UserTypeStatisticsRes>> GetUserTypeStatistics()
{
using var db = Repository.AsSugarClient();
//护林员
var hulin = await db.Queryable<SysUserRole>().LeftJoin<SysRole>((s, r) => s.RoleId == r.Id)
.LeftJoin<SysUser>((s, r, u) => s.UserId == u.Id)
.Where((s, r, u) => r.Name == "护林员" && u.Id > 0)
.CountAsync();
//消防员
var xiaofang = await db.Queryable<FmFirefighterinfo>().CountAsync();
//驻防部队
var zhufang = await db.Queryable<FmZhufangbudui>().CountAsync();
//林区住户
2025-11-08 13:53:33 +08:00
var linqu = await db.Queryable<FmLinquzhuhu>().CountAsync();
2025-11-06 16:42:59 +08:00
//向导
2025-11-08 13:53:33 +08:00
var xiangdao = await db.Queryable<FmXiangdaouser>().CountAsync();
2025-11-06 16:42:59 +08:00
//防火驿站
2025-11-08 13:53:33 +08:00
var yizhan = await db.Queryable<FmFanghuoyizhan>().CountAsync();
2025-11-06 16:42:59 +08:00
2025-11-08 13:53:33 +08:00
UserTypeStatisticsRes res = new UserTypeStatisticsRes();
2025-11-06 16:42:59 +08:00
res.hulinyuan = hulin;
2025-11-08 13:53:33 +08:00
res.xiaofangyuan = xiaofang;
res.zhufangduiwu = zhufang;
res.linquzhuhu = linqu;
res.xiangdao = xiangdao;
res.fanghuoyizhan = yizhan;
2025-11-06 16:42:59 +08:00
return new Response<UserTypeStatisticsRes>
{
Code = 200,
Message = "查询成功",
Result = res
};
}
2025-11-06 16:42:59 +08:00
#endregion
2025-11-07 11:41:12 +08:00
#region 获取物资相关接口
2025-11-07 11:41:12 +08:00
/// <summary>
/// 获取全部营房信息
/// </summary>
/// <returns></returns>
public dynamic GetAllYingFang()
{
string sql =
@"SELECT ""id"",""dwmc"",""dwzd"",""lsdw"",""dwzdjd"",""dwzdwd"",""dzxm"",""lxfs"",""syrs"",""zbqk"",""tbr"", st_astext(""geom"") as geom FROM ""fm_shp_1692148217"" ";
2025-11-07 11:41:12 +08:00
using (var db = Repository.AsSugarClient())
{
var list = db.SqlQueryable<dynamic>(sql).ToList();
return list;
}
}
/// <summary>
/// 获取物资储备信息
/// </summary>
/// <returns></returns>
public TableData Loadwuzichubei(string wuzi, string areaname)
{
TableData data = new TableData();
using (var db = Repository.AsSugarClient())
{
string sql = string.Empty;
if (!string.IsNullOrEmpty(wuzi))
sql =
"SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" WHERE info like '%" +
wuzi + "%'";
2025-11-07 11:41:12 +08:00
else
sql = "SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" ";
var dt = db.Ado.GetDataTable(sql.ToString());
data.count = dt.Rows.Count;
data.data = dt;
}
2025-11-07 11:41:12 +08:00
return data;
}
2025-11-07 11:41:12 +08:00
#endregion
2025-11-08 13:53:33 +08:00
#region 任务相关
/// <summary>
/// 查询我的任务
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueTaskResp>>>> LoadFireClueTaskByUserId(string userid,
int pageIndex, int pageSize)
2025-11-08 13:53:33 +08:00
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var query = await db.FmFireclueTask.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.TaskUser == b.Id.ToString())
.LeftJoin<FmFireTaskUser>((a, b, c) => a.Id == c.TaskId)
.Where((a, b, c) => a.IsDelete == false)
.Where((a, b, c) => c.UserId == userid)
.Select((a, b, c) => new FireClueTaskResp()
{
Id = a.Id,
Content = a.Content,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
State = c.State,
TaskUserName = b.Name,
TaskTime = a.TaskTime,
CompleteTime = a.CompleteTime,
Audio = a.Audio,
Image = a.Image,
}).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription())
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
2025-11-08 13:53:33 +08:00
return new Response<PageInfo<List<FireClueTaskResp>>>
{
Result = new PageInfo<List<FireClueTaskResp>> { Items = query, Total = totalNumber }
};
}
}
2025-11-08 13:53:33 +08:00
/// <summary>
/// 查询所有任务
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueTaskResp>>>> LoadAllTask(int pageIndex, int pageSize)
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var query = await db.FmFireclueTask.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.TaskUser == b.Id.ToString())
.Where((a, b) => a.IsDelete == false)
.Select((a, b) => new FireClueTaskResp()
{
Id = a.Id,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
State = a.State,
TaskUserName = b.Name,
Content = a.Content,
Image = a.Image,
Audio = a.Audio,
TaskTime = a.TaskTime,
RecipientUsers = SqlFunc.Subqueryable<FmFireTaskUser>().Where(r => r.TaskId == a.Id)
.LeftJoin<SysUser>((r, s) => r.UserId == s.Id.ToString())
.SelectStringJoin((a, s) => s.Name, ","),
2025-11-08 13:53:33 +08:00
}).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription())
.OrderBy(a => a.TaskTime, OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
2025-11-08 13:53:33 +08:00
return new Response<PageInfo<List<FireClueTaskResp>>>
{
Result = new PageInfo<List<FireClueTaskResp>> { Items = query, Total = totalNumber }
};
}
}
2025-11-08 13:53:33 +08:00
/// <summary>
/// 查询火情线索
/// </summary>
/// <param name="areaname"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<FireClueInfoResp>>>> LoadFireClueInfoByAreaName(string areaname,
int pageIndex = 1, int pageSize = 10)
2025-11-08 13:53:33 +08:00
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var query = await db.FmFireclueInfo.AsQueryable()
2025-11-08 15:03:55 +08:00
.WhereIF(!string.IsNullOrEmpty(areaname), (a) => a.AreaName == areaname)
2025-11-08 13:53:33 +08:00
.Where(a => a.State == (int)State.)
.Select((a) => new FireClueInfoResp()
{
Id = a.Id,
CreateId = a.CreateId.ToString(),
ReportPerson = a.ReportPerson,
Lat = a.Lat,
Lng = a.Lng,
Address = a.Address,
ReportTime = a.ReportTime,
Describe = a.Describe,
SourceType = a.SourceType,
State = a.State,
AreaName = a.AreaName,
ClueNo = a.ClueNo,
Image = a.Image,
EventId = a.EventId,
Audio = a.Audio,
FireType = 1
})
.Mapper(a => a.SourceTypeName = ((SourceType)a.SourceType).GetDescription())
.Mapper(a => a.StateName = ((State)a.State).GetDescription())
.OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc)
.ToPageListAsync(pageIndex, pageSize, totalNumber);
2025-11-08 13:53:33 +08:00
return new Response<PageInfo<List<FireClueInfoResp>>>
{
Result = new PageInfo<List<FireClueInfoResp>> { Items = query, Total = totalNumber }
};
}
}
2025-11-08 13:53:33 +08:00
/// <summary>
/// App获取在线人员实时位置信息
/// </summary>
/// <param name="areaname"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<Response<List<RYResApp>>> GetPointByAPPAsync()
{
using (SugarDbContext db = base.UnitWork.CreateContext())
{
RefAsync<int> totalNumber = 0;
var query = await db.FmUserPoint.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.CreateId == b.Id)
.Where((a, b) => a.CreateTime.AddMinutes(2) > DateTime.Now)
.Select((a, b) => new RYResApp
{
CreateId = a.CreateId.ToString(),
Name = b.Name,
Lat = a.Lat,
Lng = a.Lng,
CreateTime = a.CreateTime,
Type = "人员",
Phone = b.Account,
top = a.Top,
iscontacts = a.IsContacts
}).ToListAsync();
return new Response<List<RYResApp>>
{
Result = query
};
}
}
2025-11-08 13:53:33 +08:00
#endregion
2026-01-06 10:16:12 +08:00
#region 感知中心--摄像头类型
2026-01-06 11:28:21 +08:00
/// <summary>
/// 感知中心--摄像头类型数量统计
/// </summary>
/// <returns></returns>
2026-01-06 15:05:17 +08:00
public async Task<Response<List<CameraCountRes>>> GetCameraCountByType()
2026-01-06 10:16:12 +08:00
{
using (var db = base.UnitWork.CreateContext())
{
var typelist = await db.SysDataItemDetail.AsQueryable()
.Where(r => r.ItemCode == "FMCamera").ToListAsync();
var cameralist = await db.FmCamera.AsQueryable().Select(r => new
{
r.Id,
r.Name,
r.Manufacturer
}).ToListAsync();
var camerajj = await db.FmCamera_yjj.AsQueryable().Select<dynamic>(r => new
{
r.id,
r.jkdmckjg,
r.jklx
}).ToListAsync();
List<CameraCountRes> clist = new List<CameraCountRes>();
foreach (var item in typelist)
{
CameraCountRes cs = new CameraCountRes();
cs.title = item.ItemName;
if (item.ItemValue == "ShiYingJiReChengXiang")
{
cs.num = camerajj.Where(r => r.jklx == "森火-市局").Count().ToString();
}
if (item.ItemValue == "ZhiNengYuYinQiaKou")
{
cs.num = camerajj.Where(r => r.jklx == "防火卡口").Count().ToString();
}
if (item.ItemValue == "ShengTaiLinShiPinJianKong")
{
cs.num = camerajj.Where(r => r.jklx == "森火").Count().ToString();
}
if (item.ItemValue == "GaoKongLiaoWang")
{
cs.num = (camerajj.Where(r => r.jklx == "森火").Count() + 2).ToString();
}
if (item.ItemValue == "ShiPinJianKong")
{
cs.num = cameralist.Where(r => r.Manufacturer == "海康").Take(458).Count().ToString();
}
if (item.ItemValue == "LinQuSheXiangTou")
{
cs.num = cameralist.Where(r => r.Manufacturer == "海康").Take(325).Count().ToString();
}
2026-01-06 11:28:21 +08:00
if (item.ItemValue == "TieTaJianKong")
2026-01-06 10:16:12 +08:00
{
2026-01-06 11:28:21 +08:00
cs.num = cameralist.Where(r => r.Manufacturer == "海康").Take(63).Count().ToString();
}
if (item.ItemValue == "WuRenJiJiChang")
{
cs.num = "2";
}
if (item.ItemValue == "FeiXianXianYouJiZhan")
{
cs.num = cameralist.Where(r => r.Manufacturer == "海康2").Count().ToString();
2026-01-06 10:16:12 +08:00
}
2026-01-06 11:28:21 +08:00
clist.Add(cs);
2026-01-06 10:16:12 +08:00
}
2026-01-06 15:05:17 +08:00
return new Response<List<CameraCountRes>>
2026-01-06 10:16:12 +08:00
{
2026-01-06 15:05:17 +08:00
Result = clist
2026-01-06 10:16:12 +08:00
};
}
}
#endregion
2025-03-21 16:42:48 +08:00
}
2025-03-31 16:40:54 +08:00
}