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 ;
2025-03-29 16:42:55 +08:00
using Microsoft.AspNetCore.Http ;
2025-04-01 16:35:23 +08:00
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 ;
2025-03-29 16:42:55 +08:00
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 ;
2025-11-26 14:00:52 +08:00
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 ;
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 ;
2025-11-08 13:53:33 +08:00
IOptions < JPushClientConfig > _jpoptions ;
2025-11-26 14:00:52 +08:00
public FireManagementApp ( IConfiguration configuration , IOptions < KikvisionConfig > options ,
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 ;
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-04-01 16:35:23 +08:00
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-11-26 14:00:52 +08:00
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-26 14:00:52 +08:00
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-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-10 14:35:55 +08:00
class ReciveTaskInfo
{
public long taskid { get ; set ; }
public string path { get ; set ; }
}
2025-11-26 14:00:52 +08:00
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 } ;
}
}
2025-04-01 16:35:23 +08:00
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-26 14:00:52 +08:00
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 ,
} )
2025-11-26 14:00:52 +08:00
. 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-26 14:00:52 +08:00
2025-11-08 15:03:55 +08:00
return new Response < FireClueTaskResp > { Result = info } ;
}
}
2025-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
2025-03-27 14:52:07 +08:00
#region 单位管理
2025-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
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 = "操作失败" } ;
}
}
}
2025-03-29 16:42:55 +08:00
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 ( ) )
{
2025-04-01 16:35:23 +08:00
workbook = new XSSFWorkbook ( stream ) ; //excel的版本2007
2025-03-29 16:42:55 +08:00
}
}
else if ( file . FileName . IndexOf ( ".xls" ) > 0 )
{
using ( var stream = file . OpenReadStream ( ) )
{
2025-04-01 16:35:23 +08:00
workbook = new HSSFWorkbook ( stream ) ; //excel的版本2003
2025-03-29 16:42:55 +08:00
}
}
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 ;
2025-03-29 16:42:55 +08:00
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 = "上传文件类型错误" ;
}
2025-04-01 16:35:23 +08:00
2025-03-29 16:42:55 +08:00
return response ;
}
2025-04-01 16:35:23 +08:00
2025-03-27 14:52:07 +08:00
# endregion
2025-04-01 16:35:23 +08:00
2025-03-24 15:08:45 +08:00
#region 火情线索
2025-04-01 16:35:23 +08:00
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 = > "R" ,
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-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
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
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-26 14:00:52 +08:00
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 ;
2025-11-26 14:00:52 +08:00
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-11-26 14:00:52 +08:00
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 ( )
2025-04-01 16:35:23 +08:00
//.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 ( ) )
{
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 ( )
2025-04-01 16:35:23 +08:00
. 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 ( ) ;
2025-03-25 10:13:47 +08:00
return new Response < List < FireInfoStateForChart > > { Result = list } ;
}
else
{
DateTime firstDayOfYear = DateTime . Now . AddYears ( - 3 ) ;
var list = await db . FmFireclueInfo . AsQueryable ( )
2025-04-01 16:35:23 +08:00
. 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 ( ) ;
2025-03-25 10:13:47 +08:00
return new Response < List < FireInfoStateForChart > > { Result = list } ;
}
}
}
2025-04-01 16:35:23 +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 )
{
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 ( )
2025-04-01 16:35:23 +08:00
. 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 ( ) ;
2025-03-25 10:13:47 +08:00
return new Response < List < FireInfoDegreeForChart > > { Result = list } ;
}
else
{
DateTime firstDayOfYear = DateTime . Now . AddYears ( - 3 ) ;
var list = await db . FmFireclueInfo . AsQueryable ( )
2025-04-01 16:35:23 +08:00
. 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 ( ) ;
2025-03-25 10:13:47 +08:00
return new Response < List < FireInfoDegreeForChart > > { Result = list } ;
}
}
}
2025-04-01 16:35:23 +08:00
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-11-26 14:00:52 +08:00
2025-03-24 15:08:45 +08:00
# endregion
2025-04-01 16:35:23 +08:00
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 ) )
{
2025-04-01 16:35:23 +08:00
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-04-01 16:35:23 +08:00
2025-03-28 16:41:12 +08:00
var userInfoQuery = db . User . AsQueryable ( )
2025-04-01 16:35:23 +08:00
. 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
2025-04-01 16:35:23 +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-26 14:00:52 +08:00
2025-11-06 14:14:46 +08:00
/// <summary>
/// 查询人员上报的线索
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
2025-11-26 14:00:52 +08:00
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 ;
2025-11-26 14:00:52 +08:00
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
2025-11-26 14:00:52 +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-26 14:00:52 +08:00
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 请求头
2025-11-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-06 16:46:40 +08:00
public async Task < string > GetLive ( string deviceCode )
{
string flvUrl = await GetFlvUrlAsync ( deviceCode ) ;
return flvUrl ;
}
2025-11-26 14:00:52 +08:00
2025-11-08 13:53:33 +08:00
#region socket
2025-11-26 14:00:52 +08:00
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 ) ) ;
2025-11-26 14:00:52 +08:00
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 )
{
2025-11-26 14:00:52 +08:00
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-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-08 13:53:33 +08:00
# endregion
2025-11-06 16:46:40 +08:00
#region 海康设备
2025-11-26 14:00:52 +08:00
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 )
{
2025-11-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-06 16:46:40 +08:00
return "fail" ;
}
2025-11-26 14:00:52 +08:00
2025-11-06 16:46:40 +08:00
# endregion
2025-11-06 17:01:34 +08:00
2025-11-26 14:00:52 +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-26 14:00:52 +08:00
2025-11-06 16:42:59 +08:00
# endregion
2025-11-07 11:41:12 +08:00
#region 获取物资相关接口
2025-11-26 14:00:52 +08:00
2025-11-07 11:41:12 +08:00
/// <summary>
/// 获取全部营房信息
/// </summary>
/// <returns></returns>
public dynamic GetAllYingFang ( )
{
2025-11-26 14:00:52 +08:00
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 ) )
2025-11-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-07 11:41:12 +08:00
return data ;
}
2025-11-26 14:00:52 +08:00
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>
2025-11-26 14:00:52 +08:00
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 ( ) )
2025-11-26 14:00:52 +08:00
. 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-26 14:00:52 +08:00
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 )
2025-11-26 14:00:52 +08:00
. 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 ( ) )
2025-11-26 14:00:52 +08:00
. 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-26 14:00:52 +08:00
2025-11-08 13:53:33 +08:00
/// <summary>
/// 查询火情线索
/// </summary>
/// <param name="areaname"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
2025-11-26 14:00:52 +08:00
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 ( ) )
2025-11-26 14:00:52 +08:00
. 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-26 14:00:52 +08:00
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-26 14:00:52 +08:00
2025-11-08 13:53:33 +08:00
# endregion
2025-11-26 14:00:52 +08:00
2025-11-10 16:11:23 +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
} ;
}
2025-11-26 14:00:52 +08:00
2025-11-26 14:05:35 +08:00
public async Task < Response < dynamic > > ListDaHuaCameraInfo ( int pageNum , int pageSize )
2025-11-26 14:00:52 +08:00
{
var daHuaApi = new DaHuaApi ( "https://icc-dev.hibetatest.com:4077" ) ;
var channelCategoryRequest = new ChannelCategoryRequest
{
2025-11-26 14:05:35 +08:00
pageNum = pageNum ,
pageSize = pageSize ,
2025-11-26 14:00:52 +08:00
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 )
{
var daHuaApi = new DaHuaApi ( "https://icc-dev.hibetatest.com:4077" ) ;
var request = new RtspPreviewRequest
{
data = new RtspPreviewData
{
2025-11-26 14:05:35 +08:00
channelId = channelCode ,
2025-11-26 14:00:52 +08:00
dataType = "1" ,
streamType = "1" //主码流
}
} ;
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
} ;
}
2025-03-21 16:42:48 +08:00
}
2025-03-31 16:40:54 +08:00
}