平安校园
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

536 строки
20 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. using SafeCampus.Application.Services.Business.CameraInfoService;
  13. using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
  14. using SafeCampus.Core.Utils;
  15. using MoYu.FriendlyException;
  16. using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
  17. namespace SafeCampus.Web.Core.Controllers.Application.Business;
  18. /// <summary>
  19. /// 预警事件查询接口
  20. /// </summary>
  21. [ApiDescriptionSettings(ApiGroupConsts.SYSTEM_Business, Order = 92, Tag = "预警事件")]
  22. [Route("/business/warn")]
  23. [RolePermission]
  24. public class WarnInfoController
  25. {
  26. private readonly IWarnInfoService _warnInfoService;
  27. private readonly IDeepelephManager _deepelephManager;
  28. private readonly ISimpleCacheService _simpleCacheService;
  29. private readonly IConfigService _configService;
  30. private readonly ICameraInfoService _cameraInfoService;
  31. private readonly ISysUserService _sysUserService;
  32. public WarnInfoController(IWarnInfoService warnInfoService, IDeepelephManager deepelephManager, ISimpleCacheService simpleCacheService, IConfigService configService, ICameraInfoService cameraInfoService, ISysUserService sysUserService)
  33. {
  34. _warnInfoService = warnInfoService;
  35. _deepelephManager = deepelephManager;
  36. _simpleCacheService = simpleCacheService;
  37. _configService = configService;
  38. _cameraInfoService = cameraInfoService;
  39. _sysUserService = sysUserService;
  40. }
  41. /// <summary>
  42. /// 删除预警信息
  43. /// </summary>
  44. /// <param name="Id"></param>
  45. /// <returns></returns>
  46. [HttpPost]
  47. public async Task<bool> DeleteInfoD(BaseIdListInput input)
  48. {
  49. return await _warnInfoService.DeleteBatch(input.Ids);
  50. }
  51. /// <summary>
  52. /// 编辑预警信息
  53. /// </summary>
  54. /// <param name="input"></param>
  55. /// <returns></returns>
  56. public async Task<bool> UpdateInfoU(WarnInfoDto input)
  57. {
  58. return await _warnInfoService.Update(input);
  59. }
  60. /// <summary>
  61. /// 获取预警信息
  62. /// </summary>
  63. /// <param name="Id"></param>
  64. /// <returns></returns>
  65. public async Task<WarnInfoDto> GetInfo(long Id)
  66. {
  67. var model = await _warnInfoService.GetInfo(Id);
  68. var config = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  69. if (!string.IsNullOrEmpty(model.Extend))
  70. {
  71. if (string.IsNullOrEmpty(model.PersonId))
  72. {
  73. var extend = JsonConvert.DeserializeObject<JObject>(model.Extend);
  74. model.Extend = extend["age"] != null ? $"年龄:{extend["age"]};年龄置信度:{Convert.ToInt32(Convert.ToDecimal(extend["ageProb"]) * 100)}%;" : "";
  75. }
  76. }
  77. if (model.AlarmType == "crowd")
  78. {
  79. model.Extend = $"人群聚集数量:{model.Count}";
  80. }
  81. if (config!=null)
  82. {
  83. model.SceneName = config.FirstOrDefault(x =>
  84. x.Subset.Any(xx => xx.Code == model.AlarmType) &&
  85. x.Subset.Any(xx => xx.CameraId.Contains(model.CameraId)))?.Name;
  86. }
  87. try
  88. {
  89. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  90. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/alarm/query"
  91. .SetBody(new
  92. {
  93. token = _deepelephManager.GetToken(),
  94. tenantCode = appSettings.TenantCode,
  95. poiId = appSettings.PoiId,
  96. alarmId = model.AlarmId
  97. })
  98. .SetContentType("application/json")
  99. .PostAsAsync<string>();
  100. var json = JsonConvert.DeserializeObject<JObject>(str);
  101. if ((bool)json["success"])
  102. {
  103. if (json["data"]["videoUrl"] != null)
  104. {
  105. model.VideoUrl = json["data"]["videoUrl"].ToString();
  106. }
  107. }
  108. }
  109. catch (SystemException)
  110. {
  111. }
  112. return model;
  113. }
  114. /// <summary>
  115. /// 获取预警信息列表
  116. /// </summary>
  117. /// <param name="input"></param>
  118. /// <returns></returns>
  119. [AllowAnonymous]
  120. public async Task<SqlSugarPagedList<WarnInfoList>> GetList([FromQuery] WarnInfoSearch input)
  121. {
  122. var config = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  123. var page= await _warnInfoService.GetList(input);
  124. if (config == null) return page;
  125. foreach (var item in page.List)
  126. {
  127. item.SceneName = config.FirstOrDefault(x =>
  128. x.Subset.Any(xx => xx.Code == item.AlarmType) && x.Subset.Any(xx=>xx.CameraId.Contains(item.CameraId)))?.Name;
  129. }
  130. return page;
  131. }
  132. /// <summary>
  133. /// 获取告警分组
  134. /// </summary>
  135. /// <returns></returns>
  136. public async Task<dynamic> GetWarnGroup(string cameraId)
  137. {
  138. var list = new List<WarnGroupInfo>();
  139. list = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  140. if (list != null)
  141. {
  142. foreach (var item in list)
  143. {
  144. if (item.PushUserId.HasValue)
  145. {
  146. var user = await _sysUserService.Detail(new BaseIdInput { Id = item.PushUserId.Value });
  147. item.PushUserName = user.Name;
  148. item.PushPhone = user.Phone;
  149. }
  150. }
  151. return !string.IsNullOrEmpty(cameraId) ? list.Where(x => x.CameraId.Contains(cameraId)).ToList() : list;
  152. }
  153. var basePath = AppContext.BaseDirectory;//获取项目目录
  154. var json = basePath.CombinePath("SeedData", "Json", "WarnGroup.json");//获取文件路径
  155. var dataString = FileHelper.ReadFile(json);//读取文件
  156. list = JsonConvert.DeserializeObject<List<WarnGroupInfo>>(dataString);
  157. _simpleCacheService.Set(SafeCampusConst.WarnGroup, list);
  158. return list.Where(x=>x.CameraId.Contains(cameraId)).ToList();
  159. }
  160. /// <summary>
  161. /// 设置场景开关
  162. /// </summary>
  163. /// <returns></returns>
  164. public async Task<bool> SetWarnGroupDevice(ConfigJsonInput input)
  165. {
  166. var jsonList = JsonConvert.DeserializeObject<List<WarnGroupInfo>>(input.ConfigJson);
  167. var oldlist = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  168. foreach (var item in jsonList)
  169. {
  170. var model = oldlist.FirstOrDefault(x => x.Code == item.Code);
  171. if (model != null)
  172. {
  173. model.Subset = item.Subset;
  174. model.CameraId=item.Subset.Select(x=>x.CameraId).SelectMany(x=>x).ToList();
  175. model.CameraName=item.Subset.Select(x=>x.CameraName).SelectMany(x=>x).ToList();
  176. }
  177. }
  178. _simpleCacheService.Set(SafeCampusConst.WarnGroup, oldlist);
  179. return true;
  180. }
  181. /// <summary>
  182. /// 根据预警分组设置推送人
  183. /// </summary>
  184. /// <param name="input"></param>
  185. /// <returns></returns>
  186. public async Task<bool> SetPushPersonByWarn(SetPushPersonWarnInput input)
  187. {
  188. var warn = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  189. var warnGroupInfo = warn.FirstOrDefault(x => x.Code == input.WarnCode);
  190. if (warnGroupInfo != null) warnGroupInfo.PushUserId = input.UserId;
  191. _simpleCacheService.Set(SafeCampusConst.WarnGroup, warn);
  192. return true;
  193. //return await _cameraInfoService.BatchSetPushPersonByWarn(input);
  194. }
  195. /// <summary>
  196. /// 关联摄像头和告警分组
  197. /// </summary>
  198. /// <param name="input"></param>
  199. /// <returns></returns>
  200. public async Task<bool> SetWarnGroupCamera(ConfigJsonCamera input)
  201. {
  202. var list = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  203. var model = list.FirstOrDefault(x => x.Code == input.Code);
  204. if (model != null)
  205. {
  206. model.CameraId = input.CameraList;
  207. }
  208. _simpleCacheService.Set(SafeCampusConst.WarnGroup, list);
  209. return true;
  210. }
  211. /// <summary>
  212. /// 设置预警推送设置
  213. /// </summary>
  214. /// <returns></returns>
  215. public async Task<bool> SetWarnPushSetting(ConfigPush push)
  216. {
  217. var sysConfig=await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES);
  218. if (sysConfig != null)
  219. {
  220. await _configService.Edit(new ConfigEditInput
  221. {
  222. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  223. ConfigKey = BizConfigConst.BIZ_SMS_STATES,
  224. ConfigValue = push.PushState.ToString()
  225. });
  226. }
  227. else
  228. {
  229. await _configService.Add(new ConfigAddInput
  230. {
  231. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  232. ConfigKey = BizConfigConst.BIZ_SMS_STATES,
  233. ConfigValue = push.PushState.ToString()
  234. });
  235. }
  236. var sysConfigDay = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES_DAY);
  237. if (sysConfigDay != null)
  238. {
  239. await _configService.Edit(new ConfigEditInput
  240. {
  241. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  242. ConfigKey = BizConfigConst.BIZ_SMS_STATES_DAY,
  243. ConfigValue = push.DaySum.ToString()
  244. });
  245. }
  246. else
  247. {
  248. await _configService.Add(new ConfigAddInput
  249. {
  250. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  251. ConfigKey = BizConfigConst.BIZ_SMS_STATES_DAY,
  252. ConfigValue = push.DaySum.ToString()
  253. });
  254. }
  255. var sysConfigInterval = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_INTERVAL);
  256. if (sysConfigInterval != null)
  257. {
  258. await _configService.Edit(new ConfigEditInput
  259. {
  260. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  261. ConfigKey = BizConfigConst.BIZ_SMS_INTERVAL,
  262. ConfigValue = push.Interval.ToString()
  263. });
  264. }
  265. else
  266. {
  267. await _configService.Add(new ConfigAddInput
  268. {
  269. Category = CateGoryConst.CONFIG_BIZ_DEFINE,
  270. ConfigKey = BizConfigConst.BIZ_SMS_INTERVAL,
  271. ConfigValue = push.Interval.ToString()
  272. });
  273. }
  274. return true;
  275. }
  276. /// <summary>
  277. /// 获取预警推送内容
  278. /// </summary>
  279. /// <returns></returns>
  280. public async Task<dynamic> GetWarnPushSetting()
  281. {
  282. var sysConfigInterval= await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_INTERVAL);
  283. var configPush = new ConfigPush
  284. {
  285. PushState = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES))
  286. .ConfigValue.ToBoolean(),
  287. DaySum = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES_DAY))
  288. .ConfigValue.ToInt(),
  289. Interval = sysConfigInterval==null?0: sysConfigInterval.ConfigValue.ToInt()
  290. };
  291. return configPush;
  292. }
  293. /// <summary>
  294. /// 预警统计-饼图 Alarm 今日告警情况,Hand今日处理情况
  295. /// </summary>
  296. /// <returns></returns>
  297. public async Task<dynamic> GetWarnStatistics()
  298. {
  299. //今日告警情况饼图
  300. //今日处理情况
  301. var startTime = DateTime.Now.Date;
  302. var entTime = DateTime.Now;
  303. var list = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  304. {
  305. StartTick = startTime,
  306. EndTick = entTime
  307. });
  308. var warnType = typeof(AlarmType).EnumToEnumModel();
  309. var alarmStatistics = warnType.Select(x => new
  310. {
  311. Name = x.Description,
  312. Code=x.Name,
  313. Count = list.Count(xx => xx.AlarmType == x.Name)
  314. }).Where(x => x.Count > 0).ToList();
  315. var numbers = new Dictionary<int, string> { { 0, "未处理" }, { 1, "已处理" } };
  316. var handStatistics = numbers.Select(x => new
  317. {
  318. Name = x.Value,
  319. Count = list.Count(xx => xx.WarnHand == x.Key)
  320. }).ToList();
  321. return new { Alarm = alarmStatistics, Hand = handStatistics };
  322. }
  323. /// <summary>
  324. /// 获取七天统计柱状图
  325. /// </summary>
  326. /// <returns></returns>
  327. public async Task<dynamic> GetWeekWarnStatistics()
  328. {
  329. var result = new StatistionModel
  330. {
  331. DataX = new List<string>(),
  332. DataY = new List<SeriesData>()
  333. };
  334. var startTime = DateTime.Now.AddDays(-7).Date;
  335. var entTime = DateTime.Now;
  336. var list = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  337. {
  338. StartTick = startTime,
  339. EndTick = entTime
  340. });
  341. //var warnType = typeof(AlarmType).EnumToEnumModel();
  342. var climb_over = new List<int>();
  343. var crowd = new List<int>();
  344. var fire_smoke = new List<int>();
  345. var visual_fence = new List<int>();
  346. var wander = new List<int>();
  347. for (DateTime i = startTime; i <= entTime;)
  348. {
  349. var itemList = list.Where(x =>
  350. x.Tick.Year == i.Year && x.Tick.Month == i.Month && x.Tick.Day == i.Day)
  351. .ToList();
  352. //var alarmStatistics = warnType.Where(x=>x.Value<=4).Select(x => new StatistionFunModel
  353. //{
  354. // Name = x.Description,
  355. // Code=x.Name,
  356. // Count = itemList.Count(xx => xx.AlarmType == x.Name),
  357. // Date = i.ToString("MM-dd")
  358. //}).ToList();
  359. result.DataX.Add(i.ToString("MM-dd"));
  360. climb_over.Add(itemList.Count(x=>x.AlarmType== "climb_over"));
  361. crowd.Add(itemList.Count(x=>x.AlarmType== "crowd"));
  362. fire_smoke.Add(itemList.Count(x=>x.AlarmType== "fire_smoke"));
  363. visual_fence.Add(itemList.Count(x=>x.AlarmType== "visual_fence"));
  364. wander.Add(itemList.Count(x=>x.AlarmType== "wander"));
  365. //result.Add(new StatistionModel
  366. //{
  367. // Date = i.ToString("MM-dd"),
  368. // visual_fence =
  369. // //FunList = alarmStatistics
  370. //});
  371. i = i.AddDays(1);
  372. }
  373. result.DataY.Add(new SeriesData
  374. {
  375. Name = AlarmType.climb_over.GetDescription(),
  376. Data = climb_over
  377. });
  378. result.DataY.Add(new SeriesData
  379. {
  380. Name = AlarmType.crowd.GetDescription(),
  381. Data = crowd
  382. });
  383. result.DataY.Add(new SeriesData
  384. {
  385. Name = AlarmType.fire_smoke.GetDescription(),
  386. Data = fire_smoke
  387. });
  388. result.DataY.Add(new SeriesData
  389. {
  390. Name = AlarmType.visual_fence.GetDescription(),
  391. Data = visual_fence
  392. });
  393. result.DataY.Add(new SeriesData
  394. {
  395. Name = AlarmType.wander.GetDescription(),
  396. Data = wander
  397. });
  398. return result ;
  399. }
  400. /// <summary>
  401. /// 获取告警枚举列表
  402. /// </summary>
  403. /// <returns></returns>
  404. public async Task<List<WarnType>> GetAlarmType()
  405. {
  406. return await _warnInfoService.GetWarnType();
  407. }
  408. /// <summary>
  409. /// 根据监控id获取大屏告警数据
  410. /// </summary>
  411. /// <returns></returns>
  412. [AllowAnonymous]
  413. public async Task<dynamic> GetLargeScreenData(string cameraId)
  414. {
  415. var startTime = DateTime.Now.AddDays(-7).Date;
  416. var entTime = DateTime.Now;
  417. var list=await _warnInfoService.GetListNoPage(new WarnInfoSearch
  418. {
  419. StartTick = startTime,
  420. EndTick = entTime,
  421. PageNum = 1,
  422. PageSize = 20,
  423. CameraId = cameraId
  424. });
  425. var warnType = typeof(AlarmType).EnumToEnumModel();
  426. var alarmStatistics = warnType.Select(x => new StatistionFunModel
  427. {
  428. Name = x.Description,
  429. Code = x.Name,
  430. Count = list.Count(xx => xx.AlarmType == x.Name),
  431. }).Where(x=>x.Count>0).ToList();
  432. return new { item = list, statistion = alarmStatistics };
  433. }
  434. /// <summary>
  435. /// 处理预警
  436. /// </summary>
  437. /// <returns></returns>
  438. public async Task<bool> HandWarn(HandWarnInput input)
  439. {
  440. return await _warnInfoService.HandWarn(input);
  441. }
  442. /// <summary>
  443. /// 获取首页基础数据
  444. /// </summary>
  445. /// <returns></returns>
  446. public async Task<dynamic> GetBaseStatistics()
  447. {
  448. var camera = await _cameraInfoService.GetCameraCount(new CameraSearch());
  449. var warnCount = await _warnInfoService.GetWarnCount(new WarnInfoSearch());
  450. var handCount = await _warnInfoService.GetWarnCount(new WarnInfoSearch{WarnHand = 1});
  451. var tacherCount = await _sysUserService.Page(new UserPageInput{PageSize = 2,PageNum = 1,OrgId = 0});
  452. return new
  453. {
  454. CameraCount= camera,
  455. WarnCount= warnCount,
  456. HandCount= handCount,
  457. TeacherCount= tacherCount.Total
  458. };
  459. }
  460. /// <summary>
  461. /// 获取高危信息
  462. /// </summary>
  463. /// <returns></returns>
  464. public async Task<dynamic> GetHighRisk()
  465. {
  466. var warnlist = await _warnInfoService.GetWarnType();
  467. var list = new List<dynamic>();
  468. //var group = warnlist.GroupBy(x => new { x.AlarmType, x.AlarmTypeDesc }).ToList();
  469. var startTime = DateTime.Now.AddDays(-7).Date;
  470. var entTime = DateTime.Now;
  471. foreach (var item in warnlist)
  472. {
  473. var model = new
  474. {
  475. Name = item.Name,
  476. Day =await _warnInfoService.GetWarnCount(new WarnInfoSearch { AlarmType = item.Code, EndTick = entTime, StartTick = new DateTime(entTime.Year,entTime.Month,entTime.Day).Date }),
  477. Week =await _warnInfoService.GetWarnCount(new WarnInfoSearch { AlarmType = item.Code,EndTick = entTime,StartTick = startTime}),
  478. Count =await _warnInfoService.GetWarnCount(new WarnInfoSearch{AlarmType = item.Code})
  479. };
  480. list.Add(model);
  481. }
  482. return list.Where(x=>x.Count>10).OrderByDescending(x=>x.Day).ToList();
  483. }
  484. /// <summary>
  485. /// 获取订阅配置
  486. /// </summary>
  487. /// <param name="code"></param>
  488. /// <param name="subsetCode"></param>
  489. /// <returns></returns>
  490. public async Task<dynamic> GetFuncConf(string subsetCode)
  491. {
  492. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  493. var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/func/v1/conf/query-paged"
  494. .SetBody(new
  495. {
  496. token = _deepelephManager.GetToken(),
  497. tenantCode = appSettings.TenantCode,
  498. poiId = appSettings.PoiId,
  499. pageIndex=1,
  500. pageSize=1000
  501. })
  502. .SetContentType("application/json")
  503. .PostAsAsync<string>();
  504. var model = JsonConvert.DeserializeObject<JObject>(str);
  505. var result=new List<dynamic>();
  506. if ((bool)model["success"])
  507. {
  508. var list = model["data"].Where(x => x["funcType"].ToString().Contains(subsetCode));
  509. foreach (var item in list)
  510. {
  511. var ids = item["cameraIds"];
  512. var name = item["cameras"].ToString().Split('、');
  513. for (int i = 0; i < name.Length; i++)
  514. {
  515. result.Add(new { id = ids[i].ToString(), name = name[i] });
  516. }
  517. }
  518. return result;
  519. }
  520. throw Oops.Oh(model["message"].ToString());
  521. }
  522. }