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;
}
}
}
}