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

301 lines
10 KiB

  1. using MoYu.RemoteRequest.Extensions;
  2. using Newtonsoft.Json.Linq;
  3. using SafeCampus.Application.Manager.DeepelephManager;
  4. using SafeCampus.Application.Services.Business.Warn.Dto;
  5. using SafeCampus.Application.Services.Business.Warn.Service;
  6. using SimpleTool;
  7. using SafeCampus.Core.Extension;
  8. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  9. using SafeCampus.Application.Services.Business;
  10. using SafeCampus.Web.Core.Controllers.Application.Business.Dto;
  11. namespace SafeCampus.Web.Core.Controllers.Application.Business;
  12. /// <summary>
  13. /// 预警事件查询接口
  14. /// </summary>
  15. [ApiDescriptionSettings(ApiGroupConsts.SYSTEM_Business, Order = 92, Tag = "预警事件")]
  16. [Route("/business/warn")]
  17. [RolePermission]
  18. public class WarnInfoController
  19. {
  20. private readonly IWarnInfoService _warnInfoService;
  21. private readonly IDeepelephManager _deepelephManager;
  22. private readonly ISimpleCacheService _simpleCacheService;
  23. public WarnInfoController(IWarnInfoService warnInfoService, IDeepelephManager deepelephManager, ISimpleCacheService simpleCacheService)
  24. {
  25. _warnInfoService = warnInfoService;
  26. _deepelephManager = deepelephManager;
  27. _simpleCacheService = simpleCacheService;
  28. }
  29. /// <summary>
  30. /// 删除预警信息
  31. /// </summary>
  32. /// <param name="Id"></param>
  33. /// <returns></returns>
  34. public async Task<bool> DeleteInfoD(long Id)
  35. {
  36. return await _warnInfoService.Delete(Id);
  37. }
  38. /// <summary>
  39. /// 编辑预警信息
  40. /// </summary>
  41. /// <param name="input"></param>
  42. /// <returns></returns>
  43. public async Task<bool> UpdateInfoU(WarnInfoDto input)
  44. {
  45. return await _warnInfoService.Update(input);
  46. }
  47. /// <summary>
  48. /// 获取预警信息
  49. /// </summary>
  50. /// <param name="Id"></param>
  51. /// <returns></returns>
  52. public async Task<WarnInfoDto> GetInfo(long Id)
  53. {
  54. var model = await _warnInfoService.GetInfo(Id);
  55. if (!string.IsNullOrEmpty(model.Extend))
  56. {
  57. var extend = JsonConvert.DeserializeObject<JObject>(model.Extend);
  58. var sex = "男性";
  59. if (extend["genderScore"] != null)
  60. {
  61. if ((float)extend["genderScore"][0] > 0.6)
  62. {
  63. sex = "男性";
  64. }
  65. else if ((float)extend["genderScore"][1] > 0.6)
  66. {
  67. sex = "女性";
  68. }
  69. else if ((float)extend["genderScore"][2] > 0.6)
  70. {
  71. sex = "不确定";
  72. }
  73. }
  74. model.Extend = $"年龄:{extend["age"]};年龄置信度:{extend["ageProb"]};性别:{sex}";
  75. }
  76. if (!Enum.TryParse(model.CameraId, out CameraType cameraType))
  77. {
  78. cameraType = CameraType.SXT001;
  79. }
  80. model.CameraName = cameraType.GetDescription();
  81. try
  82. {
  83. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  84. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/alarm/query"
  85. .SetBody(new
  86. {
  87. token = _deepelephManager.GetToken(),
  88. tenantCode = appSettings.TenantCode,
  89. poiId = appSettings.PoiId,
  90. alarmId = model.AlarmId
  91. })
  92. .SetContentType("application/json")
  93. .PostAsAsync<string>();
  94. var json = JsonConvert.DeserializeObject<JObject>(str);
  95. if ((bool)json["success"])
  96. {
  97. if (json["data"]["videoUrl"] != null)
  98. {
  99. model.VideoUrl = json["data"]["videoUrl"].ToString();
  100. }
  101. }
  102. }
  103. catch (SystemException)
  104. {
  105. }
  106. return model;
  107. }
  108. /// <summary>
  109. /// 获取预警信息列表
  110. /// </summary>
  111. /// <param name="input"></param>
  112. /// <returns></returns>
  113. [AllowAnonymous]
  114. public async Task<SqlSugarPagedList<WarnInfoList>> GetList([FromQuery] WarnInfoSearch input)
  115. {
  116. return await _warnInfoService.GetList(input);
  117. }
  118. /// <summary>
  119. /// 获取告警分组
  120. /// </summary>
  121. /// <returns></returns>
  122. public async Task<dynamic> GetWarnGroup()
  123. {
  124. var list = new List<WarnGroupInfo>();
  125. list = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  126. if (list != null)
  127. {
  128. return list;
  129. }
  130. var basePath = AppContext.BaseDirectory;//获取项目目录
  131. var json = basePath.CombinePath("SeedData", "Json", "WarnGroup.json");//获取文件路径
  132. var dataString = FileHelper.ReadFile(json);//读取文件
  133. list = JsonConvert.DeserializeObject<List<WarnGroupInfo>>(dataString);
  134. _simpleCacheService.Set(SafeCampusConst.WarnGroup, list);
  135. return list;
  136. }
  137. /// <summary>
  138. /// 关联摄像头和告警分组
  139. /// </summary>
  140. /// <returns></returns>
  141. public async Task<bool> SetWarnGroupDevice(ConfigJsonInput input)
  142. {
  143. var jsonList = JsonConvert.DeserializeObject<List<WarnGroupInfo>>(input.ConfigJson);
  144. _simpleCacheService.Set(SafeCampusConst.WarnGroup, jsonList);
  145. return true;
  146. }
  147. /// <summary>
  148. /// 预警统计-饼图 Alarm 今日告警情况,Hand今日处理情况
  149. /// </summary>
  150. /// <returns></returns>
  151. public async Task<dynamic> GetWarnStatistics()
  152. {
  153. //今日告警情况饼图
  154. //今日处理情况
  155. var startTime = DateTime.Now.Date;
  156. var entTime = DateTime.Now;
  157. var list = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  158. {
  159. StartTick = startTime,
  160. EndTick = entTime
  161. });
  162. var warnType = typeof(AlarmType).EnumToEnumModel();
  163. var alarmStatistics = warnType.Select(x => new
  164. {
  165. Name = x.Description,
  166. Code=x.Name,
  167. Count = list.Count(xx => xx.AlarmType == x.Name)
  168. }).Where(x => x.Count > 0).ToList();
  169. var numbers = new Dictionary<int, string> { { 0, "未处理" }, { 1, "已处理" } };
  170. var handStatistics = numbers.Select(x => new
  171. {
  172. Name = x.Value,
  173. Count = list.Count(xx => xx.WarnHand == x.Key)
  174. }).ToList();
  175. return new { Alarm = alarmStatistics, Hand = handStatistics };
  176. }
  177. /// <summary>
  178. /// 获取七天统计柱状图
  179. /// </summary>
  180. /// <returns></returns>
  181. public async Task<dynamic> GetWeekWarnStatistics()
  182. {
  183. var result = new StatistionModel
  184. {
  185. DataX = new List<string>(),
  186. DataY = new List<SeriesData>()
  187. };
  188. var startTime = DateTime.Now.AddDays(-7).Date;
  189. var entTime = DateTime.Now;
  190. var list = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  191. {
  192. StartTick = startTime,
  193. EndTick = entTime
  194. });
  195. //var warnType = typeof(AlarmType).EnumToEnumModel();
  196. var climb_over = new List<int>();
  197. var crowd = new List<int>();
  198. var fire_smoke = new List<int>();
  199. var visual_fence = new List<int>();
  200. var wander = new List<int>();
  201. for (DateTime i = startTime; i <= entTime;)
  202. {
  203. var itemList = list.Where(x =>
  204. x.Tick.Year == i.Year && x.Tick.Month == i.Month && x.Tick.Day == i.Day)
  205. .ToList();
  206. //var alarmStatistics = warnType.Where(x=>x.Value<=4).Select(x => new StatistionFunModel
  207. //{
  208. // Name = x.Description,
  209. // Code=x.Name,
  210. // Count = itemList.Count(xx => xx.AlarmType == x.Name),
  211. // Date = i.ToString("MM-dd")
  212. //}).ToList();
  213. result.DataX.Add(i.ToString("MM-dd"));
  214. climb_over.Add(itemList.Count(x=>x.AlarmType== "climb_over"));
  215. crowd.Add(itemList.Count(x=>x.AlarmType== "crowd"));
  216. fire_smoke.Add(itemList.Count(x=>x.AlarmType== "fire_smoke"));
  217. visual_fence.Add(itemList.Count(x=>x.AlarmType== "visual_fence"));
  218. wander.Add(itemList.Count(x=>x.AlarmType== "wander"));
  219. //result.Add(new StatistionModel
  220. //{
  221. // Date = i.ToString("MM-dd"),
  222. // visual_fence =
  223. // //FunList = alarmStatistics
  224. //});
  225. i = i.AddDays(1);
  226. }
  227. result.DataY.Add(new SeriesData
  228. {
  229. Name = AlarmType.climb_over.GetDescription(),
  230. Data = climb_over
  231. });
  232. result.DataY.Add(new SeriesData
  233. {
  234. Name = AlarmType.crowd.GetDescription(),
  235. Data = crowd
  236. });
  237. result.DataY.Add(new SeriesData
  238. {
  239. Name = AlarmType.fire_smoke.GetDescription(),
  240. Data = fire_smoke
  241. });
  242. result.DataY.Add(new SeriesData
  243. {
  244. Name = AlarmType.visual_fence.GetDescription(),
  245. Data = visual_fence
  246. });
  247. result.DataY.Add(new SeriesData
  248. {
  249. Name = AlarmType.wander.GetDescription(),
  250. Data = wander
  251. });
  252. return result ;
  253. }
  254. /// <summary>
  255. /// 获取告警枚举列表
  256. /// </summary>
  257. /// <returns></returns>
  258. public async Task<List<WarnType>> GetAlarmType()
  259. {
  260. return await _warnInfoService.GetWarnType();
  261. }
  262. /// <summary>
  263. /// 根据监控id获取大屏告警数据
  264. /// </summary>
  265. /// <returns></returns>
  266. [AllowAnonymous]
  267. public async Task<dynamic> GetLargeScreenData(string cameraId)
  268. {
  269. var startTime = DateTime.Now.AddDays(-7).Date;
  270. var entTime = DateTime.Now;
  271. var list=await _warnInfoService.GetListNoPage(new WarnInfoSearch
  272. {
  273. StartTick = startTime,
  274. EndTick = entTime,
  275. PageNum = 1,
  276. PageSize = 20,
  277. CameraId = cameraId
  278. });
  279. var warnType = typeof(AlarmType).EnumToEnumModel();
  280. var alarmStatistics = warnType.Select(x => new StatistionFunModel
  281. {
  282. Name = x.Description,
  283. Code = x.Name,
  284. Count = list.Count(xx => xx.AlarmType == x.Name),
  285. }).Where(x=>x.Count>0).ToList();
  286. return new { item = list, statistion = alarmStatistics };
  287. }
  288. }