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

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