平安校园
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.
 
 
 
 
 
 

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