Răsfoiți Sursa

自贡任务 552 调整【话务员办件统计】统计逻辑

tangjiang 2 săptămâni în urmă
părinte
comite
37013c1ea3

+ 71 - 2
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -612,8 +612,24 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("centre_data_list")]
         public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
         {
-            var query = _orderApplication.CentreDataList(dto);
+            ISugarQueryable<OrderBiCentreDataListVo> query;
+            if (_appOptions.Value.IsZiGong)
+                query = _orderApplication.CentreDataListZG(dto);
+            else
+                query = _orderApplication.CentreDataList(dto);
+
             var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
+            if (_appOptions.Value.IsZiGong)
+            {
+                list.Add(new OrderBiCentreDataListVo
+                {
+                    UserName = "合计",
+                    CentreArchive = list.Select(s => s.CentreArchive).Sum(),
+                    CentreCareOf = list.Select(s => s.CentreCareOf).Sum(),
+                    NoCentreCareOf = list.Select(s => s.NoCentreCareOf).Sum(),
+                    Subtotal = list.Select(s => s.Subtotal).Sum()
+                });
+            }
             return list;
         }
 
@@ -626,7 +642,13 @@ namespace Hotline.Api.Controllers.Bi
         [LogFilterAlpha("导出日志")]
         public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
-            var query = _orderApplication.CentreDataList(dto.QueryDto);
+            ISugarQueryable<OrderBiCentreDataListVo> query;
+            if (_appOptions.Value.IsZiGong)
+                query = _orderApplication.CentreDataListZG(dto.QueryDto);
+            else
+                query = _orderApplication.CentreDataList(dto.QueryDto);
+
+            //var query = _orderApplication.CentreDataList(dto.QueryDto);
             List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
             data.Add(new OrderBiCentreDataListVo
             {
@@ -648,6 +670,53 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "话务员办件统计");
         }
 
+        /// <summary>
+        /// 话务员办件统计明细列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("centre_data_list_detail")]
+        public async Task<PagedDto<OrderDto>> CentreDataListDetailExport([FromQuery] CentreDataListDetailRequest dto)
+        {
+            var (total, items) = await _orderApplication.CentreDataListDetailZG(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(items));
+        }
+
+        /// <summary>
+        /// 话务员办件统计明细列表--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("centre_data_list_detail_export")]
+        [LogFilterAlpha("导出日志")]
+        public async Task<FileStreamResult> CentreDataListDetailExport([FromBody] ExportExcelDto<CentreDataListDetailRequest> dto)
+        {
+            var query = _orderApplication.CentreDataListDetailZG(dto.QueryDto);
+            List<Order> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+
+            var orderDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "话务员办件统计明细列表");
+        }
+
         /// <summary>
         /// 工单业务量统计
         /// </summary>

+ 14 - 0
src/Hotline.Application/OrderApp/IOrderApplication.cs

@@ -245,6 +245,20 @@ namespace Hotline.Application.OrderApp
         /// <returns></returns>
         ISugarQueryable<OrderBiCentreDataListVo> CentreDataList(ReportPagedRequest dto);
 
+        /// <summary>
+        /// 话务员办件统计--自贡专用
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderBiCentreDataListVo> CentreDataListZG(ReportPagedRequest dto);
+
+        /// <summary>
+        /// 话务员办件统计明细--自贡专用
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> CentreDataListDetailZG(CentreDataListDetailRequest dto);
+
         /// <summary>
         /// 工单业务量统计
         /// </summary>

+ 98 - 5
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -1875,8 +1875,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                                                                                                //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-				.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgCode), d => d.ActualHandleOrgCode.StartsWith(dto.ActualHandleOrgCode)) //接办部门(综合查询模糊)
-				.WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgCode), d => d.ActualHandleOrgCode.StartsWith(dto.ActualHandleOrgCode)) //接办部门(综合查询模糊)
+                .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
                 .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
                 .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
                 .WhereIF(dto.StartTimeStart.HasValue, d => d.StartTime >= dto.StartTimeStart) //流程开启时间开始
@@ -1934,9 +1934,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTags.Any(ot => ot.DicDataValue == dto.OrderTagCode)) //工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents),
                     d => d.FocusOnEvents.Contains(dto.FocusOnEvents) && !d.FocusOnEvents.Contains("99")) //!string.IsNullOrEmpty(d.FocusOnEvents) && SqlFunc.SplitIn(d.FocusOnEvents, dto.FocusOnEvents))
-				 .WhereIF(dto.SeatEvaluate.Any(), d => dto.SeatEvaluate.Contains(d.SeatEvaluate.Value)) //话务员评价(话务评价)
-				.WhereIF(dto.OrgProcessingResults.Any(),d => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(d.OrgProcessingResults, "Key")))//部门办件结果
-				.OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
+                 .WhereIF(dto.SeatEvaluate.Any(), d => dto.SeatEvaluate.Contains(d.SeatEvaluate.Value)) //话务员评价(话务评价)
+                .WhereIF(dto.OrgProcessingResults.Any(), d => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(d.OrgProcessingResults, "Key")))//部门办件结果
+                .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
                 .OrderByIF(dto is { SortField: "no", SortRule: 0 }, d => d.No, OrderByType.Asc) //工单编号升序
                 .OrderByIF(dto is { SortField: "no", SortRule: 1 }, d => d.No, OrderByType.Desc) //工单编号降序
                 .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 0 }, d => d.IsProvince, OrderByType.Asc) //是否省工单升序
@@ -3558,6 +3558,99 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return query;
     }
 
+    /// <summary>
+    /// 话务员办件统计--自贡专用
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderBiCentreDataListVo> CentreDataListZG(ReportPagedRequest dto)
+    {
+        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+        var query = _orderRepository.Queryable(false, false, false)
+            .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
+            .GroupBy(it => new { it.AcceptorId })
+            .Select(it => new OrderBiCentreDataListVo
+            {
+                UserId = it.AcceptorId,
+                CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.FileOrgIsCenter == true, 1, 0)), //中心归档件
+
+                CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.FileOrgIsCenter == false) ||
+               (it.ActualHandleStepName != "话务部" && it.Status < EOrderStatus.Filed && it.Status > EOrderStatus.WaitForAccept)
+               , 1, 0)),//转办件(部门归档件+已开启流程且当前节点在非话务部的办理中的工单)
+
+                NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.ActualHandleStepName == "话务部" &&
+                it.Status < EOrderStatus.Filed && it.Status > EOrderStatus.WaitForAccept, 1, 0)),//待转办信件(当前节点为话务部,已受理未归档的工单)
+
+                Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status > EOrderStatus.WaitForAccept, 1, 0))//排除待受理工单
+            })
+            .MergeTable()
+            .LeftJoin<User>((it, u) => it.UserId == u.Id)
+            .Select((it, u) => new OrderBiCentreDataListVo
+            {
+                UserId = it.UserId,
+                UserName = u.Name,
+                CentreArchive = it.CentreArchive,
+                CentreCareOf = it.CentreCareOf,
+                NoCentreCareOf = it.NoCentreCareOf,
+                Subtotal = it.Subtotal
+            })
+            ;
+        switch (dto.SortField)
+        {
+            case "centreArchive":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
+                break;
+            case "centreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
+                break;
+            case "noCentreCareOf":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
+                break;
+            case "subtotal":
+                query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
+                break;
+        }
+
+        if (string.IsNullOrEmpty(dto.SortField))
+        {
+            query = query.OrderByDescending(x => x.Subtotal);
+        }
+
+        return query;
+    }
+
+    /// <summary>
+    /// 话务员办件统计明细--自贡专用
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<Order> CentreDataListDetailZG(CentreDataListDetailRequest dto)
+    {
+        var query = _orderRepository.Queryable(false, false, false)
+       .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
+       .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
+       .WhereIF(!string.IsNullOrEmpty(dto.UserId), p => p.AcceptorId == dto.UserId);
+        if (dto.TypeId == "0")//所有信件
+            query = query.Where(p => p.Status > EOrderStatus.WaitForAccept);
+
+        if (dto.TypeId == "1")//中心归档件
+            query = query.Where(p => p.Status >= EOrderStatus.Filed && p.FileOrgIsCenter == true);
+
+        if (dto.TypeId == "2")//转办信件
+            query = query.Where(p => (p.Status >= EOrderStatus.Filed && p.FileOrgIsCenter == false) ||
+               (p.ActualHandleStepName != "话务部" && p.Status < EOrderStatus.Filed && p.Status > EOrderStatus.WaitForAccept));
+
+        if (dto.TypeId == "3")//待转办信件
+            query = query.Where(p => p.ActualHandleStepName == "话务部" && p.Status < EOrderStatus.Filed && p.Status > EOrderStatus.WaitForAccept);
+
+        query = query.OrderByDescending(p => p.CreationTime);
+
+        return query;
+    }
+
     /// <summary>
     /// 工单业务量统计
     /// </summary>

+ 3 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -74,6 +74,9 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int Repeat { get; set; }
 
+        /// <summary>
+        /// 所有信件
+        /// </summary>
         //public int Subtotal => CentreArchive + CentreCareOf + NoCentreCareOf + Invalid + Repeat;
         public int Subtotal { get; set; }
     }

+ 13 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1769,4 +1769,17 @@ public record AreaSubordinateRequest
     /// 线路号
     /// </summary>
     public string? Line { get; set; }
+}
+
+public record CentreDataListDetailRequest : PagedKeywordRequest
+{
+    /// <summary>
+    /// 用户id
+    /// </summary>
+    public string? UserId { get; set; }
+
+    /// <summary>
+    /// 明细类型 0:所有信件, 1:中心归档件,2:转办信件,3:待转办信件
+    /// </summary>
+    public string? TypeId { get; set; }
 }