JudicialManagementScreenController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. using Hotline.Application.JudicialManagement;
  2. using Hotline.Api.Filter;
  3. using Exam.Infrastructure.Extensions;
  4. using Hotline.Application.JudicialManagement;
  5. using Hotline.JudicialManagement;
  6. using Hotline.Orders;
  7. using Hotline.Settings;
  8. using Hotline.Share.Dtos.JudicialManagement;
  9. using Hotline.Share.Enums.Order;
  10. using Hotline.Share.Tools;
  11. using MapsterMapper;
  12. using Microsoft.AspNetCore.Authorization;
  13. using Microsoft.AspNetCore.Mvc;
  14. using SqlSugar;
  15. using XF.Domain.Repository;
  16. namespace Hotline.Api.Controllers.Bigscreen
  17. {
  18. /// <summary>
  19. /// 司法行政监督管理大屏
  20. /// </summary>
  21. [ServiceFilter(typeof(ClientIpFilterAttribute))]
  22. public class JudicialManagementScreenController : BaseController
  23. {
  24. private readonly IMapper _mapper;
  25. private readonly IRepository<SystemArea> _systemAreaRepository;
  26. private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
  27. private readonly IEnforcementApplication _enforcementApplication;
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. /// <param name="mapper"></param>
  32. /// <param name="systemAreaRepository"></param>
  33. /// <param name="judicialManagementOrdersRepository"></param>
  34. public JudicialManagementScreenController(IMapper mapper,
  35. IRepository<SystemArea> systemAreaRepository,
  36. IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
  37. IEnforcementApplication enforcementApplication)
  38. {
  39. _mapper = mapper;
  40. _systemAreaRepository = systemAreaRepository;
  41. _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
  42. this._enforcementApplication = enforcementApplication;
  43. }
  44. /// <summary>
  45. /// 左上工单数据模块
  46. /// </summary>
  47. /// <returns></returns>
  48. [AllowAnonymous]
  49. [HttpGet("order-module-statistics")]
  50. public async Task<OrderModuleDto> GetOrderModuleStatisticsAsync(DateTime StartTime, DateTime EndTime, string AreaCode)
  51. {
  52. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  53. var dto = new OrderModuleDto();
  54. var data = await _judicialManagementOrdersRepository.Queryable().
  55. LeftJoin<Order>((o, t) => o.Id == t.Id)
  56. .Where((o, t) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  57. .WhereIF(!string.IsNullOrEmpty(AreaCode), (o, t) => o.AreaCode != null && o.AreaCode.StartsWith(AreaCode))
  58. .Select((o, t) => new
  59. {
  60. o.Id,
  61. o.IsEnforcementOrder,
  62. o.IsTheClueTrue,
  63. o.IsPassTheBuckOrder
  64. })
  65. .MergeTable()
  66. .Select(d => new OrderModuleDto
  67. {
  68. OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
  69. EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
  70. TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  71. TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  72. PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder == true, 1, 0)),
  73. ToBeVerifiedOrderCount = SqlFunc.AggregateCount(SqlFunc.IIF(d.IsEnforcementOrder == null, 1, 0))
  74. })
  75. .ToListAsync();
  76. if (data != null && data.Count > 0)
  77. {
  78. dto.OrderCountNum = data[0].OrderCountNum;
  79. dto.EnforcementOrderNum = data[0].EnforcementOrderNum;
  80. dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum;
  81. dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum;
  82. dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum;
  83. }
  84. dto.SatisfiedCount = await _judicialManagementOrdersRepository.Queryable()
  85. .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
  86. .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
  87. .Where((x, o, p) => o.VisitTime >= StartTime && o.VisitTime <= EndTime && p.VisitTarget == EVisitTarget.Org)
  88. .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
  89. .Where((x, o, p) => SqlFunc.JsonField(o.NowEvaluate, "Key") != "1" && SqlFunc.JsonField(o.NowEvaluate, "Key") != "2")
  90. .CountAsync();
  91. return dto;
  92. }
  93. /// <summary>
  94. /// 左下高频事项统计
  95. /// </summary>
  96. /// <param name="StartTime"></param>
  97. /// <param name="EndTime"></param>
  98. /// <param name="AreaCode"></param>
  99. /// <returns></returns>
  100. [AllowAnonymous]
  101. [HttpGet("order-event-type-statistics")]
  102. public async Task<List<OrderEventTypeStatisticsDto>> GetOrderEventTypeStatisticsAsync(DateTime StartTime, DateTime EndTime, string AreaCode)
  103. {
  104. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  105. if (AreaCode.Length == 6 && AreaCode.IndexOf("00") == 4)
  106. AreaCode = AreaCode.Remove(4);
  107. var list = await _judicialManagementOrdersRepository.Queryable()
  108. .LeftJoin<JudicialComplaintsEventType>((o, j) => o.EventTypeOneLevelId == j.Id)
  109. .Where((o, j) => o.EventTypeOneLevelId != null && j.Id != null && o.IsItCounted == true)
  110. .Where((o, j) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.AreaCode.StartsWith(AreaCode))
  111. .Select((o, j) => new
  112. {
  113. o.Id,
  114. EventTypeId = o.EventTypeOneLevelId,
  115. j.EventTypeName
  116. })
  117. .MergeTable()
  118. .GroupBy(p => new { p.EventTypeId, p.EventTypeName })
  119. .Select(p => new OrderEventTypeStatisticsDto
  120. {
  121. EventTypeId = p.EventTypeId,
  122. EventTypeName = p.EventTypeName,
  123. SumCount = SqlFunc.AggregateCount(p.Id)
  124. })
  125. .OrderByDescending(p => p.SumCount)
  126. .Take(10)
  127. .ToListAsync();
  128. return list;
  129. }
  130. /// <summary>
  131. /// 中上区域地图数据
  132. /// </summary>
  133. /// <param name="StartTime"></param>
  134. /// <param name="EndTime"></param>
  135. /// <returns></returns>
  136. [AllowAnonymous]
  137. [HttpGet("order-area-query")]
  138. public async Task<List<OrderAreaQueryDto>> GetOrderAreaQueryAsync(DateTime StartTime, DateTime EndTime)
  139. {
  140. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  141. var areaList = await _systemAreaRepository.Queryable()
  142. .Where(x => !x.Id.EndsWith("00"))
  143. .GroupBy(x => new
  144. {
  145. Id = x.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  146. })
  147. .Select(x => new
  148. {
  149. Id = x.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  150. })
  151. .MergeTable()
  152. .LeftJoin<SystemArea>((it, o) => it.Id == o.Id)
  153. .Select((it, o) => new
  154. {
  155. it.Id,
  156. Name = o.AreaName,
  157. ParentId = o.ParentId
  158. })
  159. .ToListAsync();
  160. var list = new List<OrderAreaQueryDto>();
  161. foreach (var item in areaList)
  162. {
  163. #region 单个获取
  164. var dto = new OrderAreaQueryDto
  165. {
  166. AreaCode = item.Id,
  167. AreaName = item.Name
  168. };
  169. var data = await _judicialManagementOrdersRepository.Queryable().
  170. LeftJoin<Order>((o, t) => o.Id == t.Id)
  171. .Where((o, t) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  172. .WhereIF(!string.IsNullOrEmpty(item.ParentId), (o, t) => o.AreaCode != null && o.AreaCode.StartsWith(item.ParentId))
  173. .Select((o, t) => new
  174. {
  175. o.Id,
  176. o.IsEnforcementOrder,
  177. o.IsTheClueTrue,
  178. o.IsPassTheBuckOrder
  179. })
  180. .MergeTable()
  181. .Select(d => new OrderModuleDto
  182. {
  183. OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
  184. EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
  185. TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  186. TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  187. PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder == true, 1, 0)),
  188. ToBeVerifiedOrderCount = SqlFunc.AggregateCount(SqlFunc.IIF(d.IsEnforcementOrder == null, 1, 0))
  189. })
  190. .ToListAsync();
  191. if (data != null && data.Count > 0)
  192. {
  193. dto.OrderCountNum = data[0].OrderCountNum;
  194. dto.EnforcementOrderNum = data[0].EnforcementOrderNum;
  195. dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum;
  196. dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum;
  197. dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum;
  198. }
  199. list.Add(dto);
  200. #endregion
  201. }
  202. return list;
  203. }
  204. /// <summary>
  205. /// 中下行政执法工单概览
  206. /// </summary>
  207. /// <returns></returns>
  208. [AllowAnonymous]
  209. [HttpGet("order-overview")]
  210. public async Task<List<OrderOverviewDto>> GetOrderOverviewAsync()
  211. {
  212. var list = await _judicialManagementOrdersRepository.Queryable()
  213. .LeftJoin<SystemArea>((o, s) => o.AreaCode == s.Id)
  214. .Where((o, s) => o.CreationTime.Date >= DateTime.Now.Date && o.IsItCounted == true)
  215. .Select((o, s) => new
  216. {
  217. o.Id,
  218. o.SourceChannel,
  219. o.SourceChannelCode,
  220. o.Title,
  221. o.AcceptType,
  222. o.AcceptTypeCode,
  223. o.HotspotId,
  224. o.HotspotName,
  225. o.EnforcementOrdersHandler,
  226. s.AreaName,
  227. o.CreationTime
  228. })
  229. .OrderByDescending(o => o.CreationTime)
  230. .Take(50)
  231. .ToListAsync();
  232. return _mapper.Map<List<OrderOverviewDto>>(list);
  233. }
  234. /// <summary>
  235. /// 右上部门满意度排行榜
  236. /// </summary>
  237. /// <param name="StartTime"></param>
  238. /// <param name="EndTime"></param>
  239. /// <param name="AreaCode"></param>
  240. /// <returns></returns>
  241. [AllowAnonymous]
  242. [HttpGet("order-visitorg-statistics")]
  243. public async Task<List<OrderVisitOrgStatisticsDto>> GetOrderVisitOrgStatisticsAsync(DateTime StartTime, DateTime EndTime, string AreaCode)
  244. {
  245. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  246. var list = await _judicialManagementOrdersRepository.Queryable()
  247. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  248. .LeftJoin<OrderVisit>((x, o, v) => x.Id == v.OrderId)
  249. .LeftJoin<OrderVisitDetail>((x, o, v, p) => v.Id == p.VisitId)
  250. .Where((x, o, v, p) => v.VisitTime >= StartTime && v.VisitTime <= EndTime && p.VisitTarget == EVisitTarget.Org &&
  251. v.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode) && p.VisitOrgCode.Length >= 6 && x.IsItCounted == true)
  252. .WhereIF(!string.IsNullOrEmpty(AreaCode), (x, o, v, p) => o.AreaCode != null && o.AreaCode.StartsWith(AreaCode))
  253. .Select((x, o, v, p) => new
  254. {
  255. p.VisitOrgCode,
  256. p.VisitOrgName,
  257. p.OrgProcessingResults
  258. })
  259. .MergeTable()
  260. .GroupBy(x => new
  261. {
  262. VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  263. x.VisitOrgName
  264. })
  265. .Select(x => new OrderVisitOrgStatisticsDto()
  266. {
  267. VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  268. VisitOrgName = x.VisitOrgName,
  269. SatisfiedCount = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "1" && SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "2", 1, 0)),
  270. VisitCount = SqlFunc.AggregateCount(x.VisitOrgName)
  271. }).MergeTable().OrderByDescending(x => x.SatisfiedCount).Take(10).ToListAsync();
  272. return list;
  273. }
  274. /// <summary>
  275. /// 右中工单月份趋势图
  276. /// </summary>
  277. /// <returns></returns>
  278. [AllowAnonymous]
  279. [HttpGet("order-monthly-trend")]
  280. public async Task<List<OrderMonthlyTrendDto>> GetOrderMonthlyTrendStatisticsAsync(int Year)
  281. {
  282. if (Year == 0)
  283. Year = DateTime.Now.Year;
  284. int monthCount = 12;
  285. DateTime StartDate = DateTime.Parse(Year + "-01-01 00:00:00");
  286. DateTime EndDate = StartDate.AddYears(1).AddSeconds(-1);
  287. if (Year == DateTime.Now.Year)
  288. {
  289. monthCount = DateTime.Now.Month;
  290. EndDate = DateTime.Now;
  291. }
  292. var queryData = await _judicialManagementOrdersRepository.Queryable()
  293. .Where(o => o.CreationTime >= StartDate && o.CreationTime <= EndDate && o.IsItCounted == true)
  294. .Select(o => new
  295. {
  296. o.Id,
  297. Month = o.CreationTime.Month,
  298. IsEnforcementOrder = o.IsEnforcementOrder
  299. })
  300. .MergeTable()
  301. .GroupBy(x => x.Month)
  302. .Select(x => new OrderMonthlyTrendDto
  303. {
  304. Month = x.Month,
  305. EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsEnforcementOrder.HasValue && x.IsEnforcementOrder.Value == true, 1, 0)),
  306. UnEnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsEnforcementOrder.HasValue && x.IsEnforcementOrder.Value == false, 1, 0))
  307. })
  308. .ToListAsync();
  309. var orderMonthlyTrends = new List<OrderMonthlyTrendDto>();
  310. for (int i = 1; i <= monthCount; i++)
  311. {
  312. var data = queryData.Find(p => p.Month == i);
  313. if (data != null)
  314. {
  315. orderMonthlyTrends.Add(data);
  316. }
  317. else
  318. {
  319. orderMonthlyTrends.Add(new OrderMonthlyTrendDto { Month = i, EnforcementOrderNum = 0, UnEnforcementOrderNum = 0 });
  320. }
  321. }
  322. return orderMonthlyTrends;
  323. }
  324. /// <summary>
  325. /// 右下占比分析
  326. /// </summary>
  327. /// <param name="StartTime"></param>
  328. /// <param name="EndTime"></param>
  329. /// <param name="IsSource"></param>
  330. /// <returns></returns>
  331. [AllowAnonymous]
  332. [HttpGet("order-proportion-statistics")]
  333. public async Task<List<OrderProportionStatisticsDto>> GetOrderProportionStatisticsAsync(DateTime StartTime, DateTime EndTime, bool IsSource)
  334. {
  335. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  336. var SumCount = await _judicialManagementOrdersRepository.Queryable()
  337. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  338. .CountAsync();
  339. if (IsSource)
  340. {
  341. var list = await _judicialManagementOrdersRepository.Queryable()
  342. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  343. .GroupBy(o => new { o.SourceChannelCode, o.SourceChannel })
  344. .Select(o => new OrderProportionStatisticsDto()
  345. {
  346. Name = o.SourceChannel,
  347. SumCount = SumCount,
  348. HasCount = SqlFunc.AggregateCount(o.SourceChannel)
  349. })
  350. .ToListAsync();
  351. return list;
  352. }
  353. else
  354. {
  355. var list = await _judicialManagementOrdersRepository.Queryable()
  356. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  357. .GroupBy(o => new { o.AcceptTypeCode, o.AcceptType })
  358. .Select(o => new OrderProportionStatisticsDto()
  359. {
  360. Name = o.AcceptType,
  361. SumCount = SumCount,
  362. HasCount = SqlFunc.AggregateCount(o.AcceptTypeCode),
  363. })
  364. .ToListAsync();
  365. return list;
  366. }
  367. }
  368. /// <summary>
  369. /// 执法领域统计
  370. /// </summary>
  371. /// <param name="queryIndustryOrderStatisticsRateRequest"></param>
  372. /// <returns></returns>
  373. [AllowAnonymous]
  374. [HttpGet("order-industry-statistics")]
  375. public async Task<List<IndustryOrderStaticsRateDto>> QueryIndustryOrderStaticsRateAsync([FromQuery] QueryIndustryOrderStatisticsRateRequest queryIndustryOrderStatisticsRateRequest)
  376. {
  377. return await _enforcementApplication.QueryIndustryOrderStaticsRate(queryIndustryOrderStatisticsRateRequest);
  378. }
  379. /// <summary>
  380. /// 问题类型统计
  381. /// </summary>
  382. /// <param name="queryEventTypeOrderStaticsRequest"></param>
  383. /// <returns></returns>
  384. [AllowAnonymous]
  385. [HttpGet("order-eventType-statistics")]
  386. public async Task<List<EventTypeOrderStaticsDto>> QueryIndustryOrderStaticsRateAsync([FromQuery] QueryEventTypeOrderStaticsRequest queryEventTypeOrderStaticsRequest)
  387. {
  388. return await _enforcementApplication.QueryEventTypeOrderStatics(queryEventTypeOrderStaticsRequest);
  389. }
  390. }
  391. }