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

309 lines
12 KiB

  1. using SafeCampus.Application.Services.Business.CameraGroupService;
  2. using SafeCampus.Application.Services.Business.PersonInfoService;
  3. using SafeCampus.Application.Services.Business.Warn.Dto;
  4. using SafeCampus.Application.Services.Business.Warn.Service;
  5. using SafeCampus.Core.Extension;
  6. using MoYu.FriendlyException;
  7. using SafeCampus.Application.Services.Business.AttendanceService;
  8. using SafeCampus.Application.Services.Business.BuildingService;
  9. using SafeCampus.Application.Services.Business.ClassRoomCallService;
  10. using SafeCampus.Application.Services.Business.ClassRoomCallTaskService;
  11. using SafeCampus.Application.Services.Business.DormitoryService;
  12. using SafeCampus.Web.Core.Controllers.Application.Business;
  13. using MoYu.RemoteRequest.Extensions;
  14. using Newtonsoft.Json.Linq;
  15. using SafeCampus.Application.Manager.DeepelephManager;
  16. using SafeCampus.Application.Services.Business.PersonSetInfoService;
  17. namespace SafeCampus.Web.Core.Controllers.Application.LargeScreen;
  18. /// <summary>
  19. /// 大屏控制器
  20. /// </summary>
  21. [ApiDescriptionSettings(ApiGroupConsts.SYSTEM_Business, Tag = "大屏接口", Order = 84)]
  22. [Route("large/screen")]
  23. [AllowAnonymous]
  24. public class LargeScreenController
  25. {
  26. private readonly IPersonInfoService _personInfoService;
  27. private readonly ICameraGroupService _cameraGroupService;
  28. private readonly IWarnInfoService _warnInfoService;
  29. private readonly ISimpleCacheService _simpleCacheService;
  30. private readonly IAttendanceService _attendanceService;
  31. private readonly IBuildingService _buildingService;
  32. private readonly IDormitoryService _dormitoryService;
  33. private readonly IConfigService _configService;
  34. private readonly IClassRoomCallTaskService _classRoomCallTaskService;
  35. private readonly IClassRoomCallService _classRoomCallService;
  36. private readonly IDeepelephManager _deepelephManager;
  37. private readonly IPersonSetInfoService _personSetInfoService;
  38. public LargeScreenController(IPersonInfoService personInfoService, ICameraGroupService cameraGroupService, IWarnInfoService warnInfoService, ISimpleCacheService simpleCacheService, IAttendanceService attendanceService, IBuildingService buildingService, IDormitoryService dormitoryService, IConfigService configService, IClassRoomCallTaskService classRoomCallTaskService, IClassRoomCallService classRoomCallService, IDeepelephManager deepelephManager, IPersonSetInfoService personSetInfoService)
  39. {
  40. _personInfoService = personInfoService;
  41. _cameraGroupService = cameraGroupService;
  42. _warnInfoService = warnInfoService;
  43. _simpleCacheService = simpleCacheService;
  44. _attendanceService = attendanceService;
  45. _buildingService = buildingService;
  46. _dormitoryService = dormitoryService;
  47. _configService = configService;
  48. _classRoomCallTaskService = classRoomCallTaskService;
  49. _classRoomCallService = classRoomCallService;
  50. _deepelephManager = deepelephManager;
  51. _personSetInfoService = personSetInfoService;
  52. }
  53. /// <summary>
  54. /// 获取大屏首页数据
  55. /// </summary>
  56. /// <returns></returns>
  57. public async Task<dynamic> GetHomeData()
  58. {
  59. var startTime = DateTime.Now.Date;
  60. var entTime = DateTime.Now;
  61. //学生人数
  62. //总人数
  63. var ZRS = await _personInfoService.GetCount(null);
  64. //男生
  65. var nan = await _personInfoService.GetCount("GENDER_MALE");
  66. //女生
  67. var nv = await _personInfoService.GetCount("GENDER_FEMALE");
  68. //按设备分组统计设备数量
  69. var SheBei = await _cameraGroupService.GetBIList();
  70. //今日告警列表
  71. var warnlist = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  72. {
  73. StartTick = startTime,
  74. EndTick = entTime
  75. });
  76. //今日告警统计按告警类型
  77. var warnType = typeof(AlarmType).EnumToEnumModel();
  78. var alarmStatistics = warnType.Select(x => new
  79. {
  80. Name = x.Description,
  81. //Code = x.Name,
  82. Value = warnlist.Count(xx => xx.AlarmType == x.Name)
  83. }).Where(x => x.Value > 0).ToList();
  84. //按场景统计告警类型
  85. var warnGroup= _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
  86. foreach (var item in warnGroup)
  87. {
  88. foreach (var warnGroupSubset in item.Subset)
  89. {
  90. warnGroupSubset.Value = warnlist.Count(x => x.AlarmType == warnGroupSubset.Code);
  91. }
  92. item.Value = item.Subset.Sum(x => x.Value);
  93. }
  94. var list = new List<object>
  95. {
  96. new { Name = "男生人数", Value = nan },
  97. new { Name = "女生人数", Value = nv }
  98. };
  99. return new
  100. {
  101. //数字统计
  102. StudentPersonNum=new{TotalNum=ZRS,MaleNum=nan,FemaleNum=nv},
  103. StudentPersonStatistion=list,
  104. //统计图表
  105. AlarmStatisti =new
  106. {
  107. //按类型统计
  108. TypeStatisti=alarmStatistics,
  109. //按告警分组 统计
  110. GroupStatisti=warnGroup,
  111. //告警列表
  112. WarnList=warnlist
  113. },
  114. //设备
  115. Camera= SheBei,
  116. };
  117. }
  118. /// <summary>
  119. /// 获取学生归寝大屏数据
  120. /// </summary>
  121. /// <returns></returns>
  122. public async Task<dynamic> GetStudentReturnBed(long buildId)
  123. {
  124. if (buildId<=0)
  125. {
  126. throw Oops.Oh("没有班级");
  127. }
  128. var startTime = DateTime.Now.Date;
  129. var entTime = DateTime.Now;
  130. //寝室人数
  131. var list = await _dormitoryService.GetBiReturnPageList(new ReturnDormitoryISearch
  132. {
  133. BuildId = buildId,
  134. ReturnTime = DateTime.Now
  135. });
  136. //总人数
  137. var Qsrs = list.Sum(x => x.PersonCount);
  138. //在寝人数
  139. var zqrs = list.Sum(x => x.DormitoryCount);
  140. //不在寝人数
  141. var bzqrs = Qsrs - zqrs;
  142. //寝室列表
  143. //归寝时间显示
  144. var json = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE,
  145. BizConfigConst.BIZ_DORMITORY_TIME);
  146. if (json == null)
  147. {
  148. return new ReturnTimeInput();
  149. }
  150. var config=JsonConvert.DeserializeObject<ReturnTimeInput>(json.ConfigValue);
  151. var guiqinsj= config.TimeBegin+" - "+config.TimeEnd;
  152. //出入记录
  153. var sushelou =await _buildingService.GetInfo(buildId);
  154. var crjl = await _attendanceService.GetNoPageList(new AttendanceSearch
  155. {
  156. StartTick = startTime,
  157. EndTick = entTime,
  158. CameraId = sushelou.InsCameraId,
  159. CameraIds=new List<string>{sushelou.InsCameraId,sushelou.OutCameraId}
  160. });
  161. return new
  162. {
  163. Building=new{TotalNum=Qsrs,InNum=zqrs,NoInNum=bzqrs},
  164. DormitoryList=list,
  165. ReturnTime=guiqinsj,
  166. AttendList=crjl,
  167. };
  168. }
  169. /// <summary>
  170. /// 获取智慧课堂大屏数据
  171. /// </summary>
  172. /// <returns></returns>
  173. public async Task<dynamic> GetSmartClassroom(string personSetId)
  174. {
  175. if (string.IsNullOrEmpty(personSetId))
  176. {
  177. throw Oops.Oh("没有班级");
  178. }
  179. //课堂信息
  180. var startTime = DateTime.Now.Date;
  181. var entTime = DateTime.Now;
  182. //学生信息
  183. var xuesheng = await _personInfoService.GetPageList(new PersonInfoSearch
  184. { PageSize = 1000, PageNum = 1, PersonSetId = personSetId });
  185. //点名信息
  186. var task =await _classRoomCallTaskService.GetPageList(new ClassRoomCallTaskSearch {PageNum = 1,PageSize = 10,PersonSetId = personSetId });
  187. var taskId = task.List.Any()?task.List.First().TaskId:"";
  188. var classRoom = await _classRoomCallService.GetNoPageList(new ClassRoomCallSearch { TaskId = taskId });
  189. //告警信息
  190. var warnGroup = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup).FirstOrDefault(x=>x.Code=="ZHKT");
  191. var warnlist = await _warnInfoService.GetListNoPage(new WarnInfoSearch
  192. { AlarmTypes = warnGroup.Subset.Select(x => x.Code).ToArray(),StartTick = startTime, EndTick = entTime,CameraId = personSetId == "YS001" ? "SXT001" : "SXT002" });
  193. //告警信息统计
  194. var tongji = warnlist.GroupBy(x => x.AlarmTypeDesc).Select(x=>new{Labale=x.Key,Value=x.Count()}).ToList();
  195. foreach (var personInfoDto in xuesheng.List)
  196. {
  197. var rollCall=classRoom.Where(x=>x.PersonId==personInfoDto.PersonId).MinBy(x=>x.Tick);
  198. if (rollCall != null)
  199. {
  200. personInfoDto.State = rollCall.Tick.TimeOfDay> TimeSpan.Parse("09:00:00")?"迟到":"正常";
  201. personInfoDto.InsTime = rollCall.Tick;
  202. }
  203. else
  204. {
  205. personInfoDto.State = "缺勤";
  206. personInfoDto.InsTime = null;
  207. }
  208. }
  209. return new
  210. {
  211. ClassRoom=new
  212. {
  213. Teacher="王明祥",
  214. ClassTime=DateTime.Now.ToString("yyyy-MM-dd 09:00:00"),
  215. ClassBreakTime=DateTime.Now.ToString("yyyy-MM-dd 12:00:00"),
  216. CameraId= personSetId== "YS001" ? "SXT001": "SXT002"
  217. },
  218. AlarmList= warnlist,
  219. //AlarmListCount= warnlist.GroupBy(x=>x.PersonId).Count(),
  220. Statisti =new{Labale= tongji.Select(x=>x.Labale).ToList(),Value=tongji.Select(x=>x.Value).ToList()},
  221. NormalClass= xuesheng.List.Count(x=>!warnlist.Any(xx=>xx.PersonId==x.PersonId)),
  222. StudentList=xuesheng.List,
  223. //RollCall= classRoom.Where(x=>x.AlarmType!= "class_room_call").ToList()
  224. };
  225. }
  226. /// <summary>
  227. /// 直播流拉取
  228. /// 拉流的时候,选pullStreamUrls和rtsPullStreamUrls里面的链接,pushStreamUrls和h5rtsPullStreamUrls直接忽略。
  229. /// </summary>
  230. /// <param name="sensorId">摄像头id</param>
  231. /// <returns></returns>
  232. public async Task<dynamic> GetStartVideoLive(string sensorId)
  233. {
  234. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  235. var str = await $"{appSettings.SXAPIURL}/device/console/v1/sensor/start_video_live"
  236. .SetBody(new
  237. {
  238. token = _deepelephManager.GetToken(),
  239. tenantCode = appSettings.TenantCode,
  240. poiId = appSettings.PoiId,
  241. cameraId = sensorId,
  242. })
  243. .SetContentType("application/json")
  244. .PostAsAsync<string>();
  245. var model = JsonConvert.DeserializeObject<JObject>(str);
  246. if ((bool)model["success"])
  247. {
  248. return model["data"];
  249. }
  250. throw Oops.Oh(model["message"].ToString());
  251. }
  252. /// <summary>
  253. /// 直播流停止拉取
  254. /// </summary>
  255. /// <param name="sensorId">摄像头id</param>
  256. /// <param name="videoToken">视频token</param>
  257. /// <param name="streamId">流ID</param>
  258. /// <returns></returns>
  259. public async Task<dynamic> GetStopVideoLive(string sensorId, string videoToken, string streamId)
  260. {
  261. var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
  262. var str = await $"{appSettings.SXAPIURL}/device/console/v1/sensor/stop_video_live"
  263. .SetBody(new
  264. {
  265. token = _deepelephManager.GetToken(),
  266. tenantCode = appSettings.TenantCode,
  267. poiId = appSettings.PoiId,
  268. cameraId = sensorId,
  269. videoToken,
  270. streamId
  271. })
  272. .SetContentType("application/json")
  273. .PostAsAsync<string>();
  274. var model = JsonConvert.DeserializeObject<JObject>(str);
  275. if ((bool)model["success"])
  276. {
  277. return model["data"]["streamId"].ToString();
  278. }
  279. throw Oops.Oh(model["message"].ToString());
  280. }
  281. /// <summary>
  282. /// 获取宿舍楼列表
  283. /// </summary>
  284. /// <returns></returns>
  285. public async Task<List<BuildingInfoDto>> GetNoPageList()
  286. {
  287. return await _buildingService.GetNoPageList();
  288. }
  289. /// <summary>
  290. /// 获取班级列表
  291. /// </summary>
  292. /// <returns></returns>
  293. public async Task<dynamic> GetPersonSetNoPageList()
  294. {
  295. return await _personSetInfoService.GetPageList();
  296. }
  297. }