|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Dynamic;
|
|
|
|
@ -13,15 +14,18 @@ using MetadataExtractor;
|
|
|
|
|
using MetadataExtractor.Formats.Exif;
|
|
|
|
|
using MetadataExtractor.Formats.Xmp;
|
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
|
using Microsoft.Net.Http.Headers;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using OpenAuth.App.BaseApp.Base;
|
|
|
|
|
using OpenAuth.App.BaseApp.Subscribe;
|
|
|
|
|
using OpenAuth.App.BasicQueryService;
|
|
|
|
|
using OpenAuth.App.Interface;
|
|
|
|
|
using OpenAuth.App.Request;
|
|
|
|
|
using OpenAuth.App.ServiceApp.AirLine.Request;
|
|
|
|
|
using OpenAuth.App.ServiceApp.FlyTask.Request;
|
|
|
|
|
using OpenAuth.App.ServiceApp.FlyTask.Response;
|
|
|
|
|
using OpenAuth.App.ServiceApp.Request;
|
|
|
|
|
using OpenAuth.App.ServiceApp.Response;
|
|
|
|
@ -40,17 +44,21 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
private readonly MqttClientManager _mqttClientManager;
|
|
|
|
|
private readonly MinioService _minioService;
|
|
|
|
|
private readonly OpenJobApp _openJobApp;
|
|
|
|
|
private readonly ILogger<LasaDronePort> _logger;
|
|
|
|
|
CommonDataManager _commonDataManager;
|
|
|
|
|
private readonly ConcurrentDictionary<string, DateTime> _processedMessages = new();
|
|
|
|
|
private readonly TimeSpan _deduplicationWindow = TimeSpan.FromMinutes(1);
|
|
|
|
|
|
|
|
|
|
public ManageApp(ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<LasaDronePort> repository, IAuth auth,
|
|
|
|
|
MqttClientManager mqttClientManager, CommonDataManager commonDataManager, MinioService minioService,
|
|
|
|
|
OpenJobApp openJobApp)
|
|
|
|
|
OpenJobApp openJobApp, ILogger<LasaDronePort> logger)
|
|
|
|
|
: base(unitWork, repository, auth)
|
|
|
|
|
{
|
|
|
|
|
_mqttClientManager = mqttClientManager;
|
|
|
|
|
_minioService = minioService;
|
|
|
|
|
_commonDataManager = commonDataManager;
|
|
|
|
|
_openJobApp = openJobApp;
|
|
|
|
|
_logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 机场管理
|
|
|
|
@ -416,7 +424,7 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
task.CreateTime = DateTime.Now;
|
|
|
|
|
//task.FlightId = Guid.NewGuid().ToString();
|
|
|
|
|
// 如:执行时长,单次定时的时间
|
|
|
|
|
// 0-飞行计划 1-指点飞行
|
|
|
|
|
// 0-飞行计划 1-手飞任务
|
|
|
|
|
task.FlightTaskType = 0; //
|
|
|
|
|
task.PlanExecuteDuration = airLine.ScheduleTime;
|
|
|
|
|
task.ExpectedFileCount = airLine.PictureTotal;
|
|
|
|
@ -428,11 +436,20 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
Id = Guid.NewGuid().ToString(),
|
|
|
|
|
TaskId = task.Id,
|
|
|
|
|
AlgoInstanceId = task.AlgoInstanceId,
|
|
|
|
|
WarningTitle = task.WarningTitle,
|
|
|
|
|
WarningContent = task.WarningContent
|
|
|
|
|
};
|
|
|
|
|
if (!string.IsNullOrEmpty(task.WarningTitle))
|
|
|
|
|
{
|
|
|
|
|
aiInspection.WarningTitle = task.WarningTitle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(task.WarningContent))
|
|
|
|
|
{
|
|
|
|
|
aiInspection.WarningContent = task.WarningContent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await db.LasaAiInspection.InsertAsync(aiInspection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// //{"0":"立即任务","1":"定时任务",
|
|
|
|
|
var type = task.TaskType;
|
|
|
|
|
if (type.Equals(1) || type.Equals(2)) // 定时任务
|
|
|
|
@ -445,10 +462,10 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
{
|
|
|
|
|
JobName = $"{task.Id}",
|
|
|
|
|
JobType = 0, // 本地任务
|
|
|
|
|
JobCall = "OpenAuth.App.ServiceApp.FlyTaskJob",
|
|
|
|
|
JobCall = "OpenAuth.App.OpenJob.FlyTaskJob",
|
|
|
|
|
JobCallParams = "{\"taskId\":\"" + task.Id + "\"}",
|
|
|
|
|
Cron = task.PeriodicFormula,
|
|
|
|
|
Status = 1, // 开启运行 todo 关于修改后关闭问题
|
|
|
|
|
Status = 1, // 开启运行
|
|
|
|
|
Remark = "定时任务",
|
|
|
|
|
};
|
|
|
|
|
var jobId = _openJobApp.Add(record);
|
|
|
|
@ -1183,7 +1200,6 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
Wpml = wpml
|
|
|
|
|
};
|
|
|
|
|
await Repository.ChangeRepository<SugarRepositiry<LasaTaskAssign>>().InsertAsync(taskAssign);
|
|
|
|
|
// todo 更新任务状态?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task PendingFlyTask(string taskId)
|
|
|
|
@ -2345,5 +2361,392 @@ namespace OpenAuth.App.ServiceApp
|
|
|
|
|
Result = true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 保存手飞任务信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="task"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<Response<dynamic>> SaveHandFlyTask(LasaHandFlyTask task)
|
|
|
|
|
{
|
|
|
|
|
var user = _auth.GetCurrentUser().User;
|
|
|
|
|
var date = DateTime.Now;
|
|
|
|
|
var lasaTask = new LasaTask
|
|
|
|
|
{
|
|
|
|
|
Id = Guid.NewGuid().ToString(),
|
|
|
|
|
TaskName = $"手飞任务 {date:yyyyMMddHHmmss}",
|
|
|
|
|
TaskType = 0,
|
|
|
|
|
//0 计划任务 1 手飞任务
|
|
|
|
|
FlightTaskType = 1,
|
|
|
|
|
AIInspection = "true",
|
|
|
|
|
WorkspaceId = task.WorkspaceId,
|
|
|
|
|
FlightId = task.FlightId,
|
|
|
|
|
Status = 1, // 待执行
|
|
|
|
|
CreateTime = date,
|
|
|
|
|
ScheduledStartTime = date, // 任务计划执行时间
|
|
|
|
|
ExecuteTime = date, // 任务开始执行时间
|
|
|
|
|
CreateUserName = user.Name,
|
|
|
|
|
CreateId = user.Id
|
|
|
|
|
};
|
|
|
|
|
await Repository.ChangeRepository<SugarRepositiry<LasaTask>>().InsertAsync(lasaTask);
|
|
|
|
|
return new Response<dynamic>()
|
|
|
|
|
{
|
|
|
|
|
Result = new
|
|
|
|
|
{
|
|
|
|
|
taskId = lasaTask.Id
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<Response<bool>> CallAiModel(CallAiModel req)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogDebug("成功调用CallAIModel");
|
|
|
|
|
var task = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaTask>>()
|
|
|
|
|
.GetByIdAsync(req.TaskId);
|
|
|
|
|
;
|
|
|
|
|
using var db = Repository.AsSugarClient();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
db.Ado.BeginTran();
|
|
|
|
|
if (task.FlightTaskType.Equals(1)) // 手飞任务
|
|
|
|
|
{
|
|
|
|
|
var aiInspection = new LasaAiInspection
|
|
|
|
|
{
|
|
|
|
|
Id = Guid.NewGuid().ToString(),
|
|
|
|
|
TaskId = req.TaskId,
|
|
|
|
|
AlgoInstanceId = req.AlgoInstanceId,
|
|
|
|
|
};
|
|
|
|
|
if (!string.IsNullOrEmpty(req.WarningContent))
|
|
|
|
|
{
|
|
|
|
|
aiInspection.WarningTitle = req.WarningTitle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(req.WarningContent))
|
|
|
|
|
{
|
|
|
|
|
aiInspection.WarningContent = req.WarningContent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新
|
|
|
|
|
// todo 关于多次调用问题
|
|
|
|
|
var count = await db.Queryable<LasaAiInspection>().Where(x => x.TaskId == req.TaskId).CountAsync();
|
|
|
|
|
if (count == 0)
|
|
|
|
|
{
|
|
|
|
|
await db.Insertable(aiInspection).ExecuteCommandAsync();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var aiInspection = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaAiInspection>>()
|
|
|
|
|
.AsQueryable().Where(x => x.TaskId == req.TaskId).FirstAsync();
|
|
|
|
|
req.AlgoInstanceId = aiInspection.AlgoInstanceId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var algoInstances = await db
|
|
|
|
|
.Queryable<LasaAlgoInstance>()
|
|
|
|
|
.Where(x => x.Id == req.AlgoInstanceId)
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
var tagsIds = algoInstances.Select(x => x.Tags).ToList();
|
|
|
|
|
// todo 关于存在多个算法的处理
|
|
|
|
|
var algoIds = algoInstances.First().AlgoIds.Split(",").ToArray();
|
|
|
|
|
var algo = await db
|
|
|
|
|
.Queryable<LasaAlgorithmsRepository>()
|
|
|
|
|
.Where(x => x.Id == algoIds[0])
|
|
|
|
|
.FirstAsync();
|
|
|
|
|
dynamic json = new
|
|
|
|
|
ExpandoObject();
|
|
|
|
|
var x = SnowFlakeSingle.instance;
|
|
|
|
|
//var pushUrl = $"rtmp://box.wisestcity.com:1935/live/{x.NextId()}";
|
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
var pushUrl = config["AIModelApi:PushUrl"];
|
|
|
|
|
json.rtmp_url = req.RtmpUrl;
|
|
|
|
|
json.push_url = pushUrl;
|
|
|
|
|
json.imgsz = 640;
|
|
|
|
|
json.frame_skip = 1;
|
|
|
|
|
json.model_name = algo.Path;
|
|
|
|
|
//json.model_name = "yolo12x.pt";
|
|
|
|
|
json.taskname = task.TaskName;
|
|
|
|
|
json.taskid = req.TaskId;
|
|
|
|
|
// 算法id
|
|
|
|
|
json.AlgoId = algo.Id;
|
|
|
|
|
var taskRecord = new LasaTask()
|
|
|
|
|
{
|
|
|
|
|
Id = req.TaskId,
|
|
|
|
|
Status = 6, // 智能巡检状态
|
|
|
|
|
PushUrl = pushUrl
|
|
|
|
|
};
|
|
|
|
|
var tagIdArray = new List<string>();
|
|
|
|
|
foreach (var tagId in tagsIds)
|
|
|
|
|
{
|
|
|
|
|
tagIdArray.AddRange(tagId.Split(",").ToList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await db.Updateable(taskRecord).IgnoreNullColumns().ExecuteCommandAsync();
|
|
|
|
|
var tag = await db
|
|
|
|
|
.Queryable<LasaModelLabel>()
|
|
|
|
|
.Where(l => tagIdArray.Contains(l.Id))
|
|
|
|
|
.ToArrayAsync();
|
|
|
|
|
IDictionary<string, object> jsonTag = new Dictionary<string, object>();
|
|
|
|
|
foreach (var lasaModelLabel in tag)
|
|
|
|
|
{
|
|
|
|
|
var model = new
|
|
|
|
|
{
|
|
|
|
|
name = lasaModelLabel.Name,
|
|
|
|
|
reliability = lasaModelLabel.Reliability
|
|
|
|
|
};
|
|
|
|
|
jsonTag[lasaModelLabel.EnumValue.ToString()] = model;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
json.tag = jsonTag;
|
|
|
|
|
Console.WriteLine(JsonConvert.SerializeObject(json));
|
|
|
|
|
var content = new StringContent(JsonConvert.SerializeObject(json), Encoding.UTF8, "application/json");
|
|
|
|
|
var url = config["AIModelApi:Url"];
|
|
|
|
|
using var httpClient = new HttpClient();
|
|
|
|
|
var response = await httpClient.PostAsync($"{url}/start_detection", content);
|
|
|
|
|
//var response = await httpClient.PostAsync("http://192.168.10.131:9025/start_detection", content);
|
|
|
|
|
_logger.LogDebug($"成功调用{response.IsSuccessStatusCode}");
|
|
|
|
|
db.Ado.CommitTran();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
db.Ado.RollbackTran();
|
|
|
|
|
throw ex;
|
|
|
|
|
//throw new Exception("调用智能巡检失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Response<bool>()
|
|
|
|
|
{
|
|
|
|
|
Result = true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<Response<bool>> EndHandFlyTask(string taskid)
|
|
|
|
|
{
|
|
|
|
|
var task = new LasaTask()
|
|
|
|
|
{
|
|
|
|
|
Id = taskid,
|
|
|
|
|
// ScheduledEndTime = DateTime.Now,
|
|
|
|
|
CompletedTime = DateTime.Now,
|
|
|
|
|
Status = 5 // 成功
|
|
|
|
|
};
|
|
|
|
|
using var db = Repository.AsSugarClient();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
db.Ado.BeginTran();
|
|
|
|
|
await db.Updateable(task).IgnoreNullColumns().ExecuteCommandAsync();
|
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
var url = config["AIModelApi:Url"];
|
|
|
|
|
// 结束智能巡检
|
|
|
|
|
using var httpClient = new HttpClient();
|
|
|
|
|
await httpClient.PostAsync($"{url}/stop_detection", null);
|
|
|
|
|
db.Ado.CommitTran();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
db.Ado.RollbackTran();
|
|
|
|
|
throw new Exception("结束任务失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Response<bool>()
|
|
|
|
|
{
|
|
|
|
|
Result = true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsDuplicate(string messageId)
|
|
|
|
|
{
|
|
|
|
|
var now = DateTime.UtcNow;
|
|
|
|
|
// 清理过期消息
|
|
|
|
|
foreach (var kvp in _processedMessages)
|
|
|
|
|
{
|
|
|
|
|
if (now - kvp.Value > _deduplicationWindow)
|
|
|
|
|
{
|
|
|
|
|
_processedMessages.TryRemove(kvp.Key, out _);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查是否已存在
|
|
|
|
|
if (_processedMessages.ContainsKey(messageId))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_processedMessages[messageId] = now;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<Response<bool>> TestZhiBao(string message)
|
|
|
|
|
{
|
|
|
|
|
var sn = "8UUXN5400A079H";
|
|
|
|
|
var result = JsonConvert.DeserializeObject<TopicServicesRequest<dynamic>>(message);
|
|
|
|
|
var method = result.method;
|
|
|
|
|
var data = result.data;
|
|
|
|
|
//_logger.LogInformation($"主题:{topic}\n消息:{message}");
|
|
|
|
|
long code = 0;
|
|
|
|
|
var isHandle = IsDuplicate(Md5.Encrypt(message));
|
|
|
|
|
//_logger.LogDebug($"md5: {isHandle} 重复否:{IsDuplicate(Md5.Encrypt(message))} 信息:{message} ");
|
|
|
|
|
if (isHandle)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("跳过处理");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_logger.LogDebug("航线进度未跳过处理");
|
|
|
|
|
code = data.result; // result
|
|
|
|
|
|
|
|
|
|
var waylineMissionState = (int)data.output.ext.wayline_mission_state;
|
|
|
|
|
string flightId1 = (string)data.output.ext.flight_id;
|
|
|
|
|
var taskAssign1 = GetTaskAssignByFlightId(flightId1);
|
|
|
|
|
// 处理航线进度 ,也有可能是失败
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var step = (int)data.output.progress.current_step;
|
|
|
|
|
_logger.LogDebug($"航线进度:{waylineMissionState} {step} {message}");
|
|
|
|
|
if (step.Equals(25)) // 航线执行
|
|
|
|
|
{
|
|
|
|
|
var task = await Repository.AsSugarClient().Queryable<LasaTask>()
|
|
|
|
|
.FirstAsync(y => y.Id == taskAssign1.TaskId);
|
|
|
|
|
if (task != null && !string.IsNullOrEmpty(task.AIInspection) &&
|
|
|
|
|
task.AIInspection.Equals("true") && string.IsNullOrEmpty(task.PushUrl))
|
|
|
|
|
{
|
|
|
|
|
_logger.LogDebug("执行AI 智能巡检。。。。。");
|
|
|
|
|
var rtmp = "rtmp://box.wisestcity.com:1935/live/55";
|
|
|
|
|
var param =
|
|
|
|
|
@$"{{""bid"": ""{Guid.NewGuid().ToString()}"",""method"": ""live_start_push"",""tid"": ""{Guid.NewGuid().ToString()}"",
|
|
|
|
|
""timestamp"": {DateTimeOffset.Now.ToUnixTimeMilliseconds()},
|
|
|
|
|
""data"": {{
|
|
|
|
|
""url_type"": 1,
|
|
|
|
|
""url"": ""{rtmp}"",
|
|
|
|
|
""video_id"": ""8UUXN5400A079H/165-0-7/normal-0"",
|
|
|
|
|
""video_quality"": 3
|
|
|
|
|
}}
|
|
|
|
|
}}";
|
|
|
|
|
//thing/product/{gateway_sn}/services
|
|
|
|
|
var topicRequest = $"thing/product/{sn}/services";
|
|
|
|
|
var x = RemoveSpecificChars(param);
|
|
|
|
|
_logger.LogDebug($"直播参数:{x}");
|
|
|
|
|
await _mqttClientManager.PublishAsync(topicRequest, x);
|
|
|
|
|
var req = new CallAiModel { TaskId = taskAssign1.TaskId, RtmpUrl = rtmp };
|
|
|
|
|
await CallAiModel(req);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 航线成功
|
|
|
|
|
/*
|
|
|
|
|
if (waylineMissionState.Equals(9)) // 航结结束,更新任务状态
|
|
|
|
|
{
|
|
|
|
|
var task = await Repository.AsSugarClient().Queryable<LasaTask>()
|
|
|
|
|
.FirstAsync(y => y.Id == taskAssign1.TaskId);
|
|
|
|
|
if (!string.IsNullOrEmpty(task.AIInspection) && task.AIInspection.Equals(true) &&
|
|
|
|
|
!string.IsNullOrEmpty(task.PushUrl))
|
|
|
|
|
{
|
|
|
|
|
// 停止直播
|
|
|
|
|
// 停止 aimodel 运行
|
|
|
|
|
var para = @$"{{
|
|
|
|
|
""bid"": ""{Guid.NewGuid().ToString()}"",
|
|
|
|
|
""data"": {{
|
|
|
|
|
""video_id"": ""8UUXN5400A079H/165-0-7/normal-0""
|
|
|
|
|
}},
|
|
|
|
|
""tid"":""{Guid.NewGuid().ToString()}"",
|
|
|
|
|
""timestamp:"": {DateTimeOffset.Now.ToUnixTimeMilliseconds()},
|
|
|
|
|
""method"": ""live_stop_push""
|
|
|
|
|
}}";
|
|
|
|
|
var topicRequest = $"thing/product/{sn}/services";
|
|
|
|
|
await _mqttClientManager.PublishAsync(topicRequest, RemoveSpecificChars(para));
|
|
|
|
|
using var httpClient = new HttpClient();
|
|
|
|
|
await httpClient.PostAsync("http://192.168.10.131:9025/stop_detection", null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var record = new LasaTask()
|
|
|
|
|
{
|
|
|
|
|
Id = taskAssign1.TaskId,
|
|
|
|
|
Status = 5
|
|
|
|
|
};
|
|
|
|
|
// await Repository.AsSugarClient().Updateable(record).IgnoreNullColumns().ExecuteCommandAsync();
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void CloseZhibo(string videoId)
|
|
|
|
|
{
|
|
|
|
|
var sn = "8UUXN5400A079H";
|
|
|
|
|
var para = @$"{{
|
|
|
|
|
""bid"": ""{Guid.NewGuid().ToString()}"",
|
|
|
|
|
""data"": {{
|
|
|
|
|
""video_id"": ""8UUXN5400A079H/165-0-7/normal-0""
|
|
|
|
|
}},
|
|
|
|
|
""tid"":""{Guid.NewGuid().ToString()}"",
|
|
|
|
|
""timestamp:"": {DateTimeOffset.Now.ToUnixTimeMilliseconds()},
|
|
|
|
|
""method"": ""live_stop_push""
|
|
|
|
|
}}";
|
|
|
|
|
var topicRequest = $"thing/product/{sn}/services";
|
|
|
|
|
_mqttClientManager.PublishAsync(topicRequest, para);
|
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
var url = config["AIModelApi:Url"];
|
|
|
|
|
using var httpClient = new HttpClient();
|
|
|
|
|
httpClient.PostAsync($"{url}/stop_detection", null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string RemoveSpecificChars(string input)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(input))
|
|
|
|
|
return input;
|
|
|
|
|
|
|
|
|
|
var charsToRemove = new char[] { ' ', '\r', '\n', '\t' };
|
|
|
|
|
return string.Concat(input.Where(c => !charsToRemove.Contains(c)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<Response<dynamic>> GetLastHandFlyTask()
|
|
|
|
|
{
|
|
|
|
|
var result = await Repository.ChangeRepository<SugarRepositiry<LasaTask>>()
|
|
|
|
|
.AsQueryable().Where(r => r.FlightTaskType == 1)
|
|
|
|
|
.OrderByDescending(r => r.CreateTime)
|
|
|
|
|
.Select<dynamic>(r => new
|
|
|
|
|
{
|
|
|
|
|
r.Id,
|
|
|
|
|
r.Status
|
|
|
|
|
})
|
|
|
|
|
.FirstAsync();
|
|
|
|
|
return new Response<dynamic>
|
|
|
|
|
{
|
|
|
|
|
Result = result
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<Response<bool>> EndAiInspection(string taskid)
|
|
|
|
|
{
|
|
|
|
|
var task = new LasaTask()
|
|
|
|
|
{
|
|
|
|
|
Id = taskid,
|
|
|
|
|
// ScheduledEndTime = DateTime.Now,
|
|
|
|
|
//CompletedTime = DateTime.Now,
|
|
|
|
|
Status = 1 // 成功
|
|
|
|
|
};
|
|
|
|
|
using var db = Repository.AsSugarClient();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
db.Ado.BeginTran();
|
|
|
|
|
await db.Updateable(task).IgnoreNullColumns().ExecuteCommandAsync();
|
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
var url = config["AIModelApi:Url"];
|
|
|
|
|
// 结束智能巡检
|
|
|
|
|
using var httpClient = new HttpClient();
|
|
|
|
|
await httpClient.PostAsync($"{url}/stop_detection", null);
|
|
|
|
|
db.Ado.CommitTran();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
db.Ado.RollbackTran();
|
|
|
|
|
throw new Exception("结束任务失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Response<bool>()
|
|
|
|
|
{
|
|
|
|
|
Result = true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|