You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1186 lines
53 KiB
C#

using OpenAuth.App.BaseApp.Base;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository;
using System.Text;
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;
using DocumentFormat.OpenXml.Office.CustomUI;
using DocumentFormat.OpenXml.EMMA;
using OpenAuth.App.ServiceApp.DroneDocking.Response;
using DocumentFormat.OpenXml.Math;
using static Microsoft.Extensions.Logging.EventSource.LoggingEventSource;
using DocumentFormat.OpenXml.Drawing.Charts;
using Org.BouncyCastle.Ocsp;
using System.Net.Http.Headers;
using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
using System.Data.SQLite;
using Infrastructure.CloudSdk.minio;
using Infrastructure.Extensions;
using System.Security.Cryptography;
using System.Text.Json.Nodes;
using Newtonsoft.Json.Linq;
namespace OpenAuth.App.ServiceApp.DroneDocking
{
public class DroneDockApp : SqlSugarBaseApp<DroneDocktask, SugarDbContext>
{
private EncryptionHelper _helper;
private IConfiguration configuration;
private readonly ISqlSugarClient _client;
private readonly MinioService _minioService;
public DroneDockApp(EncryptionHelper helper, IConfiguration configuration, ISqlSugarClient client, MinioService minioService, ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<DroneDocktask> repository, IAuth auth) : base(unitWork, repository, auth)
{
_helper = helper;
this.configuration = configuration;
_client = client;
_minioService = minioService;
}
/// <summary>
/// 无人机机场接口注册更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> RegistService(AirPortRegistReq req )
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = configuration.GetSection("DroneDocking:Url").Value + "/droneAirport/RegistService";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 无人机机场设备注册/更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> AddDevice(AddDeviceReq req)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = configuration.GetSection("DroneDocking:Url").Value+ "/droneAirport/addDevice";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 无人机机场授权
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> Authorization(AuthorizationReq req)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = configuration.GetSection("DroneDocking:Url").Value + "/droneAirport/authorization";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 无人机机场授权
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> Test(AirPortTaskReq req)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = "http://localhost:10042/zhcfzx/droneAirport/AddTask";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = "API32_HENJOZMPBYKEXNVLFMY3Y5W5SQ.1751622229582.fmCjIucQYyq4YZe4CnSStN/rHcwjZTxUsDuXeXJfrYn0bwoaV1/IW8mcFwtLw8JHjowvMJrmPyy/QZAhssxQCQ==";
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
public async Task<Response<string>> Test1(string taskid)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = $"http://localhost:10042/zhcfzx/droneAirport/cancelTask?taskid={taskid}";
//string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = "API32_HENJOZMPBYKEXNVLFMY3Y5W5SQ.1751622229582.fmCjIucQYyq4YZe4CnSStN/rHcwjZTxUsDuXeXJfrYn0bwoaV1/IW8mcFwtLw8JHjowvMJrmPyy/QZAhssxQCQ==";
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 无人机任务添加
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> AddTask(string req,string secret)
{
ResData Response = new ResData();
//解密数据
byte[] secretbyte = Convert.FromBase64String(secret); //x-lc-secret
byte[] reqbyte = Convert.FromBase64String(req); //返回数据
string data = _helper.Decrypt(secretbyte, reqbyte);
//序列化返回数据并处理
var task = JsonSerializer.Deserialize<AirPortTaskReq>(data);
string ids = "";
foreach(var item in task.deviceid)
{
}
//task数据生成
DroneDocktask dt= new DroneDocktask();
dt.id=Guid.NewGuid().ToString();
dt.deviceid= string.Join(",", task.deviceid);
dt.bizidname=task.bizidname.ToString();
dt.taskid = task.taskid;
dt.taskname = task.taskname;
dt.datacode= task.datacode;
dt.state = 0;
dt.createtime = DateTime.Now;
//taskdetail数据生成
List<DroneDocktaskdetail> dalist= new List<DroneDocktaskdetail>();
if (task.tasklist.Count > 0 )
{
foreach(var item in task.tasklist)
{
DroneDocktaskdetail da= new DroneDocktaskdetail();
da.id = Guid.NewGuid().ToString();
da.taskid = dt.id;
da.bz=item.bz;
da.dkbh=item.dkbh;
da.dkfw=item.dkfw;
da.dkmj=item.dkmj;
da.dkmc=item.dkmc;
da.xzqdm=item.xzqdm;
da.zdkbh=item.zdkbh;
da.bsm=item.bsm;
da.dklx=item.dklx;
dalist.Add(da);
}
}
using (var uow = base.UnitWork.CreateContext())
{
//查询数据 检查是否有重复数据
var info = uow.DroneDocktask.AsQueryable().Where(r => r.taskid == task.taskid).First();
if (info == null)
{
//本地数据库数据添加
await uow.DroneDocktask.InsertAsync(dt);
await uow.DroneDocktaskdetail.InsertRangeAsync(dalist);
var flag = uow.Commit();
//返回数据
if (flag)
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(dt.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "已存在相同taskid任务";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
/// <summary>
/// 无人机任务更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> UpdateTask(string req, string secret)
{
ResData Response = new ResData();
//解密数据
byte[] secretbyte = Convert.FromBase64String(secret); //x-lc-secret
byte[] reqbyte = Convert.FromBase64String(req); //返回数据
string data = _helper.Decrypt(secretbyte, reqbyte);
//序列化返回数据并处理
var task = JsonSerializer.Deserialize<AirPortUpdateTaskReq>(data);
using (var uow = base.UnitWork.CreateContext())
{
//查询数据
var info=uow.DroneDocktask.AsQueryable().Where(r=>r.taskid==task.taskid).First();
if (info != null)
{
if (info.state == 0)
{
//taskdetail数据生成
List<DroneDocktaskdetail> dalist = new List<DroneDocktaskdetail>();
if (task.tasklist.Count > 0)
{
foreach (var item in task.tasklist)
{
DroneDocktaskdetail da = new DroneDocktaskdetail();
da.id = Guid.NewGuid().ToString();
da.taskid = info.id;
da.bz = item.bz;
da.dkbh = item.dkbh;
da.dkfw = item.dkfw;
da.dkmj = item.dkmj;
da.dkmc = item.dkmc;
da.xzqdm = item.xzqdm;
da.zdkbh = item.zdkbh;
da.bsm = item.bsm;
da.dklx = item.dklx;
dalist.Add(da);
}
}
await uow.DroneDocktaskdetail.DeleteAsync(r => r.taskid == info.taskid);
await uow.DroneDocktaskdetail.InsertRangeAsync(dalist);
var flag = uow.Commit();
//返回数据
if (flag)
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(info.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务更新成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务更新失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "任务已开始执行,无法更新,请重新添加任务";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "未找到任务数据";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
/// <summary>
/// 取消任务
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> CancelTask(string taskid)
{
ResData Response = new ResData();
using (var uow = base.UnitWork.CreateContext())
{
//查询数据
var info = uow.DroneDocktask.AsQueryable().Where(r => r.taskid == taskid).First();
if (info != null)
{
var flag = await uow.DroneDocktask.UpdateAsync(it => new DroneDocktask()
{
state=3
}, it => it.id == info.id);
//返回数据
if (uow.Commit())
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(info.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务取消成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务取消失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "未找到任务数据";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
/// <summary>
/// 无人机状态获取
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> getDroneStatus(string deviceid)
{
ResData Response = new ResData();
string data = "{\r\n\"code\": 200,\r\n\"data\": {\r\n\"mode_code\":0,\r\n\"longitude\":122.45,\r\n\"latitude\":30.45,\r\n\"height\":80,\r\n\"elevation\":50,\r\n\"gimbal_pitch\":-45,\r\n\"gimbal_yaw\":23,\r\n\"battery_capacity_percent\":35,\r\n\"gps_state\":2,\r\n},\r\n\"message\": \"获取无人机机场状态成功!\",\r\n\"traceid\": \"xxx\"\r\n}";
//todo deviceid
if (true)
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(data);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "获取无人机机场状态成功!";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "获取无人机机场状态失败!";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
/// <summary>
/// 无人机任务查询
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> queryTaskStatus(string req, string secret)
{
ResData Response = new ResData();
//解密数据
byte[] secretbyte = Convert.FromBase64String(secret); //x-lc-secret
byte[] reqbyte = Convert.FromBase64String(req); //返回数据
string data = _helper.Decrypt(secretbyte, reqbyte);
//序列化返回数据并处理
var task = JsonSerializer.Deserialize<AirPortTaskReq>(data);
string sql = "select * from drone_docktask where taskid=" + data;
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(sql);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "查询无人机机场任务状态成功!";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
/// <summary>
/// 无人机机场设备注册/更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> reportDroneStatus(List<AirPortStatusApply> req)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = configuration.GetSection("DroneDocking:Url").Value + "/droneAirport/reportDroneStatus";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 获取临时上传地址
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> getUploadFilePath(AirPortUploadReq req)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = configuration.GetSection("DroneDocking:Url").Value + "/DataExchange/getUploadFilePath";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", x_lc_secret);
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
client.DefaultRequestHeaders.Add("x-lc-datacode", "AirportData");
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
public async Task<Response<string>> UploadFile(AirPortUploadDbReq req)
{
Response<string> Response = new Response<string>();
var filePath = req.filePath;
var uploadUrl = req.fileUrl;
var fileName = req.filename;
byte[] fileBuffer = null;
HttpClient client = null;
MultipartFormDataContent formData = null;
try
{
//文件过大,建议使用 大文件上传接口,分段读取,进行上传
fileBuffer = File.ReadAllBytes(filePath);
client = new HttpClient();
client.Timeout = new TimeSpan(0, 0, 0, 5);
formData = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(fileBuffer);
fileContent.Headers.ContentDisposition = new
ContentDispositionHeaderValue("attachment");
fileContent.Headers.ContentDisposition.FileName = fileName;
//注意:务必 根据 文件扩展名,这里指定 ContentType
fileContent.Headers.ContentType = new
MediaTypeHeaderValue("application/octet-stream");
formData.Add(fileContent);
var request = new HttpRequestMessage
{
//注意:这里是 PUT
Method = HttpMethod.Put,
RequestUri = new Uri(uploadUrl),
Content = formData
};
var result = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
if (string.IsNullOrWhiteSpace(result))
{
Response.Result = result;
}
}
catch (Exception ex)
{
Response.Result = "上传失败";
}
finally
{
fileBuffer = null;
formData?.Dispose();
client?.Dispose();
}
return Response;
}
/// <summary>
/// 无人机状态获取
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> getResult(string taskid)
{
ResData Response = new ResData();
using (var uow = base.UnitWork.CreateContext())
{
//查询数据 检查是否有重复数据
var info = uow.DbfineInfo.AsQueryable().Where(r => r.taskid == taskid).First();
string json = JsonSerializer.Serialize(info);
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "获取无人机成果成功!";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
}
public async void InsertDb(string taskid) {
var sqliteconnect = configuration.GetSection("DroneDocking:DbFile").Value;
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))
{
cmd2.ExecuteNonQuery();
}
string sqlInsert = "INSERT INTO JMXX (ZSDM, SZZS,ZSBFJGDM,ZSBFJGGY) VALUES (@ZSDM, @SZZS,@ZSBFJGDM,@ZSBFJGGY)";
using (var cmd1 = new SQLiteCommand(sqlInsert, sqliteConn))
{
cmd1.Parameters.AddWithValue("@ZSDM", "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ");
cmd1.Parameters.AddWithValue("@SZZS", "eyJvcmdjb2RlIjoiOTEzNzEzMDAzMjgzOTg1NzdRIiwib3JnbmFtZSI6IuWxseS4nOaFp+WIm+S/oeaBr+enkeaKgOaciemZkOWFrOWPuCIsImNlcnRjb2RlIjoiVUFWMzJfTEpZMkZQTVlERTZVREVTM1AzWkQ3VjNJS1EiLCJjZXJ0b3JnY29kZSI6IjEyMTAwMDAwNDAwMDEwMzk4UCIsImNlcnRvcmduYW1lIjoi5Lit5Zu95Zu95Zyf5YuY5rWL6KeE5YiS6Zmi5omn5rOV5qih5Z2XIiwiZXhwaXJhdGlvbiI6IjIwMjYtMDctMDEgMTU6NDY6MjAiLCJwdWJsaWNrZXkiOiIwNEYxQkYxQkVGRDYzRjE2RTVEQjNCQ0QzMkNBNUQ5QThFOERGN0FERDY3RDZDNEYyOTNGQjIzRjdCREE3NEY1MkQzMUI4RERBRDAzRDk1NUQ1NjY1MDVBMTVEOEI3REJFODNCNDIzNzhCOEU4NzQ5QzBFQjZFMkZCQzg2Nz" +
"U4MzhCIiwic2lnbiI6IjJBQTIyNDkwQzYxNkI0NjEzNUY2MDRBNDczNjFCQjJGRDcxMEJGOTdBQjcyNDdCMzYxQzc2N0NGQTNGNzcyMTQ0MkExQzhDMUVBRTIxRkEwQUZEMzJGRDg1NjdDMDg1MThGRUY4NTg2RUVCNkE4OTE1MDVBQjUxRjZDNDUyRUM2IiwiY2VydHR5cGUiOiLml6DkurrmnLrkuL7or4Hor4HkuaYiLCJyZWdpb25jb2RlIjoiMzcxMzAwIn0=");
cmd1.Parameters.AddWithValue("@ZSBFJGDM", "91371300328398577Q");
cmd1.Parameters.AddWithValue("@ZSBFJGGY", "04F1BF1BEFD63F16E5DB3BCD32CA5D9A8E8DF7ADD67D6C4F293FB23F7BDA74F52D31B8DDAD03D955D566505A15D8B7DBE83B42378B8E8749C0EB6E2FBC8675838B");
cmd1.ExecuteNonQuery();
}
string deleteDbinfo = "delete from DB_INFO";
using (var cmd = new SQLiteCommand(deleteDbinfo, sqliteConn))
{
cmd.ExecuteNonQuery();
}
DateTime dt = DateTime.Now;
string dt24 = dt.ToString("yyyy-MM-dd HH:mm:ss");
string sqlInsertDbinfo = "INSERT INTO DB_INFO (VERSION, CREATETIME,UPDATETIME,CREATEUSER,DESCRIPTION) VALUES (@VERSION, @CREATETIME,@UPDATETIME,@CREATEUSER,@DESCRIPTION)";
using (var cmd = new SQLiteCommand(sqlInsertDbinfo, sqliteConn))
{
cmd.Parameters.AddWithValue("@VERSION", 2.0);
cmd.Parameters.AddWithValue("@CREATETIME", dt24);
cmd.Parameters.AddWithValue("@UPDATETIME", dt24);
cmd.Parameters.AddWithValue("@CREATEUSER", "system");
cmd.Parameters.AddWithValue("@DESCRIPTION", "DESCRIPTION");
cmd.ExecuteNonQuery();
}
string deleteFj = "delete from FJ";
using (var cmd = new SQLiteCommand(deleteFj, sqliteConn))
{
cmd.ExecuteNonQuery();
}
for (int i = 0; i < filigtlist.Count; i++)
{
var flightid = filigtlist[i];
string fligthpicsql = "select * from lasa_mediafile where \"FlightId\"='"+ flightid.flighttaskid+"'";
var pics = _client.Ado.SqlQuery<LasaMediaFile>(fligthpicsql);
for (int j = 0; j < pics.Count; j++)
{
var pic = pics[j];
var imageStream = _minioService.GetObjectAsStream("", pic.ObjectKey+"");
if (imageStream.Result==null)
{
continue;
}
byte[] bytes;
using (MemoryStream memoryStream = new MemoryStream())
{
imageStream.Result.CopyTo(memoryStream); // 将原始流复制到MemoryStream中
bytes = memoryStream.ToArray(); // 获取MemoryStream的字节数组表示
}
string fileHash;
using (var sha256 = SHA256.Create()) {
var hashBytes = sha256.ComputeHash(bytes);
fileHash = BitConverter.ToString(hashBytes).Replace("-",
"").ToLower();
}
string sqlintoFj = "INSERT INTO FJ (BSM, DKLX,DKBSM,ZDKBH,XZQDM,FJMC,FJLX,PSTZ,FJ,FJHXZ,PSSJ,XDGD,JDGD,Longitude,Latitude,PSFYJ,PSJD,PSHGJ,PSJJ,FJYSKD,FJYSGD,PSDXZXX,PSRY,SPKZXX,ZSDM,JYM) " +
"VALUES (@BSM, @DKLX,@DKBSM,@ZDKBH,@XZQDM,@FJMC,@FJLX,@PSTZ,@FJ,@FJHXZ,@PSSJ,@XDGD,@JDGD,@Longitude,@Latitude,@PSFYJ,@PSJD,@PSHGJ,@PSJJ,@FJYSKD,@FJYSGD,@PSDXZXX,@PSRY,@SPKZXX,@ZSDM,@JYM)";
using (var cmd = new SQLiteCommand(sqlintoFj, sqliteConn))
{
cmd.Parameters.AddWithValue("@BSM", pic.Id);
cmd.Parameters.AddWithValue("@DKLX", flightid.dklx);
cmd.Parameters.AddWithValue("@DKBSM", flightid.dkbh);
cmd.Parameters.AddWithValue("@ZDKBH", flightid.zdkbh);
cmd.Parameters.AddWithValue("@XZQDM", flightid.xzqdm);
cmd.Parameters.AddWithValue("@FJMC", pic.Name);
cmd.Parameters.AddWithValue("@FJLX", 1);
cmd.Parameters.AddWithValue("@PSTZ", "Y");
cmd.Parameters.AddWithValue("@FJ", bytes);
cmd.Parameters.AddWithValue("@FJHXZ", fileHash);
cmd.Parameters.AddWithValue("@PSSJ",pic.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"));
cmd.Parameters.AddWithValue("@XDGD", pic.RelativeAltitude);
cmd.Parameters.AddWithValue("@JDGD", pic.AbsoluteAltitude);
cmd.Parameters.AddWithValue("@Longitude", pic.Lat);
cmd.Parameters.AddWithValue("@Latitude", pic.Lng);
cmd.Parameters.AddWithValue("@PSFYJ", pic.GimbalYawDegree);
cmd.Parameters.AddWithValue("@PSJD", pic.GimbalYawDegree);
cmd.Parameters.AddWithValue("@PSHGJ", pic.GimbalYawDegree);
cmd.Parameters.AddWithValue("@PSJJ", pic.FocalLength);
cmd.Parameters.AddWithValue("@FJYSKD", pic.Width);
cmd.Parameters.AddWithValue("@FJYSGD", pic.Height);
cmd.Parameters.AddWithValue("@PSDXZXX", "");
cmd.Parameters.AddWithValue("@PSRY", "system");
cmd.Parameters.AddWithValue("@SPKZXX", "wu");
cmd.Parameters.AddWithValue("@ZSDM", "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ");
cmd.Parameters.AddWithValue("@JYM", "DESCRIPTION");
cmd.ExecuteNonQuery();
}
}
}
sqliteConn.Close();
}
AirPortUploadReq airPortUploadReq = new AirPortUploadReq();
airPortUploadReq.code = "AirportData";
airPortUploadReq.regioncode = filigtlist[0].xzqdm;
List<string> strings = new List<string>();
strings.Add(filigtlist[0].xzqdm + ".db");
airPortUploadReq.filenames = strings;
var result = await getUploadFilePath(airPortUploadReq);
var jsonstr = result.Result;
JArray jObject = JArray.Parse(jsonstr);
var liststr = jObject[0].Value<JObject>();
var write = liststr["writeurl"].ToString();
var read = liststr["readurl"].ToString();
AirPortUploadDbReq req = new AirPortUploadDbReq();
req.fileUrl = write;
req.filePath = configuration.GetSection("DroneDocking:DbFile").Value;
req.filename = filigtlist[0].xzqdm + ".db";
using (var uow = base.UnitWork.CreateContext())
{
DbfineInfo dbfine = new DbfineInfo();
dbfine.id = Guid.NewGuid().ToString();
dbfine.taskid = taskid;
dbfine.regioncode = filigtlist[0].xzqdm;
dbfine.extension = ".db";
dbfine.attachment_count = 1;
dbfine.size = 1000;
dbfine.count = 50;
dbfine.url = read;
dbfine.hashcode = "adewfdafdaf";
var info = await uow.DbfineInfo.InsertAsync(dbfine);
uow.Commit();
Console.WriteLine(info);
}
await UploadFile(req);
}
// 安全获取响应头值的方法
private static string GetHeaderValue(HttpResponseMessage response, string headerName)
{
if (response.Headers.TryGetValues(headerName, out IEnumerable<string> values))
{
return string.Join(", ", values); // 如果多个值则合并
}
// 尝试忽略大小写再次查找
foreach (var header in response.Headers)
{
if (header.Key.Equals(headerName, StringComparison.OrdinalIgnoreCase))
{
return string.Join(", ", header.Value);
}
}
return null; // 未找到
}
//获取省对接任务信息
public async Task<Response<PageInfo<List<DroneDockRes>>>> GetDroneDockInfos(string keyWord, int page, int limit)
{
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
{
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()
})
.ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<DroneDockRes>>>
{
Result = new PageInfo<List<DroneDockRes>>
{
Items = info,
Total = totalCount
}
};
}
//获取飞行数据
public async Task<Response<DroneDockflightRes>> GetDroneDockflightInfos(string taskid)
{
DroneDockflightRes res=new DroneDockflightRes();
var detailinfo=await Repository.ChangeRepository<SugarRepositiry<DroneDocktaskdetail>>()
.AsQueryable()
.Where(r=>r.flighttaskid==taskid)
.ToListAsync();
if (detailinfo.Count > 0)
{
var taskId= detailinfo[0].taskid;
var taskinfo = await Repository.AsQueryable().Where(r => r.id == taskId).FirstAsync();
var flighttaskinfo= await Repository.ChangeRepository<SugarRepositiry<LasaTask>>()
.AsQueryable()
.Where(r => r.FlightId == taskid)
.FirstAsync();
if (taskinfo != null)
{
res.bizidname = taskinfo.bizidname;
res.taskname = taskinfo.taskname;
}
res.tasklist = detailinfo;
if(flighttaskinfo != null)
{
res.taskExecuteTime =Convert.ToDateTime(flighttaskinfo.ExecuteTime).ToString("yyyy-MM-dd HH:mm:ss");
res.waylineName=flighttaskinfo.TaskAirLineName;
res.flightTaskType=Convert.ToInt32(flighttaskinfo.FlightTaskType);
switch (flighttaskinfo.Status)
{
case 0:
res.flightTaskState = 1;
break;
case 1:
res.flightTaskState = 2;
break;
case 2:
res.flightTaskState = 3;
break;
case 5:
res.flightTaskState = 0;
break;
case null: //交集
res.flightTaskState = 4;
break;
}
}
}
return new Response<DroneDockflightRes>
{
Result = res
};
}
}
}