Pārlūkot izejas kodu

网格员办理情况统计

qinchaoyue 1 mēnesi atpakaļ
vecāks
revīzija
dcc7375b7b

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

@@ -113,4 +113,21 @@ public class BiSnapshotController : BaseController
     public async Task<PagedDto<SnapshotProcessingStatisticsDetailsOutDto>> GetSnapshotProcessingStatisticsDetails(SnapshotProcessingStatisticsDetailsInDto dto)
         => (await _biSnapshotApplication.GetSnapshotProcessingStatisticsDetails(dto).ToPagedListAsync(dto)).ToPaged();
 
+    /// <summary>
+    /// 网格员办理情况统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("guider-work-statistics")]
+    public async Task<IList<GuiderWorkStatisticsOutDto>> GetGuiderWorkStatisticsAsync([FromQuery] GuiderWorkStatisticsInDto dto)
+        => await _biSnapshotApplication.GetGuiderWorkStatisticsAsync(dto).ToListAsync();
+
+    /// <summary>
+    /// 网格员办理情况统计详情
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("guider-work-statistics-detail")]
+    public async Task<PagedDto<GuiderWorkStatisticsDetailsOutDto>> GetGuiderWorkStatisticsDetailsAsync([FromQuery] GuiderWorkStatisticsDetailsInDto dto)
+        => (await _biSnapshotApplication.GetGuiderWorkStatisticsDetails(dto).ToPagedListAsync(dto)).ToPaged();
 }

+ 37 - 1
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -398,7 +398,7 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
         dto.FieldName = dto.FieldName.ToLower();
         var IsCenter = _sessionContext.OrgIsCenter;
         IsCenter = true;
-        var query = _orderSnapshotRepository.Queryable()
+        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)
@@ -428,4 +428,40 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
             OrderScreenStatus = SqlFunc.Subqueryable<OrderScreen>().Where(q => q.OrderId == d.Id).OrderByDesc(q => q.CreationTime).Select(q => q.Status),
         }, true);
     }
+
+    public ISugarQueryable<GuiderWorkStatisticsOutDto> GetGuiderWorkStatisticsAsync(GuiderWorkStatisticsInDto dto)
+    {
+        var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
+            .Where(snapshot => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && snapshot.MemberName != null )
+            .GroupBy(snapshot => new { snapshot.MemberName, snapshot.MemberMobile })
+            .Select(snapshot => new GuiderWorkStatisticsOutDto
+            {
+                MemberMobile = snapshot.MemberMobile,
+                MemberName = snapshot.MemberName,
+                ReplyIn4HourCount = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.ReplyResultType == EGuiderSystemReplyType.Field && snapshot.GuidSystemCallBackTime.Value.AddHours(-4) <= snapshot.SendGuidSystemTime, 1, 0)),
+                ReplyOut4HourCount = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.ReplyResultType == EGuiderSystemReplyType.Field && snapshot.GuidSystemCallBackTime.Value.AddHours(-4) > snapshot.SendGuidSystemTime, 1, 0)),
+                UnReplyCount = SqlFunc.AggregateSum(SqlFunc.IIF(snapshot.ReplyResultType != EGuiderSystemReplyType.Field, 1, 0)),
+            });
+
+        return query;
+    }
+
+    public ISugarQueryable<GuiderWorkStatisticsDetailsOutDto> GetGuiderWorkStatisticsDetails(GuiderWorkStatisticsDetailsInDto dto)
+    {
+        dto.FieldName = dto.FieldName.ToLower();
+        var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
+            .LeftJoin<Order>((snapshot, order) => order.Id == snapshot.Id)
+            .Where(snapshot => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && snapshot.MemberMobile == dto.MemberMobile);
+
+        query = dto.FieldName switch
+        {
+            "replyin4hourcount" => query.Where(snapshot => snapshot.ReplyResultType == EGuiderSystemReplyType.Field && snapshot.GuidSystemCallBackTime.Value.AddHours(-4) <= snapshot.SendGuidSystemTime),
+            "replyout4hourcount" => query.Where(snapshot => snapshot.ReplyResultType == EGuiderSystemReplyType.Field && snapshot.GuidSystemCallBackTime.Value.AddHours(-4) > snapshot.SendGuidSystemTime),
+            "unreplycount" => query.Where(snapshot => snapshot.ReplyResultType != EGuiderSystemReplyType.Field),
+            _ => throw new UserFriendlyException($"入参: {dto.FieldName} 异常")
+        };
+        return query.Select((snapshot, order) => new GuiderWorkStatisticsDetailsOutDto
+        { 
+        }, true);
+    }
 }

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

@@ -36,4 +36,13 @@ public interface IBiSnapshotApplication
     /// <param name="dto"></param>
     /// <returns></returns>
     ISugarQueryable<SnapshotProcessingStatisticsDetailsOutDto> GetSnapshotProcessingStatisticsDetails(SnapshotProcessingStatisticsDetailsInDto dto);
+
+    /// <summary>
+    /// 网格员办理情况统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    ISugarQueryable<GuiderWorkStatisticsOutDto> GetGuiderWorkStatisticsAsync(GuiderWorkStatisticsInDto dto);
+
+    ISugarQueryable<GuiderWorkStatisticsDetailsOutDto> GetGuiderWorkStatisticsDetails(GuiderWorkStatisticsDetailsInDto dto);
 }

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

@@ -1336,3 +1336,213 @@ public class SnapshotProcessingStatisticsDetailsOutDto
     /// </summary>
     public string HotspotName { get; set; }
 }
+
+public class GuiderWorkStatisticsOutDto
+{
+    /// <summary>
+    /// 网格员姓名
+    /// </summary>
+    public string MemberName { get; set; }
+
+    /// <summary>
+    /// 网格员手机号
+    /// </summary>
+    public string MemberMobile { get; set; }
+
+    /// <summary>
+    /// 未回复
+    /// </summary>
+    public int UnReplyCount { get; set; }
+
+    /// <summary>
+    /// 4小时内回复
+    /// </summary>
+    public int ReplyIn4HourCount { get; set; }
+
+    /// <summary>
+    /// 4小时外回复
+    /// </summary>
+    public int ReplyOut4HourCount { get; set; }
+}
+
+public class GuiderWorkStatisticsInDto
+{
+    [Required]
+    public DateTime StartTime { get; set; }
+    [Required]
+    public DateTime EndTime { get; set; }
+}
+
+public record GuiderWorkStatisticsDetailsInDto : PagedRequest
+{
+    [Required]
+    public DateTime StartTime { get; set; }
+
+    [Required]
+    public DateTime EndTime { get; set; }
+
+    [Required]
+    public string MemberMobile { get; set; }
+
+    /// <summary>
+    /// 字段名称
+    /// </summary>
+    [Required]
+    public string FieldName { get; set; }
+}
+
+public class GuiderWorkStatisticsDetailsOutDto
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public string Id { get; set; }
+
+    /// <summary>
+    /// 过期状态
+    /// </summary>
+    public EExpiredStatus ExpiredStatus { get; set; }
+
+    /// <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 IsUrgentTxt => IsUrgent ? "紧急" : "-";
+
+    /// <summary>
+    /// 期满时间
+    /// </summary>
+    public DateTime? ExpiredTime { 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>
+    public string IndustryName { get; set; }
+
+    /// <summary>
+    /// 办理时长
+    /// </summary>
+    public double CreationTimeHandleDuration { get; set; }
+
+    /// <summary>
+    /// 区域
+    /// </summary>
+    public string County { get; set; }
+
+    /// <summary>
+    /// 电话
+    /// </summary>
+    public string Contact { get; set; }
+
+    /// <summary>
+    /// 网格员姓名
+    /// </summary>
+    public string MemberName { get; set; }
+
+    /// <summary>
+    /// 网格员手机号
+    /// </summary>
+    public string MemberMobile { get; set; }
+
+    /// <summary>
+    /// 网格员回复内容
+    /// </summary>
+    public string? NetworkRemark { get; set; }
+
+    /// <summary>
+    /// 受理期满时间
+    /// </summary>
+    public DateTime? AcceptExpiredTime { get; set; }
+
+    /// <summary>
+    /// 接办部门
+    /// </summary>
+    public string ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 接办时间
+    /// </summary>
+    public DateTime? StartTime { get; set; }
+
+    /// <summary>
+    /// 办结时间
+    /// </summary>
+    public DateTime? CenterToOrgTime { get; set; }
+
+    /// <summary>
+    /// 受理类型
+    /// </summary>
+    public string AcceptType { get; set; }
+
+    /// <summary>
+    /// 热点类型
+    /// </summary>
+    public string HotspotName { get; set; }
+
+    /// <summary>
+    /// 受理人
+    /// </summary>
+    public string AcceptorName { get; set; }
+}

+ 1 - 1
test/Hotline.Tests/Application/OrderSnapshotApplicationTest.cs

@@ -189,7 +189,7 @@ public class OrderSnapshotApplicationTest : TestBase
                  var baseData = await _redPackApplication.GetRedPackRecordBaseDataAsync(order.Id);
                 baseData.AuditType.ShouldNotBeNull();
                 baseData.AuditTypeCode.ShouldNotBeNull();
-                baseData.Amount.ShouldBeNull();
+                baseData.Amount.ShouldNotBeNull();
             })
             .GetCreateResult();
         order.Id.ShouldNotBeNull();