using Hotline.JudicialManagement; using Hotline.Orders; using Hotline.Settings; using Hotline.Share.Dtos.JudicialManagement; using Hotline.Share.Enums.Order; using MapsterMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; using XF.Domain.Repository; namespace Hotline.Api.Controllers.Bigscreen { /// /// 司法行政监督管理大屏 /// public class EnforcementScreenController : BaseController { private readonly IMapper _mapper; private readonly IRepository _enforcementOrdersRepository; private readonly IRepository _systemAreaRepository; /// /// /// /// /// /// public EnforcementScreenController(IMapper mapper, IRepository enforcementOrdersRepository, IRepository systemAreaRepository) { _mapper = mapper; _enforcementOrdersRepository = enforcementOrdersRepository; _systemAreaRepository = systemAreaRepository; } /// /// 左上工单数据模块 /// /// [AllowAnonymous] [HttpGet("order-module-statistics")] public async Task GetOrderModuleStatisticsAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var dto = new OrderModuleDto(); var data = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate) .Select((x, o) => new { x.Id, x.IsEnforcementOrder, x.IsTheClueTrue, x.IsPassTheBuckOrder }) .MergeTable() .Select(d => new OrderModuleDto { OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)), EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)), TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)), TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)), PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0)) }) .ToListAsync(); if (data != null && data.Count > 0) { dto.OrderCountNum = data[0].OrderCountNum; dto.EnforcementOrderNum = data[0].EnforcementOrderNum; dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum; dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum; dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum; } dto.SatisfiedCount = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.OrderId) .LeftJoin((x, o, p) => o.Id == p.VisitId) .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org) .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode)) .Where((x, o, p) => SqlFunc.JsonField(o.NowEvaluate, "Key") != "1" && SqlFunc.JsonField(o.NowEvaluate, "Key") != "2") .CountAsync(); return dto; } /// /// 左中受理类型 /// /// /// /// [AllowAnonymous] [HttpGet("order-accept-type-statistics")] public async Task> GetOrderAcceptTypeStatisticsAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null && o.Status > EOrderStatus.Handling && !string.IsNullOrEmpty(o.AcceptType)) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate) .Select((x, o) => new { x.Id, o.AcceptType, o.Status, o.ExpiredStatus }) .MergeTable() .GroupBy(x => x.AcceptType) .Select(x => new OrderAcceptTypeStatisticsDto { AcceptType = x.AcceptType, SumCount = SqlFunc.AggregateCount(x.Id), HandlingCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Handling && x.Status < EOrderStatus.Filed, 1, 0)), FiledCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)), OverTimeCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredStatus == EExpiredStatus.Expired, 1, 0)) }).ToListAsync(); return list; } /// /// 左下高频事项统计 /// /// /// /// /// [AllowAnonymous] [HttpGet("order-event-type-statistics")] public async Task> GetOrderEventTypeStatisticsAsync(DateTime StartDate, DateTime EndDate, string AreaCode) { EndDate = EndDate.AddDays(1).AddSeconds(-1); if (AreaCode.Length == 6 && AreaCode.IndexOf("00") == 4) AreaCode = AreaCode.Remove(4); var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .LeftJoin((x, o, j) => x.EventTypeOneLevelId == j.Id) .Where((x, o, j) => o.Id != null && x.EventTypeOneLevelId != null && j.Id != null) .Where((x, o, j) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.AreaCode.StartsWith(AreaCode)) .Select((x, o, j) => new { x.Id, EventTypeId = x.EventTypeOneLevelId, j.EventTypeName }) .MergeTable() .GroupBy(p => new { p.EventTypeId, p.EventTypeName }) .Select(p => new OrderEventTypeStatisticsDto { EventTypeId = p.EventTypeId, EventTypeName = p.EventTypeName, SumCount = SqlFunc.AggregateCount(p.Id) }) .OrderByDescending(p => p.SumCount) .Take(5) .ToListAsync(); return list; } /// /// 中上区域地图数据 /// /// /// /// [AllowAnonymous] [HttpGet("order-area-query")] public async Task> GetOrderAreaQueryAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var areaList = await _systemAreaRepository.Queryable() .Where(x => !x.Id.EndsWith("00")) .GroupBy(x => new { Id = x.Id.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), }) .Select(x => new { Id = x.Id.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), }) .MergeTable() .LeftJoin((it, o) => it.Id == o.Id) .Select((it, o) => new { it.Id, Name = o.AreaName }) .ToListAsync(); var list = new List(); foreach (var item in areaList) { #region 单个获取 var dto = new OrderAreaQueryDto { AreaCode = item.Id, AreaName = item.Name }; var data = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.AreaCode.StartsWith(item.Id)) .Select((x, o) => new { x.Id, x.IsEnforcementOrder, x.IsTheClueTrue, x.IsPassTheBuckOrder }) .MergeTable() .Select(d => new OrderModuleDto { OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)), EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)), TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)), TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)), PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0)) }) .ToListAsync(); if (data != null && data.Count > 0) { dto.OrderCountNum = data[0].OrderCountNum; dto.EnforcementOrderNum = data[0].EnforcementOrderNum; dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum; dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum; dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum; } list.Add(dto); #endregion } return list; } /// /// 中下行政执法工单概览 /// /// [AllowAnonymous] [HttpGet("order-overview")] public async Task> GetOrderOverviewAsync() { var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .LeftJoin((x, o, p) => o.AreaCode == p.Id) .Where((x, o, p) => o.Id != null) .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime.Value.Date == DateTime.Now.Date) .Select((x, o, p) => new OrderOverviewDto { Id = o.Id, WorkflowId = o.WorkflowId, SourceChannel = o.SourceChannel, SourceChannelCode = o.SourceChannelCode, Title = o.Title, AcceptType = o.AcceptType, AcceptTypeCode = o.AcceptTypeCode, HotspotId = o.HotspotId, HotspotName = o.HotspotName, ActualHandleOrgName = o.ActualHandleOrgName, ActualHandleOrgCode = o.ActualHandleOrgCode, Status = o.Status, ActualHandleTime = o.ActualHandleTime, ExpiredTime = o.ExpiredTime, NearlyExpiredTime = o.NearlyExpiredTime, StartTime = o.StartTime, AreaName = p.AreaName }) .MergeTable() .OrderByDescending(d => d.StartTime) .Take(50) .ToListAsync(); return _mapper.Map>(list); } /// /// 右上部门满意度排行榜 /// /// /// /// [AllowAnonymous] [HttpGet("order-visitorg-statistics")] public async Task> GetOrderVisitOrgStatisticsAsync(DateTime StartDate, DateTime EndDate) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.OrderId) .LeftJoin((x, o, p) => o.Id == p.VisitId) .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode) && p.VisitOrgCode.Length >= 6) .Select((x, o, p) => new { p.VisitOrgCode, p.VisitOrgName, p.OrgProcessingResults }) .MergeTable() .GroupBy(x => new { VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), x.VisitOrgName }) .Select(x => new OrderVisitOrgStatisticsDto() { VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn("0"), SqlFunc.MappingColumn("6")), VisitOrgName = x.VisitOrgName, SatisfiedCount = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "1" && SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "2", 1, 0)), VisitCount = SqlFunc.AggregateCount(x.VisitOrgName) }).MergeTable().OrderByDescending(x => x.SatisfiedCount).Take(10).ToListAsync(); return list; } /// /// 右中工单月份趋势图 /// /// [AllowAnonymous] [HttpGet("order-monthly-trend")] public async Task> GetOrderMonthlyTrendStatisticsAsync(int Year) { if (Year == 0) Year = DateTime.Now.Year; int monthCount = 12; DateTime StartDate = DateTime.Parse(Year + "-01-01 00:00:00"); DateTime EndDate = StartDate.AddYears(1).AddSeconds(-1); if (Year == DateTime.Now.Year) { monthCount = DateTime.Now.Month; EndDate = DateTime.Now; } var queryData = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime >= StartDate && o.StartTime <= EndDate) .Select((x, o) => new { o.Id, Month = o.StartTime.Value.Month }) .MergeTable() .GroupBy(x => x.Month) .Select(x => new OrderMonthlyTrendDto { Month = x.Month, SumCount = SqlFunc.AggregateCount(x.Month) }) .ToListAsync(); var orderMonthlyTrends = new List(); for (int i = 1; i <= monthCount; i++) { var data = queryData.Find(p => p.Month == i); var SumCount = 0; if (data != null) SumCount = data.SumCount; orderMonthlyTrends.Add(new OrderMonthlyTrendDto { Month = i, SumCount = SumCount }); } return orderMonthlyTrends; } /// /// 右下占比分析 /// /// /// /// /// [AllowAnonymous] [HttpGet("order-proportion-statistics")] public async Task> GetOrderProportionStatisticsAsync(DateTime StartDate, DateTime EndDate, bool IsSource) { EndDate = EndDate.AddDays(1).AddSeconds(-1); var SumCount = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept) .CountAsync(); if (IsSource) { var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept) .GroupBy((x, o) => new { o.SourceChannelCode, o.SourceChannel }) .Select((x, o) => new OrderProportionStatisticsDto() { Name = o.SourceChannel, SumCount = SumCount, HasCount = SqlFunc.AggregateCount(o.SourceChannel) }) .ToListAsync(); return list; } else { var list = await _enforcementOrdersRepository.Queryable() .LeftJoin((x, o) => x.Id == o.Id) .Where((x, o) => o.Id != null) .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept) .GroupBy((x, o) => new { o.AcceptTypeCode, o.AcceptType }) .Select((x, o) => new OrderProportionStatisticsDto() { Name = o.AcceptType, SumCount = SumCount, HasCount = SqlFunc.AggregateCount(o.AcceptTypeCode), }) .ToListAsync(); return list; } } } }