From d00d45d19ab634de5ce315685676b5d881a575d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E6=A2=A6=E5=8D=83=E5=B9=B4?= <421281095@qq.com> Date: Wed, 26 Nov 2025 14:00:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(camera):=20=E6=96=B0=E5=A2=9E=E5=A4=A7?= =?UTF-8?q?=E5=8D=8E=E6=91=84=E5=83=8F=E5=A4=B4=E4=BF=A1=E6=81=AF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 CameraController 中新增 ListDaHuaCameraInfo 和 GetDaHuaRtsp 接口 - 实现大华摄像头通道信息查询功能 - 支持获取大华摄像头 RTSP 流地址 - 优化 FireManagementApp 中代码格式和结构 - 更新 DaHuaApi 类中静态变量和属性定义 - 调整 OpenAuth.WebApi 项目文件,新增大华摄像头控制器目录 --- Infrastructure/Helpers/DaHuaApi.cs | 7 +- .../FireManagement/FireManagementApp.cs | 192 ++++++++++++++---- .../FireManagement/CameraController.cs | 12 ++ OpenAuth.WebApi/OpenAuth.WebApi.csproj | 1 + 4 files changed, 164 insertions(+), 48 deletions(-) diff --git a/Infrastructure/Helpers/DaHuaApi.cs b/Infrastructure/Helpers/DaHuaApi.cs index e030096..d16f76c 100644 --- a/Infrastructure/Helpers/DaHuaApi.cs +++ b/Infrastructure/Helpers/DaHuaApi.cs @@ -17,8 +17,8 @@ namespace Infrastructure.Helpers private readonly string _kccKey; private readonly string _kccSecret; private readonly string _kccId; - private OAuthTokenResponse _currentToken; - private DateTime _tokenExpiry; + private static OAuthTokenResponse _currentToken; + private static DateTime _tokenExpiry; /// /// 构造函数(KCC认证方式) @@ -574,7 +574,8 @@ namespace Infrastructure.Helpers /// /// 描述信息 /// - public string desc { get; set; } + public string errMsg { get; set; } + public bool success { get; set; } /// /// 响应数据 diff --git a/OpenAuth.App/ServiceApp/FireManagement/FireManagementApp.cs b/OpenAuth.App/ServiceApp/FireManagement/FireManagementApp.cs index e535b99..05a89f4 100644 --- a/OpenAuth.App/ServiceApp/FireManagement/FireManagementApp.cs +++ b/OpenAuth.App/ServiceApp/FireManagement/FireManagementApp.cs @@ -32,6 +32,7 @@ using SqlSugar; using System.Net.WebSockets; using System.Security.Cryptography; using System.Text; +using Infrastructure.Helpers; using Yitter.IdGenerator; using static Org.BouncyCastle.Math.EC.ECCurve; @@ -43,7 +44,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement private IConfiguration _configuration; IOptions _options; IOptions _jpoptions; - public FireManagementApp(IConfiguration configuration, IOptions options, IOptions jpoptions, ISugarUnitOfWork unitWork, + + public FireManagementApp(IConfiguration configuration, IOptions options, + IOptions jpoptions, ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth) { _auth = auth; @@ -128,6 +131,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + //删除任务 public async Task> DeleteTask(long id) { @@ -158,6 +162,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + //更新任务状态 public async Task> ReceiveFireClueTask(long taskid, int state, string recipient) { @@ -178,6 +183,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + //更新任务图片或者新增线索 public async Task> ReceiveTaskImage(string info) { @@ -196,7 +202,6 @@ namespace OpenAuth.App.ServiceApp.FireManagement else { //新增线索信息 - } if (db.Commit()) @@ -209,11 +214,13 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + class ReciveTaskInfo { public long taskid { get; set; } public string path { get; set; } } + /// /// 查询下发人员 /// @@ -250,6 +257,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement return new Response> { Result = tasks }; } } + /// /// 任务详情 /// @@ -278,7 +286,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement Audio = a.Audio, Image = a.Image, }) - .Mapper(a => a.StateName = ((TaskState)a.State).GetDescription()) + .Mapper(a => a.StateName = ((TaskState)a.State).GetDescription()) .FirstAsync(); var rep = db.FmFireTaskUser.AsQueryable().Where(r => r.UserId == userid && r.TaskId == id).First(); if (rep != null) @@ -286,6 +294,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement info.State = rep.State; info.StateName = ((TaskState)rep.State).GetDescription(); } + return new Response { Result = info }; } } @@ -586,6 +595,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + /// /// 添加火情日志 /// @@ -596,7 +606,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement using (var db = base.UnitWork.CreateContext()) { var userId = _auth.GetCurrentUser().User.Id; - info.CreateId = userId; info.CreateTime = DateTime.Now; + info.CreateId = userId; + info.CreateTime = DateTime.Now; await db.FmFireclueinfoLog.InsertAsync(info); if (db.Commit()) { @@ -608,6 +619,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } } + //按月统计火情线索 public async Task>> GetFireClueStatistics(int type) { @@ -753,6 +765,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement return new Response> { Result = list }; } } + #endregion /// @@ -961,33 +974,36 @@ namespace OpenAuth.App.ServiceApp.FireManagement } }; } + /// /// 查询人员上报的线索 /// /// /// - public async Task>>> LoadFireClueInfoByUserId(int pageIndex, int state, int pageSize, string userid) + public async Task>>> LoadFireClueInfoByUserId(int pageIndex, int state, + int pageSize, string userid) { using (var db = base.UnitWork.CreateContext()) { RefAsync 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); + 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); return new Response>> { Code = 200, @@ -1001,9 +1017,12 @@ namespace OpenAuth.App.ServiceApp.FireManagement } } - private static readonly string baseUrl = "http://10.176.126.121:8766/liveBroadCast/bd/api/v1/device/liveBroadCast"; + private static readonly string baseUrl = + "http://10.176.126.121:8766/liveBroadCast/bd/api/v1/device/liveBroadCast"; + private static readonly string sk = "ba98a152296f13c565d2a6dfd219994f"; // 用户的sk private static readonly string account = "AK202006291525121"; // 用户的ak + public async Task GetFlvUrlAsync(string deviceCode) { // 获取当前的时间戳 @@ -1036,8 +1055,10 @@ namespace OpenAuth.App.ServiceApp.FireManagement 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")); + requestMessage.Content.Headers.ContentType = + new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); + requestMessage.Headers.Accept.Add( + new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); // 发送请求 var response = await client.SendAsync(requestMessage); @@ -1076,12 +1097,15 @@ namespace OpenAuth.App.ServiceApp.FireManagement return BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); } } + public async Task GetLive(string deviceCode) { string flvUrl = await GetFlvUrlAsync(deviceCode); return flvUrl; } + #region socket + public async Task SendSocketMessage(WebSocketModel wsModel) { try @@ -1091,16 +1115,16 @@ namespace OpenAuth.App.ServiceApp.FireManagement 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(data), System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None); - await webSocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, "Closing connection", CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(data), + System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None); + await webSocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, + "Closing connection", CancellationToken.None); //webSocket.Dispose(); } } catch (Exception ex) { - } - } /// @@ -1116,7 +1140,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement Audience audience = new Audience(); if (infoid != 0) { - var renwu = db.FmFireTaskUser.AsQueryable().Where(r => r.TaskId == infoid).Select(r => r.UserId).ToList(); + var renwu = db.FmFireTaskUser.AsQueryable().Where(r => r.TaskId == infoid).Select(r => r.UserId) + .ToList(); var users = db.User.AsQueryable().Where(r => renwu.Contains(r.Id.ToString())).ToList(); if (users.Count > 0) { @@ -1131,6 +1156,7 @@ namespace OpenAuth.App.ServiceApp.FireManagement audience.Alias = users.Select(a => a.Account).ToList(); } } + PushPayload pushPayload = new PushPayload() { Platform = new List { "android", "ios" }, @@ -1156,9 +1182,11 @@ namespace OpenAuth.App.ServiceApp.FireManagement return "success"; } } + #endregion #region 海康设备 + /// /// 获取单个设备的视频流 /// @@ -1168,7 +1196,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement [AllowAnonymous] public string GetPreviewURLs(string cameraIndexCode, string protocol) { - HttpUtillib.SetPlatformInfo(_options.Value.AppKey, _options.Value.SecretKey, _options.Value.Url, _options.Value.Port, true); + HttpUtillib.SetPlatformInfo(_options.Value.AppKey, _options.Value.SecretKey, _options.Value.Url, + _options.Value.Port, true); var obj = new { @@ -1186,11 +1215,14 @@ namespace OpenAuth.App.ServiceApp.FireManagement { return Encoding.UTF8.GetString(result); } + return "fail"; } + #endregion - #region 人员类型统计 + #region 人员类型统计 + /// /// 人员类型统计 /// @@ -1229,16 +1261,19 @@ namespace OpenAuth.App.ServiceApp.FireManagement Result = res }; } + #endregion #region 获取物资相关接口 + /// /// 获取全部营房信息 /// /// 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"" "; + string sql = + @"SELECT ""id"",""dwmc"",""dwzd"",""lsdw"",""dwzdjd"",""dwzdwd"",""dzxm"",""lxfs"",""syrs"",""zbqk"",""tbr"", st_astext(""geom"") as geom FROM ""fm_shp_1692148217"" "; using (var db = Repository.AsSugarClient()) { @@ -1258,7 +1293,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement { 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 + "%'"; + sql = + "SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" WHERE info like '%" + + wuzi + "%'"; else sql = "SELECT \"id\", \"type\",\"name\",info,st_astext(geom) as geom FROM \"fm_shp_1686205187\" "; @@ -1266,8 +1303,10 @@ namespace OpenAuth.App.ServiceApp.FireManagement data.count = dt.Rows.Count; data.data = dt; } + return data; } + #endregion #region 任务相关 @@ -1277,7 +1316,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement /// /// /// - public async Task>>> LoadFireClueTaskByUserId(string userid, int pageIndex, int pageSize) + public async Task>>> LoadFireClueTaskByUserId(string userid, + int pageIndex, int pageSize) { using (SugarDbContext db = base.UnitWork.CreateContext()) { @@ -1301,14 +1341,15 @@ namespace OpenAuth.App.ServiceApp.FireManagement Audio = a.Audio, Image = a.Image, }).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription()) - .OrderBy(a => a.TaskTime, OrderByType.Desc) - .ToPageListAsync(pageIndex, pageSize, totalNumber); + .OrderBy(a => a.TaskTime, OrderByType.Desc) + .ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } + /// /// 查询所有任务 /// @@ -1336,17 +1377,18 @@ namespace OpenAuth.App.ServiceApp.FireManagement Audio = a.Audio, TaskTime = a.TaskTime, RecipientUsers = SqlFunc.Subqueryable().Where(r => r.TaskId == a.Id) - .LeftJoin((r, s) => r.UserId == s.Id.ToString()) - .SelectStringJoin((a, s) => s.Name, ","), + .LeftJoin((r, s) => r.UserId == s.Id.ToString()) + .SelectStringJoin((a, s) => s.Name, ","), }).Mapper(c => c.StateName = ((TaskState)c.State).GetDescription()) - .OrderBy(a => a.TaskTime, OrderByType.Desc) - .ToPageListAsync(pageIndex, pageSize, totalNumber); + .OrderBy(a => a.TaskTime, OrderByType.Desc) + .ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } + /// /// 查询火情线索 /// @@ -1354,7 +1396,8 @@ namespace OpenAuth.App.ServiceApp.FireManagement /// /// /// - public async Task>>> LoadFireClueInfoByAreaName(string areaname, int pageIndex = 1, int pageSize = 10) + public async Task>>> LoadFireClueInfoByAreaName(string areaname, + int pageIndex = 1, int pageSize = 10) { using (SugarDbContext db = base.UnitWork.CreateContext()) { @@ -1382,15 +1425,16 @@ namespace OpenAuth.App.ServiceApp.FireManagement 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); + .Mapper(a => a.StateName = ((State)a.State).GetDescription()) + .OrderBy(a => a.ReportTime, SqlSugar.OrderByType.Desc) + .ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } + /// /// App获取在线人员实时位置信息 /// @@ -1424,7 +1468,9 @@ namespace OpenAuth.App.ServiceApp.FireManagement }; } } + #endregion + public async Task> ListCameraWithInRange(string lng, string lat, int radius) { // '{lng}', '{lat}' @@ -1445,5 +1491,61 @@ ORDER BY Result = x }; } + + public async Task> ListDaHuaCameraInfo() + { + var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077"); + var channelCategoryRequest = new ChannelCategoryRequest + { + pageNum = 1, + pageSize = 10, + isOnline = 1, + unitTypeList = new List { 1 }, + }; + Console.WriteLine(JsonConvert.SerializeObject(channelCategoryRequest)); + var channelCategoryResponse = await daHuaApi.GetChannelCategoriesAsync(channelCategoryRequest); + if (channelCategoryResponse.success) + { + return new Response + { + Result = channelCategoryResponse.data.pageData + }; + } + return new Response + { + Code = channelCategoryResponse.code, + Message = channelCategoryResponse.errMsg + }; + + } + + public async Task> GetDaHuaRtsp(string channelCode) + { + var daHuaApi = new DaHuaApi("https://icc-dev.hibetatest.com:4077"); + + var request = new RtspPreviewRequest + { + data = new RtspPreviewData + { + channelId = "1000008$1$0$0IPC10001001_1", + dataType = "1", + streamType = "1" //主码流 + } + }; + var y = await daHuaApi.StartRtspPreviewAsync(request); + if (y.success) + { + return new Response + { + Result = y.data + }; + } + + return new Response + { + Code = y.code, + Message = y.errMsg + }; + } } } \ No newline at end of file diff --git a/OpenAuth.WebApi/Controllers/ServiceControllers/FireManagement/CameraController.cs b/OpenAuth.WebApi/Controllers/ServiceControllers/FireManagement/CameraController.cs index 5568075..ae1edf5 100644 --- a/OpenAuth.WebApi/Controllers/ServiceControllers/FireManagement/CameraController.cs +++ b/OpenAuth.WebApi/Controllers/ServiceControllers/FireManagement/CameraController.cs @@ -28,4 +28,16 @@ public class CameraController : ControllerBase { return await _app.ListCameraWithInRange(lng, lat, radius); } + + [HttpGet] + public async Task> ListDaHuaCameraInfo() + { + return await _app.ListDaHuaCameraInfo(); + } + [HttpGet] + public async Task> GetDaHuaRtsp(string channelCode) + { + return await _app.GetDaHuaRtsp(channelCode); + } + } \ No newline at end of file diff --git a/OpenAuth.WebApi/OpenAuth.WebApi.csproj b/OpenAuth.WebApi/OpenAuth.WebApi.csproj index e7ecc0b..aedacf8 100644 --- a/OpenAuth.WebApi/OpenAuth.WebApi.csproj +++ b/OpenAuth.WebApi/OpenAuth.WebApi.csproj @@ -82,6 +82,7 @@ +