qinchaoyue 1 mesiac pred
rodič
commit
2fc04d2cf8

+ 17 - 0
src/Hotline.Api/Controllers/Snapshot/BiSnapshotController.cs

@@ -237,4 +237,21 @@ public class BiSnapshotController : BaseController
     public async Task<PagedDto<SnapshotDepartmentAveTimeStatisticsDetailsOutDto>> GetSnapshotDepartmentAveTimeStatisticsDtailsAsync([FromQuery]SnapshotDepartmentAveTimeStatisticsDetailsInDto dto)
         => (await _biSnapshotApplication.GetSnapshotDepartmentAveTimeStatisticsDtails(dto).ToPagedListAsync(dto)).ToPaged();
 
+    /// <summary>
+    /// 检查合规统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("compliant-statistics")]
+    public async Task<IList<CompliantStatisticsOutDto>> CompliantStatisticsAsync([FromQuery] CompliantStatisticsInDto dto)
+        => await _biSnapshotApplication.GetCompliantStatistics(dto).ToListAsync();
+
+    /// <summary>
+    /// 检查合规统计-详情
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("compliant-statistics-detail")]
+    public async Task<PagedDto<CompliantStatisticsDetailsOutDto>> CompliantStatisticsDetailsAsync([FromQuery] CompliantStatisticsDetailsInDto dto)
+        => (await _biSnapshotApplication.GetCompliantStatisticsDetails(dto).ToPagedListAsync(dto)).ToPaged();
 }

+ 63 - 0
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -695,4 +695,67 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
             .Select((snapshot, order) => new SnapshotDepartmentAveTimeStatisticsDetailsOutDto(), true) ;
         return query;
     }
+
+    public ISugarQueryable<CompliantStatisticsOutDto> GetCompliantStatistics(CompliantStatisticsInDto dto)
+    {
+        bool IsCenter = _sessionContext.OrgIsCenter;
+        var orgLevel = _sessionContext.OrgLevel;
+        string orgLevelStr = (_sessionContext.RequiredOrgId.Length + 3).ToString();
+
+        var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
+            .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
+            .LeftJoin<OrderSendBackAudit>((snapshot, order, back) => snapshot.Id == back.OrderId && back.State == ESendBackAuditState.End)
+            .LeftJoin<OrderVisit>((snapshot, order, back, visit) => snapshot.Id == visit.OrderId && visit.VisitState == EVisitState.Visited)
+            .LeftJoin<OrderSecondaryHandling>((snapshot, order, back, visit, second) => snapshot.Id == second.OrderId && second.State == ESecondaryHandlingState.End)
+            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && order.ActualHandleOrgCode != null)
+            .GroupBy((snapshot, order) => new
+            {
+                OrgCode = order.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+            })
+            .Select((snapshot, order, back, visit, second) => new CompliantStatisticsOutDto()
+            {
+                OrgCode = order.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                OrderCountNum = SqlFunc.AggregateCount(snapshot.Id),
+                First = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.CompliantType == ECompliantType.First, 1, 0)),
+                Second = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.CompliantType == ECompliantType.Second, 1, 0)),
+                Third = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.CompliantType == ECompliantType.Third, 1, 0)),
+                Not = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.CompliantType == ECompliantType.Not, 1, 0)),
+            })
+            .MergeTable()
+            .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+            .Select((it, o) => new CompliantStatisticsOutDto()
+            {
+                OrgName = o.Name,
+                OrgCode = it.OrgCode,
+                OrderCountNum = it.OrderCountNum,
+                First = it.First,
+                Second = it.Second,
+                Third = it.Third,
+                Not = it.Not
+            });
+
+        return query;
+    }
+
+    public ISugarQueryable<CompliantStatisticsDetailsOutDto> GetCompliantStatisticsDetails(CompliantStatisticsDetailsInDto dto)
+    {
+        dto.FieldName = dto.FieldName.ToLower();
+        var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
+            .LeftJoin<Order>((snapshot, order) => order.Id == snapshot.Id)
+            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && order.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == dto.OrgCode);
+
+        query = dto.FieldName switch
+        {
+            "ordercountnum" => query,
+            "first" => query.Where(snapshot => snapshot.CompliantType == ECompliantType.First),
+            "second" => query.Where(snapshot => snapshot.CompliantType == ECompliantType.Second),
+            "third" => query.Where(snapshot => snapshot.CompliantType == ECompliantType.Third),
+            "not" => query.Where(snapshot => snapshot.CompliantType == ECompliantType.Not),
+            _ => throw new UserFriendlyException($"入参: {dto.FieldName} 异常")
+        };
+        return query.Select((snapshot, order) => new CompliantStatisticsDetailsOutDto
+        {
+        }, true);
+    }
+
 }

+ 9 - 0
src/Hotline.Application/Snapshot/IBiSnapshotApplication.cs

@@ -86,4 +86,13 @@ public interface IBiSnapshotApplication
     ISugarQueryable<SnapshotDepartmentAveTimeStatisticsOutDto> GetSnapshotDepartmentAveTimeStatistics(SnapshotDepartmentAveTimeStatisticsInDto dto);
 
     ISugarQueryable<SnapshotDepartmentAveTimeStatisticsDetailsOutDto> GetSnapshotDepartmentAveTimeStatisticsDtails(SnapshotDepartmentAveTimeStatisticsDetailsInDto dto);
+
+    /// <summary>
+    /// 检查合规统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<CompliantStatisticsOutDto> GetCompliantStatistics(CompliantStatisticsInDto dto);
+
+    ISugarQueryable<CompliantStatisticsDetailsOutDto> GetCompliantStatisticsDetails(CompliantStatisticsDetailsInDto dto);
 }

+ 202 - 0
src/Hotline.Share/Dtos/Snapshot/StatisticsDto.cs

@@ -2456,6 +2456,208 @@ public class SnapshotDepartmentAveTimeStatisticsDetailsOutDto
     /// </summary>
     public string Title { get; set; }
 
+    /// <summary>
+    /// 办理时长(秒)
+    /// </summary>
+    public double? AllDuration { get; set; }
+
+    /// <summary>
+    /// 办理时长(分)
+    /// </summary>
+    public string TotalMinutes => AllDuration == null ? "0" : ((double)AllDuration / 60).ToString("f0");
+
+    /// <summary>
+    /// 办理时长(时)
+    /// </summary>
+    public string TotalHours => AllDuration == null ? "0" : ((double)AllDuration / 60 / 60).ToString("f2");
+
+    /// <summary>
+    /// 接办部门
+    /// </summary>
+    public string ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 接办时间
+    /// </summary>
+    public DateTime? ActualHandleTime { get; set; }
+
+    /// <summary>
+    /// 办结时间
+    /// </summary>
+    public DateTime? FiledTime { get; set; }
+
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public string AcceptType { get; set; }
+
+    /// <summary>
+    /// 热点类型
+    /// </summary>
+    public string HotspotName { get; set; }
+
+}
+
+public class CompliantStatisticsInDto
+{
+    [Required]
+    public DateTime StartTime { get; set; }
+    [Required]
+    public DateTime EndTime { get; set; }
+}
+
+
+public class CompliantStatisticsOutDto
+{
+    public string OrgCode { get; set; }
+
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    public string OrgName { get; set; }
+
+    /// <summary>
+    /// 工单总数
+    /// </summary>
+    public int OrderCountNum { get; set; }
+
+    /// <summary>
+    /// 首次
+    /// </summary>
+    public int First { get; set; }
+
+    /// <summary>
+    /// 二次
+    /// </summary>
+    public int Second { get; set; }
+
+    /// <summary>
+    /// 三次及以上
+    /// </summary>
+    public int Third { get; set; }
+
+    /// <summary>
+    /// 不合规
+    /// </summary>
+    public int Not { get; set; }
+}
+
+public record CompliantStatisticsDetailsInDto : PagedRequest
+{
+    [Required]
+    public DateTime StartTime { get; set; }
+    [Required]
+    public DateTime EndTime { get; set; }
+
+    /// <summary>
+    /// 字段名称
+    /// </summary>
+    [Required]
+    public string FieldName { get; set; }
+
+    /// <summary>
+    /// 部门编号
+    /// </summary>
+    [Required]
+    public string OrgCode { get; set; }
+}
+
+public class CompliantStatisticsDetailsOutDto
+{
+
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 过期状态
+    /// </summary>
+    public EExpiredStatus? ExpiredStatus => FiledTime.CalculateExpiredState(Status, this.ExpiredTime, this.NearlyExpiredTime, this.NearlyExpiredTimeOne);
+
+    /// <summary>
+    /// 过期状态
+    /// </summary>
+    public string ExpiredStatusText => ExpiredStatus.GetDescription();
+
+    /// <summary>
+    /// 受理编号
+    /// </summary>
+    public string No { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public EOrderStatus Status { get; set; }
+
+    /// <summary>
+    /// 信件状态
+    /// </summary>
+    public string StatusTxt => Status.GetDescription();
+
+    /// <summary>
+    /// 来源
+    /// </summary>
+    public string SourceChannel { get; set; }
+
+    /// <summary>
+    /// 当前节点
+    /// </summary>
+    public string CurrentStepName { get; set; }
+
+    /// <summary>
+    /// 重办次数
+    /// </summary>
+    public int ReTransactNum { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public bool IsUrgent { get; set; }
+
+    /// <summary>
+    /// 是否紧急
+    /// </summary>
+    public string IsUrgentText => IsUrgent ? "紧急" : "-";
+
+    /// <summary>
+    /// 期满时间
+    /// </summary>
+    public DateTime? ExpiredTime { get; set; }
+
+    /// <summary>
+    /// 即将超期时间
+    /// </summary>
+    public DateTime? NearlyExpiredTime { get; set; }
+
+    /// <summary>
+    /// 即将超期时间第一级
+    /// </summary>
+    public DateTime? NearlyExpiredTimeOne { get; set; }
+
+    /// <summary>
+    /// 是否超期
+    /// </summary>
+    public bool IsExpired
+    {
+        get
+        {
+            if (ExpiredTime.HasValue)
+                return DateTime.Now > ExpiredTime.Value;
+            return false;
+        }
+    }
+
+    /// <summary>
+    /// 受理时间
+    /// </summary>
+    public DateTime CreationTime { get; set; }
+
+    /// <summary>
+    /// 标题
+    /// </summary>
+    public string Title { get; set; }
+
     /// <summary>
     /// 办理时长(秒)
     /// </summary>