From 82e228c7cfb58b70083ab07f476652d6615de003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=BC=9F?= <421281095@qq.com> Date: Tue, 12 Aug 2025 16:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A9=E6=B0=94=E9=98=BB=E9=A3=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenAuth.App/ServiceApp/ManageApp.cs | 172 +++++++++-------- .../ServiceApp/Subscribe/ConfigSubscribe.cs | 174 +++++++++--------- 2 files changed, 184 insertions(+), 162 deletions(-) diff --git a/OpenAuth.App/ServiceApp/ManageApp.cs b/OpenAuth.App/ServiceApp/ManageApp.cs index 9445a87..fd21a71 100644 --- a/OpenAuth.App/ServiceApp/ManageApp.cs +++ b/OpenAuth.App/ServiceApp/ManageApp.cs @@ -874,6 +874,8 @@ namespace OpenAuth.App.ServiceApp throw new Exception("指定机场不存在"); } + // 取值 Dock 3 + var dockTypeId = dronePort.TypeId; var serialNo = dronePort.Sn; if (!string.IsNullOrEmpty(task.WorkspaceId)) { @@ -881,96 +883,108 @@ namespace OpenAuth.App.ServiceApp .GetByIdAsync(task.WorkspaceId); if (workspace != null) { - if (workspace.IsCloudBlockFlight || workspace.IsWeatherBlockFlight) + // 机场天气信息 阀值(自定义和) 雨量阀值 风速阀值 + // 赋值默认阀值 + var rainThreshold = 3; // 大雨 + var windSpeedThreshold = 12; + double weatherWindSpeed = 0; // 天气预报风速 + double weatherWindSpeedThreshold = 0; + switch (dockTypeId) { - // todo 关于存在多条阻飞阀值的问题 这里有可能是多个值 - // todo 这里是不同机场不同值 + case "Dock": + rainThreshold = 3; // 大雨 + windSpeedThreshold = 12; + break; + case "Dock 2": + rainThreshold = 3; // 大雨 + windSpeedThreshold = 8; + break; + case "Dock 3": + rainThreshold = 3; // 大雨 + windSpeedThreshold = 8; + break; + } + + // 1. 云端阻飞开启天气阻飞未开启 2. 云端阻飞未开启 3. 云端阻飞开启,天气阻飞开启 + if (workspace.IsCloudBlockFlight) + { + var type = dockTypeId switch + { + "Dock" => "大疆机场", + "Dock 2" => "大疆机场2", + "Dock 3" => "大疆机场3", + _ => "大疆机场" + }; + var spaceLockFly = await Repository .ChangeRepository>() - .GetSingleAsync(r => r.WorkSpaceId == task.WorkspaceId); + .GetSingleAsync(r => r.WorkSpaceId == task.WorkspaceId && r.Name == type); if (spaceLockFly != null) { - var rainFallThreshold = int.Parse(spaceLockFly.RainFall); - var windSpeedThreshold = spaceLockFly.WindSpeed; - var weatherWindSpeedThreshold = spaceLockFly.WeatherWindSpeed; - // 云端阻飞 - if (workspace.IsCloudBlockFlight) + rainThreshold = Convert.ToInt32(spaceLockFly.RainFall); + windSpeedThreshold = spaceLockFly.WindSpeed; + weatherWindSpeedThreshold = spaceLockFly.WeatherWindSpeed; + } + } + + if (workspace.IsWeatherBlockFlight) + { + using (var httpClient = new HttpClient()) + { + // todo 目前地理位置是写死的兰山 + var response = await httpClient.GetAsync( + "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=84261622&appsecret=k0WPY4Cx&city=兰山"); + if (response.IsSuccessStatusCode) { - // 当前时间减5秒,然后取最新一条数据 - // 取得机场序列号 - var log = await Repository - .ChangeRepository>() - .AsQueryable() - .OrderByDescending(r => r.CreateTime) - .Where(r => r.Data.Contains("wind_speed")) - .Where(r => r.Topic == $"thing/product/{serialNo}/osd" && - r.CreateTime > DateTime.Now.AddSeconds(-5)) - .SingleAsync(); - //不太可能为空 - if (log != null) + var content = await response.Content.ReadAsStringAsync(); + var weather = JsonConvert.DeserializeObject(content); + var winMeterStr = + weather.GetValue("win_meter")?.Value(); //风速 + if (!string.IsNullOrEmpty(winMeterStr)) { - var dataObject = JsonConvert.DeserializeObject(log.Data); - var windSpeed = dataObject.GetValue("wind_speed")?.Value(); // m/s - var rainfall = - dataObject.GetValue("rainfall") - ?.Value(); // {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"} - if (windSpeedThreshold <= windSpeed || rainFallThreshold <= rainfall) - { - // 不让起飞 - // 更新失败原因 - var failTask = new LasaTask() - { - Id = taskId, - Status = 2, - Reason = "当前天气条件不允许起飞" - }; - await Repository - .ChangeRepository>() - .AsUpdateable(failTask) - .IgnoreNullColumns() - .ExecuteCommandAsync(); - throw new Exception("当前天气条件不允许起飞"); - } + weatherWindSpeed = int.Parse(winMeterStr.Replace("km/h", "")) / 3.6; } - // 查询所需天气数据 } + } + } - //天气预报阻飞 - if (workspace.IsWeatherBlockFlight) + // 取得当前风速及天气 + // 当前时间减5秒,然后取最新一条数据 + // 取得机场序列号 + var log = await Repository + .ChangeRepository>() + .AsQueryable() + .OrderByDescending(r => r.CreateTime) + .Where(r => r.Data.Contains("wind_speed")) + .Where(r => r.Topic == $"thing/product/{serialNo}/osd" && + r.CreateTime > DateTime.Now.AddSeconds(-5)) + .FirstAsync(); + //不太可能为空 + if (log != null) + { + var dataObject = JsonConvert.DeserializeObject(log.Data); + var windSpeed = dataObject.GetValue("wind_speed")?.Value(); // m/s + var rainfall = + dataObject.GetValue("rainfall") + ?.Value(); // {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"} + + // 如果没有天气阻飞? + if (windSpeedThreshold <= windSpeed || rainThreshold <= rainfall || weatherWindSpeedThreshold <= weatherWindSpeed) + { + // 不让起飞 + // 更新失败原因 + var failTask = new LasaTask() { - using (var httpClient = new HttpClient()) - { - // todo 目前地理位置是写死的兰山 - var response = await httpClient.GetAsync( - "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=84261622&appsecret=k0WPY4Cx&city=兰山"); - if (response.IsSuccessStatusCode) - { - var content = await response.Content.ReadAsStringAsync(); - var weather = JsonConvert.DeserializeObject(content); - var winMeterStr = - weather.GetValue("win_meter")?.Value(); //风速 - if (!string.IsNullOrEmpty(winMeterStr)) - { - var winMeter = int.Parse(winMeterStr.Replace("km/h", "")) / 3.6; - if (weatherWindSpeedThreshold <= winMeter) - { - var failTask = new LasaTask() - { - Id = taskId, - Status = 2, - Reason = "当前天气条件不允许起飞" - }; - await Repository - .ChangeRepository>() - .AsUpdateable(failTask) - .IgnoreNullColumns() - .ExecuteCommandAsync(); - throw new Exception("当前天气条件不允许起飞"); - } - } - } - } - } + Id = taskId, + Status = 2, + Reason = "当前天气条件不允许起飞" + }; + await Repository + .ChangeRepository>() + .AsUpdateable(failTask) + .IgnoreNullColumns() + .ExecuteCommandAsync(); + throw new Exception("当前天气条件不允许起飞"); } } } diff --git a/OpenAuth.App/ServiceApp/Subscribe/ConfigSubscribe.cs b/OpenAuth.App/ServiceApp/Subscribe/ConfigSubscribe.cs index 47f49a8..88f4d13 100644 --- a/OpenAuth.App/ServiceApp/Subscribe/ConfigSubscribe.cs +++ b/OpenAuth.App/ServiceApp/Subscribe/ConfigSubscribe.cs @@ -275,118 +275,126 @@ public class ConfigSubscribe : IJob string model = ""; if (objectKey.ToLower().EndsWith("jpeg")) { - var fileUrl ="http://" + _minioService.endPoint + "/" + _minioService._bucketName + "/" + objectKey; - using (var httpClient = new HttpClient()) - { - suoluokey = "minipic/" + data.file.name.ToString(); - // 目前读取64KB - // 添加Range请求头 - httpClient.DefaultRequestHeaders.Range = - new RangeHeaderValue(0, 65535); - try + var fileUrl = "http://" + _minioService.endPoint + "/" + _minioService._bucketName + + "/" + objectKey; + using (var httpClient = new HttpClient()) { - var response = httpClient - .GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead).Result; - if (response.StatusCode == HttpStatusCode.PartialContent) + suoluokey = "minipic/" + data.file.name.ToString(); + // 目前读取64KB + // 添加Range请求头 + httpClient.DefaultRequestHeaders.Range = + new RangeHeaderValue(0, 65535); + try { - //Focal Length 35: 24 mm - //Exif Image Width: 4032 pixels : Exif SubIFD - //Exif Image Height: 3024 pixels : Exif SubIFD - // 3.1 解析Content-Range头(格式:bytes start-end/total) - var contentRange = response.Content.Headers.ContentRange; - if (contentRange != null) + var response = httpClient + .GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead).Result; + if (response.StatusCode == HttpStatusCode.PartialContent) { - picSize = contentRange.Length.Value; - Console.WriteLine( - $"获取范围:{contentRange.From}-{contentRange.To}/{contentRange.Length}"); - } + //Focal Length 35: 24 mm + //Exif Image Width: 4032 pixels : Exif SubIFD + //Exif Image Height: 3024 pixels : Exif SubIFD + // 3.1 解析Content-Range头(格式:bytes start-end/total) + var contentRange = response.Content.Headers.ContentRange; + if (contentRange != null) + { + picSize = contentRange.Length.Value; + Console.WriteLine( + $"获取范围:{contentRange.From}-{contentRange.To}/{contentRange.Length}"); + } - // 成功获取部分内容 - var y = response.Content.ReadAsByteArrayAsync().Result; - MemoryStream ms = new MemoryStream(y); - var directories = ImageMetadataReader.ReadMetadata(ms); - foreach (var directory in directories) - { - if (directory is ExifDirectoryBase) + // 成功获取部分内容 + var y = response.Content.ReadAsByteArrayAsync().Result; + MemoryStream ms = new MemoryStream(y); + var directories = ImageMetadataReader.ReadMetadata(ms); + foreach (var directory in directories) { - if (directory.Name.Equals("Exif IFD0")) + if (directory is ExifDirectoryBase) { - foreach (var tag in directory.Tags) + if (directory.Name.Equals("Exif IFD0")) { - if (tag.Name.Equals("Model")) + foreach (var tag in directory.Tags) { - model = tag.Description; + if (tag.Name.Equals("Model")) + { + model = tag.Description; + } } } - } - if (directory.Name.Equals("Exif SubIFD")) - { - foreach (var tag in directory.Tags) + + if (directory.Name.Equals("Exif SubIFD")) { - if (tag.Name.Equals("Exif Image Width")) + foreach (var tag in directory.Tags) { - width = int.Parse(tag.Description.Replace("pixels", "") - .Trim()); - } + if (tag.Name.Equals("Exif Image Width")) + { + width = int.Parse(tag.Description.Replace("pixels", "") + .Trim()); + } - if (tag.Name.Equals("Exif Image Height")) - { - height = int.Parse(tag.Description.Replace("pixels", "") - .Trim()); - } + if (tag.Name.Equals("Exif Image Height")) + { + height = int.Parse(tag.Description.Replace("pixels", "") + .Trim()); + } - if (tag.Name.Equals("Focal Length 35")) - { - focalLength = int.Parse(tag.Description.Replace("mm", "") - .Trim()); + if (tag.Name.Equals("Focal Length 35")) + { + focalLength = int.Parse(tag.Description + .Replace("mm", "") + .Trim()); + } } } - } - //Console.WriteLine(directory.Name); - if (directory.Name.Equals("Exif Thumbnail")) - { - foreach (var tag in directory.Tags) + //Console.WriteLine(directory.Name); + if (directory.Name.Equals("Exif Thumbnail")) { - if (tag.Name.Equals("Thumbnail Offset")) + foreach (var tag in directory.Tags) { - offset = int.Parse(tag.Description.Replace("bytes", "") - .Trim()); - } + if (tag.Name.Equals("Thumbnail Offset")) + { + offset = int.Parse(tag.Description.Replace("bytes", "") + .Trim()); + } - if (tag.Name.Equals("Thumbnail Length")) - { - length = int.Parse(tag.Description.Replace("bytes", "") - .Trim()); + if (tag.Name.Equals("Thumbnail Length")) + { + length = int.Parse(tag.Description.Replace("bytes", "") + .Trim()); + } } } } } - } - ms.Seek(offset + 6, SeekOrigin.Begin); - byte[] buffer = new byte[length]; - int bytesRead = ms.Read(buffer, 0, length); - // 上传缩略图到MinIO - await _minioService.PutObjectAsync("", data.file.name.ToString(), suoluokey, - new MemoryStream(buffer)); - } - else if (response.StatusCode == HttpStatusCode.OK) - { - // 服务器不支持Range请求,返回完整内容 - throw new InvalidOperationException("服务器不支持Range请求"); + ms.Seek(offset + 6, SeekOrigin.Begin); + byte[] buffer = new byte[length]; + int bytesRead = ms.Read(buffer, 0, length); + // 上传缩略图到MinIO + await _minioService.PutObjectAsync("", data.file.name.ToString(), suoluokey, + new MemoryStream(buffer)); + } + else if (response.StatusCode == HttpStatusCode.OK) + { + // 服务器不支持Range请求,返回完整内容 + throw new InvalidOperationException("服务器不支持Range请求"); + } + else + { + throw new HttpRequestException($"请求失败: {response.StatusCode}"); + } } - else + catch (Exception ex) { - throw new HttpRequestException($"请求失败: {response.StatusCode}"); + throw new Exception($"下载Range数据失败: {ex.Message}", ex); } } - catch (Exception ex) - { - throw new Exception($"下载Range数据失败: {ex.Message}", ex); - } - } } + + var createdTimeStr = (string)data.file.metadata.created_time; + var createTime = string.IsNullOrEmpty(createdTimeStr) + ? DateTime.Now + : createdTimeStr.ToDateTime(); var fileUpload = new LasaMediaFile() { Id = Guid.NewGuid().ToString(), @@ -404,7 +412,7 @@ public class ConfigSubscribe : IJob Name = data.file.name, ObjectKey = data.file.object_key, Path = data.file.path, // 目前这个好像没有值 - CreateTime = ((string)data.file.metadata.created_time).ToDateTime(), + CreateTime = createTime, WorkspaceId = executeTask.WorkspaceId, ParentKey = folderKey[2], Tid = result.tid,