main
zhangbin 2 weeks ago
commit f9be9f4137

@ -6,7 +6,6 @@ using OpenAuth.App.Interface;
using SqlSugar;
using Infrastructure;
using Infrastructure.Helpers;
using System.Text.Json;
using OpenAuth.App.ServiceApp.Response;
using Microsoft.Extensions.Configuration;
using OpenAuth.App.ServiceApp.DroneDocking.Request;
@ -20,12 +19,16 @@ using Org.BouncyCastle.Ocsp;
using System.Net.Http.Headers;
using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
using System.Data.SQLite;
using System.Dynamic;
using Infrastructure.CloudSdk.minio;
using Infrastructure.Extensions;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text.Json.Nodes;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OpenAuth.WebApi;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace OpenAuth.App.ServiceApp.DroneDocking
@ -651,69 +654,169 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> getDroneStatus(string deviceid)
public async Task<ResData> GetDroneStatus(string deviceid)
{
// 取得无人机类型
// 取得机场信息
// 监听无人机信息
// mode_code 0:在线1:不在线2:任务执行中
// todo drone_in_dock 0":"舱外","1":"舱内"
// 舱外 任务执行中 关机是在线还是不在线?应该是不在线吧?
// todo 1. 先取机场信息,是否在
var now = DateTime.Now;
var time = now.AddSeconds(-5);
var log = await Repository
.ChangeRepository<SugarRepositiry<LasaLog>>()
.AsQueryable()
.Where(r => r.Topic == "")
.Where(r => r.CreateTime > time) // 查询5秒以内数据
.Where(r => SqlFunc.JsonLike(r.Data, "drone_in_dock"))
.OrderByDescending(r => r.CreateTime)
.FirstAsync();
// 当前时间
ResData response = new ResData();
string data = @"
/*string data = @"
{
""code"": 200,
""data"": {
""mode_code"": 0,
""longitude"": 122.45,
""latitude"": 30.45,
""height"": 80,
""elevation"": 50,
""gimbal_pitch"": -45,
""gimbal_yaw"": 23,
""battery_capacity_percent"": 35,
""gps_state"": 2
},
""message"": """",
""traceid"": ""xxx""
""code"": 200,
""data"": {
""mode_code"": 0,
""longitude"": 122.45,
""latitude"": 30.45,
""height"": 80,
""elevation"": 50,
""gimbal_pitch"": -45,
""gimbal_yaw"": 23,
""battery_capacity_percent"": 35,
""gps_state"": 2
},
""message"": """",
""traceid"": ""xxx""
}
";
if (true)
";*/
dynamic data = new ExpandoObject();
var dock = await Repository
.ChangeRepository<SugarRepositiry<LasaDronePort>>()
.AsQueryable()
.LeftJoin<LasaUav>((a, b) => a.Id == b.PId)
.Where((a, b) => b.Sn == deviceid).FirstAsync();
if (dock == null) // 无人机不在线
{
string x_lc_secret = _helper.getxseret();
data.code = 200;
dynamic inData = new ExpandoObject();
inData.mode_code = 1; // 不在线
data.message = "获取无人机状态成功";
}
else
{
data.code = 200;
var dockOsdTopic = $"thing/product/{dock.Sn}/osd";
var now = DateTime.Now;
var time = now.AddSeconds(-5);
var log = await Repository
.ChangeRepository<SugarRepositiry<LasaLog>>()
.AsQueryable()
.Where(r => r.Topic == dockOsdTopic)
.Where(r => r.CreateTime > time) // 查询5秒以内数据
.Where(r => SqlFunc.JsonLike(r.Data, "drone_in_dock"))
.OrderByDescending(r => r.CreateTime)
.FirstAsync();
if (log != null)
{
// 当前时间
var dockOsdData =
JsonConvert.DeserializeObject<JObject>(JsonConvert.DeserializeObject<string>(log.Data));
//drone_in_dock 0":"舱外","1":"舱内"
var droneInDock = dockOsdData["data"]?["drone_in_dock"]?.Value<int>();
if (droneInDock == 0) // 飞行任务状态
{
var droneOsdTopic = $"thing/product/{deviceid}/osd";
log = await Repository
.ChangeRepository<SugarRepositiry<LasaLog>>()
.AsQueryable()
.Where(r => r.Topic == droneOsdTopic)
.Where(r => r.CreateTime > time) // 查询5秒以内数据
.OrderByDescending(r => r.CreateTime)
.FirstAsync();
if (log != null)
{
var droneOsdData =
JsonConvert.DeserializeObject<JObject>(JsonConvert.DeserializeObject<string>(log.Data));
var longitude = Math.Round(droneOsdData["data"]?["longitude"]?.Value<decimal>() ?? 0m, 7);
var latitude = Math.Round(droneOsdData["data"]?["latitude"]?.Value<decimal>() ?? 0m, 7);
var height = Math.Round(droneOsdData["data"]?["height"]?.Value<decimal>() ?? 0m, 2);
var elevation = Math.Round(droneOsdData["data"]?["elevation"]?.Value<decimal>() ?? 0m, 2);
// 云台信息
var payload99 = droneOsdData["data"]?["99-0-0"];
var gimbalPitch = payload99?["gimbal_pitch"]?.Value<double>();
var gimbalYaw = payload99?["gimbal_yaw"]?.Value<double>();
//var gimbalRoll = payload99?["gimbal_roll"]?.Value<double>();
var batteryCapacityPercent =
droneOsdData["data"]?["battery"]?["capacity_percent"]?.Value<int>();
var quality = droneOsdData["data"]?["position_state"]?["quality"]?.Value<int>();
dynamic inData = new ExpandoObject();
// mode_code 0:在线1:不在线2:任务执行中
inData.mode_code = 2;
inData.longitude = longitude;
inData.latitude = latitude;
inData.height = height;
inData.elevation = elevation;
inData.gimbal_pitch = gimbalPitch;
inData.gimbal_yaw = gimbalYaw;
//data.gimbal_roll = gimbalRoll;
inData.battery_capacity_percent = batteryCapacityPercent;
inData.gps_state = quality switch
{
< 2 => 1, // 低精度
< 10 => 2, // 高精度
_ => 3 // rtk定位
};
data.data = inData;
data.message = "获取无人机状态成功!";
data.traceid = Guid.NewGuid().ToString();
}
else
{
data.code = 502;
data.message = "获取无人机状态失败";
}
}
else
{
// 舱内 关机或者开机状态
// 这里取机场osd日志信息
dynamic inData = new ExpandoObject();
inData.battery_capacity_percent =
dockOsdData["data"]?["drone_charge_state"]?["capacity_percent"]?.Value<int>();
inData.elevation = 0;
inData.mode_code = 0;
var longitude = Math.Round(dockOsdData["data"]?["longitude"]?.Value<decimal>() ?? 0m, 7);
var latitude = Math.Round(dockOsdData["data"]?["latitude"]?.Value<decimal>() ?? 0m, 7);
var height = Math.Round(dockOsdData["data"]?["height"]?.Value<decimal>() ?? 0m, 2);
inData.longitude = longitude;
inData.latitude = latitude;
inData.height = height;
var quality = dockOsdData["data"]?["position_state"]?["quality"]?.Value<int>();
inData.gps_state = quality switch
{
< 2 => 1,
< 10 => 2,
_ => 3
};
data.data = inData;
data.traceid = Guid.NewGuid().ToString();
data.code = 200;
data.message = "获取无人机状态成功";
}
}
}
var response = new ResData();
if (data.code == 200)
{
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机机场状态成功!";
response.Message = "获取无人机状态成功!";
response.Code = 200;
response.Secret = x_lc_secret;
response.Secret = xLcSecret;
return response;
}
else
{
string x_lc_secret = _helper.getxseret();
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机机场状态失败!";
response.Message = "获取无人机状态失败!";
response.Code = 500;
response.Secret = x_lc_secret;
response.Secret = xLcSecret;
return response;
}
}
@ -962,14 +1065,22 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
public async void InsertDb(string taskid)
{
var sqliteconnect = configuration.GetSection("DroneDocking:DbFile").Value;
/*// 确保数据库文件存在
if (!File.Exists(sqliteconnect))
{
var directory = Path.GetDirectoryName(sqliteconnect);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
SQLiteConnection.CreateFile(sqliteconnect);
}*/
string _sqliteConnection = "DataSource = " + sqliteconnect + "; Version = 3; ";
string sql = "select * from drone_docktaskdetail where taskid='" + taskid + "'";
var filigtlist = _client.Ado.SqlQuery<DroneDocktaskdetail>(sql);
using (var sqliteConn = new SQLiteConnection(_sqliteConnection))
{
sqliteConn.Open();
string deleteDbinfo1 = "delete from JMXX";
using (var cmd2 = new SQLiteCommand(deleteDbinfo1, sqliteConn))
{
@ -1149,21 +1260,35 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
{
RefAsync<int> totalCount = 0;
var info = await base.Repository.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(keyWord),
t => t.taskname.Contains(keyWord) || t.bizidname.Contains(keyWord))
.Select(t => new DroneDockRes
.WhereIF(!string.IsNullOrEmpty(keyWord), t => t.taskname.Contains(keyWord)||t.bizidname.Contains(keyWord))
.Select(t=>new DroneDockRes
{
id= t.id,
bizidname= t.bizidname,
taskname= t.taskname,
createtime= t.createtime,
state= t.state,
datacode= t.datacode,
deviceid= t.deviceid,
taskid= t.taskid,
tasklist = SqlFunc.Subqueryable<DroneDocktaskdetail>().Where(r => r.taskid == t.id).LeftJoin<LasaTask>((r, s) => r.flighttaskid == s.FlightId).ToList((r,s)=> new DetailRes
{
id = t.id,
bizidname = t.bizidname,
taskname = t.taskname,
createtime = t.createtime,
state = t.state,
datacode = t.datacode,
deviceid = t.deviceid,
taskid = t.taskid,
tasklist = SqlFunc.Subqueryable<DroneDocktaskdetail>().Where(r => r.taskid == t.id).ToList()
id = r.id,
bsm=r.bsm,
Status=s.Status,
bz=r.bz,
dkbh=r.dkbh,
dkfw=r.dkfw,
dklx=r.dklx,
dkmc=r.dkmc,
dkmj=r.dkmj,
flighttaskid=r.flighttaskid,
taskid=r.taskid,
xzqdm=r.xzqdm,
zdkbh=r.zdkbh
})
.ToPageListAsync(page, limit, totalCount);
})
.ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<DroneDockRes>>>
{
Result = new PageInfo<List<DroneDockRes>>

@ -51,7 +51,85 @@ namespace OpenAuth.App.ServiceApp.DroneDocking.Response
public int state { get; set; }
public DateTime? createtime { get; set; }
public List<DroneDocktaskdetail> tasklist { get; set; }
public List<DetailRes> tasklist { get; set; }
}
public class DetailRes
{
public string id { get; set; }
/// <summary>
/// Desc:图斑标识码
/// Default:
/// Nullable:True
/// </summary>
public string bsm { get; set; }
/// <summary>
/// Desc:县级行政区代码
/// Default:
/// Nullable:True
/// </summary>
public string xzqdm { get; set; }
/// <summary>
/// Desc:地块编号
/// Default:
/// Nullable:True
/// </summary>
public string dkbh { get; set; }
/// <summary>
/// Desc:地块类型
/// Default:
/// Nullable:True
/// </summary>
public string dklx { get; set; }
/// <summary>
/// Desc:子地块编号
/// Default:
/// Nullable:True
/// </summary>
public string zdkbh { get; set; }
/// <summary>
/// Desc:地块名称
/// Default:
/// Nullable:True
/// </summary>
public string dkmc { get; set; }
/// <summary>
/// Desc:地块面积
/// Default:
/// Nullable:True
/// </summary>
public decimal? dkmj { get; set; }
/// <summary>
/// Desc:地块范围cgcs2000的经纬度坐标wkt格式
/// Default:
/// Nullable:True
/// </summary>
public string dkfw { get; set; }
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string bz { get; set; }
/// <summary>
/// Desc:任务id对应任务表id
/// Default:
/// Nullable:True
/// </summary>
public string taskid { get; set; }
//飞行任务id
public string flighttaskid { get; set; }
public int? Status { get; set; }
}

@ -601,7 +601,7 @@ namespace OpenAuth.App.ServiceApp
}
//添加航线
public async Task<Response<bool>> AddAirLine(LasaAirLine lasaAirLine)
public async Task<Response<string>> AddAirLine(LasaAirLine lasaAirLine)
{
using (var db = UnitWork.CreateContext())
{
@ -610,9 +610,9 @@ namespace OpenAuth.App.ServiceApp
lasaAirLine.CreateTime = DateTime.Now;
var flag = await db.LasaAirLine.InsertAsync(lasaAirLine);
if (db.Commit())
return new Response<bool> { Result = true, Message = "添加成功" };
return new Response<string> { Result = lasaAirLine.Id, Message = "添加成功" };
else
return new Response<bool> { Result = false, Message = "添加失败" };
return new Response<string> { Result = "", Message = "添加失败" };
}
}

@ -210,7 +210,8 @@ public class ConfigSubscribe : IJob
// 文件上传
_logger.LogDebug("进入文件上传处理");
_logger.LogDebug($"文件上传处理:{message}");
//飞行任务 0 指令飞行 1
//飞行任务 0 手飞任务 1
// todo 如果是手飞任务,生成任务 关于任务类型?
int flightType = data.flight_task.flight_type;
string flightId = data.file.ext.flight_id;
// 关于flightId 没有值的问题怎么办???
@ -265,6 +266,8 @@ public class ConfigSubscribe : IJob
CreateTime = date,
};
await _sqlSugarClient.Insertable(parent1).ExecuteCommandAsync();
// todo 关于生成手飞任务的问题
}
// 重复检测

@ -31,10 +31,11 @@ public class LasaAiAchievement
[SugarColumn(ColumnName = "AiModel")]
public string AiModel { get; set; }
[SugarColumn(ColumnName = "TaskId")]
public string TaskId { get; set; }
[SugarColumn(ColumnName = "Tag")]
public string Tag { get; set; }
[SugarColumn(ColumnName = "Cover")]
public string Cover { get; set; }
[SugarColumn(ColumnName = "Description")]
public string Description { get; set; }
[SugarColumn(IsIgnore = true)] public List<LasaAiAchievementDetail> AiAchievementDetailList { get; set; }
}

@ -290,21 +290,29 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
}
/// <summary>
/// 省任务获取无人机状态信息
/// </summary>
/// <param name="deviceid"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpGet]
[AllowAnonymous]
[Route("/zhcfzx/droneAirport/getDroneStatus")]
public async Task<ReciveData<string>> getDroneStatus( string deviceid)
public async Task<ReciveData<string>> GetDroneStatus(string deviceid)
{
var result = new ReciveData<string>();
if (Request.Headers.TryGetValue("x-lc-token", out var tokenValue))
{
var tokenflag = _helper.Verify(tokenValue);
// todo 完成后,需要恢复
//var tokenflag = _helper.Verify(tokenValue);
var tokenflag = true;
if (tokenflag)
{
try
{
var data = await _app.getDroneStatus(deviceid);
var data = await _app.GetDroneStatus(deviceid);
result.data = data.Result;
result.code = data.Code;
result.message = data.Message;
@ -561,7 +569,6 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
[HttpGet]
[AllowAnonymous]
public async Task<ReciveData<string>> dbupload (string taskid)
{
var result = new ReciveData<string>();

@ -365,7 +365,7 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<Response<bool>> AddAirLine(LasaAirLine info)
public async Task<Response<string>> AddAirLine(LasaAirLine info)
{
return await _app.AddAirLine(info);
}

@ -25,6 +25,9 @@
<None Remove="log\**" />
<None Remove="wwwroot\**" />
<EmbeddedResource Include="index.html" />
<None Update="Sqlite.db">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>

Binary file not shown.

@ -84,6 +84,6 @@
},
"DroneDocking": {
"Url": "https://wp.tianmu.cloud:5443/zhcfzx",
"DbFile": "E:\\Program Files (x86)\\DingDing\\DTalkFIle\\(371325)费县_20250628155400093.db"
"DbFile": "Sqlite.db"
}
}

Loading…
Cancel
Save