AIController.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using Microsoft.AspNetCore.Mvc;
  2. using Ropin.Inspection.Service;
  3. using System.Net.Http;
  4. using Ropin.Inspection.Common.Helper;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Ropin.Inspection.Api.Common;
  7. using System.Threading.Tasks;
  8. using Ropin.Inspection.Model;
  9. using System.Collections.Generic;
  10. using System;
  11. using Newtonsoft.Json;
  12. using Microsoft.Extensions.Configuration;
  13. using Ropin.Inspection.Service.VMC.Interface;
  14. using Newtonsoft.Json.Linq;
  15. using System.IO;
  16. namespace Ropin.Inspection.Api.Controllers.Base
  17. {
  18. public class AIController : BaseController
  19. {
  20. private readonly IHttpClientFactory _httpClientFactory;
  21. private readonly AIProjectHelper aIHelper;
  22. private readonly ITsysMessageService _TsysMessageService;
  23. private readonly IPushMsgService _pushMsgService;
  24. private readonly IVmcCameraService _vmcCameraService;
  25. private string IsUpdateAI = "false";
  26. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(AIController));
  27. public AIController(IHttpClientFactory httpClientFactory, ITsysMessageService tsysMessageService, IPushMsgService pushMsgService, IConfiguration configuration, IVmcCameraService vmcCameraService)
  28. {
  29. aIHelper = new AIProjectHelper(httpClientFactory);
  30. _TsysMessageService = tsysMessageService;
  31. _pushMsgService = pushMsgService;
  32. string IsUpdate = configuration.GetSection("AIIsUpdate")?.Value;
  33. IsUpdateAI = !string.IsNullOrEmpty(IsUpdate) ? IsUpdate : "false";
  34. _vmcCameraService = vmcCameraService;
  35. }
  36. /// <summary>
  37. /// AI登录
  38. /// </summary>
  39. /// <returns></returns>
  40. [HttpGet("AiLogin")]
  41. [AllowAnonymous]
  42. public async Task<AILoginOutput> AiLogin()
  43. {
  44. var token = await aIHelper.GetToken();
  45. return token;
  46. }
  47. /// <summary>
  48. /// AI-获取历史报警记录
  49. /// </summary>
  50. /// <returns></returns>
  51. [HttpGet("AiHistoricAlmrecord/{Devno}/{Page}/{pageSize}")]
  52. [AllowAnonymous]
  53. public async Task<ApiResult<AISqlSugarPagedList<AlmRecordOutput>>> AiHistoricAlmrecord(string Devno, int Page = 1, int pageSize = 10, long? entityId = null)
  54. {
  55. var data = await aIHelper.GetHistoricAlmrecord(Devno, Page, pageSize, entityId);
  56. return new ApiResult<AISqlSugarPagedList<AlmRecordOutput>>(data, ReturnCode.Success);
  57. }
  58. /// <summary>
  59. /// AI-获取报警处理列表
  60. /// </summary>
  61. /// <returns></returns>
  62. [HttpGet("AiAlmDispose/{Devno}/{Page}/{pageSize}")]
  63. [AllowAnonymous]
  64. public async Task<ApiResult<AISqlSugarPagedList<AlmRecordOutput>>> AiAlmDispose(string Devno, int Page = 1, int pageSize = 10, long? entityId = null)
  65. {
  66. var data = await aIHelper.GetAlmDispose(Devno, Page, pageSize, entityId);
  67. return new ApiResult<AISqlSugarPagedList<AlmRecordOutput>>(data, ReturnCode.Success);
  68. }
  69. /// <summary>
  70. /// AI-报警数据保存到环保消息表数据
  71. /// </summary>
  72. /// <returns></returns>
  73. [HttpGet("AiAlmSaveMessage")]
  74. [AllowAnonymous]
  75. public async Task<ApiResult> AiAlmSaveMessage()
  76. {
  77. //40124884581189;33379713109829
  78. var data = await aIHelper.GetAlmDispose("", 1, 10, 40124884581189);
  79. //var data = await aIHelper.GetHistoricAlmrecord("", 1, 10, 40124884581189);
  80. if (data != null)
  81. {
  82. foreach (var item in data.Items)
  83. {
  84. if (item != null)
  85. {
  86. var textJson = new
  87. {
  88. PanoramaId = item.PanoramaId,
  89. PanoramaUrl = item.PanoramaUrl,
  90. RoiJson = item.RoiJson,
  91. NonRoiJson = item.NonRoiJson,
  92. DetectionFrameJson = item.DetectionFrameJson
  93. };
  94. var datas = JsonConvert.SerializeObject(textJson);
  95. MessageFile messageFile = new MessageFile();
  96. messageFile.Text = datas;
  97. messageFile.Type = "FILE_TYP_006";
  98. string msg = item.Event_Name;
  99. if (string.IsNullOrEmpty(msg))
  100. {
  101. msg = item.Event_Code;
  102. }
  103. TpushMsgModel model = new TpushMsgModel
  104. {
  105. C_DevStoreCode = "d705ceb5-7473-4b19-91dd-d3eff223f05b",
  106. C_MsgTypeCode = "MSG_TYPE_024",
  107. Subject = item.Device_TypeName + "报警",
  108. Msg = msg,
  109. UserName = "AI盒子",
  110. UserMobile = "",
  111. CreateOn = item.StartTime?.ToString("yyyy-MM-dd HH:mm:ss"),
  112. GenerationType = 1,
  113. msgStatus = 1,
  114. FileList = new List<MessageFile> { messageFile }
  115. };
  116. bool bol = await _pushMsgService.PushAlarmMsgAsync(model, model.Subject);
  117. if (bol && IsUpdateAI == "true")
  118. {
  119. DateTime updTime = DateTime.Now;
  120. var updData = new
  121. {
  122. Id = item.Id,
  123. ConfrimContent = "环保测试数据,自动确认",
  124. Mistake = false,
  125. Confirmed = true,
  126. ConfirmTime = updTime,
  127. ConfirmUserName = "环保同步程序",
  128. Closed = true,
  129. CloseContent = "环保测试数据,自动关闭",
  130. EndTime = updTime,
  131. CloseUserName = "环保同步程序"
  132. };
  133. var dataStr = JsonConvert.SerializeObject(updData);
  134. bool result = await aIHelper.UpdateAlm(dataStr);
  135. //bool result = await aIHelper.UpdateAlmIsDelete(item.Id);
  136. }
  137. }
  138. }
  139. }
  140. //TsysMessageSearchModel searchModel = new TsysMessageSearchModel();
  141. //searchModel.IsPagination = true;
  142. //searchModel.C_MsgTypeCode = "MSG_TYPE_024";
  143. //var msgData = await _TsysMessageService.GetConditionAsync(searchModel);
  144. return new ApiResult(ReturnCode.Success);
  145. }
  146. [HttpPost]
  147. [AllowAnonymous]
  148. [Route("/device/business/generalApp/pushData/alarmData/{deviceNo}")]
  149. public async Task<ApiResultModel<object>> AlarmData([FromRoute] string deviceNo, [FromBody] JObject alarmDataModel)
  150. {
  151. try
  152. {
  153. string startupDirectory = Directory.GetCurrentDirectory();
  154. log.Info($"进入AI[/device/business/generalApp/pushData/alarmData/{deviceNo}]");
  155. AlarmDataModel alarmData = JsonConvert.DeserializeObject<AlarmDataModel>(alarmDataModel.ToString());
  156. log.Info("获取deviceNo="+ alarmData.deviceNo);
  157. var devIds = await _vmcCameraService.GetCameraByTDH(alarmData.deviceNo);
  158. var cameraModel = await _vmcCameraService.GetCameraEntity(alarmData.deviceNo);
  159. log.Info($"获取到的设备ID:【{JsonConvert.SerializeObject(devIds)}】");
  160. int row = 0;
  161. foreach (var x in devIds)
  162. {
  163. List<MessageFile> messageFiles = new List<MessageFile>();
  164. string fileRelativePath = "";
  165. if (!string.IsNullOrEmpty(alarmData.panoramaDataId))
  166. {
  167. try
  168. {
  169. byte[] dataBytes = Convert.FromBase64String(s: alarmData.panoramaDataId);
  170. var relativePath = Path.Combine("wwwroot/uploads/images/", DateTime.Now.ToString("yyyyMM"));
  171. var directoryPath = Path.Combine(startupDirectory, relativePath);
  172. string imgName = $"{alarmData.panoramaId}.png";
  173. fileRelativePath = "/" + Path.Combine(relativePath + "/", imgName);
  174. if (!Directory.Exists(directoryPath))
  175. {
  176. Directory.CreateDirectory(directoryPath);
  177. }
  178. var filePath = Path.Combine(directoryPath + "/", imgName);// 替换为你想要保存的文件路径及名称
  179. using FileStream fs = new FileStream(filePath, FileMode.Create);
  180. fs.Write(dataBytes, 0, dataBytes.Length);
  181. fs.Close();
  182. }
  183. catch (Exception ex)
  184. {
  185. fileRelativePath = "";
  186. log.Info("全景图异常:" + ex.Message);
  187. }
  188. }
  189. var textJson = new
  190. {
  191. PanoramaId = alarmData.panoramaId,
  192. PanoramaUrl = fileRelativePath,//alarmData.panoramaUrl,
  193. RoiJson = alarmData.roiJson,
  194. NonRoiJson = alarmData.nonRoiJson,
  195. DetectionFrameJson = alarmData.detectionFrameJson
  196. };
  197. var datas = JsonConvert.SerializeObject(textJson);
  198. MessageFile messageFile = new MessageFile();
  199. messageFile.Text = datas;
  200. messageFile.Type = "FILE_TYP_006";
  201. messageFiles.Add(messageFile);
  202. TpushMsgModel model = new TpushMsgModel
  203. {
  204. C_DevStoreCode = x,
  205. C_MsgTypeCode = "MSG_TYPE_024",
  206. Subject = cameraModel==null?"AI盒子报警": cameraModel.C_Name+"报警",
  207. Msg = alarmData.alarmTypeChineseName,
  208. UserName = cameraModel == null ? "AI盒子" : cameraModel.C_Name,
  209. UserMobile = "",
  210. CreateOn = alarmData.captureTime,
  211. GenerationType = 1,
  212. msgStatus = 1,
  213. FileList = messageFiles
  214. };
  215. bool bol = await _pushMsgService.PushAlarmMsgAsync(model, model.Subject);
  216. log.Info($"执行发送结果=[{bol}]");
  217. if (bol) { row++; }
  218. }
  219. return ApiResultModel<object>.GetSuccess(row);
  220. }
  221. catch (Exception ex)
  222. {
  223. log.Info("异常:"+ex.Message);
  224. return ApiResultModel<object>.GetSuccess(0);
  225. }
  226. //return await Task.FromResult(ApiResultModel<object>.GetSuccess(new object { }));
  227. }
  228. //[HttpPost]
  229. //[AllowAnonymous]
  230. //[Route("/device/business/generalApp/pushData/alarmData/{deviceNo}")]
  231. //public async Task<ApiResultModel<object>> AlarmData([FromRoute] string deviceNo, AlarmDataModel alarmDataModel)
  232. //{
  233. // Console.WriteLine("进入/device/business/generalApp/pushData/alarmData/" + deviceNo);
  234. // var devIds = await _vmcCameraService.GetCameraByTDH(alarmDataModel.deviceNo);
  235. // int row = 0;
  236. // foreach (var x in devIds)
  237. // {
  238. // List<MessageFile> messageFiles = new List<MessageFile>();
  239. // var textJson = new
  240. // {
  241. // PanoramaId = alarmDataModel.panoramaId,
  242. // PanoramaUrl = alarmDataModel.panoramaUrl,
  243. // RoiJson = alarmDataModel.roiJson,
  244. // NonRoiJson = alarmDataModel.nonRoiJson,
  245. // DetectionFrameJson = alarmDataModel.detectionFrameJson
  246. // };
  247. // var datas = JsonConvert.SerializeObject(textJson);
  248. // MessageFile messageFile = new MessageFile();
  249. // messageFile.Text = datas;
  250. // messageFile.Type = "FILE_TYP_006";
  251. // messageFiles.Add(messageFile);
  252. // TpushMsgModel model = new TpushMsgModel
  253. // {
  254. // C_DevStoreCode = x,
  255. // C_MsgTypeCode = "MSG_TYPE_024",
  256. // Subject = "AI盒子报警",
  257. // Msg = alarmDataModel.alarmType,
  258. // UserName = "AI盒子",
  259. // UserMobile = "",
  260. // CreateOn = alarmDataModel.captureTime,
  261. // GenerationType = 1,
  262. // msgStatus = 1,
  263. // FileList = messageFiles
  264. // };
  265. // bool bol = await _pushMsgService.PushAlarmMsgAsync(model, model.Subject);
  266. // log.Info($"执行发送结果=[{bol}]");
  267. // if (bol) { row++; }
  268. // }
  269. // return ApiResultModel<object>.GetSuccess(row);
  270. // //return await Task.FromResult(ApiResultModel<object>.GetSuccess(new object { }));
  271. //}
  272. /// <summary>
  273. /// 注册
  274. /// </summary>
  275. /// <param name="deviceNo">设备编号</param>
  276. /// <param name="registerModel"></param>
  277. /// <returns></returns>
  278. [HttpPost]
  279. [AllowAnonymous]
  280. [Route("/api/base/deviceServerSdk/register/{deviceNo}")]
  281. public async Task<ApiResultModel<object>> Register([FromRoute] string deviceNo, [FromBody] RegisterModel registerModel)
  282. {
  283. return await Task.FromResult(ApiResultModel<object>.GetSuccess(new object { }));
  284. }
  285. /// <summary>
  286. /// 状态变化
  287. /// </summary>
  288. /// <param name="deviceNo">设备编号</param>
  289. /// <param name="statusChangeModel"></param>
  290. /// <returns></returns>
  291. [HttpPost]
  292. [AllowAnonymous]
  293. [Route("/api/base/deviceServerSdk/statusChange/{deviceNo}")]
  294. public async Task<ApiResultModel<object>> StatusChange([FromRoute] string deviceNo, [FromBody] StatusChangeModel statusChangeModel)
  295. {
  296. return await Task.FromResult(ApiResultModel<object>.GetSuccess(new object { }));
  297. }
  298. /// <summary>
  299. /// 心跳
  300. /// </summary>
  301. /// <param name="heartbeatModel"></param>
  302. /// <returns></returns>
  303. [HttpPost]
  304. [AllowAnonymous]
  305. [Route("/api/base/deviceServerSdk/heartbeat")]
  306. public async Task<ApiResultModel<object>> Heartbeat([FromBody] HeartbeatModel heartbeatModel)
  307. {
  308. return await Task.FromResult(ApiResultModel<object>.GetSuccess(new object { }));
  309. }
  310. }
  311. public class RegisterModel
  312. {
  313. public string username { get; set; }
  314. public string password { get; set; }
  315. }
  316. public class StatusChangeModel
  317. {
  318. public int status { get; set; }
  319. }
  320. public class HeartbeatModel
  321. {
  322. public DateTime startTime { get; set; }
  323. }
  324. /// <summary>
  325. /// api结果模型
  326. /// </summary>
  327. public class ApiResultModel
  328. {
  329. /// <summary>
  330. /// api状态枚举
  331. /// </summary>
  332. public int Code { get; set; }
  333. /// <summary>
  334. /// 成功、错误消息
  335. /// </summary>
  336. public string? Msg { get; set; }
  337. }
  338. /// <summary>
  339. /// api结果模型,带着数据
  340. /// </summary>
  341. /// <typeparam name="T"></typeparam>
  342. public class ApiResultModel<T> : ApiResultModel where T : new()
  343. {
  344. /// <summary>
  345. /// 返回数据
  346. /// </summary>
  347. public T? Data { get; set; }
  348. /// <summary>
  349. /// 获取成功返回对象
  350. /// </summary>
  351. /// <param name="data">返回数据</param>
  352. /// <returns></returns>
  353. public static ApiResultModel<T> GetSuccess(T data)
  354. {
  355. ApiResultModel<T> apiResult = new ApiResultModel<T>();
  356. apiResult.Data = data;
  357. apiResult.Code = 0;
  358. apiResult.Msg = "成功";
  359. return apiResult;
  360. }
  361. }
  362. }